diff --git a/app/controllers/admin/domains_controller.rb b/app/controllers/admin/domains_controller.rb index 9ad5633ce..ef30a1077 100644 --- a/app/controllers/admin/domains_controller.rb +++ b/app/controllers/admin/domains_controller.rb @@ -1,5 +1,6 @@ class Admin::DomainsController < ApplicationController - before_action :set_domain, only: [:show, :edit, :update] + before_action :set_domain, only: [:show, :edit, :update, :destroy] + before_action :verify_deletion, only: [:destroy] def new @domain = Domain.new @@ -37,6 +38,16 @@ class Admin::DomainsController < ApplicationController end end + def destroy + if @domain.destroy + flash[:notice] = I18n.t('shared.domain_deleted') + redirect_to admin_domains_path + else + flash[:alert] = I18n.t('shared.failed_to_delete_domain') + redirect_to [:admin, @domain] + end + end + private def set_domain @@ -46,5 +57,11 @@ class Admin::DomainsController < ApplicationController def domain_params params.require(:domain).permit(:name, :period, :period_unit, :registrar_id, :owner_contact_id) end + + def verify_deletion + return if @domain.can_be_deleted? + flash[:alert] = I18n.t('shared.domain_status_prohibits_deleting') + redirect_to [:admin, @domain] + end end diff --git a/app/helpers/epp/domains_helper.rb b/app/helpers/epp/domains_helper.rb index 9c8f72dcf..38192f4ff 100644 --- a/app/helpers/epp/domains_helper.rb +++ b/app/helpers/epp/domains_helper.rb @@ -80,6 +80,7 @@ module Epp::DomainsHelper @domain = find_domain handle_errors(@domain) and return unless @domain + handle_errors(@domain) and return unless @domain.can_be_deleted? handle_errors(@domain) and return unless @domain.destroy render '/epp/domains/success' diff --git a/app/models/domain.rb b/app/models/domain.rb index f0337f22a..1036313f2 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -67,7 +67,6 @@ class Domain < ActiveRecord::Base def can_be_deleted? (domain_statuses.pluck(:value) & %W( - #{DomainStatus::CLIENT_DELETE_PROHIBITED} #{DomainStatus::SERVER_DELETE_PROHIBITED} )).empty? end diff --git a/app/models/epp/epp_domain.rb b/app/models/epp/epp_domain.rb index 033d8cd21..28a2acfc8 100644 --- a/app/models/epp/epp_domain.rb +++ b/app/models/epp/epp_domain.rb @@ -12,6 +12,9 @@ class Epp::EppDomain < Domain [:name_dirty, :taken, { value: { obj: 'name', val: name_dirty } }], [:name_dirty, :reserved, { value: { obj: 'name', val: name_dirty } }] ], + '2304' => [ + [:base, :domain_status_prohibits_operation] + ], '2306' => [ # Parameter policy error [:owner_contact, :blank], [:admin_contacts, :out_of_range] @@ -237,6 +240,18 @@ class Epp::EppDomain < Domain add_epp_error('2306', 'curExpDate', cur_exp_date, I18n.t('errors.messages.epp_exp_dates_do_not_match')) end + ### ABILITIES ### + def can_be_deleted? + begin + errors.add(:base, :domain_status_prohibits_operation) + return false + end if (domain_statuses.pluck(:value) & %W( + #{DomainStatus::CLIENT_DELETE_PROHIBITED} + )).any? + + true + end + ## SHARED # For domain transfer diff --git a/app/views/admin/domains/show.haml b/app/views/admin/domains/show.haml index 80246cf3e..71552c376 100644 --- a/app/views/admin/domains/show.haml +++ b/app/views/admin/domains/show.haml @@ -5,7 +5,7 @@ .col-sm-6 %h2.text-right.text-center-xs = link_to(t('shared.edit'), edit_admin_domain_path(@domain), class: 'btn btn-primary') - = link_to(t('shared.delete'), root_path, method: :delete, data: { confirm: t('shared.are_you_sure') }, class: 'btn btn-danger') + = link_to(t('shared.delete'), admin_domain_path(@domain), method: :delete, data: { confirm: t('shared.are_you_sure') }, class: 'btn btn-danger') %hr .row diff --git a/config/locales/en.yml b/config/locales/en.yml index 4ed9ca86d..ee0a9e5b0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -71,6 +71,8 @@ en: epp_domain: &epp_domain_ar_attributes attributes: + base: + domain_status_prohibits_operation: 'Domain status prohibits operation' name_dirty: invalid: 'Domain name is invalid' reserved: 'Domain name is reserved or restricted' @@ -238,3 +240,6 @@ en: failed_to_delete_status: 'Failed to delete status!' tech_contact: 'Tech contact' new_domain_contact: 'New contact' + domain_status_prohibits_deleting: 'Domain status prohibits deleting' + domain_deleted: 'Domain deleted!' + failed_to_delete_domain: 'Failed to delete domain!' diff --git a/spec/epp/domain_spec.rb b/spec/epp/domain_spec.rb index f7e508eb2..122ba7dc3 100644 --- a/spec/epp/domain_spec.rb +++ b/spec/epp/domain_spec.rb @@ -567,6 +567,14 @@ describe 'EPP Domain', epp: true do expect(Domain.first).to eq(nil) expect(DomainContact.count).to eq(0) end + + it 'does not delete domain with specific status' do + d = Domain.first + d.domain_statuses.create(value: DomainStatus::CLIENT_DELETE_PROHIBITED) + response = epp_request(domain_delete_xml, :xml) + expect(response[:result_code]).to eq('2304') + expect(response[:msg]).to eq('Domain status prohibits operation') + end end it 'checks a domain' do