Skip to content

Commit 1840308

Browse files
committed
Update impact_package model to include fixed and affecting commits
Signed-off-by: ziad hany <ziadhany2016@gmail.com>
1 parent 8c001a1 commit 1840308

File tree

4 files changed

+42
-37
lines changed

4 files changed

+42
-37
lines changed

vulnerabilities/models.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1960,19 +1960,6 @@ class CodeFixV2(CodeChangeV2):
19601960
help_text="The affected package version to which this code fix applies.",
19611961
)
19621962

1963-
affected_package = models.ForeignKey(
1964-
"PackageV2", on_delete=models.CASCADE, related_name="code_fix_v2_affected"
1965-
)
1966-
1967-
fixed_package = models.ForeignKey(
1968-
"PackageV2",
1969-
null=True,
1970-
blank=True,
1971-
on_delete=models.SET_NULL,
1972-
related_name="code_fix_v2_fixed",
1973-
help_text="The fixing package version with this code fix",
1974-
)
1975-
19761963

19771964
class PipelineRun(models.Model):
19781965
"""The Database representation of a pipeline execution."""
@@ -2662,13 +2649,15 @@ class AdvisoryReference(models.Model):
26622649

26632650
ADVISORY = "advisory"
26642651
EXPLOIT = "exploit"
2652+
COMMIT = "commit"
26652653
MAILING_LIST = "mailing_list"
26662654
BUG = "bug"
26672655
OTHER = "other"
26682656

26692657
REFERENCE_TYPES = [
26702658
(ADVISORY, "Advisory"),
26712659
(EXPLOIT, "Exploit"),
2660+
(COMMIT, "Commit"),
26722661
(MAILING_LIST, "Mailing List"),
26732662
(BUG, "Bug"),
26742663
(OTHER, "Other"),
@@ -2957,6 +2946,18 @@ class ImpactedPackage(models.Model):
29572946
help_text="Packages vulnerable to this impact.",
29582947
)
29592948

2949+
fixed_by_commits = models.ManyToManyField(
2950+
"CodeFixV2",
2951+
related_name="fixed_commits_impacts",
2952+
help_text="Commits that fix the vulnerability in this impact.",
2953+
)
2954+
2955+
affected_by_commits = models.ManyToManyField(
2956+
"CodeFixV2",
2957+
related_name="affected_commits_impacts",
2958+
help_text="Commits that are affected by this impact.",
2959+
)
2960+
29602961
created_at = models.DateTimeField(
29612962
auto_now_add=True,
29622963
db_index=True,

vulnerabilities/pipelines/v2_improvers/collect_commits.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,14 @@ def collect_and_store_fix_commits(self):
6464
continue
6565
# check if vcs_url has commit
6666
for impact in adv.impacted_packages.all():
67-
for package in impact.affecting_packages.all():
68-
code_fix, created = CodeFixV2.objects.get_or_create(
69-
commits=[vcs_url],
70-
advisory=adv,
71-
affected_package=package,
72-
)
73-
74-
if created:
75-
created_fix_count += 1
67+
code_fix, created = CodeFixV2.objects.get_or_create(
68+
commits=[vcs_url],
69+
advisory=adv,
70+
)
71+
impact.fixed_by_commits.add(code_fix)
72+
73+
if created:
74+
created_fix_count += 1
7675

7776
self.log(f"Successfully created {created_fix_count:,d} CodeFix entries.")
7877

vulnerabilities/tests/pipelines/v2_improvers/test_collect_commits_v2.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,19 +62,29 @@ def test_is_vcs_url_already_processed_true():
6262
unique_content_id="11111",
6363
date_collected=datetime.now(),
6464
)
65+
66+
commit1 = CodeFixV2.objects.create(advisory=advisory)
67+
commit1.commits = ["https://github.com/user/repo/commit/abc1"]
68+
commit1.save()
69+
70+
commit2 = CodeFixV2.objects.create(advisory=advisory)
71+
commit2.commits = ["https://github.com/user/repo/commit/abc2"]
72+
commit2.save()
73+
6574
package = PackageV2.objects.create(
6675
type="bar",
6776
name="foo",
6877
version="1.0",
6978
)
70-
impact = ImpactedPackage.objects.create(advisory=advisory)
71-
impact.affecting_packages.add(package)
72-
CodeFixV2.objects.create(
73-
commits=["https://github.com/user/repo/commit/abc123"],
79+
80+
impact = ImpactedPackage.objects.create(
7481
advisory=advisory,
75-
affected_package=package,
7682
)
77-
assert is_vcs_url_already_processed("https://github.com/user/repo/commit/abc123") is True
83+
impact.affecting_packages.add(package)
84+
impact.fixed_by_commits.add(commit1)
85+
impact.affected_by_commits.add(commit2)
86+
87+
assert is_vcs_url_already_processed("https://github.com/user/repo/commit/abc1") is True
7888

7989

8090
@pytest.mark.django_db
@@ -93,7 +103,7 @@ def test_collect_fix_commits_pipeline_creates_entry():
93103
version="1.0",
94104
)
95105
reference = AdvisoryReference.objects.create(
96-
url="https://github.com/test/testpkg/commit/abc123"
106+
reference_type="commit", url="https://github.com/test/testpkg/commit/abc123"
97107
)
98108
impact = ImpactedPackage.objects.create(advisory=advisory)
99109
impact.affecting_packages.add(package)
@@ -107,7 +117,7 @@ def test_collect_fix_commits_pipeline_creates_entry():
107117
fix = codefixes.first()
108118
assert "abc123" in fix.commits[0]
109119
assert fix.advisory == advisory
110-
assert fix.affected_package == package
120+
assert list(fix.fixed_commits_impacts.all()) == [impact]
111121

112122

113123
@pytest.mark.django_db

vulnerabilities/tests/test_api_v2.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -798,13 +798,8 @@ def setUp(self):
798798
date_collected="2025-07-01T00:00:00Z",
799799
)
800800

801-
self.affected_package = PackageV2.objects.from_purl(purl="pkg:pypi/affected_package@1.0.0")
802-
self.fixed_package = PackageV2.objects.from_purl(purl="pkg:pypi/fixed_package@1.0.1")
803-
804801
self.codefix = CodeFixV2.objects.create(
805802
advisory=self.advisory,
806-
affected_package=self.affected_package,
807-
fixed_package=self.fixed_package,
808803
notes="Security patch",
809804
is_reviewed=True,
810805
)
@@ -816,14 +811,14 @@ def setUp(self):
816811
self.url = reverse("advisory-codefix-list")
817812

818813
def test_list_all_codefixes(self):
819-
with self.assertNumQueries(10):
814+
with self.assertNumQueries(8):
820815
response = self.client.get(self.url)
821816
assert response.status_code == status.HTTP_200_OK
822817
assert response.data["count"] == 1
823818
assert response.data["results"][0]["affected_advisory_id"] == self.advisory.avid
824819

825820
def test_filter_codefix_by_advisory_id_success(self):
826-
with self.assertNumQueries(10):
821+
with self.assertNumQueries(8):
827822
response = self.client.get(self.url, {"advisory_id": self.advisory.avid})
828823
assert response.status_code == status.HTTP_200_OK
829824
assert response.data["count"] == 1

0 commit comments

Comments
 (0)