nominet-epp 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1baec8eaf94460dfaaffe706aab21f691db5e124
4
- data.tar.gz: 18c591b8f71fc9af7ff4b67b6bd600e9c4402f37
3
+ metadata.gz: 300941743173cdc312f08bec2768411870fae78c
4
+ data.tar.gz: 395332be613671a74c0cd4cc8a8c1107be838e63
5
5
  SHA512:
6
- metadata.gz: 30bff530d232683cc4b6724c193c562fecd39b4ebfc09208c524c8f4e4a89900038485dd2c34f94714cc09b0088b4aa6afb6c0cbe81bb0f23964ea82b568ed08
7
- data.tar.gz: ced5fbd803365d58a870a0e791be50b00f447518cb421a255a2936410ab5f9c8ed0f3d73b99f6384a05724790c19879e24dfd28d6ec126610848be38bf17df54
6
+ metadata.gz: d246a794a3e732fcc7f4133986d0a4afe041338913531feb8b533489be2cfe40e2762cf9cea5a8c2ef623e15614edae5d765eed6e2e9134ef75a6515b9c8c17f
7
+ data.tar.gz: b13cb52ba650884feec239b41f75db1158911798b3541944afc566c7ce15faa5dbf4078dd7b3f8cfd0908ebdfe8c5b99256ec01154c4075c1f11ce62cf37a843
data/Gemfile.lock CHANGED
@@ -1,15 +1,15 @@
1
1
  GIT
2
2
  remote: git://github.com/m247/epp-client.git
3
- revision: a07e51fefcc2a68a317cf1200d4d80ce0b7dbfe0
3
+ revision: 0fe39d1765c28f728f3a63adad6eb7de49c0f049
4
4
  specs:
5
- epp-client (1.0.0)
5
+ epp-client (2.1.0)
6
6
  libxml-ruby
7
7
 
8
8
  PATH
9
9
  remote: .
10
10
  specs:
11
- nominet-epp (1.0.0)
12
- epp-client (~> 1.0.0)
11
+ nominet-epp (2.0.0)
12
+ epp-client (~> 2.1.0)
13
13
 
14
14
  GEM
15
15
  remote: https://rubygems.org/
data/lib/nominet-epp.rb CHANGED
@@ -3,7 +3,6 @@ require 'time'
3
3
 
4
4
  require File.dirname(__FILE__) + '/nominet-epp/version'
5
5
  require File.dirname(__FILE__) + '/nominet-epp/operations'
6
- require File.dirname(__FILE__) + '/nominet-epp/helpers'
7
6
 
8
7
  require File.dirname(__FILE__) + '/nominet-epp/client'
9
8
  require File.dirname(__FILE__) + '/nominet-epp/request'
@@ -13,6 +12,7 @@ require File.dirname(__FILE__) + '/nominet-epp/requests/custom/list'
13
12
  require File.dirname(__FILE__) + '/nominet-epp/requests/custom/handshake'
14
13
  require File.dirname(__FILE__) + '/nominet-epp/requests/custom/tag_list'
15
14
 
15
+ require File.dirname(__FILE__) + '/nominet-epp/requests/domain/request'
16
16
  require File.dirname(__FILE__) + '/nominet-epp/requests/domain/check'
17
17
  require File.dirname(__FILE__) + '/nominet-epp/requests/domain/create'
18
18
  require File.dirname(__FILE__) + '/nominet-epp/requests/domain/delete'
@@ -22,13 +22,17 @@ module NominetEPP
22
22
  # @param [String] tag Nominet TAG
23
23
  # @param [String] passwd Nominet TAG EPP Password
24
24
  # @param [String] server Nominet EPP Server address (nil forces default)
25
- # @param [String] address_family 'AF_INET' or 'AF_INET6' or either of the
26
- # appropriate socket constants. Will cause connections to be
27
- # limited to this address family. Default try all addresses.
28
- def initialize(tag, passwd, server = 'epp.nominet.org.uk', address_family = nil)
25
+ # @param [Hash] options Options
26
+ # @option options [String] :address_family 'AF_INET' or 'AF_INET6' or either of the
27
+ # appropriate socket constants. Will cause connections to be
28
+ # limited to this address family. Default try all addresses.
29
+ # @option options [OpenSSL::SSL::SSLContext] :ssl_context For client certificate auth
30
+ def initialize(tag, passwd, server = 'epp.nominet.org.uk', options = {})
31
+ options = {:address_family => options} unless options.kind_of?(Hash) # maintain backwards compatibility with old method signature
32
+ options = options.merge(:services => SERVICE_URNS, :extensions => SERVICE_EXTENSION_URNS)
33
+
29
34
  @tag, @server = tag, (server || 'epp.nominet.org.uk')
30
- @client = EPP::Client.new(@tag, passwd, @server, :services => SERVICE_URNS,
31
- :extensions => SERVICE_EXTENSION_URNS, :address_family => address_family)
35
+ @client = EPP::Client.new(@tag, passwd, @server, options)
32
36
  end
33
37
 
34
38
  # @see Object#inspect
@@ -241,17 +245,17 @@ module NominetEPP
241
245
  def create(entity, name, attributes = {})
242
246
  res = new_create(entity, name, attributes)
243
247
 
244
- if res.success?
248
+ if res.success? || res.pending?
245
249
  case entity
246
250
  when :domain, 'domain'
247
251
  { :name => res.name,
248
252
  :crDate => res.creation_date,
249
253
  :exDate => res.expiration_date }
250
254
  when :contact, 'contact'
251
- { :name => res.id,
255
+ { :name => res.name,
252
256
  :crDate => res.creation_date }
253
257
  when :host, 'host'
254
- { :name => res.id,
258
+ { :name => res.name,
255
259
  :crDate => res.creation_date }
256
260
  end
257
261
  else
@@ -251,6 +251,11 @@ module NominetEPP
251
251
  parsed[:updated_date] = Time.parse(node.content.strip)
252
252
  end
253
253
  end
254
+
255
+ if @parsed.nil? || @parsed.empty?
256
+ @parsed = parsed
257
+ end
258
+
254
259
  parsed
255
260
  end
256
261
  def parse_contact_postalInfo(data)
@@ -3,10 +3,11 @@ module NominetEPP
3
3
  class Check < Request
4
4
  def initialize(*names)
5
5
  rights = names.last.is_a?(Hash) ? names.pop : nil
6
+ names = names.compact # handle nil being passed for rights
6
7
 
7
8
  @command = EPP::Domain::Check.new(*names)
8
9
 
9
- if rights
10
+ if rights && !rights.empty?
10
11
  raise ArgumentError, "cannot check direct rights on more than one name" if names.count > 1
11
12
  @rights_ext = DirectRightsExtension.new(rights)
12
13
  @extension = EPP::Requests::Extension.new(@rights_ext) rescue nil
@@ -15,6 +15,8 @@ module NominetEPP
15
15
  @domain_ext = CreateExtension.new(@extensions) rescue nil
16
16
  @secdns_ext = CreateSecDNSExtension.new(@options.delete(:ds)) rescue nil
17
17
 
18
+ validate_period(options[:period])
19
+
18
20
  @command = EPP::Domain::Create.new(@name, @options)
19
21
  @extension = EPP::Requests::Extension.new(@domain_ext, @secdns_ext) rescue nil
20
22
  end
@@ -2,6 +2,7 @@ module NominetEPP
2
2
  module Domain
3
3
  class Renew < Request
4
4
  def initialize(name, exp_date, period = nil)
5
+ validate_period(period)
5
6
  @command = EPP::Domain::Renew.new(name, exp_date, period)
6
7
  end
7
8
  end
@@ -0,0 +1,14 @@
1
+ module NominetEPP
2
+ module Domain
3
+ class Request < ::NominetEPP::Request
4
+ def validate_period(period)
5
+ unit = period[-1,1]
6
+ val = period.to_i
7
+
8
+ if unit == 'y' && val > 10
9
+ raise ArgumentError, "maximum period accepted by Nominet is 10 years"
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -32,6 +32,7 @@ module NominetEPP
32
32
 
33
33
  node.find('//nom-direct-rights:chkData', namespaces).each do |chkData|
34
34
  @right_of_registration = chkData.find('nom-direct-rights:ror').first.content.strip
35
+ @right_of_registration = nil if @right_of_registration == ""
35
36
  end
36
37
  end
37
38
  end
@@ -1,4 +1,4 @@
1
1
  module NominetEPP
2
2
  # Current gem version number
3
- VERSION = "1.0.0"
3
+ VERSION = "2.0.0"
4
4
  end
data/nominet-epp.gemspec CHANGED
@@ -17,5 +17,5 @@ Gem::Specification.new do |gem|
17
17
 
18
18
  gem.extra_rdoc_files = %w(LICENSE README.md HISTORY.md)
19
19
 
20
- gem.add_dependency 'epp-client', '~> 1.0.0'
20
+ gem.add_dependency 'epp-client', '~> 2.1.0'
21
21
  end
@@ -0,0 +1,23 @@
1
+ require 'helper'
2
+
3
+ class TestNominetAccountChangeNotification < Test::Unit::TestCase
4
+ context 'NominetEPP::Notifications::AccountChange' do
5
+ setup do
6
+ @notification =
7
+ NominetEPP::Notification.new(
8
+ load_response('notifications/account-change'))
9
+ end
10
+ subject { @notification }
11
+
12
+ should 'have type' do
13
+ assert_equal :account_change, subject.type
14
+ end
15
+
16
+ should 'have contact id' do
17
+ assert_equal 'CMyContactID', subject.id
18
+ end
19
+ should 'have roid' do
20
+ assert_equal '548965487-UK', subject.roid
21
+ end
22
+ end
23
+ end
@@ -53,6 +53,58 @@ class TestNominetContactCreateRequest < Test::Unit::TestCase
53
53
  assert !xpath_exists?('//epp:extension'), "should not have extension element"
54
54
  end
55
55
  end
56
+ context 'multiple streets' do
57
+ setup do
58
+ @request = NominetEPP::Contact::Create.new('UK-4398495',
59
+ :voice => "+44.1234567890",
60
+ :email => "enoch.root@test.host",
61
+ :postal_info => {
62
+ :org => "Epiphyte",
63
+ :name => "Enoch Root",
64
+ :addr => {
65
+ :street => "Test Suite\n1 Test Avenue",
66
+ :city => "Testington",
67
+ :sp => "Testshire",
68
+ :pc => "TE57 1NG",
69
+ :cc => "GB" } })
70
+ @xml = prepare_request.to_xml
71
+
72
+ namespaces_from_request
73
+ end
74
+
75
+ should 'validate against schema' do
76
+ assert @xml.validate_schema(schema)
77
+ end
78
+
79
+ should 'set id' do
80
+ assert_equal 'UK-4398495', xpath_find('//contact:id')
81
+ end
82
+
83
+ should 'set voice' do
84
+ assert_equal "+44.1234567890", xpath_find('//contact:voice')
85
+ end
86
+ should 'set email' do
87
+ assert_equal "enoch.root@test.host", xpath_find('//contact:email')
88
+ end
89
+ should 'set organisation' do
90
+ assert_equal "Epiphyte", xpath_find('//contact:postalInfo[@type="loc"]/contact:org')
91
+ end
92
+ should 'set name' do
93
+ assert_equal "Enoch Root", xpath_find('//contact:postalInfo[@type="loc"]/contact:name')
94
+ end
95
+ should 'set address' do
96
+ assert_equal "Test Suite", xpath_find('//contact:postalInfo[@type="loc"]/contact:addr/contact:street[1]')
97
+ assert_equal "1 Test Avenue", xpath_find('//contact:postalInfo[@type="loc"]/contact:addr/contact:street[2]')
98
+ assert_equal "Testington", xpath_find('//contact:postalInfo[@type="loc"]/contact:addr/contact:city')
99
+ assert_equal "Testshire", xpath_find('//contact:postalInfo[@type="loc"]/contact:addr/contact:sp')
100
+ assert_equal "TE57 1NG", xpath_find('//contact:postalInfo[@type="loc"]/contact:addr/contact:pc')
101
+ assert_equal "GB", xpath_find('//contact:postalInfo[@type="loc"]/contact:addr/contact:cc')
102
+ end
103
+
104
+ should 'not have extension element' do
105
+ assert !xpath_exists?('//epp:extension'), "should not have extension element"
106
+ end
107
+ end
56
108
  context 'nominet extensions' do
57
109
  setup do
58
110
  @request = NominetEPP::Contact::Create.new('UK-4398495',
@@ -60,6 +60,65 @@ class TestNominetContactUpdateRequest < Test::Unit::TestCase
60
60
  assert !xpath_exists?('//epp:extension'), "should not have extension element"
61
61
  end
62
62
  end
63
+ context 'multiple streets' do
64
+ setup do
65
+ @time = Time.now.utc
66
+ @request = NominetEPP::Contact::Update.new('sh8013',
67
+ :chg => {
68
+ :voice => "+44.1234567890",
69
+ :email => "enoch.root@test.host",
70
+ :postal_info => {
71
+ :org => "Epiphyte",
72
+ :name => "Enoch Root",
73
+ :addr => {
74
+ :street => "Test Suite\n1 Test Avenue",
75
+ :city => "Testington",
76
+ :sp => "Testshire",
77
+ :pc => "TE57 1NG",
78
+ :cc => "GB" }}})
79
+ @xml = prepare_request.to_xml
80
+
81
+ namespaces_from_request
82
+ end
83
+
84
+ should 'validate against schema' do
85
+ assert @xml.validate_schema(schema)
86
+ end
87
+
88
+ should 'have update element' do
89
+ assert xpath_exists?('//contact:update'), "should have update element"
90
+ end
91
+
92
+ should 'have name element' do
93
+ assert_equal 'sh8013', xpath_find('//contact:id')
94
+ end
95
+
96
+ should 'set voice for change' do
97
+ assert_equal "+44.1234567890", xpath_find('//contact:chg/contact:voice')
98
+ end
99
+ should 'set email for change' do
100
+ assert_equal "enoch.root@test.host", xpath_find('//contact:chg/contact:email')
101
+ end
102
+ should 'not set organisation for change' do
103
+ # assert_equal "Epiphyte", xpath_find('//contact:chg/contact:postalInfo[@type="loc"]/contact:org')
104
+ assert !xpath_exists?('//contact:chg/contact:postalInfo[@type="loc"]/contact:org')
105
+ end
106
+ should 'set name for change' do
107
+ assert_equal "Enoch Root", xpath_find('//contact:chg/contact:postalInfo[@type="loc"]/contact:name')
108
+ end
109
+ should 'set address for change' do
110
+ assert_equal "Test Suite", xpath_find('//contact:chg/contact:postalInfo[@type="loc"]/contact:addr/contact:street[1]')
111
+ assert_equal "1 Test Avenue", xpath_find('//contact:chg/contact:postalInfo[@type="loc"]/contact:addr/contact:street[2]')
112
+ assert_equal "Testington", xpath_find('//contact:chg/contact:postalInfo[@type="loc"]/contact:addr/contact:city')
113
+ assert_equal "Testshire", xpath_find('//contact:chg/contact:postalInfo[@type="loc"]/contact:addr/contact:sp')
114
+ assert_equal "TE57 1NG", xpath_find('//contact:chg/contact:postalInfo[@type="loc"]/contact:addr/contact:pc')
115
+ assert_equal "GB", xpath_find('//contact:chg/contact:postalInfo[@type="loc"]/contact:addr/contact:cc')
116
+ end
117
+
118
+ should 'not have extension element' do
119
+ assert !xpath_exists?('//epp:extension'), "should not have extension element"
120
+ end
121
+ end
63
122
  context 'nominet extensions' do
64
123
  setup do
65
124
  @time = Time.now.utc
@@ -132,5 +132,58 @@ class TestNominetDomainCreateRequest < Test::Unit::TestCase
132
132
  assert xpath_exists?('//secDNS:create'), "should have DNSSEC extension element"
133
133
  end
134
134
  end
135
+ context 'period = 10y' do
136
+ setup do
137
+ @time = Time.now.utc
138
+ @request = NominetEPP::Domain::Create.new('example.co.uk',
139
+ :period => '10y', :registrant => 'UK-2349723',
140
+ :nameservers => %w(ns1.test.host ns2.test.host),
141
+ :auth_info => {:pw => '2381728348'})
142
+ @xml = prepare_request.to_xml
143
+
144
+ namespaces_from_request
145
+ end
146
+
147
+ should 'validate against schema' do
148
+ assert @xml.validate_schema(schema)
149
+ end
150
+
151
+ should 'have create element' do
152
+ assert xpath_exists?('//domain:create'), "should have create element"
153
+ end
154
+
155
+ should 'have name element' do
156
+ assert_equal 'example.co.uk', xpath_find('//domain:name')
157
+ end
158
+
159
+ should 'have period elemement of 10y' do
160
+ assert_equal '10', xpath_find('//domain:period')
161
+ assert_equal 'y', xpath_find('//domain:period/@unit')
162
+ end
163
+
164
+ should 'not have extension element' do
165
+ assert !xpath_exists?('//epp:extension'), "should not have extension element"
166
+ end
167
+ end
168
+ context 'period = 120m' do
169
+ should 'raise argument error' do
170
+ assert_raises ArgumentError do
171
+ NominetEPP::Domain::Create.new('example.co.uk',
172
+ :period => '120m', :registrant => 'UK-2349723',
173
+ :nameservers => %w(ns1.test.host ns2.test.host),
174
+ :auth_info => {:pw => '2381728348'})
175
+ end
176
+ end
177
+ end
178
+ context 'period = 11y' do
179
+ should 'raise argument error' do
180
+ assert_raises ArgumentError do
181
+ NominetEPP::Domain::Create.new('example.co.uk',
182
+ :period => '11y', :registrant => 'UK-2349723',
183
+ :nameservers => %w(ns1.test.host ns2.test.host),
184
+ :auth_info => {:pw => '2381728348'})
185
+ end
186
+ end
187
+ end
135
188
  end
136
189
  end
@@ -2,14 +2,48 @@ require 'helper'
2
2
 
3
3
  class TestNominetDomainRenewRequest < Test::Unit::TestCase
4
4
  context 'NominetEPP::Domain::Renew' do
5
- setup do
6
- @time = Time.now.utc
7
- @request = NominetEPP::Domain::Renew.new('example.co.uk', @time, '2y')
8
- @xml = prepare_request.to_xml
5
+ context 'normal renewal' do
6
+ setup do
7
+ @time = Time.now.utc
8
+ @request = NominetEPP::Domain::Renew.new('example.co.uk', @time, '2y')
9
+ @xml = prepare_request.to_xml
10
+ end
11
+
12
+ should 'validate against schema' do
13
+ assert @xml.validate_schema(schema)
14
+ end
9
15
  end
16
+ context 'period = 10y' do
17
+ setup do
18
+ @time = Time.now.utc
19
+ @request = NominetEPP::Domain::Renew.new('example.co.uk', @time, '10y')
20
+ @xml = prepare_request.to_xml
21
+
22
+ namespaces_from_request
23
+ end
10
24
 
11
- should 'validate against schema' do
12
- assert @xml.validate_schema(schema)
25
+ should 'validate against schema' do
26
+ assert @xml.validate_schema(schema)
27
+ end
28
+
29
+ should 'have period elemement of 10y' do
30
+ assert_equal '10', xpath_find('//domain:period')
31
+ assert_equal 'y', xpath_find('//domain:period/@unit')
32
+ end
33
+ end
34
+ context 'period = 120m' do
35
+ should 'raise ArgumentError' do
36
+ assert_raises ArgumentError do
37
+ NominetEPP::Domain::Renew.new('example.co.uk', Time.now, '120m')
38
+ end
39
+ end
40
+ end
41
+ context 'period = 11y' do
42
+ should 'raise argument error' do
43
+ assert_raises ArgumentError do
44
+ NominetEPP::Domain::Renew.new('example.co.uk', Time.now, '11y')
45
+ end
46
+ end
13
47
  end
14
48
  end
15
49
  end
@@ -76,4 +76,26 @@ class TestNominetContactInfoResponse < Test::Unit::TestCase
76
76
  assert_equal false, @info_response.opt_out
77
77
  end
78
78
  end
79
+ context 'NominetEPP::Contact::Info' do
80
+ setup do
81
+ @info_response = NominetEPP::Contact::InfoResponse.new(load_response('contact/info-streets'))
82
+ end
83
+
84
+ should 'be successful' do
85
+ assert @info_response.success?
86
+ assert_equal 1000, @info_response.code
87
+ end
88
+
89
+ should 'have postal info' do
90
+ expected = { :name => "Mary Smith",
91
+ :org => "Simple Registrant-TESTING",
92
+ :addr => {
93
+ :street => "Test Suite\n2 Test Street",
94
+ :city => "Test City",
95
+ :sp => "Testshire",
96
+ :pc => "TE57 1NG",
97
+ :cc => "GB" }}
98
+ assert_equal expected, @info_response.postal_info
99
+ end
100
+ end
79
101
  end
@@ -28,6 +28,10 @@ class TestNominetDomainCheckResponse < Test::Unit::TestCase
28
28
  should 'have an abuse limit' do
29
29
  assert_equal 49997, @check_response.abuse_limit
30
30
  end
31
+
32
+ should 'have nil right of registration' do
33
+ assert_nil @check_response.right_of_registration
34
+ end
31
35
  end
32
36
 
33
37
  context 'NominetEPP::Domain::Check with Domain Rights' do
@@ -0,0 +1,47 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <epp xmlns="urn:ietf:params:xml:ns:epp-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.nominet.org.uk/epp/xml/epp-1.0 epp-1.0.xsd">
3
+ <response>
4
+ <result code="1000">
5
+ <msg>Command completed successfully</msg>
6
+ </result>
7
+ <resData>
8
+ <contact:infData xmlns:contact="urn:ietf:params:xml:ns:contact-1.0" xsi:schemaLocation="urn:ietf:params:xml:ns:contact-1.0 contact-1.0.xsd">
9
+ <contact:id>EAXXMK1FW0YZTABD</contact:id>
10
+ <contact:roid>50643904-UK</contact:roid>
11
+ <contact:status s="ok"/>
12
+ <contact:postalInfo type="loc">
13
+ <contact:name>Mary Smith</contact:name>
14
+ <contact:org>Simple Registrant-TESTING</contact:org>
15
+ <contact:addr>
16
+ <contact:street>Test Suite</contact:street>
17
+ <contact:street>2 Test Street</contact:street>
18
+ <contact:city>Test City</contact:city>
19
+ <contact:sp>Testshire</contact:sp>
20
+ <contact:pc>TE57 1NG</contact:pc>
21
+ <contact:cc>GB</contact:cc>
22
+ </contact:addr>
23
+ </contact:postalInfo>
24
+ <contact:voice>+44.1234567890</contact:voice>
25
+ <contact:email>mary.smith@ariel-testing.co.uk</contact:email>
26
+ <contact:clID>TESTING</contact:clID>
27
+ <contact:crID>psamathe@nominet</contact:crID>
28
+ <contact:crDate>2013-09-13T00:09:32</contact:crDate>
29
+ </contact:infData>
30
+ </resData>
31
+ <extension>
32
+ <contact-nom-ext:infData xmlns:contact-nom-ext="http://www.nominet.org.uk/epp/xml/contact-nom-ext-1.0" xsi:schemaLocation="http://www.nominet.org.uk/epp/xml/contact-nom-ext-1.0 contact-nom-ext-1.0.xsd">
33
+ <contact-nom-ext:trad-name>Simple Registrant Trading Ltd</contact-nom-ext:trad-name>
34
+ <contact-nom-ext:type>LTD</contact-nom-ext:type>
35
+ <contact-nom-ext:co-no>12345678</contact-nom-ext:co-no>
36
+ <contact-nom-ext:opt-out>N</contact-nom-ext:opt-out>
37
+ </contact-nom-ext:infData>
38
+ <warning:truncated-field xmlns:warning="http://www.nominet.org.uk/epp/xml/std-warning-1.1" field-name="contact:crID" xsi:schemaLocation="http://www.nominet.org.uk/epp/xml/std-warning-1.1 std-warning-1.1.xsd">
39
+ Full entry is 'psamathe@nominet.org.uk'.
40
+ </warning:truncated-field>
41
+ </extension>
42
+ <trID>
43
+ <clTRID>TESTING-000008</clTRID>
44
+ <svTRID>231790</svTRID>
45
+ </trID>
46
+ </response>
47
+ </epp>
@@ -16,6 +16,9 @@
16
16
  </resData>
17
17
  <extension>
18
18
  <domain-nom-ext:chkData xmlns:domain-nom-ext="http://www.nominet.org.uk/epp/xml/domain-nom-ext-1.2" abuse-limit="49997" xsi:schemaLocation="http://www.nominet.org.uk/epp/xml/domain-nom-ext-1.2 domain-nom-ext-1.2.xsd"/>
19
+ <nom-direct-rights:chkData xmlns:nom-direct-rights="http://www.nominet.org.uk/epp/xml/nom-direct-rights-1.0" xsi:schemaLocation="http://www.nominet.org.uk/epp/xml/nom-direct-rights-1.0 nom-direct-rights-1.0.xsd">
20
+ <nom-direct-rights:ror/>
21
+ </nom-direct-rights:chkData>
19
22
  </extension>
20
23
  <trID>
21
24
  <clTRID>NOMINETEPP-000004</clTRID>
@@ -31,6 +31,12 @@
31
31
  <contact:upDate>2008-06-12T06:46:00Z</contact:upDate>
32
32
  </contact:infData>
33
33
  </resData>
34
+ <extension>
35
+ <contact-nom-ext:infData xmlns:contact-nom-ext="http://www.nominet.org.uk/epp/xml/contact-nom-ext-1.0" xsi:schemaLocation="http://www.nominet.org.uk/epp/xml/contact-nom-ext-1.0 contact-nom-ext-1.0.xsd">
36
+ <contact-nom-ext:type>IND</contact-nom-ext:type>
37
+ <contact-nom-ext:opt-out>N</contact-nom-ext:opt-out>
38
+ </contact-nom-ext:infData>
39
+ </extension>
34
40
  <trID>
35
41
  <clTRID>ABC-12345</clTRID>
36
42
  <svTRID>123456</svTRID>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nominet-epp
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Geoff Garside
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-02 00:00:00.000000000 Z
11
+ date: 2014-10-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: epp-client
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ~>
18
18
  - !ruby/object:Gem::Version
19
- version: 1.0.0
19
+ version: 2.1.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
- version: 1.0.0
26
+ version: 2.1.0
27
27
  description: Client for communicating with the Nominet EPP
28
28
  email:
29
29
  - geoff@geoffgarside.co.uk
@@ -46,7 +46,6 @@ files:
46
46
  - gemfiles/Gemfile.ruby18
47
47
  - lib/nominet-epp.rb
48
48
  - lib/nominet-epp/client.rb
49
- - lib/nominet-epp/helpers.rb
50
49
  - lib/nominet-epp/notification.rb
51
50
  - lib/nominet-epp/operations.rb
52
51
  - lib/nominet-epp/request.rb
@@ -65,6 +64,7 @@ files:
65
64
  - lib/nominet-epp/requests/domain/info.rb
66
65
  - lib/nominet-epp/requests/domain/release.rb
67
66
  - lib/nominet-epp/requests/domain/renew.rb
67
+ - lib/nominet-epp/requests/domain/request.rb
68
68
  - lib/nominet-epp/requests/domain/unrenew.rb
69
69
  - lib/nominet-epp/requests/domain/update.rb
70
70
  - lib/nominet-epp/requests/host/check.rb
@@ -98,6 +98,7 @@ files:
98
98
  - lib/nominet-epp/version.rb
99
99
  - nominet-epp.gemspec
100
100
  - test/helper.rb
101
+ - test/notifications/test_account_change_notification.rb
101
102
  - test/notifications/test_contact_deleted_notification.rb
102
103
  - test/notifications/test_domain_cancelled_notification.rb
103
104
  - test/notifications/test_domains_released_notification.rb
@@ -152,6 +153,7 @@ files:
152
153
  - test/support/responses/contact/check.xml
153
154
  - test/support/responses/contact/create.xml
154
155
  - test/support/responses/contact/delete.xml
156
+ - test/support/responses/contact/info-streets.xml
155
157
  - test/support/responses/contact/info.xml
156
158
  - test/support/responses/contact/release.xml
157
159
  - test/support/responses/contact/update.xml
@@ -237,6 +239,7 @@ specification_version: 4
237
239
  summary: Nominet EPP (Extensible Provisioning Protocol) Client
238
240
  test_files:
239
241
  - test/helper.rb
242
+ - test/notifications/test_account_change_notification.rb
240
243
  - test/notifications/test_contact_deleted_notification.rb
241
244
  - test/notifications/test_domain_cancelled_notification.rb
242
245
  - test/notifications/test_domains_released_notification.rb
@@ -291,6 +294,7 @@ test_files:
291
294
  - test/support/responses/contact/check.xml
292
295
  - test/support/responses/contact/create.xml
293
296
  - test/support/responses/contact/delete.xml
297
+ - test/support/responses/contact/info-streets.xml
294
298
  - test/support/responses/contact/info.xml
295
299
  - test/support/responses/contact/release.xml
296
300
  - test/support/responses/contact/update.xml
@@ -1,184 +0,0 @@
1
- module NominetEPP
2
- # Helper methods
3
- module Helpers
4
- # @param [String, Array] nameservers Nameserver host name or array of host names or hashes
5
- # @param [XML::Namespace] ns XML Namespace to create the elements with
6
- # @return [XML::Node] +ns+ element of +host+ elements
7
- # @see domain_host_xml
8
- def domain_ns_xml(nameservers, ns)
9
- ns_el = XML::Node.new('ns', nil, ns)
10
-
11
- case nameservers
12
- when String
13
- ns_el << domain_host_xml(nameservers, ns)
14
- when Array
15
- nameservers.each do |nameserver|
16
- ns_el << domain_host_xml(nameserver, ns)
17
- end
18
- else
19
- raise ArgumentError, "nameservers must either be a string or array"
20
- end
21
-
22
- ns_el
23
- end
24
-
25
- # @param [String, Hash] nameserver Nameserver host name or hash of +:name+ and +:v4+ or +:v6+ address
26
- # @param [XML::Namespace] ns XML Namespace to create the elements with
27
- # @return [XML::Node] +host+ element with +hostName+ and optionally +ip+ subelements
28
- def domain_host_xml(nameserver, ns)
29
- host = XML::Node.new('host', nil, ns)
30
-
31
- case nameserver
32
- when String
33
- host << XML::Node.new('hostName', nameserver, ns)
34
- when Hash
35
- host << XML::Node.new('hostName', nameserver[:name], ns)
36
- if nameserver[:v4]
37
- host << XML::Node.new('hostAddr', nameserver[:v4], ns).tap do |n|
38
- n['ip'] = 'v4'
39
- end
40
- end
41
- if nameserver[:v6]
42
- host << XML::Node.new('hostAddr', nameserver[:v6], ns).tap do |n|
43
- n['ip'] = 'v6'
44
- end
45
- end
46
- end
47
-
48
- host
49
- end
50
-
51
- # Adds the attributes from the fields to the +node+.
52
- #
53
- # @param [Hash] fields Account attributes to marshal
54
- # @param [XML::Node] node XML Node to add the attributes to
55
- # @param [XML::Namespace] ns XML Namespace to create the elements under
56
- def account_fields_xml(fields, node, ns)
57
- [:trad_name, :type, :co_no, :opt_out, :addr, :contacts].each do |k|
58
- next if fields[k].nil?
59
- case k
60
- when :contacts
61
- account_contacts_to_xml(fields[k], ns) do |n|
62
- node << n
63
- end
64
- when :addr # Limitation, can only handle one addr at a time
65
- node << addr_to_xml(fields[k], ns)
66
- else
67
- node << generic_field_to_xml(k, fields[k], ns) unless fields[k] == ''
68
- end
69
- end
70
- end
71
-
72
- # Creates an XML node with the dashed form of the +name+.
73
- #
74
- # @param [String] name Element name, underscores will be converted to hyphens
75
- # @param [String] value Element value
76
- # @param [XML::Namespace] ns XML Namespace to create the element under
77
- # @return [XML::Node]
78
- def generic_field_to_xml(name, value, ns)
79
- XML::Node.new(name.to_s.gsub('_', '-'), value, ns)
80
- end
81
-
82
- # Massage the contacts to ensure they have an :order parameter
83
- #
84
- # @param [Array<Hash>] contacts Array of contact attributes
85
- # @return [Array<Hash>] Fixed array of contact attributes
86
- def fixup_account_contacts(contacts)
87
- if contacts.all? { |c| c.has_key? :order }
88
- return contacts.sort { |a,b| a[:order].to_i <=> b[:order].to_i }
89
- elsif contacts.any? { |c| c.has_key? :order }
90
- unordered = contacts.map {|c| c if c[:order].nil? }.compact
91
- ordered = Array.new
92
- contacts.each do |c|
93
- next if c[:order].nil?
94
- ordered[c[:order].to_i - 1] = c
95
- end
96
-
97
- contacts = ordered.map do |i|
98
- unless i.nil? then i
99
- else unordered.shift
100
- end
101
- end + unordered
102
- end
103
-
104
- contacts.each_with_index { |c,i| c[:order] = (i+1).to_s }
105
- end
106
-
107
- # Creates and array of XML::Node objects for each contact passed.
108
- #
109
- # @param [Array] contacts Array of contacts
110
- # @param [XML::Namespace] ns XML Namespace to create the elements under
111
- # @yield [node]
112
- # @yieldparam [XML::Node] node XML contact element
113
- # @return [Array] array of XML contact nodes
114
- def account_contacts_to_xml(contacts, ns)
115
- raise ArgumentError, "contacts must be an Array" unless contacts.is_a?(Array)
116
- raise ArgumentError, "ns must be an xml namespace" unless ns.is_a?(XML::Namespace)
117
-
118
- contacts = fixup_account_contacts(contacts)
119
-
120
- contacts[0,3].map do |contact|
121
- account_contact_to_xml(contact, ns).tap do |n|
122
- yield n if block_given?
123
- end
124
- end
125
- end
126
-
127
- # Creates an XML contact element
128
- #
129
- # @param [Hash] contact Contact attributes
130
- # @param [XML::Namespace] ns XML Namespace to create the elements under
131
- # @return [XML::Node] XML contact element
132
- def account_contact_to_xml(contact, ns)
133
- raise ArgumentError, "contact must be a hash" unless contact.is_a?(Hash)
134
- raise ArgumentError, "ns must be an xml namespace" unless ns.is_a?(XML::Namespace)
135
-
136
- XML::Node.new('contact', nil, ns).tap do |node|
137
- node['order'] = contact.delete(:order).to_s if contact.has_key?(:order)
138
-
139
- node << contact_to_xml(contact)
140
- end
141
- end
142
-
143
- # Creates an XML +contact:create+ or +contact:update+ element.
144
- #
145
- # The choice to create a +create+ or +update+ element is determined by the presence of
146
- # a +:roid+ key in the list of attributes.
147
- #
148
- # @param [Hash] contact Contact attributes
149
- # @return [XML::Node] XML contact:+action+ element with the attributes
150
- def contact_to_xml(contact)
151
- keys = [:roid, :name, :phone, :mobile, :email]
152
- raise ArgumentError, "contact must be a hash" unless contact.is_a?(Hash)
153
- raise ArgumentError, "Contact allowed keys are #{keys.join(', ')}" unless (contact.keys - keys).empty?
154
- raise ArgumentError, "Contact requires name and email keys" unless contact.has_key?(:name) && contact.has_key?(:email)
155
-
156
- action = contact[:roid].nil? || contact[:roid] == '' ? 'create' : 'update'
157
- contact(action) do |node, ns|
158
- keys.each do |key|
159
- next if contact[key].nil? || contact[key] == ''
160
- node << XML::Node.new(key, contact[key], ns)
161
- end
162
- end
163
- end
164
-
165
- # Creates an XML addr element
166
- #
167
- # @param [Hash] addr Address attributes
168
- # @param [XML::Namespace] ns XML Namespace to create the elements in
169
- # @return [XML::Node] XML addr element
170
- def addr_to_xml(addr, ns)
171
- keys = [:street, :locality, :city, :county, :postcode, :country]
172
- raise ArgumentError, "addr must be a hash" unless addr.is_a?(Hash)
173
- raise ArgumentError, "ns must be an xml namespace" unless ns.is_a?(XML::Namespace)
174
- raise ArgumentError, "Address allowed keys are #{keys.join(', ')}" unless (addr.keys - keys).empty?
175
-
176
- XML::Node.new('addr', nil, ns).tap do |a|
177
- keys.each do |key|
178
- next if addr[key].nil? || addr[key] == ''
179
- a << XML::Node.new(key, addr[key], ns)
180
- end
181
- end
182
- end
183
- end
184
- end