From dc9723904045a5cf1a3d5f55e34fb582abe73214 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Wed, 24 Jan 2018 12:33:38 -0500 Subject: [PATCH] FIX: censored regex words were replacing other text that shouldn't be censored --- .../javascripts/pretty-text/censored-words.js.es6 | 5 +++-- test/javascripts/lib/pretty-text-test.js.es6 | 13 ++++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/pretty-text/censored-words.js.es6 b/app/assets/javascripts/pretty-text/censored-words.js.es6 index fc5254f58de..9eac5ad68d9 100644 --- a/app/assets/javascripts/pretty-text/censored-words.js.es6 +++ b/app/assets/javascripts/pretty-text/censored-words.js.es6 @@ -36,13 +36,14 @@ export function censorFn(censoredWords, censoredPattern, replacementLetter, watc try { let m = censorRegexp.exec(text); + const fourCharReplacement = new Array(5).join(replacementLetter); while (m && m[0]) { if (m[0].length > original.length) { return original; } // regex is dangerous - const replacement = new Array(m[0].length+1).join(replacementLetter); if (watchedWordsRegularExpressions) { - text = text.replace(new RegExp(`(${escapeRegexp(m[0])})(?![^\\(]*\\))`, "ig"), replacement); + text = text.replace(censorRegexp, fourCharReplacement); } else { + const replacement = new Array(m[0].length+1).join(replacementLetter); text = text.replace(new RegExp(`(\\b${escapeRegexp(m[0])}\\b)(?![^\\(]*\\))`, "ig"), replacement); } m = censorRegexp.exec(text); diff --git a/test/javascripts/lib/pretty-text-test.js.es6 b/test/javascripts/lib/pretty-text-test.js.es6 index 0fd5bf86167..df81da1cfcb 100644 --- a/test/javascripts/lib/pretty-text-test.js.es6 +++ b/test/javascripts/lib/pretty-text-test.js.es6 @@ -617,7 +617,18 @@ QUnit.test("censoring", assert => { }, censoredWords: 'xyz*|plee+ase' }, - "

Pleased to meet you, but ■■■■■■■■■ call me later, ■■■123

", + "

Pleased to meet you, but ■■■■ call me later, ■■■■123

", + "supports words as regular expressions"); + + assert.cookedOptions( + "Meet downtown in your town at the townhouse on Main St.", + { siteSettings: { + watched_words_regular_expressions: true, + censored_pattern: null + }, + censoredWords: '\\btown\\b' + }, + "

Meet downtown in your ■■■■ at the townhouse on Main St.

", "supports words as regular expressions"); });