From b79d8ae03339e2957c50111f0eae405ca1440674 Mon Sep 17 00:00:00 2001 From: jessib Date: Thu, 5 Sep 2013 13:10:23 -0700 Subject: Move handle method to Email model and have it work for local and non-local emails. --- users/app/models/email.rb | 4 ++++ users/app/models/local_email.rb | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/users/app/models/email.rb b/users/app/models/email.rb index 1bcff1c..89c31bb 100644 --- a/users/app/models/email.rb +++ b/users/app/models/email.rb @@ -19,4 +19,8 @@ class Email < String self end + def handle + self.split('@').first + end + end diff --git a/users/app/models/local_email.rb b/users/app/models/local_email.rb index c1f7c11..6303bb6 100644 --- a/users/app/models/local_email.rb +++ b/users/app/models/local_email.rb @@ -20,10 +20,6 @@ class LocalEmail < Email [handle] end - def handle - gsub(/@#{domain}/i, '') - end - def domain LocalEmail.domain end -- cgit v1.2.3 From 59adb0892f443e1fe1bdd4201c4e0db1b036e0af Mon Sep 17 00:00:00 2001 From: jessib Date: Thu, 5 Sep 2013 13:12:23 -0700 Subject: Test of failing to add non-local email address as an identity's address. --- users/test/unit/identity_test.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/users/test/unit/identity_test.rb b/users/test/unit/identity_test.rb index fa88315..a77613a 100644 --- a/users/test/unit/identity_test.rb +++ b/users/test/unit/identity_test.rb @@ -70,6 +70,13 @@ class IdentityTest < ActiveSupport::TestCase id.destroy end + test "fail to end non-local email address as identity address" do + id = Identity.for @user, address: 'blah@sdlfksjdfljk.com' + assert !id.valid? + assert_match /needs to end in/, id.errors[:address].first + end + + def alias_name @alias_name ||= Faker::Internet.user_name end -- cgit v1.2.3 From 8e8f5ddda08a883842a8c3e2ffa994e12b25dd39 Mon Sep 17 00:00:00 2001 From: jessib Date: Thu, 5 Sep 2013 13:56:02 -0700 Subject: Ensure that address in identity really is a LocalEmail. --- users/app/models/identity.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/users/app/models/identity.rb b/users/app/models/identity.rb index 355f67a..e197c9c 100644 --- a/users/app/models/identity.rb +++ b/users/app/models/identity.rb @@ -10,6 +10,7 @@ class Identity < CouchRest::Model::Base validate :unique_forward validate :alias_available + validate :address_local_email design do view :by_user_id @@ -79,4 +80,9 @@ class Identity < CouchRest::Model::Base end end + def address_local_email + return if address.valid? #this ensures it is LocalEmail + self.errors.add(:address, address.errors.messages[:email].first) #assumes only one error + end + end -- cgit v1.2.3 From 3ef22b5a856e1f576fb0a6a589b6b7ab41e1dd18 Mon Sep 17 00:00:00 2001 From: jessib Date: Thu, 5 Sep 2013 14:00:50 -0700 Subject: For moment, have identity's address handle aliased from login so we can use LoginFormatValidation. However, this is not how we will want it eventually. One issue is that the errors messages are set on login, rather than the appropriate field. --- users/app/models/identity.rb | 6 ++++++ users/app/models/login_format_validation.rb | 8 +++++--- users/test/unit/identity_test.rb | 8 ++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/users/app/models/identity.rb b/users/app/models/identity.rb index e197c9c..91345a0 100644 --- a/users/app/models/identity.rb +++ b/users/app/models/identity.rb @@ -1,4 +1,5 @@ class Identity < CouchRest::Model::Base + include LoginFormatValidation use_database :identities @@ -64,6 +65,11 @@ class Identity < CouchRest::Model::Base write_attribute('keys', keys.merge(type => value)) end + # for LoginFormatValidation + def login + self.address.handle + end + protected def unique_forward diff --git a/users/app/models/login_format_validation.rb b/users/app/models/login_format_validation.rb index 1d02bd1..c1fcf70 100644 --- a/users/app/models/login_format_validation.rb +++ b/users/app/models/login_format_validation.rb @@ -1,19 +1,21 @@ module LoginFormatValidation extend ActiveSupport::Concern + #TODO: Probably will replace this. Playing with using it for aliases too, but won't want it connected to login field. + included do # Have multiple regular expression validations so we can get specific error messages: validates :login, :format => { :with => /\A.{2,}\z/, - :message => "Login must have at least two characters"} + :message => "Must have at least two characters"} validates :login, :format => { :with => /\A[a-z\d_\.-]+\z/, :message => "Only lowercase letters, digits, . - and _ allowed."} validates :login, :format => { :with => /\A[a-z].*\z/, - :message => "Login must begin with a lowercase letter"} + :message => "Must begin with a lowercase letter"} validates :login, :format => { :with => /\A.*[a-z\d]\z/, - :message => "Login must end with a letter or digit"} + :message => "Must end with a letter or digit"} end end diff --git a/users/test/unit/identity_test.rb b/users/test/unit/identity_test.rb index a77613a..b3918f1 100644 --- a/users/test/unit/identity_test.rb +++ b/users/test/unit/identity_test.rb @@ -76,6 +76,14 @@ class IdentityTest < ActiveSupport::TestCase assert_match /needs to end in/, id.errors[:address].first end + test "only lowercase alias" do + id = Identity.create_for @user, address: alias_name.capitalize + assert !id.valid? + #hacky way to do this, but okay for now: + assert id.errors.messages.flatten(2).include? "Must begin with a lowercase letter" + assert id.errors.messages.flatten(2).include? "Only lowercase letters, digits, . - and _ allowed." + end + def alias_name @alias_name ||= Faker::Internet.user_name -- cgit v1.2.3 From a9c68ba0bbba7a95e9b4a3ff24554d1b0af6cbc5 Mon Sep 17 00:00:00 2001 From: jessib Date: Mon, 23 Sep 2013 12:23:08 -0700 Subject: This ensures that email addresses contain only lowercase letters, and that an identity's destination is a valid Email. --- users/app/models/email.rb | 8 +++++++- users/app/models/identity.rb | 6 ++++++ users/test/unit/identity_test.rb | 17 ++++++++++++++--- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/users/app/models/email.rb b/users/app/models/email.rb index 89c31bb..f38f2f5 100644 --- a/users/app/models/email.rb +++ b/users/app/models/email.rb @@ -3,10 +3,16 @@ class Email < String validates :email, :format => { - :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/, + :with => /\A([^@\s]+)@((?:[-a-zA-Z0-9]+\.)+[a-zA-Z]{2,})\Z/, #checks format, but allows lowercase :message => "needs to be a valid email address" } + validates :email, + :format => { + :with => /\A[^A-Z]*\Z/, #forbids uppercase characters + :message => "letters must be lowercase" + } + def to_partial_path "emails/email" end diff --git a/users/app/models/identity.rb b/users/app/models/identity.rb index 91345a0..e0a24e9 100644 --- a/users/app/models/identity.rb +++ b/users/app/models/identity.rb @@ -12,6 +12,7 @@ class Identity < CouchRest::Model::Base validate :unique_forward validate :alias_available validate :address_local_email + validate :destination_email design do view :by_user_id @@ -91,4 +92,9 @@ class Identity < CouchRest::Model::Base self.errors.add(:address, address.errors.messages[:email].first) #assumes only one error end + def destination_email + return if destination.valid? #this ensures it is Email + self.errors.add(:destination, destination.errors.messages[:email].first) #assumes only one error #TODO + end + end diff --git a/users/test/unit/identity_test.rb b/users/test/unit/identity_test.rb index b3918f1..02f14c0 100644 --- a/users/test/unit/identity_test.rb +++ b/users/test/unit/identity_test.rb @@ -70,13 +70,13 @@ class IdentityTest < ActiveSupport::TestCase id.destroy end - test "fail to end non-local email address as identity address" do - id = Identity.for @user, address: 'blah@sdlfksjdfljk.com' + test "fail to add non-local email address as identity address" do + id = Identity.for @user, address: forward_address assert !id.valid? assert_match /needs to end in/, id.errors[:address].first end - test "only lowercase alias" do + test "alias must meet some conditions as login" do id = Identity.create_for @user, address: alias_name.capitalize assert !id.valid? #hacky way to do this, but okay for now: @@ -84,6 +84,17 @@ class IdentityTest < ActiveSupport::TestCase assert id.errors.messages.flatten(2).include? "Only lowercase letters, digits, . - and _ allowed." end + test "destination must be valid email address" do + id = Identity.create_for @user, address: @user.email_address, destination: 'ASKJDLFJD' + assert !id.valid? + assert id.errors.messages[:destination].include? "needs to be a valid email address" + end + + test "only lowercase destination" do + id = Identity.create_for @user, address: @user.email_address, destination: forward_address.capitalize + assert !id.valid? + assert id.errors.messages[:destination].include? "letters must be lowercase" + end def alias_name @alias_name ||= Faker::Internet.user_name -- cgit v1.2.3