Skip to content

Commit f27efc7

Browse files
committed
Fix
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent 947ad82 commit f27efc7

File tree

4 files changed

+131
-83
lines changed

4 files changed

+131
-83
lines changed

vulnerabilities/migrations/0085_codefix.py

Lines changed: 0 additions & 60 deletions
This file was deleted.
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
# Generated by Django 4.2.16 on 2024-12-23 19:32
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
("vulnerabilities", "0085_alter_package_is_ghost_alter_package_version_rank_and_more"),
11+
]
12+
13+
operations = [
14+
migrations.CreateModel(
15+
name="CodeFix",
16+
fields=[
17+
(
18+
"id",
19+
models.AutoField(
20+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
21+
),
22+
),
23+
(
24+
"commits",
25+
models.JSONField(
26+
blank=True,
27+
default=list,
28+
help_text="List of commit identifiers associated with the code change.",
29+
),
30+
),
31+
(
32+
"pulls",
33+
models.JSONField(
34+
blank=True,
35+
default=list,
36+
help_text="List of pull request URLs associated with the code change.",
37+
),
38+
),
39+
(
40+
"downloads",
41+
models.JSONField(
42+
blank=True,
43+
default=list,
44+
help_text="List of download URLs for the patched code.",
45+
),
46+
),
47+
(
48+
"patch",
49+
models.TextField(
50+
blank=True,
51+
help_text="The code change in patch format (e.g., git diff).",
52+
null=True,
53+
),
54+
),
55+
(
56+
"notes",
57+
models.TextField(
58+
blank=True,
59+
help_text="Additional notes or instructions about the code change.",
60+
null=True,
61+
),
62+
),
63+
(
64+
"references",
65+
models.JSONField(
66+
blank=True,
67+
default=list,
68+
help_text="External references related to this code change.",
69+
),
70+
),
71+
(
72+
"status_reviewed",
73+
models.BooleanField(
74+
default=False, help_text="Indicates if the code change has been reviewed."
75+
),
76+
),
77+
(
78+
"base_commit",
79+
models.CharField(
80+
blank=True,
81+
help_text="The commit ID representing the state of the code before applying the fix or change.",
82+
max_length=255,
83+
null=True,
84+
),
85+
),
86+
(
87+
"created_at",
88+
models.DateTimeField(
89+
auto_now_add=True,
90+
help_text="Timestamp indicating when the code change was created.",
91+
),
92+
),
93+
(
94+
"updated_at",
95+
models.DateTimeField(
96+
auto_now=True,
97+
help_text="Timestamp indicating when the code change was last updated.",
98+
),
99+
),
100+
(
101+
"base_version",
102+
models.ForeignKey(
103+
blank=True,
104+
help_text="The base version of the package to which this code change applies.",
105+
null=True,
106+
on_delete=django.db.models.deletion.SET_NULL,
107+
related_name="base_version_codechanges",
108+
to="vulnerabilities.package",
109+
),
110+
),
111+
(
112+
"package_vulnerabilities",
113+
models.ManyToManyField(
114+
help_text="The vulnerabilities fixed by this code change.",
115+
related_name="code_fixes",
116+
to="vulnerabilities.affectedbypackagerelatedvulnerability",
117+
),
118+
),
119+
],
120+
options={
121+
"abstract": False,
122+
},
123+
),
124+
]

vulnerabilities/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1619,7 +1619,7 @@ class CodeChange(models.Model):
16191619
null=True,
16201620
blank=True,
16211621
on_delete=models.SET_NULL,
1622-
related_name="base_version_changes",
1622+
related_name="base_version_codechanges",
16231623
help_text="The base version of the package to which this code change applies.",
16241624
)
16251625
base_commit = models.CharField(

vulnerabilities/pipelines/collect_commits.py

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,6 @@
1616
from vulnerabilities.pipelines import VulnerableCodePipeline
1717

1818

19-
def extract_commit_id(url):
20-
"""
21-
Extract a commit ID from a URL, if available.
22-
Supports different URL structures for commit references.
23-
24-
>>> extract_commit_id("https://github.com/hedgedoc/hedgedoc/commit/c1789474020a6d668d616464cb2da5e90e123f65")
25-
'c1789474020a6d668d616464cb2da5e90e123f65'
26-
"""
27-
if "/commit/" in url:
28-
parts = url.split("/")
29-
if len(parts) > 1 and parts[-2] == "commit":
30-
return parts[-1]
31-
return None
32-
33-
3419
def is_reference_already_processed(reference_url, commit_id):
3520
"""
3621
Check if a reference and commit ID pair already exists in a CodeFix entry.
@@ -62,15 +47,14 @@ def collect_and_store_fix_commits(self):
6247
for reference in progress.iter(references.paginated(per_page=500)):
6348
for vulnerability in reference.vulnerabilities.all():
6449
vcs_url = normalize_vcs_url(reference.url)
65-
commit_id = extract_commit_id(reference.url)
6650

67-
if not commit_id or not vcs_url:
51+
if not vcs_url:
6852
continue
6953

7054
# Skip if already processed
71-
if is_reference_already_processed(reference.url, commit_id):
55+
if is_reference_already_processed(reference.url, vcs_url):
7256
self.log(
73-
f"Skipping already processed reference: {reference.url} with commit {commit_id}"
57+
f"Skipping already processed reference: {reference.url} with VCS URL {vcs_url}"
7458
)
7559
continue
7660
purl = url2purl(vcs_url)
@@ -81,7 +65,7 @@ def collect_and_store_fix_commits(self):
8165
codefix = self.create_codefix_entry(
8266
vulnerability=vulnerability,
8367
package=package,
84-
commit_id=commit_id,
68+
vcs_url=vcs_url,
8569
reference=reference.url,
8670
)
8771
if codefix:
@@ -100,15 +84,15 @@ def get_or_create_package(self, purl):
10084
self.log(f"Error creating package from purl {purl}: {e}")
10185
return None
10286

103-
def create_codefix_entry(self, vulnerability, package, commit_id, reference):
87+
def create_codefix_entry(self, vulnerability, package, vcs_url, reference):
10488
"""
10589
Create a CodeFix entry associated with the given vulnerability and package.
10690
"""
10791
try:
10892
codefix, created = CodeFix.objects.get_or_create(
10993
base_version=package,
11094
defaults={
111-
"commits": [commit_id],
95+
"commits": [vcs_url],
11296
"references": [reference],
11397
},
11498
)

0 commit comments

Comments
 (0)