Handle blocked and reserved domains in EPP domain:info

Closes #597
This commit is contained in:
Artur Beljajev 2019-02-01 13:20:58 +02:00
parent f1148bd4f4
commit 36a53bd11a
6 changed files with 117 additions and 19 deletions

View file

@ -4,9 +4,9 @@ class Epp::DomainsController < EppController
skip_authorization_check only: :info
def info
if Domain.release_to_auction
domain_name = DNS::DomainName.new(params[:parsed_frame].at_css('name').text.strip.downcase)
domain_name = DNS::DomainName.new(params[:parsed_frame].at_css('name').text.strip.downcase)
if Domain.release_to_auction
if domain_name.at_auction?
@name = domain_name
@status = 'At auction'
@ -25,22 +25,34 @@ class Epp::DomainsController < EppController
end
end
find_domain
find_password
authorize! :info, @domain, @password
if domain_name.registered?
find_domain
find_password
authorize! :info, @domain, @password
@hosts = params[:parsed_frame].css('name').first['hosts'] || 'all'
@hosts = params[:parsed_frame].css('name').first['hosts'] || 'all'
case @hosts
when 'del'
@nameservers = @domain.delegated_nameservers.sort
when 'sub'
@nameservers = @domain.subordinate_nameservers.sort
when 'all'
@nameservers = @domain.nameservers.sort
case @hosts
when 'del'
@nameservers = @domain.delegated_nameservers.sort
when 'sub'
@nameservers = @domain.subordinate_nameservers.sort
when 'all'
@nameservers = @domain.nameservers.sort
end
render_epp_response '/epp/domains/info/registered_domain'
else
if domain_name.blocked?
@name = domain_name
@status = 'Blocked'
render_epp_response '/epp/domains/info/unregistered_domain'
elsif domain_name.reserved?
@name = domain_name
@status = 'Reserved'
render_epp_response '/epp/domains/info/unregistered_domain'
end
end
render_epp_response '/epp/domains/info'
end
def create

View file

@ -57,10 +57,6 @@ module DNS
name
end
private
attr_reader :name
def registered?
Domain.find_by_idn(name)
end
@ -69,6 +65,18 @@ module DNS
BlockedDomain.where(name: name).any?
end
def reserved?
ReservedDomain.where(name: name).any?
end
def to_s
name
end
private
attr_reader :name
def zone_with_same_origin?
DNS::Zone.where(origin: name).any?
end

View file

@ -0,0 +1,16 @@
xml.epp_head do
xml.response do
xml.result code: '1000' do
xml.msg 'Command completed successfully'
end
xml.resData do
xml.tag! 'domain:infData', 'xmlns:domain' => 'https://epp.tld.ee/schema/domain-eis-1.0.xsd' do
xml.tag! 'domain:name', @name
xml.tag! 'domain:status', 's' => @status
end
end
render 'epp/shared/trID', builder: xml
end
end

View file

@ -106,4 +106,54 @@ class EppDomainInfoBaseTest < ApplicationIntegrationTest
assert_nil response_xml.at_xpath('//domain:authInfo/domain:pw',
'domain' => 'https://epp.tld.ee/schema/domain-eis-1.0.xsd')
end
def test_blocked_domain
assert_equal 'blocked.test', blocked_domains(:one).name
request_xml = <<-XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<epp xmlns="https://epp.tld.ee/schema/epp-ee-1.0.xsd">
<command>
<info>
<domain:info xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd">
<domain:name>blocked.test</domain:name>
</domain:info>
</info>
</command>
</epp>
XML
post '/epp/command/info', { frame: request_xml }, 'HTTP_COOKIE' => 'session=api_bestnames'
response_xml = Nokogiri::XML(response.body)
assert_equal '1000', response_xml.at_css('result')[:code]
assert_equal 1, response_xml.css('result').size
assert_equal 'blocked.test', response_xml.at_xpath('//domain:name', 'domain' => 'https://epp.tld.ee/schema/domain-eis-1.0.xsd').text
assert_equal 'Blocked', response_xml.at_xpath('//domain:status', 'domain' => 'https://epp.tld.ee/schema/domain-eis-1.0.xsd')['s']
end
def test_reserved_domain
assert_equal 'reserved.test', reserved_domains(:one).name
request_xml = <<-XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<epp xmlns="https://epp.tld.ee/schema/epp-ee-1.0.xsd">
<command>
<info>
<domain:info xmlns:domain="https://epp.tld.ee/schema/domain-eis-1.0.xsd">
<domain:name>reserved.test</domain:name>
</domain:info>
</info>
</command>
</epp>
XML
post '/epp/command/info', { frame: request_xml }, 'HTTP_COOKIE' => 'session=api_bestnames'
response_xml = Nokogiri::XML(response.body)
assert_equal '1000', response_xml.at_css('result')[:code]
assert_equal 1, response_xml.css('result').size
assert_equal 'reserved.test', response_xml.at_xpath('//domain:name', 'domain' => 'https://epp.tld.ee/schema/domain-eis-1.0.xsd').text
assert_equal 'Reserved', response_xml.at_xpath('//domain:status', 'domain' => 'https://epp.tld.ee/schema/domain-eis-1.0.xsd')['s']
end
end

View file

@ -111,4 +111,16 @@ class DNS::DomainNameTest < ActiveSupport::TestCase
domain_name = DNS::DomainName.new('shop.test')
assert_equal 'shop.test', domain_name.to_s
end
def test_blocked
assert_equal 'blocked.test', blocked_domains(:one).name
assert DNS::DomainName.new('blocked.test').blocked?
assert_not DNS::DomainName.new('nonblocked .test').blocked?
end
def test_reserved
assert_equal 'reserved.test', reserved_domains(:one).name
assert DNS::DomainName.new('reserved.test').reserved?
assert_not DNS::DomainName.new('unreserved.test').reserved?
end
end