REPP: Add renew exp_date sanity check

This commit is contained in:
Karl Erik Õunapuu 2021-03-23 13:14:31 +02:00
parent 016c5e802c
commit 546330b178
No known key found for this signature in database
GPG key ID: C9DD647298A34764
7 changed files with 15 additions and 13 deletions

View file

@ -72,11 +72,11 @@ module Epp
def renew def renew
authorize! :renew, @domain authorize! :renew, @domain
return handle_errors(@domain) if invalid_expiry_date?
registrar_id = current_user.registrar.id registrar_id = current_user.registrar.id
renew_params = ::Deserializers::Xml::Domain.new(params[:parsed_frame], renew_params = ::Deserializers::Xml::Domain.new(params[:parsed_frame],
registrar_id).call registrar_id).call
action = Actions::DomainRenew.new(@domain, renew_params, current_user.registrar) action = Actions::DomainRenew.new(@domain, renew_params, current_user.registrar)
if action.call if action.call
render_epp_response '/epp/domains/renew' render_epp_response '/epp/domains/renew'
@ -228,11 +228,6 @@ module Epp
statuses == [::DomainStatus::CLIENT_HOLD] statuses == [::DomainStatus::CLIENT_HOLD]
end end
def invalid_expiry_date?
@domain.validate_exp_dates(params[:parsed_frame].css('curExpDate').text)
@domain.errors[:epp_errors].any?
end
def balance_ok?(operation, period = nil, unit = nil) def balance_ok?(operation, period = nil, unit = nil)
@domain_pricelist = @domain.pricelist(operation, period.try(:to_i), unit) @domain_pricelist = @domain.pricelist(operation, period.try(:to_i), unit)
if @domain_pricelist.try(:price) # checking if price list is not found if @domain_pricelist.try(:price) # checking if price list is not found

View file

@ -11,6 +11,7 @@ module Repp
param :renew, Hash, required: true, desc: 'Renew parameters' do param :renew, Hash, required: true, desc: 'Renew parameters' do
param :period, Integer, required: true, desc: 'Renew period. Month (m) or year (y)' param :period, Integer, required: true, desc: 'Renew period. Month (m) or year (y)'
param :period_unit, String, required: true, desc: 'For how many months or years to renew' param :period_unit, String, required: true, desc: 'For how many months or years to renew'
param :exp_date, String, required: true, desc: 'Current expiry date for domain'
end end
def create def create
authorize!(:renew, @domain) authorize!(:renew, @domain)
@ -36,7 +37,7 @@ module Repp
private private
def renew_params def renew_params
params.permit(:domain_id, renew: %i[period period_unit]) params.permit(:domain_id, renew: %i[period period_unit exp_date])
end end
def validate_renew_period def validate_renew_period

View file

@ -21,9 +21,9 @@ module Repp
desc 'Get a specific domain' desc 'Get a specific domain'
def show def show
@domain = Epp::Domain.find_by!(name: params[:id]) @domain = Epp::Domain.find_by!(name: params[:id])
sponsored = @domain.registrar == current_user.registrar sponsor = @domain.registrar == current_user.registrar
render_success(data: { domain: Serializers::Repp::Domain.new(@domain, render_success(data: { domain: Serializers::Repp::Domain.new(@domain,
sponsored: sponsored).to_json }) sponsored: sponsor).to_json })
end end
api :POST, '/repp/v1/domains' api :POST, '/repp/v1/domains'

View file

@ -16,11 +16,14 @@ module Actions
domain.add_renew_epp_errors domain.add_renew_epp_errors
false false
else else
domain.validate_exp_dates(params[:exp_date])
renew renew
end end
end end
def renew def renew
return false if domain.errors[:epp_errors].any?
task = Domains::BulkRenew::SingleDomainRenew.run(domain: domain, task = Domains::BulkRenew::SingleDomainRenew.run(domain: domain,
period: params[:period], period: params[:period],
unit: params[:period_unit], unit: params[:period_unit],

View file

@ -29,6 +29,7 @@ module Deserializers
{ {
period: period.text.present? ? Integer(period.text) : 1, period: period.text.present? ? Integer(period.text) : 1,
period_unit: period.first ? period.first[:unit] : 'y', period_unit: period.first ? period.first[:unit] : 'y',
exp_date: if_present('curExpDate'),
} }
end end

View file

@ -8,6 +8,7 @@ module Serializers
@sponsored = sponsored @sponsored = sponsored
end end
# rubocop:disable Metrics/AbcSize
def to_json(obj = domain) def to_json(obj = domain)
json = { json = {
name: obj.name, registrant: obj.registrant.code, created_at: obj.created_at, name: obj.name, registrant: obj.registrant.code, created_at: obj.created_at,
@ -19,6 +20,7 @@ module Serializers
json[:transfer_code] = obj.auth_info if @sponsored json[:transfer_code] = obj.auth_info if @sponsored
json json
end end
# rubocop:enable Metrics/AbcSize
def contacts def contacts
domain.domain_contacts.map { |c| { code: c.contact_code_cache, type: c.type } } domain.domain_contacts.map { |c| { code: c.contact_code_cache, type: c.type } }

View file

@ -15,7 +15,7 @@ class ReppV1DomainsRenewsTest < ActionDispatch::IntegrationTest
travel_to Time.zone.parse('2010-07-05') travel_to Time.zone.parse('2010-07-05')
@auth_headers['Content-Type'] = 'application/json' @auth_headers['Content-Type'] = 'application/json'
payload = { renew: { period: 1, period_unit: 'y' } } payload = { renew: { period: 1, period_unit: 'y', exp_date: original_valid_to } }
post "/repp/v1/domains/#{@domain.name}/renew", headers: @auth_headers, params: payload.to_json post "/repp/v1/domains/#{@domain.name}/renew", headers: @auth_headers, params: payload.to_json
json = JSON.parse(response.body, symbolize_names: true) json = JSON.parse(response.body, symbolize_names: true)
@ -31,7 +31,7 @@ class ReppV1DomainsRenewsTest < ActionDispatch::IntegrationTest
travel_to Time.zone.parse('2010-07-05') travel_to Time.zone.parse('2010-07-05')
@auth_headers['Content-Type'] = 'application/json' @auth_headers['Content-Type'] = 'application/json'
payload = { renew: { period: 100, period_unit: 'y' } } payload = { renew: { period: 100, period_unit: 'y', exp_date: original_valid_to } }
post "/repp/v1/domains/#{@domain.name}/renew", headers: @auth_headers, params: payload.to_json post "/repp/v1/domains/#{@domain.name}/renew", headers: @auth_headers, params: payload.to_json
json = JSON.parse(response.body, symbolize_names: true) json = JSON.parse(response.body, symbolize_names: true)
@ -48,14 +48,14 @@ class ReppV1DomainsRenewsTest < ActionDispatch::IntegrationTest
days_to_renew_domain_before_expire.reload days_to_renew_domain_before_expire.reload
original_valid_to = @domain.valid_to original_valid_to = @domain.valid_to
travel_to @domain.valid_to - 3.days travel_to @domain.valid_to - 3.days
one_year = billing_prices(:renew_one_year) one_year = billing_prices(:renew_one_year)
one_year.update(valid_from: @domain.valid_to - 5.days) one_year.update(valid_from: @domain.valid_to - 5.days)
one_year.reload one_year.reload
@auth_headers['Content-Type'] = 'application/json' @auth_headers['Content-Type'] = 'application/json'
payload = { renew: { period: 1, period_unit: 'y' } } payload = { renew: { period: 1, period_unit: 'y', exp_date: original_valid_to } }
post "/repp/v1/domains/#{@domain.name}/renew", headers: @auth_headers, params: payload.to_json post "/repp/v1/domains/#{@domain.name}/renew", headers: @auth_headers, params: payload.to_json
json = JSON.parse(response.body, symbolize_names: true) json = JSON.parse(response.body, symbolize_names: true)