From c07b7bf7f20000ca9d21213f16b64c9361e77896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl=20Erik=20=C3=95unapuu?= Date: Mon, 28 Sep 2020 12:31:05 +0300 Subject: [PATCH 1/3] Disallow domain renew for renewProhibited domains --- app/models/domain.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/models/domain.rb b/app/models/domain.rb index e57117bc2..41fa29144 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -306,11 +306,12 @@ class Domain < ApplicationRecord end def renewable? - blocking_statuses = [DomainStatus::DELETE_CANDIDATE, DomainStatus::PENDING_RENEW, - DomainStatus::PENDING_TRANSFER, DomainStatus::DISPUTED, - DomainStatus::PENDING_UPDATE, DomainStatus::PENDING_DELETE, - DomainStatus::PENDING_DELETE_CONFIRMATION] - return false if statuses.include_any? blocking_statuses + disallowed = [DomainStatus::DELETE_CANDIDATE, DomainStatus::PENDING_RENEW, + DomainStatus::PENDING_TRANSFER, DomainStatus::CLIENT_RENEW_PROHIBITED, + DomainStatus::PENDING_UPDATE, DomainStatus::PENDING_DELETE, + DomainStatus::PENDING_DELETE_CONFIRMATION, DomainStatus::SERVER_RENEW_PROHIBITED] + + return false unless (statuses & disallowed).empty? return true unless Setting.days_to_renew_domain_before_expire != 0 # if you can renew domain at days_to_renew before domain expiration From 9976e3dd932626dc9a568e718c4f0f124d9766b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl=20Erik=20=C3=95unapuu?= Date: Mon, 28 Sep 2020 13:01:47 +0300 Subject: [PATCH 2/3] Test renewal prohibited statuses --- .../integration/epp/domain/renew/base_test.rb | 32 +++++++++++++++++++ test/models/domain_test.rb | 13 ++++++++ 2 files changed, 45 insertions(+) diff --git a/test/integration/epp/domain/renew/base_test.rb b/test/integration/epp/domain/renew/base_test.rb index 541aab2a8..be53ca7a7 100644 --- a/test/integration/epp/domain/renew/base_test.rb +++ b/test/integration/epp/domain/renew/base_test.rb @@ -167,4 +167,36 @@ class EppDomainRenewBaseTest < EppTestCase end assert_epp_response :parameter_value_policy_error end + + def test_fails_if_domain_has_renewal_prohibited_statuses + travel_to Time.zone.parse('2010-07-05') + domain = domains(:shop) + domain.statuses << DomainStatus::SERVER_RENEW_PROHIBITED + domain.save + + original_valid_to = domain.valid_to + default_renewal_period = 1.year + + request_xml = <<-XML + + + + + + #{domain.name} + #{domain.expire_time.to_date} + 1 + + + + + XML + + post epp_renew_path, params: { frame: request_xml }, + headers: { 'HTTP_COOKIE' => 'session=api_bestnames' } + domain.reload + + assert_epp_response :object_is_not_eligible_for_renewal + assert_equal original_valid_to, domain.valid_to + end end diff --git a/test/models/domain_test.rb b/test/models/domain_test.rb index b4a1d7b47..a943be6ef 100644 --- a/test/models/domain_test.rb +++ b/test/models/domain_test.rb @@ -431,6 +431,19 @@ class DomainTest < ActiveSupport::TestCase assert_equal created_at, domain.registered_at end + def test_not_renewable_if_renew_prohibited + assert @domain.renewable? + + @domain.statuses << DomainStatus::SERVER_RENEW_PROHIBITED + assert_not @domain.renewable? + + @domain.statuses.delete(DomainStatus::SERVER_RENEW_PROHIBITED) + assert @domain.renewable? + + @domain.statuses << DomainStatus::CLIENT_RENEW_PROHIBITED + assert_not @domain.renewable? + end + private def valid_domain From 29897043b0ace80ffa438d123a8b4c97a7f7ac7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl=20Erik=20=C3=95unapuu?= Date: Mon, 28 Sep 2020 14:57:52 +0300 Subject: [PATCH 3/3] Renew: Attach uneligibility reason --- app/models/domain.rb | 16 ++++++++++------ app/models/epp/domain.rb | 12 +++++++++++- test/integration/epp/domain/renew/base_test.rb | 2 +- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/app/models/domain.rb b/app/models/domain.rb index 41fa29144..679669728 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -306,12 +306,7 @@ class Domain < ApplicationRecord end def renewable? - disallowed = [DomainStatus::DELETE_CANDIDATE, DomainStatus::PENDING_RENEW, - DomainStatus::PENDING_TRANSFER, DomainStatus::CLIENT_RENEW_PROHIBITED, - DomainStatus::PENDING_UPDATE, DomainStatus::PENDING_DELETE, - DomainStatus::PENDING_DELETE_CONFIRMATION, DomainStatus::SERVER_RENEW_PROHIBITED] - - return false unless (statuses & disallowed).empty? + return false unless renew_blocking_statuses.empty? return true unless Setting.days_to_renew_domain_before_expire != 0 # if you can renew domain at days_to_renew before domain expiration @@ -322,6 +317,15 @@ class Domain < ApplicationRecord true end + def renew_blocking_statuses + disallowed = [DomainStatus::DELETE_CANDIDATE, DomainStatus::PENDING_RENEW, + DomainStatus::PENDING_TRANSFER, DomainStatus::CLIENT_RENEW_PROHIBITED, + DomainStatus::PENDING_UPDATE, DomainStatus::PENDING_DELETE, + DomainStatus::PENDING_DELETE_CONFIRMATION, DomainStatus::SERVER_RENEW_PROHIBITED] + + (statuses & disallowed) + end + def notify_registrar(message_key) registrar.notifications.create!( text: "#{I18n.t(message_key)}: #{name}", diff --git a/app/models/epp/domain.rb b/app/models/epp/domain.rb index 3ed26f0e1..530e54a0f 100644 --- a/app/models/epp/domain.rb +++ b/app/models/epp/domain.rb @@ -581,11 +581,14 @@ class Epp::Domain < Domain save(validate: false) end + ### RENEW ### + def renew(cur_exp_date, period, unit = 'y') @is_renewal = true validate_exp_dates(cur_exp_date) - add_epp_error('2105', nil, nil, I18n.t('object_is_not_eligible_for_renewal')) unless renewable? + add_renew_epp_errors unless renewable? + return false if errors.any? period = period.to_i @@ -613,6 +616,13 @@ class Epp::Domain < Domain save end + def add_renew_epp_errors + if renew_blocking_statuses.any? && !renewable? + add_epp_error('2304', 'status', renew_blocking_statuses, + I18n.t('object_status_prohibits_operation')) + end + end + ### TRANSFER ### def transfer(frame, action, current_user) diff --git a/test/integration/epp/domain/renew/base_test.rb b/test/integration/epp/domain/renew/base_test.rb index be53ca7a7..9a61e1470 100644 --- a/test/integration/epp/domain/renew/base_test.rb +++ b/test/integration/epp/domain/renew/base_test.rb @@ -196,7 +196,7 @@ class EppDomainRenewBaseTest < EppTestCase headers: { 'HTTP_COOKIE' => 'session=api_bestnames' } domain.reload - assert_epp_response :object_is_not_eligible_for_renewal + assert_epp_response :object_status_prohibits_operation assert_equal original_valid_to, domain.valid_to end end