Skip to content

Commit cd9afea

Browse files
committed
Add data migration for old pysec advisory
Signed-off-by: Keshav Priyadarshi <[email protected]>
1 parent 5cb180c commit cd9afea

File tree

3 files changed

+83
-6
lines changed

3 files changed

+83
-6
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# Generated by Django 4.2.16 on 2024-10-24 13:51
2+
3+
from django.db import migrations
4+
5+
"""
6+
Update the created_by field on Advisory from the old qualified_name
7+
to the new pipeline_id.
8+
"""
9+
10+
11+
def update_created_by(apps, schema_editor):
12+
from vulnerabilities.pipelines.pysec_importer import PyPIImporterPipeline
13+
14+
Advisory = apps.get_model("vulnerabilities", "Advisory")
15+
Advisory.objects.filter(created_by="vulnerabilities.importers.pysec.PyPIImporter").update(
16+
created_by=PyPIImporterPipeline.pipeline_id
17+
)
18+
19+
20+
def reverse_update_created_by(apps, schema_editor):
21+
from vulnerabilities.pipelines.pysec_importer import PyPIImporterPipeline
22+
23+
Advisory = apps.get_model("vulnerabilities", "Advisory")
24+
Advisory.objects.filter(created_by=PyPIImporterPipeline.pipeline_id).update(
25+
created_by="vulnerabilities.importers.pysec.PyPIImporter"
26+
)
27+
28+
29+
class Migration(migrations.Migration):
30+
31+
dependencies = [
32+
("vulnerabilities", "0073_delete_packagerelatedvulnerability"),
33+
]
34+
35+
operations = [
36+
migrations.RunPython(update_created_by, reverse_code=reverse_update_created_by),
37+
]

vulnerabilities/pipelines/pysec_importer.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import requests
1616

1717
from vulnerabilities.importer import AdvisoryData
18-
from vulnerabilities.importers.osv import parse_advisory_data
1918
from vulnerabilities.pipelines import VulnerableCodeBaseImporterPipeline
2019

2120

@@ -48,6 +47,8 @@ def advisories_count(self) -> int:
4847

4948
def collect_advisories(self) -> Iterable[AdvisoryData]:
5049
"""Yield AdvisoryData using a zipped data dump of OSV data"""
50+
from vulnerabilities.importers.osv import parse_advisory_data
51+
5152
with ZipFile(BytesIO(self.advisory_zip)) as zip_file:
5253
for file_name in zip_file.namelist():
5354
if not file_name.startswith("PYSEC-"):

vulnerabilities/tests/test_data_migrations.py

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,7 @@ def setUpBeforeMigration(self, apps):
672672
date_collected=timezone.now(),
673673
)
674674

675-
def test_removal_of_duped_purls(self):
675+
def test_update_npm_pypa_created_by_field(self):
676676
Advisory = apps.get_model("vulnerabilities", "Advisory")
677677
adv = Advisory.objects.all()
678678

@@ -714,7 +714,7 @@ def setUpBeforeMigration(self, apps):
714714
date_collected=timezone.now(),
715715
)
716716

717-
def test_removal_of_duped_purls(self):
717+
def test_update_nginx_created_by_field(self):
718718
Advisory = apps.get_model("vulnerabilities", "Advisory")
719719
adv = Advisory.objects.all()
720720

@@ -753,7 +753,7 @@ def setUpBeforeMigration(self, apps):
753753
date_collected=timezone.now(),
754754
)
755755

756-
def test_removal_of_duped_purls(self):
756+
def test_update_gitlab_created_by_field(self):
757757
Advisory = apps.get_model("vulnerabilities", "Advisory")
758758
adv = Advisory.objects.all()
759759

@@ -794,7 +794,7 @@ def setUpBeforeMigration(self, apps):
794794
date_collected=timezone.now(),
795795
)
796796

797-
def test_removal_of_duped_purls(self):
797+
def test_update_github_created_by_field(self):
798798
Advisory = apps.get_model("vulnerabilities", "Advisory")
799799
adv = Advisory.objects.all()
800800

@@ -835,9 +835,48 @@ def setUpBeforeMigration(self, apps):
835835
date_collected=timezone.now(),
836836
)
837837

838-
def test_removal_of_duped_purls(self):
838+
def test_update_nvd_created_by_field(self):
839839
Advisory = apps.get_model("vulnerabilities", "Advisory")
840840
adv = Advisory.objects.all()
841841

842842
assert adv.filter(created_by="vulnerabilities.importers.nvd.NVDImporter").count() == 0
843843
assert adv.filter(created_by="nvd_importer").count() == 1
844+
845+
846+
class TestUpdatePysecAdvisoryCreatedByField(TestMigrations):
847+
app_name = "vulnerabilities"
848+
migrate_from = "0073_delete_packagerelatedvulnerability"
849+
migrate_to = "0074_update_pysec_advisory_created_by"
850+
851+
advisory_data1 = AdvisoryData(
852+
aliases=["CVE-2020-13371337"],
853+
summary="vulnerability description here",
854+
affected_packages=[
855+
AffectedPackage(
856+
package=PackageURL(type="pypi", name="foobar"),
857+
affected_version_range=VersionRange.from_string("vers:pypi/>=1.0.0|<=2.0.0"),
858+
)
859+
],
860+
references=[Reference(url="https://example.com/with/more/info/CVE-2020-13371337")],
861+
date_published=timezone.now(),
862+
url="https://test.com",
863+
)
864+
865+
def setUpBeforeMigration(self, apps):
866+
Advisory = apps.get_model("vulnerabilities", "Advisory")
867+
adv1 = Advisory.objects.create(
868+
aliases=self.advisory_data1.aliases,
869+
summary=self.advisory_data1.summary,
870+
affected_packages=[pkg.to_dict() for pkg in self.advisory_data1.affected_packages],
871+
references=[ref.to_dict() for ref in self.advisory_data1.references],
872+
url=self.advisory_data1.url,
873+
created_by="vulnerabilities.importers.pysec.PyPIImporter",
874+
date_collected=timezone.now(),
875+
)
876+
877+
def test_update_pysec_created_by_field(self):
878+
Advisory = apps.get_model("vulnerabilities", "Advisory")
879+
adv = Advisory.objects.all()
880+
881+
assert adv.filter(created_by="vulnerabilities.importers.pysec.PyPIImporter").count() == 0
882+
assert adv.filter(created_by="pysec_importer").count() == 1

0 commit comments

Comments
 (0)