Skip to content

Commit 22fe913

Browse files
authored
Merge pull request #994 from l3montree-dev/fix/vulns-handling
Add method to retrieve vulnerabilities from other asset versions
2 parents 77541a5 + d7ea469 commit 22fe913

5 files changed

Lines changed: 103 additions & 6 deletions

File tree

internal/core/assetversion/asset_version_service.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -428,13 +428,13 @@ func (s *service) handleScanResult(userID string, scannerID string, assetVersion
428428
slog.Error("could not get existing dependencyVulns", "err", err)
429429
return []models.DependencyVuln{}, []models.DependencyVuln{}, []models.DependencyVuln{}, err
430430
}
431-
// get all vulns from the default branch
432-
existingVulnsOnDefaultBranch, err := s.dependencyVulnRepository.GetDependencyVulnsByDefaultAssetVersion(nil, assetVersion.AssetID, "")
431+
// get all vulns from other branches
432+
existingVulnsOnOtherBranch, err := s.dependencyVulnRepository.GetDependencyVulnsByOtherAssetVersions(nil, assetVersion.Name, assetVersion.AssetID, scannerID)
433433
if err != nil {
434434
slog.Error("could not get existing dependencyVulns on default branch", "err", err)
435435
return []models.DependencyVuln{}, []models.DependencyVuln{}, []models.DependencyVuln{}, err
436436
}
437-
existingVulnsOnDefaultBranch = utils.Filter(existingVulnsOnDefaultBranch, func(dependencyVuln models.DependencyVuln) bool {
437+
existingVulnsOnOtherBranch = utils.Filter(existingVulnsOnOtherBranch, func(dependencyVuln models.DependencyVuln) bool {
438438
return dependencyVuln.State != models.VulnStateFixed
439439
})
440440

@@ -445,10 +445,10 @@ func (s *service) handleScanResult(userID string, scannerID string, assetVersion
445445

446446
newDetectedVulns, fixedVulns, firstTimeDetectedByCurrentScanner, notDetectedByCurrentScannerAnymore := diffScanResults(scannerID, dependencyVulns, existingDependencyVulns)
447447

448-
newDetectedVulnsNotOnDefaultBranch, newDetectedButOnDefaultBranchExisting, existingEvents := diffVulnsBetweenBranches(scannerID, newDetectedVulns, existingVulnsOnDefaultBranch)
448+
newDetectedVulnsNotOnDefaultBranch, newDetectedButOnOtherBranchExisting, existingEvents := diffVulnsBetweenBranches(scannerID, newDetectedVulns, existingVulnsOnOtherBranch)
449449

450450
if err := s.dependencyVulnRepository.Transaction(func(tx core.DB) error {
451-
if err := s.dependencyVulnService.UserDetectedExistingVulnOnDifferentBranch(tx, scannerID, newDetectedButOnDefaultBranchExisting, existingEvents, *assetVersion, asset); err != nil {
451+
if err := s.dependencyVulnService.UserDetectedExistingVulnOnDifferentBranch(tx, scannerID, newDetectedButOnOtherBranchExisting, existingEvents, *assetVersion, asset); err != nil {
452452
slog.Error("error when trying to add events for existing vulnerability on different branch")
453453
return err // this will cancel the transaction
454454
}

internal/core/common_interfaces.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ type DependencyVulnRepository interface {
151151
ListUnfixedByAssetAndAssetVersionAndScannerID(assetVersionName string, assetID uuid.UUID, scannerID string) ([]models.DependencyVuln, error)
152152
GetHintsInOrganizationForVuln(tx DB, orgID uuid.UUID, pURL string, cveID string) (common.DependencyVulnHints, error)
153153
GetAllByAssetIDAndState(tx DB, assetID uuid.UUID, state models.VulnState, durationSinceStateChange time.Duration) ([]models.DependencyVuln, error)
154+
GetDependencyVulnsByOtherAssetVersions(tx DB, assetVersionName string, assetID uuid.UUID, scannerID string) ([]models.DependencyVuln, error)
154155
}
155156

156157
type FirstPartyVulnRepository interface {

internal/core/vulndb/scan/scan_integration_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ func TestScanning(t *testing.T) {
186186
sbomFile := sbomWithVulnerability()
187187
req := httptest.NewRequest("POST", "/vulndb/scan/normalized-sboms", sbomFile)
188188
req.Header.Set("Content-Type", "application/json")
189-
req.Header.Set("X-Scanner", "scanner-4")
189+
req.Header.Set("X-Scanner", vulns[0].ScannerIDs)
190190
req.Header.Set("X-Asset-Ref", "some-other-branch")
191191
ctx := app.NewContext(req, recorder)
192192
setupContext(ctx) //setup context

internal/database/repositories/dependency_vuln_repository.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,22 @@ func (repository *dependencyVulnRepository) GetDependencyVulnsByAssetVersion(tx
7171
return dependencyVulns, nil
7272
}
7373

74+
func (repository *dependencyVulnRepository) GetDependencyVulnsByOtherAssetVersions(tx core.DB, assetVersionName string, assetID uuid.UUID, scannerID string) ([]models.DependencyVuln, error) {
75+
var dependencyVulns = []models.DependencyVuln{}
76+
77+
q := repository.Repository.GetDB(tx).Preload("Events").Preload("CVE").Preload("CVE.Exploits").Where("asset_id = ? AND asset_version_name != ?", assetID, assetVersionName)
78+
79+
if scannerID != "" {
80+
// scanner ids is a string array separated by whitespaces
81+
q = q.Where("? = ANY(string_to_array(scanner_ids, ' '))", scannerID)
82+
}
83+
84+
if err := q.Find(&dependencyVulns).Error; err != nil {
85+
return nil, err
86+
}
87+
return dependencyVulns, nil
88+
}
89+
7490
func (repository *dependencyVulnRepository) GetDependencyVulnsByDefaultAssetVersion(tx core.DB, assetID uuid.UUID, scannerID string) ([]models.DependencyVuln, error) {
7591
subQuery := repository.Repository.GetDB(tx).Model(&models.AssetVersion{}).Select("name").Where("asset_id IN (?) AND default_branch = ?", assetID, true)
7692

mocks/mock_DependencyVulnRepository.go

Lines changed: 80 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)