Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Validate that e-mail resolves with MX and it's not blacklisted (#7631)
Original patch by @j-a4
- Loading branch information
Showing
with
26 additions
and 0 deletions.
- +1 −0 app/models/user.rb
- +25 −0 app/validators/email_mx_validator.rb
@@ -0,0 +1,25 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'resolv' | ||
|
||
class EmailMxValidator < ActiveModel::Validator | ||
def validate(user) | ||
return if Rails.env.test? | ||
user.errors.add(:email, I18n.t('users.invalid_email')) if invalid_mx?(user.email) | ||
end | ||
|
||
private | ||
|
||
def invalid_mx?(value) | ||
_, domain = value.split('@', 2) | ||
|
||
return true if domain.nil? | ||
|
||
records = Resolv::DNS.new.getresources(domain, Resolv::DNS::Resource::IN::MX).to_a.map { |e| e.exchange.to_s } | ||
records.empty? || on_blacklist?(records) | ||
end | ||
|
||
def on_blacklist?(values) | ||
EmailDomainBlock.where(domain: values).any? | ||
end | ||
end |