Skip to content

Commit 52f56b3

Browse files
feat(CSAF2.1): #199 copy and adapt informative test 6.3.1 from CSAF 2.0 to CSAF 2.1
1 parent a337402 commit 52f56b3

File tree

2 files changed

+75
-1
lines changed

2 files changed

+75
-1
lines changed

csaf_2_1/informativeTests.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
export {
2-
informativeTest_6_3_1,
32
informativeTest_6_3_2,
43
informativeTest_6_3_3,
54
informativeTest_6_3_4,
@@ -11,3 +10,4 @@ export {
1110
informativeTest_6_3_10,
1211
informativeTest_6_3_11,
1312
} from '../informativeTests.js'
13+
export { informativeTest_6_3_1 } from './informativeTests/informativeTest_6_3_1.js'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import Ajv from 'ajv/dist/jtd.js'
2+
3+
const ajv = new Ajv()
4+
5+
const inputSchema = /** @type {const} */ ({
6+
additionalProperties: true,
7+
properties: {
8+
vulnerabilities: {
9+
elements: {
10+
additionalProperties: true,
11+
properties: {},
12+
optionalProperties: {
13+
metrics: {
14+
elements: {
15+
additionalProperties: true,
16+
optionalProperties: {
17+
content: {
18+
additionalProperties: true,
19+
optionalProperties: {
20+
cvss_v2: {
21+
additionalProperties: true,
22+
properties: {},
23+
},
24+
cvss_v3: {
25+
additionalProperties: true,
26+
properties: {},
27+
},
28+
cvss_v4: {
29+
additionalProperties: true,
30+
properties: {},
31+
},
32+
},
33+
},
34+
},
35+
},
36+
},
37+
},
38+
},
39+
},
40+
},
41+
})
42+
43+
const validateInput = ajv.compile(inputSchema)
44+
45+
/**
46+
* @param {unknown} doc
47+
* @returns
48+
*/
49+
export function informativeTest_6_3_1(doc) {
50+
const ctx = {
51+
infos: /** @type {Array<{ message: string; instancePath: string }>} */ ([]),
52+
}
53+
54+
if (!validateInput(doc)) {
55+
return ctx
56+
}
57+
58+
doc.vulnerabilities.forEach((vulnerability, vulnerabilityIndex) => {
59+
vulnerability.metrics?.forEach((metric, metricIndex) => {
60+
if (
61+
metric.content?.cvss_v2 &&
62+
!metric.content?.cvss_v3 &&
63+
!metric.content?.cvss_v4
64+
) {
65+
ctx.infos.push({
66+
instancePath: `/vulnerabilities/${vulnerabilityIndex}/metrics/${metricIndex}`,
67+
message: 'use of cvss v2 as the only scoring system',
68+
})
69+
}
70+
})
71+
})
72+
73+
return ctx
74+
}

0 commit comments

Comments
 (0)