demarches-normaliennes/app/validators/strict_email_validator.rb

37 lines
1.1 KiB
Ruby

class StrictEmailValidator < ActiveModel::EachValidator
# default devise email is : /\A[^@\s]+@[^@\s]+\z/
# saying that it's quite permissive
# but we want more, we want to ensure it's a domain with extension
# so we append \.[A-Za-z]{2,}
REGEXP = /\A[^@\s]+@[^@\s\.]+\.[^@\s]{2,}\z/
def validate_each(record, attribute, value)
if value.present? && !regexp_for(record).match?(value)
record.errors.add(attribute, :invalid_email_format)
end
end
def regexp_for(record)
if StrictEmailValidator.elligible_to_new_validation?(record)
REGEXP
else
Devise.email_regexp
end
end
def self.elligible_to_new_validation?(record)
return false if !strict_validation_enabled?
return false if (record.created_at || Time.zone.now) < date_since_strict_email_validation
true
end
def self.strict_validation_enabled?
ENV.key?('STRICT_EMAIL_VALIDATION_STARTS_AT')
end
def self.date_since_strict_email_validation
DateTime.parse(ENV['STRICT_EMAIL_VALIDATION_STARTS_AT'])
rescue
DateTime.new(1789, 5, 5, 0, 0) # french revolution, ds was not yet launched
end
end