Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions internal/core/assetversion/asset_version_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -428,13 +428,13 @@ func (s *service) handleScanResult(userID string, scannerID string, assetVersion
slog.Error("could not get existing dependencyVulns", "err", err)
return []models.DependencyVuln{}, []models.DependencyVuln{}, []models.DependencyVuln{}, err
}
// get all vulns from the default branch
existingVulnsOnDefaultBranch, err := s.dependencyVulnRepository.GetDependencyVulnsByDefaultAssetVersion(nil, assetVersion.AssetID, "")
// get all vulns from other branches
existingVulnsOnOtherBranch, err := s.dependencyVulnRepository.GetDependencyVulnsByOtherAssetVersions(nil, assetVersion.Name, assetVersion.AssetID, scannerID)
if err != nil {
slog.Error("could not get existing dependencyVulns on default branch", "err", err)
return []models.DependencyVuln{}, []models.DependencyVuln{}, []models.DependencyVuln{}, err
}
existingVulnsOnDefaultBranch = utils.Filter(existingVulnsOnDefaultBranch, func(dependencyVuln models.DependencyVuln) bool {
existingVulnsOnOtherBranch = utils.Filter(existingVulnsOnOtherBranch, func(dependencyVuln models.DependencyVuln) bool {
return dependencyVuln.State != models.VulnStateFixed
})

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

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

newDetectedVulnsNotOnDefaultBranch, newDetectedButOnDefaultBranchExisting, existingEvents := diffVulnsBetweenBranches(scannerID, newDetectedVulns, existingVulnsOnDefaultBranch)
newDetectedVulnsNotOnDefaultBranch, newDetectedButOnOtherBranchExisting, existingEvents := diffVulnsBetweenBranches(scannerID, newDetectedVulns, existingVulnsOnOtherBranch)

if err := s.dependencyVulnRepository.Transaction(func(tx core.DB) error {
if err := s.dependencyVulnService.UserDetectedExistingVulnOnDifferentBranch(tx, scannerID, newDetectedButOnDefaultBranchExisting, existingEvents, *assetVersion, asset); err != nil {
if err := s.dependencyVulnService.UserDetectedExistingVulnOnDifferentBranch(tx, scannerID, newDetectedButOnOtherBranchExisting, existingEvents, *assetVersion, asset); err != nil {
slog.Error("error when trying to add events for existing vulnerability on different branch")
return err // this will cancel the transaction
}
Expand Down
1 change: 1 addition & 0 deletions internal/core/common_interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ type DependencyVulnRepository interface {
ListUnfixedByAssetAndAssetVersionAndScannerID(assetVersionName string, assetID uuid.UUID, scannerID string) ([]models.DependencyVuln, error)
GetHintsInOrganizationForVuln(tx DB, orgID uuid.UUID, pURL string, cveID string) (common.DependencyVulnHints, error)
GetAllByAssetIDAndState(tx DB, assetID uuid.UUID, state models.VulnState, durationSinceStateChange time.Duration) ([]models.DependencyVuln, error)
GetDependencyVulnsByOtherAssetVersions(tx DB, assetVersionName string, assetID uuid.UUID, scannerID string) ([]models.DependencyVuln, error)
}

type FirstPartyVulnRepository interface {
Expand Down
2 changes: 1 addition & 1 deletion internal/core/vulndb/scan/scan_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ func TestScanning(t *testing.T) {
sbomFile := sbomWithVulnerability()
req := httptest.NewRequest("POST", "/vulndb/scan/normalized-sboms", sbomFile)
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-Scanner", "scanner-4")
req.Header.Set("X-Scanner", vulns[0].ScannerIDs)
req.Header.Set("X-Asset-Ref", "some-other-branch")
ctx := app.NewContext(req, recorder)
setupContext(ctx) //setup context
Expand Down
16 changes: 16 additions & 0 deletions internal/database/repositories/dependency_vuln_repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,22 @@ func (repository *dependencyVulnRepository) GetDependencyVulnsByAssetVersion(tx
return dependencyVulns, nil
}

func (repository *dependencyVulnRepository) GetDependencyVulnsByOtherAssetVersions(tx core.DB, assetVersionName string, assetID uuid.UUID, scannerID string) ([]models.DependencyVuln, error) {
var dependencyVulns = []models.DependencyVuln{}

q := repository.Repository.GetDB(tx).Preload("Events").Preload("CVE").Preload("CVE.Exploits").Where("asset_id = ? AND asset_version_name != ?", assetID, assetVersionName)

if scannerID != "" {
// scanner ids is a string array separated by whitespaces
q = q.Where("? = ANY(string_to_array(scanner_ids, ' '))", scannerID)
}

if err := q.Find(&dependencyVulns).Error; err != nil {
return nil, err
}
return dependencyVulns, nil
}

func (repository *dependencyVulnRepository) GetDependencyVulnsByDefaultAssetVersion(tx core.DB, assetID uuid.UUID, scannerID string) ([]models.DependencyVuln, error) {
subQuery := repository.Repository.GetDB(tx).Model(&models.AssetVersion{}).Select("name").Where("asset_id IN (?) AND default_branch = ?", assetID, true)

Expand Down
80 changes: 80 additions & 0 deletions mocks/mock_DependencyVulnRepository.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.