From 34f782030033a664c700cc4c37f6c3626b25aae2 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 6 Feb 2018 23:36:50 +0200 Subject: [PATCH 001/104] Do not allow NULL in `epp_sessions.session_id` #700 --- ...80206213435_change_epp_sessions_session_id_to_not_null.rb | 5 +++++ db/structure.sql | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20180206213435_change_epp_sessions_session_id_to_not_null.rb diff --git a/db/migrate/20180206213435_change_epp_sessions_session_id_to_not_null.rb b/db/migrate/20180206213435_change_epp_sessions_session_id_to_not_null.rb new file mode 100644 index 000000000..887ef3cb4 --- /dev/null +++ b/db/migrate/20180206213435_change_epp_sessions_session_id_to_not_null.rb @@ -0,0 +1,5 @@ +class ChangeEppSessionsSessionIdToNotNull < ActiveRecord::Migration + def change + change_column_null :epp_sessions, :session_id, false + end +end diff --git a/db/structure.sql b/db/structure.sql index 2cad3e06f..bf3230c57 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -1050,7 +1050,7 @@ ALTER SEQUENCE domains_id_seq OWNED BY domains.id; CREATE TABLE epp_sessions ( id integer NOT NULL, - session_id character varying, + session_id character varying NOT NULL, data text, created_at timestamp without time zone, updated_at timestamp without time zone, @@ -5070,3 +5070,5 @@ INSERT INTO schema_migrations (version) VALUES ('20180126104536'); INSERT INTO schema_migrations (version) VALUES ('20180126104903'); +INSERT INTO schema_migrations (version) VALUES ('20180206213435'); + From cdb01876f767014592f71dbd77ed12d19f0359d4 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 6 Feb 2018 23:45:11 +0200 Subject: [PATCH 002/104] Convert spec to test #700 --- spec/models/epp_session.rb | 21 --------------------- test/models/epp_session_test.rb | 13 +++++++++++++ 2 files changed, 13 insertions(+), 21 deletions(-) delete mode 100644 spec/models/epp_session.rb create mode 100644 test/models/epp_session_test.rb diff --git a/spec/models/epp_session.rb b/spec/models/epp_session.rb deleted file mode 100644 index 484cd1345..000000000 --- a/spec/models/epp_session.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'rails_helper' - -describe EppSession do - let(:epp_session) { create(:epp_session) } - - it 'has marshalled data' do - expect(epp_session.read_attribute(:data)).to_not be_blank - expect(epp_session.read_attribute(:data).class).to eq(String) - expect(epp_session.data.class).to eq(Hash) - end - - it 'stores data' do - expect(epp_session[:api_user_id]).to eq(1) - - epp_session[:api_user_id] = 3 - expect(epp_session[:api_user_id]).to eq(3) - - epp_session = EppSession.find_by(session_id: 'test') - expect(epp_session[:api_user_id]).to eq(3) - end -end diff --git a/test/models/epp_session_test.rb b/test/models/epp_session_test.rb new file mode 100644 index 000000000..72d8f84ac --- /dev/null +++ b/test/models/epp_session_test.rb @@ -0,0 +1,13 @@ +require 'test_helper' + +class EppSessionTest < ActiveSupport::TestCase + def test_api_user_id_serialization + epp_session = EppSession.new + epp_session.registrar = registrars(:bestnames) + epp_session[:api_user_id] = ActiveRecord::Fixtures.identify(:api_bestnames) + epp_session.save! + epp_session.reload + + assert_equal ActiveRecord::Fixtures.identify(:api_bestnames), epp_session[:api_user_id] + end +end From a757a92816fe0cfaf8a0221c7da7906f2d0a6dfc Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 6 Feb 2018 23:45:39 +0200 Subject: [PATCH 003/104] Do not use factory #700 --- lib/tasks/dev.rake | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/tasks/dev.rake b/lib/tasks/dev.rake index c624b3c95..e25053133 100644 --- a/lib/tasks/dev.rake +++ b/lib/tasks/dev.rake @@ -49,9 +49,10 @@ namespace :dev do account = create(:account, registrar: registrar, balance: 1_000_000) api_user = create(:api_user, username: 'test', password: 'testtest', registrar: registrar) - epp_session = build(:epp_session, registrar: registrar) + epp_session = EppSession.new + epp_session.session_id = 'test' + epp_session.registrar = registrar epp_session[:api_user_id] = api_user.id - epp_session.registrar_id = registrar.id epp_session.save! domain_counter = 1.step From 4163ee9017f6cc1593917a6557fcd86d17bea266 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 6 Feb 2018 23:45:49 +0200 Subject: [PATCH 004/104] Remove factory #700 --- spec/factories/epp_session.rb | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 spec/factories/epp_session.rb diff --git a/spec/factories/epp_session.rb b/spec/factories/epp_session.rb deleted file mode 100644 index 96dd78da3..000000000 --- a/spec/factories/epp_session.rb +++ /dev/null @@ -1,5 +0,0 @@ -FactoryBot.define do - factory :epp_session do - - end -end From 1c560b1748ab72379346b504e3f0595afb32a021 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 6 Feb 2018 23:53:14 +0200 Subject: [PATCH 005/104] Disallow blank EppSession#session_id #700 --- app/models/epp_session.rb | 2 ++ test/models/epp_session_test.rb | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/app/models/epp_session.rb b/app/models/epp_session.rb index f051b50ed..8d36e15ef 100644 --- a/app/models/epp_session.rb +++ b/app/models/epp_session.rb @@ -1,6 +1,8 @@ class EppSession < ActiveRecord::Base before_save :marshal_data! + validates :session_id, presence: true + belongs_to :registrar # rubocop: disable Rails/ReadWriteAttribute # Turned back to read_attribute, thus in Rails 4 diff --git a/test/models/epp_session_test.rb b/test/models/epp_session_test.rb index 72d8f84ac..b4801bb5a 100644 --- a/test/models/epp_session_test.rb +++ b/test/models/epp_session_test.rb @@ -1,8 +1,17 @@ require 'test_helper' class EppSessionTest < ActiveSupport::TestCase + def setup + @epp_session = epp_sessions(:api_bestnames) + end + + def test_valid + assert @epp_session.valid? + end + def test_api_user_id_serialization epp_session = EppSession.new + epp_session.session_id = 'test' epp_session.registrar = registrars(:bestnames) epp_session[:api_user_id] = ActiveRecord::Fixtures.identify(:api_bestnames) epp_session.save! @@ -10,4 +19,10 @@ class EppSessionTest < ActiveSupport::TestCase assert_equal ActiveRecord::Fixtures.identify(:api_bestnames), epp_session[:api_user_id] end + + def test_session_id_presence_validation + @epp_session.session_id = nil + @epp_session.validate + assert @epp_session.invalid? + end end From d5b96060e07992f3f029568f0eefad82ec27a0e2 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 7 Feb 2018 00:58:48 +0200 Subject: [PATCH 006/104] Remove unneeded `if` statement epp_session.session_id is always present #700 --- app/controllers/epp_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/epp_controller.rb b/app/controllers/epp_controller.rb index 58f450147..254cb8968 100644 --- a/app/controllers/epp_controller.rb +++ b/app/controllers/epp_controller.rb @@ -119,7 +119,7 @@ class EppController < ApplicationController # by default PaperTrail uses before filter and at that # time current_user is not yet present ::PaperTrail.whodunnit = user_log_str(@current_user) - ::PaperSession.session = epp_session.session_id if epp_session.session_id.present? + ::PaperSession.session = epp_session.session_id @current_user end From 82c74a48119232df398870cadeb4dee185efe769 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 7 Feb 2018 01:10:45 +0200 Subject: [PATCH 007/104] Remove test logic #700 --- app/controllers/epp/sessions_controller.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/controllers/epp/sessions_controller.rb b/app/controllers/epp/sessions_controller.rb index 1396a5b35..dc67405d1 100644 --- a/app/controllers/epp/sessions_controller.rb +++ b/app/controllers/epp/sessions_controller.rb @@ -114,7 +114,6 @@ class Epp::SessionsController < EppController end def connection_limit_ok? - return true if Rails.env.test? || Rails.env.development? c = EppSession.where( 'registrar_id = ? AND updated_at >= ?', @api_user.registrar_id, Time.zone.now - 1.second ).count From ba341ee41125d381fb9da06b51d13b16a48113e7 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 7 Feb 2018 02:01:23 +0200 Subject: [PATCH 008/104] Add `epp_sessions.user_id` #700 --- ...234620_extract_user_id_from_epp_sessions_data.rb | 5 +++++ db/structure.sql | 13 ++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20180206234620_extract_user_id_from_epp_sessions_data.rb diff --git a/db/migrate/20180206234620_extract_user_id_from_epp_sessions_data.rb b/db/migrate/20180206234620_extract_user_id_from_epp_sessions_data.rb new file mode 100644 index 000000000..5fd686168 --- /dev/null +++ b/db/migrate/20180206234620_extract_user_id_from_epp_sessions_data.rb @@ -0,0 +1,5 @@ +class ExtractUserIdFromEppSessionsData < ActiveRecord::Migration + def change + add_reference :epp_sessions, :user, foreign_key: true + end +end diff --git a/db/structure.sql b/db/structure.sql index bf3230c57..b925a2a1b 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -1054,7 +1054,8 @@ CREATE TABLE epp_sessions ( data text, created_at timestamp without time zone, updated_at timestamp without time zone, - registrar_id integer + registrar_id integer, + user_id integer ); @@ -4484,6 +4485,14 @@ ALTER TABLE ONLY domain_transfers ADD CONSTRAINT fk_rails_87b8e40c63 FOREIGN KEY (domain_id) REFERENCES domains(id); +-- +-- Name: fk_rails_adff2dc8e3; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY epp_sessions + ADD CONSTRAINT fk_rails_adff2dc8e3 FOREIGN KEY (user_id) REFERENCES users(id); + + -- -- Name: fk_rails_b80dbb973d; Type: FK CONSTRAINT; Schema: public; Owner: - -- @@ -5072,3 +5081,5 @@ INSERT INTO schema_migrations (version) VALUES ('20180126104903'); INSERT INTO schema_migrations (version) VALUES ('20180206213435'); +INSERT INTO schema_migrations (version) VALUES ('20180206234620'); + From 940613ae347af450426887a72873cdc41df445fb Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 7 Feb 2018 02:17:48 +0200 Subject: [PATCH 009/104] Decompose EppSession#data #700 --- .reek | 2 -- .rubocop_todo.yml | 5 --- app/controllers/epp/sessions_controller.rb | 2 +- app/controllers/epp_controller.rb | 2 +- app/models/epp_session.rb | 36 ++-------------------- lib/tasks/dev.rake | 2 +- test/fixtures/epp_sessions.yml | 4 +-- test/models/epp_session_test.rb | 17 ++++------ 8 files changed, 13 insertions(+), 57 deletions(-) diff --git a/.reek b/.reek index 3bdfebb81..b621c44a5 100644 --- a/.reek +++ b/.reek @@ -538,7 +538,6 @@ IrresponsibleModule: - DomainStatus - DomainTransfer - Epp::Contact - - EppSession - Invoice - InvoiceItem - Keyrelay @@ -1027,7 +1026,6 @@ PrimaDonnaMethod: - Contact - Domain - Epp::Domain - - EppSession - RegistrantVerification - Registrar BooleanParameter: diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index a9c491df9..7acf2bd1b 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -655,11 +655,6 @@ Performance/StringReplacement: - 'app/models/directo.rb' - 'app/models/dnskey.rb' -# Offense count: 1 -Security/MarshalLoad: - Exclude: - - 'app/models/epp_session.rb' - # Offense count: 4 # Cop supports --auto-correct. # Configuration parameters: EnforcedStyle, SupportedStyles. diff --git a/app/controllers/epp/sessions_controller.rb b/app/controllers/epp/sessions_controller.rb index dc67405d1..8f4d14ac7 100644 --- a/app/controllers/epp/sessions_controller.rb +++ b/app/controllers/epp/sessions_controller.rb @@ -91,7 +91,7 @@ class Epp::SessionsController < EppController end end - epp_session[:api_user_id] = @api_user.id + epp_session.user = @api_user epp_session.update_column(:registrar_id, @api_user.registrar_id) render_epp_response('login_success') else diff --git a/app/controllers/epp_controller.rb b/app/controllers/epp_controller.rb index 254cb8968..07d3286d0 100644 --- a/app/controllers/epp_controller.rb +++ b/app/controllers/epp_controller.rb @@ -115,7 +115,7 @@ class EppController < ApplicationController end def current_user - @current_user ||= ApiUser.find_by_id(epp_session[:api_user_id]) + @current_user ||= epp_session.user # by default PaperTrail uses before filter and at that # time current_user is not yet present ::PaperTrail.whodunnit = user_log_str(@current_user) diff --git a/app/models/epp_session.rb b/app/models/epp_session.rb index 8d36e15ef..dd97a91a9 100644 --- a/app/models/epp_session.rb +++ b/app/models/epp_session.rb @@ -1,38 +1,6 @@ class EppSession < ActiveRecord::Base - before_save :marshal_data! + belongs_to :user, required: true + belongs_to :registrar validates :session_id, presence: true - - belongs_to :registrar - # rubocop: disable Rails/ReadWriteAttribute - # Turned back to read_attribute, thus in Rails 4 - # there is differences between self[:data] and read_attribute. - def data - @data ||= self.class.unmarshal(read_attribute(:data)) || {} - end - # rubocop: enable Rails/ReadWriteAttribute - - def [](key) - data[key.to_sym] - end - - def []=(key, value) - data[key.to_sym] = value - save! - end - - def marshal_data! - self.data = self.class.marshal(data) - end - - class << self - def marshal(data) - ::Base64.encode64(Marshal.dump(data)) if data - end - - def unmarshal(data) - return data unless data.is_a? String - Marshal.load(::Base64.decode64(data)) if data - end - end end diff --git a/lib/tasks/dev.rake b/lib/tasks/dev.rake index e25053133..d0c855903 100644 --- a/lib/tasks/dev.rake +++ b/lib/tasks/dev.rake @@ -52,7 +52,7 @@ namespace :dev do epp_session = EppSession.new epp_session.session_id = 'test' epp_session.registrar = registrar - epp_session[:api_user_id] = api_user.id + epp_session.user = api_user epp_session.save! domain_counter = 1.step diff --git a/test/fixtures/epp_sessions.yml b/test/fixtures/epp_sessions.yml index 8cdaedb8c..9d824cf1c 100644 --- a/test/fixtures/epp_sessions.yml +++ b/test/fixtures/epp_sessions.yml @@ -1,9 +1,9 @@ api_bestnames: session_id: 1 + user: api_bestnames registrar: bestnames - data: <%= Base64.encode64(Marshal.dump({api_user_id: ActiveRecord::Fixtures.identify(:api_bestnames)})) %> api_goodnames: session_id: 2 + user: api_goodnames registrar: goodnames - data: <%= Base64.encode64(Marshal.dump({api_user_id: ActiveRecord::Fixtures.identify(:api_goodnames)})) %> diff --git a/test/models/epp_session_test.rb b/test/models/epp_session_test.rb index b4801bb5a..98ae993f5 100644 --- a/test/models/epp_session_test.rb +++ b/test/models/epp_session_test.rb @@ -9,20 +9,15 @@ class EppSessionTest < ActiveSupport::TestCase assert @epp_session.valid? end - def test_api_user_id_serialization - epp_session = EppSession.new - epp_session.session_id = 'test' - epp_session.registrar = registrars(:bestnames) - epp_session[:api_user_id] = ActiveRecord::Fixtures.identify(:api_bestnames) - epp_session.save! - epp_session.reload - - assert_equal ActiveRecord::Fixtures.identify(:api_bestnames), epp_session[:api_user_id] - end - def test_session_id_presence_validation @epp_session.session_id = nil @epp_session.validate assert @epp_session.invalid? end + + def test_user_presence_validation + @epp_session.user = nil + @epp_session.validate + assert @epp_session.invalid? + end end From cf5ea5a16dadd9a3e7c014c7a183152705118fe6 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 7 Feb 2018 06:18:09 +0200 Subject: [PATCH 010/104] Revert "Remove factory" This reverts commit 4163ee9017f6cc1593917a6557fcd86d17bea266. --- spec/factories/epp_session.rb | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 spec/factories/epp_session.rb diff --git a/spec/factories/epp_session.rb b/spec/factories/epp_session.rb new file mode 100644 index 000000000..96dd78da3 --- /dev/null +++ b/spec/factories/epp_session.rb @@ -0,0 +1,5 @@ +FactoryBot.define do + factory :epp_session do + + end +end From ad1f5e6144f91607c56801989303388ea7e66b99 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 7 Feb 2018 08:38:14 +0200 Subject: [PATCH 011/104] Fix invalid factory #700 --- spec/factories/epp_session.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spec/factories/epp_session.rb b/spec/factories/epp_session.rb index 96dd78da3..20e3afc45 100644 --- a/spec/factories/epp_session.rb +++ b/spec/factories/epp_session.rb @@ -1,5 +1,7 @@ FactoryBot.define do factory :epp_session do - + sequence(:session_id) { |n| "test#{n}" } + registrar + association :user, factory: :api_user end end From 278ae07ac6016195c7ab7be1d6b1a25f96f85252 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 7 Feb 2018 08:46:55 +0200 Subject: [PATCH 012/104] Fix EPP login in specs #700 --- .../requests/epp/contact/create/ident_spec.rb | 7 +++++-- .../requests/epp/contact/create/phone_spec.rb | 7 +++++-- spec/requests/epp/contact/create_spec.rb | 21 +++++++++++-------- spec/requests/epp/contact/delete/used_spec.rb | 5 +++-- spec/requests/epp/contact/info_spec.rb | 13 +++++++----- .../requests/epp/contact/update/ident_spec.rb | 7 +++++-- .../requests/epp/contact/update/phone_spec.rb | 7 +++++-- spec/requests/epp/contact/update_spec.rb | 17 ++++++++------- .../epp/domain/create/account_balance_spec.rb | 5 +++-- .../epp/domain/create/default_period_spec.rb | 5 +++-- .../domain/create/optional_nameserver_spec.rb | 5 +++-- .../requests/epp/domain/create/period_spec.rb | 5 +++-- spec/requests/epp/domain/create/price_spec.rb | 5 +++-- .../domain/create/required_nameserver_spec.rb | 5 +++-- .../epp/domain/delete/discarded_spec.rb | 9 +++++--- .../epp/domain/renew/account_balance_spec.rb | 5 +++-- .../epp/domain/renew/default_period_spec.rb | 5 +++-- .../epp/domain/renew/expire_time_spec.rb | 5 +++-- .../epp/domain/renew/max_expire_time_spec.rb | 11 +++++----- spec/requests/epp/domain/renew/period_spec.rb | 5 +++-- spec/requests/epp/domain/renew/price_spec.rb | 5 +++-- .../epp/domain/transfer/discarded_spec.rb | 9 +++++--- .../epp/domain/update/discarded_spec.rb | 9 +++++--- .../epp/domain/update/nameserver_add_spec.rb | 13 +++++++----- .../domain/update/nameserver_remove_spec.rb | 14 +++++++------ .../registrant_change/same_as_current_spec.rb | 7 +++++-- .../update/registrant_change/verified_spec.rb | 7 +++++-- .../requests/epp/domain/update/status_spec.rb | 7 +++++-- 28 files changed, 141 insertions(+), 84 deletions(-) diff --git a/spec/requests/epp/contact/create/ident_spec.rb b/spec/requests/epp/contact/create/ident_spec.rb index e112e2618..cdf457002 100644 --- a/spec/requests/epp/contact/create/ident_spec.rb +++ b/spec/requests/epp/contact/create/ident_spec.rb @@ -1,11 +1,14 @@ require 'rails_helper' RSpec.describe 'EPP contact:create' do - let(:request) { post '/epp/command/create', frame: request_xml } + let(:registrar) { create(:registrar) } + let(:user) { create(:api_user_epp, registrar: registrar) } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:request) { post '/epp/command/create', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } before do Setting.address_processing = false - sign_in_to_epp_area + login_as user end context 'when all ident params are valid' do diff --git a/spec/requests/epp/contact/create/phone_spec.rb b/spec/requests/epp/contact/create/phone_spec.rb index dd205de87..3c7796659 100644 --- a/spec/requests/epp/contact/create/phone_spec.rb +++ b/spec/requests/epp/contact/create/phone_spec.rb @@ -2,7 +2,10 @@ require 'rails_helper' require_relative '../shared/phone' RSpec.describe 'EPP contact:create' do - let(:request) { post '/epp/command/create', frame: request_xml } + let(:registrar) { create(:registrar) } + let(:user) { create(:api_user_epp, registrar: registrar) } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:request) { post '/epp/command/create', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let(:request_xml) { <<-XML @@ -27,7 +30,7 @@ RSpec.describe 'EPP contact:create' do } before do - sign_in_to_epp_area + login_as user allow(Contact).to receive(:address_processing?).and_return(false) end diff --git a/spec/requests/epp/contact/create_spec.rb b/spec/requests/epp/contact/create_spec.rb index 0f03fd6ac..8b4b14794 100644 --- a/spec/requests/epp/contact/create_spec.rb +++ b/spec/requests/epp/contact/create_spec.rb @@ -1,6 +1,9 @@ require 'rails_helper' RSpec.describe 'EPP contact:create' do + let(:registrar) { create(:registrar) } + let(:user) { create(:api_user_epp, registrar: registrar) } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } let(:request_xml_with_address) { ' @@ -36,7 +39,7 @@ RSpec.describe 'EPP contact:create' do subject(:address_saved) { Contact.last.attributes.slice(*Contact.address_attribute_names).compact.any? } before do - sign_in_to_epp_area + login_as user end context 'when address processing is enabled' do @@ -46,17 +49,17 @@ RSpec.describe 'EPP contact:create' do context 'with address' do it 'returns epp code of 1000' do - post '/epp/command/create', frame: request_xml_with_address + post '/epp/command/create', { frame: request_xml_with_address }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_code).to eq('1000') end it 'returns epp description' do - post '/epp/command/create', frame: request_xml_with_address + post '/epp/command/create', { frame: request_xml_with_address}, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_description).to eq('Command completed successfully') end it 'saves address' do - post '/epp/command/create', frame: request_xml_with_address + post '/epp/command/create', { frame: request_xml_with_address }, 'HTTP_COOKIE' => "session=#{session_id}" expect(address_saved).to be_truthy end end @@ -69,17 +72,17 @@ RSpec.describe 'EPP contact:create' do context 'with address' do it 'returns epp code of 1100' do - post '/epp/command/create', frame: request_xml_with_address + post '/epp/command/create', { frame: request_xml_with_address }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_code).to eq('1100') end it 'returns epp description' do - post '/epp/command/create', frame: request_xml_with_address + post '/epp/command/create', { frame: request_xml_with_address }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_description).to eq('Command completed successfully; Postal address data discarded') end it 'does not save address' do - post '/epp/command/create', frame: request_xml_with_address + post '/epp/command/create', { frame: request_xml_with_address }, 'HTTP_COOKIE' => "session=#{session_id}" expect(address_saved).to be_falsey end end @@ -110,12 +113,12 @@ RSpec.describe 'EPP contact:create' do } it 'returns epp code of 1000' do - post '/epp/command/create', frame: request_xml_without_address + post '/epp/command/create', { frame: request_xml_without_address }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_code).to eq('1000') end it 'returns epp description' do - post '/epp/command/create', frame: request_xml_without_address + post '/epp/command/create', { frame: request_xml_without_address }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_description).to eq('Command completed successfully') end end diff --git a/spec/requests/epp/contact/delete/used_spec.rb b/spec/requests/epp/contact/delete/used_spec.rb index f6db6b65b..e37d30173 100644 --- a/spec/requests/epp/contact/delete/used_spec.rb +++ b/spec/requests/epp/contact/delete/used_spec.rb @@ -1,10 +1,11 @@ require 'rails_helper' RSpec.describe 'EPP contact:delete' do + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } let(:user) { create(:api_user, registrar: registrar) } let(:registrar) { create(:registrar) } let!(:registrant) { create(:registrant, registrar: registrar, code: 'TEST') } - let(:request) { post '/epp/command/delete', frame: request_xml } + let(:request) { post '/epp/command/delete', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let(:request_xml) { <<-XML @@ -20,7 +21,7 @@ RSpec.describe 'EPP contact:delete' do } before do - sign_in_to_epp_area(user: user) + login_as user end context 'when contact is used' do diff --git a/spec/requests/epp/contact/info_spec.rb b/spec/requests/epp/contact/info_spec.rb index d97a0373e..a16a235a8 100644 --- a/spec/requests/epp/contact/info_spec.rb +++ b/spec/requests/epp/contact/info_spec.rb @@ -1,6 +1,9 @@ require 'rails_helper' RSpec.describe 'EPP contact:update' do + let(:registrar) { create(:registrar) } + let(:user) { create(:api_user_epp, registrar: registrar) } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } let(:request_xml) { ' @@ -19,7 +22,7 @@ RSpec.describe 'EPP contact:update' do .count } before do - sign_in_to_epp_area + login_as user create(:contact, code: 'TEST') end @@ -29,12 +32,12 @@ RSpec.describe 'EPP contact:update' do end it 'returns epp code of 1000' do - post '/epp/command/info', frame: request_xml + post '/epp/command/info', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_code).to eq('1000') end it 'returns address' do - post '/epp/command/info', frame: request_xml + post '/epp/command/info', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" expect(address_count).to_not be_zero end end @@ -45,12 +48,12 @@ RSpec.describe 'EPP contact:update' do end it 'returns epp code of 1000' do - post '/epp/command/info', frame: request_xml + post '/epp/command/info', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_code).to eq('1000') end it 'does not return address' do - post '/epp/command/info', frame: request_xml + post '/epp/command/info', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" expect(address_count).to be_zero end end diff --git a/spec/requests/epp/contact/update/ident_spec.rb b/spec/requests/epp/contact/update/ident_spec.rb index c93ba6390..ec25d1c8c 100644 --- a/spec/requests/epp/contact/update/ident_spec.rb +++ b/spec/requests/epp/contact/update/ident_spec.rb @@ -3,8 +3,11 @@ require 'rails_helper' # https://github.com/internetee/registry/issues/576 RSpec.describe 'EPP contact:update' do + let(:registrar) { create(:registrar) } + let(:user) { create(:api_user_epp, registrar: registrar) } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } let(:ident) { contact.identifier } - let(:request) { post '/epp/command/update', frame: request_xml } + let(:request) { post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let(:request_xml) { <<-XML @@ -30,7 +33,7 @@ RSpec.describe 'EPP contact:update' do } before do - sign_in_to_epp_area + login_as user end context 'when contact ident is valid' do diff --git a/spec/requests/epp/contact/update/phone_spec.rb b/spec/requests/epp/contact/update/phone_spec.rb index 452b80c5c..696725ab4 100644 --- a/spec/requests/epp/contact/update/phone_spec.rb +++ b/spec/requests/epp/contact/update/phone_spec.rb @@ -2,8 +2,11 @@ require 'rails_helper' require_relative '../shared/phone' RSpec.describe 'EPP contact:update' do + let(:registrar) { create(:registrar) } + let(:user) { create(:api_user_epp, registrar: registrar) } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } let!(:contact) { create(:contact, code: 'TEST') } - let(:request) { post '/epp/command/update', frame: request_xml } + let(:request) { post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let(:request_xml) { <<-XML @@ -22,7 +25,7 @@ RSpec.describe 'EPP contact:update' do } before do - sign_in_to_epp_area + login_as user allow(Contact).to receive(:address_processing?).and_return(false) end diff --git a/spec/requests/epp/contact/update_spec.rb b/spec/requests/epp/contact/update_spec.rb index a8be4c85d..3d40e8699 100644 --- a/spec/requests/epp/contact/update_spec.rb +++ b/spec/requests/epp/contact/update_spec.rb @@ -1,6 +1,9 @@ require 'rails_helper' RSpec.describe 'EPP contact:update' do + let(:registrar) { create(:registrar) } + let(:user) { create(:api_user_epp, registrar: registrar) } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } let(:request_xml_with_address) { ' @@ -33,7 +36,7 @@ RSpec.describe 'EPP contact:update' do subject(:response_description) { response_xml.css('result msg').text } before do - sign_in_to_epp_area + login_as user create(:contact, code: 'TEST') end @@ -44,12 +47,12 @@ RSpec.describe 'EPP contact:update' do context 'with address' do it 'returns epp code of 1000' do - post '/epp/command/update', frame: request_xml_with_address + post '/epp/command/update', { frame: request_xml_with_address }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_code).to eq('1000') end it 'returns epp description' do - post '/epp/command/update', frame: request_xml_with_address + post '/epp/command/update', { frame: request_xml_with_address }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_description).to eq('Command completed successfully') end end @@ -62,12 +65,12 @@ RSpec.describe 'EPP contact:update' do context 'with address' do it 'returns epp code of 1100' do - post '/epp/command/update', frame: request_xml_with_address + post '/epp/command/update', { frame: request_xml_with_address }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_code).to eq('1100') end it 'returns epp description' do - post '/epp/command/update', frame: request_xml_with_address + post '/epp/command/update', { frame: request_xml_with_address }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_description).to eq('Command completed successfully; Postal address data discarded') end end @@ -92,12 +95,12 @@ RSpec.describe 'EPP contact:update' do } it 'returns epp code of 1000' do - post '/epp/command/update', frame: request_xml_without_address + post '/epp/command/update', { frame: request_xml_without_address }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_code).to eq('1000') end it 'returns epp description' do - post '/epp/command/update', frame: request_xml_without_address + post '/epp/command/update', { frame: request_xml_without_address }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_description).to eq('Command completed successfully') end end diff --git a/spec/requests/epp/domain/create/account_balance_spec.rb b/spec/requests/epp/domain/create/account_balance_spec.rb index 9c3905801..43edae1aa 100644 --- a/spec/requests/epp/domain/create/account_balance_spec.rb +++ b/spec/requests/epp/domain/create/account_balance_spec.rb @@ -1,7 +1,8 @@ require 'rails_helper' RSpec.describe 'EPP domain:create', settings: false do - let(:request) { post '/epp/command/create', frame: request_xml } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:request) { post '/epp/command/create', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:contact) { create(:contact, code: 'test') } let!(:zone) { create(:zone, origin: 'test') } @@ -36,7 +37,7 @@ RSpec.describe 'EPP domain:create', settings: false do before :example do travel_to Time.zone.parse('05.07.2010') Setting.days_to_renew_domain_before_expire = 0 - sign_in_to_epp_area(user: user) + login_as user end context 'when account balance is sufficient' do diff --git a/spec/requests/epp/domain/create/default_period_spec.rb b/spec/requests/epp/domain/create/default_period_spec.rb index 05a1ab73a..fd807bef0 100644 --- a/spec/requests/epp/domain/create/default_period_spec.rb +++ b/spec/requests/epp/domain/create/default_period_spec.rb @@ -1,7 +1,8 @@ require 'rails_helper' RSpec.describe 'EPP domain:create', settings: false do - let(:request) { post '/epp/command/create', frame: request_xml } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:request) { post '/epp/command/create', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:contact) { create(:contact, code: 'test') } let!(:zone) { create(:zone, origin: 'test') } @@ -37,7 +38,7 @@ RSpec.describe 'EPP domain:create', settings: false do before :example do travel_to Time.zone.parse('05.07.2010 10:30') Setting.days_to_renew_domain_before_expire = 0 - sign_in_to_epp_area(user: user) + login_as user end context 'when period is absent' do diff --git a/spec/requests/epp/domain/create/optional_nameserver_spec.rb b/spec/requests/epp/domain/create/optional_nameserver_spec.rb index bf1550268..83ab1df44 100644 --- a/spec/requests/epp/domain/create/optional_nameserver_spec.rb +++ b/spec/requests/epp/domain/create/optional_nameserver_spec.rb @@ -1,7 +1,8 @@ require 'rails_helper' RSpec.describe 'EPP domain:create', settings: false do - let(:request) { post '/epp/command/create', frame: request_xml } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:request) { post '/epp/command/create', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:registrar) { create(:registrar_with_unlimited_balance) } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:contact) { create(:contact, code: 'test') } @@ -17,7 +18,7 @@ RSpec.describe 'EPP domain:create', settings: false do before :example do travel_to Time.zone.parse('05.07.2010') - sign_in_to_epp_area(user: user) + login_as user end context 'when nameserver is optional' do diff --git a/spec/requests/epp/domain/create/period_spec.rb b/spec/requests/epp/domain/create/period_spec.rb index 355ef7557..f9550002e 100644 --- a/spec/requests/epp/domain/create/period_spec.rb +++ b/spec/requests/epp/domain/create/period_spec.rb @@ -1,7 +1,8 @@ require 'rails_helper' RSpec.describe 'EPP domain:create', settings: false do - let(:request) { post '/epp/command/create', frame: request_xml } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:request) { post '/epp/command/create', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:contact) { create(:contact, code: 'test') } let!(:zone) { create(:zone, origin: 'test') } @@ -10,7 +11,7 @@ RSpec.describe 'EPP domain:create', settings: false do before :example do travel_to Time.zone.parse('05.07.2010 10:30') Setting.days_to_renew_domain_before_expire = 0 - sign_in_to_epp_area(user: user) + login_as user end context 'when period is 3 months' do diff --git a/spec/requests/epp/domain/create/price_spec.rb b/spec/requests/epp/domain/create/price_spec.rb index 69439bb41..2b2aa789e 100644 --- a/spec/requests/epp/domain/create/price_spec.rb +++ b/spec/requests/epp/domain/create/price_spec.rb @@ -1,7 +1,8 @@ require 'rails_helper' RSpec.describe 'EPP domain:create', settings: false do - let(:request) { post '/epp/command/create', frame: request_xml } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:request) { post '/epp/command/create', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:contact) { create(:contact, code: 'test') } let!(:zone) { create(:zone, origin: 'test') } @@ -30,7 +31,7 @@ RSpec.describe 'EPP domain:create', settings: false do before :example do travel_to Time.zone.parse('05.07.2010') Setting.days_to_renew_domain_before_expire = 0 - sign_in_to_epp_area(user: user) + login_as user end context 'when price is present' do diff --git a/spec/requests/epp/domain/create/required_nameserver_spec.rb b/spec/requests/epp/domain/create/required_nameserver_spec.rb index 11b49aede..3c72c58a5 100644 --- a/spec/requests/epp/domain/create/required_nameserver_spec.rb +++ b/spec/requests/epp/domain/create/required_nameserver_spec.rb @@ -1,7 +1,8 @@ require 'rails_helper' RSpec.describe 'EPP domain:create', settings: false do - let(:request) { post '/epp/command/create', frame: request_xml } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:request) { post '/epp/command/create', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:registrar) { create(:registrar_with_unlimited_balance) } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:contact) { create(:contact, code: 'test') } @@ -17,7 +18,7 @@ RSpec.describe 'EPP domain:create', settings: false do before :example do travel_to Time.zone.parse('05.07.2010') - sign_in_to_epp_area(user: user) + login_as user end context 'when nameserver is required' do diff --git a/spec/requests/epp/domain/delete/discarded_spec.rb b/spec/requests/epp/domain/delete/discarded_spec.rb index 99ec59267..1cce794bc 100644 --- a/spec/requests/epp/domain/delete/discarded_spec.rb +++ b/spec/requests/epp/domain/delete/discarded_spec.rb @@ -1,6 +1,9 @@ require 'rails_helper' RSpec.describe 'EPP domain:delete' do + let(:registrar) { create(:registrar) } + let(:user) { create(:api_user_epp, registrar: registrar) } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } let(:request_xml) { <<-XML @@ -21,14 +24,14 @@ RSpec.describe 'EPP domain:delete' do } before :example do - sign_in_to_epp_area + login_as user end context 'when domain is not discarded' do let!(:domain) { create(:domain, name: 'test.com') } it 'returns epp code of 1001' do - post '/epp/command/delete', frame: request_xml + post '/epp/command/delete', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response).to have_code_of(1001) end end @@ -37,7 +40,7 @@ RSpec.describe 'EPP domain:delete' do let!(:domain) { create(:domain_discarded, name: 'test.com') } it 'returns epp code of 2105' do - post '/epp/command/delete', frame: request_xml + post '/epp/command/delete', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response).to have_code_of(2105) end end diff --git a/spec/requests/epp/domain/renew/account_balance_spec.rb b/spec/requests/epp/domain/renew/account_balance_spec.rb index 39f9eac02..128c60070 100644 --- a/spec/requests/epp/domain/renew/account_balance_spec.rb +++ b/spec/requests/epp/domain/renew/account_balance_spec.rb @@ -1,7 +1,8 @@ require 'rails_helper' RSpec.describe 'EPP domain:renew' do - let(:request) { post '/epp/command/renew', frame: request_xml } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:request) { post '/epp/command/renew', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:zone) { create(:zone, origin: 'test') } let!(:price) { create(:price, @@ -16,7 +17,7 @@ RSpec.describe 'EPP domain:renew' do before :example do Setting.days_to_renew_domain_before_expire = 0 travel_to Time.zone.parse('05.07.2010') - sign_in_to_epp_area(user: user) + login_as user end context 'when account balance is sufficient' do diff --git a/spec/requests/epp/domain/renew/default_period_spec.rb b/spec/requests/epp/domain/renew/default_period_spec.rb index 70ab2d58d..2f09acbcc 100644 --- a/spec/requests/epp/domain/renew/default_period_spec.rb +++ b/spec/requests/epp/domain/renew/default_period_spec.rb @@ -1,7 +1,8 @@ require 'rails_helper' RSpec.describe 'EPP domain:renew', settings: false do - let(:request) { post '/epp/command/renew', frame: request_xml } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:request) { post '/epp/command/renew', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:zone) { create(:zone, origin: 'test') } let!(:registrar) { create(:registrar_with_unlimited_balance) } @@ -37,7 +38,7 @@ RSpec.describe 'EPP domain:renew', settings: false do before :example do travel_to Time.zone.parse('05.07.2010') Setting.days_to_renew_domain_before_expire = 0 - sign_in_to_epp_area(user: user) + login_as user end context 'when period is absent' do diff --git a/spec/requests/epp/domain/renew/expire_time_spec.rb b/spec/requests/epp/domain/renew/expire_time_spec.rb index e656249ab..90cad850e 100644 --- a/spec/requests/epp/domain/renew/expire_time_spec.rb +++ b/spec/requests/epp/domain/renew/expire_time_spec.rb @@ -1,7 +1,8 @@ require 'rails_helper' RSpec.describe 'EPP domain:renew' do - let(:request) { post '/epp/command/renew', frame: request_xml } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:request) { post '/epp/command/renew', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:registrar) { create(:registrar_with_unlimited_balance) } let!(:zone) { create(:zone, origin: 'test') } @@ -17,7 +18,7 @@ RSpec.describe 'EPP domain:renew' do before :example do Setting.days_to_renew_domain_before_expire = 0 travel_to Time.zone.parse('05.07.2010') - sign_in_to_epp_area(user: user) + login_as user end context 'when given expire time and current match' do diff --git a/spec/requests/epp/domain/renew/max_expire_time_spec.rb b/spec/requests/epp/domain/renew/max_expire_time_spec.rb index 2a9a0c52c..211af8685 100644 --- a/spec/requests/epp/domain/renew/max_expire_time_spec.rb +++ b/spec/requests/epp/domain/renew/max_expire_time_spec.rb @@ -1,6 +1,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:renew' do + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } let(:user) { create(:api_user_epp, registrar: registrar) } let(:registrar) { create(:registrar_with_unlimited_balance) } let!(:zone) { create(:zone, origin: 'test') } @@ -19,7 +20,7 @@ RSpec.describe 'EPP domain:renew' do before :example do travel_to Time.zone.parse('05.07.2010') Setting.days_to_renew_domain_before_expire = 0 - sign_in_to_epp_area(user: user) + login_as user end context 'when domain can be renewed' do @@ -45,12 +46,12 @@ RSpec.describe 'EPP domain:renew' do } it 'returns epp code of 1000' do - post '/epp/command/renew', frame: request_xml + post '/epp/command/renew', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_code).to eq('1000') end it 'returns epp description' do - post '/epp/command/renew', frame: request_xml + post '/epp/command/renew', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_description).to eq('Command completed successfully') end end @@ -78,12 +79,12 @@ RSpec.describe 'EPP domain:renew' do } it 'returns epp code of 2105' do - post '/epp/command/renew', frame: request_xml + post '/epp/command/renew', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_code).to eq('2105') end it 'returns epp description' do - post '/epp/command/renew', frame: request_xml + post '/epp/command/renew', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_description).to eq('Object is not eligible for renewal; ' \ 'Expiration date must be before 2021-07-05') end diff --git a/spec/requests/epp/domain/renew/period_spec.rb b/spec/requests/epp/domain/renew/period_spec.rb index 3523927eb..6c5167d26 100644 --- a/spec/requests/epp/domain/renew/period_spec.rb +++ b/spec/requests/epp/domain/renew/period_spec.rb @@ -1,7 +1,8 @@ require 'rails_helper' RSpec.describe 'EPP domain:renew', settings: false do - let(:request) { post '/epp/command/renew', frame: request_xml } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:request) { post '/epp/command/renew', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:zone) { create(:zone, origin: 'test') } let!(:registrar) { create(:registrar_with_unlimited_balance) } @@ -14,7 +15,7 @@ RSpec.describe 'EPP domain:renew', settings: false do before :example do travel_to Time.zone.parse('05.07.2010') Setting.days_to_renew_domain_before_expire = 0 - sign_in_to_epp_area(user: user) + login_as user end context 'when period is 3 months' do diff --git a/spec/requests/epp/domain/renew/price_spec.rb b/spec/requests/epp/domain/renew/price_spec.rb index 3b5139103..4a9c65ff3 100644 --- a/spec/requests/epp/domain/renew/price_spec.rb +++ b/spec/requests/epp/domain/renew/price_spec.rb @@ -1,7 +1,8 @@ require 'rails_helper' RSpec.describe 'EPP domain:renew', settings: false do - let(:request) { post '/epp/command/renew', frame: request_xml } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:request) { post '/epp/command/renew', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:zone) { create(:zone, origin: 'test') } let!(:registrar) { create(:registrar_with_unlimited_balance) } @@ -29,7 +30,7 @@ RSpec.describe 'EPP domain:renew', settings: false do before :example do travel_to Time.zone.parse('05.07.2010') Setting.days_to_renew_domain_before_expire = 0 - sign_in_to_epp_area(user: user) + login_as user end context 'when price is present' do diff --git a/spec/requests/epp/domain/transfer/discarded_spec.rb b/spec/requests/epp/domain/transfer/discarded_spec.rb index 51f65c641..d279bf003 100644 --- a/spec/requests/epp/domain/transfer/discarded_spec.rb +++ b/spec/requests/epp/domain/transfer/discarded_spec.rb @@ -1,6 +1,9 @@ require 'rails_helper' RSpec.describe 'EPP domain:transfer' do + let(:registrar) { create(:registrar) } + let(:user) { create(:api_user_epp, registrar: registrar) } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } let(:request_xml) { <<-XML @@ -19,14 +22,14 @@ RSpec.describe 'EPP domain:transfer' do } before :example do - sign_in_to_epp_area + login_as user end context 'when domain is not discarded' do let!(:domain) { create(:domain, name: 'test.com') } it 'returns epp code of 1000' do - post '/epp/command/transfer', frame: request_xml + post '/epp/command/transfer', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response).to have_code_of(1000) end end @@ -35,7 +38,7 @@ RSpec.describe 'EPP domain:transfer' do let!(:domain) { create(:domain_discarded, name: 'test.com') } it 'returns epp code of 2105' do - post '/epp/command/transfer', frame: request_xml + post '/epp/command/transfer', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response).to have_code_of(2105) end end diff --git a/spec/requests/epp/domain/update/discarded_spec.rb b/spec/requests/epp/domain/update/discarded_spec.rb index 14ff1c743..29ae1f44c 100644 --- a/spec/requests/epp/domain/update/discarded_spec.rb +++ b/spec/requests/epp/domain/update/discarded_spec.rb @@ -1,6 +1,9 @@ require 'rails_helper' RSpec.describe 'EPP domain:update' do + let(:registrar) { create(:registrar) } + let(:user) { create(:api_user_epp, registrar: registrar) } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } let(:request_xml) { <<-XML @@ -16,14 +19,14 @@ RSpec.describe 'EPP domain:update' do } before :example do - sign_in_to_epp_area + login_as user end context 'when domain is not discarded' do let!(:domain) { create(:domain, name: 'test.com') } it 'returns epp code of 1000' do - post '/epp/command/update', frame: request_xml + post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response).to have_code_of(1000) end end @@ -32,7 +35,7 @@ RSpec.describe 'EPP domain:update' do let!(:domain) { create(:domain_discarded, name: 'test.com') } it 'returns epp code of 2105' do - post '/epp/command/update', frame: request_xml + post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response).to have_code_of(2105) end end diff --git a/spec/requests/epp/domain/update/nameserver_add_spec.rb b/spec/requests/epp/domain/update/nameserver_add_spec.rb index d6f886932..8a00d585d 100644 --- a/spec/requests/epp/domain/update/nameserver_add_spec.rb +++ b/spec/requests/epp/domain/update/nameserver_add_spec.rb @@ -1,13 +1,16 @@ require 'rails_helper' RSpec.describe 'EPP domain:update' do + let(:registrar) { create(:registrar) } + let(:user) { create(:api_user_epp, registrar: registrar) } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } let!(:domain) { create(:domain, name: 'test.com') } subject(:response_xml) { Nokogiri::XML(response.body) } subject(:response_code) { response_xml.xpath('//xmlns:result').first['code'] } subject(:response_description) { response_xml.css('result msg').text } before :example do - sign_in_to_epp_area + login_as user allow(Domain).to receive(:nameserver_required?).and_return(false) Setting.ns_min_count = 2 @@ -37,12 +40,12 @@ RSpec.describe 'EPP domain:update' do } it 'returns epp code of 2308' do - post '/epp/command/update', frame: request_xml + post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_code).to eq('2308'), "Expected EPP code of 2308, got #{response_code} (#{response_description})" end it 'returns epp description' do - post '/epp/command/update', frame: request_xml + post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" description = 'Data management policy violation;' \ " Nameserver count must be between #{Setting.ns_min_count}-#{Setting.ns_max_count}" \ @@ -78,12 +81,12 @@ RSpec.describe 'EPP domain:update' do } it 'returns epp code of 1000' do - post '/epp/command/update', frame: request_xml + post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_code).to eq('1000'), "Expected EPP code of 1000, got #{response_code} (#{response_description})" end it 'removes inactive status' do - post '/epp/command/update', frame: request_xml + post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" domain = Domain.find_by(name: 'test.com') expect(domain.statuses).to_not include(DomainStatus::INACTIVE) diff --git a/spec/requests/epp/domain/update/nameserver_remove_spec.rb b/spec/requests/epp/domain/update/nameserver_remove_spec.rb index 5ecc2f29a..3796d2e12 100644 --- a/spec/requests/epp/domain/update/nameserver_remove_spec.rb +++ b/spec/requests/epp/domain/update/nameserver_remove_spec.rb @@ -1,13 +1,15 @@ require 'rails_helper' RSpec.describe 'EPP domain:update' do + let(:registrar) { create(:registrar) } + let(:user) { create(:api_user_epp, registrar: registrar) } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } subject(:response_xml) { Nokogiri::XML(response.body) } subject(:response_code) { response_xml.xpath('//xmlns:result').first['code'] } subject(:response_description) { response_xml.css('result msg').text } before :example do - sign_in_to_epp_area - + login_as user allow(Domain).to receive(:nameserver_required?).and_return(false) end @@ -43,12 +45,12 @@ RSpec.describe 'EPP domain:update' do end it 'returns epp code of 2308' do - post '/epp/command/update', frame: request_xml + post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_code).to eq('2308'), "Expected EPP code of 2308, got #{response_code} (#{response_description})" end it 'returns epp description' do - post '/epp/command/update', frame: request_xml + post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" description = 'Data management policy violation;' \ " Nameserver count must be between #{Setting.ns_min_count}-#{Setting.ns_max_count}" \ @@ -91,13 +93,13 @@ RSpec.describe 'EPP domain:update' do end it 'returns epp code of 1000' do - post '/epp/command/update', frame: request_xml + post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" expect(response_code).to eq('1000'), "Expected EPP code of 1000, got #{response_code} (#{response_description})" end describe 'domain' do it 'has status of inactive' do - post '/epp/command/update', frame: request_xml + post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" domain = Domain.find_by(name: 'test.com') expect(domain.statuses).to include(DomainStatus::INACTIVE) end 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 index d929423aa..1c0c8eb5b 100644 --- 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 @@ -1,11 +1,14 @@ require 'rails_helper' RSpec.describe 'EPP domain:update' do - let(:request) { post '/epp/command/update', frame: request_xml } + let(:registrar) { create(:registrar) } + let(:user) { create(:api_user_epp, registrar: registrar) } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:request) { post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:domain) { create(:domain, name: 'test.com', registrant: registrant) } before :example do - sign_in_to_epp_area + login_as user end context 'when registrant change confirmation is enabled' do diff --git a/spec/requests/epp/domain/update/registrant_change/verified_spec.rb b/spec/requests/epp/domain/update/registrant_change/verified_spec.rb index 996fffccf..e94923644 100644 --- a/spec/requests/epp/domain/update/registrant_change/verified_spec.rb +++ b/spec/requests/epp/domain/update/registrant_change/verified_spec.rb @@ -1,13 +1,16 @@ require 'rails_helper' RSpec.describe 'EPP domain:update' do - let(:request) { post '/epp/command/update', frame: request_xml } + let(:registrar) { create(:registrar) } + let(:user) { create(:api_user_epp, registrar: registrar) } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:request) { post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:registrant) { create(:registrant, code: 'old-code') } let!(:domain) { create(:domain, name: 'test.com', registrant: registrant) } let!(:new_registrant) { create(:registrant, code: 'new-code') } before :example do - sign_in_to_epp_area + login_as user end context 'when registrant change confirmation is enabled' do diff --git a/spec/requests/epp/domain/update/status_spec.rb b/spec/requests/epp/domain/update/status_spec.rb index 1ef8d7900..df5506fb6 100644 --- a/spec/requests/epp/domain/update/status_spec.rb +++ b/spec/requests/epp/domain/update/status_spec.rb @@ -1,7 +1,10 @@ require 'rails_helper' RSpec.describe 'EPP domain:update' do - let(:request) { post '/epp/command/update', frame: request_xml } + let(:registrar) { create(:registrar) } + let(:user) { create(:api_user_epp, registrar: registrar) } + let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:request) { post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let(:request_xml) { <<-XML @@ -17,7 +20,7 @@ RSpec.describe 'EPP domain:update' do } before :example do - sign_in_to_epp_area + login_as user end context 'when domain has both SERVER_DELETE_PROHIBITED and PENDING_UPDATE statuses' do From 2dcf0f5878c1b1b5e34e50922df2d4ad9fd52c74 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 7 Feb 2018 08:47:25 +0200 Subject: [PATCH 013/104] Remove rspec helper #700 --- .reek | 1 - spec/support/requests/session_helpers.rb | 29 ------------------------ 2 files changed, 30 deletions(-) diff --git a/.reek b/.reek index b621c44a5..e51946a9a 100644 --- a/.reek +++ b/.reek @@ -959,7 +959,6 @@ FeatureEnvy: - ActionDispatch::Flash#call - Ransack::Adapters::ActiveRecord::Context#evaluate - EppConstraint#matches? - - Requests::SessionHelpers#sign_in_to_epp_area TooManyMethods: exclude: - Epp::ContactsController diff --git a/spec/support/requests/session_helpers.rb b/spec/support/requests/session_helpers.rb index 0345959e2..84cb9c701 100644 --- a/spec/support/requests/session_helpers.rb +++ b/spec/support/requests/session_helpers.rb @@ -1,34 +1,5 @@ module Requests module SessionHelpers - def sign_in_to_epp_area(user: create(:api_user_epp)) - login_xml = " - - - - #{user.username} - #{user.password} - - 1.0 - en - - - https://epp.tld.ee/schema/domain-eis-1.0.xsd - https://epp.tld.ee/schema/contact-ee-1.1.xsd - urn:ietf:params:xml:ns:host-1.0 - urn:ietf:params:xml:ns:keyrelay-1.0 - - urn:ietf:params:xml:ns:secDNS-1.1 - https://epp.tld.ee/schema/eis-1.0.xsd - - - - ABC-12345 - - " - - post '/epp/session/login', frame: login_xml - end - def sign_in_to_admin_area(user: create(:admin_user)) post admin_sessions_path, admin_user: { username: user.username, password: user.password } end From c5f8c7e1e8c7e2798380833b66a05737fba7bdcb Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 7 Feb 2018 09:15:15 +0200 Subject: [PATCH 014/104] Rename migration #700 --- ...sions_data.rb => 20180206234620_add_epp_sessions_user_id.rb} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename db/migrate/{20180206234620_extract_user_id_from_epp_sessions_data.rb => 20180206234620_add_epp_sessions_user_id.rb} (55%) diff --git a/db/migrate/20180206234620_extract_user_id_from_epp_sessions_data.rb b/db/migrate/20180206234620_add_epp_sessions_user_id.rb similarity index 55% rename from db/migrate/20180206234620_extract_user_id_from_epp_sessions_data.rb rename to db/migrate/20180206234620_add_epp_sessions_user_id.rb index 5fd686168..0e04a7f53 100644 --- a/db/migrate/20180206234620_extract_user_id_from_epp_sessions_data.rb +++ b/db/migrate/20180206234620_add_epp_sessions_user_id.rb @@ -1,4 +1,4 @@ -class ExtractUserIdFromEppSessionsData < ActiveRecord::Migration +class AddEppSessionsUserId < ActiveRecord::Migration def change add_reference :epp_sessions, :user, foreign_key: true end From 38f967a7d64d586262c7e9da6eb3c66576491c9c Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 7 Feb 2018 09:40:35 +0200 Subject: [PATCH 015/104] Migrate `epp_sessions.data` to `user_id` #700 --- ...207071528_extract_user_id_from_epp_sessions_data.rb | 10 ++++++++++ db/migrate/20180207072139_remove_epp_sessions_data.rb | 5 +++++ db/structure.sql | 5 ++++- 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20180207071528_extract_user_id_from_epp_sessions_data.rb create mode 100644 db/migrate/20180207072139_remove_epp_sessions_data.rb diff --git a/db/migrate/20180207071528_extract_user_id_from_epp_sessions_data.rb b/db/migrate/20180207071528_extract_user_id_from_epp_sessions_data.rb new file mode 100644 index 000000000..24a5f25a6 --- /dev/null +++ b/db/migrate/20180207071528_extract_user_id_from_epp_sessions_data.rb @@ -0,0 +1,10 @@ +class ExtractUserIdFromEppSessionsData < ActiveRecord::Migration + def change + EppSession.all.each do |epp_session| + user_id = Marshal.load(::Base64.decode64(epp_session.data_before_type_cast))[:api_user_id] + user = ApiUser.find(user_id) + epp_session.user = user + epp_session.save! + end + end +end diff --git a/db/migrate/20180207072139_remove_epp_sessions_data.rb b/db/migrate/20180207072139_remove_epp_sessions_data.rb new file mode 100644 index 000000000..90ec58740 --- /dev/null +++ b/db/migrate/20180207072139_remove_epp_sessions_data.rb @@ -0,0 +1,5 @@ +class RemoveEppSessionsData < ActiveRecord::Migration + def change + remove_column :epp_sessions, :data, :string + end +end diff --git a/db/structure.sql b/db/structure.sql index b925a2a1b..a6f29a47e 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -1051,7 +1051,6 @@ ALTER SEQUENCE domains_id_seq OWNED BY domains.id; CREATE TABLE epp_sessions ( id integer NOT NULL, session_id character varying NOT NULL, - data text, created_at timestamp without time zone, updated_at timestamp without time zone, registrar_id integer, @@ -5083,3 +5082,7 @@ INSERT INTO schema_migrations (version) VALUES ('20180206213435'); INSERT INTO schema_migrations (version) VALUES ('20180206234620'); +INSERT INTO schema_migrations (version) VALUES ('20180207071528'); + +INSERT INTO schema_migrations (version) VALUES ('20180207072139'); + From 7fa75f33dcab1260354f9987bfd67bbeb4c1d2df Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 7 Feb 2018 12:22:00 +0200 Subject: [PATCH 016/104] Improve CodeClimate config --- .codeclimate.yml | 26 ++++---------------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/.codeclimate.yml b/.codeclimate.yml index 21ab3742c..c3a7e4b2a 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -1,5 +1,4 @@ ---- -engines: +plugins: brakeman: enabled: true bundler-audit: @@ -14,8 +13,6 @@ engines: languages: - ruby - javascript - - python - - php eslint: enabled: true fixme: @@ -33,24 +30,9 @@ engines: checks: IrresponsibleModule: enabled: false -ratings: - paths: - - Gemfile.lock - - "**.erb" - - "**.haml" - - "**.rb" - - "**.rhtml" - - "**.slim" - - "**.css" - - "**.coffee" - - "**.inc" - - "**.js" - - "**.jsx" - - "**.module" - - "**.php" - - "**.py" -exclude_paths: +exclude_patterns: - config/ - db/ -- spec/ - vendor/ +- spec/ +- test/ From 114361f7f6dfea99f437da3ae0c8d1d2aafbfb1f Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 7 Feb 2018 12:33:00 +0200 Subject: [PATCH 017/104] Quote values #700 --- .codeclimate.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.codeclimate.yml b/.codeclimate.yml index c3a7e4b2a..e33254023 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -31,8 +31,8 @@ plugins: IrresponsibleModule: enabled: false exclude_patterns: -- config/ -- db/ -- vendor/ -- spec/ -- test/ +- "config/" +- "db/" +- "vendor/" +- "spec/" +- "test/" From b11306eea3064f9341e620ff576de5bc950ab559 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 12 Feb 2018 11:38:48 +0200 Subject: [PATCH 018/104] Create new EPP session on login explicitly #700 --- app/controllers/epp/sessions_controller.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/controllers/epp/sessions_controller.rb b/app/controllers/epp/sessions_controller.rb index 8f4d14ac7..1ffd9c02e 100644 --- a/app/controllers/epp/sessions_controller.rb +++ b/app/controllers/epp/sessions_controller.rb @@ -91,8 +91,11 @@ class Epp::SessionsController < EppController end end + epp_session = EppSession.new + epp_session.session_id = cookies[:session] epp_session.user = @api_user - epp_session.update_column(:registrar_id, @api_user.registrar_id) + epp_session.registrar = @api_user.registrar + epp_session.save! render_epp_response('login_success') else response.headers['X-EPP-Returncode'] = '2500' From fa6edab62ac7a4e9d1b8a7b79c89bbbb7cb24b45 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 12 Feb 2018 15:50:12 +0200 Subject: [PATCH 019/104] Remove extra attribute Registrar can be queried from user #700 --- app/controllers/epp/sessions_controller.rb | 8 +++----- .../20180212123810_remove_epp_sessions_registrar_id.rb | 5 +++++ db/structure.sql | 3 ++- lib/tasks/dev.rake | 1 - spec/factories/epp_session.rb | 1 - spec/requests/epp/contact/create/ident_spec.rb | 2 +- spec/requests/epp/contact/create/phone_spec.rb | 2 +- spec/requests/epp/contact/create_spec.rb | 2 +- spec/requests/epp/contact/delete/used_spec.rb | 2 +- spec/requests/epp/contact/info_spec.rb | 2 +- spec/requests/epp/contact/update/ident_spec.rb | 2 +- spec/requests/epp/contact/update/phone_spec.rb | 2 +- spec/requests/epp/contact/update_spec.rb | 2 +- spec/requests/epp/domain/create/account_balance_spec.rb | 2 +- spec/requests/epp/domain/create/default_period_spec.rb | 2 +- .../epp/domain/create/optional_nameserver_spec.rb | 2 +- spec/requests/epp/domain/create/period_spec.rb | 2 +- spec/requests/epp/domain/create/price_spec.rb | 2 +- .../epp/domain/create/required_nameserver_spec.rb | 2 +- spec/requests/epp/domain/delete/discarded_spec.rb | 2 +- spec/requests/epp/domain/renew/account_balance_spec.rb | 2 +- spec/requests/epp/domain/renew/default_period_spec.rb | 2 +- spec/requests/epp/domain/renew/expire_time_spec.rb | 2 +- spec/requests/epp/domain/renew/max_expire_time_spec.rb | 2 +- spec/requests/epp/domain/renew/period_spec.rb | 2 +- spec/requests/epp/domain/renew/price_spec.rb | 2 +- spec/requests/epp/domain/transfer/discarded_spec.rb | 2 +- spec/requests/epp/domain/update/discarded_spec.rb | 2 +- spec/requests/epp/domain/update/nameserver_add_spec.rb | 2 +- spec/requests/epp/domain/update/nameserver_remove_spec.rb | 2 +- .../update/registrant_change/same_as_current_spec.rb | 2 +- .../epp/domain/update/registrant_change/verified_spec.rb | 2 +- spec/requests/epp/domain/update/status_spec.rb | 2 +- test/fixtures/epp_sessions.yml | 2 -- 34 files changed, 38 insertions(+), 38 deletions(-) create mode 100644 db/migrate/20180212123810_remove_epp_sessions_registrar_id.rb diff --git a/app/controllers/epp/sessions_controller.rb b/app/controllers/epp/sessions_controller.rb index 1ffd9c02e..e4efc581d 100644 --- a/app/controllers/epp/sessions_controller.rb +++ b/app/controllers/epp/sessions_controller.rb @@ -94,7 +94,6 @@ class Epp::SessionsController < EppController epp_session = EppSession.new epp_session.session_id = cookies[:session] epp_session.user = @api_user - epp_session.registrar = @api_user.registrar epp_session.save! render_epp_response('login_success') else @@ -117,11 +116,10 @@ class Epp::SessionsController < EppController end def connection_limit_ok? - c = EppSession.where( - 'registrar_id = ? AND updated_at >= ?', @api_user.registrar_id, Time.zone.now - 1.second - ).count + epp_session_count = EppSession.where(user_id: @api_user.registrar.api_users.ids) + .where('updated_at >= ?', Time.zone.now - 1.second).count - return false if c >= 4 + return false if epp_session_count >= 4 true end diff --git a/db/migrate/20180212123810_remove_epp_sessions_registrar_id.rb b/db/migrate/20180212123810_remove_epp_sessions_registrar_id.rb new file mode 100644 index 000000000..80e2a7056 --- /dev/null +++ b/db/migrate/20180212123810_remove_epp_sessions_registrar_id.rb @@ -0,0 +1,5 @@ +class RemoveEppSessionsRegistrarId < ActiveRecord::Migration + def change + remove_column :epp_sessions, :registrar_id, :integer + end +end diff --git a/db/structure.sql b/db/structure.sql index a6f29a47e..f7fdc5148 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -1053,7 +1053,6 @@ CREATE TABLE epp_sessions ( session_id character varying NOT NULL, created_at timestamp without time zone, updated_at timestamp without time zone, - registrar_id integer, user_id integer ); @@ -5086,3 +5085,5 @@ INSERT INTO schema_migrations (version) VALUES ('20180207071528'); INSERT INTO schema_migrations (version) VALUES ('20180207072139'); +INSERT INTO schema_migrations (version) VALUES ('20180212123810'); + diff --git a/lib/tasks/dev.rake b/lib/tasks/dev.rake index d0c855903..f4b133ed1 100644 --- a/lib/tasks/dev.rake +++ b/lib/tasks/dev.rake @@ -51,7 +51,6 @@ namespace :dev do epp_session = EppSession.new epp_session.session_id = 'test' - epp_session.registrar = registrar epp_session.user = api_user epp_session.save! diff --git a/spec/factories/epp_session.rb b/spec/factories/epp_session.rb index 20e3afc45..296368a92 100644 --- a/spec/factories/epp_session.rb +++ b/spec/factories/epp_session.rb @@ -1,7 +1,6 @@ FactoryBot.define do factory :epp_session do sequence(:session_id) { |n| "test#{n}" } - registrar association :user, factory: :api_user end end diff --git a/spec/requests/epp/contact/create/ident_spec.rb b/spec/requests/epp/contact/create/ident_spec.rb index cdf457002..5a9535187 100644 --- a/spec/requests/epp/contact/create/ident_spec.rb +++ b/spec/requests/epp/contact/create/ident_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe 'EPP contact:create' do let(:registrar) { create(:registrar) } let(:user) { create(:api_user_epp, registrar: registrar) } - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request) { post '/epp/command/create', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } before do diff --git a/spec/requests/epp/contact/create/phone_spec.rb b/spec/requests/epp/contact/create/phone_spec.rb index 3c7796659..1b55f6407 100644 --- a/spec/requests/epp/contact/create/phone_spec.rb +++ b/spec/requests/epp/contact/create/phone_spec.rb @@ -4,7 +4,7 @@ require_relative '../shared/phone' RSpec.describe 'EPP contact:create' do let(:registrar) { create(:registrar) } let(:user) { create(:api_user_epp, registrar: registrar) } - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request) { post '/epp/command/create', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let(:request_xml) { <<-XML diff --git a/spec/requests/epp/contact/create_spec.rb b/spec/requests/epp/contact/create_spec.rb index 8b4b14794..3d72e3eda 100644 --- a/spec/requests/epp/contact/create_spec.rb +++ b/spec/requests/epp/contact/create_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe 'EPP contact:create' do let(:registrar) { create(:registrar) } let(:user) { create(:api_user_epp, registrar: registrar) } - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request_xml_with_address) { ' diff --git a/spec/requests/epp/contact/delete/used_spec.rb b/spec/requests/epp/contact/delete/used_spec.rb index e37d30173..663065ca5 100644 --- a/spec/requests/epp/contact/delete/used_spec.rb +++ b/spec/requests/epp/contact/delete/used_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe 'EPP contact:delete' do - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:user) { create(:api_user, registrar: registrar) } let(:registrar) { create(:registrar) } let!(:registrant) { create(:registrant, registrar: registrar, code: 'TEST') } diff --git a/spec/requests/epp/contact/info_spec.rb b/spec/requests/epp/contact/info_spec.rb index a16a235a8..0468e097a 100644 --- a/spec/requests/epp/contact/info_spec.rb +++ b/spec/requests/epp/contact/info_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe 'EPP contact:update' do let(:registrar) { create(:registrar) } let(:user) { create(:api_user_epp, registrar: registrar) } - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request_xml) { ' diff --git a/spec/requests/epp/contact/update/ident_spec.rb b/spec/requests/epp/contact/update/ident_spec.rb index ec25d1c8c..ed42d129f 100644 --- a/spec/requests/epp/contact/update/ident_spec.rb +++ b/spec/requests/epp/contact/update/ident_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' RSpec.describe 'EPP contact:update' do let(:registrar) { create(:registrar) } let(:user) { create(:api_user_epp, registrar: registrar) } - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:ident) { contact.identifier } let(:request) { post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let(:request_xml) { <<-XML diff --git a/spec/requests/epp/contact/update/phone_spec.rb b/spec/requests/epp/contact/update/phone_spec.rb index 696725ab4..57109367d 100644 --- a/spec/requests/epp/contact/update/phone_spec.rb +++ b/spec/requests/epp/contact/update/phone_spec.rb @@ -4,7 +4,7 @@ require_relative '../shared/phone' RSpec.describe 'EPP contact:update' do let(:registrar) { create(:registrar) } let(:user) { create(:api_user_epp, registrar: registrar) } - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let!(:contact) { create(:contact, code: 'TEST') } let(:request) { post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let(:request_xml) { <<-XML diff --git a/spec/requests/epp/contact/update_spec.rb b/spec/requests/epp/contact/update_spec.rb index 3d40e8699..c5344bae2 100644 --- a/spec/requests/epp/contact/update_spec.rb +++ b/spec/requests/epp/contact/update_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe 'EPP contact:update' do let(:registrar) { create(:registrar) } let(:user) { create(:api_user_epp, registrar: registrar) } - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request_xml_with_address) { ' diff --git a/spec/requests/epp/domain/create/account_balance_spec.rb b/spec/requests/epp/domain/create/account_balance_spec.rb index 43edae1aa..e27477b3a 100644 --- a/spec/requests/epp/domain/create/account_balance_spec.rb +++ b/spec/requests/epp/domain/create/account_balance_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:create', settings: false do - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request) { post '/epp/command/create', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:contact) { create(:contact, code: 'test') } diff --git a/spec/requests/epp/domain/create/default_period_spec.rb b/spec/requests/epp/domain/create/default_period_spec.rb index fd807bef0..c4708f5cb 100644 --- a/spec/requests/epp/domain/create/default_period_spec.rb +++ b/spec/requests/epp/domain/create/default_period_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:create', settings: false do - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request) { post '/epp/command/create', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:contact) { create(:contact, code: 'test') } diff --git a/spec/requests/epp/domain/create/optional_nameserver_spec.rb b/spec/requests/epp/domain/create/optional_nameserver_spec.rb index 83ab1df44..409307373 100644 --- a/spec/requests/epp/domain/create/optional_nameserver_spec.rb +++ b/spec/requests/epp/domain/create/optional_nameserver_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:create', settings: false do - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request) { post '/epp/command/create', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:registrar) { create(:registrar_with_unlimited_balance) } let!(:user) { create(:api_user_epp, registrar: registrar) } diff --git a/spec/requests/epp/domain/create/period_spec.rb b/spec/requests/epp/domain/create/period_spec.rb index f9550002e..15f49d41f 100644 --- a/spec/requests/epp/domain/create/period_spec.rb +++ b/spec/requests/epp/domain/create/period_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:create', settings: false do - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request) { post '/epp/command/create', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:contact) { create(:contact, code: 'test') } diff --git a/spec/requests/epp/domain/create/price_spec.rb b/spec/requests/epp/domain/create/price_spec.rb index 2b2aa789e..e065ba3bb 100644 --- a/spec/requests/epp/domain/create/price_spec.rb +++ b/spec/requests/epp/domain/create/price_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:create', settings: false do - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request) { post '/epp/command/create', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:contact) { create(:contact, code: 'test') } diff --git a/spec/requests/epp/domain/create/required_nameserver_spec.rb b/spec/requests/epp/domain/create/required_nameserver_spec.rb index 3c72c58a5..7657075b7 100644 --- a/spec/requests/epp/domain/create/required_nameserver_spec.rb +++ b/spec/requests/epp/domain/create/required_nameserver_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:create', settings: false do - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request) { post '/epp/command/create', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:registrar) { create(:registrar_with_unlimited_balance) } let!(:user) { create(:api_user_epp, registrar: registrar) } diff --git a/spec/requests/epp/domain/delete/discarded_spec.rb b/spec/requests/epp/domain/delete/discarded_spec.rb index 1cce794bc..55e74d965 100644 --- a/spec/requests/epp/domain/delete/discarded_spec.rb +++ b/spec/requests/epp/domain/delete/discarded_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:delete' do let(:registrar) { create(:registrar) } let(:user) { create(:api_user_epp, registrar: registrar) } - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request_xml) { <<-XML diff --git a/spec/requests/epp/domain/renew/account_balance_spec.rb b/spec/requests/epp/domain/renew/account_balance_spec.rb index 128c60070..98d088075 100644 --- a/spec/requests/epp/domain/renew/account_balance_spec.rb +++ b/spec/requests/epp/domain/renew/account_balance_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:renew' do - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request) { post '/epp/command/renew', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:zone) { create(:zone, origin: 'test') } diff --git a/spec/requests/epp/domain/renew/default_period_spec.rb b/spec/requests/epp/domain/renew/default_period_spec.rb index 2f09acbcc..fb4961e9d 100644 --- a/spec/requests/epp/domain/renew/default_period_spec.rb +++ b/spec/requests/epp/domain/renew/default_period_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:renew', settings: false do - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request) { post '/epp/command/renew', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:zone) { create(:zone, origin: 'test') } diff --git a/spec/requests/epp/domain/renew/expire_time_spec.rb b/spec/requests/epp/domain/renew/expire_time_spec.rb index 90cad850e..d2b6dce5f 100644 --- a/spec/requests/epp/domain/renew/expire_time_spec.rb +++ b/spec/requests/epp/domain/renew/expire_time_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:renew' do - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request) { post '/epp/command/renew', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:registrar) { create(:registrar_with_unlimited_balance) } diff --git a/spec/requests/epp/domain/renew/max_expire_time_spec.rb b/spec/requests/epp/domain/renew/max_expire_time_spec.rb index 211af8685..5983fb02c 100644 --- a/spec/requests/epp/domain/renew/max_expire_time_spec.rb +++ b/spec/requests/epp/domain/renew/max_expire_time_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:renew' do - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:user) { create(:api_user_epp, registrar: registrar) } let(:registrar) { create(:registrar_with_unlimited_balance) } let!(:zone) { create(:zone, origin: 'test') } diff --git a/spec/requests/epp/domain/renew/period_spec.rb b/spec/requests/epp/domain/renew/period_spec.rb index 6c5167d26..3704519ca 100644 --- a/spec/requests/epp/domain/renew/period_spec.rb +++ b/spec/requests/epp/domain/renew/period_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:renew', settings: false do - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request) { post '/epp/command/renew', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:zone) { create(:zone, origin: 'test') } diff --git a/spec/requests/epp/domain/renew/price_spec.rb b/spec/requests/epp/domain/renew/price_spec.rb index 4a9c65ff3..02603ca60 100644 --- a/spec/requests/epp/domain/renew/price_spec.rb +++ b/spec/requests/epp/domain/renew/price_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:renew', settings: false do - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request) { post '/epp/command/renew', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:user) { create(:api_user_epp, registrar: registrar) } let!(:zone) { create(:zone, origin: 'test') } diff --git a/spec/requests/epp/domain/transfer/discarded_spec.rb b/spec/requests/epp/domain/transfer/discarded_spec.rb index d279bf003..26596d993 100644 --- a/spec/requests/epp/domain/transfer/discarded_spec.rb +++ b/spec/requests/epp/domain/transfer/discarded_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:transfer' do let(:registrar) { create(:registrar) } let(:user) { create(:api_user_epp, registrar: registrar) } - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request_xml) { <<-XML diff --git a/spec/requests/epp/domain/update/discarded_spec.rb b/spec/requests/epp/domain/update/discarded_spec.rb index 29ae1f44c..4a31b7d10 100644 --- a/spec/requests/epp/domain/update/discarded_spec.rb +++ b/spec/requests/epp/domain/update/discarded_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:update' do let(:registrar) { create(:registrar) } let(:user) { create(:api_user_epp, registrar: registrar) } - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request_xml) { <<-XML diff --git a/spec/requests/epp/domain/update/nameserver_add_spec.rb b/spec/requests/epp/domain/update/nameserver_add_spec.rb index 8a00d585d..2acc462f6 100644 --- a/spec/requests/epp/domain/update/nameserver_add_spec.rb +++ b/spec/requests/epp/domain/update/nameserver_add_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:update' do let(:registrar) { create(:registrar) } let(:user) { create(:api_user_epp, registrar: registrar) } - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let!(:domain) { create(:domain, name: 'test.com') } subject(:response_xml) { Nokogiri::XML(response.body) } subject(:response_code) { response_xml.xpath('//xmlns:result').first['code'] } diff --git a/spec/requests/epp/domain/update/nameserver_remove_spec.rb b/spec/requests/epp/domain/update/nameserver_remove_spec.rb index 3796d2e12..129d1ce55 100644 --- a/spec/requests/epp/domain/update/nameserver_remove_spec.rb +++ b/spec/requests/epp/domain/update/nameserver_remove_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:update' do let(:registrar) { create(:registrar) } let(:user) { create(:api_user_epp, registrar: registrar) } - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } subject(:response_xml) { Nokogiri::XML(response.body) } subject(:response_code) { response_xml.xpath('//xmlns:result').first['code'] } subject(:response_description) { response_xml.css('result msg').text } 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 index 1c0c8eb5b..0a5f3b245 100644 --- 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 @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:update' do let(:registrar) { create(:registrar) } let(:user) { create(:api_user_epp, registrar: registrar) } - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request) { post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:domain) { create(:domain, name: 'test.com', registrant: registrant) } diff --git a/spec/requests/epp/domain/update/registrant_change/verified_spec.rb b/spec/requests/epp/domain/update/registrant_change/verified_spec.rb index e94923644..c81d46f66 100644 --- a/spec/requests/epp/domain/update/registrant_change/verified_spec.rb +++ b/spec/requests/epp/domain/update/registrant_change/verified_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:update' do let(:registrar) { create(:registrar) } let(:user) { create(:api_user_epp, registrar: registrar) } - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request) { post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let!(:registrant) { create(:registrant, code: 'old-code') } let!(:domain) { create(:domain, name: 'test.com', registrant: registrant) } diff --git a/spec/requests/epp/domain/update/status_spec.rb b/spec/requests/epp/domain/update/status_spec.rb index df5506fb6..f5cb638ad 100644 --- a/spec/requests/epp/domain/update/status_spec.rb +++ b/spec/requests/epp/domain/update/status_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe 'EPP domain:update' do let(:registrar) { create(:registrar) } let(:user) { create(:api_user_epp, registrar: registrar) } - let(:session_id) { create(:epp_session, user: user, registrar: registrar).session_id } + let(:session_id) { create(:epp_session, user: user).session_id } let(:request) { post '/epp/command/update', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" } let(:request_xml) { <<-XML diff --git a/test/fixtures/epp_sessions.yml b/test/fixtures/epp_sessions.yml index 9d824cf1c..cc40c8211 100644 --- a/test/fixtures/epp_sessions.yml +++ b/test/fixtures/epp_sessions.yml @@ -1,9 +1,7 @@ api_bestnames: session_id: 1 user: api_bestnames - registrar: bestnames api_goodnames: session_id: 2 user: api_goodnames - registrar: goodnames From 5a101ddaf42b046e57120b4ef8ec0e2aad2d01cc Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 12 Feb 2018 17:50:48 +0200 Subject: [PATCH 020/104] Replace index with constraint #700 --- ...p_sessions_session_id_unique_constraint.rb | 13 +++++++++++++ ...ve_epp_sessions_session_id_unique_index.rb | 5 +++++ db/structure.sql | 19 ++++++++++++------- 3 files changed, 30 insertions(+), 7 deletions(-) create mode 100644 db/migrate/20180212152810_add_epp_sessions_session_id_unique_constraint.rb create mode 100644 db/migrate/20180212154731_remove_epp_sessions_session_id_unique_index.rb diff --git a/db/migrate/20180212152810_add_epp_sessions_session_id_unique_constraint.rb b/db/migrate/20180212152810_add_epp_sessions_session_id_unique_constraint.rb new file mode 100644 index 000000000..7eac99e63 --- /dev/null +++ b/db/migrate/20180212152810_add_epp_sessions_session_id_unique_constraint.rb @@ -0,0 +1,13 @@ +class AddEppSessionsSessionIdUniqueConstraint < ActiveRecord::Migration + def up + execute <<-SQL + ALTER TABLE epp_sessions ADD CONSTRAINT unique_session_id UNIQUE (session_id) + SQL + end + + def down + execute <<-SQL + ALTER TABLE epp_sessions DROP CONSTRAINT unique_session_id + SQL + end +end diff --git a/db/migrate/20180212154731_remove_epp_sessions_session_id_unique_index.rb b/db/migrate/20180212154731_remove_epp_sessions_session_id_unique_index.rb new file mode 100644 index 000000000..47fb20157 --- /dev/null +++ b/db/migrate/20180212154731_remove_epp_sessions_session_id_unique_index.rb @@ -0,0 +1,5 @@ +class RemoveEppSessionsSessionIdUniqueIndex < ActiveRecord::Migration + def change + remove_index :epp_sessions, name: :index_epp_sessions_on_session_id + end +end diff --git a/db/structure.sql b/db/structure.sql index f7fdc5148..e743e42f6 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -3634,6 +3634,14 @@ ALTER TABLE ONLY contacts ADD CONSTRAINT unique_contact_code UNIQUE (code); +-- +-- Name: unique_session_id; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- + +ALTER TABLE ONLY epp_sessions + ADD CONSTRAINT unique_session_id UNIQUE (session_id); + + -- -- Name: unique_zone_origin; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -3885,13 +3893,6 @@ CREATE INDEX index_domains_on_registrar_id ON domains USING btree (registrar_id) CREATE INDEX index_domains_on_statuses ON domains USING gin (statuses); --- --- Name: index_epp_sessions_on_session_id; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE UNIQUE INDEX index_epp_sessions_on_session_id ON epp_sessions USING btree (session_id); - - -- -- Name: index_epp_sessions_on_updated_at; Type: INDEX; Schema: public; Owner: -; Tablespace: -- @@ -5087,3 +5088,7 @@ INSERT INTO schema_migrations (version) VALUES ('20180207072139'); INSERT INTO schema_migrations (version) VALUES ('20180212123810'); +INSERT INTO schema_migrations (version) VALUES ('20180212152810'); + +INSERT INTO schema_migrations (version) VALUES ('20180212154731'); + From e2c90cdd40642d08e4237221b9433ae10b9a0c6a Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 12 Feb 2018 18:04:45 +0200 Subject: [PATCH 021/104] Add EPP session tests #700 --- test/fixtures/epp_sessions.yml | 4 +- test/integration/epp/session/login_test.rb | 60 +++++++++++++++++++++ test/integration/epp/session/logout_test.rb | 29 ++++++++++ 3 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 test/integration/epp/session/login_test.rb create mode 100644 test/integration/epp/session/logout_test.rb diff --git a/test/fixtures/epp_sessions.yml b/test/fixtures/epp_sessions.yml index cc40c8211..6f1173ca9 100644 --- a/test/fixtures/epp_sessions.yml +++ b/test/fixtures/epp_sessions.yml @@ -1,7 +1,7 @@ api_bestnames: - session_id: 1 + session_id: api_bestnames user: api_bestnames api_goodnames: - session_id: 2 + session_id: api_goodnames user: api_goodnames diff --git a/test/integration/epp/session/login_test.rb b/test/integration/epp/session/login_test.rb new file mode 100644 index 000000000..2be7e09a5 --- /dev/null +++ b/test/integration/epp/session/login_test.rb @@ -0,0 +1,60 @@ +require 'test_helper' + +class EppLoginTest < ActionDispatch::IntegrationTest + def test_correct_credentials + request_xml = <<-XML + + + + + test_bestnames + testtest + + 1.0 + en + + + https://epp.tld.ee/schema/domain-eis-1.0.xsd + https://epp.tld.ee/schema/contact-ee-1.1.xsd + urn:ietf:params:xml:ns:host-1.0 + urn:ietf:params:xml:ns:keyrelay-1.0 + + + + + XML + + post '/epp/session/login', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=new_session_id' } + assert EppSession.find_by(session_id: 'new_session_id') + assert_equal users(:api_bestnames), EppSession.find_by(session_id: 'new_session_id').user + assert Nokogiri::XML(response.body).at_css('result[code="1000"]') + assert_equal 1, Nokogiri::XML(response.body).css('result').size + end + + def test_wrong_credentials + request_xml = <<-XML + + + + + non-existent + valid-but-wrong + + 1.0 + en + + + https://epp.tld.ee/schema/domain-eis-1.0.xsd + https://epp.tld.ee/schema/contact-ee-1.1.xsd + urn:ietf:params:xml:ns:host-1.0 + urn:ietf:params:xml:ns:keyrelay-1.0 + + + + + XML + + post '/epp/session/login', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=any_random_string' } + assert Nokogiri::XML(response.body).at_css('result[code="2501"]') + end +end diff --git a/test/integration/epp/session/logout_test.rb b/test/integration/epp/session/logout_test.rb new file mode 100644 index 000000000..7237d4073 --- /dev/null +++ b/test/integration/epp/session/logout_test.rb @@ -0,0 +1,29 @@ +require 'test_helper' + +class EppLogoutTest < ActionDispatch::IntegrationTest + def setup + @request_xml = <<-XML + + + + + + + XML + + post '/epp/session/logout', { frame: @request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + end + + def test_success_response + assert Nokogiri::XML(response.body).at_css('result[code="1500"]') + assert_equal 1, Nokogiri::XML(response.body).css('result').size + end + + def test_ends_current_session + assert_nil EppSession.find_by(session_id: 'api_bestnames') + end + + def test_keeps_other_sessions_intact + assert EppSession.find_by(session_id: 'api_goodnames') + end +end From 40c12380ee5e6cc9ed7928395e2b173f1e320ed4 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 13 Feb 2018 19:52:34 +0200 Subject: [PATCH 022/104] Improve readability #700 --- test/models/epp_session_test.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/models/epp_session_test.rb b/test/models/epp_session_test.rb index 98ae993f5..a6aca3eca 100644 --- a/test/models/epp_session_test.rb +++ b/test/models/epp_session_test.rb @@ -9,13 +9,13 @@ class EppSessionTest < ActiveSupport::TestCase assert @epp_session.valid? end - def test_session_id_presence_validation + def test_invalid_without_session_id @epp_session.session_id = nil @epp_session.validate assert @epp_session.invalid? end - def test_user_presence_validation + def test_invalid_without_user @epp_session.user = nil @epp_session.validate assert @epp_session.invalid? From 4ec4e50334169230ce6c6742a7a2fd81e757a5a7 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 13 Feb 2018 20:16:44 +0200 Subject: [PATCH 023/104] Ensure unique EPP session id #700 --- app/models/epp_session.rb | 2 +- test/models/epp_session_test.rb | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/app/models/epp_session.rb b/app/models/epp_session.rb index dd97a91a9..3d489e567 100644 --- a/app/models/epp_session.rb +++ b/app/models/epp_session.rb @@ -2,5 +2,5 @@ class EppSession < ActiveRecord::Base belongs_to :user, required: true belongs_to :registrar - validates :session_id, presence: true + validates :session_id, uniqueness: true, presence: true end diff --git a/test/models/epp_session_test.rb b/test/models/epp_session_test.rb index a6aca3eca..497bf441e 100644 --- a/test/models/epp_session_test.rb +++ b/test/models/epp_session_test.rb @@ -20,4 +20,18 @@ class EppSessionTest < ActiveSupport::TestCase @epp_session.validate assert @epp_session.invalid? end + + def test_invalid_if_persisted_record_with_the_same_session_id_exists + epp_session = EppSession.new(session_id: @epp_session.session_id, user: @epp_session.user) + epp_session.validate + assert epp_session.invalid? + end + + def test_database_session_id_unique_constraint + epp_session = EppSession.new(session_id: @epp_session.session_id, user: @epp_session.user) + + assert_raises ActiveRecord::RecordNotUnique do + epp_session.save(validate: false) + end + end end From 3c274ba8d4d24ef46ac698c46214c3024da726bc Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 13 Feb 2018 20:18:52 +0200 Subject: [PATCH 024/104] Remove invalid association Completes fa6edab62ac7a4e9d1b8a7b79c89bbbb7cb24b45 #700 --- app/models/epp_session.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/models/epp_session.rb b/app/models/epp_session.rb index 3d489e567..0a1a146a2 100644 --- a/app/models/epp_session.rb +++ b/app/models/epp_session.rb @@ -1,6 +1,5 @@ class EppSession < ActiveRecord::Base belongs_to :user, required: true - belongs_to :registrar validates :session_id, uniqueness: true, presence: true end From 1f66f1323ab217d4ec7c622a7fc2f6dbb2f211ac Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 13 Feb 2018 20:45:30 +0200 Subject: [PATCH 025/104] Add NOT NULL constraint #700 --- ...20180213183818_change_epp_sessions_user_id_to_not_null.rb | 5 +++++ db/structure.sql | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20180213183818_change_epp_sessions_user_id_to_not_null.rb diff --git a/db/migrate/20180213183818_change_epp_sessions_user_id_to_not_null.rb b/db/migrate/20180213183818_change_epp_sessions_user_id_to_not_null.rb new file mode 100644 index 000000000..fbe685b33 --- /dev/null +++ b/db/migrate/20180213183818_change_epp_sessions_user_id_to_not_null.rb @@ -0,0 +1,5 @@ +class ChangeEppSessionsUserIdToNotNull < ActiveRecord::Migration + def change + change_column_null :epp_sessions, :user_id, false + end +end diff --git a/db/structure.sql b/db/structure.sql index e743e42f6..449ec44f8 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -1053,7 +1053,7 @@ CREATE TABLE epp_sessions ( session_id character varying NOT NULL, created_at timestamp without time zone, updated_at timestamp without time zone, - user_id integer + user_id integer NOT NULL ); @@ -5092,3 +5092,5 @@ INSERT INTO schema_migrations (version) VALUES ('20180212152810'); INSERT INTO schema_migrations (version) VALUES ('20180212154731'); +INSERT INTO schema_migrations (version) VALUES ('20180213183818'); + From fc6a2df2c53ca2f349a752953ee69b03107735e8 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 13 Feb 2018 20:46:08 +0200 Subject: [PATCH 026/104] Add database constraint test Having session_id constraints at the database level is crucial #700 --- test/models/epp_session_test.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/models/epp_session_test.rb b/test/models/epp_session_test.rb index 497bf441e..1a0e9e114 100644 --- a/test/models/epp_session_test.rb +++ b/test/models/epp_session_test.rb @@ -27,6 +27,8 @@ class EppSessionTest < ActiveSupport::TestCase assert epp_session.invalid? end + # Having session_id constraints at the database level is crucial + def test_database_session_id_unique_constraint epp_session = EppSession.new(session_id: @epp_session.session_id, user: @epp_session.user) @@ -34,4 +36,11 @@ class EppSessionTest < ActiveSupport::TestCase epp_session.save(validate: false) end end + + def test_database_session_id_not_null_constraint + @epp_session.session_id = nil + assert_raises ActiveRecord::StatementInvalid do + @epp_session.save(validate: false) + end + end end From 6f1f121e9282d6e608c274c066ed51a417ef3ad8 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Tue, 13 Feb 2018 23:50:22 +0200 Subject: [PATCH 027/104] Remove unused view #700 --- app/views/epp/sessions/login_fail.xml.builder | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 app/views/epp/sessions/login_fail.xml.builder diff --git a/app/views/epp/sessions/login_fail.xml.builder b/app/views/epp/sessions/login_fail.xml.builder deleted file mode 100644 index 5e2e99162..000000000 --- a/app/views/epp/sessions/login_fail.xml.builder +++ /dev/null @@ -1,9 +0,0 @@ -xml.epp_head do - xml.response do - xml.result('code' => '2501') do - xml.msg(@msg || 'Authentication error; server closing connection') - end - - render('epp/shared/trID', builder: xml) - end -end From 2ce4fa9ce091035c9483500e8eeee7a691d9f23a Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 14 Feb 2018 01:14:59 +0200 Subject: [PATCH 028/104] Document test #700 --- test/integration/epp/session/login_test.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/integration/epp/session/login_test.rb b/test/integration/epp/session/login_test.rb index 2be7e09a5..c268ab1eb 100644 --- a/test/integration/epp/session/login_test.rb +++ b/test/integration/epp/session/login_test.rb @@ -31,6 +31,10 @@ class EppLoginTest < ActionDispatch::IntegrationTest assert_equal 1, Nokogiri::XML(response.body).css('result').size end + def test_already_logged_in + assert true # Handled by mod_epp + end + def test_wrong_credentials request_xml = <<-XML From ec43586ef48a3cbae37e1affb3026296af3e5c24 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 14 Feb 2018 01:17:51 +0200 Subject: [PATCH 029/104] Require authentication on EPP logout #700 --- app/controllers/epp/sessions_controller.rb | 9 +++++ app/controllers/epp_controller.rb | 10 +++++ test/integration/epp/session/logout_test.rb | 42 ++++++++++++--------- 3 files changed, 44 insertions(+), 17 deletions(-) diff --git a/app/controllers/epp/sessions_controller.rb b/app/controllers/epp/sessions_controller.rb index e4efc581d..69e549d21 100644 --- a/app/controllers/epp/sessions_controller.rb +++ b/app/controllers/epp/sessions_controller.rb @@ -124,6 +124,15 @@ class Epp::SessionsController < EppController end def logout + unless signed_in? + epp_errors << { + code: 2201, + msg: 'Authorization error' + } + handle_errors + return + end + @api_user = current_user # cache current_user for logging epp_session.destroy response.headers['X-EPP-Returncode'] = '1500' diff --git a/app/controllers/epp_controller.rb b/app/controllers/epp_controller.rb index 07d3286d0..1bd587c23 100644 --- a/app/controllers/epp_controller.rb +++ b/app/controllers/epp_controller.rb @@ -397,4 +397,14 @@ class EppController < ApplicationController name = self.class.to_s.sub("Epp::","").sub("Controller","").underscore.singularize instance_variable_get("@#{name}") end + + private + + def signed_in? + epp_session + end + + def epp_session_id + cookies[:session] + end end diff --git a/test/integration/epp/session/logout_test.rb b/test/integration/epp/session/logout_test.rb index 7237d4073..75b26f2f3 100644 --- a/test/integration/epp/session/logout_test.rb +++ b/test/integration/epp/session/logout_test.rb @@ -1,8 +1,31 @@ require 'test_helper' class EppLogoutTest < ActionDispatch::IntegrationTest - def setup - @request_xml = <<-XML + def test_success_response + post '/epp/session/logout', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + assert Nokogiri::XML(response.body).at_css('result[code="1500"]') + assert_equal 1, Nokogiri::XML(response.body).css('result').size + end + + def test_ends_current_session + post '/epp/session/logout', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + assert_nil EppSession.find_by(session_id: 'api_bestnames') + end + + def test_keeps_other_sessions_intact + post '/epp/session/logout', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + assert EppSession.find_by(session_id: 'api_goodnames') + end + + def test_anonymous_user + post '/epp/session/logout', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=non-existent' } + assert Nokogiri::XML(response.body).at_css('result[code="2201"]') + end + + private + + def request_xml + <<-XML @@ -10,20 +33,5 @@ class EppLogoutTest < ActionDispatch::IntegrationTest XML - - post '/epp/session/logout', { frame: @request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } - end - - def test_success_response - assert Nokogiri::XML(response.body).at_css('result[code="1500"]') - assert_equal 1, Nokogiri::XML(response.body).css('result').size - end - - def test_ends_current_session - assert_nil EppSession.find_by(session_id: 'api_bestnames') - end - - def test_keeps_other_sessions_intact - assert EppSession.find_by(session_id: 'api_goodnames') end end From b37251f9bb0b15244aca5b927a7b32ad9507bbcb Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 14 Feb 2018 01:20:50 +0200 Subject: [PATCH 030/104] Refactor #700 --- app/controllers/epp/sessions_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/epp/sessions_controller.rb b/app/controllers/epp/sessions_controller.rb index 69e549d21..b9884b582 100644 --- a/app/controllers/epp/sessions_controller.rb +++ b/app/controllers/epp/sessions_controller.rb @@ -92,7 +92,7 @@ class Epp::SessionsController < EppController end epp_session = EppSession.new - epp_session.session_id = cookies[:session] + epp_session.session_id = epp_session_id epp_session.user = @api_user epp_session.save! render_epp_response('login_success') From c97e65139859ebabaebfc8bfb4e98ca5ff98b211 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 14 Feb 2018 01:22:24 +0200 Subject: [PATCH 031/104] Improve readability #700 --- app/controllers/epp_controller.rb | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/controllers/epp_controller.rb b/app/controllers/epp_controller.rb index 1bd587c23..a0148e744 100644 --- a/app/controllers/epp_controller.rb +++ b/app/controllers/epp_controller.rb @@ -95,12 +95,11 @@ class EppController < ApplicationController def update_epp_session iptables_counter_update - e_s = epp_session - return if e_s.new_record? + return if epp_session.new_record? - if !Rails.env.development? && (e_s.updated_at < Time.zone.now - 5.minutes) + if !Rails.env.development? && (epp_session.updated_at < Time.zone.now - 5.minutes) @api_user = current_user # cache current_user for logging - e_s.destroy + epp_session.destroy response.headers['X-EPP-Returncode'] = '1500' epp_errors << { @@ -110,7 +109,7 @@ class EppController < ApplicationController handle_errors and return else - e_s.update_column(:updated_at, Time.zone.now) + epp_session.update_column(:updated_at, Time.zone.now) end end From 0ee32549f0da2330fa36c743d42c1be5b6035783 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 14 Feb 2018 01:24:12 +0200 Subject: [PATCH 032/104] Use standard API to read cookies #700 --- app/controllers/epp_controller.rb | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/controllers/epp_controller.rb b/app/controllers/epp_controller.rb index a0148e744..16d63de83 100644 --- a/app/controllers/epp_controller.rb +++ b/app/controllers/epp_controller.rb @@ -86,11 +86,8 @@ class EppController < ApplicationController @params_hash ||= Hash.from_xml(params[:frame]).with_indifferent_access end - # SESSION MANAGEMENT def epp_session - cookies # Probably does some initialization - cookie = env['rack.request.cookie_hash'] || {} - EppSession.find_or_initialize_by(session_id: cookie['session']) + EppSession.find_by(session_id: epp_session_id) end def update_epp_session From cd037f7faefd0478515d5d45e84fead9e8db4803 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 14 Feb 2018 01:25:38 +0200 Subject: [PATCH 033/104] Do not update EPP session updated_at if not authenticated #700 --- app/controllers/epp_controller.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/controllers/epp_controller.rb b/app/controllers/epp_controller.rb index 16d63de83..ba46032c8 100644 --- a/app/controllers/epp_controller.rb +++ b/app/controllers/epp_controller.rb @@ -8,7 +8,7 @@ class EppController < ApplicationController before_action :latin_only before_action :validate_against_schema before_action :validate_request - before_action :update_epp_session + before_action :update_epp_session, if: 'signed_in?' around_action :catch_epp_errors @@ -92,7 +92,6 @@ class EppController < ApplicationController def update_epp_session iptables_counter_update - return if epp_session.new_record? if !Rails.env.development? && (epp_session.updated_at < Time.zone.now - 5.minutes) @api_user = current_user # cache current_user for logging From 0c5284e8f965781f340139c13c9e8cba4669e95b Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 14 Feb 2018 01:37:34 +0200 Subject: [PATCH 034/104] Simplify method #700 --- app/controllers/epp_controller.rb | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/controllers/epp_controller.rb b/app/controllers/epp_controller.rb index ba46032c8..440c731b2 100644 --- a/app/controllers/epp_controller.rb +++ b/app/controllers/epp_controller.rb @@ -110,12 +110,8 @@ class EppController < ApplicationController end def current_user - @current_user ||= epp_session.user - # by default PaperTrail uses before filter and at that - # time current_user is not yet present - ::PaperTrail.whodunnit = user_log_str(@current_user) - ::PaperSession.session = epp_session.session_id - @current_user + return unless signed_in? + epp_session.user end # ERROR + RESPONSE HANDLING From 66b03e6d11ae5b658026e98b5b470f34eb6d2b26 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 14 Feb 2018 01:40:03 +0200 Subject: [PATCH 035/104] Hide method #700 --- app/controllers/epp_controller.rb | 38 +++++++++++++++---------------- doc/controllers_complete.svg | 1 - 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/app/controllers/epp_controller.rb b/app/controllers/epp_controller.rb index 440c731b2..68ca93b23 100644 --- a/app/controllers/epp_controller.rb +++ b/app/controllers/epp_controller.rb @@ -90,25 +90,6 @@ class EppController < ApplicationController EppSession.find_by(session_id: epp_session_id) end - def update_epp_session - iptables_counter_update - - if !Rails.env.development? && (epp_session.updated_at < Time.zone.now - 5.minutes) - @api_user = current_user # cache current_user for logging - epp_session.destroy - response.headers['X-EPP-Returncode'] = '1500' - - epp_errors << { - msg: t('session_timeout'), - code: '2201' - } - - handle_errors and return - else - epp_session.update_column(:updated_at, Time.zone.now) - end - end - def current_user return unless signed_in? epp_session.user @@ -398,4 +379,23 @@ class EppController < ApplicationController def epp_session_id cookies[:session] end + + def update_epp_session + iptables_counter_update + + if !Rails.env.development? && (epp_session.updated_at < Time.zone.now - 5.minutes) + @api_user = current_user # cache current_user for logging + epp_session.destroy + response.headers['X-EPP-Returncode'] = '1500' + + epp_errors << { + msg: t('session_timeout'), + code: '2201' + } + + handle_errors and return + else + epp_session.update_column(:updated_at, Time.zone.now) + end + end end diff --git a/doc/controllers_complete.svg b/doc/controllers_complete.svg index 61ca0ec5f..9a0028bb1 100644 --- a/doc/controllers_complete.svg +++ b/doc/controllers_complete.svg @@ -681,7 +681,6 @@ render_epp_response requires requires_attribute -update_epp_session validate_request write_to_epp_log xml_attrs_present? From 17fefcf5921a805be974f27e646466e14b5fde4a Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 14 Feb 2018 02:13:55 +0200 Subject: [PATCH 036/104] Ensure EPP session id is passed --- app/controllers/epp_controller.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/controllers/epp_controller.rb b/app/controllers/epp_controller.rb index 68ca93b23..91296aa42 100644 --- a/app/controllers/epp_controller.rb +++ b/app/controllers/epp_controller.rb @@ -4,6 +4,7 @@ class EppController < ApplicationController protect_from_forgery with: :null_session skip_before_action :verify_authenticity_token + before_action :ensure_session_id_passed before_action :generate_svtrid before_action :latin_only before_action :validate_against_schema @@ -377,7 +378,11 @@ class EppController < ApplicationController end def epp_session_id - cookies[:session] + cookies[:session] # Passed by mod_epp https://github.com/mod-epp/mod-epp#requestscript-interface + end + + def ensure_session_id_passed + raise 'EPP session id is empty' unless epp_session_id.present? end def update_epp_session From d430092ba217a3d453d446f4d33522a26f0b6288 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 14 Feb 2018 02:24:40 +0200 Subject: [PATCH 037/104] Extract method #700 --- app/controllers/epp_controller.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/controllers/epp_controller.rb b/app/controllers/epp_controller.rb index 91296aa42..8fe93ae4a 100644 --- a/app/controllers/epp_controller.rb +++ b/app/controllers/epp_controller.rb @@ -388,7 +388,7 @@ class EppController < ApplicationController def update_epp_session iptables_counter_update - if !Rails.env.development? && (epp_session.updated_at < Time.zone.now - 5.minutes) + if !Rails.env.development? && session_timeout_reached? @api_user = current_user # cache current_user for logging epp_session.destroy response.headers['X-EPP-Returncode'] = '1500' @@ -403,4 +403,9 @@ class EppController < ApplicationController epp_session.update_column(:updated_at, Time.zone.now) end end + + def session_timeout_reached? + timeout = 5.minutes + epp_session.updated_at < (Time.zone.now - timeout) + end end From fc02e4ad8a7e5119a7c0b643ad4c202a736e4ac0 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 14 Feb 2018 02:28:51 +0200 Subject: [PATCH 038/104] Remove environment dependency #700 --- app/controllers/epp_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/epp_controller.rb b/app/controllers/epp_controller.rb index 8fe93ae4a..eee6cef7a 100644 --- a/app/controllers/epp_controller.rb +++ b/app/controllers/epp_controller.rb @@ -388,7 +388,7 @@ class EppController < ApplicationController def update_epp_session iptables_counter_update - if !Rails.env.development? && session_timeout_reached? + if session_timeout_reached? @api_user = current_user # cache current_user for logging epp_session.destroy response.headers['X-EPP-Returncode'] = '1500' From 93055acb3a62da8b71a93e25c81a640639686d45 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 14 Feb 2018 02:42:00 +0200 Subject: [PATCH 039/104] Hide method #700 --- .reek | 2 -- app/controllers/epp/sessions_controller.rb | 16 ++++++++-------- doc/controllers_complete.svg | 1 - 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/.reek b/.reek index e51946a9a..d9ea95353 100644 --- a/.reek +++ b/.reek @@ -34,7 +34,6 @@ UncommunicativeVariableName: - Admin::SettingsController#create - Epp::DomainsController#renew - Epp::DomainsController#update - - Epp::SessionsController#connection_limit_ok? - Epp::SessionsController#login - EppController - EppController#create_full_selectors @@ -172,7 +171,6 @@ DuplicateMethodCall: - Epp::PollsController#ack_poll - Epp::PollsController#poll - Epp::PollsController#req_poll - - Epp::SessionsController#connection_limit_ok? - Epp::SessionsController#ip_white? - Epp::SessionsController#login - Epp::SessionsController#login_params diff --git a/app/controllers/epp/sessions_controller.rb b/app/controllers/epp/sessions_controller.rb index b9884b582..eb460a8d1 100644 --- a/app/controllers/epp/sessions_controller.rb +++ b/app/controllers/epp/sessions_controller.rb @@ -115,14 +115,6 @@ class Epp::SessionsController < EppController true end - def connection_limit_ok? - epp_session_count = EppSession.where(user_id: @api_user.registrar.api_users.ids) - .where('updated_at >= ?', Time.zone.now - 1.second).count - - return false if epp_session_count >= 4 - true - end - def logout unless signed_in? epp_errors << { @@ -151,4 +143,12 @@ class Epp::SessionsController < EppController def resource @api_user end + + def connection_limit_ok? + epp_session_count = EppSession.where(user_id: @api_user.registrar.api_users.ids) + .where('updated_at >= ?', Time.zone.now - 1.second).count + + return false if epp_session_count >= 4 + true + end end diff --git a/doc/controllers_complete.svg b/doc/controllers_complete.svg index 9a0028bb1..68d02cf4a 100644 --- a/doc/controllers_complete.svg +++ b/doc/controllers_complete.svg @@ -71,7 +71,6 @@ Epp::SessionsController -connection_limit_ok? hello ip_white? login From 9b4aa478bf50e638c40d2f094cb7a94e12c6e533 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 14 Feb 2018 04:06:13 +0200 Subject: [PATCH 040/104] Refactor EPP session limit #700 --- app/controllers/epp/sessions_controller.rb | 10 +--- app/models/epp_session.rb | 9 ++++ test/integration/epp/session/limit_test.rb | 63 ++++++++++++++++++++++ test/models/epp_session_test.rb | 17 ++++++ 4 files changed, 90 insertions(+), 9 deletions(-) create mode 100644 test/integration/epp/session/limit_test.rb diff --git a/app/controllers/epp/sessions_controller.rb b/app/controllers/epp/sessions_controller.rb index eb460a8d1..d5844500e 100644 --- a/app/controllers/epp/sessions_controller.rb +++ b/app/controllers/epp/sessions_controller.rb @@ -74,7 +74,7 @@ class Epp::SessionsController < EppController success = false end - if success && !connection_limit_ok? + if success && EppSession.limit_reached?(@api_user.registrar) epp_errors << { msg: 'Authentication error; server closing connection (connection limit reached)', code: '2501' @@ -143,12 +143,4 @@ class Epp::SessionsController < EppController def resource @api_user end - - def connection_limit_ok? - epp_session_count = EppSession.where(user_id: @api_user.registrar.api_users.ids) - .where('updated_at >= ?', Time.zone.now - 1.second).count - - return false if epp_session_count >= 4 - true - end end diff --git a/app/models/epp_session.rb b/app/models/epp_session.rb index 0a1a146a2..dfd603fc4 100644 --- a/app/models/epp_session.rb +++ b/app/models/epp_session.rb @@ -2,4 +2,13 @@ class EppSession < ActiveRecord::Base belongs_to :user, required: true validates :session_id, uniqueness: true, presence: true + + def self.limit_per_registrar + 4 + end + + def self.limit_reached?(registrar) + count = where(user_id: registrar.api_users.ids).where('updated_at >= ?', Time.zone.now - 1.second).count + count >= limit_per_registrar + end end diff --git a/test/integration/epp/session/limit_test.rb b/test/integration/epp/session/limit_test.rb new file mode 100644 index 000000000..b186031b6 --- /dev/null +++ b/test/integration/epp/session/limit_test.rb @@ -0,0 +1,63 @@ +require 'test_helper' + +class EppSessionLimitTest < ActionDispatch::IntegrationTest + def setup + travel_to Time.zone.parse('2010-07-05') + EppSession.delete_all + end + + def test_not_reached + (EppSession.limit_per_registrar - 1).times do + EppSession.create!(session_id: SecureRandom.hex, + user: users(:api_bestnames), + updated_at: Time.zone.parse('2010-07-05')) + end + + assert_difference 'EppSession.count' do + post '/epp/session/login', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=new_session_id' } + end + + assert Nokogiri::XML(response.body).at_css('result[code="1000"]') + assert_equal 1, Nokogiri::XML(response.body).css('result').size + end + + def test_reached + EppSession.limit_per_registrar.times do + EppSession.create!(session_id: SecureRandom.hex, + user: users(:api_bestnames), + updated_at: Time.zone.parse('2010-07-05')) + end + + assert_no_difference 'EppSession.count' do + post '/epp/session/login', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=new_session_id' } + end + + assert Nokogiri::XML(response.body).at_css('result[code="2501"]') + end + + private + + def request_xml + <<-XML + + + + + test_bestnames + testtest + + 1.0 + en + + + https://epp.tld.ee/schema/domain-eis-1.0.xsd + https://epp.tld.ee/schema/contact-ee-1.1.xsd + urn:ietf:params:xml:ns:host-1.0 + urn:ietf:params:xml:ns:keyrelay-1.0 + + + + + XML + end +end diff --git a/test/models/epp_session_test.rb b/test/models/epp_session_test.rb index 1a0e9e114..fd795b23c 100644 --- a/test/models/epp_session_test.rb +++ b/test/models/epp_session_test.rb @@ -43,4 +43,21 @@ class EppSessionTest < ActiveSupport::TestCase @epp_session.save(validate: false) end end + + def test_limit_per_registrar + assert_equal 4, EppSession.limit_per_registrar + end + + def test_limit_is_per_registrar + travel_to Time.zone.parse('2010-07-05') + EppSession.delete_all + + EppSession.limit_per_registrar.times do + EppSession.create!(session_id: SecureRandom.hex, + user: users(:api_goodnames), + updated_at: Time.zone.parse('2010-07-05')) + end + + refute EppSession.limit_reached?(registrars(:bestnames)) + end end From 46e85965af346207ace360fe2aaf11d8db8c5a6c Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 14 Feb 2018 04:08:24 +0200 Subject: [PATCH 041/104] Reorganize tests #700 --- .../epp/{session/login_test.rb => login/credentials_test.rb} | 2 +- .../epp/{session/limit_test.rb => login/session_limit_test.rb} | 2 +- test/integration/epp/{session => }/logout_test.rb | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename test/integration/epp/{session/login_test.rb => login/credentials_test.rb} (97%) rename test/integration/epp/{session/limit_test.rb => login/session_limit_test.rb} (96%) rename test/integration/epp/{session => }/logout_test.rb (100%) diff --git a/test/integration/epp/session/login_test.rb b/test/integration/epp/login/credentials_test.rb similarity index 97% rename from test/integration/epp/session/login_test.rb rename to test/integration/epp/login/credentials_test.rb index c268ab1eb..6a27c7393 100644 --- a/test/integration/epp/session/login_test.rb +++ b/test/integration/epp/login/credentials_test.rb @@ -1,6 +1,6 @@ require 'test_helper' -class EppLoginTest < ActionDispatch::IntegrationTest +class EppLoginCredentialsTest < ActionDispatch::IntegrationTest def test_correct_credentials request_xml = <<-XML diff --git a/test/integration/epp/session/limit_test.rb b/test/integration/epp/login/session_limit_test.rb similarity index 96% rename from test/integration/epp/session/limit_test.rb rename to test/integration/epp/login/session_limit_test.rb index b186031b6..513699415 100644 --- a/test/integration/epp/session/limit_test.rb +++ b/test/integration/epp/login/session_limit_test.rb @@ -1,6 +1,6 @@ require 'test_helper' -class EppSessionLimitTest < ActionDispatch::IntegrationTest +class EppLoginSessionLimitTest < ActionDispatch::IntegrationTest def setup travel_to Time.zone.parse('2010-07-05') EppSession.delete_all diff --git a/test/integration/epp/session/logout_test.rb b/test/integration/epp/logout_test.rb similarity index 100% rename from test/integration/epp/session/logout_test.rb rename to test/integration/epp/logout_test.rb From ea08abf9e8787580b0b7dc28c8e88b8a3ac7bf21 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 14 Feb 2018 22:09:26 +0200 Subject: [PATCH 042/104] Add database constraints #694 --- .../20180214200224_add_domain_transfers_constraints.rb | 7 +++++++ db/structure.sql | 8 +++++--- 2 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 db/migrate/20180214200224_add_domain_transfers_constraints.rb diff --git a/db/migrate/20180214200224_add_domain_transfers_constraints.rb b/db/migrate/20180214200224_add_domain_transfers_constraints.rb new file mode 100644 index 000000000..bd4023deb --- /dev/null +++ b/db/migrate/20180214200224_add_domain_transfers_constraints.rb @@ -0,0 +1,7 @@ +class AddDomainTransfersConstraints < ActiveRecord::Migration + def change + change_column_null :domain_transfers, :domain_id, false + change_column_null :domain_transfers, :old_registrar_id, false + change_column_null :domain_transfers, :new_registrar_id, false + end +end diff --git a/db/structure.sql b/db/structure.sql index 2cad3e06f..7e8fef018 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -954,12 +954,12 @@ ALTER SEQUENCE domain_statuses_id_seq OWNED BY domain_statuses.id; CREATE TABLE domain_transfers ( id integer NOT NULL, - domain_id integer, + domain_id integer NOT NULL, status character varying, transfer_requested_at timestamp without time zone, transferred_at timestamp without time zone, - old_registrar_id integer, - new_registrar_id integer, + old_registrar_id integer NOT NULL, + new_registrar_id integer NOT NULL, created_at timestamp without time zone, updated_at timestamp without time zone, wait_until timestamp without time zone @@ -5070,3 +5070,5 @@ INSERT INTO schema_migrations (version) VALUES ('20180126104536'); INSERT INTO schema_migrations (version) VALUES ('20180126104903'); +INSERT INTO schema_migrations (version) VALUES ('20180214200224'); + From fee7fc94c7b3852f0c7089dda1888f270f40fddb Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 14 Feb 2018 23:34:21 +0200 Subject: [PATCH 043/104] Improve readability #694 --- test/models/domain/domain_transfer_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/models/domain/domain_transfer_test.rb b/test/models/domain/domain_transfer_test.rb index 7b2d2d4c2..58937c791 100644 --- a/test/models/domain/domain_transfer_test.rb +++ b/test/models/domain/domain_transfer_test.rb @@ -52,7 +52,7 @@ class DomainTransferTest < ActiveSupport::TestCase end end - def test_creates_message + def test_notifies_old_registrar assert_difference 'Message.count' do @domain.transfer(@new_registrar) end From bf013123540bd4b035b9ab883303d54589122760 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 14 Feb 2018 23:40:30 +0200 Subject: [PATCH 044/104] Add database constraints #694 --- .../20180214213743_change_messages_body_to_not_null.rb | 5 +++++ db/structure.sql | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20180214213743_change_messages_body_to_not_null.rb diff --git a/db/migrate/20180214213743_change_messages_body_to_not_null.rb b/db/migrate/20180214213743_change_messages_body_to_not_null.rb new file mode 100644 index 000000000..4a09101f1 --- /dev/null +++ b/db/migrate/20180214213743_change_messages_body_to_not_null.rb @@ -0,0 +1,5 @@ +class ChangeMessagesBodyToNotNull < ActiveRecord::Migration + def change + change_column_null :messages, :body, false + end +end diff --git a/db/structure.sql b/db/structure.sql index 7e8fef018..c5ea5f5e7 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -2185,7 +2185,7 @@ ALTER SEQUENCE mail_templates_id_seq OWNED BY mail_templates.id; CREATE TABLE messages ( id integer NOT NULL, registrar_id integer, - body character varying, + body character varying NOT NULL, attached_obj_type character varying, attached_obj_id character varying, queued boolean, @@ -5072,3 +5072,5 @@ INSERT INTO schema_migrations (version) VALUES ('20180126104903'); INSERT INTO schema_migrations (version) VALUES ('20180214200224'); +INSERT INTO schema_migrations (version) VALUES ('20180214213743'); + From 09e2bee29202b1dd7b0d33b854cb180fa0c456ba Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Wed, 14 Feb 2018 23:46:04 +0200 Subject: [PATCH 045/104] Update translation #694 --- config/locales/messages.en.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 config/locales/messages.en.yml diff --git a/config/locales/messages.en.yml b/config/locales/messages.en.yml new file mode 100644 index 000000000..5cc945c25 --- /dev/null +++ b/config/locales/messages.en.yml @@ -0,0 +1,8 @@ +en: + activerecord: + attributes: + message/body: + domain_transfer: >- + Domain transfer of %{domain_name} has been approved. + Old contacts: %{old_contacts}; + old registrant: %{old_registrant} From 4c30418f5ef04831be5d8b0a12bc3ad237d369c0 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Thu, 15 Feb 2018 17:38:35 +0200 Subject: [PATCH 046/104] Improve readability #707 --- test/models/domain/domain_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/models/domain/domain_test.rb b/test/models/domain/domain_test.rb index a2c3fae55..562e8e3e9 100644 --- a/test/models/domain/domain_test.rb +++ b/test/models/domain/domain_test.rb @@ -5,7 +5,7 @@ class DomainTest < ActiveSupport::TestCase @domain = domains(:shop) end - def test_validates + def test_valid_fixture assert @domain.valid? end end From 6c1342c9577e337c379073311d6bef14dfb4ca4f Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Thu, 15 Feb 2018 17:46:09 +0200 Subject: [PATCH 047/104] Bypass validation on EPP domain:delete #707 --- app/models/epp/domain.rb | 2 -- test/fixtures/contacts.yml | 1 + test/fixtures/domain_contacts.yml | 10 +++++++ test/fixtures/domains.yml | 6 +++++ .../epp/domain/domain_delete_test.rb | 27 +++++++++++++++++++ test/models/domain/domain_test.rb | 4 +++ 6 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 test/integration/epp/domain/domain_delete_test.rb diff --git a/app/models/epp/domain.rb b/app/models/epp/domain.rb index 969d9a9bc..a59094d1e 100644 --- a/app/models/epp/domain.rb +++ b/app/models/epp/domain.rb @@ -556,8 +556,6 @@ class Epp::Domain < Domain end def epp_destroy(frame, user_id) - return false unless valid? - check_discarded if doc = attach_legal_document(Epp::Domain.parse_legal_document_from_frame(frame)) diff --git a/test/fixtures/contacts.yml b/test/fixtures/contacts.yml index 2a9898543..8c0fb4e10 100644 --- a/test/fixtures/contacts.yml +++ b/test/fixtures/contacts.yml @@ -34,5 +34,6 @@ acme_ltd: invalid: name: any code: any + email: invalid@invalid.test auth_info: any registrar: bestnames diff --git a/test/fixtures/domain_contacts.yml b/test/fixtures/domain_contacts.yml index 8a429f628..fd60e8c99 100644 --- a/test/fixtures/domain_contacts.yml +++ b/test/fixtures/domain_contacts.yml @@ -12,3 +12,13 @@ library_john: domain: library contact: john type: AdminDomainContact + +invalid_invalid_admin: + domain: invalid + contact: invalid + type: AdminDomainContact + +invalid_invalid_tech: + domain: invalid + contact: invalid + type: TechDomainContact diff --git a/test/fixtures/domains.yml b/test/fixtures/domains.yml index 7c7b429cf..a7ed8e337 100644 --- a/test/fixtures/domains.yml +++ b/test/fixtures/domains.yml @@ -27,3 +27,9 @@ library: valid_to: 2010-07-05 period: 1 period_unit: m + +invalid: + name: invalid.test + transfer_code: any + registrar: bestnames + registrant: invalid diff --git a/test/integration/epp/domain/domain_delete_test.rb b/test/integration/epp/domain/domain_delete_test.rb new file mode 100644 index 000000000..212ec589a --- /dev/null +++ b/test/integration/epp/domain/domain_delete_test.rb @@ -0,0 +1,27 @@ +require 'test_helper' + +class EppDomainDeleteTest < ActionDispatch::IntegrationTest + def test_bypasses_domain_and_registrant_and_contacts_validation + request_xml = <<-XML + + + + + + invalid.test + + + + + dGVzdCBmYWlsCg== + + + + + XML + + post '/epp/command/delete', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + assert_equal '1001', Nokogiri::XML(response.body).at_css('result')[:code] + assert_equal 1, Nokogiri::XML(response.body).css('result').size + end +end diff --git a/test/models/domain/domain_test.rb b/test/models/domain/domain_test.rb index 562e8e3e9..b022fd35b 100644 --- a/test/models/domain/domain_test.rb +++ b/test/models/domain/domain_test.rb @@ -8,4 +8,8 @@ class DomainTest < ActiveSupport::TestCase def test_valid_fixture assert @domain.valid? end + + def test_invalid_fixture + assert domains(:invalid).invalid? + end end From 81ea57c5236b25ec0730c15aee60ff4b91760225 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Thu, 15 Feb 2018 21:41:35 +0200 Subject: [PATCH 048/104] Improve readability #707 --- test/models/contact/contact_test.rb | 2 +- test/models/domain/domain_test.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/models/contact/contact_test.rb b/test/models/contact/contact_test.rb index c4f26f4a3..ef958e2a4 100644 --- a/test/models/contact/contact_test.rb +++ b/test/models/contact/contact_test.rb @@ -5,7 +5,7 @@ class ContactTest < ActiveSupport::TestCase @contact = contacts(:john) end - def test_validates + def test_valid_fixture_is_valid assert @contact.valid? end diff --git a/test/models/domain/domain_test.rb b/test/models/domain/domain_test.rb index b022fd35b..c67c8ee87 100644 --- a/test/models/domain/domain_test.rb +++ b/test/models/domain/domain_test.rb @@ -5,11 +5,11 @@ class DomainTest < ActiveSupport::TestCase @domain = domains(:shop) end - def test_valid_fixture + def test_valid_fixture_is_valid assert @domain.valid? end - def test_invalid_fixture + def test_invalid_fixture_is_invalid assert domains(:invalid).invalid? end end From de6e640f86195a36617718abb53f1397f4d3905d Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Thu, 15 Feb 2018 22:07:10 +0200 Subject: [PATCH 049/104] Improve/fix tests #707 --- test/fixtures/domains.yml | 1 + test/integration/epp/domain/domain_delete_test.rb | 1 + test/integration/registrar/domains_test.rb | 1 + 3 files changed, 3 insertions(+) diff --git a/test/fixtures/domains.yml b/test/fixtures/domains.yml index a7ed8e337..7c0844d97 100644 --- a/test/fixtures/domains.yml +++ b/test/fixtures/domains.yml @@ -31,5 +31,6 @@ library: invalid: name: invalid.test transfer_code: any + valid_to: 2010-07-05 registrar: bestnames registrant: invalid diff --git a/test/integration/epp/domain/domain_delete_test.rb b/test/integration/epp/domain/domain_delete_test.rb index 212ec589a..bdd326a3e 100644 --- a/test/integration/epp/domain/domain_delete_test.rb +++ b/test/integration/epp/domain/domain_delete_test.rb @@ -21,6 +21,7 @@ class EppDomainDeleteTest < ActionDispatch::IntegrationTest XML post '/epp/command/delete', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + assert_includes Domain.find_by(name: 'invalid.test').statuses, DomainStatus::PENDING_DELETE_CONFIRMATION assert_equal '1001', Nokogiri::XML(response.body).at_css('result')[:code] assert_equal 1, Nokogiri::XML(response.body).css('result').size end diff --git a/test/integration/registrar/domains_test.rb b/test/integration/registrar/domains_test.rb index 51b76fc7c..f3936c578 100644 --- a/test/integration/registrar/domains_test.rb +++ b/test/integration/registrar/domains_test.rb @@ -9,6 +9,7 @@ class RegistrarDomainsTest < ActionDispatch::IntegrationTest Domain,Transfer code,Registrant name,Registrant code,Date of expiry library.test,45118f5,Acme Ltd,acme-ltd-001,2010-07-05 shop.test,65078d5,John,john-001,2010-07-05 + invalid.test,any,any,any,2010-07-05 airport.test,55438j5,John,john-001,2010-07-05 CSV From e1ad847a891dd130759231b366a15f881930e878 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Fri, 16 Feb 2018 17:22:32 +0200 Subject: [PATCH 050/104] REST API: Return successful domain transfers #693 --- app/api/repp/domain_transfers_v1.rb | 7 ++++--- doc/repp/v1/domain_transfers.md | 14 +++++++++++++- test/integration/api/domain_transfers_test.rb | 7 +++++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/app/api/repp/domain_transfers_v1.rb b/app/api/repp/domain_transfers_v1.rb index 195740f54..addae67b2 100644 --- a/app/api/repp/domain_transfers_v1.rb +++ b/app/api/repp/domain_transfers_v1.rb @@ -15,6 +15,7 @@ module Repp new_registrar = current_user.registrar domain_transfers = params['data']['domainTransfers'] + successful_domain_transfers = [] errors = [] domain_transfers.each do |domain_transfer| @@ -25,6 +26,7 @@ module Repp if domain if domain.transfer_code == transfer_code domain.transfer(new_registrar) + successful_domain_transfers << { type: 'domain_transfer' } else errors << { title: "#{domain_name} transfer code is wrong" } end @@ -34,9 +36,8 @@ module Repp end if errors.none? - status 204 - body false - @response = {} + status 200 + @response = { data: successful_domain_transfers } else status 400 @response = { errors: errors } diff --git a/doc/repp/v1/domain_transfers.md b/doc/repp/v1/domain_transfers.md index 1f821bc6b..a6eb4683c 100644 --- a/doc/repp/v1/domain_transfers.md +++ b/doc/repp/v1/domain_transfers.md @@ -28,9 +28,21 @@ Authorization: Basic dGVzdDp0ZXN0dGVzdA== #### Response on success ``` -HTTP/1.1 204 +HTTP/1.1 200 +Content-Type: application/json +{ + "data":[ + { + "type":"domain_transfer" + }, + { + "type":"domain_transfer" + } + ] +} ``` + #### Response on failure ``` HTTP/1.1 400 diff --git a/test/integration/api/domain_transfers_test.rb b/test/integration/api/domain_transfers_test.rb index 0debc37c0..8d6cd6c5e 100644 --- a/test/integration/api/domain_transfers_test.rb +++ b/test/integration/api/domain_transfers_test.rb @@ -5,9 +5,12 @@ class APIDomainTransfersTest < ActionDispatch::IntegrationTest request_params = { format: :json, data: { domainTransfers: [{ domainName: 'shop.test', transferCode: '65078d5' }] } } post '/repp/v1/domain_transfers', request_params, { 'HTTP_AUTHORIZATION' => http_auth_key } - assert_response 204 assert_equal registrars(:goodnames), domains(:shop).registrar - assert_empty response.body + assert_response 200 + assert_equal ({ data: [{ + type: 'domain_transfer' + }] }), + JSON.parse(response.body, symbolize_names: true) end def test_fails_if_domain_does_not_exist From 2902a2f5a22972bf0c4bdf246de4513ec663ed95 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Fri, 16 Feb 2018 18:17:59 +0200 Subject: [PATCH 051/104] Revert "Tell Travis to build all branches" This reverts commit 0b1ffd5 --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index a5fec1a71..e375b943c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,3 +19,7 @@ services: - postgresql addons: postgresql: "9.4" +branches: + only: + - master + - staging From 6d991387a2734af4eba6cdd79619d5b02e118b03 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Fri, 16 Feb 2018 18:42:51 +0200 Subject: [PATCH 052/104] Do not use warden helper in EPP tests #694 --- test/integration/epp/domain/create/transfer_code_test.rb | 1 - test/integration/epp/domain/transfer/domain_transfer_test.rb | 4 ---- test/integration/epp/domain/transfer/transfer_code_test.rb | 4 ---- test/integration/epp/domain/update/transfer_code_test.rb | 4 ---- 4 files changed, 13 deletions(-) diff --git a/test/integration/epp/domain/create/transfer_code_test.rb b/test/integration/epp/domain/create/transfer_code_test.rb index f7d70a4ea..fbd62ec81 100644 --- a/test/integration/epp/domain/create/transfer_code_test.rb +++ b/test/integration/epp/domain/create/transfer_code_test.rb @@ -3,7 +3,6 @@ require 'test_helper' class EppDomainCreateTransferCodeTest < ActionDispatch::IntegrationTest def setup travel_to Time.zone.parse('2010-07-05') - login_as users(:api_bestnames) end def test_generates_default diff --git a/test/integration/epp/domain/transfer/domain_transfer_test.rb b/test/integration/epp/domain/transfer/domain_transfer_test.rb index 1b1e604ba..6421bc71b 100644 --- a/test/integration/epp/domain/transfer/domain_transfer_test.rb +++ b/test/integration/epp/domain/transfer/domain_transfer_test.rb @@ -1,10 +1,6 @@ require 'test_helper' class EppDomainTransferTest < ActionDispatch::IntegrationTest - def setup - login_as users(:api_goodnames) - end - def test_successfully_transfers_domain request_xml = <<-XML diff --git a/test/integration/epp/domain/transfer/transfer_code_test.rb b/test/integration/epp/domain/transfer/transfer_code_test.rb index 0db6ba0d6..48c4d8db6 100644 --- a/test/integration/epp/domain/transfer/transfer_code_test.rb +++ b/test/integration/epp/domain/transfer/transfer_code_test.rb @@ -1,10 +1,6 @@ require 'test_helper' class EppDomainTransferTransferCodeTest < ActionDispatch::IntegrationTest - def setup - login_as users(:api_goodnames) - end - def test_wrong request_xml = <<-XML diff --git a/test/integration/epp/domain/update/transfer_code_test.rb b/test/integration/epp/domain/update/transfer_code_test.rb index 6208c2899..eae8ec675 100644 --- a/test/integration/epp/domain/update/transfer_code_test.rb +++ b/test/integration/epp/domain/update/transfer_code_test.rb @@ -1,10 +1,6 @@ require 'test_helper' class EppDomainUpdateTest < ActionDispatch::IntegrationTest - def setup - login_as users(:api_bestnames) - end - def test_overwrites_existing request_xml = <<-XML From af78fcbc8f3344e6b61f5be8b4646838ad803b26 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Fri, 16 Feb 2018 23:00:01 +0200 Subject: [PATCH 053/104] Do not paginate CSV and PDF export #721 --- app/controllers/registrar/contacts_controller.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/controllers/registrar/contacts_controller.rb b/app/controllers/registrar/contacts_controller.rb index 4d0de5389..f5f527e1f 100644 --- a/app/controllers/registrar/contacts_controller.rb +++ b/app/controllers/registrar/contacts_controller.rb @@ -50,11 +50,9 @@ class Registrar normalize_search_parameters do @q = contacts.search(params[:q]) - @contacts = @q.result.page(params[:page]) + @contacts = @q.result end - @contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 - respond_to do |format| format.csv { render text: @contacts.to_csv } format.pdf do From bb0a6e3922da8b53399ef225867f388538f8d6ad Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sat, 17 Feb 2018 01:21:36 +0200 Subject: [PATCH 054/104] Add test #694 --- test/models/domain/domain_transfer_test.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/models/domain/domain_transfer_test.rb b/test/models/domain/domain_transfer_test.rb index 58937c791..0086648a9 100644 --- a/test/models/domain/domain_transfer_test.rb +++ b/test/models/domain/domain_transfer_test.rb @@ -63,4 +63,10 @@ class DomainTransferTest < ActiveSupport::TestCase @domain.transfer(@new_registrar) end end + + def test_bypasses_validation + domain = domains(:invalid) + domain.transfer(@new_registrar) + assert_equal @new_registrar, @domain.registrar + end end From a469b6b5d45dd1eb870583fb165f5092bec46d09 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sat, 17 Feb 2018 01:34:38 +0200 Subject: [PATCH 055/104] Reformat #694 --- app/models/domain_transfer.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/models/domain_transfer.rb b/app/models/domain_transfer.rb index 6dd539bb8..5f498185e 100644 --- a/app/models/domain_transfer.rb +++ b/app/models/domain_transfer.rb @@ -10,6 +10,7 @@ class DomainTransfer < ActiveRecord::Base SERVER_APPROVED = 'serverApproved' before_create :set_wait_until + def set_wait_until wait_time = Setting.transfer_wait_time return if wait_time == 0 @@ -17,6 +18,7 @@ class DomainTransfer < ActiveRecord::Base end before_create :set_status + def set_status if Setting.transfer_wait_time > 0 self.status = PENDING unless status From e92f8621efbff2a3d3f17f6eb72bfdbb9d0c92ef Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sat, 17 Feb 2018 02:25:33 +0200 Subject: [PATCH 056/104] Improve test #694 --- .../integration/epp/domain/transfer/domain_transfer_test.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/integration/epp/domain/transfer/domain_transfer_test.rb b/test/integration/epp/domain/transfer/domain_transfer_test.rb index 6421bc71b..2d47549c8 100644 --- a/test/integration/epp/domain/transfer/domain_transfer_test.rb +++ b/test/integration/epp/domain/transfer/domain_transfer_test.rb @@ -1,7 +1,9 @@ require 'test_helper' class EppDomainTransferTest < ActionDispatch::IntegrationTest - def test_successfully_transfers_domain + def test_transfers_domain_at_once_if_auto_confirm_is_enabled + Setting.transfer_wait_time = 0 + request_xml = <<-XML @@ -21,7 +23,7 @@ class EppDomainTransferTest < ActionDispatch::IntegrationTest session_id = epp_sessions(:api_goodnames).session_id post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => "session=#{session_id}" } assert_equal registrars(:goodnames), domains(:shop).registrar - assert Nokogiri::XML(response.body).at_css('result[code="1000"]') + assert_equal '1000', Nokogiri::XML(response.body).at_css('result')[:code] assert_equal 1, Nokogiri::XML(response.body).css('result').size end From 59ceb9c51a7eec6de4732849297ecbd77e1da529 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sat, 17 Feb 2018 02:42:22 +0200 Subject: [PATCH 057/104] Hard code test data #694 --- test/integration/epp/domain/create/transfer_code_test.rb | 6 ++---- .../integration/epp/domain/transfer/domain_transfer_test.rb | 6 ++---- test/integration/epp/domain/transfer/transfer_code_test.rb | 3 +-- test/integration/epp/domain/update/transfer_code_test.rb | 3 +-- 4 files changed, 6 insertions(+), 12 deletions(-) diff --git a/test/integration/epp/domain/create/transfer_code_test.rb b/test/integration/epp/domain/create/transfer_code_test.rb index fbd62ec81..109447c94 100644 --- a/test/integration/epp/domain/create/transfer_code_test.rb +++ b/test/integration/epp/domain/create/transfer_code_test.rb @@ -26,8 +26,7 @@ class EppDomainCreateTransferCodeTest < ActionDispatch::IntegrationTest XML - session_id = epp_sessions(:api_bestnames).session_id - post '/epp/command/create', { frame: request_xml }, { 'HTTP_COOKIE' => "session=#{session_id}" } + post '/epp/command/create', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } refute_empty Domain.find_by(name: 'brandnew.test').transfer_code end @@ -55,8 +54,7 @@ class EppDomainCreateTransferCodeTest < ActionDispatch::IntegrationTest XML - session_id = epp_sessions(:api_bestnames).session_id - post '/epp/command/create', { frame: request_xml }, { 'HTTP_COOKIE' => "session=#{session_id}" } + post '/epp/command/create', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } assert_equal '1058ad73', Domain.find_by(name: 'brandnew.test').transfer_code end end diff --git a/test/integration/epp/domain/transfer/domain_transfer_test.rb b/test/integration/epp/domain/transfer/domain_transfer_test.rb index 2d47549c8..736a066e6 100644 --- a/test/integration/epp/domain/transfer/domain_transfer_test.rb +++ b/test/integration/epp/domain/transfer/domain_transfer_test.rb @@ -20,8 +20,7 @@ class EppDomainTransferTest < ActionDispatch::IntegrationTest XML - session_id = epp_sessions(:api_goodnames).session_id - post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => "session=#{session_id}" } + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } assert_equal registrars(:goodnames), domains(:shop).registrar assert_equal '1000', Nokogiri::XML(response.body).at_css('result')[:code] assert_equal 1, Nokogiri::XML(response.body).css('result').size @@ -44,8 +43,7 @@ class EppDomainTransferTest < ActionDispatch::IntegrationTest XML - session_id = epp_sessions(:api_goodnames).session_id - post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => "session=#{session_id}" } + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } assert Nokogiri::XML(response.body).at_css('result[code="2303"]') end end diff --git a/test/integration/epp/domain/transfer/transfer_code_test.rb b/test/integration/epp/domain/transfer/transfer_code_test.rb index 48c4d8db6..803f5aac7 100644 --- a/test/integration/epp/domain/transfer/transfer_code_test.rb +++ b/test/integration/epp/domain/transfer/transfer_code_test.rb @@ -18,8 +18,7 @@ class EppDomainTransferTransferCodeTest < ActionDispatch::IntegrationTest XML - session_id = epp_sessions(:api_goodnames).session_id - post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => "session=#{session_id}" } + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } refute_equal registrars(:goodnames), domains(:shop).registrar assert Nokogiri::XML(response.body).at_css('result[code="2201"]') end diff --git a/test/integration/epp/domain/update/transfer_code_test.rb b/test/integration/epp/domain/update/transfer_code_test.rb index eae8ec675..eea29f151 100644 --- a/test/integration/epp/domain/update/transfer_code_test.rb +++ b/test/integration/epp/domain/update/transfer_code_test.rb @@ -20,8 +20,7 @@ class EppDomainUpdateTest < ActionDispatch::IntegrationTest XML - session_id = epp_sessions(:api_bestnames).session_id - post '/epp/command/update', { frame: request_xml }, { 'HTTP_COOKIE' => "session=#{session_id}" } + post '/epp/command/update', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } assert_equal 'f0ff7d17b0', domains(:shop).transfer_code end end From 443485d5d6c83720017102529cb88e40db788245 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sat, 17 Feb 2018 02:48:45 +0200 Subject: [PATCH 058/104] Improve test #694 --- test/integration/epp/domain/create/transfer_code_test.rb | 4 ++++ test/integration/epp/domain/transfer/domain_transfer_test.rb | 2 +- test/integration/epp/domain/transfer/transfer_code_test.rb | 2 +- test/integration/epp/domain/update/transfer_code_test.rb | 2 ++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/test/integration/epp/domain/create/transfer_code_test.rb b/test/integration/epp/domain/create/transfer_code_test.rb index 109447c94..276386851 100644 --- a/test/integration/epp/domain/create/transfer_code_test.rb +++ b/test/integration/epp/domain/create/transfer_code_test.rb @@ -28,6 +28,8 @@ class EppDomainCreateTransferCodeTest < ActionDispatch::IntegrationTest post '/epp/command/create', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } refute_empty Domain.find_by(name: 'brandnew.test').transfer_code + assert_equal '1000', Nokogiri::XML(response.body).at_css('result')[:code] + assert_equal 1, Nokogiri::XML(response.body).css('result').size end def test_honors_custom @@ -56,5 +58,7 @@ class EppDomainCreateTransferCodeTest < ActionDispatch::IntegrationTest post '/epp/command/create', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } assert_equal '1058ad73', Domain.find_by(name: 'brandnew.test').transfer_code + assert_equal '1000', Nokogiri::XML(response.body).at_css('result')[:code] + assert_equal 1, Nokogiri::XML(response.body).css('result').size end end diff --git a/test/integration/epp/domain/transfer/domain_transfer_test.rb b/test/integration/epp/domain/transfer/domain_transfer_test.rb index 736a066e6..38b7a2757 100644 --- a/test/integration/epp/domain/transfer/domain_transfer_test.rb +++ b/test/integration/epp/domain/transfer/domain_transfer_test.rb @@ -44,6 +44,6 @@ class EppDomainTransferTest < ActionDispatch::IntegrationTest XML post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } - assert Nokogiri::XML(response.body).at_css('result[code="2303"]') + assert_equal '2303', Nokogiri::XML(response.body).at_css('result')[:code] end end diff --git a/test/integration/epp/domain/transfer/transfer_code_test.rb b/test/integration/epp/domain/transfer/transfer_code_test.rb index 803f5aac7..0509d632a 100644 --- a/test/integration/epp/domain/transfer/transfer_code_test.rb +++ b/test/integration/epp/domain/transfer/transfer_code_test.rb @@ -20,6 +20,6 @@ class EppDomainTransferTransferCodeTest < ActionDispatch::IntegrationTest post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } refute_equal registrars(:goodnames), domains(:shop).registrar - assert Nokogiri::XML(response.body).at_css('result[code="2201"]') + assert_equal '2201', Nokogiri::XML(response.body).at_css('result')[:code] end end diff --git a/test/integration/epp/domain/update/transfer_code_test.rb b/test/integration/epp/domain/update/transfer_code_test.rb index eea29f151..92ee58a02 100644 --- a/test/integration/epp/domain/update/transfer_code_test.rb +++ b/test/integration/epp/domain/update/transfer_code_test.rb @@ -22,5 +22,7 @@ class EppDomainUpdateTest < ActionDispatch::IntegrationTest post '/epp/command/update', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } assert_equal 'f0ff7d17b0', domains(:shop).transfer_code + assert_equal '1000', Nokogiri::XML(response.body).at_css('result')[:code] + assert_equal 1, Nokogiri::XML(response.body).css('result').size end end From 62c987f524b2ab3c498a023c68335ca70964ff83 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sat, 17 Feb 2018 02:55:40 +0200 Subject: [PATCH 059/104] Fix test #694 --- test/models/domain/domain_transfer_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/models/domain/domain_transfer_test.rb b/test/models/domain/domain_transfer_test.rb index 0086648a9..cba9d822e 100644 --- a/test/models/domain/domain_transfer_test.rb +++ b/test/models/domain/domain_transfer_test.rb @@ -67,6 +67,6 @@ class DomainTransferTest < ActiveSupport::TestCase def test_bypasses_validation domain = domains(:invalid) domain.transfer(@new_registrar) - assert_equal @new_registrar, @domain.registrar + assert_equal @new_registrar, domain.registrar end end From 6808bcb2458b50451bc4af9aaadeef2d591c633e Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sat, 17 Feb 2018 02:56:19 +0200 Subject: [PATCH 060/104] Improve readability #694 --- test/models/domain/domain_transfer_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/models/domain/domain_transfer_test.rb b/test/models/domain/domain_transfer_test.rb index cba9d822e..9f86615e3 100644 --- a/test/models/domain/domain_transfer_test.rb +++ b/test/models/domain/domain_transfer_test.rb @@ -64,7 +64,7 @@ class DomainTransferTest < ActiveSupport::TestCase end end - def test_bypasses_validation + def test_bypasses_domain_validation domain = domains(:invalid) domain.transfer(@new_registrar) assert_equal @new_registrar, domain.registrar From 46bca463202b3f0dad0776a812389aed54481ac7 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sat, 17 Feb 2018 22:31:29 +0200 Subject: [PATCH 061/104] Tell Rubocop to prefer `alias_method` #694 --- .rubocop.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.rubocop.yml b/.rubocop.yml index cc32da4b9..3d8fd0b90 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1 +1,4 @@ inherit_from: .rubocop_todo.yml + +Style/Alias: + EnforcedStyle: prefer_alias_method From e84a1dc0de346ef5361917c2470a5936d675e99a Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sun, 18 Feb 2018 02:46:20 +0200 Subject: [PATCH 062/104] Change database column type #694 --- ...218004148_change_messages_attached_obj_id_type_to_int.rb | 5 +++++ db/structure.sql | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20180218004148_change_messages_attached_obj_id_type_to_int.rb diff --git a/db/migrate/20180218004148_change_messages_attached_obj_id_type_to_int.rb b/db/migrate/20180218004148_change_messages_attached_obj_id_type_to_int.rb new file mode 100644 index 000000000..9996b5e67 --- /dev/null +++ b/db/migrate/20180218004148_change_messages_attached_obj_id_type_to_int.rb @@ -0,0 +1,5 @@ +class ChangeMessagesAttachedObjIdTypeToInt < ActiveRecord::Migration + def change + change_column :messages, :attached_obj_id, 'integer USING attached_obj_id::integer' + end +end diff --git a/db/structure.sql b/db/structure.sql index 881b1de36..16523bd5c 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -2186,7 +2186,7 @@ CREATE TABLE messages ( registrar_id integer, body character varying NOT NULL, attached_obj_type character varying, - attached_obj_id character varying, + attached_obj_id integer, queued boolean, created_at timestamp without time zone, updated_at timestamp without time zone, @@ -3635,7 +3635,7 @@ ALTER TABLE ONLY contacts -- --- Name: unique_session_id; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- Name: unique_session_id; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- ALTER TABLE ONLY epp_sessions @@ -5098,3 +5098,5 @@ INSERT INTO schema_migrations (version) VALUES ('20180214200224'); INSERT INTO schema_migrations (version) VALUES ('20180214213743'); +INSERT INTO schema_migrations (version) VALUES ('20180218004148'); + From 4ab6821d8a21e7c2b57d6d7f9b47b08787795632 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sun, 18 Feb 2018 05:08:28 +0200 Subject: [PATCH 063/104] Improve tests #694 --- test/fixtures/contacts.yml | 11 +++ test/fixtures/domain_contacts.yml | 5 ++ test/fixtures/domain_transfers.yml | 7 ++ test/integration/api/domain_transfers_test.rb | 49 ++++++++-- .../{transfer_code_test.rb => base_test.rb} | 11 ++- .../domain/transfer/domain_transfer_test.rb | 49 ---------- .../epp/domain/transfer/query_test.rb | 74 +++++++++++++++ .../epp/domain/transfer/request_test.rb | 90 +++++++++++++++++++ ...main_transfer_test.rb => transfer_test.rb} | 18 ---- 9 files changed, 236 insertions(+), 78 deletions(-) create mode 100644 test/fixtures/domain_transfers.yml rename test/integration/epp/domain/transfer/{transfer_code_test.rb => base_test.rb} (65%) delete mode 100644 test/integration/epp/domain/transfer/domain_transfer_test.rb create mode 100644 test/integration/epp/domain/transfer/query_test.rb create mode 100644 test/integration/epp/domain/transfer/request_test.rb rename test/models/domain/{domain_transfer_test.rb => transfer_test.rb} (78%) diff --git a/test/fixtures/contacts.yml b/test/fixtures/contacts.yml index 8c0fb4e10..eaf4401b7 100644 --- a/test/fixtures/contacts.yml +++ b/test/fixtures/contacts.yml @@ -9,6 +9,17 @@ john: code: john-001 auth_info: cacb5b +william: + name: William + email: william@inbox.test + phone: '+555.555' + ident: 1234 + ident_type: priv + ident_country_code: US + registrar: bestnames + code: william-001 + auth_info: 6573d0 + jane: name: Jane email: jane@mail.test diff --git a/test/fixtures/domain_contacts.yml b/test/fixtures/domain_contacts.yml index fd60e8c99..3442278a1 100644 --- a/test/fixtures/domain_contacts.yml +++ b/test/fixtures/domain_contacts.yml @@ -3,6 +3,11 @@ shop_jane: contact: jane type: AdminDomainContact +shop_william: + domain: shop + contact: william + type: TechDomainContact + airport_john: domain: airport contact: john diff --git a/test/fixtures/domain_transfers.yml b/test/fixtures/domain_transfers.yml new file mode 100644 index 000000000..c8b4181f2 --- /dev/null +++ b/test/fixtures/domain_transfers.yml @@ -0,0 +1,7 @@ +shop: + status: serverApproved + transfer_requested_at: 2010-07-05 + transferred_at: 2010-07-05 + domain: shop + old_registrar: bestnames + new_registrar: goodnames diff --git a/test/integration/api/domain_transfers_test.rb b/test/integration/api/domain_transfers_test.rb index 8d6cd6c5e..80c637eaa 100644 --- a/test/integration/api/domain_transfers_test.rb +++ b/test/integration/api/domain_transfers_test.rb @@ -1,11 +1,12 @@ require 'test_helper' class APIDomainTransfersTest < ActionDispatch::IntegrationTest - def test_transfers_domain - request_params = { format: :json, - data: { domainTransfers: [{ domainName: 'shop.test', transferCode: '65078d5' }] } } + def setup + @domain = domains(:shop) + end + + def test_returns_domain_transfers post '/repp/v1/domain_transfers', request_params, { 'HTTP_AUTHORIZATION' => http_auth_key } - assert_equal registrars(:goodnames), domains(:shop).registrar assert_response 200 assert_equal ({ data: [{ type: 'domain_transfer' @@ -13,6 +14,39 @@ class APIDomainTransfersTest < ActionDispatch::IntegrationTest JSON.parse(response.body, symbolize_names: true) end + def test_approves_automatically + post '/repp/v1/domain_transfers', request_params, { 'HTTP_AUTHORIZATION' => http_auth_key } + assert @domain.domain_transfers.last.approved? + end + + def test_changes_registrar + post '/repp/v1/domain_transfers', request_params, { 'HTTP_AUTHORIZATION' => http_auth_key } + @domain.reload + assert_equal registrars(:goodnames), @domain.registrar + end + + def test_regenerates_transfer_code + @old_transfer_code = @domain.transfer_code + + post '/repp/v1/domain_transfers', request_params, { 'HTTP_AUTHORIZATION' => http_auth_key } + @domain.reload + refute_equal @domain.transfer_code, @old_transfer_code + end + + def test_notifies_old_registrar + @old_registrar = @domain.registrar + + assert_difference -> { @old_registrar.messages.count } do + post '/repp/v1/domain_transfers', request_params, { 'HTTP_AUTHORIZATION' => http_auth_key } + end + end + + def test_creates_copy_of_registrant_admin_and_tech_contacts + assert_difference 'Contact.count', 3 do + post '/repp/v1/domain_transfers', request_params, { 'HTTP_AUTHORIZATION' => http_auth_key } + end + end + def test_fails_if_domain_does_not_exist request_params = { format: :json, data: { domainTransfers: [{ domainName: 'non-existent.test', transferCode: 'any' }] } } @@ -27,13 +61,18 @@ class APIDomainTransfersTest < ActionDispatch::IntegrationTest data: { domainTransfers: [{ domainName: 'shop.test', transferCode: 'wrong' }] } } post '/repp/v1/domain_transfers', request_params, { 'HTTP_AUTHORIZATION' => http_auth_key } assert_response 400 - refute_equal registrars(:goodnames), domains(:shop).registrar + refute_equal registrars(:goodnames), @domain.registrar assert_equal ({ errors: [{ title: 'shop.test transfer code is wrong' }] }), JSON.parse(response.body, symbolize_names: true) end private + def request_params + { format: :json, + data: { domainTransfers: [{ domainName: 'shop.test', transferCode: '65078d5' }] } } + end + def http_auth_key ActionController::HttpAuthentication::Basic.encode_credentials('test_goodnames', 'testtest') end diff --git a/test/integration/epp/domain/transfer/transfer_code_test.rb b/test/integration/epp/domain/transfer/base_test.rb similarity index 65% rename from test/integration/epp/domain/transfer/transfer_code_test.rb rename to test/integration/epp/domain/transfer/base_test.rb index 0509d632a..aa9f841b6 100644 --- a/test/integration/epp/domain/transfer/transfer_code_test.rb +++ b/test/integration/epp/domain/transfer/base_test.rb @@ -1,16 +1,16 @@ require 'test_helper' -class EppDomainTransferTransferCodeTest < ActionDispatch::IntegrationTest - def test_wrong +class EppDomainTransferBaseTest < ActionDispatch::IntegrationTest + def test_non_existent_domain request_xml = <<-XML - shop.test + non-existent.test - wrong + any @@ -19,7 +19,6 @@ class EppDomainTransferTransferCodeTest < ActionDispatch::IntegrationTest XML post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } - refute_equal registrars(:goodnames), domains(:shop).registrar - assert_equal '2201', Nokogiri::XML(response.body).at_css('result')[:code] + assert_equal '2303', Nokogiri::XML(response.body).at_css('result')[:code] end end diff --git a/test/integration/epp/domain/transfer/domain_transfer_test.rb b/test/integration/epp/domain/transfer/domain_transfer_test.rb deleted file mode 100644 index 38b7a2757..000000000 --- a/test/integration/epp/domain/transfer/domain_transfer_test.rb +++ /dev/null @@ -1,49 +0,0 @@ -require 'test_helper' - -class EppDomainTransferTest < ActionDispatch::IntegrationTest - def test_transfers_domain_at_once_if_auto_confirm_is_enabled - Setting.transfer_wait_time = 0 - - request_xml = <<-XML - - - - - - shop.test - - 65078d5 - - - - - - XML - - post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } - assert_equal registrars(:goodnames), domains(:shop).registrar - assert_equal '1000', Nokogiri::XML(response.body).at_css('result')[:code] - assert_equal 1, Nokogiri::XML(response.body).css('result').size - end - - def test_non_existent_domain - request_xml = <<-XML - - - - - - non-existent.test - - any - - - - - - XML - - post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } - assert_equal '2303', Nokogiri::XML(response.body).at_css('result')[:code] - end -end diff --git a/test/integration/epp/domain/transfer/query_test.rb b/test/integration/epp/domain/transfer/query_test.rb new file mode 100644 index 000000000..0097a43f4 --- /dev/null +++ b/test/integration/epp/domain/transfer/query_test.rb @@ -0,0 +1,74 @@ +require 'test_helper' + +class EppDomainTransferQueryTest < ActionDispatch::IntegrationTest + def test_domain_transfer_details + request_xml = <<-XML + + + + + + shop.test + + 65078d5 + + + + + + XML + + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + xml_doc = Nokogiri::XML(response.body) + assert_equal '1000', xml_doc.at_css('result')[:code] + assert_equal 1, xml_doc.css('result').size + assert_equal 'shop.test', xml_doc.xpath('//domain:name', 'domain' => 'https://epp.tld.ee/schema/domain-eis-1.0.xsd').text + assert_equal 'serverApproved', xml_doc.xpath('//domain:trStatus', 'domain' => 'https://epp.tld.ee/schema/domain-eis-1.0.xsd').text + assert_equal 'goodnames', xml_doc.xpath('//domain:reID', 'domain' => 'https://epp.tld.ee/schema/domain-eis-1.0.xsd').text + assert_equal 'bestnames', xml_doc.xpath('//domain:acID', 'domain' => 'https://epp.tld.ee/schema/domain-eis-1.0.xsd').text + end + + def test_wrong_transfer_code + request_xml = <<-XML + + + + + + shop.test + + wrong + + + + + + XML + + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + assert_equal '2201', Nokogiri::XML(response.body).at_css('result')[:code] + end + + def test_no_domain_transfer + domains(:shop).domain_transfers.delete_all + + request_xml = <<-XML + + + + + + shop.test + + 65078d5 + + + + + + XML + + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + assert_equal '2303', Nokogiri::XML(response.body).at_css('result')[:code] + end +end diff --git a/test/integration/epp/domain/transfer/request_test.rb b/test/integration/epp/domain/transfer/request_test.rb new file mode 100644 index 000000000..981223d1e --- /dev/null +++ b/test/integration/epp/domain/transfer/request_test.rb @@ -0,0 +1,90 @@ +require 'test_helper' + +class EppDomainTransferRequestTest < ActionDispatch::IntegrationTest + def setup + @domain = domains(:shop) + Setting.transfer_wait_time = 0 + end + + def test_transfers_domain_at_once_if_auto_approval_is_enabled + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } + assert_equal '1000', Nokogiri::XML(response.body).at_css('result')[:code] + assert_equal 1, Nokogiri::XML(response.body).css('result').size + end + + def test_approves_automatically + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } + assert @domain.domain_transfers.last.approved? + end + + def test_changes_registrar + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } + @domain.reload + assert_equal registrars(:goodnames), @domain.registrar + end + + def test_regenerates_transfer_code + @old_transfer_code = @domain.transfer_code + + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } + + @domain.reload + refute_equal @domain.transfer_code, @old_transfer_code + end + + def test_notifies_old_registrar + @old_registrar = @domain.registrar + + assert_difference -> { @old_registrar.messages.count } do + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } + end + end + + def test_creates_copy_of_registrant_admin_and_tech_contacts + assert_difference 'Contact.count', 3 do + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } + end + end + + def test_wrong_transfer_code + request_xml = <<-XML + + + + + + shop.test + + wrong + + + + + + XML + + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } + refute_equal registrars(:goodnames), @domain.registrar + assert_equal '2201', Nokogiri::XML(response.body).at_css('result')[:code] + end + + private + + def request_xml + <<-XML + + + + + + shop.test + + 65078d5 + + + + + + XML + end +end diff --git a/test/models/domain/domain_transfer_test.rb b/test/models/domain/transfer_test.rb similarity index 78% rename from test/models/domain/domain_transfer_test.rb rename to test/models/domain/transfer_test.rb index 9f86615e3..7b4e83138 100644 --- a/test/models/domain/domain_transfer_test.rb +++ b/test/models/domain/transfer_test.rb @@ -46,24 +46,6 @@ class DomainTransferTest < ActiveSupport::TestCase refute_same old_transfer_code, @domain.transfer_code end - def test_creates_domain_transfer - assert_difference 'DomainTransfer.count' do - @domain.transfer(@new_registrar) - end - end - - def test_notifies_old_registrar - assert_difference 'Message.count' do - @domain.transfer(@new_registrar) - end - end - - def test_copies_contacts - assert_difference 'Contact.count', 2 do - @domain.transfer(@new_registrar) - end - end - def test_bypasses_domain_validation domain = domains(:invalid) domain.transfer(@new_registrar) From 1fa3a3496c3788b3f68a3956810c6f66669f7dd8 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sun, 18 Feb 2018 23:52:50 +0200 Subject: [PATCH 064/104] Bypass domain validation on transfer #694 --- app/models/concerns/domain/transferable.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/concerns/domain/transferable.rb b/app/models/concerns/domain/transferable.rb index 62b70a71b..67ebe0027 100644 --- a/app/models/concerns/domain/transferable.rb +++ b/app/models/concerns/domain/transferable.rb @@ -28,7 +28,7 @@ module Concerns::Domain::Transferable ) transfer_contacts(new_registrar) - save! + save(validate: false) end end From b16f931e9c7bc00cfc133330c87c2a3ecd2fd0e8 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 00:05:11 +0200 Subject: [PATCH 065/104] Extract method #694 --- app/models/concerns/domain/transferable.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/models/concerns/domain/transferable.rb b/app/models/concerns/domain/transferable.rb index 67ebe0027..d05535cff 100644 --- a/app/models/concerns/domain/transferable.rb +++ b/app/models/concerns/domain/transferable.rb @@ -2,7 +2,7 @@ module Concerns::Domain::Transferable extend ActiveSupport::Concern included do - after_initialize :generate_transfer_code, if: 'new_record? && transfer_code.blank?' + after_initialize :generate_transfer_code, if: :generate_transfer_code? end def transfer(new_registrar) @@ -34,6 +34,10 @@ module Concerns::Domain::Transferable private + def generate_transfer_code? + new_record? && transfer_code.blank? + end + def generate_transfer_code self.transfer_code = SecureRandom.hex end From fec617aa7d7846796cfd19e11f168296b2241768 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 00:56:17 +0200 Subject: [PATCH 066/104] Improve tests #694 --- .../epp/domain/transfer/base_test.rb | 23 +++++++++++ .../epp/domain/transfer/query_test.rb | 23 +---------- .../epp/domain/transfer/request_test.rb | 38 +++++++------------ 3 files changed, 38 insertions(+), 46 deletions(-) diff --git a/test/integration/epp/domain/transfer/base_test.rb b/test/integration/epp/domain/transfer/base_test.rb index aa9f841b6..4cb13f999 100644 --- a/test/integration/epp/domain/transfer/base_test.rb +++ b/test/integration/epp/domain/transfer/base_test.rb @@ -1,6 +1,29 @@ require 'test_helper' class EppDomainTransferBaseTest < ActionDispatch::IntegrationTest + def test_does_not_transfer_if_transfer_code_is_wrong + request_xml = <<-XML + + + + + + shop.test + + wrong + + + + + + XML + + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + domains(:shop).reload + assert_equal registrars(:bestnames), domains(:shop).registrar + assert_equal '2201', Nokogiri::XML(response.body).at_css('result')[:code] + end + def test_non_existent_domain request_xml = <<-XML diff --git a/test/integration/epp/domain/transfer/query_test.rb b/test/integration/epp/domain/transfer/query_test.rb index 0097a43f4..df426ba11 100644 --- a/test/integration/epp/domain/transfer/query_test.rb +++ b/test/integration/epp/domain/transfer/query_test.rb @@ -1,7 +1,7 @@ require 'test_helper' class EppDomainTransferQueryTest < ActionDispatch::IntegrationTest - def test_domain_transfer_details + def test_returns_domain_transfer_details request_xml = <<-XML @@ -28,27 +28,6 @@ class EppDomainTransferQueryTest < ActionDispatch::IntegrationTest assert_equal 'bestnames', xml_doc.xpath('//domain:acID', 'domain' => 'https://epp.tld.ee/schema/domain-eis-1.0.xsd').text end - def test_wrong_transfer_code - request_xml = <<-XML - - - - - - shop.test - - wrong - - - - - - XML - - post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } - assert_equal '2201', Nokogiri::XML(response.body).at_css('result')[:code] - end - def test_no_domain_transfer domains(:shop).domain_transfers.delete_all diff --git a/test/integration/epp/domain/transfer/request_test.rb b/test/integration/epp/domain/transfer/request_test.rb index 981223d1e..f2091dfad 100644 --- a/test/integration/epp/domain/transfer/request_test.rb +++ b/test/integration/epp/domain/transfer/request_test.rb @@ -6,15 +6,16 @@ class EppDomainTransferRequestTest < ActionDispatch::IntegrationTest Setting.transfer_wait_time = 0 end - def test_transfers_domain_at_once_if_auto_approval_is_enabled + def test_transfers_domain_at_once post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } assert_equal '1000', Nokogiri::XML(response.body).at_css('result')[:code] assert_equal 1, Nokogiri::XML(response.body).css('result').size end - def test_approves_automatically + def test_approves_automatically_if_auto_approval_is_enabled post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } - assert @domain.domain_transfers.last.approved? + assert_equal 'serverApproved', Nokogiri::XML(response.body).xpath('//domain:trStatus', 'domain' => + 'https://epp.tld.ee/schema/domain-eis-1.0.xsd').text end def test_changes_registrar @@ -40,32 +41,16 @@ class EppDomainTransferRequestTest < ActionDispatch::IntegrationTest end end - def test_creates_copy_of_registrant_admin_and_tech_contacts + def test_duplicates_registrant_admin_and_tech_contacts assert_difference 'Contact.count', 3 do post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } end end - def test_wrong_transfer_code - request_xml = <<-XML - - - - - - shop.test - - wrong - - - - - - XML - - post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } - refute_equal registrars(:goodnames), @domain.registrar - assert_equal '2201', Nokogiri::XML(response.body).at_css('result')[:code] + def test_saves_legal_document + assert_difference -> { @domain.legal_documents(true).size } do + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } + end end private @@ -83,6 +68,11 @@ class EppDomainTransferRequestTest < ActionDispatch::IntegrationTest + + + test + + XML From 126428f38f34ef756f71c8f0ffe9e99d8c62b105 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 00:59:00 +0200 Subject: [PATCH 067/104] Improve tests #694 --- test/integration/api/domain_transfers_test.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/integration/api/domain_transfers_test.rb b/test/integration/api/domain_transfers_test.rb index 80c637eaa..938fec53f 100644 --- a/test/integration/api/domain_transfers_test.rb +++ b/test/integration/api/domain_transfers_test.rb @@ -14,9 +14,9 @@ class APIDomainTransfersTest < ActionDispatch::IntegrationTest JSON.parse(response.body, symbolize_names: true) end - def test_approves_automatically + def test_approves_automatically_if_auto_approval_is_enabled post '/repp/v1/domain_transfers', request_params, { 'HTTP_AUTHORIZATION' => http_auth_key } - assert @domain.domain_transfers.last.approved? + assert @domain.domain_transfers(true).last.approved? end def test_changes_registrar @@ -41,7 +41,7 @@ class APIDomainTransfersTest < ActionDispatch::IntegrationTest end end - def test_creates_copy_of_registrant_admin_and_tech_contacts + def test_duplicates_registrant_admin_and_tech_contacts assert_difference 'Contact.count', 3 do post '/repp/v1/domain_transfers', request_params, { 'HTTP_AUTHORIZATION' => http_auth_key } end From 4ada9d1bd00a02f7d10fabf84a1ce135bd59c4c0 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 02:04:39 +0200 Subject: [PATCH 068/104] Fail earlier if domain is non-transferable Regardless of EPP transfer operation #694 --- app/controllers/epp/domains_controller.rb | 7 ++++++ app/models/concerns/domain/transferable.rb | 4 +++ app/models/epp/domain.rb | 7 ------ test/fixtures/domains.yml | 9 +++++++ .../epp/domain/transfer/base_test.rb | 25 ++++++++++++++++++- 5 files changed, 44 insertions(+), 8 deletions(-) diff --git a/app/controllers/epp/domains_controller.rb b/app/controllers/epp/domains_controller.rb index 02c75c7da..3b8b94155 100644 --- a/app/controllers/epp/domains_controller.rb +++ b/app/controllers/epp/domains_controller.rb @@ -142,6 +142,13 @@ class Epp::DomainsController < EppController authorize! :transfer, @domain, @password action = params[:parsed_frame].css('transfer').first[:op] + if @domain.non_transferable? + throw :epp_error, { + code: '2304', + msg: I18n.t(:object_status_prohibits_operation) + } + end + @domain_transfer = @domain.transfer(params[:parsed_frame], action, current_user) if @domain_transfer diff --git a/app/models/concerns/domain/transferable.rb b/app/models/concerns/domain/transferable.rb index d05535cff..eda71722c 100644 --- a/app/models/concerns/domain/transferable.rb +++ b/app/models/concerns/domain/transferable.rb @@ -5,6 +5,10 @@ module Concerns::Domain::Transferable after_initialize :generate_transfer_code, if: :generate_transfer_code? end + def non_transferable? + !transferrable? + end + def transfer(new_registrar) old_registrar = registrar diff --git a/app/models/epp/domain.rb b/app/models/epp/domain.rb index a59094d1e..2b2b6d615 100644 --- a/app/models/epp/domain.rb +++ b/app/models/epp/domain.rb @@ -644,13 +644,6 @@ class Epp::Domain < Domain # rubocop: disable Metrics/MethodLength # rubocop: disable Metrics/AbcSize def query_transfer(frame, current_user) - unless transferrable? - throw :epp_error, { - code: '2304', - msg: I18n.t(:object_status_prohibits_operation) - } - end - if current_user.registrar == registrar throw :epp_error, { code: '2002', diff --git a/test/fixtures/domains.yml b/test/fixtures/domains.yml index 7c0844d97..d6ffe2904 100644 --- a/test/fixtures/domains.yml +++ b/test/fixtures/domains.yml @@ -28,6 +28,15 @@ library: period: 1 period_unit: m +non_transferable: + name: non-transferable.test + transfer_code: d382682 + valid_to: 2010-07-05 + registrar: bestnames + registrant: john + statuses: + - serverTransferProhibited + invalid: name: invalid.test transfer_code: any diff --git a/test/integration/epp/domain/transfer/base_test.rb b/test/integration/epp/domain/transfer/base_test.rb index 4cb13f999..a973037e1 100644 --- a/test/integration/epp/domain/transfer/base_test.rb +++ b/test/integration/epp/domain/transfer/base_test.rb @@ -1,7 +1,30 @@ require 'test_helper' class EppDomainTransferBaseTest < ActionDispatch::IntegrationTest - def test_does_not_transfer_if_transfer_code_is_wrong + def test_non_transferable_domain + request_xml = <<-XML + + + + + + non-transferable.test + + d382682 + + + + + + XML + + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + domains(:shop).reload + assert_equal registrars(:bestnames), domains(:shop).registrar + assert_equal '2304', Nokogiri::XML(response.body).at_css('result')[:code] + end + + def test_wrong_transfer_code request_xml = <<-XML From 36f65a267cddc2ae5fbda6d86faf3731614ca61d Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 02:14:13 +0200 Subject: [PATCH 069/104] Improve tests #694 --- .../epp/domain/transfer/base_test.rb | 23 --------- .../epp/domain/transfer/query_test.rb | 48 +++++++++++-------- .../epp/domain/transfer/request_test.rb | 23 +++++++++ 3 files changed, 51 insertions(+), 43 deletions(-) diff --git a/test/integration/epp/domain/transfer/base_test.rb b/test/integration/epp/domain/transfer/base_test.rb index a973037e1..0ceeca30a 100644 --- a/test/integration/epp/domain/transfer/base_test.rb +++ b/test/integration/epp/domain/transfer/base_test.rb @@ -24,29 +24,6 @@ class EppDomainTransferBaseTest < ActionDispatch::IntegrationTest assert_equal '2304', Nokogiri::XML(response.body).at_css('result')[:code] end - def test_wrong_transfer_code - request_xml = <<-XML - - - - - - shop.test - - wrong - - - - - - XML - - post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } - domains(:shop).reload - assert_equal registrars(:bestnames), domains(:shop).registrar - assert_equal '2201', Nokogiri::XML(response.body).at_css('result')[:code] - end - def test_non_existent_domain request_xml = <<-XML diff --git a/test/integration/epp/domain/transfer/query_test.rb b/test/integration/epp/domain/transfer/query_test.rb index df426ba11..f12cb381f 100644 --- a/test/integration/epp/domain/transfer/query_test.rb +++ b/test/integration/epp/domain/transfer/query_test.rb @@ -2,22 +2,6 @@ require 'test_helper' class EppDomainTransferQueryTest < ActionDispatch::IntegrationTest def test_returns_domain_transfer_details - request_xml = <<-XML - - - - - - shop.test - - 65078d5 - - - - - - XML - post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } xml_doc = Nokogiri::XML(response.body) assert_equal '1000', xml_doc.at_css('result')[:code] @@ -28,10 +12,37 @@ class EppDomainTransferQueryTest < ActionDispatch::IntegrationTest assert_equal 'bestnames', xml_doc.xpath('//domain:acID', 'domain' => 'https://epp.tld.ee/schema/domain-eis-1.0.xsd').text end + def test_wrong_transfer_code + request_xml = <<-XML + + + + + + shop.test + + wrong + + + + + + XML + + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + assert_equal '2201', Nokogiri::XML(response.body).at_css('result')[:code] + end + def test_no_domain_transfer domains(:shop).domain_transfers.delete_all + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + assert_equal '2303', Nokogiri::XML(response.body).at_css('result')[:code] + end - request_xml = <<-XML + private + + def request_xml + <<-XML @@ -46,8 +57,5 @@ class EppDomainTransferQueryTest < ActionDispatch::IntegrationTest XML - - post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } - assert_equal '2303', Nokogiri::XML(response.body).at_css('result')[:code] end end diff --git a/test/integration/epp/domain/transfer/request_test.rb b/test/integration/epp/domain/transfer/request_test.rb index f2091dfad..a775e3204 100644 --- a/test/integration/epp/domain/transfer/request_test.rb +++ b/test/integration/epp/domain/transfer/request_test.rb @@ -53,6 +53,29 @@ class EppDomainTransferRequestTest < ActionDispatch::IntegrationTest end end + def test_wrong_transfer_code + request_xml = <<-XML + + + + + + shop.test + + wrong + + + + + + XML + + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + domains(:shop).reload + assert_equal registrars(:bestnames), domains(:shop).registrar + assert_equal '2201', Nokogiri::XML(response.body).at_css('result')[:code] + end + private def request_xml From 1ba274764db07cfd71c0b0729d236118b630a1ba Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 02:21:47 +0200 Subject: [PATCH 070/104] Convert spec to test #694 --- .../epp/domain/transfer/discarded_spec.rb | 45 ------------------- test/fixtures/domains.yml | 9 ++++ .../epp/domain/transfer/request_test.rb | 23 ++++++++++ 3 files changed, 32 insertions(+), 45 deletions(-) delete mode 100644 spec/requests/epp/domain/transfer/discarded_spec.rb diff --git a/spec/requests/epp/domain/transfer/discarded_spec.rb b/spec/requests/epp/domain/transfer/discarded_spec.rb deleted file mode 100644 index 26596d993..000000000 --- a/spec/requests/epp/domain/transfer/discarded_spec.rb +++ /dev/null @@ -1,45 +0,0 @@ -require 'rails_helper' - -RSpec.describe 'EPP domain:transfer' do - let(:registrar) { create(:registrar) } - let(:user) { create(:api_user_epp, registrar: registrar) } - let(:session_id) { create(:epp_session, user: user).session_id } - let(:request_xml) { <<-XML - - - - - - test.com - - 98oiewslkfkd - - - - - - XML - } - - before :example do - login_as user - end - - context 'when domain is not discarded' do - let!(:domain) { create(:domain, name: 'test.com') } - - it 'returns epp code of 1000' do - post '/epp/command/transfer', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" - expect(response).to have_code_of(1000) - end - end - - context 'when domain is discarded' do - let!(:domain) { create(:domain_discarded, name: 'test.com') } - - it 'returns epp code of 2105' do - post '/epp/command/transfer', { frame: request_xml }, 'HTTP_COOKIE' => "session=#{session_id}" - expect(response).to have_code_of(2105) - end - end -end diff --git a/test/fixtures/domains.yml b/test/fixtures/domains.yml index d6ffe2904..2e4a06de2 100644 --- a/test/fixtures/domains.yml +++ b/test/fixtures/domains.yml @@ -37,6 +37,15 @@ non_transferable: statuses: - serverTransferProhibited +discarded: + name: discarded.test + transfer_code: any + valid_to: 2010-07-05 + registrar: bestnames + registrant: john + statuses: + - deleteCandidate + invalid: name: invalid.test transfer_code: any diff --git a/test/integration/epp/domain/transfer/request_test.rb b/test/integration/epp/domain/transfer/request_test.rb index a775e3204..007efe762 100644 --- a/test/integration/epp/domain/transfer/request_test.rb +++ b/test/integration/epp/domain/transfer/request_test.rb @@ -53,6 +53,29 @@ class EppDomainTransferRequestTest < ActionDispatch::IntegrationTest end end + def test_discarded_domain + request_xml = <<-XML + + + + + + discarded.test + + any + + + + + + XML + + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + @domain.reload + assert_equal registrars(:bestnames), @domain.registrar + assert_equal '2105', Nokogiri::XML(response.body).at_css('result')[:code] + end + def test_wrong_transfer_code request_xml = <<-XML From de625878068e832d135350e009e2139bbd5fc04c Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 02:22:47 +0200 Subject: [PATCH 071/104] Improve test #694 --- test/integration/epp/domain/transfer/request_test.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/integration/epp/domain/transfer/request_test.rb b/test/integration/epp/domain/transfer/request_test.rb index 007efe762..5031760c3 100644 --- a/test/integration/epp/domain/transfer/request_test.rb +++ b/test/integration/epp/domain/transfer/request_test.rb @@ -94,8 +94,8 @@ class EppDomainTransferRequestTest < ActionDispatch::IntegrationTest XML post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } - domains(:shop).reload - assert_equal registrars(:bestnames), domains(:shop).registrar + @domain.reload + refute_equal registrars(:goodnames), @domain.registrar assert_equal '2201', Nokogiri::XML(response.body).at_css('result')[:code] end From 5c4d69cc1877f0bf5827694526f22713f5ab05df Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 02:26:25 +0200 Subject: [PATCH 072/104] Move method #694 --- app/models/concerns/domain/transferable.rb | 14 ++++++++++++++ app/models/epp/domain.rb | 14 -------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/app/models/concerns/domain/transferable.rb b/app/models/concerns/domain/transferable.rb index eda71722c..ce442140a 100644 --- a/app/models/concerns/domain/transferable.rb +++ b/app/models/concerns/domain/transferable.rb @@ -38,6 +38,20 @@ module Concerns::Domain::Transferable private + def transferrable? + (statuses & [ + DomainStatus::PENDING_DELETE_CONFIRMATION, + DomainStatus::PENDING_CREATE, + DomainStatus::PENDING_UPDATE, + DomainStatus::PENDING_DELETE, + DomainStatus::PENDING_RENEW, + DomainStatus::PENDING_TRANSFER, + DomainStatus::FORCE_DELETE, + DomainStatus::SERVER_TRANSFER_PROHIBITED, + DomainStatus::CLIENT_TRANSFER_PROHIBITED + ]).empty? + end + def generate_transfer_code? new_record? && transfer_code.blank? end diff --git a/app/models/epp/domain.rb b/app/models/epp/domain.rb index 2b2b6d615..033640c1e 100644 --- a/app/models/epp/domain.rb +++ b/app/models/epp/domain.rb @@ -804,20 +804,6 @@ class Epp::Domain < Domain true end - def transferrable? - (statuses & [ - DomainStatus::PENDING_DELETE_CONFIRMATION, - DomainStatus::PENDING_CREATE, - DomainStatus::PENDING_UPDATE, - DomainStatus::PENDING_DELETE, - DomainStatus::PENDING_RENEW, - DomainStatus::PENDING_TRANSFER, - DomainStatus::FORCE_DELETE, - DomainStatus::SERVER_TRANSFER_PROHIBITED, - DomainStatus::CLIENT_TRANSFER_PROHIBITED - ]).empty? - end - ## SHARED # For domain transfer From 07e40d61ddb8c6b01f84f5d51a76d829b3809673 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 02:28:00 +0200 Subject: [PATCH 073/104] Fix typo #694 --- app/models/concerns/domain/transferable.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/concerns/domain/transferable.rb b/app/models/concerns/domain/transferable.rb index ce442140a..df00a1b42 100644 --- a/app/models/concerns/domain/transferable.rb +++ b/app/models/concerns/domain/transferable.rb @@ -6,7 +6,7 @@ module Concerns::Domain::Transferable end def non_transferable? - !transferrable? + !transferable? end def transfer(new_registrar) @@ -38,7 +38,7 @@ module Concerns::Domain::Transferable private - def transferrable? + def transferable? (statuses & [ DomainStatus::PENDING_DELETE_CONFIRMATION, DomainStatus::PENDING_CREATE, From 34f1e2be2f4b41d4d08105a687695ab835071a4a Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 02:40:25 +0200 Subject: [PATCH 074/104] Improve tests #694 --- test/integration/api/domain_transfers_test.rb | 7 +++++++ test/integration/epp/domain/transfer/request_test.rb | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/test/integration/api/domain_transfers_test.rb b/test/integration/api/domain_transfers_test.rb index 938fec53f..12c8c78c1 100644 --- a/test/integration/api/domain_transfers_test.rb +++ b/test/integration/api/domain_transfers_test.rb @@ -3,6 +3,7 @@ require 'test_helper' class APIDomainTransfersTest < ActionDispatch::IntegrationTest def setup @domain = domains(:shop) + Setting.transfer_wait_time = 0 # Auto-approval end def test_returns_domain_transfers @@ -14,6 +15,12 @@ class APIDomainTransfersTest < ActionDispatch::IntegrationTest JSON.parse(response.body, symbolize_names: true) end + def test_creates_new_domain_transfer + assert_difference -> { @domain.domain_transfers.size } do + post '/repp/v1/domain_transfers', request_params, { 'HTTP_AUTHORIZATION' => http_auth_key } + end + end + def test_approves_automatically_if_auto_approval_is_enabled post '/repp/v1/domain_transfers', request_params, { 'HTTP_AUTHORIZATION' => http_auth_key } assert @domain.domain_transfers(true).last.approved? diff --git a/test/integration/epp/domain/transfer/request_test.rb b/test/integration/epp/domain/transfer/request_test.rb index 5031760c3..8ad1f6c92 100644 --- a/test/integration/epp/domain/transfer/request_test.rb +++ b/test/integration/epp/domain/transfer/request_test.rb @@ -12,6 +12,12 @@ class EppDomainTransferRequestTest < ActionDispatch::IntegrationTest assert_equal 1, Nokogiri::XML(response.body).css('result').size end + def test_creates_new_domain_transfer + assert_difference -> { @domain.domain_transfers.size } do + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } + end + end + def test_approves_automatically_if_auto_approval_is_enabled post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } assert_equal 'serverApproved', Nokogiri::XML(response.body).xpath('//domain:trStatus', 'domain' => From 8606cf7b48107c102bb3622d81f518cd26ff9b5c Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 02:52:35 +0200 Subject: [PATCH 075/104] Refactor domain transfer #694 --- app/api/repp/domain_transfers_v1.rb | 2 +- app/models/concerns/domain/transferable.rb | 17 --------- app/models/domain_transfer.rb | 42 ++++++++++++++++++++++ test/models/domain_transfer_test.rb | 30 ++++++++++++++++ 4 files changed, 73 insertions(+), 18 deletions(-) create mode 100644 test/models/domain_transfer_test.rb diff --git a/app/api/repp/domain_transfers_v1.rb b/app/api/repp/domain_transfers_v1.rb index addae67b2..ea714a731 100644 --- a/app/api/repp/domain_transfers_v1.rb +++ b/app/api/repp/domain_transfers_v1.rb @@ -25,7 +25,7 @@ module Repp if domain if domain.transfer_code == transfer_code - domain.transfer(new_registrar) + DomainTransfer.request(domain, new_registrar) successful_domain_transfers << { type: 'domain_transfer' } else errors << { title: "#{domain_name} transfer code is wrong" } diff --git a/app/models/concerns/domain/transferable.rb b/app/models/concerns/domain/transferable.rb index df00a1b42..554eb7dd3 100644 --- a/app/models/concerns/domain/transferable.rb +++ b/app/models/concerns/domain/transferable.rb @@ -10,27 +10,10 @@ module Concerns::Domain::Transferable end def transfer(new_registrar) - old_registrar = registrar - self.registrar = new_registrar regenerate_transfer_code - contact_codes = contacts.pluck(:code).sort.uniq - registrant_code = registrant.code - transaction do - old_registrar.messages.create!( - body: I18n.t('domain_transfer_was_approved', contacts: contact_codes, registrant: registrant_code), - attached_obj_id: id, - attached_obj_type: self.class.name - ) - - domain_transfers.create!( - transfer_requested_at: Time.zone.now, - old_registrar: old_registrar, - new_registrar: new_registrar - ) - transfer_contacts(new_registrar) save(validate: false) end diff --git a/app/models/domain_transfer.rb b/app/models/domain_transfer.rb index 5f498185e..42f531030 100644 --- a/app/models/domain_transfer.rb +++ b/app/models/domain_transfer.rb @@ -11,6 +11,25 @@ class DomainTransfer < ActiveRecord::Base before_create :set_wait_until + class << self + def request(domain, new_registrar) + domain_transfer = create!( + transfer_requested_at: Time.zone.now, + domain: domain, + old_registrar: domain.registrar, + new_registrar: new_registrar + ) + + domain_transfer.approve if approve_automatically? + end + + private + + def approve_automatically? + Setting.transfer_wait_time.zero? + end + end + def set_wait_until wait_time = Setting.transfer_wait_time return if wait_time == 0 @@ -45,4 +64,27 @@ class DomainTransfer < ActiveRecord::Base attached_obj_type: self.class.to_s ) end + + def approve + transaction do + self.status = SERVER_APPROVED + save! + + notify_old_registrar + domain.transfer(new_registrar) + end + end + + private + + def notify_old_registrar + old_contacts_codes = domain.contacts.pluck(:code).sort.uniq + old_registrant_code = domain.registrant.code + + old_registrar.messages.create!( + body: I18n.t('domain_transfer_was_approved', contacts: old_contacts_codes, registrant: old_registrant_code), + attached_obj_id: id, + attached_obj_type: self.class.name + ) + end end diff --git a/test/models/domain_transfer_test.rb b/test/models/domain_transfer_test.rb new file mode 100644 index 000000000..12f36d459 --- /dev/null +++ b/test/models/domain_transfer_test.rb @@ -0,0 +1,30 @@ +require 'test_helper' + +class DomainTransferTest < ActiveSupport::TestCase + def setup + @domain_transfer = domain_transfers(:shop) + end + + def test_approval + @domain_transfer.approve + @domain_transfer.reload + assert @domain_transfer.approved? + end + + def test_notifies_old_registrar_on_approval + old_registrar = @domain_transfer.old_registrar + + assert_difference -> { old_registrar.messages.count } do + @domain_transfer.approve + end + + body = 'Domain transfer was approved, associated contacts were: ["jane-001", "william-001"] and registrant was john-001' + id = @domain_transfer.id + class_name = @domain_transfer.class.name + + message = old_registrar.messages.last + assert_equal body, message.body + assert_equal id, message.attached_obj_id + assert_equal class_name, message.attached_obj_type + end +end From 6a7effac50e40ccdefcb01fffa4542a6bc558a0f Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 03:04:55 +0200 Subject: [PATCH 076/104] Improve tests #694 --- test/integration/api/domain_transfers_test.rb | 3 +++ test/integration/epp/domain/transfer/request_test.rb | 3 +++ 2 files changed, 6 insertions(+) diff --git a/test/integration/api/domain_transfers_test.rb b/test/integration/api/domain_transfers_test.rb index 12c8c78c1..47730e475 100644 --- a/test/integration/api/domain_transfers_test.rb +++ b/test/integration/api/domain_transfers_test.rb @@ -46,6 +46,9 @@ class APIDomainTransfersTest < ActionDispatch::IntegrationTest assert_difference -> { @old_registrar.messages.count } do post '/repp/v1/domain_transfers', request_params, { 'HTTP_AUTHORIZATION' => http_auth_key } end + + message = 'Domain transfer was approved, associated contacts were: ["jane-001", "william-001"] and registrant was john-001' + assert_equal message, @old_registrar.messages.last.body end def test_duplicates_registrant_admin_and_tech_contacts diff --git a/test/integration/epp/domain/transfer/request_test.rb b/test/integration/epp/domain/transfer/request_test.rb index 8ad1f6c92..ce00d1fdb 100644 --- a/test/integration/epp/domain/transfer/request_test.rb +++ b/test/integration/epp/domain/transfer/request_test.rb @@ -45,6 +45,9 @@ class EppDomainTransferRequestTest < ActionDispatch::IntegrationTest assert_difference -> { @old_registrar.messages.count } do post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } end + + message = 'Domain transfer was approved, associated contacts were: ["jane-001", "william-001"] and registrant was john-001' + assert_equal message, @old_registrar.messages.last.body end def test_duplicates_registrant_admin_and_tech_contacts From 4d7a222547af0b956137eb8820b9d512924a704a Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 03:51:32 +0200 Subject: [PATCH 077/104] Add domain name to domain transfer message #694 --- app/models/domain_transfer.rb | 15 +++++---------- app/models/epp/domain.rb | 5 +---- config/locales/en.yml | 1 - config/locales/messages.en.yml | 13 ++++++------- test/integration/api/domain_transfers_test.rb | 4 +++- .../epp/domain/transfer/request_test.rb | 4 +++- test/models/domain_transfer_test.rb | 4 +++- 7 files changed, 21 insertions(+), 25 deletions(-) diff --git a/app/models/domain_transfer.rb b/app/models/domain_transfer.rb index 42f531030..6982f36b6 100644 --- a/app/models/domain_transfer.rb +++ b/app/models/domain_transfer.rb @@ -57,14 +57,6 @@ class DomainTransfer < ActiveRecord::Base status == PENDING end - def notify_losing_registrar(contacts, registrant) - old_registrar.messages.create!( - body: I18n.t('domain_transfer_was_approved', contacts: contacts, registrant: registrant), - attached_obj_id: id, - attached_obj_type: self.class.to_s - ) - end - def approve transaction do self.status = SERVER_APPROVED @@ -78,11 +70,14 @@ class DomainTransfer < ActiveRecord::Base private def notify_old_registrar - old_contacts_codes = domain.contacts.pluck(:code).sort.uniq + old_contacts_codes = domain.contacts.pluck(:code).sort.uniq.join(', ') old_registrant_code = domain.registrant.code old_registrar.messages.create!( - body: I18n.t('domain_transfer_was_approved', contacts: old_contacts_codes, registrant: old_registrant_code), + body: I18n.t('messages.texts.domain_transfer', + domain_name: domain.name, + old_contacts_codes: old_contacts_codes, + old_registrant_code: old_registrant_code), attached_obj_id: id, attached_obj_type: self.class.name ) diff --git a/app/models/epp/domain.rb b/app/models/epp/domain.rb index 033640c1e..32a8a2198 100644 --- a/app/models/epp/domain.rb +++ b/app/models/epp/domain.rb @@ -651,9 +651,6 @@ class Epp::Domain < Domain } end - old_contact_codes = contacts.pluck(:code).sort.uniq - old_registrant_code = registrant.code - transaction do dt = domain_transfers.create!( transfer_requested_at: Time.zone.now, @@ -670,8 +667,8 @@ class Epp::Domain < Domain end if dt.approved? + dt.send(:notify_old_registrar) transfer_contacts(current_user.registrar) - dt.notify_losing_registrar(old_contact_codes, old_registrant_code) regenerate_transfer_code self.registrar = current_user.registrar end diff --git a/config/locales/en.yml b/config/locales/en.yml index da6df608a..38b9c1973 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -451,7 +451,6 @@ en: client_side_status_editing_error: 'Parameter value policy error. Client-side object status management not supported' switch_to: Switch to admin_menu: Admin - domain_transfer_was_approved: 'Domain transfer was approved, associated contacts were: %{contacts} and registrant was %{registrant}' business_registry_service_not_available: "Business Registry service Ärireg is not available" # DEPP diff --git a/config/locales/messages.en.yml b/config/locales/messages.en.yml index 5cc945c25..2827a2f18 100644 --- a/config/locales/messages.en.yml +++ b/config/locales/messages.en.yml @@ -1,8 +1,7 @@ en: - activerecord: - attributes: - message/body: - domain_transfer: >- - Domain transfer of %{domain_name} has been approved. - Old contacts: %{old_contacts}; - old registrant: %{old_registrant} + messages: + texts: + domain_transfer: >- + Domain transfer of %{domain_name} has been approved. + Old contacts: %{old_contacts_codes}; + old registrant: %{old_registrant_code} diff --git a/test/integration/api/domain_transfers_test.rb b/test/integration/api/domain_transfers_test.rb index 47730e475..acae0e2e0 100644 --- a/test/integration/api/domain_transfers_test.rb +++ b/test/integration/api/domain_transfers_test.rb @@ -47,7 +47,9 @@ class APIDomainTransfersTest < ActionDispatch::IntegrationTest post '/repp/v1/domain_transfers', request_params, { 'HTTP_AUTHORIZATION' => http_auth_key } end - message = 'Domain transfer was approved, associated contacts were: ["jane-001", "william-001"] and registrant was john-001' + message = 'Domain transfer of shop.test has been approved.' \ + ' Old contacts: jane-001, william-001' \ + '; old registrant: john-001' assert_equal message, @old_registrar.messages.last.body end diff --git a/test/integration/epp/domain/transfer/request_test.rb b/test/integration/epp/domain/transfer/request_test.rb index ce00d1fdb..e83bfb2e4 100644 --- a/test/integration/epp/domain/transfer/request_test.rb +++ b/test/integration/epp/domain/transfer/request_test.rb @@ -46,7 +46,9 @@ class EppDomainTransferRequestTest < ActionDispatch::IntegrationTest post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } end - message = 'Domain transfer was approved, associated contacts were: ["jane-001", "william-001"] and registrant was john-001' + message = 'Domain transfer of shop.test has been approved.' \ + ' Old contacts: jane-001, william-001' \ + '; old registrant: john-001' assert_equal message, @old_registrar.messages.last.body end diff --git a/test/models/domain_transfer_test.rb b/test/models/domain_transfer_test.rb index 12f36d459..3d1e8edd9 100644 --- a/test/models/domain_transfer_test.rb +++ b/test/models/domain_transfer_test.rb @@ -18,7 +18,9 @@ class DomainTransferTest < ActiveSupport::TestCase @domain_transfer.approve end - body = 'Domain transfer was approved, associated contacts were: ["jane-001", "william-001"] and registrant was john-001' + body = 'Domain transfer of shop.test has been approved.' \ + ' Old contacts: jane-001, william-001' \ + '; old registrant: john-001' id = @domain_transfer.id class_name = @domain_transfer.class.name From 46ef0d1db60f3f2161d4855c16881fcd68dde128 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 03:56:35 +0200 Subject: [PATCH 078/104] Revert "Revert "Tell Travis to build all branches"" This reverts commit 2902a2f5a22972bf0c4bdf246de4513ec663ed95. --- .travis.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index e375b943c..a5fec1a71 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,3 @@ services: - postgresql addons: postgresql: "9.4" -branches: - only: - - master - - staging From ebd9fc550404e6af99a00d1075a5644bff966e19 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 04:18:01 +0200 Subject: [PATCH 079/104] Extract translation #694 --- app/views/registrar/polls/show.haml | 4 ++-- config/locales/registrar/polls.en.yml | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 config/locales/registrar/polls.en.yml diff --git a/app/views/registrar/polls/show.haml b/app/views/registrar/polls/show.haml index 69e74751b..c4c337749 100644 --- a/app/views/registrar/polls/show.haml +++ b/app/views/registrar/polls/show.haml @@ -2,7 +2,7 @@ - msg_q = @data.css('msgQ').first .row .col-sm-12 - %h2= t('messages', count: msg_q['count']) + %h2= t '.header', count: msg_q['count'] %hr .row .col-md-12 @@ -75,7 +75,7 @@ - else .row .col-sm-12 - %h2= t('messages', count: 0) + %h2= t '.header', count: 0 %hr .row .col-md-12 diff --git a/config/locales/registrar/polls.en.yml b/config/locales/registrar/polls.en.yml new file mode 100644 index 000000000..4d09e54f4 --- /dev/null +++ b/config/locales/registrar/polls.en.yml @@ -0,0 +1,5 @@ +en: + registrar: + polls: + show: + header: Messages (%{count}) From 5ad66ef43e0f057fe3eaaeb951fa469f82604f6c Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 04:27:09 +0200 Subject: [PATCH 080/104] Remove unused translation #694 --- config/locales/en.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 38b9c1973..c49781934 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -525,7 +525,6 @@ en: address: 'Address' street: 'Street' city: 'City' - messages: 'Messages (%{count})' message: 'Message' message_no: 'Message #%{id}' queue_date: 'Queue date' From 25e34b388d3017d652f84afd3284ef04c73c3dc9 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 04:54:49 +0200 Subject: [PATCH 081/104] Mutate fixture instead of relying on separate ones #694 --- test/fixtures/domains.yml | 18 ------------- .../epp/domain/transfer/base_test.rb | 23 ---------------- .../epp/domain/transfer/request_test.rb | 27 +++++++++---------- 3 files changed, 12 insertions(+), 56 deletions(-) diff --git a/test/fixtures/domains.yml b/test/fixtures/domains.yml index 2e4a06de2..7c0844d97 100644 --- a/test/fixtures/domains.yml +++ b/test/fixtures/domains.yml @@ -28,24 +28,6 @@ library: period: 1 period_unit: m -non_transferable: - name: non-transferable.test - transfer_code: d382682 - valid_to: 2010-07-05 - registrar: bestnames - registrant: john - statuses: - - serverTransferProhibited - -discarded: - name: discarded.test - transfer_code: any - valid_to: 2010-07-05 - registrar: bestnames - registrant: john - statuses: - - deleteCandidate - invalid: name: invalid.test transfer_code: any diff --git a/test/integration/epp/domain/transfer/base_test.rb b/test/integration/epp/domain/transfer/base_test.rb index 0ceeca30a..aa9f841b6 100644 --- a/test/integration/epp/domain/transfer/base_test.rb +++ b/test/integration/epp/domain/transfer/base_test.rb @@ -1,29 +1,6 @@ require 'test_helper' class EppDomainTransferBaseTest < ActionDispatch::IntegrationTest - def test_non_transferable_domain - request_xml = <<-XML - - - - - - non-transferable.test - - d382682 - - - - - - XML - - post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } - domains(:shop).reload - assert_equal registrars(:bestnames), domains(:shop).registrar - assert_equal '2304', Nokogiri::XML(response.body).at_css('result')[:code] - end - def test_non_existent_domain request_xml = <<-XML diff --git a/test/integration/epp/domain/transfer/request_test.rb b/test/integration/epp/domain/transfer/request_test.rb index e83bfb2e4..cc9fb5475 100644 --- a/test/integration/epp/domain/transfer/request_test.rb +++ b/test/integration/epp/domain/transfer/request_test.rb @@ -64,25 +64,22 @@ class EppDomainTransferRequestTest < ActionDispatch::IntegrationTest end end + def test_non_transferable_domain + @domain.update!(statuses: [DomainStatus::SERVER_TRANSFER_PROHIBITED]) + + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + domains(:shop).reload + + assert_equal registrars(:bestnames), domains(:shop).registrar + assert_equal '2304', Nokogiri::XML(response.body).at_css('result')[:code] + end + def test_discarded_domain - request_xml = <<-XML - - - - - - discarded.test - - any - - - - - - XML + @domain.update!(statuses: [DomainStatus::DELETE_CANDIDATE]) post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } @domain.reload + assert_equal registrars(:bestnames), @domain.registrar assert_equal '2105', Nokogiri::XML(response.body).at_css('result')[:code] end From a7ed2f35d79cecdd64f3bd346cdc431a0302269d Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 05:05:35 +0200 Subject: [PATCH 082/104] Rename Domain#domain_transfers to #transfers #694 --- app/models/domain.rb | 4 ++-- app/models/epp/domain.rb | 4 ++-- test/integration/api/domain_transfers_test.rb | 4 ++-- test/integration/epp/domain/transfer/query_test.rb | 2 +- test/integration/epp/domain/transfer/request_test.rb | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/models/domain.rb b/app/models/domain.rb index 31ba838f2..54dfe608e 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -49,7 +49,7 @@ class Domain < ActiveRecord::Base accepts_nested_attributes_for :domain_statuses, allow_destroy: true, reject_if: proc { |attrs| attrs[:value].blank? } - has_many :domain_transfers, dependent: :destroy + has_many :transfers, class_name: 'DomainTransfer', dependent: :destroy has_many :dnskeys, dependent: :destroy @@ -280,7 +280,7 @@ class Domain < ActiveRecord::Base end def pending_transfer - domain_transfers.find_by(status: DomainTransfer::PENDING) + transfers.find_by(status: DomainTransfer::PENDING) end def server_holdable? diff --git a/app/models/epp/domain.rb b/app/models/epp/domain.rb index 32a8a2198..8c9e8bcc8 100644 --- a/app/models/epp/domain.rb +++ b/app/models/epp/domain.rb @@ -628,7 +628,7 @@ class Epp::Domain < Domain case action when 'query' - return domain_transfers.last if domain_transfers.any? + return transfers.last if transfers.any? when 'request' return pending_transfer if pending_transfer return query_transfer(frame, current_user) @@ -652,7 +652,7 @@ class Epp::Domain < Domain end transaction do - dt = domain_transfers.create!( + dt = transfers.create!( transfer_requested_at: Time.zone.now, old_registrar: registrar, new_registrar: current_user.registrar diff --git a/test/integration/api/domain_transfers_test.rb b/test/integration/api/domain_transfers_test.rb index acae0e2e0..439b67424 100644 --- a/test/integration/api/domain_transfers_test.rb +++ b/test/integration/api/domain_transfers_test.rb @@ -16,14 +16,14 @@ class APIDomainTransfersTest < ActionDispatch::IntegrationTest end def test_creates_new_domain_transfer - assert_difference -> { @domain.domain_transfers.size } do + assert_difference -> { @domain.transfers.size } do post '/repp/v1/domain_transfers', request_params, { 'HTTP_AUTHORIZATION' => http_auth_key } end end def test_approves_automatically_if_auto_approval_is_enabled post '/repp/v1/domain_transfers', request_params, { 'HTTP_AUTHORIZATION' => http_auth_key } - assert @domain.domain_transfers(true).last.approved? + assert @domain.transfers.last.approved? end def test_changes_registrar diff --git a/test/integration/epp/domain/transfer/query_test.rb b/test/integration/epp/domain/transfer/query_test.rb index f12cb381f..1412dd9b3 100644 --- a/test/integration/epp/domain/transfer/query_test.rb +++ b/test/integration/epp/domain/transfer/query_test.rb @@ -34,7 +34,7 @@ class EppDomainTransferQueryTest < ActionDispatch::IntegrationTest end def test_no_domain_transfer - domains(:shop).domain_transfers.delete_all + domains(:shop).transfers.delete_all post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } assert_equal '2303', Nokogiri::XML(response.body).at_css('result')[:code] end diff --git a/test/integration/epp/domain/transfer/request_test.rb b/test/integration/epp/domain/transfer/request_test.rb index cc9fb5475..6c28dd67f 100644 --- a/test/integration/epp/domain/transfer/request_test.rb +++ b/test/integration/epp/domain/transfer/request_test.rb @@ -13,7 +13,7 @@ class EppDomainTransferRequestTest < ActionDispatch::IntegrationTest end def test_creates_new_domain_transfer - assert_difference -> { @domain.domain_transfers.size } do + assert_difference -> { @domain.transfers.size } do post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } end end From 7a425ffaf6bd41d1fc915e933f166b9518fb7db5 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 05:10:12 +0200 Subject: [PATCH 083/104] Remove unused method #694 --- app/models/registrar.rb | 9 --------- 1 file changed, 9 deletions(-) diff --git a/app/models/registrar.rb b/app/models/registrar.rb index 7646b2ceb..46022808f 100644 --- a/app/models/registrar.rb +++ b/app/models/registrar.rb @@ -137,15 +137,6 @@ class Registrar < ActiveRecord::Base cash_account.account_activities.create!(args) end - def domain_transfers - at = DomainTransfer.arel_table - DomainTransfer.where( - at[:new_registrar_id].eq(id).or( - at[:old_registrar_id].eq(id) - ) - ) - end - def address [street, city, state, zip].reject(&:blank?).compact.join(', ') end From 8d6cd06012ec954083602184ff89d6c01db720e5 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sun, 11 Feb 2018 23:57:50 +0200 Subject: [PATCH 084/104] Remove unused constant #697 --- app/controllers/epp_controller.rb | 1 - config/initializers/initial_settings.rb | 3 --- 2 files changed, 4 deletions(-) diff --git a/app/controllers/epp_controller.rb b/app/controllers/epp_controller.rb index eee6cef7a..36bdcd6cc 100644 --- a/app/controllers/epp_controller.rb +++ b/app/controllers/epp_controller.rb @@ -335,7 +335,6 @@ class EppController < ApplicationController # rubocop: disable Metrics/CyclomaticComplexity # rubocop: disable Metrics/PerceivedComplexity def write_to_epp_log - # return nil if EPP_LOG_ENABLED request_command = params[:command] || params[:action] # error receives :command, other methods receive :action frame = params[:raw_frame] || params[:frame] diff --git a/config/initializers/initial_settings.rb b/config/initializers/initial_settings.rb index 94ff1dc7e..5ae521bc5 100644 --- a/config/initializers/initial_settings.rb +++ b/config/initializers/initial_settings.rb @@ -73,6 +73,3 @@ if con.present? && con.table_exists?('settings') Setting.save_default(:registry_swift, 'LHVBEE22') Setting.save_default(:registry_invoice_contact, 'Martti Õigus') end - -# dev only setting -EPP_LOG_ENABLED = true # !Rails.env.test? From 2b743dba83d223d82eca71bb5dca201bff5cffa1 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sun, 11 Feb 2018 23:48:31 +0200 Subject: [PATCH 085/104] Remove unused translations #697 --- config/locales/en.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index c49781934..2931a7381 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -214,20 +214,12 @@ en: blank: 'is missing' epp_domain_reserved: 'Domain name is reserved' epp_obj_does_not_exist: 'Object does not exist' - epp_command_failed: 'Command failed' epp_authorization_error: 'Authorization error' - epp_authentication_error: 'Authentication error' epp_id_taken: 'Contact id already exists' epp_domain_not_found: 'Domain not found' epp_exp_dates_do_not_match: 'Given and current expire dates do not match' - epp_registrant_not_found: 'Registrant not found' - epp_command_syntax_error: 'Command syntax error' required_parameter_missing: 'Required parameter missing: %{key}' - attr_missing: 'Required parameter missing: %{key}' - repeating_postal_info: 'Only one of each postal info types may be provided' - invalid_type: 'PostalInfo type is invalid' unimplemented_command: 'Unimplemented command' - domain_exists_but_belongs_to_other_registrar: 'Domain exists but belongs to other registrar' required_ident_attribute_missing: "Required ident attribute missing: %{key}" invalid_iso31661_alpha2: does not conform to ISO 3166-1 alpha-2 standard invalid_iso8601_date: has invalid date format YYYY-MM-DD (ISO 8601) From 030189ab69f97599d0d265e6e464bceb6ff95406 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sun, 11 Feb 2018 03:21:11 +0200 Subject: [PATCH 086/104] Add foreign key #697 (cherry picked from commit 169ce19) --- .../20180211011948_add_messages_registrar_id_fk.rb | 5 +++++ db/structure.sql | 10 ++++++++++ 2 files changed, 15 insertions(+) create mode 100644 db/migrate/20180211011948_add_messages_registrar_id_fk.rb diff --git a/db/migrate/20180211011948_add_messages_registrar_id_fk.rb b/db/migrate/20180211011948_add_messages_registrar_id_fk.rb new file mode 100644 index 000000000..af8df7b97 --- /dev/null +++ b/db/migrate/20180211011948_add_messages_registrar_id_fk.rb @@ -0,0 +1,5 @@ +class AddMessagesRegistrarIdFk < ActiveRecord::Migration + def change + add_foreign_key :messages, :registrars, name: 'messages_registrar_id_fk' + end +end diff --git a/db/structure.sql b/db/structure.sql index 16523bd5c..d95e5f4e2 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -4524,6 +4524,14 @@ ALTER TABLE ONLY account_activities ADD CONSTRAINT fk_rails_d2cc3c2fa9 FOREIGN KEY (price_id) REFERENCES prices(id); +-- +-- Name: messages_registrar_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY messages + ADD CONSTRAINT messages_registrar_id_fk FOREIGN KEY (registrar_id) REFERENCES registrars(id); + + -- -- Name: user_registrar_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: - -- @@ -5086,6 +5094,8 @@ INSERT INTO schema_migrations (version) VALUES ('20180207071528'); INSERT INTO schema_migrations (version) VALUES ('20180207072139'); +INSERT INTO schema_migrations (version) VALUES ('20180211011948'); + INSERT INTO schema_migrations (version) VALUES ('20180212123810'); INSERT INTO schema_migrations (version) VALUES ('20180212152810'); From 8c5478bb6f551d905c57e96046b7fc27c0107dd4 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sun, 11 Feb 2018 03:11:36 +0200 Subject: [PATCH 087/104] Add tests #697 --- test/models/message_test.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 test/models/message_test.rb diff --git a/test/models/message_test.rb b/test/models/message_test.rb new file mode 100644 index 000000000..bc20715c0 --- /dev/null +++ b/test/models/message_test.rb @@ -0,0 +1,17 @@ +require 'test_helper' + +class MessageTest < ActiveSupport::TestCase + def setup + @message = messages(:greeting) + end + + def test_valid + assert @message.valid? + end + + def test_invalid_without_body + @message.body = nil + @message.validate + assert @message.invalid? + end +end From 9697752823e3dd302788f62a02d6e883af411278 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sun, 11 Feb 2018 03:18:39 +0200 Subject: [PATCH 088/104] Always require association #697 (cherry picked from commit a65354c) --- app/models/message.rb | 2 +- ...180211011450_change_messages_registrar_id_to_not_null.rb | 5 +++++ db/structure.sql | 4 +++- test/models/message_test.rb | 6 ++++++ 4 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20180211011450_change_messages_registrar_id_to_not_null.rb diff --git a/app/models/message.rb b/app/models/message.rb index 10d823e63..1f01842c8 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -1,6 +1,6 @@ class Message < ActiveRecord::Base include Versions # version/message_version.rb - belongs_to :registrar + belongs_to :registrar, required: true before_create -> { self.queued = true } diff --git a/db/migrate/20180211011450_change_messages_registrar_id_to_not_null.rb b/db/migrate/20180211011450_change_messages_registrar_id_to_not_null.rb new file mode 100644 index 000000000..962022ae0 --- /dev/null +++ b/db/migrate/20180211011450_change_messages_registrar_id_to_not_null.rb @@ -0,0 +1,5 @@ +class ChangeMessagesRegistrarIdToNotNull < ActiveRecord::Migration + def change + change_column_null :messages, :registrar_id, false + end +end diff --git a/db/structure.sql b/db/structure.sql index d95e5f4e2..237c82e66 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -2183,7 +2183,7 @@ ALTER SEQUENCE mail_templates_id_seq OWNED BY mail_templates.id; CREATE TABLE messages ( id integer NOT NULL, - registrar_id integer, + registrar_id integer NOT NULL, body character varying NOT NULL, attached_obj_type character varying, attached_obj_id integer, @@ -5094,6 +5094,8 @@ INSERT INTO schema_migrations (version) VALUES ('20180207071528'); INSERT INTO schema_migrations (version) VALUES ('20180207072139'); +INSERT INTO schema_migrations (version) VALUES ('20180211011450'); + INSERT INTO schema_migrations (version) VALUES ('20180211011948'); INSERT INTO schema_migrations (version) VALUES ('20180212123810'); diff --git a/test/models/message_test.rb b/test/models/message_test.rb index bc20715c0..58ac90980 100644 --- a/test/models/message_test.rb +++ b/test/models/message_test.rb @@ -14,4 +14,10 @@ class MessageTest < ActiveSupport::TestCase @message.validate assert @message.invalid? end + + def test_invalid_without_registrar + @message.registrar = nil + @message.validate + assert @message.invalid? + end end From a34ea256b4a34d594a470c3580580f76d266855f Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sun, 11 Feb 2018 03:10:38 +0200 Subject: [PATCH 089/104] Remove useless spec #697 --- spec/models/message_spec.rb | 47 ------------------------------------- 1 file changed, 47 deletions(-) delete mode 100644 spec/models/message_spec.rb diff --git a/spec/models/message_spec.rb b/spec/models/message_spec.rb deleted file mode 100644 index a71988701..000000000 --- a/spec/models/message_spec.rb +++ /dev/null @@ -1,47 +0,0 @@ -require 'rails_helper' - -describe Message do - context 'with invalid attribute' do - before :all do - @mssage = Message.new - end - - it 'should not be valid' do - @mssage.valid? - @mssage.errors.full_messages.should match_array([ - "Body is missing" - ]) - end - - it 'should not have any versions' do - @mssage.versions.should == [] - end - end - - context 'with valid attributes' do - before :all do - @mssage = create(:message) - end - - it 'should be valid' do - @mssage.valid? - @mssage.errors.full_messages.should match_array([]) - end - - it 'should be valid twice' do - @mssage = create(:message) - @mssage.valid? - @mssage.errors.full_messages.should match_array([]) - end - - it 'should have one version' do - with_versioning do - @mssage.versions.should == [] - @mssage.body = 'New body' - @mssage.save - @mssage.errors.full_messages.should match_array([]) - @mssage.versions.size.should == 1 - end - end - end -end From 7fb7a4f657784c707969923fc3b99196f175cb56 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sun, 11 Feb 2018 03:10:54 +0200 Subject: [PATCH 090/104] Remove unused factory #697 --- spec/factories/message.rb | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 spec/factories/message.rb diff --git a/spec/factories/message.rb b/spec/factories/message.rb deleted file mode 100644 index 6ae235aaf..000000000 --- a/spec/factories/message.rb +++ /dev/null @@ -1,5 +0,0 @@ -FactoryBot.define do - factory :message do - body 'fabricator body' - end -end From 223b4f4815ad9b606bb8345d7b562be534ec5b68 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sun, 11 Feb 2018 03:02:24 +0200 Subject: [PATCH 091/104] Add tests #697 (cherry picked from commit bfe9ef3) --- test/fixtures/messages.yml | 4 ++++ test/integration/epp/poll_test.rb | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 test/fixtures/messages.yml create mode 100644 test/integration/epp/poll_test.rb diff --git a/test/fixtures/messages.yml b/test/fixtures/messages.yml new file mode 100644 index 000000000..47cbdd0f2 --- /dev/null +++ b/test/fixtures/messages.yml @@ -0,0 +1,4 @@ +greeting: + body: Welcome! + queued: true + registrar: bestnames diff --git a/test/integration/epp/poll_test.rb b/test/integration/epp/poll_test.rb new file mode 100644 index 000000000..db6091cb0 --- /dev/null +++ b/test/integration/epp/poll_test.rb @@ -0,0 +1,30 @@ +require 'test_helper' + +class EppPollTest < ActionDispatch::IntegrationTest + def test_messages + post '/epp/command/poll', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + assert_equal '1301', Nokogiri::XML(response.body).at_css('result')[:code] + assert_equal 1, Nokogiri::XML(response.body).css('msgQ').size + assert_equal 1, Nokogiri::XML(response.body).css('result').size + end + + def test_no_messages + registrars(:bestnames).messages.delete_all(:delete_all) + post '/epp/command/poll', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + assert_equal '1300', Nokogiri::XML(response.body).at_css('result')[:code] + assert_equal 1, Nokogiri::XML(response.body).css('result').size + end + + private + + def request_xml + <<-XML + + + + + + + XML + end +end From 782c53672dbfe7f22f480d7d27c5dc02d6208be9 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 05:58:07 +0200 Subject: [PATCH 092/104] Revert "Bypass domain validation on transfer" This reverts commit 1fa3a3496c3788b3f68a3956810c6f66669f7dd8. --- app/models/concerns/domain/transferable.rb | 2 +- test/models/domain/transfer_test.rb | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/app/models/concerns/domain/transferable.rb b/app/models/concerns/domain/transferable.rb index 554eb7dd3..f2e7736c2 100644 --- a/app/models/concerns/domain/transferable.rb +++ b/app/models/concerns/domain/transferable.rb @@ -15,7 +15,7 @@ module Concerns::Domain::Transferable transaction do transfer_contacts(new_registrar) - save(validate: false) + save! end end diff --git a/test/models/domain/transfer_test.rb b/test/models/domain/transfer_test.rb index 7b4e83138..536c00a5c 100644 --- a/test/models/domain/transfer_test.rb +++ b/test/models/domain/transfer_test.rb @@ -45,10 +45,4 @@ class DomainTransferTest < ActiveSupport::TestCase @domain.transfer(@new_registrar) refute_same old_transfer_code, @domain.transfer_code end - - def test_bypasses_domain_validation - domain = domains(:invalid) - domain.transfer(@new_registrar) - assert_equal @new_registrar, domain.registrar - end end From c29c248fea99f1b7dc55d384f438ade5d4ec2a86 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 06:17:49 +0200 Subject: [PATCH 093/104] Fix test name clash #694 --- test/models/domain/{transfer_test.rb => transferable_test.rb} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename test/models/domain/{transfer_test.rb => transferable_test.rb} (95%) diff --git a/test/models/domain/transfer_test.rb b/test/models/domain/transferable_test.rb similarity index 95% rename from test/models/domain/transfer_test.rb rename to test/models/domain/transferable_test.rb index 536c00a5c..c0de4992b 100644 --- a/test/models/domain/transfer_test.rb +++ b/test/models/domain/transferable_test.rb @@ -1,6 +1,6 @@ require 'test_helper' -class DomainTransferTest < ActiveSupport::TestCase +class DomainTransferableTest < ActiveSupport::TestCase def setup @domain = domains(:shop) @new_registrar = registrars(:goodnames) From 3501a752d360b1b718f7cb56b6e4ab89fc403c3f Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 06:22:05 +0200 Subject: [PATCH 094/104] Remove duplicated translation #694 --- config/locales/en.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 2931a7381..c37cb9a48 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -744,7 +744,6 @@ en: parameter_value_range_error: 'Parameter value range error: %{key}' payment_received: 'Payment received' api_user_not_found: 'API user not found' - domain_already_belongs_to_the_querying_registrar: 'Domain already belongs to the querying registrar' notes: Notes active_price_for_this_operation_is: 'Active price for this operation is %{price}' active_price_missing_for_this_operation: 'Active price missing for this operation!' From cf43ce2e7c4debeee6907e570b70a28a681a708f Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 06:33:00 +0200 Subject: [PATCH 095/104] Add test #694 --- test/integration/epp/domain/transfer/request_test.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/integration/epp/domain/transfer/request_test.rb b/test/integration/epp/domain/transfer/request_test.rb index 6c28dd67f..e61d8213c 100644 --- a/test/integration/epp/domain/transfer/request_test.rb +++ b/test/integration/epp/domain/transfer/request_test.rb @@ -84,6 +84,14 @@ class EppDomainTransferRequestTest < ActionDispatch::IntegrationTest assert_equal '2105', Nokogiri::XML(response.body).at_css('result')[:code] end + def test_same_registrar + assert_no_difference -> { @domain.transfers.size } do + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + end + + assert_equal '2002', Nokogiri::XML(response.body).at_css('result')[:code] + end + def test_wrong_transfer_code request_xml = <<-XML From 3385441846b765dc7c044604b096e413c62d5434 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 06:35:37 +0200 Subject: [PATCH 096/104] Enable "use_transactional_fixtures" #694 --- spec/rails_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index f4dcd9cb3..88e3145f1 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -56,7 +56,7 @@ RSpec.configure do |config| metadata[:type] = :request end - config.use_transactional_fixtures = false + config.use_transactional_fixtures = true config.infer_spec_type_from_file_location! config.expect_with :rspec do |c| From 9e050b4bcd3d4cb78da1d7fbc363b44e68b20f36 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 06:35:51 +0200 Subject: [PATCH 097/104] Fix test #694 --- test/integration/epp/domain/transfer/request_test.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/integration/epp/domain/transfer/request_test.rb b/test/integration/epp/domain/transfer/request_test.rb index e61d8213c..c7aeea946 100644 --- a/test/integration/epp/domain/transfer/request_test.rb +++ b/test/integration/epp/domain/transfer/request_test.rb @@ -67,7 +67,7 @@ class EppDomainTransferRequestTest < ActionDispatch::IntegrationTest def test_non_transferable_domain @domain.update!(statuses: [DomainStatus::SERVER_TRANSFER_PROHIBITED]) - post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } domains(:shop).reload assert_equal registrars(:bestnames), domains(:shop).registrar @@ -77,7 +77,7 @@ class EppDomainTransferRequestTest < ActionDispatch::IntegrationTest def test_discarded_domain @domain.update!(statuses: [DomainStatus::DELETE_CANDIDATE]) - post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } @domain.reload assert_equal registrars(:bestnames), @domain.registrar @@ -109,7 +109,7 @@ class EppDomainTransferRequestTest < ActionDispatch::IntegrationTest XML - post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_bestnames' } + post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } @domain.reload refute_equal registrars(:goodnames), @domain.registrar assert_equal '2201', Nokogiri::XML(response.body).at_css('result')[:code] From c7d8ed266aea23b9d0bb8755b25bebb64aa0e8b2 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Mon, 19 Feb 2018 06:54:24 +0200 Subject: [PATCH 098/104] Revert "Enable "use_transactional_fixtures"" This reverts commit 3385441 --- spec/rails_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 88e3145f1..f4dcd9cb3 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -56,7 +56,7 @@ RSpec.configure do |config| metadata[:type] = :request end - config.use_transactional_fixtures = true + config.use_transactional_fixtures = false config.infer_spec_type_from_file_location! config.expect_with :rspec do |c| From 769e185666c445dc4ee1d7b94ad967736485d8ad Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Sat, 10 Feb 2018 22:38:21 +0200 Subject: [PATCH 099/104] Hide methods #697 (cherry picked from commit 8d08810) --- app/controllers/epp/polls_controller.rb | 4 ++-- doc/controllers_complete.svg | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/controllers/epp/polls_controller.rb b/app/controllers/epp/polls_controller.rb index fb032975f..44f8afdc1 100644 --- a/app/controllers/epp/polls_controller.rb +++ b/app/controllers/epp/polls_controller.rb @@ -6,6 +6,8 @@ class Epp::PollsController < EppController ack_poll if params[:parsed_frame].css('poll').first['op'] == 'ack' end + private + def req_poll @message = current_user.queued_messages.last @@ -49,8 +51,6 @@ class Epp::PollsController < EppController render_epp_response 'epp/poll/poll_ack' end - private - def validate_poll requires_attribute 'poll', 'op', values: %(ack req), allow_blank: true end diff --git a/doc/controllers_complete.svg b/doc/controllers_complete.svg index 68d02cf4a..765d4a08b 100644 --- a/doc/controllers_complete.svg +++ b/doc/controllers_complete.svg @@ -86,9 +86,7 @@ Epp::PollsController -ack_poll poll -req_poll _layout From d2fefc9246c73fb8781670ce6e31d20e038fe02b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20V=C3=B5hmar?= Date: Wed, 21 Feb 2018 17:00:51 +0200 Subject: [PATCH 100/104] Update CHANGELOG.md --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 217da6ecb..1241486d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +22.02.2018 +* BUG: Registrar: contact list export is not limited to 75 records any more [#721](https://github.com/internetee/registry/issues/721) +* BUG: EPP: domain and associated objects are not validated on domain delete [#707](https://github.com/internetee/registry/issues/707) +* EPP: improved session management (db constraints, model and db structure refactor, auto-tests) [#700](https://github.com/internetee/registry/issues/700) + 11.02.2018 * BUG: Disable all object validations on domain transfer [#701](https://github.com/internetee/registry/issues/701) From cf8cfa8252498e1ab4419347c3d5e7f245401291 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Thu, 22 Feb 2018 12:52:46 +0200 Subject: [PATCH 101/104] Improve test #694 --- test/models/message_test.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/models/message_test.rb b/test/models/message_test.rb index 58ac90980..1c7c7bad1 100644 --- a/test/models/message_test.rb +++ b/test/models/message_test.rb @@ -11,13 +11,11 @@ class MessageTest < ActiveSupport::TestCase def test_invalid_without_body @message.body = nil - @message.validate assert @message.invalid? end def test_invalid_without_registrar @message.registrar = nil - @message.validate assert @message.invalid? end end From 2d78688d3f470820053f6243995defd56827b971 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Thu, 22 Feb 2018 12:59:30 +0200 Subject: [PATCH 102/104] Remove too detailed integration test #694 --- test/integration/api/domain_transfers_test.rb | 5 ----- test/integration/epp/domain/transfer/request_test.rb | 5 ----- 2 files changed, 10 deletions(-) diff --git a/test/integration/api/domain_transfers_test.rb b/test/integration/api/domain_transfers_test.rb index 439b67424..10675b507 100644 --- a/test/integration/api/domain_transfers_test.rb +++ b/test/integration/api/domain_transfers_test.rb @@ -46,11 +46,6 @@ class APIDomainTransfersTest < ActionDispatch::IntegrationTest assert_difference -> { @old_registrar.messages.count } do post '/repp/v1/domain_transfers', request_params, { 'HTTP_AUTHORIZATION' => http_auth_key } end - - message = 'Domain transfer of shop.test has been approved.' \ - ' Old contacts: jane-001, william-001' \ - '; old registrant: john-001' - assert_equal message, @old_registrar.messages.last.body end def test_duplicates_registrant_admin_and_tech_contacts diff --git a/test/integration/epp/domain/transfer/request_test.rb b/test/integration/epp/domain/transfer/request_test.rb index c7aeea946..03c5e7daf 100644 --- a/test/integration/epp/domain/transfer/request_test.rb +++ b/test/integration/epp/domain/transfer/request_test.rb @@ -45,11 +45,6 @@ class EppDomainTransferRequestTest < ActionDispatch::IntegrationTest assert_difference -> { @old_registrar.messages.count } do post '/epp/command/transfer', { frame: request_xml }, { 'HTTP_COOKIE' => 'session=api_goodnames' } end - - message = 'Domain transfer of shop.test has been approved.' \ - ' Old contacts: jane-001, william-001' \ - '; old registrant: john-001' - assert_equal message, @old_registrar.messages.last.body end def test_duplicates_registrant_admin_and_tech_contacts From eb61bb620fdec2acee97ad37bbda1a5d0106a47c Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Thu, 22 Feb 2018 13:00:09 +0200 Subject: [PATCH 103/104] Change translation #694 --- config/locales/messages.en.yml | 6 +++--- test/models/domain_transfer_test.rb | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/config/locales/messages.en.yml b/config/locales/messages.en.yml index 2827a2f18..5b93f402a 100644 --- a/config/locales/messages.en.yml +++ b/config/locales/messages.en.yml @@ -2,6 +2,6 @@ en: messages: texts: domain_transfer: >- - Domain transfer of %{domain_name} has been approved. - Old contacts: %{old_contacts_codes}; - old registrant: %{old_registrant_code} + Transfer of domain domain_name_here has been approved. + It was associated with registrant %{old_registrant_code} + and contacts %{old_contacts_codes}. diff --git a/test/models/domain_transfer_test.rb b/test/models/domain_transfer_test.rb index 3d1e8edd9..728f59bdc 100644 --- a/test/models/domain_transfer_test.rb +++ b/test/models/domain_transfer_test.rb @@ -18,9 +18,9 @@ class DomainTransferTest < ActiveSupport::TestCase @domain_transfer.approve end - body = 'Domain transfer of shop.test has been approved.' \ - ' Old contacts: jane-001, william-001' \ - '; old registrant: john-001' + body = 'Transfer of domain domain_name_here has been approved.' \ + ' It was associated with registrant john-001' \ + ' and contacts jane-001, william-001.' id = @domain_transfer.id class_name = @domain_transfer.class.name From 775b44d10d1131673780ffa54734d630fbc8e3c3 Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Fri, 23 Feb 2018 11:28:14 +0200 Subject: [PATCH 104/104] Fix translation #694 --- config/locales/messages.en.yml | 2 +- test/models/domain_transfer_test.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/messages.en.yml b/config/locales/messages.en.yml index 5b93f402a..0c85bb49c 100644 --- a/config/locales/messages.en.yml +++ b/config/locales/messages.en.yml @@ -2,6 +2,6 @@ en: messages: texts: domain_transfer: >- - Transfer of domain domain_name_here has been approved. + Transfer of domain %{domain_name} has been approved. It was associated with registrant %{old_registrant_code} and contacts %{old_contacts_codes}. diff --git a/test/models/domain_transfer_test.rb b/test/models/domain_transfer_test.rb index 728f59bdc..7f11caf80 100644 --- a/test/models/domain_transfer_test.rb +++ b/test/models/domain_transfer_test.rb @@ -18,7 +18,7 @@ class DomainTransferTest < ActiveSupport::TestCase @domain_transfer.approve end - body = 'Transfer of domain domain_name_here has been approved.' \ + body = 'Transfer of domain shop.test has been approved.' \ ' It was associated with registrant john-001' \ ' and contacts jane-001, william-001.' id = @domain_transfer.id