nominet-epp 0.0.12 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (197) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +24 -0
  3. data/.travis.yml +14 -0
  4. data/.yardopts +8 -2
  5. data/Gemfile +22 -0
  6. data/Gemfile.lock +64 -0
  7. data/HISTORY.md +78 -0
  8. data/LICENSE +1 -1
  9. data/README.md +23 -0
  10. data/Rakefile +2 -37
  11. data/gemfiles/Gemfile.ruby18 +13 -0
  12. data/lib/nominet-epp/client.rb +364 -0
  13. data/lib/nominet-epp/notification.rb +346 -0
  14. data/lib/nominet-epp/operations.rb +2 -7
  15. data/lib/nominet-epp/request.rb +165 -0
  16. data/lib/nominet-epp/requests/contact/check.rb +9 -0
  17. data/lib/nominet-epp/requests/contact/create.rb +60 -0
  18. data/lib/nominet-epp/requests/contact/delete.rb +9 -0
  19. data/lib/nominet-epp/requests/contact/info.rb +9 -0
  20. data/lib/nominet-epp/requests/contact/release.rb +33 -0
  21. data/lib/nominet-epp/requests/contact/update.rb +63 -0
  22. data/lib/nominet-epp/requests/custom/handshake.rb +36 -0
  23. data/lib/nominet-epp/requests/custom/list.rb +38 -0
  24. data/lib/nominet-epp/requests/custom/tag_list.rb +25 -0
  25. data/lib/nominet-epp/requests/domain/check.rb +98 -0
  26. data/lib/nominet-epp/requests/domain/create.rb +97 -0
  27. data/lib/nominet-epp/requests/domain/delete.rb +9 -0
  28. data/lib/nominet-epp/requests/domain/info.rb +9 -0
  29. data/lib/nominet-epp/requests/domain/release.rb +33 -0
  30. data/lib/nominet-epp/requests/domain/renew.rb +9 -0
  31. data/lib/nominet-epp/requests/domain/unrenew.rb +33 -0
  32. data/lib/nominet-epp/requests/domain/update.rb +134 -0
  33. data/lib/nominet-epp/requests/host/check.rb +9 -0
  34. data/lib/nominet-epp/requests/host/create.rb +9 -0
  35. data/lib/nominet-epp/requests/host/delete.rb +9 -0
  36. data/lib/nominet-epp/requests/host/info.rb +9 -0
  37. data/lib/nominet-epp/requests/host/update.rb +9 -0
  38. data/lib/nominet-epp/responses/contact/check_response.rb +10 -0
  39. data/lib/nominet-epp/responses/contact/create_response.rb +14 -0
  40. data/lib/nominet-epp/responses/contact/delete_response.rb +10 -0
  41. data/lib/nominet-epp/responses/contact/info_response.rb +89 -0
  42. data/lib/nominet-epp/responses/contact/release_response.rb +10 -0
  43. data/lib/nominet-epp/responses/contact/update_response.rb +10 -0
  44. data/lib/nominet-epp/responses/custom/handshake_response.rb +33 -0
  45. data/lib/nominet-epp/responses/custom/list_response.rb +29 -0
  46. data/lib/nominet-epp/responses/custom/tag_list_response.rb +37 -0
  47. data/lib/nominet-epp/responses/domain/check_response.rb +40 -0
  48. data/lib/nominet-epp/responses/domain/create_response.rb +10 -0
  49. data/lib/nominet-epp/responses/domain/delete_response.rb +10 -0
  50. data/lib/nominet-epp/responses/domain/info_response.rb +128 -0
  51. data/lib/nominet-epp/responses/domain/release_response.rb +10 -0
  52. data/lib/nominet-epp/responses/domain/renew_response.rb +10 -0
  53. data/lib/nominet-epp/responses/domain/unrenew_response.rb +26 -0
  54. data/lib/nominet-epp/responses/domain/update_response.rb +10 -0
  55. data/lib/nominet-epp/responses/host/check_response.rb +10 -0
  56. data/lib/nominet-epp/responses/host/create_response.rb +14 -0
  57. data/lib/nominet-epp/responses/host/delete_response.rb +10 -0
  58. data/lib/nominet-epp/responses/host/info_response.rb +14 -0
  59. data/lib/nominet-epp/responses/host/update_response.rb +10 -0
  60. data/lib/nominet-epp/responses/response.rb +27 -0
  61. data/lib/nominet-epp/version.rb +4 -0
  62. data/lib/nominet-epp.rb +60 -161
  63. data/nominet-epp.gemspec +15 -65
  64. data/test/helper.rb +57 -0
  65. data/test/notifications/test_contact_deleted_notification.rb +23 -0
  66. data/test/notifications/test_domain_cancelled_notification.rb +23 -0
  67. data/test/notifications/test_domains_released_notification.rb +34 -0
  68. data/test/notifications/test_domains_suspended_notification.rb +30 -0
  69. data/test/notifications/test_handshake_rejected_notification.rb +34 -0
  70. data/test/notifications/test_registrant_transfer_notification.rb +78 -0
  71. data/test/notifications/test_registrar_change_notification.rb +119 -0
  72. data/test/requests/contact/test_contact_check_request.rb +25 -0
  73. data/test/requests/contact/test_contact_create_request.rb +104 -0
  74. data/test/requests/contact/test_contact_delete_request.rb +20 -0
  75. data/test/requests/contact/test_contact_info_request.rb +20 -0
  76. data/test/requests/contact/test_contact_release_request.rb +29 -0
  77. data/test/requests/contact/test_contact_update_request.rb +111 -0
  78. data/test/requests/custom/test_custom_handshake_request.rb +42 -0
  79. data/test/requests/custom/test_custom_list_request.rb +44 -0
  80. data/test/requests/custom/test_custom_tag_list_request.rb +21 -0
  81. data/test/requests/domain/test_domain_check_request.rb +140 -0
  82. data/test/requests/domain/test_domain_create_request.rb +136 -0
  83. data/test/requests/domain/test_domain_delete_request.rb +20 -0
  84. data/test/requests/domain/test_domain_info_request.rb +20 -0
  85. data/test/requests/domain/test_domain_release_request.rb +29 -0
  86. data/test/requests/domain/test_domain_renew_request.rb +15 -0
  87. data/test/requests/domain/test_domain_unrenew_request.rb +32 -0
  88. data/test/requests/domain/test_domain_update_request.rb +163 -0
  89. data/test/requests/host/test_host_check_request.rb +25 -0
  90. data/test/requests/host/test_host_create_request.rb +33 -0
  91. data/test/requests/host/test_host_delete_request.rb +20 -0
  92. data/test/requests/host/test_host_info_request.rb +20 -0
  93. data/test/requests/host/test_host_update_request.rb +55 -0
  94. data/test/responses/contact/test_contact_check_response.rb +28 -0
  95. data/test/responses/contact/test_contact_create_response.rb +28 -0
  96. data/test/responses/contact/test_contact_delete_response.rb +18 -0
  97. data/test/responses/contact/test_contact_info_response.rb +79 -0
  98. data/test/responses/contact/test_contact_release_response.rb +18 -0
  99. data/test/responses/contact/test_contact_update_response.rb +18 -0
  100. data/test/responses/custom/test_custom_handshake_response.rb +27 -0
  101. data/test/responses/custom/test_custom_list_response.rb +44 -0
  102. data/test/responses/custom/test_custom_tag_list_response.rb +43 -0
  103. data/test/responses/domain/test_domain_check_response.rb +56 -0
  104. data/test/responses/domain/test_domain_create_response.rb +34 -0
  105. data/test/responses/domain/test_domain_delete_response.rb +18 -0
  106. data/test/responses/domain/test_domain_info_response.rb +76 -0
  107. data/test/responses/domain/test_domain_release_response.rb +18 -0
  108. data/test/responses/domain/test_domain_renew_response.rb +27 -0
  109. data/test/responses/domain/test_domain_unrenew_response.rb +32 -0
  110. data/test/responses/domain/test_domain_update_response.rb +18 -0
  111. data/test/responses/host/test_host_check_response.rb +28 -0
  112. data/test/responses/host/test_host_create_response.rb +28 -0
  113. data/test/responses/host/test_host_delete_response.rb +18 -0
  114. data/test/responses/host/test_host_info_response.rb +28 -0
  115. data/test/responses/host/test_host_update_response.rb +18 -0
  116. data/test/support/responses/contact/check.xml +23 -0
  117. data/test/support/responses/contact/create.xml +23 -0
  118. data/test/support/responses/contact/delete.xml +12 -0
  119. data/test/support/responses/contact/info.xml +46 -0
  120. data/test/support/responses/contact/release.xml +12 -0
  121. data/test/support/responses/contact/update.xml +12 -0
  122. data/test/support/responses/custom/handshake.xml +24 -0
  123. data/test/support/responses/custom/list.xml +28 -0
  124. data/test/support/responses/custom/list_empty.xml +21 -0
  125. data/test/support/responses/custom/tag_list.xml +28 -0
  126. data/test/support/responses/domain/check-direct-rights.xml +1 -0
  127. data/test/support/responses/domain/check.xml +25 -0
  128. data/test/support/responses/domain/create.xml +24 -0
  129. data/test/support/responses/domain/delete.xml +12 -0
  130. data/test/support/responses/domain/info.xml +45 -0
  131. data/test/support/responses/domain/release.xml +12 -0
  132. data/test/support/responses/domain/renew.xml +24 -0
  133. data/test/support/responses/domain/unrenew.xml +26 -0
  134. data/test/support/responses/domain/update.xml +12 -0
  135. data/test/support/responses/host/check.xml +23 -0
  136. data/test/support/responses/host/create.xml +18 -0
  137. data/test/support/responses/host/delete.xml +12 -0
  138. data/test/support/responses/host/info.xml +25 -0
  139. data/test/support/responses/host/update.xml +12 -0
  140. data/test/support/responses/notifications/abuse-feed.xml +31 -0
  141. data/test/support/responses/notifications/account-change.xml +39 -0
  142. data/test/support/responses/notifications/contact-deleted.xml +22 -0
  143. data/test/support/responses/notifications/data-quality.xml +53 -0
  144. data/test/support/responses/notifications/domain-cancelled.xml +22 -0
  145. data/test/support/responses/notifications/domains-released.xml +31 -0
  146. data/test/support/responses/notifications/domains-suspended.xml +26 -0
  147. data/test/support/responses/notifications/handshake-rejected.xml +31 -0
  148. data/test/support/responses/notifications/handshake-request.xml +65 -0
  149. data/test/support/responses/notifications/hosts-cancelled.xml +28 -0
  150. data/test/support/responses/notifications/referral-accepted.xml +23 -0
  151. data/test/support/responses/notifications/referral-rejected.xml +22 -0
  152. data/test/support/responses/notifications/registrant-transfer.xml +54 -0
  153. data/test/support/responses/notifications/registrar-change.xml +67 -0
  154. data/test/support/schemas/README +12 -0
  155. data/test/support/schemas/RELEASENOTES +54 -0
  156. data/test/support/schemas/contact-1.0.xsd +387 -0
  157. data/test/support/schemas/contact-nom-ext-1.0.xsd +144 -0
  158. data/test/support/schemas/domain-1.0.xsd +432 -0
  159. data/test/support/schemas/domain-nom-ext-1.2.xsd +215 -0
  160. data/test/support/schemas/epp-1.0.xsd +403 -0
  161. data/test/support/schemas/eppcom-1.0.xsd +93 -0
  162. data/test/support/schemas/host-1.0.xsd +240 -0
  163. data/test/support/schemas/nom-abuse-feed-1.0.xsd +46 -0
  164. data/test/support/schemas/nom-direct-rights-1.0.xsd +48 -0
  165. data/test/support/schemas/nom-root-std-1.0.7.xsd +47 -0
  166. data/test/support/schemas/nom-root-tag-1.0.xsd +31 -0
  167. data/test/support/schemas/nom-tag-1.0.xsd +71 -0
  168. data/test/support/schemas/secDNS-1.1.xsd +127 -0
  169. data/test/support/schemas/std-contact-id-1.0.xsd +35 -0
  170. data/test/support/schemas/std-fork-1.0.xsd +31 -0
  171. data/test/support/schemas/std-handshake-1.0.xsd +61 -0
  172. data/test/support/schemas/std-list-1.0.xsd +55 -0
  173. data/test/support/schemas/std-locks-1.0.xsd +53 -0
  174. data/test/support/schemas/std-notifications-1.2.xsd +197 -0
  175. data/test/support/schemas/std-release-1.0.xsd +39 -0
  176. data/test/support/schemas/std-unrenew-1.0.xsd +26 -0
  177. data/test/support/schemas/std-warning-1.1.xsd +145 -0
  178. data/test/test_nominet-epp.rb +3 -3
  179. metadata +324 -104
  180. data/History.rdoc +0 -78
  181. data/README.rdoc +0 -23
  182. data/VERSION +0 -1
  183. data/lib/nominet-epp/operations/check.rb +0 -39
  184. data/lib/nominet-epp/operations/create.rb +0 -138
  185. data/lib/nominet-epp/operations/delete.rb +0 -20
  186. data/lib/nominet-epp/operations/fork.rb +0 -53
  187. data/lib/nominet-epp/operations/hello.rb +0 -11
  188. data/lib/nominet-epp/operations/info.rb +0 -93
  189. data/lib/nominet-epp/operations/list.rb +0 -83
  190. data/lib/nominet-epp/operations/lock.rb +0 -56
  191. data/lib/nominet-epp/operations/merge.rb +0 -41
  192. data/lib/nominet-epp/operations/poll.rb +0 -64
  193. data/lib/nominet-epp/operations/renew.rb +0 -40
  194. data/lib/nominet-epp/operations/transfer.rb +0 -84
  195. data/lib/nominet-epp/operations/unlock.rb +0 -56
  196. data/lib/nominet-epp/operations/unrenew.rb +0 -36
  197. data/lib/nominet-epp/operations/update.rb +0 -176
@@ -0,0 +1,346 @@
1
+ require 'ostruct'
2
+ module NominetEPP
3
+ class Notification
4
+ unless RUBY_VERSION >= "1.9"
5
+ class OpenStruct < ::OpenStruct
6
+ undef id
7
+ undef type
8
+ end
9
+ end
10
+
11
+ NAMESPACE_URIS = {
12
+ 'urn:ietf:params:xml:ns:domain-1.0' => 'domain',
13
+ 'urn:ietf:params:xml:ns:contact-1.0' => 'contact',
14
+ 'http://www.nominet.org.uk/epp/xml/nom-abuse-feed-1.0' => 'abuse',
15
+ 'http://www.nominet.org.uk/epp/xml/std-notifications-1.0' => 'n',
16
+ 'http://www.nominet.org.uk/epp/xml/std-notifications-1.1' => 'n',
17
+ 'http://www.nominet.org.uk/epp/xml/std-notifications-1.2' => 'n',
18
+ 'http://www.nominet.org.uk/epp/xml/nom-notifications-2.1' => 'n',
19
+ 'http://www.nominet.org.uk/epp/xml/contact-nom-ext-1.0' => 'contact_ext',
20
+ 'http://www.nominet.org.uk/epp/xml/std-warning-1.1' => 'warning' }
21
+
22
+ def initialize(response)
23
+ raise ArgumentError, "must be an EPP::Response" unless response.kind_of?(EPP::Response)
24
+ @response = response
25
+ @parsed = {}
26
+
27
+ if response.code == 1301
28
+ parse_response
29
+ parse_extension
30
+ end
31
+ end
32
+
33
+ undef to_s
34
+
35
+ def type
36
+ @type ||= begin
37
+ case msgQ_msg
38
+ when /Account Details Change/i
39
+ :account_change
40
+ when /Contact deleted/i
41
+ :contact_deleted
42
+ when /DQ Workflow process/i
43
+ :data_quality
44
+ when /Domain Activity/i
45
+ :abuse_feed
46
+ when /Domain name Cancellation/i
47
+ :domain_cancelled
48
+ when /Domains Released/i
49
+ :domains_released
50
+ when /Domains Suspended/i
51
+ :domains_suspended
52
+ when /Host cancellation/i
53
+ :host_cancellation
54
+ when /Referral Accepted/i
55
+ :referral_accepted
56
+ when /Referral Rejected/i
57
+ :referral_rejected
58
+ when /Registrant Transfer/i
59
+ :registrant_transfer
60
+ when /Registrar Change Authorisation Request/i
61
+ :handshake_request
62
+ when /Registrar Change Handshake Rejected/i
63
+ :handshake_rejected
64
+ when /Registrar Change Notification/
65
+ :registrar_change
66
+ end
67
+ end
68
+ end
69
+
70
+ def msgQ_msg
71
+ @msgQ_msg ||= @response.msgQ.find('e:msg').first.content.strip
72
+ end
73
+
74
+ def method_missing(method, *args, &block)
75
+ return @parsed[method] if @parsed.has_key?(method)
76
+ return super unless @response.respond_to?(method)
77
+ @response.send(method, *args, &block)
78
+ end
79
+
80
+ def respond_to_missing?(method, include_private)
81
+ @parsed.has_key?(method) || @response.respond_to?(method, include_private)
82
+ end
83
+
84
+ undef id unless RUBY_VERSION >= "1.9"
85
+
86
+ unless RUBY_VERSION >= "1.9.2"
87
+ def respond_to?(method, include_private = false)
88
+ respond_to_missing?(method, include_private) || super
89
+ end
90
+ def method(sym)
91
+ respond_to_missing?(sym, true) ? @response.method(sym) : super
92
+ end
93
+ end
94
+
95
+ protected
96
+ def parse_response
97
+ ns = NAMESPACE_URIS[@response.data.namespaces.namespace.href]
98
+ name = @response.data.name.gsub('-', '_')
99
+
100
+ method = :"parse_#{ns}_#{name}"
101
+ if self.respond_to?(method, true)
102
+ return self.send(method, @response.data)
103
+ end
104
+ end
105
+ def parse_extension
106
+ [@response.extension].flatten.compact.each do |extension|
107
+ ns = NAMESPACE_URIS[extension.namespaces.namespace.href]
108
+ name = extension.name.gsub('-', '_')
109
+
110
+ method = :"parse_#{ns}_#{name}"
111
+ if self.respond_to?(method, true)
112
+ return self.send(method, extension)
113
+ end
114
+ end
115
+ end
116
+
117
+ def parse_n_cancData(data)
118
+ data.children.each do |node|
119
+ next if node.empty?
120
+
121
+ case node.name
122
+ when 'domainName'
123
+ @parsed[:name] = node.content.strip
124
+ when 'orig'
125
+ @parsed[:originator] = node.content.strip
126
+ end
127
+ end
128
+ end
129
+ def parse_domain_ns(data)
130
+ data.children.map do |node|
131
+ next if node.empty?
132
+
133
+ case node.name
134
+ when 'hostObj'
135
+ node.content.strip
136
+ end
137
+ end.compact
138
+ end
139
+ def parse_domain_infData(data)
140
+ parsed = {}
141
+ data.children.each do |node|
142
+ next if node.empty?
143
+
144
+ case node.name
145
+ when 'name'
146
+ parsed[:name] = node.content.strip
147
+ when 'roid'
148
+ parsed[:roid] = node.content.strip
149
+ when 'ns'
150
+ parsed[:nameservers] = parse_domain_ns(node)
151
+ when 'clID'
152
+ parsed[:client_id] = node.content.strip
153
+ when 'crID'
154
+ parsed[:creator_id] = node.content.strip
155
+ when 'crDate'
156
+ parsed[:created_date] = Time.parse(node.content.strip)
157
+ when 'exDate'
158
+ parsed[:expiration_date] = Time.parse(node.content.strip)
159
+ end
160
+ end
161
+ parsed
162
+ end
163
+ def parse_n_domainListData(data)
164
+ data.children.map do |node|
165
+ next if node.empty?
166
+
167
+ case node.name
168
+ when 'domainName'
169
+ node.content.strip
170
+ when 'infData'
171
+ OpenStruct.new(parse_domain_infData(node))
172
+ end
173
+ end.compact
174
+ end
175
+ def parse_n_relData(data)
176
+ data.children.each do |node|
177
+ next if node.empty?
178
+
179
+ case node.name
180
+ when 'accountId'
181
+ @parsed[:account_id] = node.content.strip
182
+ @parsed[:account_moved?] = node['moved'] == 'Y'
183
+ when 'from'
184
+ @parsed[:from] = node.content.strip
185
+ when 'registrarTag'
186
+ @parsed[:registrar_tag] = node.content.strip
187
+ when 'domainListData'
188
+ @parsed[:domains] = parse_n_domainListData(node)
189
+ end
190
+ end
191
+ end
192
+ def parse_n_suspData(data)
193
+ data.children.each do |node|
194
+ next if node.empty?
195
+
196
+ case node.name
197
+ when 'reason'
198
+ @parsed[:reason] = node.content.strip
199
+ when 'cancelDate'
200
+ @parsed[:cancellation_date] = Time.parse(node.content.strip)
201
+ when 'domainListData'
202
+ @parsed[:domains] = parse_n_domainListData(node)
203
+ end
204
+ end
205
+ end
206
+ def parse_n_trnData(data)
207
+ data.children.each do |node|
208
+ next if node.empty?
209
+
210
+ case node.name
211
+ when 'orig'
212
+ @parsed[:originator] = node.content.strip
213
+ when 'accountId'
214
+ @parsed[:account_id] = node.content.strip
215
+ when 'oldAccountId'
216
+ @parsed[:old_account_id] = node.content.strip
217
+ when 'domainListData'
218
+ @parsed[:domains] = parse_n_domainListData(node)
219
+ when 'infData'
220
+ @parsed[:contact] = OpenStruct.new(parse_contact_infData(node))
221
+ end
222
+ end
223
+ end
224
+ def parse_contact_infData(data)
225
+ parsed = {}
226
+ data.children.each do |node|
227
+ next if node.empty?
228
+
229
+ case node.name
230
+ when 'id'
231
+ parsed[:id] = node.content.strip
232
+ when 'roid'
233
+ parsed[:roid] = node.content.strip
234
+ when 'status'
235
+ parsed[:status] = node['s'].to_s
236
+ when 'postalInfo'
237
+ parsed[:postal_info] = parse_contact_postalInfo(node)
238
+ when 'voice'
239
+ parsed[:voice] = node.content.strip
240
+ when 'email'
241
+ parsed[:email] = node.content.strip
242
+ when 'clID'
243
+ parsed[:client_id] = node.content.strip
244
+ when 'crID'
245
+ parsed[:creator_id] = node.content.strip
246
+ when 'crDate'
247
+ parsed[:created_date] = Time.parse(node.content.strip)
248
+ when 'upID'
249
+ parsed[:updator_id] = node.content.strip
250
+ when 'upDate'
251
+ parsed[:updated_date] = Time.parse(node.content.strip)
252
+ end
253
+ end
254
+ parsed
255
+ end
256
+ def parse_contact_postalInfo(data)
257
+ parsed = {}
258
+ data.children.each do |node|
259
+ next if node.empty?
260
+
261
+ case node.name
262
+ when 'name'
263
+ parsed[:name] = node.content.strip
264
+ when 'org'
265
+ parsed[:org] = node.content.strip
266
+ when 'addr'
267
+ parsed[:addr] = parse_contact_addr(node)
268
+ end
269
+ end
270
+ parsed
271
+ end
272
+ def parse_contact_addr(data)
273
+ parsed = {}
274
+ data.children.each do |node|
275
+ next if node.empty?
276
+
277
+ case node.name
278
+ when 'street'
279
+ parsed[:street] = node.content.strip
280
+ when 'city'
281
+ parsed[:city] = node.content.strip
282
+ when 'sp'
283
+ parsed[:sp] = node.content.strip
284
+ when 'pc'
285
+ parsed[:pc] = node.content.strip
286
+ when 'cc'
287
+ parsed[:cc] = node.content.strip
288
+ end
289
+ end
290
+ parsed
291
+ end
292
+ def parse_n_contactDelData(data)
293
+ data.children.each do |node|
294
+ next if node.empty?
295
+
296
+ case node.name
297
+ when 'contactId'
298
+ @parsed[:id] = node.content.strip
299
+ when 'roid'
300
+ @parsed[:roid] = node.content.strip
301
+ end
302
+ end
303
+ end
304
+ def parse_n_rcData(data)
305
+ data.children.each do |node|
306
+ next if node.empty?
307
+
308
+ case node.name
309
+ when 'orig'
310
+ @parsed[:originator] = node.content.strip
311
+ when 'registrarTag'
312
+ @parsed[:registrar_tag] = node.content.strip
313
+ when 'domainListData'
314
+ @parsed[:domains] = parse_n_domainListData(node)
315
+ when 'infData'
316
+ @parsed[:contact] = OpenStruct.new(parse_contact_infData(node))
317
+ end
318
+ end
319
+ end
320
+
321
+ def parse_contact_ext_infData(ext)
322
+ ext.children.each do |node|
323
+ next if node.empty?
324
+
325
+ @parsed[:contact] ||= OpenStruct.new
326
+
327
+ case node.name
328
+ when 'opt-out'
329
+ @parsed[:contact].opt_out = node.content.strip == 'Y'
330
+ else
331
+ @parsed[:contact].send("#{node.name}=", node.content.strip)
332
+ end
333
+ end
334
+ end
335
+
336
+ def parse_warning_truncated_field(ext)
337
+ field_name = ext['field-name']
338
+ value = ext.content.strip
339
+
340
+ case field_name
341
+ when /:crID$/, /:upID$/
342
+ return
343
+ end
344
+ end
345
+ end
346
+ end
@@ -4,17 +4,12 @@ module NominetEPP
4
4
  autoload :Check, File.dirname(__FILE__) + '/operations/check.rb'
5
5
  autoload :Create, File.dirname(__FILE__) + '/operations/create.rb'
6
6
  autoload :Delete, File.dirname(__FILE__) + '/operations/delete.rb'
7
- autoload :Fork, File.dirname(__FILE__) + '/operations/fork.rb'
7
+ autoload :Handshake,File.dirname(__FILE__) + '/operations/handshake.rb'
8
8
  autoload :Hello, File.dirname(__FILE__) + '/operations/hello.rb'
9
9
  autoload :Info, File.dirname(__FILE__) + '/operations/info.rb'
10
- autoload :List, File.dirname(__FILE__) + '/operations/list.rb'
11
- autoload :Lock, File.dirname(__FILE__) + '/operations/lock.rb'
12
- autoload :Merge, File.dirname(__FILE__) + '/operations/merge.rb'
13
10
  autoload :Poll, File.dirname(__FILE__) + '/operations/poll.rb'
11
+ autoload :Release, File.dirname(__FILE__) + '/operations/release.rb'
14
12
  autoload :Renew, File.dirname(__FILE__) + '/operations/renew.rb'
15
- autoload :Transfer, File.dirname(__FILE__) + '/operations/transfer.rb'
16
- autoload :Unlock, File.dirname(__FILE__) + '/operations/unlock.rb'
17
- autoload :Unrenew, File.dirname(__FILE__) + '/operations/unrenew.rb'
18
13
  autoload :Update, File.dirname(__FILE__) + '/operations/update.rb'
19
14
  end
20
15
  end
@@ -0,0 +1,165 @@
1
+ module NominetEPP
2
+ class Request
3
+ attr_reader :command, :extension
4
+
5
+ def command_name
6
+ @command_name ||= command.name
7
+ end
8
+
9
+ def namespaces
10
+ ext_ns = @extension && @extension.namespaces || {}
11
+ @command.namespaces.merge(ext_ns)
12
+ end
13
+
14
+ # Creates and returns a new XML node
15
+ #
16
+ # @param [String] name of the node to create
17
+ # @param [String,XML::Node,nil] value of the node
18
+ # @return [XML::Node]
19
+ def xml_node(name, value = nil)
20
+ XML::Node.new(name, value)
21
+ end
22
+
23
+ # Creates and returns a new XML namespace
24
+ #
25
+ # @param [XML::Node] node XML node to add the namespace to
26
+ # @param [String] name Name of the namespace to create
27
+ # @param [String] uri URI of the namespace to create
28
+ # @return [XML::Namespace]
29
+ def xml_namespace(node, name, uri, namespaces = {})
30
+ XML::Namespace.new(node, name, uri)
31
+ end
32
+ end
33
+
34
+ class RequestExtension
35
+ attr_reader :namespaces
36
+
37
+ def set_namespaces(namespaces)
38
+ @namespaces = namespaces
39
+ end
40
+
41
+ def namespace_uri
42
+ raise NotImplementedError
43
+ end
44
+ def namespace_name
45
+ case namespace_uri
46
+ when /\Aurn\:/
47
+ namespace_uri.split(':').last.split('-',2).first.to_sym
48
+ else
49
+ namespace_uri.split('/').last.split('-')[0...-1].join('-').to_sym
50
+ end
51
+ end
52
+
53
+ def schemaLocation
54
+ "#{namespace_uri} #{schema_name(namespace_uri)}.xsd"
55
+ end
56
+
57
+ protected
58
+ # Creates and returns a new XML node
59
+ #
60
+ # @param [String] name of the node to create
61
+ # @param [String,XML::Node,nil] value of the node
62
+ # @return [XML::Node]
63
+ def xml_node(name, value = nil)
64
+ XML::Node.new(name, value)
65
+ end
66
+
67
+ # Creates and returns a new XML namespace
68
+ #
69
+ # @param [XML::Node] node XML node to add the namespace to
70
+ # @param [String] name Name of the namespace to create
71
+ # @param [String] uri URI of the namespace to create
72
+ # @return [XML::Namespace]
73
+ def xml_namespace(node, name, uri, namespaces = {})
74
+ XML::Namespace.new(node, name, uri)
75
+ end
76
+
77
+ def x_node(name, value = nil)
78
+ node = xml_node(name, value)
79
+ node.namespaces.namespace = x_namespace(node)
80
+ node
81
+ end
82
+
83
+ def x_namespace(node, name = namespace_name, ns = namespace_uri)
84
+ return @namespaces[name] if @namespaces.has_key?(name)
85
+ @namespaces[name] = xml_namespace(node, name, ns)
86
+ end
87
+
88
+ def x_schemaLocation(node, sL = schemaLocation)
89
+ xattr = XML::Attr.new(node, "schemaLocation", sL)
90
+ xattr.namespaces.namespace = x_namespace(node, 'xsi', 'http://www.w3.org/2001/XMLSchema-instance')
91
+ end
92
+
93
+ # Returns the name of the given schema
94
+ # @internal
95
+ # @param [String] urn Schema URN or URI
96
+ # @return [String] the name of the given schema
97
+ def schema_name(urn)
98
+ case urn
99
+ when /\Aurn\:/
100
+ urn.split(':').last
101
+ else
102
+ urn.split('/').last
103
+ end
104
+ end
105
+ end
106
+
107
+ class CustomRequest < Request
108
+ def command
109
+ self
110
+ end
111
+
112
+ def namespaces
113
+ @namespaces
114
+ end
115
+ def set_namespaces(namespaces)
116
+ @namespaces = namespaces
117
+ end
118
+
119
+ def namespace_uri
120
+ raise NotImplementedError
121
+ end
122
+ def namespace_name
123
+ case namespace_uri
124
+ when /\Aurn\:/
125
+ namespace_uri.split(':').last.split('-',2).first.to_sym
126
+ else
127
+ namespace_uri.split('/').last.split('-')[0...-1].join('-').to_sym
128
+ end
129
+ end
130
+
131
+ def schemaLocation
132
+ "#{namespace_uri} #{schema_name(namespace_uri)}.xsd"
133
+ end
134
+
135
+ protected
136
+ def x_node(name, value = nil)
137
+ node = xml_node(name, value)
138
+ node.namespaces.namespace = x_namespace(node)
139
+ node
140
+ end
141
+
142
+ def x_namespace(node, name = namespace_name, ns = namespace_uri)
143
+ return @namespaces[name] if @namespaces.has_key?(name)
144
+ @namespaces[name] = xml_namespace(node, name, ns)
145
+ end
146
+
147
+ def x_schemaLocation(node, sL = schemaLocation)
148
+ xattr = XML::Attr.new(node, "schemaLocation", sL)
149
+ xattr.namespaces.namespace = x_namespace(node, 'xsi', 'http://www.w3.org/2001/XMLSchema-instance')
150
+ end
151
+
152
+ # Returns the name of the given schema
153
+ # @internal
154
+ # @param [String] urn Schema URN or URI
155
+ # @return [String] the name of the given schema
156
+ def schema_name(urn)
157
+ case urn
158
+ when /\Aurn\:/
159
+ urn.split(':').last
160
+ else
161
+ urn.split('/').last
162
+ end
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,9 @@
1
+ module NominetEPP
2
+ module Contact
3
+ class Check < Request
4
+ def initialize(*ids)
5
+ @command = EPP::Contact::Check.new(*ids)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,60 @@
1
+ module NominetEPP
2
+ module Contact
3
+ class Create < Request
4
+ def initialize(name, options = {})
5
+ @name = name
6
+ @options = options
7
+ @namespaces = {}
8
+
9
+ @extensions = @options.dup
10
+ @extensions.delete_if { |k,_| !CreateExtension::KEYS.include?(k) }
11
+ @options.delete_if { |k,_| CreateExtension::KEYS.include?(k) }
12
+
13
+ @options[:auth_info] ||= {:pw => SecureRandom.hex(8) }
14
+
15
+ @contact_ext = CreateExtension.new(@extensions) rescue nil
16
+
17
+ @command = EPP::Contact::Create.new(@name, @options)
18
+ @extension = EPP::Requests::Extension.new(@contact_ext) rescue nil
19
+ end
20
+ end
21
+
22
+ class CreateExtension < RequestExtension
23
+ KEYS = [:trad_name, :type, :co_no, :opt_out]
24
+ NAMESPACE = 'http://www.nominet.org.uk/epp/xml/contact-nom-ext-1.0'
25
+
26
+ def initialize(attributes)
27
+ raise ArgumentError, "must provide Hash of #{KEYS.map(&:inspect).join(", ")}" if attributes.nil? || attributes.empty?
28
+ @attributes = attributes
29
+ @namespaces = {}
30
+ end
31
+
32
+ def namespace_uri
33
+ NAMESPACE
34
+ end
35
+ def namespace_name
36
+ 'contact-ext'
37
+ end
38
+
39
+ def to_xml
40
+ node = x_node('create')
41
+ x_schemaLocation(node)
42
+
43
+ KEYS.each do |key|
44
+ value = @attributes[key]
45
+ next if value.nil? || value == ''
46
+
47
+ case key
48
+ when :opt_out
49
+ node << x_node('opt-out', value ? 'Y' : 'N')
50
+ else
51
+ name = key.to_s.gsub('_', '-')
52
+ node << x_node(name, value.to_s)
53
+ end
54
+ end
55
+
56
+ node
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,9 @@
1
+ module NominetEPP
2
+ module Contact
3
+ class Delete < Request
4
+ def initialize(id)
5
+ @command = EPP::Contact::Delete.new(id)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module NominetEPP
2
+ module Contact
3
+ class Info < Request
4
+ def initialize(id)
5
+ @command = EPP::Contact::Info.new(id)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,33 @@
1
+ module NominetEPP
2
+ module Contact
3
+ class Release < CustomRequest
4
+ NAMESPACE = 'http://www.nominet.org.uk/epp/xml/std-release-1.0'
5
+
6
+ def initialize(name, tag)
7
+ @name = name
8
+ @tag = tag
9
+ end
10
+
11
+ def command_name
12
+ 'update'
13
+ end
14
+ def namespace_name
15
+ 'r'
16
+ end
17
+ def namespace_uri
18
+ NAMESPACE
19
+ end
20
+
21
+ def to_xml
22
+ @namespaces ||= {}
23
+ node = x_node('release')
24
+ x_schemaLocation(node)
25
+
26
+ node << x_node('registrant', @name)
27
+ node << x_node('registrarTag', @tag)
28
+
29
+ node
30
+ end
31
+ end
32
+ end
33
+ end