Skip to content

Commit ba43c54

Browse files
add tests for vulnerability_ids
1 parent 510ba07 commit ba43c54

2 files changed

Lines changed: 106 additions & 8 deletions

File tree

dojo/api_v2/serializers.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1741,12 +1741,13 @@ def update(self, instance, validated_data):
17411741
push_to_jira = validated_data.pop("push_to_jira")
17421742

17431743
# Save vulnerability ids and pop them
1744-
if "vulnerability_id_set" in validated_data:
1745-
vulnerability_id_set = validated_data.pop("vulnerability_id_set")
1746-
vulnerability_ids = []
1747-
if vulnerability_id_set:
1748-
vulnerability_ids.extend(vulnerability_id["vulnerability_id"] for vulnerability_id in vulnerability_id_set)
1749-
save_vulnerability_ids(instance, vulnerability_ids)
1744+
parsed_vulnerability_ids = []
1745+
if (vulnerability_ids := validated_data.pop("vulnerability_id_set", None)):
1746+
logger.debug("VULNERABILITY_ID_SET: %s", vulnerability_ids)
1747+
parsed_vulnerability_ids.extend(vulnerability_id["vulnerability_id"] for vulnerability_id in vulnerability_ids)
1748+
logger.debug("SETTING CVE FROM VULNERABILITY_ID_SET: %s", parsed_vulnerability_ids[0])
1749+
validated_data["cve"] = parsed_vulnerability_ids[0]
1750+
17501751
# Save the reporter on the finding
17511752
if reporter_id := validated_data.get("reporter"):
17521753
instance.reporter = reporter_id
@@ -1755,6 +1756,9 @@ def update(self, instance, validated_data):
17551756
instance, validated_data,
17561757
)
17571758

1759+
if parsed_vulnerability_ids:
1760+
save_vulnerability_ids(instance, parsed_vulnerability_ids)
1761+
17581762
if push_to_jira:
17591763
jira_helper.push_to_jira(instance)
17601764

@@ -1869,12 +1873,16 @@ def create(self, validated_data):
18691873
# Process the vulnerability IDs specially
18701874
parsed_vulnerability_ids = []
18711875
if (vulnerability_ids := validated_data.pop("vulnerability_id_set", None)):
1876+
logger.debug("VULNERABILITY_ID_SET: %s", vulnerability_ids)
18721877
parsed_vulnerability_ids.extend(vulnerability_id["vulnerability_id"] for vulnerability_id in vulnerability_ids)
1878+
logger.debug("SETTING CVE FROM VULNERABILITY_ID_SET: %s", parsed_vulnerability_ids[0])
18731879
validated_data["cve"] = parsed_vulnerability_ids[0]
18741880

18751881
new_finding = super().create(
18761882
validated_data)
18771883

1884+
logger.debug(f"New finding CVE: {new_finding.cve}")
1885+
18781886
# Deal with all of the many to many things
18791887
if notes:
18801888
new_finding.notes.set(notes)
@@ -1886,7 +1894,7 @@ def create(self, validated_data):
18861894
save_vulnerability_ids(new_finding, parsed_vulnerability_ids)
18871895
# can we avoid this extra save? the cve has already been set above in validated_data. but there are no tests for this
18881896
# on finding update nothing is done # with vulnerability_ids?
1889-
new_finding.save()
1897+
# new_finding.save()
18901898

18911899
if push_to_jira:
18921900
jira_helper.push_to_jira(new_finding)

unittests/test_finding_helper.py

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66
from crum import impersonate
77
from django.contrib.auth.models import User
88
from django.utils import timezone
9+
from rest_framework.authtoken.models import Token
10+
from rest_framework.test import APIClient
911

1012
from dojo.finding.helper import save_vulnerability_ids, save_vulnerability_ids_template
1113
from dojo.models import Finding, Finding_Template, Test, Vulnerability_Id, Vulnerability_Id_Template
1214

13-
from .dojo_test_case import DojoTestCase
15+
from .dojo_test_case import DojoAPITestCase, DojoTestCase
1416

1517
logger = logging.getLogger(__name__)
1618

@@ -245,3 +247,91 @@ def test_save_vulnerability_id_templates(self, save_mock, delete_mock, filter_mo
245247
delete_mock.assert_called_once()
246248
self.assertEqual(save_mock.call_count, 2)
247249
self.assertEqual("REF-1", finding_template.cve)
250+
251+
252+
class TestFindingVulnerabilityIdsAPI(DojoAPITestCase):
253+
fixtures = ["dojo_testdata.json"]
254+
255+
def setUp(self):
256+
super().setUp()
257+
self.system_settings(enable_jira=True)
258+
self.testuser = User.objects.get(username="admin")
259+
self.testuser.usercontactinfo.block_execution = True
260+
self.testuser.usercontactinfo.save()
261+
token = Token.objects.get(user=self.testuser)
262+
self.client = APIClient()
263+
self.client.credentials(HTTP_AUTHORIZATION="Token " + token.key)
264+
self.client.force_login(self.get_test_admin())
265+
266+
def test_finding_create_without_cve(self):
267+
# use existing finding as template for a new finding. this finding has no cve
268+
finding_details = self.get_finding_api(2)
269+
del finding_details["id"]
270+
if "cve" in finding_details:
271+
del finding_details["cve"]
272+
new_vulnerability_ids = [
273+
{"vulnerability_id": "RHSA-12345"},
274+
{"vulnerability_id": "GHSA-7890"},
275+
]
276+
finding_details["vulnerability_ids"] = new_vulnerability_ids
277+
response = self.post_new_finding_api(finding_details)
278+
# assert resopnse data
279+
self.assertIsNone(response.get("cve"))
280+
self.assertEqual(new_vulnerability_ids, response.get("vulnerability_ids"))
281+
282+
# assert GET finding
283+
finding_id = response.get("id")
284+
response = self.get_finding_api(finding_id)
285+
self.assertIsNone(response.get("cve"))
286+
self.assertEqual(new_vulnerability_ids, response.get("vulnerability_ids"))
287+
288+
def test_finding_create_with_cve(self):
289+
# use existing finding as template for a new finding. this finding has no cve
290+
finding_details = self.get_finding_api(2)
291+
del finding_details["id"]
292+
if "cve" in finding_details:
293+
del finding_details["cve"]
294+
new_vulnerability_ids = [
295+
{"vulnerability_id": "CVE-2025-12345"},
296+
{"vulnerability_id": "RHSA-12345"},
297+
{"vulnerability_id": "GHSA-7890"},
298+
]
299+
finding_details["vulnerability_ids"] = new_vulnerability_ids
300+
response = self.post_new_finding_api(finding_details)
301+
# assert response data
302+
self.assertEqual(new_vulnerability_ids, response.get("vulnerability_ids"))
303+
304+
# CVE is not in the response, so get it fromt the database
305+
self.assertEqual("CVE-2025-12345", Finding.objects.get(id=response.get("id")).cve)
306+
307+
def test_finding_create_and_update_with_cve(self):
308+
# use existing finding as template for a new finding. this finding has no cve
309+
finding_details = self.get_finding_api(2)
310+
del finding_details["id"]
311+
if "cve" in finding_details:
312+
del finding_details["cve"]
313+
new_vulnerability_ids = [
314+
{"vulnerability_id": "CVE-2025-12345"},
315+
{"vulnerability_id": "RHSA-12345"},
316+
{"vulnerability_id": "GHSA-7890"},
317+
]
318+
finding_details["vulnerability_ids"] = new_vulnerability_ids
319+
response = self.post_new_finding_api(finding_details)
320+
finding_id = response.get("id")
321+
# assert resopnse data
322+
self.assertEqual(new_vulnerability_ids, response.get("vulnerability_ids"))
323+
324+
# CVE is not in the response, so get it fromt the database
325+
self.assertEqual("CVE-2025-12345", Finding.objects.get(id=finding_id).cve)
326+
327+
# change vulnerability_id and remove cve
328+
updated_vulnerability_ids = [
329+
{"vulnerability_id": "RHSA-000000"},
330+
]
331+
response = self.patch_finding_api(finding_id, {"vulnerability_ids": updated_vulnerability_ids})
332+
# assert resopnse data
333+
self.assertEqual(updated_vulnerability_ids, response.get("vulnerability_ids"))
334+
335+
# CVE is not in the response, so get it fromt the database
336+
# current behaviour is that the cve is taken from the first vulnerability_id...
337+
self.assertEqual("RHSA-000000", Finding.objects.get(id=finding_id).cve)

0 commit comments

Comments
 (0)