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