Skip to content

Commit bc79d74

Browse files
committed
Return 404 instead of 500 for unknown advisory pages
AdvisoryV2QuerySet.latest_for_avid() used .get() and raised an unhandled DoesNotExist for an unknown avid, so advisory detail URLs such as /advisories/pysec/PYSEC-3000-0 returned a server error. All three detail views calling it already check for a None return and raise Http404, so return None from the queryset method instead. Closes #2396 Signed-off-by: Manoj Gowda <manojgowdabs18@gmail.com>
1 parent adc81cb commit bc79d74

2 files changed

Lines changed: 22 additions & 1 deletion

File tree

vulnerabilities/models.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2926,7 +2926,9 @@ def to_dict(self):
29262926

29272927
class AdvisoryV2QuerySet(BaseQuerySet):
29282928
def latest_for_avid(self, avid: str):
2929-
return self.get(avid=avid, is_latest=True)
2929+
# Return None when there is no advisory for this avid: the detail
2930+
# views rely on this to raise an Http404 instead of a server error.
2931+
return self.filter(avid=avid, is_latest=True).first()
29302932

29312933
def latest_per_avid(self):
29322934
return self.filter(is_latest=True)

vulnerabilities/tests/test_view.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,3 +379,22 @@ def test_throttle_after_15_requests(self):
379379
HTTP_USER_AGENT="test-agent",
380380
)
381381
assert response.status_code == 429
382+
383+
384+
class AdvisoryDetailNotFoundTestCase(TestCase):
385+
def setUp(self):
386+
# bypass the altcha bot protection middleware
387+
import time
388+
389+
session = self.client.session
390+
session["altcha_verified_at"] = time.time()
391+
session.save()
392+
393+
def test_unknown_advisory_avid_returns_404_not_500(self):
394+
# https://github.com/aboutcode-org/vulnerablecode/issues/2396
395+
response = self.client.get("/advisories/pysec/PYSEC-3000-0")
396+
self.assertEqual(404, response.status_code)
397+
398+
def test_unknown_advisory_packages_avid_returns_404_not_500(self):
399+
response = self.client.get("/advisories/packages/pysec/PYSEC-3000-0")
400+
self.assertEqual(404, response.status_code)

0 commit comments

Comments
 (0)