Skip to content

Commit 2b17e77

Browse files
committed
Update classify_patch_source function so we can store both Patch and PackageCommitPatch
Signed-off-by: ziad hany <ziadhany2016@gmail.com>
1 parent c548fd2 commit 2b17e77

4 files changed

Lines changed: 137 additions & 80 deletions

File tree

vulnerabilities/pipelines/v2_importers/aosp_importer.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -88,22 +88,22 @@ def collect_advisories(self):
8888
patch_url = commit_data.get("patchUrl")
8989
commit_id = commit_data.get("commitId")
9090

91-
base_purl, patch_obj = classify_patch_source(
91+
base_purl, patch_obj_list = classify_patch_source(
9292
vcs_url=None,
9393
commit_hash=commit_id,
9494
patch_url=patch_url,
9595
patch_text=None,
9696
)
97-
98-
if isinstance(patch_obj, PackageCommitPatchData):
99-
fixed_commit = patch_obj
100-
affected_package = AffectedPackageV2(
101-
package=base_purl,
102-
fixed_by_commit_patches=[fixed_commit],
103-
)
104-
affected_packages.append(affected_package)
105-
elif isinstance(patch_obj, PatchData):
106-
patches.append(patch_obj)
97+
for patch_obj in patch_obj_list:
98+
if isinstance(patch_obj, PackageCommitPatchData):
99+
fixed_commit = patch_obj
100+
affected_package = AffectedPackageV2(
101+
package=base_purl,
102+
fixed_by_commit_patches=[fixed_commit],
103+
)
104+
affected_packages.append(affected_package)
105+
elif isinstance(patch_obj, PatchData):
106+
patches.append(patch_obj)
107107

108108
url = (
109109
"https://raw.githubusercontent.com/quarkslab/aosp_dataset/refs/heads/master/cves/"

vulnerabilities/pipes/advisory.py

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
from django.db import transaction
2020
from django.db.models import Q
2121
from django.db.models.query import QuerySet
22-
from packageurl.contrib.purl2url import get_repo_url
22+
from packageurl import PackageURL
23+
from packageurl.contrib.purl2url import purl2url
2324
from packageurl.contrib.url2purl import url2purl
2425

2526
from aboutcode.hashid import get_core_purl
@@ -184,15 +185,17 @@ def classify_patch_source(vcs_url, commit_hash, patch_text, patch_url):
184185
purl = url2purl(vcs_url)
185186

186187
if not purl:
187-
return None, PatchData(
188-
patch_text=patch_text,
189-
patch_url=patch_url,
190-
)
188+
return None, [
189+
PatchData(
190+
patch_text=patch_text,
191+
patch_url=patch_url,
192+
)
193+
]
191194

192195
base_purl = get_core_purl(purl)
193196
purl_string = base_purl.to_string()
194197

195-
vcs_url_p = get_repo_url(purl_string)
198+
vcs_url_p = purl2url(purl_string)
196199
commit_hash_p = purl.version
197200

198201
final_vcs_url = vcs_url or vcs_url_p
@@ -204,16 +207,28 @@ def classify_patch_source(vcs_url, commit_hash, patch_text, patch_url):
204207
and is_commit(final_commit_hash)
205208
and purl.type in VCS_URLS_SUPPORTED_TYPES
206209
):
207-
return base_purl, PackageCommitPatchData(
208-
vcs_url=final_vcs_url,
209-
commit_hash=final_commit_hash,
210+
purl = PackageURL(
211+
type=purl.type, namespace=purl.namespace, name=purl.name, version=final_commit_hash
212+
)
213+
final_patch_url = patch_url or purl2url(str(purl))
214+
return base_purl, [
215+
PackageCommitPatchData(
216+
vcs_url=final_vcs_url,
217+
commit_hash=final_commit_hash,
218+
patch_text=patch_text,
219+
),
220+
PatchData(
221+
patch_text=patch_text,
222+
patch_url=final_patch_url,
223+
),
224+
]
225+
226+
return None, [
227+
PatchData(
228+
patch_url=patch_url or final_vcs_url,
210229
patch_text=patch_text,
211230
)
212-
213-
return None, PatchData(
214-
patch_url=patch_url or final_vcs_url,
215-
patch_text=patch_text,
216-
)
231+
]
217232

218233

219234
def insert_advisory(advisory: AdvisoryData, pipeline_id: str, logger: Callable = None):

vulnerabilities/tests/test_data/aosp/CVE-aosp_test3-expected.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,13 @@
2727
}
2828
],
2929
"references_v2": [],
30-
"patches": [],
30+
"patches": [
31+
{
32+
"patch_url": "https://github.com/torvalds/linux/commit/0048b4837affd153897ed1222283492070027aa9",
33+
"patch_text": null,
34+
"patch_checksum": null
35+
}
36+
],
3137
"severities": [
3238
{
3339
"system": "generic_textual",

vulnerabilities/tests/test_importer.py

Lines changed: 90 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,27 @@ def test_all_importers_have_unique_name():
2525

2626

2727
@pytest.mark.parametrize(
28-
"vcs_url, commit_hash, patch_text, patch_url, expected_result_tuple",
28+
"vcs_url, commit_hash, patch_text, patch_url, expected_data_list",
2929
[
3030
# SUPPORTED: VCS URL + commit hash + no code patch
3131
(
3232
"https://github.com/user/repo",
33-
"a1b2c3d4",
33+
"a5f3206663e16c0686739fa83fca2978e6818b6",
3434
None,
3535
None,
3636
(
3737
"pkg:github/user/repo",
38-
PackageCommitPatchData(
39-
vcs_url="https://github.com/user/repo",
40-
commit_hash="a1b2c3d4",
41-
patch_text=None,
42-
),
38+
[
39+
PackageCommitPatchData(
40+
vcs_url="https://github.com/user/repo",
41+
commit_hash="a5f3206663e16c0686739fa83fca2978e6818b6",
42+
patch_text=None,
43+
),
44+
PatchData(
45+
patch_text=None,
46+
patch_url="https://github.com/user/repo/tree/a5f3206663e16c0686739fa83fca2978e6818b6",
47+
),
48+
],
4349
),
4450
),
4551
# UNSUPPORTED: VCS URL + commit hash + no code patch
@@ -50,10 +56,12 @@ def test_all_importers_have_unique_name():
5056
None,
5157
(
5258
None,
53-
PatchData(
54-
patch_text=None,
55-
patch_url="https://unsupported.example.com/repo",
56-
),
59+
[
60+
PatchData(
61+
patch_text=None,
62+
patch_url="https://unsupported.example.com/repo",
63+
)
64+
],
5765
),
5866
),
5967
# SUPPORTED: VCS URL + commit hash + code patch
@@ -64,11 +72,17 @@ def test_all_importers_have_unique_name():
6472
"https://github.com/user/repo/commit/a1b2c3d4",
6573
(
6674
"pkg:github/user/repo",
67-
PackageCommitPatchData(
68-
commit_hash="deadbeef",
69-
vcs_url="https://github.com/user/repo",
70-
patch_text="diff --git a/file b/file",
71-
),
75+
[
76+
PackageCommitPatchData(
77+
commit_hash="deadbeef",
78+
vcs_url="https://github.com/user/repo",
79+
patch_text="diff --git a/file b/file",
80+
),
81+
PatchData(
82+
patch_text="diff --git a/file b/file",
83+
patch_url="https://github.com/user/repo/commit/a1b2c3d4",
84+
),
85+
],
7286
),
7387
),
7488
# UNSUPPORTED: VCS URL + commit hash + code patch
@@ -79,10 +93,12 @@ def test_all_importers_have_unique_name():
7993
"https://example.com/user/unknown/commits/a1b2c3d4",
8094
(
8195
None,
82-
PatchData(
83-
patch_text="diff content",
84-
patch_url="https://example.com/user/unknown/commits/a1b2c3d4",
85-
),
96+
[
97+
PatchData(
98+
patch_text="diff content",
99+
patch_url="https://example.com/user/unknown/commits/a1b2c3d4",
100+
)
101+
],
86102
),
87103
),
88104
# NO VCS URL + NO commit hash + code patch
@@ -93,10 +109,12 @@ def test_all_importers_have_unique_name():
93109
"https://example.com/user/unknown/commits/a1b2c3d4",
94110
(
95111
None,
96-
PatchData(
97-
patch_text="diff content",
98-
patch_url="https://example.com/user/unknown/commits/a1b2c3d4",
99-
),
112+
[
113+
PatchData(
114+
patch_text="diff content",
115+
patch_url="https://example.com/user/unknown/commits/a1b2c3d4",
116+
)
117+
],
100118
),
101119
),
102120
# SUPPORTED: VCS URL + NO commit hash + no code patch #invalid
@@ -107,10 +125,12 @@ def test_all_importers_have_unique_name():
107125
None,
108126
(
109127
None,
110-
PatchData(
111-
patch_text=None,
112-
patch_url="https://github.com/user/repo",
113-
),
128+
[
129+
PatchData(
130+
patch_text=None,
131+
patch_url="https://github.com/user/repo",
132+
)
133+
],
114134
),
115135
),
116136
# UNSUPPORTED: VCS URL + NO commit hash + no code patch #invalid
@@ -121,10 +141,12 @@ def test_all_importers_have_unique_name():
121141
None,
122142
(
123143
None,
124-
PatchData(
125-
patch_text=None,
126-
patch_url="https://example.com/user/repo",
127-
),
144+
[
145+
PatchData(
146+
patch_text=None,
147+
patch_url="https://example.com/user/repo",
148+
)
149+
],
128150
),
129151
),
130152
# SUPPORTED: VCS URL + NO commit hash + code patch
@@ -135,11 +157,17 @@ def test_all_importers_have_unique_name():
135157
"https://github.com/user/unknown/commit/98e516011d6e096e25247b82fc5f196bbeecff10",
136158
(
137159
"pkg:github/user/unknown",
138-
PackageCommitPatchData(
139-
vcs_url="https://github.com/user/repo",
140-
commit_hash="98e516011d6e096e25247b82fc5f196bbeecff10",
141-
patch_text=None,
142-
),
160+
[
161+
PackageCommitPatchData(
162+
vcs_url="https://github.com/user/repo",
163+
commit_hash="98e516011d6e096e25247b82fc5f196bbeecff10",
164+
patch_text=None,
165+
),
166+
PatchData(
167+
patch_text=None,
168+
patch_url="https://github.com/user/unknown/commit/98e516011d6e096e25247b82fc5f196bbeecff10",
169+
),
170+
],
143171
),
144172
),
145173
# UNSUPPORTED: VCS URL + NO commit hash + code patch
@@ -150,32 +178,40 @@ def test_all_importers_have_unique_name():
150178
"https://example.com/user/unknown/commits/98e516011d6e096e25247b82fc5f196bbeecff10.patch",
151179
(
152180
None,
153-
PatchData(
154-
patch_text=None,
155-
patch_url="https://example.com/user/unknown/commits/98e516011d6e096e25247b82fc5f196bbeecff10.patch",
156-
),
181+
[
182+
PatchData(
183+
patch_text=None,
184+
patch_url="https://example.com/user/unknown/commits/98e516011d6e096e25247b82fc5f196bbeecff10.patch",
185+
)
186+
],
157187
),
158188
),
159189
],
160190
)
161191
def test_classify_patch_source_integration(
162-
vcs_url, commit_hash, patch_text, patch_url, expected_result_tuple
192+
vcs_url, commit_hash, patch_text, patch_url, expected_data_list
163193
):
164-
expected_purl, expected_data_obj = expected_result_tuple
194+
expected_purl, expected_data_objects = expected_data_list
165195

166-
actual_purl, actual_data_obj = classify_patch_source(
196+
actual_purl, actual_data_objects = classify_patch_source(
167197
vcs_url=vcs_url, commit_hash=commit_hash, patch_text=patch_text, patch_url=patch_url
168198
)
169199

170-
assert isinstance(actual_data_obj, type(expected_data_obj))
171-
172-
if isinstance(actual_data_obj, PackageCommitPatchData):
173-
assert actual_data_obj.vcs_url == expected_data_obj.vcs_url
174-
assert actual_data_obj.commit_hash == expected_data_obj.commit_hash
175-
assert actual_data_obj.patch_text == expected_data_obj.patch_text
200+
if expected_purl:
176201
assert str(actual_purl) == expected_purl
177-
178-
elif isinstance(actual_data_obj, PatchData):
179-
assert actual_data_obj.patch_url == expected_data_obj.patch_url
180-
assert actual_data_obj.patch_text == expected_data_obj.patch_text
202+
else:
181203
assert actual_purl is None
204+
205+
assert len(actual_data_objects) == len(expected_data_objects)
206+
207+
for actual_data_obj, expected_data_obj in zip(actual_data_objects, expected_data_objects):
208+
assert isinstance(actual_data_obj, type(expected_data_obj))
209+
210+
if isinstance(actual_data_obj, PackageCommitPatchData):
211+
assert actual_data_obj.vcs_url == expected_data_obj.vcs_url
212+
assert actual_data_obj.commit_hash == expected_data_obj.commit_hash
213+
assert actual_data_obj.patch_text == expected_data_obj.patch_text
214+
215+
elif isinstance(actual_data_obj, PatchData):
216+
assert actual_data_obj.patch_url == expected_data_obj.patch_url
217+
assert actual_data_obj.patch_text == expected_data_obj.patch_text

0 commit comments

Comments
 (0)