diff --git a/app/assets/javascripts/admin/components/admin-watched-word.js.es6 b/app/assets/javascripts/admin/components/admin-watched-word.js.es6 index 9a454ad57ee..eda556e38e2 100644 --- a/app/assets/javascripts/admin/components/admin-watched-word.js.es6 +++ b/app/assets/javascripts/admin/components/admin-watched-word.js.es6 @@ -13,7 +13,7 @@ export default Ember.Component.extend(bufferedRender({ this.get('word').destroy().then(() => { this.sendAction('action', this.get('word')); }).catch(e => { - bootbox.alert(I18n.t("generic_error_with_reason", {error: "http: " + e.status + " - " + e.body})); + bootbox.alert(I18n.t("generic_error_with_reason", {error: `http: ${e.status} - ${e.body}`})); });; } })); diff --git a/lib/post_revisor.rb b/lib/post_revisor.rb index dea5948df57..831faa47b43 100644 --- a/lib/post_revisor.rb +++ b/lib/post_revisor.rb @@ -273,12 +273,6 @@ class PostRevisor @post.word_count = @fields[:raw].scan(/[[:word:]]+/).size if @fields.has_key?(:raw) @post.self_edits += 1 if self_edit? - if !@post.acting_user.staff? && !@post.acting_user.staged && WordWatcher.new(@post.raw).should_block? - @post.errors[:base] << I18n.t('contains_blocked_words') - @post_successfully_saved = false - return - end - remove_flags_and_unhide_post @post.extract_quoted_post_numbers diff --git a/lib/validators/post_validator.rb b/lib/validators/post_validator.rb index 3ed62e37406..dec44496a8a 100644 --- a/lib/validators/post_validator.rb +++ b/lib/validators/post_validator.rb @@ -33,6 +33,7 @@ class Validators::PostValidator < ActiveModel::Validator return if options[:skip_post_body] || post.topic&.pm_with_non_human_user? stripped_length(post) raw_quality(post) + watched_words(post) end def stripped_length(post) @@ -55,6 +56,12 @@ class Validators::PostValidator < ActiveModel::Validator post.errors.add(:raw, I18n.t(:is_invalid)) unless sentinel.valid? end + def watched_words(post) + if !post.acting_user&.staff? && !post.acting_user&.staged && WordWatcher.new(post.raw).should_block? + post.errors[:base] << I18n.t('contains_blocked_words') + end + end + # Ensure maximum amount of mentions in a post def max_mention_validator(post) return if post.acting_user.try(:staff?) diff --git a/spec/components/pretty_text_spec.rb b/spec/components/pretty_text_spec.rb index 6e40972adeb..4a944900ab3 100644 --- a/spec/components/pretty_text_spec.rb +++ b/spec/components/pretty_text_spec.rb @@ -247,9 +247,12 @@ describe PrettyText do end it 'does censor code fences' do - ['apple', 'banana'].each { |w| Fabricate(:watched_word, word: w, action: WatchedWord.actions[:censor]) } - expect(PrettyText.cook("# banana")).not_to include('banana') - $redis.flushall + begin + ['apple', 'banana'].each { |w| Fabricate(:watched_word, word: w, action: WatchedWord.actions[:censor]) } + expect(PrettyText.cook("# banana")).not_to include('banana') + ensure + $redis.flushall + end end end @@ -788,12 +791,15 @@ HTML end it 'can censor words correctly' do - ['apple', 'banana'].each { |w| Fabricate(:watched_word, word: w, action: WatchedWord.actions[:censor]) } - expect(PrettyText.cook('yay banana yay')).not_to include('banana') - expect(PrettyText.cook('yay `banana` yay')).not_to include('banana') - expect(PrettyText.cook("# banana")).not_to include('banana') - expect(PrettyText.cook("# banana")).to include("\u25a0\u25a0") - $redis.flushall + begin + ['apple', 'banana'].each { |w| Fabricate(:watched_word, word: w, action: WatchedWord.actions[:censor]) } + expect(PrettyText.cook('yay banana yay')).not_to include('banana') + expect(PrettyText.cook('yay `banana` yay')).not_to include('banana') + expect(PrettyText.cook("# banana")).not_to include('banana') + expect(PrettyText.cook("# banana")).to include("\u25a0\u25a0") + ensure + $redis.flushall + end end it 'supports typographer' do diff --git a/spec/integration/watched_words_spec.rb b/spec/integration/watched_words_spec.rb index 95787054048..bfef752a6de 100644 --- a/spec/integration/watched_words_spec.rb +++ b/spec/integration/watched_words_spec.rb @@ -12,6 +12,10 @@ describe WatchedWord do let(:flag_word) { Fabricate(:watched_word, action: WatchedWord.actions[:flag]) } let(:block_word) { Fabricate(:watched_word, action: WatchedWord.actions[:block]) } + after do + $redis.flushall + end + context "block" do def should_block_post(manager) expect {