summaryrefslogtreecommitdiff
path: root/users
diff options
context:
space:
mode:
authorAzul <azul@leap.se>2013-11-05 12:12:13 +0100
committerAzul <azul@leap.se>2013-11-05 12:15:08 +0100
commit99ecdbf71632970d4c83f99beea325e5d213e4c6 (patch)
tree6e57e8d24fe1c5a07e90c9e9203ff13580848077 /users
parentb4ca13257341792f5e6496264c421af1888bcdb8 (diff)
disabled identities to block handles after a user was deleted
Diffstat (limited to 'users')
-rw-r--r--users/app/models/identity.rb17
-rw-r--r--users/test/unit/account_test.rb3
-rw-r--r--users/test/unit/identity_test.rb20
3 files changed, 33 insertions, 7 deletions
diff --git a/users/app/models/identity.rb b/users/app/models/identity.rb
index c24af73..40ce4ae 100644
--- a/users/app/models/identity.rb
+++ b/users/app/models/identity.rb
@@ -53,6 +53,7 @@ class Identity < CouchRest::Model::Base
def self.disable_all_for(user)
Identity.by_user_id.key(user.id).each do |identity|
identity.disable
+ identity.save
end
end
@@ -63,11 +64,14 @@ class Identity < CouchRest::Model::Base
}
end
- #
- # about to change towards actually disabling the identity instead of
- # destroying it.
- #
- alias_method :disable, :destroy
+ def enabled?
+ self.destination && self.user_id
+ end
+
+ def disable
+ self.destination = nil
+ self.user_id = nil
+ end
def keys
read_attribute('keys') || HashWithIndifferentAccess.new
@@ -105,7 +109,8 @@ class Identity < CouchRest::Model::Base
end
def destination_email
- return if destination.valid? #this ensures it is Email
+ return if destination.nil? # this identity is disabled
+ return if destination.valid? # this ensures it is Email
self.errors.add(:destination, destination.errors.messages[:email].first) #assumes only one error #TODO
end
diff --git a/users/test/unit/account_test.rb b/users/test/unit/account_test.rb
index 94a9980..a8c6efd 100644
--- a/users/test/unit/account_test.rb
+++ b/users/test/unit/account_test.rb
@@ -13,7 +13,8 @@ class AccountTest < ActiveSupport::TestCase
end
test "create and remove a user account" do
- assert_no_difference "Identity.count" do
+ # We keep an identity that will block the handle from being reused.
+ assert_difference "Identity.count" do
assert_no_difference "User.count" do
user = Account.create(FactoryGirl.attributes_for(:user))
user.account.destroy
diff --git a/users/test/unit/identity_test.rb b/users/test/unit/identity_test.rb
index 0842a77..8270689 100644
--- a/users/test/unit/identity_test.rb
+++ b/users/test/unit/identity_test.rb
@@ -90,6 +90,26 @@ class IdentityTest < ActiveSupport::TestCase
assert id.errors.messages[:destination].include? "needs to be a valid email address"
end
+ test "disabled identity" do
+ id = Identity.for(@user)
+ id.disable
+ assert_equal @user.email_address, id.address
+ assert_equal nil, id.destination
+ assert_equal nil, id.user
+ assert !id.enabled?
+ assert id.valid?
+ end
+
+ test "disabled identity blocks handle" do
+ id = Identity.for(@user)
+ id.disable
+ id.save
+ other_user = find_record :user
+ taken = Identity.build_for other_user, address: id.address
+ assert !taken.valid?
+ id.destroy
+ end
+
def alias_name
@alias_name ||= Faker::Internet.user_name
end