Skip to content

Commit ca90299

Browse files
committed
fix uniqueness validation of login ids
fixes CNVS-7266 test plan: * create an SIS user with a login id, then delete them * create a non-SIS user with the same login id * use an SIS import to resurrect the original user * the SIS import should succeed, but warn that it skipped the user cause someone else had his login information Change-Id: I2102107fefb1d20fae6046ebe3a7e0c03416dcc9 Reviewed-on: https://gerrit.instructure.com/22867 Tested-by: Jenkins <jenkins@instructure.com> Reviewed-by: Cody Cutrer <cody@instructure.com> QA-Review: Jeremy Putnam <jeremyp@instructure.com> Product-Review: Cody Cutrer <cody@instructure.com>
1 parent 7822296 commit ca90299

3 files changed

Lines changed: 21 additions & 6 deletions

File tree

app/models/pseudonym.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class Pseudonym < ActiveRecord::Base
5656
config.validations_scope = [:account_id, :workflow_state]
5757
config.perishable_token_valid_for = 30.minutes
5858
config.validates_length_of_login_field_options = {:within => 1..MAX_UNIQUE_ID_LENGTH}
59-
config.validates_uniqueness_of_login_field_options = { :case_sensitive => false, :scope => [:account_id, :workflow_state], :if => lambda { |p| p.unique_id_changed? && p.active? } }
59+
config.validates_uniqueness_of_login_field_options = { :case_sensitive => false, :scope => [:account_id, :workflow_state], :if => lambda { |p| (p.unique_id_changed? || p.workflow_state_changed?) && p.active? } }
6060
end
6161

6262
attr_writer :require_password

lib/sis/user_importer.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,15 @@ def process_batch
9191
pseudo ||= pseudo_by_login
9292
pseudo ||= @root_account.pseudonyms.active.by_unique_id(email).first if email.present?
9393

94+
status_is_active = !(status =~ /\Adeleted/i)
95+
9496
if pseudo
95-
if pseudo.sis_user_id.present? && pseudo.sis_user_id != user_id
97+
if pseudo.sis_user_id && pseudo.sis_user_id != user_id
9698
@messages << "user #{pseudo.sis_user_id} has already claimed #{user_id}'s requested login information, skipping"
9799
next
98100
end
99-
if !pseudo_by_login.nil? && pseudo.unique_id != login_id
100-
@messages << "user #{pseudo_by_login.sis_user_id} has already claimed #{user_id}'s requested login information, skipping"
101+
if pseudo_by_login && (pseudo.unique_id != login_id || pseudo != pseudo_by_login && status_is_active)
102+
@messages << "user #{pseudo_by_login.sis_user_id || pseudo_by_login.user_id} has already claimed #{user_id}'s requested login information, skipping"
101103
next
102104
end
103105

@@ -120,8 +122,6 @@ def process_batch
120122
should_add_account_associations = false
121123
should_update_account_associations = false
122124

123-
status_is_active = !(status =~ /\Adeleted/i)
124-
125125
if !status_is_active && !user.new_record?
126126
# if this user is deleted, we're just going to make sure the user isn't enrolled in anything in this root account and
127127
# delete the pseudonym.

spec/lib/sis/csv/user_importer_spec.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -955,4 +955,19 @@ def gen_ssha_password(password)
955955
user_1.pseudonym.should_not == @pseudonym
956956
end
957957

958+
it "should error nicely when resurrecting an SIS user that conflicts with an active user" do
959+
process_csv_data_cleanly(
960+
"user_id,login_id,first_name,last_name,email,status",
961+
"user_1,user1,User,Uno,user1@example.com,deleted"
962+
)
963+
@non_sis_user = user_with_pseudonym(:active_all => 1)
964+
@pseudonym = @non_sis_user.pseudonyms.create!(:unique_id => 'user1', :account => @account)
965+
importer = process_csv_data(
966+
"user_id,login_id,first_name,last_name,email,status",
967+
"user_1,user1,User,Uno,user1@example.com,active"
968+
)
969+
importer.errors.should == []
970+
importer.warnings.length.should == 1
971+
importer.warnings.last.last.should == "user #{@non_sis_user.id} has already claimed user_1's requested login information, skipping"
972+
end
958973
end

0 commit comments

Comments
 (0)