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.
Files changed (61) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +5 -0
  3. data/Guardfile +5 -0
  4. data/README.markdown +57 -0
  5. data/Rakefile +1 -0
  6. data/epp-eis.gemspec +25 -0
  7. data/lib/epp-eis/contact.rb +271 -0
  8. data/lib/epp-eis/domain.rb +410 -0
  9. data/lib/epp-eis/extensions.rb +22 -0
  10. data/lib/epp-eis/nsset.rb +246 -0
  11. data/lib/epp-eis/session.rb +94 -0
  12. data/lib/epp-eis/version.rb +5 -0
  13. data/lib/epp-eis.rb +8 -0
  14. data/spec/legaldocs/test.pdf +0 -0
  15. data/spec/lib/epp-eis/contact_spec.rb +107 -0
  16. data/spec/lib/epp-eis/domain_spec.rb +189 -0
  17. data/spec/lib/epp-eis/nsset_spec.rb +87 -0
  18. data/spec/lib/epp-eis/session_spec.rb +18 -0
  19. data/spec/spec_helper.rb +10 -0
  20. data/spec/support/file_mocks.rb +7 -0
  21. data/spec/xml/requests/contact/check_contact.xml +11 -0
  22. data/spec/xml/requests/contact/create_contact.xml +23 -0
  23. data/spec/xml/requests/contact/delete_contact.xml +11 -0
  24. data/spec/xml/requests/contact/info_contact.xml +11 -0
  25. data/spec/xml/requests/contact/update_contact.xml +29 -0
  26. data/spec/xml/requests/domain/create_domain.xml +21 -0
  27. data/spec/xml/requests/domain/delete_domain.xml +16 -0
  28. data/spec/xml/requests/domain/get_results.xml +9 -0
  29. data/spec/xml/requests/domain/list_domains.xml +9 -0
  30. data/spec/xml/requests/domain/transfer_domain.xml +17 -0
  31. data/spec/xml/requests/domain/update_domain.xml +28 -0
  32. data/spec/xml/requests/nsset/check_nsset.xml +12 -0
  33. data/spec/xml/requests/nsset/create_nsset.xml +20 -0
  34. data/spec/xml/requests/nsset/delete_nsset.xml +11 -0
  35. data/spec/xml/requests/nsset/info_nsset.xml +11 -0
  36. data/spec/xml/requests/nsset/update_nsset.xml +22 -0
  37. data/spec/xml/requests/session/hello.xml +4 -0
  38. data/spec/xml/responses/contact/check_contact_1000.xml +23 -0
  39. data/spec/xml/responses/contact/create_contact_1000.xml +18 -0
  40. data/spec/xml/responses/contact/delete_contact_1000.xml +12 -0
  41. data/spec/xml/responses/contact/get_results_list_contacts_1000.xml +24 -0
  42. data/spec/xml/responses/contact/info_contact_1000.xml +35 -0
  43. data/spec/xml/responses/contact/update_contact_1000.xml +12 -0
  44. data/spec/xml/responses/domain/check_domain_1000.xml +23 -0
  45. data/spec/xml/responses/domain/check_domain_available_1000.xml +19 -0
  46. data/spec/xml/responses/domain/check_domain_taken_1000.xml +20 -0
  47. data/spec/xml/responses/domain/create_domain_1000.xml +19 -0
  48. data/spec/xml/responses/domain/delete_domain_1000.xml +12 -0
  49. data/spec/xml/responses/domain/get_results_list_domains_1000.xml +18 -0
  50. data/spec/xml/responses/domain/info_domain_1000.xml +27 -0
  51. data/spec/xml/responses/domain/list_domains_1000.xml +17 -0
  52. data/spec/xml/responses/domain/renew_domain_1000.xml +18 -0
  53. data/spec/xml/responses/domain/transfer_domain_1000.xml +12 -0
  54. data/spec/xml/responses/domain/update_domain_1000.xml +12 -0
  55. data/spec/xml/responses/nsset/check_nsset_1000.xml +22 -0
  56. data/spec/xml/responses/nsset/create_nsset_1000.xml +18 -0
  57. data/spec/xml/responses/nsset/delete_nsset_1000.xml +12 -0
  58. data/spec/xml/responses/nsset/info_nsset_1000.xml +33 -0
  59. data/spec/xml/responses/nsset/update_nsset_1000.xml +12 -0
  60. data/spec/xml/responses/session/hello.xml +36 -0
  61. metadata +214 -0
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'epp', :git => 'git://github.com/priithaamer/epp.git'
data/Guardfile ADDED
@@ -0,0 +1,5 @@
1
+ guard 'rspec', :version => 2, :cli => "--color", :bundler => true, :all_on_start => false, :all_after_pass => false, :keep_failed => true, :notification => false do
2
+ watch('spec/spec_helper.rb') { "spec" }
3
+ watch(%r{^spec/.+_spec\.rb})
4
+ watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
5
+ end
data/README.markdown ADDED
@@ -0,0 +1,57 @@
1
+ Ruby client for Estonian Internet Foundation registry EPP server.
2
+
3
+ Under the hood, this gem uses magnificient [EPP server client](https://github.com/ultraspeed/epp) gem by Josh Delsman and Delwyn de Villiers.
4
+
5
+ ## Installation
6
+
7
+ In Gemfile add it as a gem:
8
+
9
+ gem 'epp-eis'
10
+
11
+ ## Usage
12
+
13
+ require 'epp-eis'
14
+
15
+ server = Epp::Server.new(
16
+ :server => '127.0.0.1',
17
+ :tag => 'username',
18
+ :password => 'password',
19
+ :cert => OpenSSL::X509::Certificate.new(File.open('certificate.pem')),
20
+ :key => OpenSSL::PKey::RSA.new(File.open('priv_key.pem'))
21
+ )
22
+
23
+ server.is_domain_available?('fraktal.ee') #=> false
24
+
25
+ ## TODO
26
+
27
+ Need to implement the following commands
28
+
29
+ * credit_info
30
+
31
+ Commands that are nice to have, but not needed.
32
+
33
+ * check_keyset
34
+ * create_keyset
35
+ * delete_keyset
36
+ * get_results
37
+ * info_keyset
38
+ * list_keysets
39
+ * poll
40
+ * prep_contacts
41
+ * prep_domains
42
+ * prep_domains_by_contact
43
+ * prep_domains_by_keyset
44
+ * prep_domains_by_nsset
45
+ * prep_keysets
46
+ * prep_keysets_by_contact
47
+ * prep_nssets
48
+ * prep_nssets_by_contact
49
+ * prep_nssets_by_ns
50
+ * sendauthinfo_contact
51
+ * sendauthinfo_domain
52
+ * sendauthinfo_keyset
53
+ * sendauthinfo_nsset
54
+ * technical_test
55
+ * transfer_contact
56
+ * transfer_keyset
57
+ * update_keyset
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/epp-eis.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'epp-eis/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'epp-eis'
7
+ s.version = Eis::Epp::VERSION
8
+ s.authors = ['Priit Haamer']
9
+ s.email = ['priit@fraktal.ee']
10
+ s.homepage = 'https://github.com/priithaamer/epp-eis'
11
+ s.summary = %q{Estonian Internet Foundation EPP service client}
12
+ s.description = %q{Ruby client for Estonian Internet Foundation EPP service}
13
+
14
+ s.rubyforge_project = 'epp-eis'
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ['lib']
20
+
21
+ s.add_runtime_dependency 'nokogiri'
22
+
23
+ s.add_development_dependency 'rspec'
24
+ s.add_development_dependency 'guard'
25
+ end
@@ -0,0 +1,271 @@
1
+ module Epp
2
+ module Eis
3
+
4
+ XML_NS_CONTACT = 'http://www.nic.cz/xml/epp/contact-1.6'
5
+
6
+ XML_SCHEMALOC = 'http://www.nic.cz/xml/epp/contact-1.6 contact-1.6.xsd'
7
+
8
+ class ContactCheck
9
+ attr_accessor :name, :available, :reason
10
+
11
+ def initialize(name, available, reason)
12
+ @name = name
13
+ @available = available
14
+ @reason = reason
15
+ end
16
+
17
+ def available?
18
+ @available
19
+ end
20
+ end
21
+
22
+ class ContactCheckResponse
23
+
24
+ def initialize(response)
25
+ @response = Nokogiri::XML(response)
26
+ end
27
+
28
+ def code
29
+ @response.css('epp response result').first['code'].to_i
30
+ end
31
+
32
+ def message
33
+ @response.css('epp response result msg').text
34
+ end
35
+
36
+ def items
37
+ @response.css('contact|chkData contact|cd', 'contact' => XML_NS_CONTACT).collect do |contact|
38
+ ContactCheck.new(
39
+ contact.css('contact|id', 'contact' => XML_NS_CONTACT).text,
40
+ contact.css('contact|id', 'contact' => XML_NS_CONTACT).first['avail'].to_i == 1,
41
+ contact.css('contact|reason', 'contact' => XML_NS_CONTACT).text
42
+ )
43
+ end
44
+ end
45
+ end
46
+
47
+ class ContactCreateResponse
48
+ def initialize(response)
49
+ @response = Nokogiri::XML(response)
50
+ end
51
+
52
+ def code
53
+ @response.css('epp response result').first['code'].to_i
54
+ end
55
+
56
+ def message
57
+ @response.css('epp response result msg').text
58
+ end
59
+
60
+ def contact_id
61
+ @response.css('contact|creData contact|id', 'contact' => XML_NS_CONTACT).text
62
+ end
63
+
64
+ def contact_create_date
65
+ @response.css('contact|creData contact|crDate', 'contact' => XML_NS_CONTACT).text
66
+ end
67
+ end
68
+
69
+ class ContactDeleteResponse
70
+ def initialize(response)
71
+ @response = Nokogiri::XML(response)
72
+ end
73
+
74
+ def code
75
+ @response.css('epp response result').first['code'].to_i
76
+ end
77
+
78
+ def message
79
+ @response.css('epp response result msg').text
80
+ end
81
+ end
82
+
83
+ class ContactInfoResponse
84
+ def initialize(response)
85
+ @response = Nokogiri::XML(response)
86
+ end
87
+
88
+ def code
89
+ @response.css('epp response result').first['code'].to_i
90
+ end
91
+
92
+ def message
93
+ @response.css('epp response result msg').text
94
+ end
95
+
96
+ def contact_id
97
+ @response.css('contact|infData contact|id', 'contact' => XML_NS_CONTACT).text
98
+ end
99
+
100
+ def contact_roid
101
+ @response.css('contact|infData contact|roid', 'contact' => XML_NS_CONTACT).text
102
+ end
103
+
104
+ def contact_status
105
+ @response.css('contact|infData contact|status', 'contact' => XML_NS_CONTACT).first['s']
106
+ end
107
+
108
+ def contact_name
109
+ @response.css('contact|infData contact|postalInfo contact|name', 'contact' => XML_NS_CONTACT).text
110
+ end
111
+
112
+ def contact_street
113
+ @response.css('contact|infData contact|addr contact|street', 'contact' => XML_NS_CONTACT).text
114
+ end
115
+
116
+ def contact_city
117
+ @response.css('contact|infData contact|addr contact|city', 'contact' => XML_NS_CONTACT).text
118
+ end
119
+
120
+ def contact_postal_code
121
+ @response.css('contact|infData contact|addr contact|pc', 'contact' => XML_NS_CONTACT).text
122
+ end
123
+
124
+ def contact_country_code
125
+ @response.css('contact|infData contact|addr contact|cc', 'contact' => XML_NS_CONTACT).text
126
+ end
127
+
128
+ def contact_email
129
+ @response.css('contact|infData contact|email', 'contact' => XML_NS_CONTACT).text
130
+ end
131
+ end
132
+
133
+ class ContactUpdateResponse
134
+ def initialize(response)
135
+ @response = Nokogiri::XML(response)
136
+ end
137
+
138
+ def code
139
+ @response.css('epp response result').first['code'].to_i
140
+ end
141
+
142
+ def message
143
+ @response.css('epp response result msg').text
144
+ end
145
+ end
146
+
147
+ module ContactCommands
148
+
149
+ # Check availability for a contact id. You may provide multiple contact id names.
150
+ def check_contact(*contacts)
151
+ builder = build_epp_request do |xml|
152
+ xml.command {
153
+ xml.check {
154
+ xml.check('xmlns:contact' => XML_NS_CONTACT, 'xsi:schemaLocation' => XML_SCHEMALOC) {
155
+ xml.parent.namespace = xml.parent.namespace_definitions.first
156
+ contacts.each { |contact| xml.id_ contact }
157
+ }
158
+ }
159
+ xml.clTRID UUIDTools::UUID.timestamp_create.to_s
160
+ }
161
+ end
162
+
163
+ ContactCheckResponse.new(send_request(builder.to_xml))
164
+ end
165
+
166
+ # Create a new contact object. The contact object will be available immediately.
167
+ def create_contact(contact, name, street, city, postal_code, country_code, voice, email, ident, ident_type)
168
+ builder = build_epp_request do |xml|
169
+ xml.command {
170
+ xml.create {
171
+ xml.create('xmlns:contact' => XML_NS_CONTACT, 'xsi:schemaLocation' => XML_SCHEMALOC) {
172
+ xml.parent.namespace = xml.parent.namespace_definitions.first
173
+ xml.id_ contact
174
+ xml.postalInfo {
175
+ xml.name name
176
+ xml.addr {
177
+ xml.street street
178
+ xml.city city
179
+ xml.pc postal_code
180
+ xml.cc country_code
181
+ }
182
+ }
183
+ xml.voice voice
184
+ xml.email email
185
+ xml.ident ident, 'type' => ident_type
186
+ }
187
+ }
188
+ xml.clTRID UUIDTools::UUID.timestamp_create.to_s
189
+ }
190
+ end
191
+
192
+ ContactCreateResponse.new(send_request(builder.to_xml))
193
+ end
194
+
195
+ #Delete contact handle. Contact object can not be deleted if it has relations to other objects like domains or
196
+ # nssets.
197
+ def delete_contact(contact)
198
+ builder = build_epp_request do |xml|
199
+ xml.command {
200
+ xml.delete {
201
+ xml.delete('xmlns:contact' => XML_NS_CONTACT, 'xsi:schemaLocation' => XML_SCHEMALOC) {
202
+ xml.parent.namespace = xml.parent.namespace_definitions.first
203
+ xml.id_ contact
204
+ }
205
+ }
206
+ xml.clTRID UUIDTools::UUID.timestamp_create.to_s
207
+ }
208
+ end
209
+
210
+ ContactDeleteResponse.new(send_request(builder.to_xml))
211
+ end
212
+
213
+ # Returns detailed information about a contact.
214
+ def info_contact(contact)
215
+ builder = build_epp_request do |xml|
216
+ xml.command {
217
+ xml.info {
218
+ xml.info('xmlns:contact' => XML_NS_CONTACT, 'xsi:schemaLocation' => XML_SCHEMALOC) {
219
+ xml.parent.namespace = xml.parent.namespace_definitions.first
220
+ xml.id_ contact
221
+ }
222
+ }
223
+ xml.clTRID UUIDTools::UUID.timestamp_create.to_s
224
+ }
225
+ end
226
+
227
+ ContactInfoResponse.new(send_request(builder.to_xml))
228
+ end
229
+
230
+ def list_contacts
231
+ list_command('listContacts')
232
+ end
233
+
234
+ # Update contact object. All domain and nsset objects will be updated as well.
235
+ def update_contact(contact, name, street, city, postal_code, country_code, voice, email, ident, ident_type, legal_document, legal_doc_type)
236
+ builder = build_epp_request do |xml|
237
+ xml.command {
238
+ xml.update {
239
+ xml.update('xmlns:contact' => XML_NS_CONTACT, 'xsi:schemaLocation' => XML_SCHEMALOC) {
240
+ xml.parent.namespace = xml.parent.namespace_definitions.first
241
+ xml.id_ contact
242
+ if [name, street, city, postal_code, country_code].any?{ |item| !item.nil? }
243
+ xml.postalInfo {
244
+ xml.name name if name
245
+ if [street, city, postal_code, country_code].any?{ |item| !item.nil? }
246
+ xml.addr {
247
+ xml.street street if street
248
+ xml.city city if city
249
+ xml.pc postal_code if postal_code
250
+ xml.cc country_code if country_code
251
+ }
252
+ end
253
+ }
254
+ end
255
+ xml.voice voice if voice
256
+ xml.email email if email
257
+ xml.ident ident, 'type' => ident_type
258
+ }
259
+ }
260
+ add_legal_document(xml, legal_document, legal_doc_type)
261
+ xml.clTRID UUIDTools::UUID.timestamp_create.to_s
262
+ }
263
+ end
264
+
265
+ ContactUpdateResponse.new(send_request(builder.to_xml))
266
+ end
267
+ end
268
+ end
269
+ end
270
+
271
+ Epp::Server.send(:include, Epp::Eis::ContactCommands)