diff --git a/Gemfile b/Gemfile index ee11fae90..878dc62bf 100644 --- a/Gemfile +++ b/Gemfile @@ -68,7 +68,7 @@ gem 'digidoc_client', '~> 0.2.1' # epp gem 'epp', '~> 1.4.2', github: 'gitlabeu/epp' -gem 'epp-xml', '~> 0.10.4' # EPP XMLs +gem 'epp-xml', '~> 1.0.1' # EPP XMLs gem 'uuidtools', '~> 2.1.4' # For unique IDs (used by the epp gem) # for importing legacy db diff --git a/Gemfile.lock b/Gemfile.lock index 859830bbf..9b674285f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -161,7 +161,7 @@ GEM nokogiri (>= 1.4.0) savon (>= 2.4.0) docile (1.1.5) - epp-xml (0.10.4) + epp-xml (1.0.1) activesupport (~> 4.1) builder (~> 3.2) equalizer (0.0.11) @@ -512,7 +512,7 @@ DEPENDENCIES devise (~> 3.4.1) digidoc_client (~> 0.2.1) epp (~> 1.4.2)! - epp-xml (~> 0.10.4) + epp-xml (~> 1.0.1) fabrication (~> 2.12.2) faker (~> 1.3.0) figaro (~> 1.1.0) diff --git a/app/models/domain.rb b/app/models/domain.rb index 3355469f1..1a897e150 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -117,7 +117,7 @@ class Domain < ActiveRecord::Base validate :validate_nameserver_ips - attr_accessor :registrant_typeahead, :update_me, :deliver_emails, + attr_accessor :registrant_typeahead, :update_me, :deliver_emails, :epp_pending_update, :epp_pending_delete def subordinate_nameservers @@ -155,6 +155,10 @@ class Domain < ActiveRecord::Base self[:name_dirty] = value end + def roid + "EIS-#{id}" + end + def registrant_typeahead @registrant_typeahead || registrant.try(:name) || nil end @@ -250,7 +254,7 @@ class Domain < ActiveRecord::Base def validate_period return unless period.present? if period_unit == 'd' - valid_values = %w(365 366 710 712 1065 1068) + valid_values = %w(365 730 1095) elsif period_unit == 'm' valid_values = %w(12 24 36) else diff --git a/app/views/epp/domains/info.xml.builder b/app/views/epp/domains/info.xml.builder index d4fc26036..ad1db1cb2 100644 --- a/app/views/epp/domains/info.xml.builder +++ b/app/views/epp/domains/info.xml.builder @@ -7,6 +7,7 @@ xml.epp_head do 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:roid', @domain.roid) @domain.domain_statuses.each do |ds| xml.tag!('domain:status', ds.description, 's' => ds.value) unless ds.description.blank? xml.tag!('domain:status', 's' => ds.value) if ds.description.blank? @@ -38,17 +39,17 @@ xml.epp_head do xml.tag!('domain:clID', @domain.registrar_name) - xml.tag!('domain:crID', @domain.creator.try(:registrar)) + xml.tag!('domain:crID', @domain.creator.try(:registrar)) if @domain.creator xml.tag!('domain:crDate', @domain.created_at.try(:iso8601)) + xml.tag!('domain:upDate', @domain.updated_at.try(:iso8601)) if @domain.updated_at != @domain.created_at + xml.tag!('domain:exDate', @domain.valid_to.try(:iso8601)) # TODO Make domain stampable #xml.tag!('domain:upID', @domain.updated_by) - xml.tag!('domain:upDate', @domain.updated_at.try(:iso8601)) if @domain.updated_at != @domain.created_at - # TODO Make domain transferrable #xml.tag!('domain:trDate', @domain.transferred_at) if @domain.transferred_at diff --git a/doc/schemas/contact-1.0.xsd b/doc/schemas/contact-1.0.xsd new file mode 100644 index 000000000..dc2b366e6 --- /dev/null +++ b/doc/schemas/contact-1.0.xsd @@ -0,0 +1,408 @@ + + + + + + + + + + + Extensible Provisioning Protocol v1.0 + contact provisioning schema. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/schemas/domain-1.0.xsd b/doc/schemas/domain-1.0.xsd new file mode 100644 index 000000000..9ce83db8d --- /dev/null +++ b/doc/schemas/domain-1.0.xsd @@ -0,0 +1,451 @@ + + + + + + + + + + + + + + Extensible Provisioning Protocol v1.0 + domain provisioning schema. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/schemas/eis-1.0.xsd b/doc/schemas/eis-1.0.xsd new file mode 100644 index 000000000..390c45579 --- /dev/null +++ b/doc/schemas/eis-1.0.xsd @@ -0,0 +1,74 @@ + + + + + + EIS Extensible Provisioning Protocol v1.0 + extension schema. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/schemas/epp-1.0.xsd b/doc/schemas/epp-1.0.xsd new file mode 100644 index 000000000..1efc25947 --- /dev/null +++ b/doc/schemas/epp-1.0.xsd @@ -0,0 +1,443 @@ + + + + + + + + + + Extensible Provisioning Protocol v1.0 schema. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/schemas/eppcom-1.0.xsd b/doc/schemas/eppcom-1.0.xsd new file mode 100644 index 000000000..3d1c44e44 --- /dev/null +++ b/doc/schemas/eppcom-1.0.xsd @@ -0,0 +1,104 @@ + + + + + + + Extensible Provisioning Protocol v1.0 + shared structures schema. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/schemas/host-1.0.xsd b/doc/schemas/host-1.0.xsd new file mode 100644 index 000000000..47015ec83 --- /dev/null +++ b/doc/schemas/host-1.0.xsd @@ -0,0 +1,244 @@ + + + + + + + + + + + Extensible Provisioning Protocol v1.0 + host provisioning schema. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/schemas/secDNS-1.1.xsd b/doc/schemas/secDNS-1.1.xsd new file mode 100644 index 000000000..e9fe3f65a --- /dev/null +++ b/doc/schemas/secDNS-1.1.xsd @@ -0,0 +1,130 @@ + + + + + + Extensible Provisioning Protocol v1.0 + domain name extension schema + for provisioning DNS security (DNSSEC) extensions. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spec/epp/contact_spec.rb b/spec/epp/contact_spec.rb index 19a0a3d0d..02540e109 100644 --- a/spec/epp/contact_spec.rb +++ b/spec/epp/contact_spec.rb @@ -939,15 +939,6 @@ describe 'EPP Contact', epp: true do end end end - - context 'renew command' do - it 'returns 2101-unimplemented command' do - response = epp_plain_request('contacts/renew.xml') - - response[:msg].should == 'Unimplemented command' - response[:result_code].should == '2101' - end - end end def check_multiple_contacts_xml diff --git a/spec/epp/domain_spec.rb b/spec/epp/domain_spec.rb index f9d355482..2bb129338 100644 --- a/spec/epp/domain_spec.rb +++ b/spec/epp/domain_spec.rb @@ -2,6 +2,7 @@ require 'rails_helper' describe 'EPP Domain', epp: true do before(:all) do + @xsd = Nokogiri::XML::Schema(File.read('doc/schemas/domain-1.0.xsd')) @epp_xml = EppXml.new(cl_trid: 'ABC-12345') @registrar1 = Fabricate(:registrar1, code: 'REGDOMAIN1') @registrar2 = Fabricate(:registrar2, code: 'REGDOMAIN2') @@ -27,7 +28,7 @@ describe 'EPP Domain', epp: true do { contact: { value: 'sh1111', attrs: { type: 'tech' } } }, { contact: { value: 'sh2222', attrs: { type: 'tech' } } } ] - }), :xml) + })) response[:results][0][:msg].should == 'Contact was not found' response[:results][0][:result_code].should == '2303' @@ -56,7 +57,7 @@ describe 'EPP Domain', epp: true do name: { value: 'test.ee' } }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:results][0][:result_code].should == '2003' response[:results][0][:msg].should == 'Required parameter missing: create > create > ns [ns]' @@ -79,7 +80,7 @@ describe 'EPP Domain', epp: true do dn = next_domain_name response = epp_plain_request(domain_create_xml({ name: { value: dn } - }), :xml) + })) d = Domain.last response[:msg].should == 'Command completed successfully' @@ -115,7 +116,7 @@ describe 'EPP Domain', epp: true do end it 'creates a domain with legal document' do - response = epp_plain_request(domain_create_xml_with_legal_doc, :xml) + response = epp_plain_request(domain_create_xml_with_legal_doc) response[:msg].should == 'Command completed successfully' response[:result_code].should == '1000' @@ -143,7 +144,7 @@ describe 'EPP Domain', epp: true do # ] # }) - # epp_plain_request(xml, :xml) + # epp_plain_request(xml) # d = Domain.last # ds = d.dnskeys.last @@ -168,7 +169,7 @@ describe 'EPP Domain', epp: true do ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:result_code].should == '2306' response[:msg].should == 'IPv4 is missing [ipv4]' @@ -178,10 +179,10 @@ describe 'EPP Domain', epp: true do # dn = next_domain_name # epp_plain_request(domain_create_xml({ # name: { value: dn } - # }), :xml) + # })) # response = epp_plain_request(domain_create_xml({ # name: { value: dn } - # }), :xml) + # })) # response[:msg].should == 'Domain name already exists' # response[:result_code].should == '2302' @@ -191,24 +192,24 @@ describe 'EPP Domain', epp: true do it 'does not create reserved domain' do xml = domain_create_xml(name: { value: '1162.ee' }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:result_code].should == '2302' response[:msg].should == 'Domain name is reserved or restricted [name_dirty]' response[:clTRID].should == 'ABC-12345' end it 'does not create domain without contacts and registrant' do - xml = domain_create_xml(contacts: [], registrant: false) + xml = domain_create_xml(_anonymus: [], registrant: false) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:results][0][:result_code].should == '2003' response[:results][0][:msg].should == 'Required parameter missing: create > create > registrant [registrant]' end it 'does not create domain without nameservers' do - xml = domain_create_xml(ns: []) - response = epp_plain_request(xml, :xml) + xml = domain_create_xml(ns: nil) + response = epp_plain_request(xml) response[:results][0][:msg].should == 'Required parameter missing: create > create > ns [ns]' @@ -235,7 +236,7 @@ describe 'EPP Domain', epp: true do ns: nameservers }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:result_code].should == '2004' response[:msg].should == 'Nameservers count must be between 2-11 [nameservers]' end @@ -256,7 +257,7 @@ describe 'EPP Domain', epp: true do ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:msg].should == 'Hostname is invalid [hostname]' response[:result_code].should == '2005' end @@ -273,13 +274,13 @@ describe 'EPP Domain', epp: true do ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:msg].should == 'Required parameter missing: create > create > ns > hostAttr [host_attr]' response[:result_code].should == '2003' end it 'creates domain with nameservers with ips' do - epp_plain_request(domain_create_with_host_attrs, :xml) + epp_plain_request(domain_create_with_host_attrs) Domain.last.nameservers.count.should == 2 ns = Domain.last.nameservers.first ns.ipv4.should == '192.0.2.2' @@ -289,7 +290,7 @@ describe 'EPP Domain', epp: true do it 'returns error when nameserver has invalid ips' do domain_count = Domain.count nameserver_count = Nameserver.count - response = epp_plain_request(domain_create_with_invalid_ns_ip_xml, :xml) + response = epp_plain_request(domain_create_with_invalid_ns_ip_xml) response[:results][0][:result_code].should == '2005' response[:results][0][:msg].should == 'IPv4 is invalid [ipv4]' response[:results][0][:value].should == '192.0.2.2.invalid' @@ -304,7 +305,7 @@ describe 'EPP Domain', epp: true do it 'creates a domain with period in days' do xml = domain_create_xml(period_value: 365, period_unit: 'd') - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:msg].should == 'Command completed successfully' response[:result_code].should == '1000' Domain.first.valid_to.should == 1.year.since.to_date @@ -315,7 +316,7 @@ describe 'EPP Domain', epp: true do period: { value: '367', attrs: { unit: 'd' } } }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:results][0][:result_code].should == '2004' response[:results][0][:msg].should == 'Period must add up to 1, 2 or 3 years [period]' response[:results][0][:value].should == '367' @@ -350,7 +351,7 @@ describe 'EPP Domain', epp: true do ] }) - epp_plain_request(xml, :xml) + epp_plain_request(xml) d = Domain.last d.dnskeys.count.should == 3 @@ -406,7 +407,7 @@ describe 'EPP Domain', epp: true do ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml, validate_input: false) response[:results][0][:msg].should == 'Valid algorithms are: 3, 5, 6, 7, 8, 252, 253, 254, 255 [alg]' @@ -450,7 +451,7 @@ describe 'EPP Domain', epp: true do }] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:result_code].should == '2302' response[:msg].should == 'Public key already exists [public_key]' @@ -479,7 +480,7 @@ describe 'EPP Domain', epp: true do }] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:result_code].should == '2004' response[:msg].should == 'DNS keys count must be between 0-1 [dnskeys]' @@ -499,7 +500,7 @@ describe 'EPP Domain', epp: true do }] }) - epp_plain_request(xml, :xml) + epp_plain_request(xml) d = Domain.last ds = d.dnskeys.first @@ -531,7 +532,7 @@ describe 'EPP Domain', epp: true do }] }) - epp_plain_request(xml, :xml) + epp_plain_request(xml) d = Domain.last ds = d.dnskeys.first @@ -565,7 +566,7 @@ describe 'EPP Domain', epp: true do # }] # }) - # response = epp_plain_request(xml, :xml) + # response = epp_plain_request(xml) # response[:result_code].should == '2306' # response[:msg].should == 'dsData object with key data is not allowed' @@ -592,7 +593,7 @@ describe 'EPP Domain', epp: true do }] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:result_code].should == '2306' response[:msg].should == 'dsData object is not allowed' @@ -612,7 +613,7 @@ describe 'EPP Domain', epp: true do }] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:result_code].should == '2306' response[:msg].should == 'keyData object is not allowed' @@ -640,7 +641,7 @@ describe 'EPP Domain', epp: true do }] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml, validate_input: false) response[:msg].should == 'Mutually exclusive parameters: extension > create > keyData, '\ 'extension > create > dsData' response[:result_code].should == '2306' @@ -656,7 +657,7 @@ describe 'EPP Domain', epp: true do ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:msg].should == 'Command completed successfully' response[:result_code].should == '1000' response[:clTRID].should == 'ABC-12345' @@ -678,7 +679,7 @@ describe 'EPP Domain', epp: true do ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:msg].should == 'Admin contacts count must be between 1-10 [admin_domain_contacts]' response[:result_code].should == '2004' response[:clTRID].should == 'ABC-12345' @@ -695,7 +696,7 @@ describe 'EPP Domain', epp: true do ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:msg].should == 'Admin contact can be private person only' response[:result_code].should == '2306' end @@ -716,14 +717,14 @@ describe 'EPP Domain', epp: true do }, 'query', { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] }) response = login_as :registrar2 do - epp_plain_request(xml, :xml) + epp_plain_request(xml) end domain.reload @@ -740,7 +741,7 @@ describe 'EPP Domain', epp: true do domain.registrar.should == @registrar2 - response = epp_plain_request(@epp_xml.session.poll, :xml) + response = epp_plain_request(@epp_xml.session.poll) response[:msg].should == 'Command completed successfully; ack to dequeue' msg_q = response[:parsed].css('msgQ') @@ -760,13 +761,13 @@ describe 'EPP Domain', epp: true do }, 'query', { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] }) # request with new password - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) trn_data = response[:parsed].css('trnData') domain.reload @@ -785,7 +786,7 @@ describe 'EPP Domain', epp: true do domain.registrar.should == @registrar2 # should return same data if pending already - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) trn_data = response[:parsed].css('trnData') domain.domain_transfers.count.should == 2 @@ -802,7 +803,7 @@ describe 'EPP Domain', epp: true do # should show up in other registrar's poll response = login_as :registrar2 do - epp_plain_request(@epp_xml.session.poll, :xml) + epp_plain_request(@epp_xml.session.poll) end response[:msg].should == 'Command completed successfully; ack to dequeue' @@ -817,7 +818,7 @@ describe 'EPP Domain', epp: true do }) response = login_as :registrar2 do - epp_plain_request(xml, :xml) + epp_plain_request(xml) end response[:msg].should == 'Command completed successfully' @@ -838,14 +839,14 @@ describe 'EPP Domain', epp: true do }, 'query', { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] }) login_as :registrar2 do - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:result_code].should == '1000' domain.legal_documents.count.should == 1 @@ -861,7 +862,7 @@ describe 'EPP Domain', epp: true do end response = login_as :registrar2 do - epp_plain_request(xml, :xml) + epp_plain_request(xml) end response[:result_code].should == '1000' @@ -878,7 +879,7 @@ describe 'EPP Domain', epp: true do }) login_as :registrar2 do - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:msg].should == 'Command completed successfully' response[:result_code].should == '1000' end @@ -897,7 +898,7 @@ describe 'EPP Domain', epp: true do }) login_as :registrar2 do - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:msg].should == 'Command completed successfully' response[:result_code].should == '1000' end @@ -930,7 +931,7 @@ describe 'EPP Domain', epp: true do }) login_as :registrar2 do - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:msg].should == 'Command completed successfully' response[:result_code].should == '1000' end @@ -965,7 +966,7 @@ describe 'EPP Domain', epp: true do }) login_as :registrar2 do - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:msg].should == 'Command completed successfully' response[:result_code].should == '1000' end @@ -1003,7 +1004,7 @@ describe 'EPP Domain', epp: true do }) login_as :registrar2 do - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:msg].should == 'Command completed successfully' response[:result_code].should == '1000' end @@ -1057,7 +1058,7 @@ describe 'EPP Domain', epp: true do }) login_as :registrar2 do - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:msg].should == 'Command completed successfully' response[:result_code].should == '1000' end @@ -1110,7 +1111,7 @@ describe 'EPP Domain', epp: true do }) login_as :registrar2 do - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:msg].should == 'Command completed successfully' response[:result_code].should == '1000' end @@ -1143,7 +1144,7 @@ describe 'EPP Domain', epp: true do }) login_as :registrar2 do - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:msg].should == 'Command completed successfully' response[:result_code].should == '1000' end @@ -1163,7 +1164,7 @@ describe 'EPP Domain', epp: true do }) login_as :registrar2 do - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:msg].should == 'Authorization error' response[:result_code].should == '2201' end @@ -1183,13 +1184,13 @@ describe 'EPP Domain', epp: true do }, 'approve', { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) domain.reload dtl = domain.domain_transfers.last @@ -1219,21 +1220,21 @@ describe 'EPP Domain', epp: true do }, 'reject', { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] }) response = login_as :registrar2 do - epp_plain_request(xml, :xml) + epp_plain_request(xml) end response[:msg].should == 'Transfer can be rejected only by current registrar' response[:result_code].should == '2304' domain.legal_documents.count.should == 0 - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:result_code].should == '1000' domain.pending_transfer.should be_nil domain.legal_documents.count.should == 1 @@ -1253,14 +1254,14 @@ describe 'EPP Domain', epp: true do }, 'approve', { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] }) response = login_as :registrar2 do - epp_plain_request(xml, :xml) + epp_plain_request(xml) end response[:result_code].should == '2304' @@ -1274,13 +1275,13 @@ describe 'EPP Domain', epp: true do }, 'query', { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:result_code].should == '2201' response[:msg].should == 'Authorization error' end @@ -1293,20 +1294,20 @@ describe 'EPP Domain', epp: true do }, 'query', { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:result_code].should == '2002' response[:msg].should == 'Domain already belongs to the querying registrar' end it 'returns an error for incorrect op attribute' do - response = epp_plain_request(domain_transfer_xml({}, 'bla'), :xml) + response = epp_plain_request(domain_transfer_xml({}, 'bla'), validate_input: false) response[:result_code].should == '2306' response[:msg].should == 'Attribute is invalid: op' end @@ -1319,15 +1320,15 @@ describe 'EPP Domain', epp: true do }, 'query', { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] }) login_as :registrar2 do - epp_plain_request(xml, :xml) # transfer domain - response = epp_plain_request(xml, :xml) # attempt second transfer + epp_plain_request(xml) # transfer domain + response = epp_plain_request(xml) # attempt second transfer response[:result_code].should == '2201' response[:msg].should == 'Authorization error' end @@ -1341,13 +1342,13 @@ describe 'EPP Domain', epp: true do }, 'approve', { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:msg].should == 'Pending transfer was not found' response[:result_code].should == '2303' end @@ -1366,11 +1367,11 @@ describe 'EPP Domain', epp: true do response = epp_plain_request(domain_update_xml(xml_params, {}, { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] - }), :xml) + })) response[:results][0][:msg].should == 'Command completed successfully' response[:results][0][:result_code].should == '1000' @@ -1395,11 +1396,11 @@ describe 'EPP Domain', epp: true do response = epp_plain_request(domain_update_xml(xml_params, {}, { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] - }), :xml) + })) response[:results][0][:msg].should == 'Command completed successfully; action pending' response[:results][0][:result_code].should == '1001' @@ -1503,11 +1504,11 @@ describe 'EPP Domain', epp: true do response = epp_plain_request(domain_update_xml(xml_params, {}, { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] - }), :xml) + })) response[:results][0][:msg].should == 'Object status prohibits operation' response[:results][0][:result_code].should == '2304' @@ -1563,13 +1564,13 @@ describe 'EPP Domain', epp: true do ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:results][0][:result_code].should == '2303' response[:results][0][:msg].should == 'Contact was not found' Fabricate(:contact, code: 'FIXED:MAK21') - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:results][0][:result_code].should == '1000' d = Domain.last @@ -1587,7 +1588,7 @@ describe 'EPP Domain', epp: true do d.domain_statuses.last.value.should == 'clientUpdateProhibited' d.dnskeys.count.should == 2 - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:results][0][:result_code].should == '2302' response[:results][0][:msg].should == 'Nameserver already exists on this domain [hostname]' @@ -1647,9 +1648,6 @@ describe 'EPP Domain', epp: true do it 'updates domain with registrant change what triggers action pending' do xml = domain_update_xml({ name: { value: domain.name }, - chg: [ - registrant: { value: 'FIXED:CITIZEN_1234' } - ], add: [ { ns: [ @@ -1670,6 +1668,9 @@ describe 'EPP Domain', epp: true do { status: { value: 'Payment overdue.', attrs: { s: 'clientHold', lang: 'en' } } }, { status: { value: '', attrs: { s: 'clientUpdateProhibited' } } } ] + ], + chg: [ + registrant: { value: 'FIXED:CITIZEN_1234' } ] }, { add: [ @@ -1693,19 +1694,19 @@ describe 'EPP Domain', epp: true do { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:results][0][:msg].should == 'Contact was not found' response[:results][0][:result_code].should == '2303' Fabricate(:contact, code: 'FIXED:PENDINGMAK21') - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:results][0][:msg].should == 'Command completed successfully; action pending' response[:results][0][:result_code].should == '1001' @@ -1736,7 +1737,7 @@ describe 'EPP Domain', epp: true do }] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:results][0][:result_code].should == '2306' response[:results][0][:msg].should == "Parameter value policy error. Client-side object status "\ "management not supported: status [status]" @@ -1788,7 +1789,7 @@ describe 'EPP Domain', epp: true do ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:results][0][:msg].should == 'Command completed successfully' response[:results][0][:result_code].should == '1000' @@ -1815,13 +1816,16 @@ describe 'EPP Domain', epp: true do }, { rem: [ { keyData: { + flags: { value: '256' }, + protocol: { value: '3' }, + alg: { value: '254' }, pubKey: { value: '700b97b591ed27ec2590d19f06f88bba700b97b591ed27ec2590d19f' } } } ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:results][0][:msg].should == 'Command completed successfully' response[:results][0][:result_code].should == '1000' @@ -1836,7 +1840,7 @@ describe 'EPP Domain', epp: true do rem_cnt = d.tech_contacts.find_by(code: 'FIXED:CITIZEN_1234') rem_cnt.should be_falsey - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:results][0][:result_code].should == '2303' response[:results][0][:msg].should == 'Nameserver was not found' @@ -1864,7 +1868,7 @@ describe 'EPP Domain', epp: true do ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:results][0][:result_code].should == '2303' response[:results][0][:msg].should == 'Status was not found' @@ -1892,8 +1896,8 @@ describe 'EPP Domain', epp: true do } }) - epp_plain_request(xml, :xml) - response = epp_plain_request(xml, :xml) + epp_plain_request(xml) + response = epp_plain_request(xml) response[:results][0][:result_code].should == '2302' response[:results][0][:msg].should == 'Nameserver already exists on this domain [hostname]' @@ -1912,7 +1916,7 @@ describe 'EPP Domain', epp: true do ] } - response = epp_plain_request(domain_update_xml(xml_params), :xml) + response = epp_plain_request(domain_update_xml(xml_params)) response[:results][0][:msg].should == 'Required parameter missing: extension > extdata > legalDocument [legal_document]' response[:results][0][:result_code].should == '2003' @@ -1926,7 +1930,7 @@ describe 'EPP Domain', epp: true do ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml, validate_input: false) response[:results][0][:result_code].should == '2303' response[:results][0][:msg].should == 'Status was not found' response[:results][0][:value].should == 'invalidStatus' @@ -1941,7 +1945,7 @@ describe 'EPP Domain', epp: true do period: { value: '1', attrs: { unit: 'y' } } ) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:results][0][:msg].should == 'Command completed successfully' response[:results][0][:result_code].should == '1000' @@ -1958,7 +1962,7 @@ describe 'EPP Domain', epp: true do period: { value: '1', attrs: { unit: 'y' } } ) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:results][0][:result_code].should == '2306' response[:results][0][:msg].should == 'Given and current expire dates do not match' end @@ -1972,7 +1976,7 @@ describe 'EPP Domain', epp: true do period: { value: '4', attrs: { unit: 'y' } } ) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:results][0][:msg].should == 'Period must add up to 1, 2 or 3 years [period]' response[:results][0][:result_code].should == '2004' response[:results][0][:value].should == '4' @@ -1987,7 +1991,7 @@ describe 'EPP Domain', epp: true do ds_key_tag: '123', ds_alg: 3, ds_digest_type: 1, - ds_digest: 'abc', + ds_digest: '0D85A305D22FCB355BBE29AE9809363D697B64782B9CC73AE349350F8C2AE4BB', flags: 257, protocol: 3, alg: 3, @@ -1998,7 +2002,7 @@ describe 'EPP Domain', epp: true do ds_key_tag: '123', ds_alg: 3, ds_digest_type: 1, - ds_digest: 'abc', + ds_digest: '0D85A305D22FCB355BBE29AE9809363D697B64782B9CC73AE349350F8C2AE4BB', flags: 0, protocol: 3, alg: 5, @@ -2008,7 +2012,7 @@ describe 'EPP Domain', epp: true do domain.save xml = domain_info_xml(name: { value: domain.name }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:results][0][:msg].should == 'Command completed successfully' response[:results][0][:result_code].should == '1000' response[:clTRID].should be_nil @@ -2018,6 +2022,7 @@ describe 'EPP Domain', epp: true do inf_data.css('status').text.should == 'Payment overdue.' inf_data.css('status').first[:s].should == 'clientHold' inf_data.css('registrant').text.should == domain.registrant_code + inf_data.css('roid').text.should == domain.roid admin_contacts_from_request = inf_data.css('contact[type="admin"]').map(&:text) admin_contacts_existing = domain.admin_contacts.pluck(:code) @@ -2043,7 +2048,7 @@ describe 'EPP Domain', epp: true do ds_data_1.css('keyTag').first.text.should == '123' ds_data_1.css('alg').first.text.should == '3' ds_data_1.css('digestType').first.text.should == '1' - ds_data_1.css('digest').first.text.should == 'abc' + ds_data_1.css('digest').first.text.should == '0D85A305D22FCB355BBE29AE9809363D697B64782B9CC73AE349350F8C2AE4BB' dnskey_1 = ds_data_1.css('keyData')[0] dnskey_1.css('flags').first.text.should == '257' @@ -2061,7 +2066,7 @@ describe 'EPP Domain', epp: true do domain.touch - response = epp_plain_request(domain_info_xml(name: { value: domain.name }), :xml) + response = epp_plain_request(domain_info_xml(name: { value: domain.name })) inf_data = response[:parsed].css('resData infData') inf_data.css('upDate').text.should == domain.updated_at.to_time.utc.iso8601 @@ -2076,13 +2081,13 @@ describe 'EPP Domain', epp: true do 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) + xml = domain_info_xml(name: { value: domain.name, attrs: { hosts: 'invalid' } }) + response = epp_plain_request(xml, validate_input: false) 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) + response = epp_plain_request(xml) inf_data = response[:parsed].css('resData infData') inf_data.css('hostAttr').count.should == 2 @@ -2090,41 +2095,41 @@ describe 'EPP Domain', epp: true do 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) + response = epp_plain_request(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) + response = epp_plain_request(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) + response = epp_plain_request(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 = epp_plain_request(domain_info_xml(name: { value: 'test.ee' })) response[:results][0][:result_code].should == '2303' response[:results][0][:msg].should == 'Domain not found' end it 'sets ok status by default' do - response = epp_plain_request(domain_info_xml(name: { value: domain.name }), :xml) + response = epp_plain_request(domain_info_xml(name: { value: domain.name })) inf_data = response[:parsed].css('resData infData') inf_data.css('status').first[:s].should == 'ok' end it 'can not see other registrar domains with invalid password' do login_as :registrar2 do - response = epp_plain_request(domain_info_xml(name: { value: domain.name }), :xml) + response = epp_plain_request(domain_info_xml(name: { value: domain.name })) response[:result_code].should == '2201' response[:msg].should == 'Authorization error' end @@ -2135,7 +2140,7 @@ describe 'EPP Domain', epp: true do response = epp_plain_request(domain_info_xml( name: { value: domain.name }, authInfo: nil - ), :xml) + )) response[:result_code].should == '1000' response[:parsed].css('authInfo pw').first.should == nil @@ -2148,7 +2153,7 @@ describe 'EPP Domain', epp: true do response = epp_plain_request(domain_info_xml( name: { value: domain.name }, authInfo: { pw: { value: pw } } - ), :xml) + )) response[:result_code].should == '1000' response[:parsed].css('authInfo pw').text.should == pw @@ -2162,11 +2167,11 @@ describe 'EPP Domain', epp: true do }, { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] - }), :xml) + })) response[:msg].should == 'Command completed successfully; action pending' response[:result_code].should == '1001' @@ -2182,11 +2187,11 @@ describe 'EPP Domain', epp: true do }, { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] - }), :xml) + })) response[:result_code].should == '2304' response[:msg].should == 'Domain status prohibits operation' @@ -2200,18 +2205,18 @@ describe 'EPP Domain', epp: true do }, { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] - }), :xml) + })) response[:msg].should == 'Object status prohibits operation' response[:result_code].should == '2304' end it 'does not delete domain without legal document' do - response = epp_plain_request(@epp_xml.domain.delete(name: { value: 'example.ee' }), :xml) + response = epp_plain_request(@epp_xml.domain.delete(name: { value: 'example.ee' })) response[:result_code].should == '2003' response[:msg].should == 'Required parameter missing: extension > extdata > legalDocument [legal_document]' @@ -2223,7 +2228,7 @@ describe 'EPP Domain', epp: true do _anonymus: [ { name: { value: 'one.ee' } } ] - }), :xml) + })) response[:result_code].should == '1000' response[:msg].should == 'Command completed successfully' @@ -2236,7 +2241,7 @@ describe 'EPP Domain', epp: true do _anonymus: [ { name: { value: domain.name } } ] - }), :xml) + })) res_data = response[:parsed].css('resData chkData cd').first name = res_data.css('name').first reason = res_data.css('reason').first @@ -2255,7 +2260,7 @@ describe 'EPP Domain', epp: true do ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:result_code].should == '1000' response[:msg].should == 'Command completed successfully' @@ -2276,7 +2281,7 @@ describe 'EPP Domain', epp: true do ] }) - response = epp_plain_request(xml, :xml) + response = epp_plain_request(xml) response[:result_code].should == '1000' response[:msg].should == 'Command completed successfully' diff --git a/spec/epp/requests/contacts/renew.xml b/spec/epp/requests/contacts/renew.xml deleted file mode 100644 index aeffaa569..000000000 --- a/spec/epp/requests/contacts/renew.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - info-4444 - - 2fooBAR - - - - ABC-12345 - - diff --git a/spec/epp/session_spec.rb b/spec/epp/session_spec.rb index 4f4cde6c4..b8a0d6c21 100644 --- a/spec/epp/session_spec.rb +++ b/spec/epp/session_spec.rb @@ -5,6 +5,7 @@ describe 'EPP Session', epp: true do @api_user = Fabricate(:gitlab_api_user) @epp_xml = EppXml.new(cl_trid: 'ABC-12345') @login_xml_cache = @epp_xml.session.login(clID: { value: 'gitlab' }, pw: { value: 'ghyt9e4fu' }) + @xsd = Nokogiri::XML::Schema(File.read('doc/schemas/epp-1.0.xsd')) end context 'when not connected' do @@ -23,7 +24,7 @@ describe 'EPP Session', epp: true do it 'does not log in with invalid user' do wrong_user = @epp_xml.session.login(clID: { value: 'wrong-user' }, pw: { value: 'ghyt9e4fu' }) - response = epp_plain_request(wrong_user, :xml) + response = epp_plain_request(wrong_user) response[:msg].should == 'Authentication error; server closing connection' response[:result_code].should == '2501' response[:clTRID].should == 'ABC-12345' @@ -34,28 +35,29 @@ describe 'EPP Session', epp: true do Fabricate(:api_user, username: 'inactive-user', active: false, registrar: @registrar) inactive = @epp_xml.session.login(clID: { value: 'inactive-user' }, pw: { value: 'ghyt9e4fu' }) - response = epp_plain_request(inactive, :xml) + response = epp_plain_request(inactive) response[:msg].should == 'Authentication error; server closing connection' response[:result_code].should == '2501' end it 'prohibits further actions unless logged in' do - response = epp_plain_request(@epp_xml.domain.create, :xml) + @xsd = Nokogiri::XML::Schema(File.read('doc/schemas/domain-1.0.xsd')) + response = epp_plain_request(@epp_xml.domain.info(name: { value: 'test.ee' })) response[:msg].should == 'You need to login first.' response[:result_code].should == '2002' response[:clTRID].should == 'ABC-12345' end it 'should not have clTRID in response if client does not send it' do - epp_xml_no_cltrid = EppXml.new(cl_trid: '') + epp_xml_no_cltrid = EppXml.new(cl_trid: false) wrong_user = epp_xml_no_cltrid.session.login(clID: { value: 'wrong-user' }, pw: { value: 'ghyt9e4fu' }) - response = epp_plain_request(wrong_user, :xml) + response = epp_plain_request(wrong_user) response[:clTRID].should be_nil end context 'with valid user' do it 'logs in epp user' do - response = epp_plain_request(@login_xml_cache, :xml) + response = epp_plain_request(@login_xml_cache) response[:msg].should == 'Command completed successfully' response[:result_code].should == '1000' response[:clTRID].should == 'ABC-12345' @@ -67,12 +69,12 @@ describe 'EPP Session', epp: true do end it 'does not log in twice' do - response = epp_plain_request(@login_xml_cache, :xml) + response = epp_plain_request(@login_xml_cache) response[:msg].should == 'Command completed successfully' response[:result_code].should == '1000' response[:clTRID].should == 'ABC-12345' - response = epp_plain_request(@login_xml_cache, :xml) + response = epp_plain_request(@login_xml_cache) response[:msg].should match(/Already logged in. Use/) response[:result_code].should == '2002' @@ -84,10 +86,10 @@ describe 'EPP Session', epp: true do it 'logs out epp user' do c = EppSession.count - epp_plain_request(@login_xml_cache, :xml) + epp_plain_request(@login_xml_cache) EppSession.count.should == c + 1 - response = epp_plain_request(@epp_xml.session.logout, :xml) + response = epp_plain_request(@epp_xml.session.logout) response[:msg].should == 'Command completed successfully; ending session' response[:result_code].should == '1500' @@ -100,7 +102,7 @@ describe 'EPP Session', epp: true do clID: { value: 'gitlab' }, pw: { value: 'ghyt9e4fu' }, newPW: { value: 'abcdefg' } - ), :xml) + )) response[:msg].should == 'Command completed successfully' response[:result_code].should == '1000' @@ -115,7 +117,22 @@ describe 'EPP Session', epp: true do clID: { value: 'gitlab' }, pw: { value: 'ghyt9e4fu' }, newPW: { value: '' } - ), :xml) + ), validate_input: false) + + response[:msg].should == 'Password is missing [password]' + response[:result_code].should == '2306' + + @api_user.reload + @api_user.password.should == 'ghyt9e4fu' + end + + it 'fails if new password is not valid' do + @api_user.update(password: 'ghyt9e4fu') + response = epp_plain_request(@epp_xml.session.login( + clID: { value: 'gitlab' }, + pw: { value: 'ghyt9e4fu' }, + newPW: { value: '' } + ), validate_input: false) response[:msg].should == 'Password is missing [password]' response[:result_code].should == '2306' diff --git a/spec/support/epp.rb b/spec/support/epp.rb index f877bfc2f..5e9847d48 100644 --- a/spec/support/epp.rb +++ b/spec/support/epp.rb @@ -66,15 +66,27 @@ module Epp end def epp_plain_request(data, *args) - res = parse_response(server.send_request(data)) if args.include?(:xml) - if res - log(data, res[:parsed]) - return res + options = args.extract_options! + validate_input = options[:validate_input] != false # true by default + validate_output = options[:validate_output] != false # true by default + + if validate_input && @xsd + xml = Nokogiri::XML(data) + @xsd.validate(xml).each do |error| + fail Exception.new, error.to_s + end end - res = parse_response(server.send_request(read_body(data))) - log(read_body(data), res[:parsed]) - return res + res = parse_response(server.send_request(data)) + if res + log(data, res[:parsed]) + if validate_output && @xsd + @xsd.validate(Nokogiri(res[:raw])).each do |error| + fail Exception.new, error.to_s + end + end + return res + end rescue => e e end @@ -127,7 +139,7 @@ module Epp xml_params = defaults.deep_merge(xml_params) - epp_xml = EppXml::Domain.new(cl_trid: '') + epp_xml = EppXml::Domain.new(cl_trid: false) epp_xml.info(xml_params) end @@ -176,7 +188,7 @@ module Epp custom_params = { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] @@ -219,7 +231,7 @@ module Epp epp_xml.create(xml_params, {}, { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] @@ -260,7 +272,7 @@ module Epp custom_params = { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ] @@ -304,7 +316,7 @@ module Epp custom_params = { _anonymus: [ legalDocument: { - value: 'JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0Zp==', + value: 'dGVzdCBmYWlsCg==', attrs: { type: 'pdf' } } ]