diff --git a/lib/validators/email_validator.rb b/lib/validators/email_validator.rb index c9f588976..b68637957 100644 --- a/lib/validators/email_validator.rb +++ b/lib/validators/email_validator.rb @@ -17,7 +17,7 @@ class EmailValidator < ActiveModel::EachValidator def email_in_restriction_setting?(setting, value) domains = setting.gsub('.', '\.') - regexp = Regexp.new("@(.+\.)?(#{domains})", true) + regexp = Regexp.new("@(.+\\.)?(#{domains})", true) value =~ regexp end diff --git a/spec/components/validators/email_validator_spec.rb b/spec/components/validators/email_validator_spec.rb index f852cf1b7..887b6dbde 100644 --- a/spec/components/validators/email_validator_spec.rb +++ b/spec/components/validators/email_validator_spec.rb @@ -2,21 +2,33 @@ require 'spec_helper' describe EmailValidator do - let(:record) { Fabricate.build(:user, email: "bad@spamclub.com") } + let(:record) { } let(:validator) { described_class.new({attributes: :email}) } subject(:validate) { validator.validate_each(record,:email,record.email) } + def blocks?(email) + user = Fabricate.build(:user, email: email) + validator = EmailValidator.new(attributes: :email) + validator.validate_each(user, :email, user.email) + user.errors[:email].present? + end + context "blocked email" do it "doesn't add an error when email doesn't match a blocked email" do - ScreenedEmail.stubs(:should_block?).with(record.email).returns(false) - validate - expect(record.errors[:email]).not_to be_present + expect(blocks?('sam@sam.com')).to eq(false) end it "adds an error when email matches a blocked email" do - ScreenedEmail.stubs(:should_block?).with(record.email).returns(true) - validate - expect(record.errors[:email]).to be_present + ScreenedEmail.create!(email: 'sam@sam.com', action_type: ScreenedEmail.actions[:block]) + expect(blocks?('sam@sam.com')).to eq(true) + end + + it "blocks based on email_domains_blacklist" do + SiteSetting.email_domains_blacklist = "email.com|mail.com|e-mail.com" + expect(blocks?('sam@email.com')).to eq(true) + expect(blocks?('sam@bob.email.com')).to eq(true) + expect(blocks?('sam@e-mail.com')).to eq(true) + expect(blocks?('sam@googlemail.com')).to eq(false) end end