diff --git a/app/helpers/epp/domains_helper.rb b/app/helpers/epp/domains_helper.rb index 3fabeb6da..174401e15 100644 --- a/app/helpers/epp/domains_helper.rb +++ b/app/helpers/epp/domains_helper.rb @@ -26,6 +26,12 @@ module Epp::DomainsHelper render '/epp/domains/renew' end + def info_domain + @domain = find_domain + + render '/epp/domains/info' + end + ### HELPER METHODS ### private @@ -58,6 +64,13 @@ module Epp::DomainsHelper xml_attrs_present?(@ph, [['name'], ['curExpDate'], ['period']]) end + ## INFO + def validate_domain_info_request + @ph = params_hash['epp']['command']['info']['info'] + xml_attrs_present?(@ph, [['name']]) + end + + ## SHARED def find_domain domain = Domain.find_by(name: @ph[:name]) diff --git a/app/models/domain.rb b/app/models/domain.rb index 949e26657..d8172bb64 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -32,6 +32,9 @@ class Domain < ActiveRecord::Base has_and_belongs_to_many :nameservers + delegate :code, to: :owner_contact, prefix: true + delegate :name, to: :registrar, prefix: true + validates :name_dirty, domain_name: true, uniqueness: true validates :period, numericality: { only_integer: true } validates :name, :owner_contact, presence: true diff --git a/app/views/epp/domains/info.xml.builder b/app/views/epp/domains/info.xml.builder new file mode 100644 index 000000000..26c91ecfd --- /dev/null +++ b/app/views/epp/domains/info.xml.builder @@ -0,0 +1,53 @@ +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' => 'urn:ietf:params:xml:ns:domain-1.0') do + xml.tag!('domain:name', @domain.name) + xml.tag!('domain:status', 's' => @domain.status) if @domain.status + xml.tag!('domain:registrant', @domain.owner_contact_code) + + @domain.tech_contacts.each do |x| + xml.tag!('domain:contact', x.code, 'type' => 'tech') + end + + @domain.admin_contacts.each do |x| + xml.tag!('domain:contact', x.code, 'type' => 'admin') + end + + xml.tag!('domain:ns') do + @domain.nameservers.each do |x| + xml.tag!('domain:hostObj', x.hostname) + end + end + + ## TODO Find out what this domain:host is all about + + xml.tag!('domain:clID', @domain.owner_contact_code) + + xml.tag!('domain:crID', @domain.registrar_name) + + xml.tag!('domain:crDate', @domain.created_at) + + xml.tag!('domain:exDate', @domain.valid_to) + + # TODO Make domain stampable + #xml.tag!('domain:upID', @domain.updated_by) + + xml.tag!('domain:upDate', @domain.updated_at) if @domain.updated_at != @domain.created_at + + # TODO Make domain transferrable + #xml.tag!('domain:trDate', @domain.transferred_at) if @domain.transferred_at + + xml.tag!('domain:authInfo') do + xml.tag!('domain:pw', @domain.auth_info) + end + end + end + end + + xml << render('/epp/shared/trID') +end diff --git a/spec/epp/domain_spec.rb b/spec/epp/domain_spec.rb index f2fcc5533..acba2995d 100644 --- a/spec/epp/domain_spec.rb +++ b/spec/epp/domain_spec.rb @@ -201,6 +201,39 @@ describe 'EPP Domain', epp: true do expect(response[:results][0][:msg]).to eq('Period must add up to 1, 2 or 3 years') expect(response[:results][0][:value]).to eq('4') end + + it 'returns domain info' do + d = Domain.first + + response = epp_request('domains/info.xml') + expect(response[:results][0][:result_code]).to eq('1000') + expect(response[:results][0][:msg]).to eq('Command completed successfully') + + inf_data = response[:parsed].css('resData infData') + expect(inf_data.css('name').text).to eq('example.ee') + expect(inf_data.css('registrant').text).to eq(d.owner_contact_code) + + admin_contacts_from_request = inf_data.css('contact[type="admin"]').collect{|x| x.text } + admin_contacts_existing = d.admin_contacts.pluck(:code) + + expect(admin_contacts_from_request).to eq(admin_contacts_existing) + + hosts_from_request = inf_data.css('hostObj').collect{|x| x.text } + hosts_existing = d.nameservers.pluck(:hostname) + + expect(hosts_from_request).to eq(hosts_existing) + expect(inf_data.css('crDate').text).to eq(d.created_at.to_time.utc.to_s) + expect(inf_data.css('exDate').text).to eq(d.valid_to.to_time.utc.to_s) + + expect(inf_data.css('pw').text).to eq(d.auth_info) + + d.touch + + response = epp_request('domains/info.xml') + inf_data = response[:parsed].css('resData infData') + + expect(inf_data.css('upDate').text).to eq(d.updated_at.to_time.utc.to_s) + end end it 'checks a domain' do diff --git a/spec/epp/requests/domains/info.xml b/spec/epp/requests/domains/info.xml new file mode 100644 index 000000000..758e86e7d --- /dev/null +++ b/spec/epp/requests/domains/info.xml @@ -0,0 +1,12 @@ + + + + + + example.ee + + + ABC-12345 + + diff --git a/spec/fabricators/domain_fabricator.rb b/spec/fabricators/domain_fabricator.rb index da7e755ee..7f42c9258 100644 --- a/spec/fabricators/domain_fabricator.rb +++ b/spec/fabricators/domain_fabricator.rb @@ -6,4 +6,6 @@ Fabricator(:domain) do owner_contact(fabricator: :contact) nameservers(count: 3) admin_contacts(count: 1) { Fabricate(:contact) } + registrar + auth_info '98oiewslkfkd' end