diff --git a/public/app/core/specs/kbn.test.ts b/public/app/core/specs/kbn.test.ts new file mode 100644 index 00000000000..25f82a5f850 --- /dev/null +++ b/public/app/core/specs/kbn.test.ts @@ -0,0 +1,15 @@ +import kbn from '../utils/kbn'; + +describe('stringToJsRegex', () => { + it('should parse the valid regex value', () => { + const output = kbn.stringToJsRegex("/validRegexp/"); + expect(output).toBeInstanceOf(RegExp); + }); + + it('should throw error on invalid regex value', () => { + const input = "/etc/hostname"; + expect(() => { + kbn.stringToJsRegex(input); + }).toThrow(); + }); +}); diff --git a/public/app/core/time_series2.ts b/public/app/core/time_series2.ts index 23a0a0c19ea..c24e1f64c43 100644 --- a/public/app/core/time_series2.ts +++ b/public/app/core/time_series2.ts @@ -1,4 +1,5 @@ import kbn from 'app/core/utils/kbn'; +import { appEvents } from 'app/core/core'; import { getFlotTickDecimals } from 'app/core/utils/ticks'; import _ from 'lodash'; import { getValueFormat } from '@grafana/ui'; @@ -9,8 +10,12 @@ function matchSeriesOverride(aliasOrRegex, seriesAlias) { } if (aliasOrRegex[0] === '/') { - const regex = kbn.stringToJsRegex(aliasOrRegex); - return seriesAlias.match(regex) != null; + try { + const regex = kbn.stringToJsRegex(aliasOrRegex); + return seriesAlias.match(regex) != null; + } catch (e) { + return appEvents.emit('alert-error', ['Invalid aliasOrRegex value.', e.message]); + } } return aliasOrRegex === seriesAlias; diff --git a/public/app/core/utils/kbn.ts b/public/app/core/utils/kbn.ts index 887c30229d3..43886fafd07 100644 --- a/public/app/core/utils/kbn.ts +++ b/public/app/core/utils/kbn.ts @@ -234,6 +234,11 @@ kbn.stringToJsRegex = str => { } const match = str.match(new RegExp('^/(.*?)/(g?i?m?y?)$')); + + if (!match) { + throw new Error(`'${str}' is not a valid regular expression.`); + } + return new RegExp(match[1], match[2]); };