diff --git a/app/models/epp/domain.rb b/app/models/epp/domain.rb index a2a5dd1dc6..33062cc3df 100644 --- a/app/models/epp/domain.rb +++ b/app/models/epp/domain.rb @@ -492,28 +492,20 @@ def update(frame, current_user, verify = true) at[:statuses] = statuses - domain_statuses_attrs(frame.css('rem'), 'rem') + domain_statuses_attrs(frame.css('add'), 'add') - # at[:statuses] += at_add[:domain_statuses_attributes] - if errors.empty? && verify self.upid = current_user.registrar.id if current_user.registrar self.up_date = Time.zone.now end - if registrant_id && registrant.code == frame.css('registrant') - - throw :epp_error, { - code: '2305', - msg: I18n.t(:contact_already_associated_with_the_domain) - } + same_registrant_as_current = (registrant.code == frame.css('registrant').text) - end - - if errors.empty? && verify && + if !same_registrant_as_current && errors.empty? && verify && Setting.request_confrimation_on_registrant_change_enabled && frame.css('registrant').present? && frame.css('registrant').attr('verified').to_s.downcase != 'yes' registrant_verification_asked!(frame.to_s, current_user.id) end + self.deliver_emails = true # turn on email delivery for epp errors.empty? && super(at) diff --git a/config/locales/en.yml b/config/locales/en.yml index 0927446d09..99b297c5e2 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -922,7 +922,6 @@ en: previous: 'Previous' personal_domain_verification_url: 'Personal domain verification url' available_verification_url_not_found: 'Available verification url not found, for domain.' - contact_already_associated_with_the_domain: 'Object association prohibits operation, contact already associated with the domain' add_reserved_domain: 'Add domain to reserved list' add_blocked_domain: 'Add domain to blocked list' edit_pw: 'Edit Pw' diff --git a/spec/requests/epp/domain/update/registrant_change/same_as_current_spec.rb b/spec/requests/epp/domain/update/registrant_change/same_as_current_spec.rb new file mode 100644 index 0000000000..d929423aa2 --- /dev/null +++ b/spec/requests/epp/domain/update/registrant_change/same_as_current_spec.rb @@ -0,0 +1,212 @@ +require 'rails_helper' + +RSpec.describe 'EPP domain:update' do + let(:request) { post '/epp/command/update', frame: request_xml } + let!(:domain) { create(:domain, name: 'test.com', registrant: registrant) } + + before :example do + sign_in_to_epp_area + end + + context 'when registrant change confirmation is enabled' do + before :example do + Setting.request_confrimation_on_registrant_change_enabled = true + end + + context 'when given registrant is the same as current one' do + let!(:registrant) { create(:registrant, code: 'TEST') } + let(:request_xml) { <<-XML + + + + + + test.com + + TEST + + + + + + #{valid_legal_document} + + + + + XML + } + + specify do + request + expect(response).to have_code_of(1000) + end + + it 'keeps same registrant' do + expect { request; domain.reload }.to_not change { domain.registrant_code } + end + + it 'does not ask for confirmation' do + request + domain.reload + expect(domain.registrant_verification_asked?).to be false + end + + it 'does not send confirmation and notice emails' do + expect { request }.to_not change { ActionMailer::Base.deliveries.count } + end + end + + context 'when given registrant is different than current one' do + let!(:registrant) { create(:registrant, code: 'OLD-CODE') } + let!(:new_registrant) { create(:registrant, code: 'NEW-CODE') } + let(:request_xml) { <<-XML + + + + + + test.com + + NEW-CODE + + + + + + #{valid_legal_document} + + + + + XML + } + + specify do + request + expect(response).to have_code_of(1001) + end + + it 'does not change registrant without confirmation' do + expect { request; domain.reload }.to_not change { domain.registrant_code } + end + + it 'asks for confirmation' do + request + domain.reload + expect(domain.registrant_verification_asked?).to be true + end + + it 'sets PENDING_UPDATE status' do + request + domain.reload + expect(domain.statuses).to include(DomainStatus::PENDING_UPDATE) + end + + it 'sends confirmation and notice emails' do + expect { request }.to change { ActionMailer::Base.deliveries.count }.by(2) + end + end + end + + context 'when registrant change confirmation is disabled' do + before :example do + Setting.request_confrimation_on_registrant_change_enabled = false + end + + context 'when given registrant is the same as current one' do + let!(:registrant) { create(:registrant, code: 'TEST') } + let(:request_xml) { <<-XML + + + + + + test.com + + TEST + + + + + + #{valid_legal_document} + + + + + XML + } + + specify do + request + expect(response).to have_code_of(1000) + end + + it 'keeps same registrant' do + expect { request; domain.reload }.to_not change { domain.registrant_code } + end + + it 'does not ask for confirmation' do + request + domain.reload + expect(domain.registrant_verification_asked?).to be false + end + + it 'does not send confirmation and notice emails' do + expect { request }.to_not change { ActionMailer::Base.deliveries.count } + end + end + + context 'when given registrant is different than current one' do + let!(:registrant) { create(:registrant, code: 'OLD-CODE') } + let!(:new_registrant) { create(:registrant, code: 'NEW-CODE') } + let(:request_xml) { <<-XML + + + + + + test.com + + NEW-CODE + + + + + + #{valid_legal_document} + + + + + XML + } + + specify do + request + expect(response).to have_code_of(1000) + end + + it 'changes registrant without confirmation' do + expect { request; domain.reload }.to change { domain.registrant_code }.from('OLD-CODE').to('NEW-CODE') + end + + it 'does not ask for confirmation' do + request + domain.reload + expect(domain.registrant_verification_asked?).to be false + end + + it 'does not set PENDING_UPDATE status' do + request + domain.reload + expect(domain.statuses).to_not include(DomainStatus::PENDING_UPDATE) + end + + it 'does not send confirmation and notice emails' do + expect { request }.to_not change { ActionMailer::Base.deliveries.count } + end + end + end +end