diff --git a/app/interactions/domains/cancel_force_delete/remove_force_delete_statuses.rb b/app/interactions/domains/cancel_force_delete/remove_force_delete_statuses.rb index c77820ecf..adb310e51 100644 --- a/app/interactions/domains/cancel_force_delete/remove_force_delete_statuses.rb +++ b/app/interactions/domains/cancel_force_delete/remove_force_delete_statuses.rb @@ -2,10 +2,12 @@ module Domains module CancelForceDelete class RemoveForceDeleteStatuses < Base def execute - domain.statuses.delete(DomainStatus::FORCE_DELETE) - domain.statuses.delete(DomainStatus::SERVER_RENEW_PROHIBITED) - domain.statuses.delete(DomainStatus::SERVER_TRANSFER_PROHIBITED) - domain.statuses.delete(DomainStatus::CLIENT_HOLD) + domain_statuses = [DomainStatus::FORCE_DELETE, + DomainStatus::SERVER_RENEW_PROHIBITED, + DomainStatus::SERVER_TRANSFER_PROHIBITED, + DomainStatus::CLIENT_HOLD] + rejected_statuses = domain.statuses.reject { |a| domain_statuses.include? a } + domain.statuses = rejected_statuses domain.save(validate: false) end end diff --git a/app/interactions/domains/cancel_force_delete/restore_statuses_before_force_delete.rb b/app/interactions/domains/cancel_force_delete/restore_statuses_before_force_delete.rb index c55c06764..d521bfcba 100644 --- a/app/interactions/domains/cancel_force_delete/restore_statuses_before_force_delete.rb +++ b/app/interactions/domains/cancel_force_delete/restore_statuses_before_force_delete.rb @@ -2,8 +2,9 @@ module Domains module CancelForceDelete class RestoreStatusesBeforeForceDelete < Base def execute - domain.statuses = domain.statuses_before_force_delete + domain.statuses = domain.force_delete_domain_statuses_history || [] domain.statuses_before_force_delete = nil + domain.force_delete_domain_statuses_history = nil domain.save(validate: false) end end diff --git a/app/interactions/domains/force_delete/prepare_domain.rb b/app/interactions/domains/force_delete/prepare_domain.rb index 74eea21ed..e45f7969c 100644 --- a/app/interactions/domains/force_delete/prepare_domain.rb +++ b/app/interactions/domains/force_delete/prepare_domain.rb @@ -6,6 +6,7 @@ module Domains DomainStatus::SERVER_TRANSFER_PROHIBITED].freeze def execute + domain.force_delete_domain_statuses_history = domain.statuses domain.statuses_before_force_delete = domain.statuses domain.statuses |= STATUSES_TO_SET domain.save(validate: false) diff --git a/app/models/concerns/domain/force_delete.rb b/app/models/concerns/domain/force_delete.rb index bc89022d0..b31b02eac 100644 --- a/app/models/concerns/domain/force_delete.rb +++ b/app/models/concerns/domain/force_delete.rb @@ -1,6 +1,10 @@ -module Domain::ForceDelete # rubocop:disable Metrics/ModuleLength +module Domain::ForceDelete extend ActiveSupport::Concern + FORCE_DELETE_STATUSES = [DomainStatus::FORCE_DELETE, + DomainStatus::SERVER_RENEW_PROHIBITED, + DomainStatus::SERVER_TRANSFER_PROHIBITED].freeze + included do store_accessor :force_delete_data, :force_delete_type, diff --git a/app/models/concerns/domain/registry_lockable.rb b/app/models/concerns/domain/registry_lockable.rb index 2c0f5c0fe..4f9340aaf 100644 --- a/app/models/concerns/domain/registry_lockable.rb +++ b/app/models/concerns/domain/registry_lockable.rb @@ -36,9 +36,10 @@ module Domain::RegistryLockable transaction do LOCK_STATUSES.each do |domain_status| - statuses.delete(domain_status) + statuses.delete([domain_status]) end self.locked_by_registrant_at = nil + self.statuses = admin_store_statuses_history || [] alert_registrar_lock_changes!(lock: false) save! diff --git a/app/models/domain.rb b/app/models/domain.rb index 519f33575..b150b1f8b 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -553,8 +553,22 @@ class Domain < ApplicationRecord statuses.include?(DomainStatus::FORCE_DELETE) end + def update_unless_locked_by_registrant(update) + update(admin_store_statuses_history: update) unless locked_by_registrant? + end + + def update_not_by_locked_statuses(update) + return unless locked_by_registrant? + + result = update.reject { |status| RegistryLockable::LOCK_STATUSES.include? status } + update(admin_store_statuses_history: result) + end + # special handling for admin changing status def admin_status_update(update) + update_unless_locked_by_registrant(update) + + update_not_by_locked_statuses(update) # check for deleted status statuses.each do |s| unless update.include? s diff --git a/test/models/domain/force_delete_test.rb b/test/models/domain/force_delete_test.rb index 000694673..c9de86b5e 100644 --- a/test/models/domain/force_delete_test.rb +++ b/test/models/domain/force_delete_test.rb @@ -12,6 +12,41 @@ class ForceDeleteTest < ActionMailer::TestCase Truemail.configure.default_validation_type = @old_validation_type end + def test_restore_domain_statuses_after_soft_force_delete + @domain.update(statuses: [DomainStatus::SERVER_RENEW_PROHIBITED]) + @domain.schedule_force_delete(type: :soft) + + assert @domain.force_delete_scheduled? + + assert @domain.force_delete_domain_statuses_history.include? DomainStatus::SERVER_RENEW_PROHIBITED + + @domain.cancel_force_delete + assert @domain.statuses.include? DomainStatus::SERVER_RENEW_PROHIBITED + end + + # def test_restore_domain_statuses_if_status_set_after_fc + # @domain.schedule_force_delete(type: :soft) + + # assert @domain.force_delete_scheduled? + + # @domain.update(statuses: [DomainStatus::SERVER_RENEW_PROHIBITED]) + # assert @domain.force_delete_domain_statuses_history.include? DomainStatus::SERVER_RENEW_PROHIBITED + + # @domain.cancel_force_delete + # assert @domain.statuses.include? DomainStatus::SERVER_RENEW_PROHIBITED + # end + + def test_clear_force_delete_domain_statuses_history + @domain.update(statuses: [DomainStatus::SERVER_RENEW_PROHIBITED]) + @domain.schedule_force_delete(type: :soft) + + assert @domain.force_delete_scheduled? + assert @domain.force_delete_domain_statuses_history.include? DomainStatus::SERVER_RENEW_PROHIBITED + @domain.cancel_force_delete + + assert_nil @domain.force_delete_domain_statuses_history + end + def test_schedules_force_delete_fast_track assert_not @domain.force_delete_scheduled? travel_to Time.zone.parse('2010-07-05') @@ -56,7 +91,7 @@ class ForceDeleteTest < ActionMailer::TestCase statuses_to_be_added = [ DomainStatus::FORCE_DELETE, DomainStatus::SERVER_RENEW_PROHIBITED, - DomainStatus::SERVER_TRANSFER_PROHIBITED, + DomainStatus::SERVER_TRANSFER_PROHIBITED ] @domain.schedule_force_delete(type: :soft) @@ -68,7 +103,7 @@ class ForceDeleteTest < ActionMailer::TestCase statuses_to_be_added = [ DomainStatus::FORCE_DELETE, DomainStatus::SERVER_RENEW_PROHIBITED, - DomainStatus::SERVER_TRANSFER_PROHIBITED, + DomainStatus::SERVER_TRANSFER_PROHIBITED ] @domain.schedule_force_delete(type: :fast_track) @@ -79,7 +114,7 @@ class ForceDeleteTest < ActionMailer::TestCase def test_scheduling_force_delete_allows_domain_deletion statuses_to_be_removed = [ DomainStatus::CLIENT_DELETE_PROHIBITED, - DomainStatus::SERVER_DELETE_PROHIBITED, + DomainStatus::SERVER_DELETE_PROHIBITED ] @domain.statuses = statuses_to_be_removed + %w[other-status] @@ -94,7 +129,7 @@ class ForceDeleteTest < ActionMailer::TestCase DomainStatus::PENDING_UPDATE, DomainStatus::PENDING_TRANSFER, DomainStatus::PENDING_RENEW, - DomainStatus::PENDING_CREATE, + DomainStatus::PENDING_CREATE ] @domain.statuses = statuses_to_be_removed + %w[other-status] @@ -122,7 +157,7 @@ class ForceDeleteTest < ActionMailer::TestCase assert_not result.valid? assert_not @domain.force_delete_scheduled? - message = ["Force delete procedure cannot be scheduled while a domain is discarded"] + message = ['Force delete procedure cannot be scheduled while a domain is discarded'] assert_equal message, result.errors.messages[:domain] end @@ -149,9 +184,9 @@ class ForceDeleteTest < ActionMailer::TestCase def test_force_delete_does_not_double_statuses statuses = [ - DomainStatus::FORCE_DELETE, - DomainStatus::SERVER_RENEW_PROHIBITED, - DomainStatus::SERVER_TRANSFER_PROHIBITED, + DomainStatus::FORCE_DELETE, + DomainStatus::SERVER_RENEW_PROHIBITED, + DomainStatus::SERVER_TRANSFER_PROHIBITED ] @domain.statuses = @domain.statuses + statuses @domain.save! @@ -177,8 +212,8 @@ class ForceDeleteTest < ActionMailer::TestCase def test_cancelling_force_delete_keeps_previous_statuses statuses = [ - DomainStatus::SERVER_RENEW_PROHIBITED, - DomainStatus::SERVER_TRANSFER_PROHIBITED, + DomainStatus::SERVER_RENEW_PROHIBITED, + DomainStatus::SERVER_TRANSFER_PROHIBITED ] @domain.statuses = statuses @@ -479,7 +514,7 @@ class ForceDeleteTest < ActionMailer::TestCase @bounced_mail.bounce_subtype = 'General' @bounced_mail.action = 'failed' @bounced_mail.status = '5.1.1' - @bounced_mail.diagnostic = 'smtp; 550 5.1.1 user unknown' + @bounced_mail.diagnostic = 'smtp; 550 5.1.1 user unknown' @bounced_mail.save! end end diff --git a/test/models/domain/registry_lockable_test.rb b/test/models/domain/registry_lockable_test.rb index 6e4a1826c..c8ea69fd1 100644 --- a/test/models/domain/registry_lockable_test.rb +++ b/test/models/domain/registry_lockable_test.rb @@ -11,12 +11,62 @@ class DomainRegistryLockableTest < ActiveSupport::TestCase refute(@domain.locked_by_registrant?) @domain.update(statuses: [DomainStatus::SERVER_TRANSFER_PROHIBITED]) - @domain.apply_registry_lock #Raise validation error + @domain.apply_registry_lock # Raise validation error check_statuses_lockable_domain assert(@domain.locked_by_registrant?) end + def test_remove_lockalable_statuses_after_admin_intervention + @domain.apply_registry_lock + assert @domain.locked_by_registrant? + assert_equal @domain.statuses.sort, Domain::RegistryLockable::LOCK_STATUSES.sort + + deleted_status = @domain.statuses - [DomainStatus::SERVER_DELETE_PROHIBITED] + @domain.update(statuses: deleted_status) + assert_not @domain.locked_by_registrant? + + @domain.apply_registry_lock + assert @domain.locked_by_registrant? + @domain.remove_registry_lock + + assert_not @domain.statuses.include? DomainStatus::SERVER_UPDATE_PROHIBITED + assert_not @domain.statuses.include? DomainStatus::SERVER_TRANSFER_PROHIBITED + assert_not @domain.statuses.include? DomainStatus::SERVER_DELETE_PROHIBITED + end + + def test_restore_domain_statuses_after_unlock + @domain.statuses = [DomainStatus::SERVER_UPDATE_PROHIBITED] + @domain.admin_store_statuses_history = [DomainStatus::SERVER_UPDATE_PROHIBITED] + @domain.save + assert @domain.admin_store_statuses_history.include? DomainStatus::SERVER_UPDATE_PROHIBITED + + @domain.apply_registry_lock + assert @domain.locked_by_registrant? + assert_equal @domain.statuses.sort, Domain::RegistryLockable::LOCK_STATUSES.sort + + @domain.remove_registry_lock + assert @domain.statuses.include? DomainStatus::SERVER_UPDATE_PROHIBITED + assert_not @domain.statuses.include? DomainStatus::SERVER_TRANSFER_PROHIBITED + assert_not @domain.statuses.include? DomainStatus::SERVER_DELETE_PROHIBITED + end + + def test_add_additinal_status_for_locked_domain + @domain.apply_registry_lock + assert @domain.locked_by_registrant? + assert_equal @domain.statuses.sort, Domain::RegistryLockable::LOCK_STATUSES.sort + + @domain.statuses += [DomainStatus::SERVER_RENEW_PROHIBITED] + @domain.admin_store_statuses_history = [DomainStatus::SERVER_RENEW_PROHIBITED] + @domain.save + + @domain.remove_registry_lock + assert @domain.statuses.include? DomainStatus::SERVER_RENEW_PROHIBITED + assert_not @domain.statuses.include? DomainStatus::SERVER_UPDATE_PROHIBITED + assert_not @domain.statuses.include? DomainStatus::SERVER_TRANSFER_PROHIBITED + assert_not @domain.statuses.include? DomainStatus::SERVER_DELETE_PROHIBITED + end + def test_lockable_domain_if_remove_some_prohibited_status refute(@domain.locked_by_registrant?) @domain.apply_registry_lock @@ -29,7 +79,7 @@ class DomainRegistryLockableTest < ActiveSupport::TestCase assert @domain.statuses.include? DomainStatus::SERVER_DELETE_PROHIBITED assert @domain.statuses.include? DomainStatus::SERVER_TRANSFER_PROHIBITED assert_not @domain.statuses.include? DomainStatus::SERVER_UPDATE_PROHIBITED - + assert_not(@domain.locked_by_registrant?) end @@ -74,7 +124,7 @@ class DomainRegistryLockableTest < ActiveSupport::TestCase @domain.remove_registry_lock - assert_equal(["ok"], @domain.statuses) + assert_equal(['ok'], @domain.statuses) refute(@domain.locked_by_registrant?) refute(@domain.locked_by_registrant_at) end @@ -100,8 +150,8 @@ class DomainRegistryLockableTest < ActiveSupport::TestCase def check_statuses_lockable_domain lock_statuses = [DomainStatus::SERVER_UPDATE_PROHIBITED, - DomainStatus::SERVER_DELETE_PROHIBITED, - DomainStatus::SERVER_TRANSFER_PROHIBITED] + DomainStatus::SERVER_DELETE_PROHIBITED, + DomainStatus::SERVER_TRANSFER_PROHIBITED] @domain.statuses.include? lock_statuses end diff --git a/test/models/domain_test.rb b/test/models/domain_test.rb index 15ab8b0c2..57c370089 100644 --- a/test/models/domain_test.rb +++ b/test/models/domain_test.rb @@ -27,6 +27,17 @@ class DomainTest < ActiveSupport::TestCase assert domains(:invalid).invalid? end + def test_valid_domain_statuses_history + @domain.force_delete_domain_statuses_history = [DomainStatus::SERVER_UPDATE_PROHIBITED, + DomainStatus::SERVER_TRANSFER_PROHIBITED] + @domain.admin_store_statuses_history = [DomainStatus::SERVER_UPDATE_PROHIBITED] + assert @domain.valid? + + assert @domain.json_statuses_history['force_delete_domain_statuses_history'].include? 'serverUpdateProhibited' + assert @domain.json_statuses_history['force_delete_domain_statuses_history'].include? 'serverTransferProhibited' + assert_equal @domain.json_statuses_history['admin_store_statuses_history'], ['serverUpdateProhibited'] + end + # https://www.internet.ee/domeenid/ee-domeenireeglid#domeeninimede-registreerimine def test_validates_name_format assert_equal dns_zones(:one).origin, 'test'