diff --git a/app/controllers/epp/domains_controller.rb b/app/controllers/epp/domains_controller.rb
index 65ee56306..4500566b0 100644
--- a/app/controllers/epp/domains_controller.rb
+++ b/app/controllers/epp/domains_controller.rb
@@ -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
diff --git a/app/models/dns/domain_name.rb b/app/models/dns/domain_name.rb
index be7ece5c6..090454093 100644
--- a/app/models/dns/domain_name.rb
+++ b/app/models/dns/domain_name.rb
@@ -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
diff --git a/app/views/epp/domains/info.xml.builder b/app/views/epp/domains/info/registered_domain.xml.builder
similarity index 100%
rename from app/views/epp/domains/info.xml.builder
rename to app/views/epp/domains/info/registered_domain.xml.builder
diff --git a/app/views/epp/domains/info/unregistered_domain.xml.builder b/app/views/epp/domains/info/unregistered_domain.xml.builder
new file mode 100644
index 000000000..a34dfa51a
--- /dev/null
+++ b/app/views/epp/domains/info/unregistered_domain.xml.builder
@@ -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
\ No newline at end of file
diff --git a/test/integration/epp/domain/info/base_test.rb b/test/integration/epp/domain/info/base_test.rb
index a112ed840..93f04a476 100644
--- a/test/integration/epp/domain/info/base_test.rb
+++ b/test/integration/epp/domain/info/base_test.rb
@@ -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
+
+
+
+
+
+ blocked.test
+
+
+
+
+ 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
+
+
+
+
+
+ reserved.test
+
+
+
+
+ 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
diff --git a/test/models/dns/domain_name_test.rb b/test/models/dns/domain_name_test.rb
index 0fdd81d34..e1e9df79e 100644
--- a/test/models/dns/domain_name_test.rb
+++ b/test/models/dns/domain_name_test.rb
@@ -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