@@ -1287,41 +1287,67 @@ def test_cvss3_validation(self):
1287
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 })
1288
1288
self .assertEqual (result .status_code , status .HTTP_200_OK )
1289
1289
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 )
1290
1298
# valid so vector must be set and score calculated
1291
1299
self .assertEqual ("CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H" , finding .cvssv3 )
1292
1300
self .assertEqual (8.8 , finding .cvssv3_score )
1293
1301
1294
- with self .subTest (i = 1 ):
1302
+ with self .subTest (i = 2 ):
1295
1303
# extra slash makes it invalid
1296
1304
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 })
1297
1305
self .assertEqual (result .status_code , status .HTTP_400_BAD_REQUEST )
1298
1306
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()" ])
1300
1308
# invalid vector, so no calculated score and no score stored
1301
1309
self .assertEqual (None , finding .cvssv3 )
1302
1310
self .assertEqual (None , finding .cvssv3_score )
1303
1311
1304
- with self .subTest (i = 2 ):
1312
+ with self .subTest (i = 3 ):
1305
1313
# no CVSS version prefix makes it invalid
1306
1314
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 })
1307
1315
self .assertEqual (result .status_code , status .HTTP_400_BAD_REQUEST )
1308
1316
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()" ])
1310
1318
# invalid vector, so no calculated score and no score stored
1311
1319
self .assertEqual (None , finding .cvssv3 )
1312
1320
self .assertEqual (None , finding .cvssv3_score )
1313
1321
1314
- with self .subTest (i = 3 ):
1322
+ with self .subTest (i = 4 ):
1315
1323
# CVSS4 version makes it invalid
1316
1324
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 })
1317
1325
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()" ])
1319
1327
finding = Finding .objects .get (id = 3 )
1320
1328
# invalid vector, so no calculated score and no score stored
1321
1329
self .assertEqual (None , finding .cvssv3 )
1322
1330
self .assertEqual (None , finding .cvssv3_score )
1323
1331
1324
1332
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 ):
1325
1351
# CVSS2 style vector makes not supported
1326
1352
result = self .client .patch (self .url + "3/" , data = {"cvssv3" : "AV:N/AC:L/Au:N/C:P/I:P/A:P" , "cvssv3_score" : 6 })
1327
1353
self .assertEqual (result .status_code , status .HTTP_400_BAD_REQUEST )
@@ -1331,31 +1357,31 @@ def test_cvss3_validation(self):
1331
1357
self .assertEqual (None , finding .cvssv3 )
1332
1358
self .assertEqual (None , finding .cvssv3_score )
1333
1359
1334
- with self .subTest (i = 5 ):
1360
+ with self .subTest (i = 6 ):
1335
1361
# CVSS2 prefix makes it invalid
1336
1362
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 })
1337
1363
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()" ])
1339
1365
finding = Finding .objects .get (id = 3 )
1340
1366
# invalid vector, so no calculated score and no score stored
1341
1367
self .assertEqual (None , finding .cvssv3 )
1342
1368
self .assertEqual (None , finding .cvssv3_score )
1343
1369
1344
- with self .subTest (i = 6 ):
1370
+ with self .subTest (i = 7 ):
1345
1371
# try to put rubbish in there
1346
1372
result = self .client .patch (self .url + "4/" , data = {"cvssv3" : "happy little vector" , "cvssv3_score" : 3 })
1347
1373
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()" ])
1349
1375
finding = Finding .objects .get (id = 4 )
1350
1376
# invalid vector, so no calculated score and no score stored
1351
1377
self .assertEqual (None , finding .cvssv3 )
1352
1378
self .assertEqual (None , finding .cvssv3_score )
1353
1379
1354
- with self .subTest (i = 7 ):
1380
+ with self .subTest (i = 8 ):
1355
1381
# 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 })
1357
1383
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. " ])
1359
1385
finding = Finding .objects .get (id = 3 )
1360
1386
# invalid vector, so no calculated score and no score stored
1361
1387
self .assertEqual (None , finding .cvssv3 )
0 commit comments