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