Skip to content

Commit a35ed6f

Browse files
committed
Introduce Rescoring also for IPFindings
Signed-off-by: TuanAnh17N <[email protected]>
1 parent 9f33d47 commit a35ed6f

File tree

4 files changed

+100
-2
lines changed

4 files changed

+100
-2
lines changed

metadata.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
odg.model.Datatype.DIKI_FINDING,
2828
odg.model.Datatype.OSID_FINDING,
2929
odg.model.Datatype.CRYPTO_FINDING,
30+
odg.model.Datatype.IP_FINDING,
3031
)
3132

3233

@@ -531,6 +532,20 @@ def reuse_discovery_date_if_possible(
531532
# resource-/package-version, so we must re-use its discovery date
532533
return old_metadata.discovery_date
533534

535+
elif new_metadata.type == odg.model.Datatype.IP_FINDING:
536+
if (
537+
new_metadata.data.get('package_name') == old_metadata.data.get('package_name')
538+
and new_metadata.data.get('license').get('name')
539+
== old_metadata.data.get('license').get('name')
540+
and sorted(new_metadata.data.get('labels'))
541+
== sorted(old_metadata.data.get('labels'))
542+
and new_metadata.data.get('policy_violation').get('name')
543+
== old_metadata.data.get('policy_violation').get('name')
544+
):
545+
# found the same license in existing entry, independent of the component-/
546+
# resource-/package-version, so we must re-use its discovery date
547+
return old_metadata.discovery_date
548+
534549
elif new_metadata.type == odg.model.Datatype.DIKI_FINDING:
535550
if (
536551
new_metadata.data.get('provider_id') == old_metadata.data.get('provider_id')

odg/model.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ class BDBAMixin:
397397

398398

399399
@dataclasses.dataclass
400-
class PoliceViolationRef:
400+
class PolicyViolationRef:
401401
name: str
402402
id: str | None
403403
url: str | None
@@ -445,7 +445,7 @@ class IPFinding(Finding):
445445
package_name: str
446446
package_version: str | None
447447
license: License
448-
policy_violation: PoliceViolationRef
448+
policy_violation: PolicyViolationRef
449449
labels: list[str]
450450
host: str
451451

@@ -482,6 +482,24 @@ def key(self) -> str:
482482
return _as_key(self.package_name, self.package_version, self.cve)
483483

484484

485+
@dataclasses.dataclass
486+
class RescoringIPFinding:
487+
package_name: str
488+
license: License
489+
policy_violation: PolicyViolationRef
490+
labels: list[str]
491+
492+
@property
493+
def key(self) -> str:
494+
labels_key = ','.join(sorted(self.labels))
495+
return _as_key(
496+
self.package_name,
497+
self.license.name,
498+
labels_key,
499+
self.policy_violation.name
500+
)
501+
502+
485503
@dataclasses.dataclass
486504
class RescoringVulnerabilityFinding:
487505
package_name: str
@@ -870,6 +888,7 @@ class CustomRescoring:
870888
| RescoringFalcoFinding
871889
| RescoringKyvernoFinding
872890
| RescoreGitHubSecretFinding
891+
| RescoringIPFinding
873892
)
874893
referenced_type: str
875894
severity: str

rescore/artefacts.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,15 @@ class LicenseFinding(odg.model.Finding):
4141
filesystem_paths: list[odg.model.FilesystemPath]
4242

4343

44+
@dataclasses.dataclass
45+
class IPFinding(odg.model.Finding):
46+
package_name: str
47+
package_versions: tuple[str, ...] # "..." for dacite.from_dict
48+
license: odg.model.License
49+
policy_violation: odg.model.PolicyViolationRef
50+
labels: list[str]
51+
52+
4453
@dataclasses.dataclass
4554
class VulnerabilityFinding(odg.model.Finding):
4655
package_name: str
@@ -58,6 +67,7 @@ class RescoringProposal:
5867
finding: (
5968
LicenseFinding
6069
| VulnerabilityFinding
70+
| IPFinding
6171
| odg.model.FindingModels
6272
)
6373
finding_type: odg.model.Datatype
@@ -312,6 +322,7 @@ async def _iter_rescoring_proposals(
312322
if finding_cfg.type in (
313323
odg.model.Datatype.VULNERABILITY_FINDING,
314324
odg.model.Datatype.LICENSE_FINDING,
325+
odg.model.Datatype.IP_FINDING,
315326
):
316327
artefact_metadata_with_same_ocm = tuple(
317328
matching_am for matching_am in artefact_metadata
@@ -441,6 +452,51 @@ async def _iter_rescoring_proposals(
441452
'sprint': sprint,
442453
},
443454
)
455+
elif finding_cfg.type is odg.model.Datatype.IP_FINDING:
456+
license = am.data.license
457+
458+
am_across_package_versions = tuple(
459+
matching_am for matching_am in artefact_metadata_with_same_ocm
460+
if (
461+
matching_am.data.license.name == license.name and
462+
matching_am.data.package_name == package_name and
463+
sorted(matching_am.data.labels) == sorted(am.data.labels) and
464+
matching_am.data.policy_violation.name == am.data.policy_violation.name
465+
)
466+
)
467+
seen_ids.update(
468+
tuple(
469+
local_am.id for local_am
470+
in am_across_package_versions
471+
)
472+
)
473+
474+
package_versions, _ = _package_versions_and_filesystem_paths(
475+
artefact_metadata_across_package_version=am_across_package_versions,
476+
artefact_metadata=artefact_metadata,
477+
finding=am,
478+
)
479+
480+
yield dacite.from_dict(
481+
data_class=RescoringProposal,
482+
data={
483+
'finding': {
484+
'package_name': package_name,
485+
'package_versions': package_versions,
486+
'severity': severity,
487+
'license': license,
488+
'policy_violation': am.data.policy_violation,
489+
'labels': am.data.labels,
490+
},
491+
'finding_type': finding_cfg.type,
492+
'severity': current_severity,
493+
'matching_rules': matching_rule_names,
494+
'applicable_rescorings': serialised_current_rescorings,
495+
'discovery_date': am.discovery_date.isoformat(),
496+
'due_date': due_date,
497+
'sprint': sprint,
498+
},
499+
)
444500

445501
else:
446502
yield dacite.from_dict(

rescore/utility.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,14 @@ def _iter_rescorings_for_finding(
7373
):
7474
continue
7575

76+
elif finding.meta.type == odg.model.Datatype.IP_FINDING:
77+
if (
78+
rescoring.data.finding.license.name != finding.data.license.name
79+
or rescoring.data.finding.package_name != finding.data.package_name
80+
or rescoring.data.finding.policy_violation.name != finding.data.policy_violation.name
81+
or sorted(rescoring.data.finding.labels) != sorted(finding.data.labels)
82+
):
83+
continue
7684
else:
7785
if rescoring.data.finding.key != finding.data.key:
7886
continue

0 commit comments

Comments
 (0)