From 3a47bb38ace930bf55e675bfa01b35121bc2fb32 Mon Sep 17 00:00:00 2001 From: Paul Melnikow Date: Sat, 17 Mar 2018 16:52:41 -0400 Subject: [PATCH] Searches with regex control characters should not crash (#1579) Fix #1578 --- frontend/lib/prepare-examples.js | 5 ++++- frontend/lib/prepare-examples.spec.js | 20 ++++++++++++++++++++ package.json | 1 + 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 frontend/lib/prepare-examples.spec.js diff --git a/frontend/lib/prepare-examples.js b/frontend/lib/prepare-examples.js index 51c3e56313..787d395a1e 100644 --- a/frontend/lib/prepare-examples.js +++ b/frontend/lib/prepare-examples.js @@ -1,3 +1,5 @@ +import escapeStringRegexp from 'escape-string-regexp'; + export function exampleMatchesRegex(example, regex) { const { title, keywords } = example; const haystack = [title].concat(keywords).join(' '); @@ -6,7 +8,8 @@ export function exampleMatchesRegex(example, regex) { export function predicateFromQuery(query) { if (query) { - const regex = new RegExp(query, 'i'); // Case-insensitive. + const escaped = escapeStringRegexp(query); + const regex = new RegExp(escaped, 'i'); // Case-insensitive. return example => exampleMatchesRegex(example, regex); } else { return () => true; diff --git a/frontend/lib/prepare-examples.spec.js b/frontend/lib/prepare-examples.spec.js new file mode 100644 index 0000000000..eedf187f0f --- /dev/null +++ b/frontend/lib/prepare-examples.spec.js @@ -0,0 +1,20 @@ +import { test, given, forCases } from 'sazerac'; +import { predicateFromQuery } from './prepare-examples'; + +describe('Badge example functions', function() { + const exampleMatchesQuery = + (example, query) => predicateFromQuery(query)(example); + + test(exampleMatchesQuery, () => { + forCases([ + given({ title: 'node version' }, 'npm'), + ]).expect(false); + + forCases([ + given({ title: 'node version', keywords: ['npm'] }, 'node'), + given({ title: 'node version', keywords: ['npm'] }, 'npm'), + // https://github.com/badges/shields/issues/1578 + given({ title: 'c++ is the best language' }, 'c++'), + ]).expect(true); + }); +}); diff --git a/package.json b/package.json index 0bb169ed88..108a04a245 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "camp": "~17.2.1", "chrome-web-store-item-property": "~1.1.2", "dot": "~1.1.2", + "escape-string-regexp": "^1.0.5", "gm": "^1.23.0", "json-autosave": "~1.1.2", "jsonpath": "~1.0.0",