epp-eis 0.1.1
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.
- data/.gitignore +4 -0
- data/Gemfile +5 -0
- data/Guardfile +5 -0
- data/README.markdown +57 -0
- data/Rakefile +1 -0
- data/epp-eis.gemspec +25 -0
- data/lib/epp-eis/contact.rb +271 -0
- data/lib/epp-eis/domain.rb +410 -0
- data/lib/epp-eis/extensions.rb +22 -0
- data/lib/epp-eis/nsset.rb +246 -0
- data/lib/epp-eis/session.rb +94 -0
- data/lib/epp-eis/version.rb +5 -0
- data/lib/epp-eis.rb +8 -0
- data/spec/legaldocs/test.pdf +0 -0
- data/spec/lib/epp-eis/contact_spec.rb +107 -0
- data/spec/lib/epp-eis/domain_spec.rb +189 -0
- data/spec/lib/epp-eis/nsset_spec.rb +87 -0
- data/spec/lib/epp-eis/session_spec.rb +18 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/support/file_mocks.rb +7 -0
- data/spec/xml/requests/contact/check_contact.xml +11 -0
- data/spec/xml/requests/contact/create_contact.xml +23 -0
- data/spec/xml/requests/contact/delete_contact.xml +11 -0
- data/spec/xml/requests/contact/info_contact.xml +11 -0
- data/spec/xml/requests/contact/update_contact.xml +29 -0
- data/spec/xml/requests/domain/create_domain.xml +21 -0
- data/spec/xml/requests/domain/delete_domain.xml +16 -0
- data/spec/xml/requests/domain/get_results.xml +9 -0
- data/spec/xml/requests/domain/list_domains.xml +9 -0
- data/spec/xml/requests/domain/transfer_domain.xml +17 -0
- data/spec/xml/requests/domain/update_domain.xml +28 -0
- data/spec/xml/requests/nsset/check_nsset.xml +12 -0
- data/spec/xml/requests/nsset/create_nsset.xml +20 -0
- data/spec/xml/requests/nsset/delete_nsset.xml +11 -0
- data/spec/xml/requests/nsset/info_nsset.xml +11 -0
- data/spec/xml/requests/nsset/update_nsset.xml +22 -0
- data/spec/xml/requests/session/hello.xml +4 -0
- data/spec/xml/responses/contact/check_contact_1000.xml +23 -0
- data/spec/xml/responses/contact/create_contact_1000.xml +18 -0
- data/spec/xml/responses/contact/delete_contact_1000.xml +12 -0
- data/spec/xml/responses/contact/get_results_list_contacts_1000.xml +24 -0
- data/spec/xml/responses/contact/info_contact_1000.xml +35 -0
- data/spec/xml/responses/contact/update_contact_1000.xml +12 -0
- data/spec/xml/responses/domain/check_domain_1000.xml +23 -0
- data/spec/xml/responses/domain/check_domain_available_1000.xml +19 -0
- data/spec/xml/responses/domain/check_domain_taken_1000.xml +20 -0
- data/spec/xml/responses/domain/create_domain_1000.xml +19 -0
- data/spec/xml/responses/domain/delete_domain_1000.xml +12 -0
- data/spec/xml/responses/domain/get_results_list_domains_1000.xml +18 -0
- data/spec/xml/responses/domain/info_domain_1000.xml +27 -0
- data/spec/xml/responses/domain/list_domains_1000.xml +17 -0
- data/spec/xml/responses/domain/renew_domain_1000.xml +18 -0
- data/spec/xml/responses/domain/transfer_domain_1000.xml +12 -0
- data/spec/xml/responses/domain/update_domain_1000.xml +12 -0
- data/spec/xml/responses/nsset/check_nsset_1000.xml +22 -0
- data/spec/xml/responses/nsset/create_nsset_1000.xml +18 -0
- data/spec/xml/responses/nsset/delete_nsset_1000.xml +12 -0
- data/spec/xml/responses/nsset/info_nsset_1000.xml +33 -0
- data/spec/xml/responses/nsset/update_nsset_1000.xml +12 -0
- data/spec/xml/responses/session/hello.xml +36 -0
- metadata +214 -0
@@ -0,0 +1,410 @@
|
|
1
|
+
module Epp
|
2
|
+
module Eis
|
3
|
+
|
4
|
+
XML_NS_DOMAIN = 'http://www.nic.cz/xml/epp/domain-1.4'
|
5
|
+
|
6
|
+
XML_SCHEMALOC = 'http://www.nic.cz/xml/epp/domain-1.4.xsd domain-1.4.xsd'
|
7
|
+
|
8
|
+
class DomainCreateResponse
|
9
|
+
def initialize(response)
|
10
|
+
@response = Nokogiri::XML(response)
|
11
|
+
end
|
12
|
+
|
13
|
+
def code
|
14
|
+
@response.css('epp response result').first['code'].to_i
|
15
|
+
end
|
16
|
+
|
17
|
+
def message
|
18
|
+
@response.css('epp response result msg').text
|
19
|
+
end
|
20
|
+
|
21
|
+
def domain_name
|
22
|
+
@response.css('domain|creData domain|name', 'domain' => XML_NS_DOMAIN).text
|
23
|
+
end
|
24
|
+
|
25
|
+
def domain_create_date
|
26
|
+
@response.css('domain|creData domain|crDate', 'domain' => XML_NS_DOMAIN).text
|
27
|
+
end
|
28
|
+
|
29
|
+
def domain_expire_date
|
30
|
+
@response.css('domain|creData domain|exDate', 'domain' => XML_NS_DOMAIN).text
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class DomainDeleteResponse
|
35
|
+
def initialize(response)
|
36
|
+
@response = Nokogiri::XML(response)
|
37
|
+
end
|
38
|
+
|
39
|
+
def code
|
40
|
+
@response.css('epp response result').first['code'].to_i
|
41
|
+
end
|
42
|
+
|
43
|
+
def message
|
44
|
+
@response.css('epp response result msg').text
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class DomainTransferResponse
|
49
|
+
def initialize(response)
|
50
|
+
@response = Nokogiri::XML(response)
|
51
|
+
end
|
52
|
+
|
53
|
+
def code
|
54
|
+
@response.css('epp response result').first['code'].to_i
|
55
|
+
end
|
56
|
+
|
57
|
+
def message
|
58
|
+
@response.css('epp response result msg').text
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
class DomainUpdateResponse
|
63
|
+
def initialize(response)
|
64
|
+
@response = Nokogiri::XML(response)
|
65
|
+
end
|
66
|
+
|
67
|
+
def code
|
68
|
+
@response.css('epp response result').first['code'].to_i
|
69
|
+
end
|
70
|
+
|
71
|
+
def message
|
72
|
+
@response.css('epp response result msg').text
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class DomainInfoResponse
|
77
|
+
def initialize(response)
|
78
|
+
@response = Nokogiri::XML(response)
|
79
|
+
end
|
80
|
+
|
81
|
+
def code
|
82
|
+
@response.css('epp response result').first['code'].to_i
|
83
|
+
end
|
84
|
+
|
85
|
+
def message
|
86
|
+
@response.css('epp response result msg').text
|
87
|
+
end
|
88
|
+
|
89
|
+
def domain_name
|
90
|
+
@response.css('domain|infData domain|name', 'domain' => XML_NS_DOMAIN).text
|
91
|
+
end
|
92
|
+
|
93
|
+
def domain_roid
|
94
|
+
@response.css('domain|infData domain|roid', 'domain' => XML_NS_DOMAIN).text
|
95
|
+
end
|
96
|
+
|
97
|
+
def domain_status
|
98
|
+
@response.css('domain|infData domain|status', 'domain' => XML_NS_DOMAIN).text
|
99
|
+
end
|
100
|
+
|
101
|
+
def domain_registrant
|
102
|
+
@response.css('domain|infData domain|registrant', 'domain' => XML_NS_DOMAIN).text
|
103
|
+
end
|
104
|
+
|
105
|
+
def domain_admin
|
106
|
+
@response.css('domain|infData domain|admin', 'domain' => XML_NS_DOMAIN).text
|
107
|
+
end
|
108
|
+
|
109
|
+
def domain_nsset
|
110
|
+
@response.css('domain|infData domain|nsset', 'domain' => XML_NS_DOMAIN).text
|
111
|
+
end
|
112
|
+
|
113
|
+
def domain_clid
|
114
|
+
@response.css('domain|infData domain|clID', 'domain' => XML_NS_DOMAIN).text
|
115
|
+
end
|
116
|
+
|
117
|
+
def domain_crid
|
118
|
+
@response.css('domain|infData domain|crID', 'domain' => XML_NS_DOMAIN).text
|
119
|
+
end
|
120
|
+
|
121
|
+
def domain_create_date
|
122
|
+
@response.css('domain|infData domain|crDate', 'domain' => XML_NS_DOMAIN).text
|
123
|
+
end
|
124
|
+
|
125
|
+
def domain_expire_date
|
126
|
+
@response.css('domain|infData domain|exDate', 'domain' => XML_NS_DOMAIN).text
|
127
|
+
end
|
128
|
+
|
129
|
+
def domain_authinfo
|
130
|
+
@response.css('domain|infData domain|authInfo', 'domain' => XML_NS_DOMAIN).text
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
class DomainRenewResponse
|
135
|
+
def initialize(response)
|
136
|
+
@response = Nokogiri::XML(response)
|
137
|
+
end
|
138
|
+
|
139
|
+
def code
|
140
|
+
@response.css('epp response result').first['code'].to_i
|
141
|
+
end
|
142
|
+
|
143
|
+
def message
|
144
|
+
@response.css('epp response result msg').text
|
145
|
+
end
|
146
|
+
|
147
|
+
def domain_name
|
148
|
+
@response.css('domain|renData domain|name', 'domain' => XML_NS_DOMAIN).text
|
149
|
+
end
|
150
|
+
|
151
|
+
def domain_expire_date
|
152
|
+
@response.css('domain|renData domain|exDate', 'domain' => XML_NS_DOMAIN).text
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
class DomainCheck
|
157
|
+
attr_accessor :name, :available, :reason
|
158
|
+
|
159
|
+
def initialize(name, available, reason)
|
160
|
+
@name = name
|
161
|
+
@available = available
|
162
|
+
@reason = reason
|
163
|
+
end
|
164
|
+
|
165
|
+
def available?
|
166
|
+
@available
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
class DomainCheckResponse
|
171
|
+
|
172
|
+
def initialize(response)
|
173
|
+
@response = Nokogiri::XML(response)
|
174
|
+
end
|
175
|
+
|
176
|
+
def code
|
177
|
+
@response.css('epp response result').first['code'].to_i
|
178
|
+
end
|
179
|
+
|
180
|
+
def message
|
181
|
+
@response.css('epp response result msg').text
|
182
|
+
end
|
183
|
+
|
184
|
+
def items
|
185
|
+
@response.css('domain|chkData domain|cd', 'domain' => XML_NS_DOMAIN).collect do |domain|
|
186
|
+
DomainCheck.new(
|
187
|
+
domain.css('domain|name', 'domain' => XML_NS_DOMAIN).text,
|
188
|
+
domain.css('domain|name', 'domain' => XML_NS_DOMAIN).first['avail'].to_i == 1,
|
189
|
+
domain.css('domain|reason', 'domain' => XML_NS_DOMAIN).text
|
190
|
+
)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
module DomainCommands
|
196
|
+
|
197
|
+
# Create a new domain.
|
198
|
+
#
|
199
|
+
# Domain names with IDN characters õ, ä. ö. ü, š, ž will be allowed. If a domain name contains at least one of
|
200
|
+
# these characters then it must be translated to PUNYCODE before domain create.
|
201
|
+
#
|
202
|
+
# domain - Domain name to be registered
|
203
|
+
# nsset - Nameserver id
|
204
|
+
# registrant - Registrant contact id
|
205
|
+
# admin - Admin contact id, or array of id-s
|
206
|
+
# legal_document - Legal document binary data
|
207
|
+
# legal_doc_type - Legal document type (pdf, ddoc)
|
208
|
+
#
|
209
|
+
# Returns DomainCreateResponse object
|
210
|
+
def create_domain(domain, nsset, registrant, admins, legal_document, legal_doc_type)
|
211
|
+
builder = build_epp_request do |xml|
|
212
|
+
xml.command {
|
213
|
+
xml.create {
|
214
|
+
xml.create('xmlns:domain' => XML_NS_DOMAIN, 'xsi:schemaLocation' => XML_SCHEMALOC) {
|
215
|
+
xml.parent.namespace = xml.parent.namespace_definitions.first
|
216
|
+
xml.name domain
|
217
|
+
xml.period '1', 'unit' => 'y'
|
218
|
+
xml.nsset nsset
|
219
|
+
xml.registrant registrant
|
220
|
+
[admins].flatten.each { |admin| xml.admin admin }
|
221
|
+
}
|
222
|
+
}
|
223
|
+
add_legal_document(xml, legal_document, legal_doc_type)
|
224
|
+
xml.clTRID UUIDTools::UUID.timestamp_create.to_s
|
225
|
+
}
|
226
|
+
end
|
227
|
+
|
228
|
+
DomainCreateResponse.new(send_request(builder.to_xml))
|
229
|
+
end
|
230
|
+
|
231
|
+
# Delete domain.
|
232
|
+
#
|
233
|
+
# domain - Domain name to be registered
|
234
|
+
# legal_document - Legal document binary data
|
235
|
+
# legal_doc_type - Legal document type (pdf, ddoc)
|
236
|
+
#
|
237
|
+
# Returns DomainDeleteResponse object
|
238
|
+
def delete_domain(domain, legal_document, legal_doc_type)
|
239
|
+
builder = build_epp_request do |xml|
|
240
|
+
xml.command {
|
241
|
+
xml.delete {
|
242
|
+
xml.delete('xmlns:domain' => XML_NS_DOMAIN, 'xsi:schemaLocation' => XML_SCHEMALOC) {
|
243
|
+
xml.parent.namespace = xml.parent.namespace_definitions.first
|
244
|
+
xml.name domain
|
245
|
+
}
|
246
|
+
}
|
247
|
+
add_legal_document(xml, legal_document, legal_doc_type)
|
248
|
+
xml.clTRID UUIDTools::UUID.timestamp_create.to_s
|
249
|
+
}
|
250
|
+
end
|
251
|
+
|
252
|
+
DomainDeleteResponse.new(send_request(builder.to_xml))
|
253
|
+
end
|
254
|
+
|
255
|
+
# Will return detailed information about the domain. The information will include domain password field. The field
|
256
|
+
# will be populated with a real value if the domain owner executed the function. Non-owner will see empty domain
|
257
|
+
# password field value.
|
258
|
+
#
|
259
|
+
# domain - Domain name to be queried
|
260
|
+
#
|
261
|
+
# Returns DomainInfoResponse object
|
262
|
+
def info_domain(domain)
|
263
|
+
builder = build_epp_request do |xml|
|
264
|
+
xml.command {
|
265
|
+
xml.info {
|
266
|
+
xml.info('xmlns:domain' => XML_NS_DOMAIN, 'xsi:schemaLocation' => XML_SCHEMALOC) {
|
267
|
+
xml.parent.namespace = xml.parent.namespace_definitions.first
|
268
|
+
xml.name domain
|
269
|
+
}
|
270
|
+
}
|
271
|
+
xml.clTRID UUIDTools::UUID.timestamp_create.to_s
|
272
|
+
}
|
273
|
+
end
|
274
|
+
|
275
|
+
DomainInfoResponse.new(send_request(builder.to_xml))
|
276
|
+
end
|
277
|
+
|
278
|
+
# Updates domain expiration period for another year.
|
279
|
+
#
|
280
|
+
# domain - Domain to be renewed
|
281
|
+
# current_expire_date - Current expiration date of the domain in YYYY-MM-DD format
|
282
|
+
#
|
283
|
+
# Returns DomainRenewResponse object with server response information
|
284
|
+
def renew_domain(domain, current_expire_date)
|
285
|
+
builder = build_epp_request do |xml|
|
286
|
+
xml.command {
|
287
|
+
xml.renew {
|
288
|
+
xml.renew('xmlns:domain' => XML_NS_DOMAIN, 'xsi:schemaLocation' => XML_SCHEMALOC) {
|
289
|
+
xml.parent.namespace = xml.parent.namespace_definitions.first
|
290
|
+
xml.name domain
|
291
|
+
xml.curExpDate current_expire_date
|
292
|
+
xml.period '1', 'unit' => 'y'
|
293
|
+
}
|
294
|
+
}
|
295
|
+
xml.clTRID UUIDTools::UUID.timestamp_create.to_s
|
296
|
+
}
|
297
|
+
end
|
298
|
+
|
299
|
+
DomainRenewResponse.new(send_request(builder.to_xml))
|
300
|
+
end
|
301
|
+
|
302
|
+
# Used to transfer domain ownership from one registrar to another.
|
303
|
+
#
|
304
|
+
# domain - Name of the domain to be transferred
|
305
|
+
# auth_info - Domain authorization code
|
306
|
+
#
|
307
|
+
# Returns DomainTransferResponse object
|
308
|
+
def transfer_domain(domain, auth_info, legal_document, legal_doc_type)
|
309
|
+
builder = build_epp_request do |xml|
|
310
|
+
xml.command {
|
311
|
+
xml.transfer('op' => 'request') {
|
312
|
+
xml.transfer('xmlns:domain' => XML_NS_DOMAIN, 'xsi:schemaLocation' => XML_SCHEMALOC) {
|
313
|
+
xml.parent.namespace = xml.parent.namespace_definitions.first
|
314
|
+
xml.name domain
|
315
|
+
xml.authInfo auth_info
|
316
|
+
}
|
317
|
+
}
|
318
|
+
add_legal_document(xml, legal_document, legal_doc_type)
|
319
|
+
xml.clTRID UUIDTools::UUID.timestamp_create.to_s
|
320
|
+
}
|
321
|
+
end
|
322
|
+
|
323
|
+
DomainTransferResponse.new(send_request(builder.to_xml))
|
324
|
+
end
|
325
|
+
|
326
|
+
# Used to update domain information.
|
327
|
+
#
|
328
|
+
# domain - Domain name to be updated
|
329
|
+
# add_admins - Array of admin contact ids to be added. Set to nil or empty array if no changes needed
|
330
|
+
# rem_admins - Array of admin contact ids to be removed. Set to nil or empty array if no changes needed
|
331
|
+
# nsset - Domain nsset id to be changed. Set to nil if no changes needed
|
332
|
+
# registrant - Domain registrant contact id to be changed. Set to nil if no changes needed
|
333
|
+
# auth_info - Domain authorization code to be changed. Set to nil if no changes needed
|
334
|
+
# legal_document - Legal document binary data
|
335
|
+
# legal_doc_type - Legal document type (pdf, ddoc)
|
336
|
+
#
|
337
|
+
# Returns DomainUpdateResponse object
|
338
|
+
def update_domain(domain, add_admins, rem_admins, nsset, registrant, auth_info, legal_document, legal_doc_type)
|
339
|
+
builder = build_epp_request do |xml|
|
340
|
+
xml.command {
|
341
|
+
xml.update {
|
342
|
+
xml.update('xmlns:domain' => XML_NS_DOMAIN, 'xsi:schemaLocation' => XML_SCHEMALOC) {
|
343
|
+
xml.parent.namespace = xml.parent.namespace_definitions.first
|
344
|
+
xml.name domain
|
345
|
+
if !add_admins.nil? && !add_admins.empty?
|
346
|
+
xml.add {
|
347
|
+
add_admins.each { |add_admin| xml.admin add_admin }
|
348
|
+
}
|
349
|
+
end
|
350
|
+
if !rem_admins.nil? && !rem_admins.empty?
|
351
|
+
xml.rem {
|
352
|
+
rem_admins.each { |rem_admin| xml.admin rem_admin }
|
353
|
+
}
|
354
|
+
end
|
355
|
+
if [nsset, registrant, auth_info].any?{ |item| !item.nil? }
|
356
|
+
xml.chg {
|
357
|
+
xml.nsset nsset if nsset
|
358
|
+
xml.registrant registrant if registrant
|
359
|
+
xml.auth_info auth_info if auth_info
|
360
|
+
}
|
361
|
+
end
|
362
|
+
}
|
363
|
+
}
|
364
|
+
add_legal_document(xml, legal_document, legal_doc_type)
|
365
|
+
xml.clTRID UUIDTools::UUID.timestamp_create.to_s
|
366
|
+
}
|
367
|
+
end
|
368
|
+
|
369
|
+
DomainUpdateResponse.new(send_request(builder.to_xml))
|
370
|
+
end
|
371
|
+
|
372
|
+
def list_domains
|
373
|
+
list_command('listDomains')
|
374
|
+
end
|
375
|
+
|
376
|
+
# Check availability for a domain or a list of domains.
|
377
|
+
#
|
378
|
+
# Returns DomainCheckResponse object with server response information
|
379
|
+
def check_domain(*domains)
|
380
|
+
builder = build_epp_request do |xml|
|
381
|
+
xml.command {
|
382
|
+
xml.check {
|
383
|
+
xml.check('xmlns:domain' => XML_NS_DOMAIN, 'xsi:schemaLocation' => XML_SCHEMALOC) {
|
384
|
+
xml.parent.namespace = xml.parent.namespace_definitions.first
|
385
|
+
domains.each do |domain|
|
386
|
+
xml.name domain
|
387
|
+
end
|
388
|
+
}
|
389
|
+
}
|
390
|
+
xml.clTRID UUIDTools::UUID.timestamp_create.to_s
|
391
|
+
}
|
392
|
+
end
|
393
|
+
|
394
|
+
DomainCheckResponse.new(send_request(builder.to_xml))
|
395
|
+
end
|
396
|
+
|
397
|
+
# Shortcut function to check whether domain is available.
|
398
|
+
#
|
399
|
+
# domain - Domain name to be checked
|
400
|
+
#
|
401
|
+
# Returns true if domain is available and false if it is not.
|
402
|
+
def is_domain_available?(domain)
|
403
|
+
results = check_domain(domain).items
|
404
|
+
results.nil? ? false : results.first.available?
|
405
|
+
end
|
406
|
+
end
|
407
|
+
end
|
408
|
+
end
|
409
|
+
|
410
|
+
Epp::Server.send(:include, Epp::Eis::DomainCommands)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'base64'
|
2
|
+
|
3
|
+
# EIS specific EPP extensions
|
4
|
+
module Epp
|
5
|
+
module Eis
|
6
|
+
module EisExtensions
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def append_legal_document(xml, legal_document, legal_doc_type)
|
11
|
+
xml.extension {
|
12
|
+
xml.extdata('xmlns:eis' => 'urn:ee:eis:xml:epp:eis-1.0', 'xsi:schemaLocation' => 'urn:ee:eis:xml:epp:eis-1.0 eis-1.0.xsd') {
|
13
|
+
xml.parent.namespace = xml.parent.namespace_definitions.first
|
14
|
+
xml.legalDocument Base64.encode64(legal_document), 'type' => legal_doc_type
|
15
|
+
}
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
Epp::Server.send(:include, Epp::Eis::EisExtensions)
|
@@ -0,0 +1,246 @@
|
|
1
|
+
module Epp
|
2
|
+
module Eis
|
3
|
+
|
4
|
+
XML_NS_NSSET = 'http://www.nic.cz/xml/epp/nsset-1.2'
|
5
|
+
|
6
|
+
XML_SCHEMALOC = 'http://www.nic.cz/xml/epp/nsset-1.2 nsset-1.2.xsd'
|
7
|
+
|
8
|
+
class NssetCheck
|
9
|
+
attr_accessor :name, :available
|
10
|
+
|
11
|
+
def initialize(name, available)
|
12
|
+
@name = name
|
13
|
+
@available = available
|
14
|
+
end
|
15
|
+
|
16
|
+
def available?
|
17
|
+
@available
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class NssetCheckResponse
|
22
|
+
|
23
|
+
def initialize(response)
|
24
|
+
@response = Nokogiri::XML(response)
|
25
|
+
end
|
26
|
+
|
27
|
+
def code
|
28
|
+
@response.css('epp response result').first['code'].to_i
|
29
|
+
end
|
30
|
+
|
31
|
+
def message
|
32
|
+
@response.css('epp response result msg').text
|
33
|
+
end
|
34
|
+
|
35
|
+
def items
|
36
|
+
@response.css('nsset|chkData nsset|cd', 'nsset' => XML_NS_NSSET).collect do |nsset|
|
37
|
+
NssetCheck.new(
|
38
|
+
nsset.css('nsset|id', 'nsset' => XML_NS_NSSET).text,
|
39
|
+
nsset.css('nsset|id', 'nsset' => XML_NS_NSSET).first['avail'].to_i == 1
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class NssetCreateResponse
|
46
|
+
def initialize(response)
|
47
|
+
@response = Nokogiri::XML(response)
|
48
|
+
end
|
49
|
+
|
50
|
+
def code
|
51
|
+
@response.css('epp response result').first['code'].to_i
|
52
|
+
end
|
53
|
+
|
54
|
+
def message
|
55
|
+
@response.css('epp response result msg').text
|
56
|
+
end
|
57
|
+
|
58
|
+
def nsset_id
|
59
|
+
@response.css('nsset|creData nsset|id', 'nsset' => XML_NS_NSSET).text
|
60
|
+
end
|
61
|
+
|
62
|
+
def nsset_create_date
|
63
|
+
@response.css('nsset|creData nsset|crDate', 'nsset' => XML_NS_NSSET).text
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
class NssetDeleteResponse
|
68
|
+
def initialize(response)
|
69
|
+
@response = Nokogiri::XML(response)
|
70
|
+
end
|
71
|
+
|
72
|
+
def code
|
73
|
+
@response.css('epp response result').first['code'].to_i
|
74
|
+
end
|
75
|
+
|
76
|
+
def message
|
77
|
+
@response.css('epp response result msg').text
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
class NssetInfoResponse
|
82
|
+
def initialize(response)
|
83
|
+
@response = Nokogiri::XML(response)
|
84
|
+
end
|
85
|
+
|
86
|
+
def code
|
87
|
+
@response.css('epp response result').first['code'].to_i
|
88
|
+
end
|
89
|
+
|
90
|
+
def message
|
91
|
+
@response.css('epp response result msg').text
|
92
|
+
end
|
93
|
+
|
94
|
+
def nsset_id
|
95
|
+
@response.css('nsset|infData nsset|id', 'nsset' => XML_NS_NSSET).text
|
96
|
+
end
|
97
|
+
|
98
|
+
def nsset_roid
|
99
|
+
@response.css('nsset|infData nsset|roid', 'nsset' => XML_NS_NSSET).text
|
100
|
+
end
|
101
|
+
|
102
|
+
def nsset_status
|
103
|
+
@response.css('nsset|infData nsset|status', 'nsset' => XML_NS_NSSET).first['s']
|
104
|
+
end
|
105
|
+
|
106
|
+
def nameservers
|
107
|
+
@response.css('nsset|infData nsset|ns', 'nsset' => XML_NS_NSSET).inject(Array.new) do |memo, nsset|
|
108
|
+
memo << [nsset.css('nsset|name', 'nsset' => XML_NS_NSSET).text, nsset.css('nsset|addr', 'nsset' => XML_NS_NSSET).text]
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
class NssetUpdateResponse
|
114
|
+
def initialize(response)
|
115
|
+
@response = Nokogiri::XML(response)
|
116
|
+
end
|
117
|
+
|
118
|
+
def code
|
119
|
+
@response.css('epp response result').first['code'].to_i
|
120
|
+
end
|
121
|
+
|
122
|
+
def message
|
123
|
+
@response.css('epp response result msg').text
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
module NssetCommands
|
128
|
+
|
129
|
+
# Check availability for a nsset identification.
|
130
|
+
def check_nsset(*nssets)
|
131
|
+
builder = build_epp_request do |xml|
|
132
|
+
xml.command {
|
133
|
+
xml.check {
|
134
|
+
xml.check('xmlns:nsset' => XML_NS_NSSET, 'xsi:schemaLocation' => XML_SCHEMALOC) {
|
135
|
+
xml.parent.namespace = xml.parent.namespace_definitions.first
|
136
|
+
nssets.each { |nsset| xml.id_ nsset }
|
137
|
+
}
|
138
|
+
}
|
139
|
+
xml.clTRID UUIDTools::UUID.timestamp_create.to_s
|
140
|
+
}
|
141
|
+
end
|
142
|
+
|
143
|
+
NssetCheckResponse.new(send_request(builder.to_xml))
|
144
|
+
end
|
145
|
+
|
146
|
+
# Create a new nameserver object
|
147
|
+
def create_nsset(nsset, nameservers, contact)
|
148
|
+
builder = build_epp_request do |xml|
|
149
|
+
xml.command {
|
150
|
+
xml.create {
|
151
|
+
xml.create('xmlns:nsset' => XML_NS_NSSET, 'xsi:schemaLocation' => XML_SCHEMALOC) {
|
152
|
+
xml.parent.namespace = xml.parent.namespace_definitions.first
|
153
|
+
xml.id_ nsset
|
154
|
+
nameservers.each do |nameserver|
|
155
|
+
xml.ns {
|
156
|
+
xml.name nameserver[0]
|
157
|
+
xml.addr nameserver[1]
|
158
|
+
}
|
159
|
+
end
|
160
|
+
xml.tech contact
|
161
|
+
}
|
162
|
+
}
|
163
|
+
xml.clTRID UUIDTools::UUID.timestamp_create.to_s
|
164
|
+
}
|
165
|
+
end
|
166
|
+
|
167
|
+
NssetCreateResponse.new(send_request(builder.to_xml))
|
168
|
+
end
|
169
|
+
|
170
|
+
# Delete nameserver object. Can only be deleted if object does not have relations to other objects.
|
171
|
+
def delete_nsset(nsset)
|
172
|
+
builder = build_epp_request do |xml|
|
173
|
+
xml.command {
|
174
|
+
xml.delete {
|
175
|
+
xml.delete('xmlns:nsset' => XML_NS_NSSET, 'xsi:schemaLocation' => XML_SCHEMALOC) {
|
176
|
+
xml.parent.namespace = xml.parent.namespace_definitions.first
|
177
|
+
xml.id_ nsset
|
178
|
+
}
|
179
|
+
}
|
180
|
+
xml.clTRID UUIDTools::UUID.timestamp_create.to_s
|
181
|
+
}
|
182
|
+
end
|
183
|
+
|
184
|
+
NssetDeleteResponse.new(send_request(builder.to_xml))
|
185
|
+
end
|
186
|
+
|
187
|
+
# Returns intormation about existing nameserver object.
|
188
|
+
def info_nsset(nsset)
|
189
|
+
builder = build_epp_request do |xml|
|
190
|
+
xml.command {
|
191
|
+
xml.info {
|
192
|
+
xml.info('xmlns:nsset' => XML_NS_NSSET, 'xsi:schemaLocation' => XML_SCHEMALOC) {
|
193
|
+
xml.parent.namespace = xml.parent.namespace_definitions.first
|
194
|
+
xml.id_ nsset
|
195
|
+
}
|
196
|
+
}
|
197
|
+
xml.clTRID UUIDTools::UUID.timestamp_create.to_s
|
198
|
+
}
|
199
|
+
end
|
200
|
+
|
201
|
+
NssetInfoResponse.new(send_request(builder.to_xml))
|
202
|
+
end
|
203
|
+
|
204
|
+
def list_nssets
|
205
|
+
list_command('listNssets')
|
206
|
+
end
|
207
|
+
|
208
|
+
# Updates nameserver object. Update has been divided into three sections. Depending on the section that is used,
|
209
|
+
# update can add, remove and/or change data all at once.
|
210
|
+
def update_nsset(nsset, add_nameservers, add_contact, rem_nameserver, rem_contact)
|
211
|
+
builder = build_epp_request do |xml|
|
212
|
+
xml.command {
|
213
|
+
xml.update {
|
214
|
+
xml.update('xmlns:nsset' => XML_NS_NSSET, 'xsi:schemaLocation' => XML_SCHEMALOC) {
|
215
|
+
xml.parent.namespace = xml.parent.namespace_definitions.first
|
216
|
+
xml.id_ nsset
|
217
|
+
if add_nameservers or add_contact
|
218
|
+
xml.add {
|
219
|
+
add_nameservers.each do |nameserver|
|
220
|
+
xml.ns {
|
221
|
+
xml.name nameserver[0]
|
222
|
+
xml.addr nameserver[1]
|
223
|
+
}
|
224
|
+
end if add_nameservers
|
225
|
+
xml.tech add_contact if add_contact
|
226
|
+
}
|
227
|
+
end
|
228
|
+
if rem_nameserver or rem_contact
|
229
|
+
xml.rem {
|
230
|
+
xml.name rem_nameserver
|
231
|
+
xml.tech rem_contact
|
232
|
+
}
|
233
|
+
end
|
234
|
+
}
|
235
|
+
}
|
236
|
+
xml.clTRID UUIDTools::UUID.timestamp_create.to_s
|
237
|
+
}
|
238
|
+
end
|
239
|
+
|
240
|
+
NssetUpdateResponse.new(send_request(builder.to_xml))
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
Epp::Server.send(:include, Epp::Eis::NssetCommands)
|