Hosts attribute for domain info

This commit is contained in:
Martin Lensment 2015-03-26 17:03:31 +02:00
parent a3cb7aed41
commit aa2b46241a
5 changed files with 85 additions and 6 deletions

View file

@ -17,6 +17,17 @@ class Epp::DomainsController < EppController
def info
authorize! :info, @domain, @password
@hosts = params[:parsed_frame].css('name').first['hosts'] || 'all'
case @hosts
when 'del'
@nameservers = @domain.delegated_nameservers
when 'sub'
@nameservers = @domain.subordinate_nameservers
when 'all'
@nameservers = @domain.nameservers
end
render_epp_response '/epp/domains/info'
end
@ -88,6 +99,7 @@ class Epp::DomainsController < EppController
def validate_info
@prefix = 'info > info >'
requires('name')
optional_attribute 'name', 'hosts', values: %(all, sub, del, none)
end
def validate_check

View file

@ -139,6 +139,20 @@ class EppController < ApplicationController
}
end
def optional_attribute(element_selector, attribute_selector, options)
element = requires(element_selector, allow_blank: options[:allow_blank])
return unless element
attribute = element[attribute_selector]
return if (attribute && options[:values].include?(attribute)) || !attribute
epp_errors << {
code: '2306',
msg: I18n.t('attribute_is_invalid', attribute: attribute_selector)
}
end
def exactly_one_of(*selectors)
full_selectors = create_full_selectors(*selectors)
return if element_count(*full_selectors, use_prefix: false) == 1

View file

@ -124,6 +124,14 @@ class Domain < ActiveRecord::Base
domain_contacts.select { |x| x.contact_type == DomainContact::ADMIN }
end
def subordinate_nameservers
nameservers.select { |x| x.hostname.end_with?(name) }
end
def delegated_nameservers
nameservers.select { |x| !x.hostname.end_with?(name) }
end
def name=(value)
value.strip!
value.downcase!

View file

@ -22,12 +22,14 @@ xml.epp_head do
xml.tag!('domain:contact', x.code, 'type' => 'admin')
end
xml.tag!('domain:ns') do
@domain.nameservers.each do |x|
xml.tag!('domain:hostAttr') do
xml.tag!('domain:hostName', x.hostname)
xml.tag!('domain:hostAddr', x.ipv4, 'ip' => 'v4') if x.ipv4.present?
xml.tag!('domain:hostAddr', x.ipv6, 'ip' => 'v6') if x.ipv6.present?
if @nameservers && @nameservers.any?
xml.tag!('domain:ns') do
@nameservers.each do |x|
xml.tag!('domain:hostAttr') do
xml.tag!('domain:hostName', x.hostname)
xml.tag!('domain:hostAddr', x.ipv4, 'ip' => 'v4') if x.ipv4.present?
xml.tag!('domain:hostAddr', x.ipv6, 'ip' => 'v6') if x.ipv6.present?
end
end
end
end

View file

@ -1775,6 +1775,49 @@ describe 'EPP Domain', epp: true do
inf_data.css('upDate').text.should == domain.updated_at.to_time.utc.to_s
end
it 'returns domain info with different nameservers' do
domain.nameservers = []
domain.save
domain.nameservers.build(hostname: "ns1.#{domain.name}", ipv4: '192.168.1.1', ipv6: '1080:0:0:0:8:800:200C:417A')
domain.nameservers.build(hostname: "ns2.#{domain.name}", ipv4: '192.168.1.1', ipv6: '1080:0:0:0:8:800:200C:417A')
domain.nameservers.build(hostname: "ns3.test.ee", ipv4: '192.168.1.1', ipv6: '1080:0:0:0:8:800:200C:417A')
domain.save
xml = domain_info_xml(name: { value: domain.name, attrs: { hosts: 'inalid' } })
response = epp_plain_request(xml, :xml)
response[:msg].should == 'Attribute is invalid: hosts'
response[:result_code].should == '2306'
xml = domain_info_xml(name: { value: domain.name, attrs: { hosts: 'sub' } })
response = epp_plain_request(xml, :xml)
inf_data = response[:parsed].css('resData infData')
inf_data.css('hostAttr').count.should == 2
inf_data.css('hostName').first.text.should == "ns1.#{domain.name}"
inf_data.css('hostName').last.text.should == "ns2.#{domain.name}"
xml = domain_info_xml(name: { value: domain.name, attrs: { hosts: 'del' } })
response = epp_plain_request(xml, :xml)
inf_data = response[:parsed].css('resData infData')
inf_data.css('hostAttr').count.should == 1
inf_data.css('hostName').first.text.should == "ns3.test.ee"
xml = domain_info_xml(name: { value: domain.name, attrs: { hosts: 'none' } })
response = epp_plain_request(xml, :xml)
inf_data = response[:parsed].css('resData infData')
inf_data.css('ns').count.should == 0
inf_data.css('hostAttr').count.should == 0
xml = domain_info_xml(name: { value: domain.name, attrs: { hosts: 'all' } })
response = epp_plain_request(xml, :xml)
inf_data = response[:parsed].css('resData infData')
inf_data.css('hostAttr').count.should == 3
end
it 'returns error when domain can not be found' do
response = epp_plain_request(domain_info_xml(name: { value: 'test.ee' }), :xml)
response[:results][0][:result_code].should == '2303'