@@ -1287,41 +1287,67 @@ def test_cvss3_validation(self):
12871287 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 })
12881288 self .assertEqual (result .status_code , status .HTTP_200_OK )
12891289 finding = Finding .objects .get (id = 2 )
1290+ # valid so vector must be set and score calculated does not ovewrite the score provided by us/the report
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 (3.0 , finding .cvssv3_score )
1293+
1294+ with self .subTest (i = 1 ):
1295+ result = self .client .patch (self .url + "5/" , data = {"cvssv3" : "CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H" })
1296+ self .assertEqual (result .status_code , status .HTTP_200_OK )
1297+ finding = Finding .objects .get (id = 5 )
12901298 # valid so vector must be set and score calculated
12911299 self .assertEqual ("CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H" , finding .cvssv3 )
12921300 self .assertEqual (8.8 , finding .cvssv3_score )
12931301
1294- with self .subTest (i = 1 ):
1302+ with self .subTest (i = 2 ):
12951303 # extra slash makes it invalid
12961304 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 })
12971305 self .assertEqual (result .status_code , status .HTTP_400_BAD_REQUEST )
12981306 finding = Finding .objects .get (id = 3 )
1299- self .assertEqual (result .json ()["cvssv3" ], ["No valid CVSS vectors found by cvss.parse_cvss_from_text()" ])
1307+ self .assertEqual (result .json ()["cvssv3" ], ["No valid CVSS3 vectors found by cvss.parse_cvss_from_text()" ])
13001308 # invalid vector, so no calculated score and no score stored
13011309 self .assertEqual (None , finding .cvssv3 )
13021310 self .assertEqual (None , finding .cvssv3_score )
13031311
1304- with self .subTest (i = 2 ):
1312+ with self .subTest (i = 3 ):
13051313 # no CVSS version prefix makes it invalid
13061314 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 })
13071315 self .assertEqual (result .status_code , status .HTTP_400_BAD_REQUEST )
13081316 finding = Finding .objects .get (id = 3 )
1309- self .assertEqual (result .json ()["cvssv3" ], ["No valid CVSS vectors found by cvss.parse_cvss_from_text()" ])
1317+ self .assertEqual (result .json ()["cvssv3" ], ["No valid CVSS3 vectors found by cvss.parse_cvss_from_text()" ])
13101318 # invalid vector, so no calculated score and no score stored
13111319 self .assertEqual (None , finding .cvssv3 )
13121320 self .assertEqual (None , finding .cvssv3_score )
13131321
1314- with self .subTest (i = 3 ):
1322+ with self .subTest (i = 4 ):
13151323 # CVSS4 version makes it invalid
13161324 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 })
13171325 self .assertEqual (result .status_code , status .HTTP_400_BAD_REQUEST )
1318- self .assertEqual (result .json ()["cvssv3" ], ["No valid CVSS vectors found by cvss.parse_cvss_from_text()" ])
1326+ self .assertEqual (result .json ()["cvssv3" ], ["No valid CVSS3 vectors found by cvss.parse_cvss_from_text()" ])
13191327 finding = Finding .objects .get (id = 3 )
13201328 # invalid vector, so no calculated score and no score stored
13211329 self .assertEqual (None , finding .cvssv3 )
13221330 self .assertEqual (None , finding .cvssv3_score )
13231331
13241332 with self .subTest (i = 4 ):
1333+ # CVSS4 version valid
1334+ result = self .client .patch (self .url + "3/" , data = {"cvssv4" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:N/SC:N/SI:N/SA:N" , "cvssv4_score" : 5 })
1335+ self .assertEqual (result .status_code , status .HTTP_200_OK )
1336+ finding = Finding .objects .get (id = 3 )
1337+ # invalid vector, so no calculated score and our provided score is stored (not overwritten)
1338+ self .assertEqual ("CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:N/SC:N/SI:N/SA:N" , finding .cvssv4 )
1339+ self .assertEqual (5.0 , finding .cvssv4_score )
1340+
1341+ with self .subTest (i = 14 ):
1342+ # CVSS4 version valid, calculate score
1343+ result = self .client .patch (self .url + "3/" , data = {"cvssv4" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:N/SC:N/SI:N/SA:N" })
1344+ self .assertEqual (result .status_code , status .HTTP_200_OK )
1345+ finding = Finding .objects .get (id = 3 )
1346+ # invalid vector, so no calculated score and our provided score is stored (not overwritten)
1347+ self .assertEqual ("CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:N/SC:N/SI:N/SA:N" , finding .cvssv4 )
1348+ self .assertEqual (5.0 , finding .cvssv4_score )
1349+
1350+ with self .subTest (i = 5 ):
13251351 # CVSS2 style vector makes not supported
13261352 result = self .client .patch (self .url + "3/" , data = {"cvssv3" : "AV:N/AC:L/Au:N/C:P/I:P/A:P" , "cvssv3_score" : 6 })
13271353 self .assertEqual (result .status_code , status .HTTP_400_BAD_REQUEST )
@@ -1331,31 +1357,31 @@ def test_cvss3_validation(self):
13311357 self .assertEqual (None , finding .cvssv3 )
13321358 self .assertEqual (None , finding .cvssv3_score )
13331359
1334- with self .subTest (i = 5 ):
1360+ with self .subTest (i = 6 ):
13351361 # CVSS2 prefix makes it invalid
13361362 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 })
13371363 self .assertEqual (result .status_code , status .HTTP_400_BAD_REQUEST )
1338- self .assertEqual (result .json ()["cvssv3" ], ["No valid CVSS vectors found by cvss.parse_cvss_from_text()" ])
1364+ self .assertEqual (result .json ()["cvssv3" ], ["No valid CVSS3 vectors found by cvss.parse_cvss_from_text()" ])
13391365 finding = Finding .objects .get (id = 3 )
13401366 # invalid vector, so no calculated score and no score stored
13411367 self .assertEqual (None , finding .cvssv3 )
13421368 self .assertEqual (None , finding .cvssv3_score )
13431369
1344- with self .subTest (i = 6 ):
1370+ with self .subTest (i = 7 ):
13451371 # try to put rubbish in there
13461372 result = self .client .patch (self .url + "4/" , data = {"cvssv3" : "happy little vector" , "cvssv3_score" : 3 })
13471373 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()" ])
1374+ self .assertEqual (result .json ()["cvssv3" ], ["No valid CVSS3 vectors found by cvss.parse_cvss_from_text()" ])
13491375 finding = Finding .objects .get (id = 4 )
13501376 # invalid vector, so no calculated score and no score stored
13511377 self .assertEqual (None , finding .cvssv3 )
13521378 self .assertEqual (None , finding .cvssv3_score )
13531379
1354- with self .subTest (i = 7 ):
1380+ with self .subTest (i = 8 ):
13551381 # 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 })
1382+ result = self .client .patch (self .url + "3/" , data = {"cvssv3" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:N /UI:N/VC:N/VI:N/VA:N/SC:N/SI:N/SA:N " , "cvssv3_score" : 7 })
13571383 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() " ])
1384+ self .assertEqual (result .json ()["cvssv3" ], ["CVSS(4) vector vannot be stored in the cvss3 field. Use the cvss4 fields. " ])
13591385 finding = Finding .objects .get (id = 3 )
13601386 # invalid vector, so no calculated score and no score stored
13611387 self .assertEqual (None , finding .cvssv3 )
0 commit comments