epp-client-base 0.14.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/Rakefile +4 -5
- data/epp-client-base.gemspec +4 -4
- data/lib/epp-client/base.rb +22 -18
- data/lib/epp-client/connection.rb +21 -29
- data/lib/epp-client/contact.rb +180 -181
- data/lib/epp-client/domain.rb +180 -185
- data/lib/epp-client/exceptions.rb +1 -0
- data/lib/epp-client/poll.rb +19 -19
- data/lib/epp-client/session.rb +24 -28
- data/lib/epp-client/ssl.rb +9 -12
- data/lib/epp-client/version.rb +1 -1
- data/lib/epp-client/xml.rb +51 -54
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
SHA512:
|
3
|
-
metadata.gz: 77ee35cbe7938f4361e9f66716814012f9c1f30c93f0a514bd1316ee7a33dd82fd266609b7fa6cac31ebe9ab43d9251465f6cee240ca9214800ec9d05e14d8b6
|
4
|
-
data.tar.gz: f619b6f39bd0d9828ea288b9d7b3cd2ca05f9bca0cd7e6883c0471662b612fc750ce56aa03a2b64b84f2c396c0a3e660f6f471d0b717d388843c158fac6aee8e
|
5
2
|
SHA1:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f49097239ee4ebb706ad276429827cf648d8b046
|
4
|
+
data.tar.gz: 2d2827164f086591d6c46d5293313d4f7a11df1e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 01e2016614a1fee29f2742aa5dabc964d39aaea655d9ac38bd5ab068c690747ad352d7140be457cb67e04ed67c01a52ccab8834988f241ee96fee3a7c1784aeb
|
7
|
+
data.tar.gz: 020cf0e3e96fa096c1d4ea620b520813f2ab82863bfa4cafdcd0fba774c221ee62144c7c14c88ec0f1a512460cad8eb71e6dd9e1083777935246a39d0ed395dd
|
data/Rakefile
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
require 'rake'
|
3
3
|
require 'rdoc/task'
|
4
4
|
require 'rubygems/package_task'
|
5
|
-
require
|
5
|
+
require 'bundler/gem_helper'
|
6
6
|
|
7
|
-
MY_GEMS = Dir['*.gemspec'].map {|g| g.sub(/.*-(.*)\.gemspec/, '\1')}
|
7
|
+
MY_GEMS = Dir['*.gemspec'].map { |g| g.sub(/.*-(.*)\.gemspec/, '\1') }
|
8
8
|
|
9
9
|
MY_GEMS.each do |g|
|
10
10
|
namespace g do
|
@@ -26,10 +26,10 @@ task :build => 'all:build'
|
|
26
26
|
task :install => 'all:install'
|
27
27
|
task :push => 'all:push'
|
28
28
|
|
29
|
-
desc
|
29
|
+
desc 'Generate documentation for the Rails framework'
|
30
30
|
Rake::RDocTask.new do |rdoc|
|
31
31
|
rdoc.rdoc_dir = 'doc/rdoc'
|
32
|
-
rdoc.title =
|
32
|
+
rdoc.title = 'Documentation'
|
33
33
|
|
34
34
|
rdoc.options << '--line-numbers' << '--inline-source'
|
35
35
|
rdoc.options << '--charset' << 'utf-8'
|
@@ -38,4 +38,3 @@ Rake::RDocTask.new do |rdoc|
|
|
38
38
|
rdoc.rdoc_files.include('ChangeLog')
|
39
39
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
40
40
|
end
|
41
|
-
|
data/epp-client-base.gemspec
CHANGED
@@ -8,12 +8,12 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.email = ['m@absolight.fr']
|
9
9
|
gem.description = 'An extensible EPP client library.'
|
10
10
|
gem.summary = 'An extensible EPP client library'
|
11
|
-
gem.homepage
|
11
|
+
gem.homepage = 'https://github.com/Absolight/epp-client'
|
12
12
|
|
13
13
|
gem.required_ruby_version = '>= 1.8.7'
|
14
|
-
gem.required_rubygems_version =
|
14
|
+
gem.required_rubygems_version = '>= 1.3.6'
|
15
15
|
|
16
|
-
gem.files
|
16
|
+
gem.files = [
|
17
17
|
'ChangeLog',
|
18
18
|
'Gemfile',
|
19
19
|
'MIT-LICENSE',
|
@@ -47,7 +47,7 @@ Gem::Specification.new do |gem|
|
|
47
47
|
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
48
48
|
gem.require_paths = ['lib']
|
49
49
|
|
50
|
-
gem.add_development_dependency
|
50
|
+
gem.add_development_dependency 'bundler', '>= 1.0.0'
|
51
51
|
gem.add_dependency('nokogiri', '~> 1.4')
|
52
52
|
gem.add_dependency('builder', '>= 2.1.2')
|
53
53
|
end
|
data/lib/epp-client/base.rb
CHANGED
@@ -3,7 +3,8 @@ require 'socket'
|
|
3
3
|
require 'nokogiri'
|
4
4
|
require 'builder'
|
5
5
|
require 'date'
|
6
|
-
require
|
6
|
+
require 'English'
|
7
|
+
require 'epp-client/version'
|
7
8
|
require 'epp-client/xml'
|
8
9
|
require 'epp-client/session'
|
9
10
|
require 'epp-client/connection'
|
@@ -14,23 +15,26 @@ require 'epp-client/domain'
|
|
14
15
|
require 'epp-client/contact'
|
15
16
|
|
16
17
|
module EPPClient
|
18
|
+
# This is the base class.
|
19
|
+
#
|
20
|
+
# It can be used directly to talk to EPP servers that have no specific
|
21
|
+
# requirements.
|
17
22
|
class Base
|
18
|
-
|
19
|
-
SCHEMAS = %w[
|
23
|
+
SCHEMAS = %w(
|
20
24
|
epp-1.0
|
21
25
|
domain-1.0
|
22
26
|
host-1.0
|
23
27
|
contact-1.0
|
24
|
-
|
25
|
-
SCHEMAS_EXT_IETF = %w
|
28
|
+
)
|
29
|
+
SCHEMAS_EXT_IETF = %w(
|
26
30
|
rgp-1.0
|
27
|
-
|
31
|
+
)
|
28
32
|
|
29
|
-
EPPClient::SCHEMAS_URL = SCHEMAS.inject({}) do |a,s|
|
33
|
+
EPPClient::SCHEMAS_URL = SCHEMAS.inject({}) do |a, s|
|
30
34
|
a[s.sub(/-1\.0$/, '')] = "urn:ietf:params:xml:ns:#{s}" if s =~ /-1\.0$/
|
31
35
|
a[s] = "urn:ietf:params:xml:ns:#{s}"
|
32
36
|
a
|
33
|
-
end.merge!(SCHEMAS_EXT_IETF.inject({}) do |a,s|
|
37
|
+
end.merge!(SCHEMAS_EXT_IETF.inject({}) do |a, s|
|
34
38
|
a[s.sub(/-1\.0$/, '')] = "urn:ietf:params:xml:ns:#{s}" if s =~ /-1\.0$/
|
35
39
|
a[s] = "urn:ietf:params:xml:ns:#{s}"
|
36
40
|
a
|
@@ -77,23 +81,23 @@ module EPPClient
|
|
77
81
|
# [<tt>:ssl_key</tt>] The file containing the key of the certificate.
|
78
82
|
def initialize(attrs)
|
79
83
|
unless attrs.key?(:server) && attrs.key?(:client_id) && attrs.key?(:password)
|
80
|
-
|
84
|
+
fail ArgumentError, 'server, client_id and password are required'
|
81
85
|
end
|
82
86
|
|
83
|
-
attrs.each do |k,v|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
87
|
+
attrs.each do |k, v|
|
88
|
+
begin
|
89
|
+
send("#{k}=", v)
|
90
|
+
rescue NoMethodError
|
91
|
+
raise ArgumentError, "there is no #{k} argument"
|
92
|
+
end
|
89
93
|
end
|
90
94
|
|
91
95
|
@port ||= 700
|
92
|
-
@lang ||=
|
96
|
+
@lang ||= 'en'
|
93
97
|
@services ||= EPPClient::SCHEMAS_URL.values_at('domain', 'contact', 'host')
|
94
98
|
@extensions ||= []
|
95
|
-
@version ||=
|
96
|
-
@clTRID ||= "test-#{
|
99
|
+
@version ||= '1.0'
|
100
|
+
@clTRID ||= "test-#{$PROCESS_ID}-#{rand(1000)}"
|
97
101
|
@clTRID_index = 0
|
98
102
|
|
99
103
|
@context ||= OpenSSL::SSL::SSLContext.new
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module EPPClient
|
2
|
+
# This handles all the basic I/O for the connection.
|
2
3
|
module Connection
|
3
|
-
|
4
4
|
attr_reader :sent_frame, :recv_frame, :srv_version, :srv_lang, :srv_ns, :srv_ext
|
5
5
|
|
6
6
|
# Establishes the connection to the server, if successful, will return the
|
@@ -16,63 +16,55 @@ module EPPClient
|
|
16
16
|
@socket.connect
|
17
17
|
|
18
18
|
# Get the initial greeting frame
|
19
|
-
greeting_process(
|
19
|
+
greeting_process(one_frame)
|
20
20
|
end
|
21
21
|
|
22
22
|
def greeting_process(xml) #:nodoc:
|
23
|
-
@srv_version = xml.xpath('epp:epp/epp:greeting/epp:svcMenu/epp:version', EPPClient::SCHEMAS_URL).map
|
24
|
-
@srv_lang = xml.xpath('epp:epp/epp:greeting/epp:svcMenu/epp:lang', EPPClient::SCHEMAS_URL).map
|
25
|
-
@srv_ns = xml.xpath('epp:epp/epp:greeting/epp:svcMenu/epp:objURI', EPPClient::SCHEMAS_URL).map
|
23
|
+
@srv_version = xml.xpath('epp:epp/epp:greeting/epp:svcMenu/epp:version', EPPClient::SCHEMAS_URL).map(&:text)
|
24
|
+
@srv_lang = xml.xpath('epp:epp/epp:greeting/epp:svcMenu/epp:lang', EPPClient::SCHEMAS_URL).map(&:text)
|
25
|
+
@srv_ns = xml.xpath('epp:epp/epp:greeting/epp:svcMenu/epp:objURI', EPPClient::SCHEMAS_URL).map(&:text)
|
26
26
|
if (ext = xml.xpath('epp:epp/epp:greeting/epp:svcMenu/epp:svcExtension/epp:extURI', EPPClient::SCHEMAS_URL)).size > 0
|
27
|
-
|
27
|
+
@srv_ext = ext.map(&:text)
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
xml
|
31
31
|
end
|
32
32
|
|
33
33
|
# Gracefully close the connection
|
34
34
|
def close_connection
|
35
|
-
if defined?(@socket)
|
36
|
-
|
37
|
-
|
35
|
+
if defined?(@socket) && @socket.is_a?(OpenSSL::SSL::SSLSocket)
|
36
|
+
@socket.close
|
37
|
+
@socket = nil
|
38
38
|
end
|
39
39
|
|
40
|
-
if defined?(@tcpserver)
|
41
|
-
|
42
|
-
|
40
|
+
if defined?(@tcpserver) && @tcpserver.is_a?(TCPSocket)
|
41
|
+
@tcpserver.close
|
42
|
+
@tcpserver = nil
|
43
43
|
end
|
44
44
|
|
45
|
-
return true if @tcpserver.nil?
|
45
|
+
return true if @tcpserver.nil? && @socket.nil?
|
46
46
|
end
|
47
47
|
|
48
48
|
# Sends a frame and returns the server's answer
|
49
49
|
def send_request(xml)
|
50
50
|
send_frame(xml)
|
51
|
-
|
51
|
+
one_frame
|
52
52
|
end
|
53
53
|
|
54
54
|
# sends a frame
|
55
55
|
def send_frame(xml)
|
56
56
|
@sent_frame = xml
|
57
|
-
@socket.write([xml.size + 4].pack(
|
57
|
+
@socket.write([xml.size + 4].pack('N') + xml)
|
58
58
|
sent_frame_to_xml
|
59
|
-
return
|
60
59
|
end
|
61
60
|
|
62
61
|
# gets a frame from the socket and returns the parsed response.
|
63
|
-
def
|
62
|
+
def one_frame
|
64
63
|
size = @socket.read(4)
|
65
|
-
if size.nil?
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
raise SocketError, "Error reading frame from remote server"
|
70
|
-
end
|
71
|
-
else
|
72
|
-
size = size.unpack('N')[0]
|
73
|
-
@recv_frame = @socket.read(size - 4)
|
74
|
-
recv_frame_to_xml
|
75
|
-
end
|
64
|
+
fail SocketError, @socket.eof? ? 'Connection closed by remote server' : 'Error reading frame from remote server' if size.nil?
|
65
|
+
size = size.unpack('N')[0]
|
66
|
+
@recv_frame = @socket.read(size - 4)
|
67
|
+
recv_frame_to_xml
|
76
68
|
end
|
77
69
|
end
|
78
70
|
end
|
data/lib/epp-client/contact.rb
CHANGED
@@ -1,16 +1,19 @@
|
|
1
1
|
module EPPClient
|
2
|
+
# This module handles all the contact interactions.
|
3
|
+
#
|
4
|
+
# See RFC 5733 for more informations.
|
2
5
|
module Contact
|
3
6
|
EPPClient::Poll::PARSERS['contact:infData'] = :contact_info_process
|
4
7
|
|
5
8
|
def contact_check_xml(*contacts) #:nodoc:
|
6
9
|
command do |xml|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
xml.check do
|
11
|
+
xml.check('xmlns' => EPPClient::SCHEMAS_URL['contact-1.0']) do
|
12
|
+
contacts.each do |c|
|
13
|
+
xml.id(c)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
14
17
|
end
|
15
18
|
end
|
16
19
|
|
@@ -34,29 +37,29 @@ module EPPClient
|
|
34
37
|
|
35
38
|
def contact_check_process(xml) #:nodoc:
|
36
39
|
xml.xpath('epp:resData/contact:chkData/contact:cd', EPPClient::SCHEMAS_URL).map do |dom|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
40
|
+
ret = {
|
41
|
+
:name => dom.xpath('contact:id', EPPClient::SCHEMAS_URL).text,
|
42
|
+
:avail => dom.xpath('contact:id', EPPClient::SCHEMAS_URL).attr('avail').value == '1',
|
43
|
+
}
|
44
|
+
unless (reason = dom.xpath('contact:reason', EPPClient::SCHEMAS_URL).text).empty?
|
45
|
+
ret[:reason] = reason
|
46
|
+
end
|
47
|
+
ret
|
45
48
|
end
|
46
49
|
end
|
47
50
|
|
48
51
|
def contact_info_xml(args) #:nodoc:
|
49
52
|
command do |xml|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
53
|
+
xml.info do
|
54
|
+
xml.info('xmlns' => EPPClient::SCHEMAS_URL['contact-1.0']) do
|
55
|
+
xml.id(args[:id])
|
56
|
+
if args.key?(:authInfo)
|
57
|
+
xml.authInfo do
|
58
|
+
xml.pw(args[:authInfo])
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
60
63
|
end
|
61
64
|
end
|
62
65
|
|
@@ -114,13 +117,10 @@ module EPPClient
|
|
114
117
|
# [<tt>:disclose</tt>]
|
115
118
|
# an optional array that identifies elements that require exceptional
|
116
119
|
# server-operator handling to allow or restrict disclosure to third
|
117
|
-
# parties. See
|
118
|
-
#
|
119
|
-
# for details.
|
120
|
+
# parties. See {section 2.9 of RFC
|
121
|
+
# 5733}[http://tools.ietf.org/html/rfc5733#section-2.9] for details.
|
120
122
|
def contact_info(args)
|
121
|
-
|
122
|
-
args = {:id => args}
|
123
|
-
end
|
123
|
+
args = { :id => args } if args.is_a?(String)
|
124
124
|
response = send_request(contact_info_xml(args))
|
125
125
|
|
126
126
|
get_result(:xml => response, :callback => :contact_info_process)
|
@@ -129,107 +129,107 @@ module EPPClient
|
|
129
129
|
def contact_info_process(xml) #:nodoc:
|
130
130
|
contact = xml.xpath('epp:resData/contact:infData', EPPClient::SCHEMAS_URL)
|
131
131
|
ret = {
|
132
|
-
|
133
|
-
|
132
|
+
:id => contact.xpath('contact:id', EPPClient::SCHEMAS_URL).text,
|
133
|
+
:roid => contact.xpath('contact:roid', EPPClient::SCHEMAS_URL).text,
|
134
134
|
}
|
135
135
|
if (status = contact.xpath('contact:status', EPPClient::SCHEMAS_URL)).size > 0
|
136
|
-
|
136
|
+
ret[:status] = status.map { |s| s.attr('s') }
|
137
137
|
end
|
138
138
|
|
139
139
|
if (postalInfo = contact.xpath('contact:postalInfo', EPPClient::SCHEMAS_URL)).size > 0
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
140
|
+
ret[:postalInfo] = postalInfo.inject({}) do |acc, p|
|
141
|
+
type = p.attr('type').to_sym
|
142
|
+
acc[type] = { :name => p.xpath('contact:name', EPPClient::SCHEMAS_URL).text, :addr => {} }
|
143
|
+
if (org = p.xpath('contact:org', EPPClient::SCHEMAS_URL)).size > 0
|
144
|
+
acc[type][:org] = org.text
|
145
|
+
end
|
146
|
+
addr = p.xpath('contact:addr', EPPClient::SCHEMAS_URL)
|
147
147
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
148
|
+
acc[type][:addr][:street] = addr.xpath('contact:street', EPPClient::SCHEMAS_URL).map(&:text)
|
149
|
+
%w(city cc).each do |val|
|
150
|
+
acc[type][:addr][val.to_sym] = addr.xpath("contact:#{val}", EPPClient::SCHEMAS_URL).text
|
151
|
+
end
|
152
|
+
%w(sp pc).each do |val|
|
153
|
+
if (r = addr.xpath("contact:#{val}", EPPClient::SCHEMAS_URL)).size > 0
|
154
|
+
acc[type][:addr][val.to_sym] = r.text
|
155
|
+
end
|
156
|
+
end
|
157
157
|
|
158
|
-
|
159
|
-
|
158
|
+
acc
|
159
|
+
end
|
160
160
|
end
|
161
161
|
|
162
162
|
%w(voice fax email clID crID upID).each do |val|
|
163
|
-
|
164
|
-
|
165
|
-
|
163
|
+
if (value = contact.xpath("contact:#{val}", EPPClient::SCHEMAS_URL)).size > 0
|
164
|
+
ret[val.to_sym] = value.text
|
165
|
+
end
|
166
166
|
end
|
167
167
|
%w(crDate upDate trDate).each do |val|
|
168
|
-
|
169
|
-
|
170
|
-
|
168
|
+
if (date = contact.xpath("contact:#{val}", EPPClient::SCHEMAS_URL)).size > 0
|
169
|
+
ret[val.to_sym] = DateTime.parse(date.text)
|
170
|
+
end
|
171
171
|
end
|
172
172
|
if (authInfo = contact.xpath('contact:authInfo', EPPClient::SCHEMAS_URL)).size > 0
|
173
|
-
|
173
|
+
ret[:authInfo] = authInfo.xpath('contact:pw', EPPClient::SCHEMAS_URL).text
|
174
174
|
end
|
175
175
|
if (disclose = contact.xpath('contact:disclose', EPPClient::SCHEMAS_URL)).size > 0
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
176
|
+
ret[:disclose] = { :flag => disclose.attr('flag').value == '1', :elements => [] }
|
177
|
+
disclose.children.each do |c|
|
178
|
+
r = { :name => c.name }
|
179
|
+
unless (type = c.attr('type').value).nil?
|
180
|
+
r[:type] == type
|
181
|
+
end
|
182
|
+
ret[:disclose][:elements] << r
|
183
|
+
end
|
184
184
|
end
|
185
185
|
ret
|
186
186
|
end
|
187
187
|
|
188
188
|
def contact_create_xml(contact) #:nodoc:
|
189
189
|
command do |xml|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
190
|
+
xml.create do
|
191
|
+
xml.create('xmlns' => EPPClient::SCHEMAS_URL['contact-1.0']) do
|
192
|
+
if contact.key?(:id)
|
193
|
+
xml.id(contact[:id])
|
194
|
+
else
|
195
|
+
xml.id('invalid')
|
196
|
+
end
|
197
|
+
contact[:postalInfo].each do |type, infos|
|
198
|
+
xml.postalInfo :type => type do
|
199
|
+
xml.name(infos[:name])
|
200
|
+
xml.org(infos[:org]) if infos.key?(:org)
|
201
|
+
xml.addr do
|
202
|
+
infos[:addr][:street].each do |street|
|
203
|
+
xml.street(street)
|
204
|
+
end
|
205
|
+
xml.city(infos[:addr][:city])
|
206
|
+
[:sp, :pc].each do |val|
|
207
|
+
xml.__send__(val, infos[:addr][val]) if infos[:addr].key?(val)
|
208
|
+
end
|
209
|
+
xml.cc(infos[:addr][:cc])
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
[:voice, :fax].each do |val|
|
214
|
+
xml.__send__(val, contact[val]) if contact.key?(val)
|
215
|
+
end
|
216
|
+
xml.email(contact[:email])
|
217
|
+
xml.authInfo do
|
218
|
+
xml.pw(contact[:authInfo])
|
219
|
+
end
|
220
|
+
if contact.key?(:disclose)
|
221
|
+
xml.disclose do
|
222
|
+
contact[:disclose].each do |disc|
|
223
|
+
if disc.key?(:type)
|
224
|
+
xml.__send__(disc[:name], :type => disc[:type])
|
225
|
+
else
|
226
|
+
xml.__send__(disc[:name])
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
233
|
end
|
234
234
|
end
|
235
235
|
|
@@ -264,9 +264,8 @@ module EPPClient
|
|
264
264
|
# [<tt>:disclose</tt>]
|
265
265
|
# an optional array that identifies elements that require exceptional
|
266
266
|
# server-operator handling to allow or restrict disclosure to third
|
267
|
-
# parties. See
|
268
|
-
#
|
269
|
-
# for details.
|
267
|
+
# parties. See {section 2.9 of RFC
|
268
|
+
# 5733}[http://tools.ietf.org/html/rfc5733#section-2.9] for details.
|
270
269
|
#
|
271
270
|
# Returns a hash with the following keys :
|
272
271
|
#
|
@@ -281,18 +280,18 @@ module EPPClient
|
|
281
280
|
def contact_create_process(xml) #:nodoc:
|
282
281
|
contact = xml.xpath('epp:resData/contact:creData', EPPClient::SCHEMAS_URL)
|
283
282
|
{
|
284
|
-
|
285
|
-
|
283
|
+
:id => contact.xpath('contact:id', EPPClient::SCHEMAS_URL).text,
|
284
|
+
:crDate => DateTime.parse(contact.xpath('contact:crDate', EPPClient::SCHEMAS_URL).text),
|
286
285
|
}
|
287
286
|
end
|
288
287
|
|
289
288
|
def contact_delete_xml(contact) #:nodoc:
|
290
289
|
command do |xml|
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
290
|
+
xml.delete do
|
291
|
+
xml.delete('xmlns' => EPPClient::SCHEMAS_URL['contact-1.0']) do
|
292
|
+
xml.id(contact)
|
293
|
+
end
|
294
|
+
end
|
296
295
|
end
|
297
296
|
end
|
298
297
|
|
@@ -309,67 +308,67 @@ module EPPClient
|
|
309
308
|
|
310
309
|
def contact_update_xml(args) #:nodoc:
|
311
310
|
command do |xml|
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
311
|
+
xml.update do
|
312
|
+
xml.update('xmlns' => EPPClient::SCHEMAS_URL['contact-1.0']) do
|
313
|
+
xml.id args[:id]
|
314
|
+
if args.key?(:add) && args[:add].key?(:status)
|
315
|
+
xml.add do
|
316
|
+
args[:add][:status].each do |s|
|
317
|
+
xml.status :s => s
|
318
|
+
end
|
319
|
+
end
|
320
|
+
end
|
321
|
+
if args.key?(:rem) && args[:rem].key?(:status)
|
322
|
+
xml.rem do
|
323
|
+
args[:rem][:status].each do |s|
|
324
|
+
xml.status :s => s
|
325
|
+
end
|
326
|
+
end
|
327
|
+
end
|
328
|
+
if args.key?(:chg)
|
329
|
+
contact = args[:chg]
|
330
|
+
xml.chg do
|
331
|
+
if contact.key?(:postalInfo)
|
332
|
+
contact[:postalInfo].each do |type, infos|
|
333
|
+
xml.postalInfo :type => type do
|
334
|
+
xml.name(infos[:name])
|
335
|
+
xml.org(infos[:org]) if infos.key?(:org)
|
336
|
+
xml.addr do
|
337
|
+
infos[:addr][:street].each do |street|
|
338
|
+
xml.street(street)
|
339
|
+
end
|
340
|
+
xml.city(infos[:addr][:city])
|
341
|
+
[:sp, :pc].each do |val|
|
342
|
+
xml.__send__(val, infos[:addr][val]) if infos[:addr].key?(val)
|
343
|
+
end
|
344
|
+
xml.cc(infos[:addr][:cc])
|
345
|
+
end
|
346
|
+
end
|
347
|
+
end
|
348
|
+
end
|
349
|
+
[:voice, :fax, :email].each do |val|
|
350
|
+
xml.__send__(val, contact[val]) if contact.key?(val)
|
351
|
+
end
|
352
|
+
if contact.key?(:authInfo)
|
353
|
+
xml.authInfo do
|
354
|
+
xml.pw(contact[:authInfo])
|
355
|
+
end
|
356
|
+
end
|
357
|
+
if contact.key?(:disclose)
|
358
|
+
xml.disclose do
|
359
|
+
contact[:disclose].each do |disc|
|
360
|
+
if disc.key?(:type)
|
361
|
+
xml.__send__(disc[:name], :type => disc[:type])
|
362
|
+
else
|
363
|
+
xml.__send__(disc[:name])
|
364
|
+
end
|
365
|
+
end
|
366
|
+
end
|
367
|
+
end
|
368
|
+
end
|
369
|
+
end
|
370
|
+
end
|
371
|
+
end
|
373
372
|
end
|
374
373
|
end
|
375
374
|
|