Use AST to verify whether regexes are safe

This commit is contained in:
Hans Ott 2021-10-26 11:36:19 +02:00
parent 29d5e43342
commit 30648cef1d
2 changed files with 17 additions and 6 deletions

View File

@ -160,6 +160,8 @@
] ]
}, },
"devDependencies": { "devDependencies": {
"@babel/parser": "7.15.8",
"@babel/traverse": "7.15.4",
"jshint": "~2.12.0", "jshint": "~2.12.0",
"mocha": "~8.2.0", "mocha": "~8.2.0",
"requirejs": "^2.3.2", "requirejs": "^2.3.2",

View File

@ -2,6 +2,8 @@ var fs = require('fs');
var safe = require('safe-regex'); var safe = require('safe-regex');
var assert = require('assert'); var assert = require('assert');
var requirejs = require('requirejs'); var requirejs = require('requirejs');
var parseJS = require('@babel/parser').parse;
var traverse = require('@babel/traverse').default;
var UAParser = require('./../src/ua-parser'); var UAParser = require('./../src/ua-parser');
var browsers = require('./browser-test.json'); var browsers = require('./browser-test.json');
var cpus = require('./cpu-test.json'); var cpus = require('./cpu-test.json');
@ -137,12 +139,19 @@ describe('Testing regexes', function () {
var regexes; var regexes;
// todo: use AST-based instead of grep before('Read main js file', function () {
before('Read main js file', function (done) { var code = fs.readFileSync('src/ua-parser.js', 'utf8').toString();
fs.readFile('src/ua-parser.js', 'utf8', function (err, data) { var ast = parseJS(code, { sourceType: "script" });
regexes = data.match(/(\/.+\/[ig]+)(?=[,\s\n])/g); regexes = [];
done(); traverse(ast, {
RegExpLiteral: (path) => {
regexes.push(path.node.pattern);
}
}); });
if (regexes.length === 0) {
throw new Error("Regexes cannot be empty!");
}
}); });
describe('Begin testing', function () { describe('Begin testing', function () {
@ -156,4 +165,4 @@ describe('Testing regexes', function () {
}); });
}); });
}); });
}) });