@@ -1281,48 +1281,85 @@ def test_severity_validation(self):
12811281 self .assertEqual (result .status_code , status .HTTP_400_BAD_REQUEST , "Severity just got set to something invalid" )
12821282 self .assertEqual (result .json ()["severity" ], ["Severity must be one of the following: ['Info', 'Low', 'Medium', 'High', 'Critical']" ])
12831283
1284- # See https://github.com/DefectDojo/django-DefectDojo/issues/8264
12851284 def test_cvss3_validation (self ):
12861285 with self .subTest (i = 0 ):
12871286 self .assertEqual (None , Finding .objects .get (id = 2 ).cvssv3 )
1288- result = self .client .patch (self .url + "2/" , data = {"cvssv3" : "CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H" })
1287+ result = self .client .patch (self .url + "2/" , data = {"cvssv3" : "CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H" , "cvssv3_score" : 3 })
12891288 self .assertEqual (result .status_code , status .HTTP_200_OK )
1290- self .assertEqual ("CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H" , Finding .objects .get (id = 2 ).cvssv3 )
1289+ finding = Finding .objects .get (id = 2 )
1290+ # valid so vector must be set and score calculated
1291+ self .assertEqual ("CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H" , finding .cvssv3 )
1292+ self .assertEqual (8.8 , finding .cvssv3_score )
12911293
12921294 with self .subTest (i = 1 ):
12931295 # extra slash makes it invalid
1294- result = self .client .patch (self .url + "3/" , data = {"cvssv3" : "CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H/" })
1296+ result = self .client .patch (self .url + "3/" , data = {"cvssv3" : "CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H/" , "cvssv3_score" : 3 })
12951297 self .assertEqual (result .status_code , status .HTTP_400_BAD_REQUEST )
1296- self .assertEqual (result .json ()["cvssv3" ], ["No CVSS vectors found by cvss.parse_cvss_from_text()" ])
1297- self .assertEqual (None , Finding .objects .get (id = 3 ).cvssv3 )
1298+ finding = Finding .objects .get (id = 3 )
1299+ self .assertEqual (result .json ()["cvssv3" ], ["No valid CVSS vectors found by cvss.parse_cvss_from_text()" ])
1300+ # invalid vector, so no calculated score and no score stored
1301+ self .assertEqual (None , finding .cvssv3 )
1302+ self .assertEqual (None , finding .cvssv3_score )
12981303
12991304 with self .subTest (i = 2 ):
13001305 # no CVSS version prefix makes it invalid
1301- result = self .client .patch (self .url + "3/" , data = {"cvssv3" : "AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H" })
1306+ result = self .client .patch (self .url + "3/" , data = {"cvssv3" : "AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H" , "cvssv3_score" : 4 })
13021307 self .assertEqual (result .status_code , status .HTTP_400_BAD_REQUEST )
1303- self .assertEqual (result .json ()["cvssv3" ], ["No CVSS vectors found by cvss.parse_cvss_from_text()" ])
1304- self .assertEqual (None , Finding .objects .get (id = 3 ).cvssv3 )
1308+ finding = Finding .objects .get (id = 3 )
1309+ self .assertEqual (result .json ()["cvssv3" ], ["No valid CVSS vectors found by cvss.parse_cvss_from_text()" ])
1310+ # invalid vector, so no calculated score and no score stored
1311+ self .assertEqual (None , finding .cvssv3 )
1312+ self .assertEqual (None , finding .cvssv3_score )
13051313
13061314 with self .subTest (i = 3 ):
13071315 # CVSS4 version makes it invalid
1308- result = self .client .patch (self .url + "3/" , data = {"cvssv3" : "CVSS:4.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H" })
1316+ result = self .client .patch (self .url + "3/" , data = {"cvssv3" : "CVSS:4.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H" , "cvssv3_score" : 5 })
13091317 self .assertEqual (result .status_code , status .HTTP_400_BAD_REQUEST )
1310- self .assertEqual (result .json ()["cvssv3" ], ["No CVSS vectors found by cvss.parse_cvss_from_text()" ])
1311- self .assertEqual (None , Finding .objects .get (id = 3 ).cvssv3 )
1318+ self .assertEqual (result .json ()["cvssv3" ], ["No valid CVSS vectors found by cvss.parse_cvss_from_text()" ])
1319+ finding = Finding .objects .get (id = 3 )
1320+ # invalid vector, so no calculated score and no score stored
1321+ self .assertEqual (None , finding .cvssv3 )
1322+ self .assertEqual (None , finding .cvssv3_score )
13121323
13131324 with self .subTest (i = 4 ):
13141325 # CVSS2 style vector makes not supported
1315- result = self .client .patch (self .url + "3/" , data = {"cvssv3" : "AV:N/AC:L/Au:N/C:P/I:P/A:P" })
1326+ result = self .client .patch (self .url + "3/" , data = {"cvssv3" : "AV:N/AC:L/Au:N/C:P/I:P/A:P" , "cvssv3_score" : 6 })
13161327 self .assertEqual (result .status_code , status .HTTP_400_BAD_REQUEST )
13171328 self .assertEqual (result .json ()["cvssv3" ], ["Unsupported CVSS(2) version detected." ])
1318- self .assertEqual (None , Finding .objects .get (id = 3 ).cvssv3 )
1329+ finding = Finding .objects .get (id = 3 )
1330+ # invalid vector, so no calculated score and no score stored
1331+ self .assertEqual (None , finding .cvssv3 )
1332+ self .assertEqual (None , finding .cvssv3_score )
13191333
13201334 with self .subTest (i = 5 ):
13211335 # CVSS2 prefix makes it invalid
1322- result = self .client .patch (self .url + "3/" , data = {"cvssv3" : "CVSS:2.0/AV:N/AC:L/Au:N/C:P/I:P/A:P" })
1336+ result = self .client .patch (self .url + "3/" , data = {"cvssv3" : "CVSS:2.0/AV:N/AC:L/Au:N/C:P/I:P/A:P" , "cvssv3_score" : 7 })
13231337 self .assertEqual (result .status_code , status .HTTP_400_BAD_REQUEST )
1324- self .assertEqual (result .json ()["cvssv3" ], ["No CVSS vectors found by cvss.parse_cvss_from_text()" ])
1325- self .assertEqual (None , Finding .objects .get (id = 3 ).cvssv3 )
1338+ self .assertEqual (result .json ()["cvssv3" ], ["No valid CVSS vectors found by cvss.parse_cvss_from_text()" ])
1339+ finding = Finding .objects .get (id = 3 )
1340+ # invalid vector, so no calculated score and no score stored
1341+ self .assertEqual (None , finding .cvssv3 )
1342+ self .assertEqual (None , finding .cvssv3_score )
1343+
1344+ with self .subTest (i = 6 ):
1345+ # try to put rubbish in there
1346+ result = self .client .patch (self .url + "4/" , data = {"cvssv3" : "happy little vector" , "cvssv3_score" : 3 })
1347+ self .assertEqual (result .status_code , status .HTTP_400_BAD_REQUEST )
1348+ self .assertEqual (result .json ()["cvssv3" ], ["No valid CVSS vectors found by cvss.parse_cvss_from_text()" ])
1349+ finding = Finding .objects .get (id = 4 )
1350+ # invalid vector, so no calculated score and no score stored
1351+ self .assertEqual (None , finding .cvssv3 )
1352+ self .assertEqual (None , finding .cvssv3_score )
1353+
1354+ with self .subTest (i = 7 ):
1355+ # CVSS4 prefix makes it invalid
1356+ result = self .client .patch (self .url + "3/" , data = {"cvssv3" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/S:U/C:H/I:H/A:H" , "cvssv3_score" : 7 })
1357+ self .assertEqual (result .status_code , status .HTTP_400_BAD_REQUEST )
1358+ self .assertEqual (result .json ()["cvssv3" ], ["No valid CVSS vectors found by cvss.parse_cvss_from_text()" ])
1359+ finding = Finding .objects .get (id = 3 )
1360+ # invalid vector, so no calculated score and no score stored
1361+ self .assertEqual (None , finding .cvssv3 )
1362+ self .assertEqual (None , finding .cvssv3_score )
13261363
13271364
13281365class FindingMetadataTest (BaseClass .BaseClassTest ):
0 commit comments