diff options
author | Azul <azul@riseup.net> | 2016-07-04 20:19:21 +0200 |
---|---|---|
committer | Azul <azul@riseup.net> | 2016-07-05 08:56:05 +0200 |
commit | 638acc59a241e141cf0fc9ccbf4e3c5578b98f0c (patch) | |
tree | 82c09920af4053b42eaac22365af239078491000 /lib/local_email.rb | |
parent | 949e17c7c30c5b179ba6545782ae995178481f78 (diff) |
Fix db:migrate and similar tasks
We saw errors from duplicate loading of LocalEmail and
LoginFormatValidation. The latter resulted in a crash.
In an attempt to ensure all subclasses of Couchrest::Model::Base are
loaded Couchrest::Model::Utils::Migrate requires all files in app/models.
We have an extension that does the same for the engines.
During this process LoginFormatValidation and LocalEmail were autoloaded
when 'identity' was required. Afterwards they were required again.
It looks like rails' autoload mechanism does not play nicely with require.
So to make sure they are not autoloaded first move the concerns and
helper classes into the lib directory and require them explicitly.
Diffstat (limited to 'lib/local_email.rb')
-rw-r--r-- | lib/local_email.rb | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/lib/local_email.rb b/lib/local_email.rb new file mode 100644 index 0000000..7c592e1 --- /dev/null +++ b/lib/local_email.rb @@ -0,0 +1,67 @@ +require 'email' +class LocalEmail < Email + + BLACKLIST_FROM_RFC2142 = [ + 'postmaster', 'hostmaster', 'domainadmin', 'webmaster', 'www', + 'abuse', 'noc', 'security', 'usenet', 'news', 'uucp', + 'ftp', 'sales', 'marketing', 'support', 'info' + ] + + def self.domain + APP_CONFIG[:domain] + end + + validates :email, + :format => { + :with => /@#{domain}\Z/i, + :message => "needs to end in @#{domain}" + } + + validate :handle_allowed + + def initialize(s) + super + append_domain_if_needed + end + + def to_key + [handle] + end + + def domain + LocalEmail.domain + end + + protected + + def append_domain_if_needed + unless self.index('@') + self << '@' + domain + end + end + + def handle_allowed + errors.add(:handle, "is reserved.") if handle_reserved? + end + + def handle_reserved? + # *ARRAY in a case statement tests if ARRAY includes the handle. + case handle + when *APP_CONFIG[:handle_blacklist] + true + when *APP_CONFIG[:handle_whitelist] + false + when *BLACKLIST_FROM_RFC2142 + true + else + handle_in_passwd? + end + end + + def handle_in_passwd? + Etc.getpwnam(handle).present? + rescue ArgumentError + # handle was not found + return false + end +end |