|
1 | 1 | package ossrealtime |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "encoding/json" |
4 | 5 | "fmt" |
| 6 | + "os" |
5 | 7 | "strings" |
6 | 8 |
|
7 | 9 | "github.com/Checkmarx/manifest-parser/pkg/parser" |
@@ -48,7 +50,7 @@ func NewOssRealtimeService( |
48 | 50 | } |
49 | 51 |
|
50 | 52 | // RunOssRealtimeScan performs an OSS real-time scan on the given manifest file. |
51 | | -func (o *OssRealtimeService) RunOssRealtimeScan(filePath string) (*OssPackageResults, error) { |
| 53 | +func (o *OssRealtimeService) RunOssRealtimeScan(filePath, ignoredFilePath string) (*OssPackageResults, error) { |
52 | 54 | if filePath == "" { |
53 | 55 | return nil, errorconstants.NewRealtimeEngineError("file path is required").Error() |
54 | 56 | } |
@@ -79,9 +81,56 @@ func (o *OssRealtimeService) RunOssRealtimeScan(filePath string) (*OssPackageRes |
79 | 81 | packageMap := createPackageMap(pkgs) |
80 | 82 | enrichResponseWithRealtimeScannerResults(response, result, packageMap) |
81 | 83 | } |
| 84 | + |
| 85 | + if ignoredFilePath != "" { |
| 86 | + ignoredPkgs, err := loadIgnoredPackages(ignoredFilePath) |
| 87 | + if err != nil { |
| 88 | + return nil, errorconstants.NewRealtimeEngineError("failed to load ignored packages").Error() |
| 89 | + } |
| 90 | + |
| 91 | + ignoreMap := buildIgnoreMap(ignoredPkgs) |
| 92 | + response.Packages = filterIgnoredPackages(response.Packages, ignoreMap) |
| 93 | + } |
| 94 | + |
82 | 95 | return response, nil |
83 | 96 | } |
84 | 97 |
|
| 98 | +func buildIgnoreMap(ignored []IgnoredPackage) map[string]bool { |
| 99 | + m := make(map[string]bool) |
| 100 | + for _, ign := range ignored { |
| 101 | + m[ign.GetID()] = true |
| 102 | + } |
| 103 | + return m |
| 104 | +} |
| 105 | + |
| 106 | +func isIgnored(pkg *OssPackage, ignoreMap map[string]bool) bool { |
| 107 | + return ignoreMap[pkg.GetID()] |
| 108 | +} |
| 109 | + |
| 110 | +func loadIgnoredPackages(path string) ([]IgnoredPackage, error) { |
| 111 | + data, err := os.ReadFile(path) |
| 112 | + if err != nil { |
| 113 | + return nil, err |
| 114 | + } |
| 115 | + var ignored []IgnoredPackage |
| 116 | + err = json.Unmarshal(data, &ignored) |
| 117 | + if err != nil { |
| 118 | + return nil, err |
| 119 | + } |
| 120 | + return ignored, nil |
| 121 | +} |
| 122 | + |
| 123 | +func filterIgnoredPackages(packages []OssPackage, ignoreMap map[string]bool) []OssPackage { |
| 124 | + filtered := make([]OssPackage, 0, len(packages)) |
| 125 | + for i := range packages { |
| 126 | + pkg := &packages[i] |
| 127 | + if !isIgnored(pkg, ignoreMap) { |
| 128 | + filtered = append(filtered, *pkg) |
| 129 | + } |
| 130 | + } |
| 131 | + return filtered |
| 132 | +} |
| 133 | + |
85 | 134 | func enrichResponseWithRealtimeScannerResults( |
86 | 135 | response *OssPackageResults, |
87 | 136 | result *wrappers.RealtimeScannerPackageResponse, |
|
0 commit comments