Skip to content

Commit fdaaddd

Browse files
authored
Fix gitlab and elixir security importer (#1934)
* Fix gitlab and elixir security importer Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com> * Fix tests Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com> --------- Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent da873aa commit fdaaddd

File tree

7 files changed

+29
-14
lines changed

7 files changed

+29
-14
lines changed

vulnerabilities/pipelines/__init__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,13 @@ def get_published_package_versions(
361361
try:
362362
versions = package_versions.versions(str(package_url))
363363
for version in versions or []:
364+
if (
365+
version.release_date
366+
and version.release_date.tzinfo
367+
and until
368+
and until.tzinfo is None
369+
):
370+
until = until.replace(tzinfo=timezone.utc)
364371
if until and version.release_date and version.release_date > until:
365372
continue
366373
versions_before_until.append(version.value)

vulnerabilities/pipelines/v2_importers/elixir_security_importer.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,12 @@ class ElixirSecurityImporterPipeline(VulnerableCodeBaseImporterPipelineV2):
3939

4040
@classmethod
4141
def steps(cls):
42-
return (cls.collect_and_store_advisories,)
42+
return (cls.clone, cls.collect_and_store_advisories, cls.clean_downloads)
43+
44+
def clean_downloads(self):
45+
if self.vcs_response:
46+
self.log(f"Removing cloned repository")
47+
self.vcs_response.delete()
4348

4449
def clone(self):
4550
self.log(f"Cloning `{self.repo_url}`")
@@ -62,6 +67,9 @@ def collect_advisories(self) -> Iterable[AdvisoryData]:
6267

6368
def process_file(self, file, base_path) -> Iterable[AdvisoryData]:
6469
relative_path = str(file.relative_to(base_path)).strip("/")
70+
path_segments = str(file).split("/")
71+
# use the last two segments as the advisory ID
72+
advisory_id = "/".join(path_segments[-2:]).replace(".yml", "")
6573
advisory_url = (
6674
f"https://github.com/dependabot/elixir-security-advisories/blob/master/{relative_path}"
6775
)
@@ -114,8 +122,8 @@ def process_file(self, file, base_path) -> Iterable[AdvisoryData]:
114122
date_published = dateparser.parse(yaml_file.get("disclosure_date"))
115123

116124
yield AdvisoryData(
117-
advisory_id=cve_id,
118-
aliases=[],
125+
advisory_id=advisory_id,
126+
aliases=[cve_id],
119127
summary=summary,
120128
references_v2=references,
121129
affected_packages=affected_packages,

vulnerabilities/pipelines/v2_importers/gitlab_importer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,8 @@ def parse_gitlab_advisory(
233233
# refer to schema here https://gitlab.com/gitlab-org/advisories-community/-/blob/main/ci/schema/schema.json
234234
aliases = gitlab_advisory.get("identifiers")
235235
advisory_id = gitlab_advisory.get("identifier")
236+
package_slug = gitlab_advisory.get("package_slug")
237+
advisory_id = f"{package_slug}/{advisory_id}" if package_slug else advisory_id
236238
if advisory_id in aliases:
237239
aliases.remove(advisory_id)
238240
summary = build_description(gitlab_advisory.get("title"), gitlab_advisory.get("description"))
@@ -244,8 +246,6 @@ def parse_gitlab_advisory(
244246

245247
date_published = dateparser.parse(gitlab_advisory.get("pubdate"))
246248
date_published = date_published.replace(tzinfo=pytz.UTC)
247-
package_slug = gitlab_advisory.get("package_slug")
248-
advisory_id = f"{package_slug}/{advisory_id}" if package_slug else advisory_id
249249
advisory_url = get_advisory_url(
250250
file=file,
251251
base_path=base_path,

vulnerabilities/templates/advisory_detail.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@
156156
"
157157
>Affected and Fixed Packages</td>
158158
<td class="two-col-right wrap-strings">
159-
<a href="{{ advisory.id }}/packages">
159+
<a href="/advisories/packages/{{ advisory.avid }}">
160160
Package Details
161161
</a>
162162
</td>

vulnerabilities/tests/pipelines/test_elixir_security_v2_importer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def test_collect_advisories(mock_fetch_via_vcs, mock_vcs_response):
7272
assert len(advisories) == 1
7373

7474
advisory: AdvisoryData = advisories[0]
75-
assert advisory.advisory_id == "CVE-2022-9999"
75+
assert advisory.advisory_id == "some_package/CVE-2022-9999"
7676
assert advisory.summary.startswith("Cross-site scripting vulnerability")
7777
assert advisory.affected_packages[0].package.name == "plug"
7878
assert advisory.affected_packages[0].package.type == "hex"

vulnerabilities/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -570,8 +570,8 @@ class AdvisoryPackagesDetails(DetailView):
570570

571571
model = models.AdvisoryV2
572572
template_name = "advisory_package_details.html"
573-
slug_url_kwarg = "id"
574-
slug_field = "id"
573+
slug_url_kwarg = "avid"
574+
slug_field = "avid"
575575

576576
def get_queryset(self):
577577
"""

vulnerablecode/urls.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ def __init__(self, *args, **kwargs):
103103
HomePageV2.as_view(),
104104
name="home",
105105
),
106+
path(
107+
"advisories/packages/<path:avid>",
108+
AdvisoryPackagesDetails.as_view(),
109+
name="advisory_package_details",
110+
),
106111
path(
107112
"advisories/<path:avid>",
108113
AdvisoryDetails.as_view(),
@@ -143,11 +148,6 @@ def __init__(self, *args, **kwargs):
143148
VulnerabilityPackagesDetails.as_view(),
144149
name="vulnerability_package_details",
145150
),
146-
path(
147-
"advisories/<int:id>/packages",
148-
AdvisoryPackagesDetails.as_view(),
149-
name="advisory_package_details",
150-
),
151151
path(
152152
"api/",
153153
include(api_router.urls),

0 commit comments

Comments
 (0)