Skip to content

Commit 82d9d7d

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

File tree

4 files changed

+105
-2
lines changed

4 files changed

+105
-2
lines changed

metadata.py

Lines changed: 16 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,21 @@ 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('host') == old_metadata.data.get('host')
543+
and new_metadata.data.get('policy_violation').get('name')
544+
== old_metadata.data.get('policy_violation').get('name')
545+
):
546+
# found the same license in existing entry, independent of the component-/
547+
# resource-/package-version, so we must re-use its discovery date
548+
return old_metadata.discovery_date
549+
534550
elif new_metadata.type == odg.model.Datatype.DIKI_FINDING:
535551
if (
536552
new_metadata.data.get('provider_id') == old_metadata.data.get('provider_id')

odg/model.py

Lines changed: 22 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,25 @@ 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+
host: str
492+
493+
@property
494+
def key(self) -> str:
495+
labels_key = ','.join(sorted(self.labels))
496+
return _as_key(
497+
self.package_name,
498+
self.license.name,
499+
labels_key,
500+
self.policy_violation.name
501+
)
502+
503+
485504
@dataclasses.dataclass
486505
class RescoringVulnerabilityFinding:
487506
package_name: str
@@ -870,6 +889,7 @@ class CustomRescoring:
870889
| RescoringFalcoFinding
871890
| RescoringKyvernoFinding
872891
| RescoreGitHubSecretFinding
892+
| RescoringIPFinding
873893
)
874894
referenced_type: str
875895
severity: str

rescore/artefacts.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ 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+
host: str
51+
labels: list[str]
52+
53+
4454
@dataclasses.dataclass
4555
class VulnerabilityFinding(odg.model.Finding):
4656
package_name: str
@@ -58,6 +68,7 @@ class RescoringProposal:
5868
finding: (
5969
LicenseFinding
6070
| VulnerabilityFinding
71+
| IPFinding
6172
| odg.model.FindingModels
6273
)
6374
finding_type: odg.model.Datatype
@@ -312,6 +323,7 @@ async def _iter_rescoring_proposals(
312323
if finding_cfg.type in (
313324
odg.model.Datatype.VULNERABILITY_FINDING,
314325
odg.model.Datatype.LICENSE_FINDING,
326+
odg.model.Datatype.IP_FINDING,
315327
):
316328
artefact_metadata_with_same_ocm = tuple(
317329
matching_am for matching_am in artefact_metadata
@@ -441,6 +453,52 @@ async def _iter_rescoring_proposals(
441453
'sprint': sprint,
442454
},
443455
)
456+
elif finding_cfg.type is odg.model.Datatype.IP_FINDING:
457+
license = am.data.license
458+
459+
am_across_package_versions = tuple(
460+
matching_am for matching_am in artefact_metadata_with_same_ocm
461+
if (
462+
matching_am.data.license.name == license.name and
463+
matching_am.data.package_name == package_name and
464+
sorted(matching_am.data.labels) == sorted(am.data.labels) and
465+
matching_am.data.policy_violation.name == am.data.policy_violation.name
466+
)
467+
)
468+
seen_ids.update(
469+
tuple(
470+
local_am.id for local_am
471+
in am_across_package_versions
472+
)
473+
)
474+
475+
package_versions, _ = _package_versions_and_filesystem_paths(
476+
artefact_metadata_across_package_version=am_across_package_versions,
477+
artefact_metadata=artefact_metadata,
478+
finding=am,
479+
)
480+
481+
yield dacite.from_dict(
482+
data_class=RescoringProposal,
483+
data={
484+
'finding': {
485+
'package_name': package_name,
486+
'package_versions': package_versions,
487+
'severity': severity,
488+
'license': license,
489+
'policy_violation': am.data.policy_violation,
490+
'labels': am.data.labels,
491+
'host': am.data.host,
492+
},
493+
'finding_type': finding_cfg.type,
494+
'severity': current_severity,
495+
'matching_rules': matching_rule_names,
496+
'applicable_rescorings': serialised_current_rescorings,
497+
'discovery_date': am.discovery_date.isoformat(),
498+
'due_date': due_date,
499+
'sprint': sprint,
500+
},
501+
)
444502

445503
else:
446504
yield dacite.from_dict(

rescore/utility.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,15 @@ 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 rescoring.data.finding.host != finding.data.host
82+
or sorted(rescoring.data.finding.labels) != sorted(finding.data.labels)
83+
):
84+
continue
7685
else:
7786
if rescoring.data.finding.key != finding.data.key:
7887
continue

0 commit comments

Comments
 (0)