Skip to content

Commit 1545ea0

Browse files
committed
Address review comments
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent 6311be3 commit 1545ea0

4 files changed

Lines changed: 34 additions & 16 deletions

File tree

vulnerabilities/import_runner.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,24 +59,26 @@ def run(self) -> None:
5959
logger.info(f"Finished import for {importer_name}. Imported {count} advisories.")
6060

6161
def do_import(self, advisories) -> None:
62-
improver = AdvisoryBasedDefaultImprover(advisories=advisories)
63-
logger.info(f"Running improver: {improver.qualified_name}")
64-
improver_name = improver.qualified_name
62+
advisory_importer = AdvisoryBasedDefaultImprover(advisories=advisories)
63+
logger.info(f"Running improver: {advisory_importer.qualified_name}")
64+
improver_name = advisory_importer.qualified_name
6565
advisories = []
66-
for advisory in improver.interesting_advisories:
66+
for advisory in advisory_importer.interesting_advisories:
6767
if advisory.date_imported:
6868
continue
6969
logger.info(f"Processing advisory: {advisory!r}")
7070
try:
71-
inferences = improver.get_inferences(advisory_data=advisory.to_advisory_data())
71+
inferences = advisory_importer.get_inferences(
72+
advisory_data=advisory.to_advisory_data()
73+
)
7274
process_inferences(
7375
inferences=inferences,
7476
advisory=advisory,
7577
improver_name=improver_name,
7678
)
7779
except Exception as e:
7880
logger.info(f"Failed to process advisory: {advisory!r} with error {e!r}")
79-
logger.info("Finished improving using %s.", improver.__class__.qualified_name)
81+
logger.info("Finished improving using %s.", advisory_importer.__class__.qualified_name)
8082

8183
def process_advisories(
8284
self, advisory_datas: Iterable[AdvisoryData], importer_name: str
@@ -128,13 +130,13 @@ def process_advisories(
128130
def process_inferences(inferences: List[Inference], advisory: Advisory, improver_name: str):
129131
"""
130132
Return number of inferences processed.
131-
An atomic transaction that updates both the Advisory (e.g. date_improved)
133+
An atomic transaction that updates both the Advisory (e.g. date_imported)
132134
and processes the given inferences to create or update corresponding
133135
database fields.
134136
135137
This avoids failing the entire improver when only a single inference is
136138
erroneous. Also, the atomic transaction for every advisory and its
137-
inferences makes sure that date_improved of advisory is consistent.
139+
inferences makes sure that date_imported of advisory is consistent.
138140
"""
139141
inferences_processed_count = 0
140142

vulnerabilities/importer.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,13 +252,15 @@ class AdvisoryData:
252252
def __post_init__(self):
253253
if self.date_published and not self.date_published.tzinfo:
254254
logger.warning(f"AdvisoryData with no tzinfo: {self!r}")
255-
self.clean_summary()
255+
self.summary = self.clean_summary(self.summary)
256256

257-
def clean_summary(self):
257+
def clean_summary(self, summary):
258258
# https://nvd.nist.gov/vuln/detail/CVE-2013-4314
259259
# https://github.com/cms-dev/cms/issues/888#issuecomment-516977572
260-
if self.summary:
261-
self.summary = self.summary.replace("\x00", "\uFFFD")
260+
summary = summary.strip()
261+
if summary:
262+
summary = summary.replace("\x00", "\uFFFD")
263+
return summary
262264

263265
def to_dict(self):
264266
return {

vulnerabilities/improve_runner.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,13 @@ def run(self) -> None:
6060
def process_inferences(inferences: List[Inference], advisory: Advisory, improver_name: str):
6161
"""
6262
Return number of inferences processed.
63-
An atomic transaction that updates both the Advisory (e.g. date_improved)
63+
An atomic transaction that updates both the Advisory (e.g. date_imported)
6464
and processes the given inferences to create or update corresponding
6565
database fields.
6666
6767
This avoids failing the entire improver when only a single inference is
6868
erroneous. Also, the atomic transaction for every advisory and its
69-
inferences makes sure that date_improved of advisory is consistent.
69+
inferences makes sure that date_imported of advisory is consistent.
7070
"""
7171
inferences_processed_count = 0
7272

@@ -150,7 +150,7 @@ def process_inferences(inferences: List[Inference], advisory: Advisory, improver
150150

151151
inferences_processed_count += 1
152152

153-
advisory.date_improved = datetime.now(timezone.utc)
153+
advisory.date_imported = datetime.now(timezone.utc)
154154
advisory.save()
155155
return inferences_processed_count
156156

vulnerabilities/tests/test_import_runner.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from datetime import datetime
1111
from datetime import timezone
1212

13+
import pytest
1314
from univers.version_range import VersionRange
1415

1516
from vulnerabilities import models
@@ -43,6 +44,7 @@ def advisory_data(self):
4344
return ADVISORY_DATAS
4445

4546

47+
@pytest.mark.django_db(transaction=True)
4648
def test_import_runner(db):
4749
runner = ImportRunner(DummyImporter)
4850
runner.run()
@@ -51,18 +53,21 @@ def test_import_runner(db):
5153
assert advisory_datas == ADVISORY_DATAS
5254

5355

56+
@pytest.mark.django_db(transaction=True)
5457
def test_process_advisories_with_no_advisory(db):
5558
ImportRunner(DummyImporter).process_advisories([], "")
5659
assert 0 == models.Advisory.objects.count()
5760

5861

62+
@pytest.mark.django_db(transaction=True)
5963
def test_process_advisories_with_advisories(db):
6064
ImportRunner(DummyImporter).process_advisories(ADVISORY_DATAS, "test_importer")
6165
advisories = models.Advisory.objects.all()
6266
advisory_datas = [x.to_advisory_data() for x in advisories]
6367
assert advisory_datas == ADVISORY_DATAS
6468

6569

70+
@pytest.mark.django_db(transaction=True)
6671
def test_process_advisories_idempotency(db):
6772
ImportRunner(DummyImporter).process_advisories(ADVISORY_DATAS, "test_importer")
6873
ImportRunner(DummyImporter).process_advisories(ADVISORY_DATAS, "test_importer")
@@ -72,6 +77,7 @@ def test_process_advisories_idempotency(db):
7277
assert advisory_datas == ADVISORY_DATAS
7378

7479

80+
@pytest.mark.django_db(transaction=True)
7581
def test_process_advisories_idempotency_with_one_new_advisory(db):
7682
advisory_datas = ADVISORY_DATAS.copy()
7783
ImportRunner(DummyImporter).process_advisories(advisory_datas, "test_importer")
@@ -86,9 +92,17 @@ def test_process_advisories_idempotency_with_one_new_advisory(db):
8692
assert advisory_datas_in_db == advisory_datas
8793

8894

89-
def test_process_advisories_idempotency_with_different_importer_names(db):
95+
@pytest.mark.django_db(transaction=True)
96+
def test_process_advisories_idempotency_with_different_importer_names():
9097
ImportRunner(DummyImporter).process_advisories(ADVISORY_DATAS, "test_importer_one")
9198
ImportRunner(DummyImporter).process_advisories(ADVISORY_DATAS, "test_importer_two")
9299
advisories = models.Advisory.objects.all()
93100
advisory_datas = [x.to_advisory_data() for x in advisories]
94101
assert advisory_datas == ADVISORY_DATAS
102+
103+
104+
def test_advisory_summary_clean_up():
105+
adv = AdvisoryData(
106+
summary="The X509Extension in pyOpenSSL before 0.13.1 does not properly handle a '\x00' character in a domain name in the Subject Alternative Name field of an X.509 certificate, which allows man-in-the-middle attackers to spoof arbitrary SSL servers via a crafted certificate issued by a legitimate Certification Authority."
107+
)
108+
assert '\x00' not in adv.summary

0 commit comments

Comments
 (0)