Skip to content

Commit 29ef2e0

Browse files
authored
fix: Types.isCPE() CPE2.3 with escaped chars &">< are allowed (#134)
Signed-off-by: Jan Kowalleck <[email protected]>
1 parent d2e688e commit 29ef2e0

File tree

3 files changed

+56
-2
lines changed

3 files changed

+56
-2
lines changed

HISTORY.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.
44

55
## unreleased
66

7+
## 1.0.3 - 2022-07-28
8+
9+
* Fixed
10+
* `Types.isCPE()` for CPE2.3 allows escaped(`\`) chars `&"><`, as expected. (via [#132])
11+
12+
[#132]: https://github.com/CycloneDX/cyclonedx-javascript-library/pull/132
13+
714
## 1.0.2 - 2022-07-26
815

916
Maintenance release.

src/types/cpe.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ Copyright (c) OWASP Foundation. All Rights Reserved.
2424
*/
2525
export type CPE = string
2626

27-
/* eslint-disable-next-line no-useless-escape -- value directly from XML or JSON spec, surrounded with ^$ */
28-
const cpePattern = /^([c][pP][eE]:\/[AHOaho]?(:[A-Za-z0-9\._\-~%]*){0,6})$|^(cpe:2\.3:[aho\*\-](:(((\?*|\*?)([a-zA-Z0-9\-\._]|(\\[\\\*\?!&quot;#$$%&amp;'\(\)\+,\/:;&lt;=&gt;@\[\]\^`\{\|}~]))+(\?*|\*?))|[\*\-])){5}(:(([a-zA-Z]{2,3}(-([a-zA-Z]{2}|[0-9]{3}))?)|[\*\-]))(:(((\?*|\*?)([a-zA-Z0-9\-\._]|(\\[\\\*\?!&quot;#$$%&amp;'\(\)\+,\/:;&lt;=&gt;@\[\]\^`\{\|}~]))+(\?*|\*?))|[\*\-])){4})$/
27+
/* eslint-disable-next-line no-useless-escape -- value directly from XML, revert special-chars(like `&amp;` -> `&`), and surrounded with `^` and `$` */
28+
const cpePattern = /^([c][pP][eE]:\/[AHOaho]?(:[A-Za-z0-9\._\-~%]*){0,6})$|^(cpe:2\.3:[aho\*\-](:(((\?*|\*?)([a-zA-Z0-9\-\._]|(\\[\\\*\?!"#$$%&'\(\)\+,\/:;<=>@\[\]\^`\{\|}~]))+(\?*|\*?))|[\*\-])){5}(:(([a-zA-Z]{2,3}(-([a-zA-Z]{2}|[0-9]{3}))?)|[\*\-]))(:(((\?*|\*?)([a-zA-Z0-9\-\._]|(\\[\\\*\?!"#$$%&'\(\)\+,\/:;<=>@\[\]\^`\{\|}~]))+(\?*|\*?))|[\*\-])){4})$/
2929

3030
export function isCPE (value: any): value is CPE {
3131
return typeof value === 'string' &&

tests/unit/Types/cpe.spec.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
'use strict'
2+
/*!
3+
This file is part of CycloneDX JavaScript Library.
4+
5+
Licensed under the Apache License, Version 2.0 (the "License");
6+
you may not use this file except in compliance with the License.
7+
You may obtain a copy of the License at
8+
9+
http://www.apache.org/licenses/LICENSE-2.0
10+
11+
Unless required by applicable law or agreed to in writing, software
12+
distributed under the License is distributed on an "AS IS" BASIS,
13+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
See the License for the specific language governing permissions and
15+
limitations under the License.
16+
17+
SPDX-License-Identifier: Apache-2.0
18+
Copyright (c) OWASP Foundation. All Rights Reserved.
19+
*/
20+
21+
const assert = require('assert')
22+
const { suite, test } = require('mocha')
23+
24+
const {
25+
Types: { isCPE }
26+
} = require('../../../')
27+
28+
suite('Types.cpe', () => {
29+
suite('isCPE()', () => {
30+
test('2.2', () => {
31+
const actual = isCPE('cpe:/a:microsoft:internet_explorer:11:-')
32+
assert.strictEqual(actual, true)
33+
})
34+
test('2.3', () => {
35+
const actual = isCPE('cpe:2.3:a:adobe:flash_player:19.0.0.245:*:*:*:*:internet_explorer:*:*')
36+
assert.strictEqual(actual, true)
37+
})
38+
test('reverted XML special-chars', () => {
39+
// pattern is taken from XML.
40+
// XML encodes some chars - like '"` -> `&quot;` or `&` -> `&amp;`.
41+
// this encoding must have been reverted for the RegularExpression.
42+
// use case: test if the CPE-escaped(`\`) chars are working as expected
43+
const actual = isCPE('cpe:2.3:a:acme:foobarbaz:1.3.3.7:*:*:*:\\":\\&:\\>:\\<')
44+
assert.strictEqual(actual, true)
45+
})
46+
})
47+
})

0 commit comments

Comments
 (0)