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,63 @@
1
+ module NominetEPP
2
+ module Contact
3
+ class Update < Request
4
+ def initialize(name, changes = {})
5
+ @name = name
6
+ @namespaces = {}
7
+
8
+ extensions = (changes[:add] || {}).merge(changes[:chg] || {})
9
+ extensions.delete_if { |k,_| !UpdateExtension::KEYS.include?(k) }
10
+
11
+ changes[:add] && changes[:add].delete_if { |k,_| UpdateExtension::KEYS.include?(k) }
12
+ changes[:rem] && changes[:rem].delete_if { |k,_| UpdateExtension::KEYS.include?(k) }
13
+ changes[:chg] && changes[:chg].delete_if { |k,_| UpdateExtension::KEYS.include?(k) }
14
+
15
+ # Changing the organisation is not permitted by Nominet
16
+ changes[:chg] && changes[:chg][:postal_info] && changes[:chg][:postal_info].delete(:org)
17
+
18
+ @contact_ext = UpdateExtension.new(extensions) rescue nil
19
+
20
+ @command = EPP::Contact::Update.new(name, changes)
21
+ @extension = EPP::Requests::Extension.new(@contact_ext) rescue nil
22
+ end
23
+ end
24
+
25
+ class UpdateExtension < RequestExtension
26
+ KEYS = [:trad_name, :type, :co_no, :opt_out]
27
+ NAMESPACE = 'http://www.nominet.org.uk/epp/xml/contact-nom-ext-1.0'
28
+
29
+ def initialize(attributes)
30
+ raise ArgumentError, "must provide Hash of #{KEYS.map(&:inspect).join(", ")}" if attributes.nil? || attributes.empty?
31
+ @attributes = attributes
32
+ @namespaces = {}
33
+ end
34
+
35
+ def namespace_uri
36
+ NAMESPACE
37
+ end
38
+ def namespace_name
39
+ 'contact-ext'
40
+ end
41
+
42
+ def to_xml
43
+ node = x_node('update')
44
+ x_schemaLocation(node)
45
+
46
+ KEYS.each do |key|
47
+ value = @attributes[key]
48
+ next if value.nil? || value == ''
49
+
50
+ case key
51
+ when :opt_out
52
+ node << x_node('opt-out', value ? 'Y' : 'N')
53
+ else
54
+ name = key.to_s.gsub('_', '-')
55
+ node << x_node(name, value.to_s)
56
+ end
57
+ end
58
+
59
+ node
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,36 @@
1
+ module NominetEPP
2
+ module Custom
3
+ class Handshake < CustomRequest
4
+ NAMESPACE = 'http://www.nominet.org.uk/epp/xml/std-handshake-1.0'
5
+
6
+ def initialize(case_id, registrant = nil)
7
+ @case_id = case_id
8
+ @registrant = registrant
9
+ end
10
+
11
+ def command_name
12
+ 'update'
13
+ end
14
+ def namespace_name
15
+ 'h'
16
+ end
17
+ def namespace_uri
18
+ NAMESPACE
19
+ end
20
+
21
+ def to_xml
22
+ @namespaces ||= {}
23
+ node = x_node('accept')
24
+ x_schemaLocation(node)
25
+
26
+ node << x_node('caseId', @case_id)
27
+
28
+ if @registrant
29
+ node << x_node('registrant', @registrant)
30
+ end
31
+
32
+ node
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,38 @@
1
+ module NominetEPP
2
+ module Custom
3
+ class List < CustomRequest
4
+ NAMESPACE = 'http://www.nominet.org.uk/epp/xml/std-list-1.0'
5
+
6
+ def initialize(type, month)
7
+ month = month.strftime('%Y-%m') if month.respond_to?(:strftime)
8
+ @month = month
9
+ @type = type
10
+ end
11
+
12
+ def command_name
13
+ 'info'
14
+ end
15
+ def namespace_name
16
+ 'l'
17
+ end
18
+ def namespace_uri
19
+ NAMESPACE
20
+ end
21
+
22
+ def to_xml
23
+ @namespaces ||= {}
24
+ node = x_node('list')
25
+ x_schemaLocation(node)
26
+
27
+ case @type
28
+ when :registration, 'registration', :month, 'month'
29
+ node << x_node('month', @month)
30
+ when :expiry, 'expiry'
31
+ node << x_node('expiry', @month)
32
+ end
33
+
34
+ node
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,25 @@
1
+ module NominetEPP
2
+ module Custom
3
+ class TagList < CustomRequest
4
+ NAMESPACE = 'http://www.nominet.org.uk/epp/xml/nom-tag-1.0'
5
+
6
+ def command_name
7
+ 'info'
8
+ end
9
+ def namespace_name
10
+ 'tag'
11
+ end
12
+ def namespace_uri
13
+ NAMESPACE
14
+ end
15
+
16
+ def to_xml
17
+ @namespaces ||= {}
18
+ node = x_node('list')
19
+ x_schemaLocation(node)
20
+
21
+ node
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,98 @@
1
+ module NominetEPP
2
+ module Domain
3
+ class Check < Request
4
+ def initialize(*names)
5
+ rights = names.last.is_a?(Hash) ? names.pop : nil
6
+
7
+ @command = EPP::Domain::Check.new(*names)
8
+
9
+ if rights
10
+ raise ArgumentError, "cannot check direct rights on more than one name" if names.count > 1
11
+ @rights_ext = DirectRightsExtension.new(rights)
12
+ @extension = EPP::Requests::Extension.new(@rights_ext) rescue nil
13
+ end
14
+ end
15
+
16
+ class DirectRightsExtension < RequestExtension
17
+ KEYS = [:postal_info, :email, :registrant]
18
+ NAMESPACE = 'http://www.nominet.org.uk/epp/xml/nom-direct-rights-1.0'
19
+
20
+ def initialize(attributes)
21
+ raise ArgumentError, "must provide Hash with one of #{KEYS.map(&:inspect).join(", ")}" if attributes.nil? || attributes.empty?
22
+
23
+ if attributes.has_key?(:postal_info)
24
+ unless attributes.has_key?(:email)
25
+ raise ArgumentError, "must provide :email when using :postal_info"
26
+ end
27
+ end
28
+
29
+
30
+ if attributes.has_key?(:email)
31
+ unless attributes.has_key?(:postal_info)
32
+ raise ArgumentError, "must provide :postal_info when using :email"
33
+ end
34
+ end
35
+
36
+ if attributes.has_key?(:registrant)
37
+ if attributes.has_key?(:email) || attributes.has_key?(:postal_info)
38
+ raise ArgumentError, ":registrant must be used on its own"
39
+ end
40
+ end
41
+
42
+ @attributes = attributes
43
+ @namespaces = {}
44
+ end
45
+
46
+ def namespace_uri
47
+ NAMESPACE
48
+ end
49
+ def namespace_name
50
+ 'nom-direct-rights'
51
+ end
52
+
53
+ def contact_node(name, value = nil)
54
+ node = xml_node(name, value)
55
+ node.namespaces.namespace = x_namespace(node,
56
+ 'contact', EPP::Contact::NAMESPACE)
57
+ node
58
+ end
59
+
60
+ def to_xml
61
+ node = x_node('check')
62
+ x_schemaLocation(node)
63
+
64
+ KEYS.each do |key|
65
+ value = @attributes[key]
66
+ next if value.nil? || value == ''
67
+
68
+ case key
69
+ when :postal_info
70
+ node << x_node('postalInfo').tap do |postalInfo|
71
+ postalInfo['type'] = 'loc'
72
+
73
+ @namespaces['contact'] = xml_namespace(postalInfo, 'contact', EPP::Contact::NAMESPACE)
74
+ x_schemaLocation(postalInfo, EPP::Contact::SCHEMA_LOCATION)
75
+
76
+ postalInfo << contact_node('name', value[:name])
77
+ postalInfo << contact_node('org', value[:org]) if value[:org]
78
+
79
+ postalInfo << contact_node('addr').tap do |addr|
80
+ addr << contact_node('street', value[:addr][:street]) if value[:addr][:street]
81
+ addr << contact_node('city', value[:addr][:city])
82
+ addr << contact_node('sp', value[:addr][:sp]) if value[:addr][:sp]
83
+ addr << contact_node('pc', value[:addr][:pc]) if value[:addr][:pc]
84
+ addr << contact_node('cc', value[:addr][:cc])
85
+ end
86
+ end
87
+ else
88
+ name = key.to_s.gsub('_', '-')
89
+ node << x_node(name, value.to_s)
90
+ end
91
+ end
92
+
93
+ node
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,97 @@
1
+ module NominetEPP
2
+ module Domain
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
+ @domain_ext = CreateExtension.new(@extensions) rescue nil
16
+ @secdns_ext = CreateSecDNSExtension.new(@options.delete(:ds)) rescue nil
17
+
18
+ @command = EPP::Domain::Create.new(@name, @options)
19
+ @extension = EPP::Requests::Extension.new(@domain_ext, @secdns_ext) rescue nil
20
+ end
21
+ end
22
+
23
+ class CreateExtension < RequestExtension
24
+ KEYS = [:first_bill, :recur_bill, :auto_bill, :next_bill,
25
+ :auto_period, :next_period, :notes, :reseller]
26
+ NAMESPACE = 'http://www.nominet.org.uk/epp/xml/domain-nom-ext-1.2'
27
+
28
+ def initialize(attributes)
29
+ raise ArgumentError, "must provide Hash of #{KEYS.map(&:inspect).join(", ")}" if attributes.nil? || attributes.empty?
30
+ @attributes = attributes
31
+ @namespaces = {}
32
+ end
33
+
34
+ def namespace_uri
35
+ NAMESPACE
36
+ end
37
+ def namespace_name
38
+ 'domain-ext'
39
+ end
40
+
41
+ def to_xml
42
+ node = x_node('create')
43
+ x_schemaLocation(node)
44
+
45
+ KEYS.each do |key|
46
+ value = @attributes[key]
47
+ next if value.nil? || value == ''
48
+
49
+ case key
50
+ when :notes
51
+ Array(value).each do |note|
52
+ node << x_node('notes', note)
53
+ end
54
+ else
55
+ name = key.to_s.gsub('_', '-')
56
+ node << x_node(name, value.to_s)
57
+ end
58
+ end
59
+
60
+ node
61
+ end
62
+ end
63
+
64
+ class CreateSecDNSExtension < RequestExtension
65
+ NAMESPACE = 'urn:ietf:params:xml:ns:secDNS-1.1'
66
+
67
+ def initialize(attributes)
68
+ raise ArgumentError, "must provide Array of Hash or Hash of :key_tag, :alg, :digest_type and :digest" if attributes.nil? || attributes.empty?
69
+ @attributes = attributes
70
+ @namespaces = {}
71
+ end
72
+
73
+ def namespace_uri
74
+ NAMESPACE
75
+ end
76
+ def namespace_name
77
+ 'secDNS'
78
+ end
79
+
80
+ def to_xml
81
+ node = x_node('create')
82
+ x_schemaLocation(node)
83
+
84
+ Array(@attributes).each do |attributes|
85
+ node << x_node('dsData').tap do |dsData|
86
+ dsData << x_node('keyTag', attributes[:key_tag].to_s)
87
+ dsData << x_node('alg', attributes[:alg].to_s)
88
+ dsData << x_node('digestType', attributes[:digest_type].to_s)
89
+ dsData << x_node('digest', attributes[:digest].gsub(/\s+/, ''))
90
+ end
91
+ end
92
+
93
+ node
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,9 @@
1
+ module NominetEPP
2
+ module Domain
3
+ class Delete < Request
4
+ def initialize(name)
5
+ @command = EPP::Domain::Delete.new(name)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module NominetEPP
2
+ module Domain
3
+ class Info < Request
4
+ def initialize(name)
5
+ @command = EPP::Domain::Info.new(name)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,33 @@
1
+ module NominetEPP
2
+ module Domain
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('domainName', @name)
27
+ node << x_node('registrarTag', @tag)
28
+
29
+ node
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,9 @@
1
+ module NominetEPP
2
+ module Domain
3
+ class Renew < Request
4
+ def initialize(name, exp_date, period = nil)
5
+ @command = EPP::Domain::Renew.new(name, exp_date, period)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,33 @@
1
+ module NominetEPP
2
+ module Domain
3
+ class Unrenew < CustomRequest
4
+ NAMESPACE = 'http://www.nominet.org.uk/epp/xml/std-unrenew-1.0'
5
+
6
+ def initialize(*names)
7
+ @names = names
8
+ end
9
+
10
+ def command_name
11
+ 'update'
12
+ end
13
+ def namespace_name
14
+ 'u'
15
+ end
16
+ def namespace_uri
17
+ NAMESPACE
18
+ end
19
+
20
+ def to_xml
21
+ @namespaces ||= {}
22
+ node = x_node('unrenew')
23
+ x_schemaLocation(node)
24
+
25
+ @names.each do |name|
26
+ node << x_node('domainName', name)
27
+ end
28
+
29
+ node
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,134 @@
1
+ module NominetEPP
2
+ module Domain
3
+ class Update < Request
4
+ def initialize(name, changes = {})
5
+ @name = name
6
+ @namespaces = {}
7
+
8
+ extensions = (changes[:add] || {}).merge(changes[:chg] || {})
9
+ extensions.delete_if { |k,_| !UpdateExtension::KEYS.include?(k) }
10
+
11
+ changes[:add] && changes[:add].delete_if { |k,_| UpdateExtension::KEYS.include?(k) }
12
+ changes[:rem] && changes[:rem].delete_if { |k,_| UpdateExtension::KEYS.include?(k) }
13
+ changes[:chg] && changes[:chg].delete_if { |k,_| UpdateExtension::KEYS.include?(k) }
14
+
15
+ dnssec = {}
16
+ dnssec[:add] = changes[:add] && changes[:add].delete(:ds)
17
+ dnssec[:rem] = changes[:rem] && changes[:rem].delete(:ds)
18
+ dnssec[:chg] = changes[:chg] && changes[:chg].delete(:ds)
19
+
20
+ @domain_ext = UpdateExtension.new(extensions) rescue nil
21
+ @secdns_ext = UpdateSecDNSExtension.new(dnssec) rescue nil
22
+
23
+ @command = EPP::Domain::Update.new(name, changes)
24
+ @extension = EPP::Requests::Extension.new(@domain_ext, @secdns_ext) rescue nil
25
+ end
26
+ end
27
+
28
+ class UpdateExtension < RequestExtension
29
+ KEYS = [:first_bill, :recur_bill, :auto_bill, :next_bill,
30
+ :auto_period, :next_period, :renew_not_required, :notes, :reseller]
31
+
32
+ NAMESPACE = 'http://www.nominet.org.uk/epp/xml/domain-nom-ext-1.2'
33
+
34
+ def initialize(attributes)
35
+ raise ArgumentError, "must provide Hash of #{KEYS.map(&:inspect).join(", ")}" if attributes.nil? || attributes.empty?
36
+ @attributes = attributes
37
+ @namespaces = {}
38
+ end
39
+
40
+ def namespace_uri
41
+ NAMESPACE
42
+ end
43
+ def namespace_name
44
+ 'domain-ext'
45
+ end
46
+
47
+ def to_xml
48
+ node = x_node('update')
49
+ x_schemaLocation(node)
50
+
51
+ KEYS.each do |key|
52
+ value = @attributes[key]
53
+ next if value.nil? || value == ''
54
+
55
+ case key
56
+ when :notes
57
+ Array(value).each do |note|
58
+ node << x_node('notes', note)
59
+ end
60
+ when :renew_not_required
61
+ node << x_node('renew-not-required', value ? 'Y' : 'N')
62
+ else
63
+ name = key.to_s.gsub('_', '-')
64
+ node << x_node(name, value.to_s)
65
+ end
66
+ end
67
+
68
+ node
69
+ end
70
+ end
71
+
72
+ class UpdateSecDNSExtension < RequestExtension
73
+ NAMESPACE = 'urn:ietf:params:xml:ns:secDNS-1.1'
74
+
75
+ def initialize(attributes)
76
+ @add = Array(attributes[:add])
77
+ @rem = Array(attributes[:rem])
78
+ @chg = Array(attributes[:chg])
79
+
80
+ raise ArgumentError, "must provide :add, :rem or :chg keys" if @add.empty? && @rem.empty? && @chg.empty?
81
+
82
+ @namespaces = {}
83
+ end
84
+
85
+ def namespace_uri
86
+ NAMESPACE
87
+ end
88
+ def namespace_name
89
+ 'secDNS'
90
+ end
91
+
92
+ def to_xml
93
+ node = x_node('update')
94
+ x_schemaLocation(node)
95
+
96
+ if @rem[0] == :all || @rem[0] == 'all'
97
+ node << x_node('rem').tap do |n|
98
+ n << x_node('all', 'true')
99
+ end
100
+ elsif !@rem.empty?
101
+ node << x_node('rem').tap do |n|
102
+ @rem.each do |ds|
103
+ n << x_node('dsData').tap do |dsData|
104
+ dsData << x_node('keyTag', ds[:key_tag].to_s)
105
+ dsData << x_node('alg', ds[:alg].to_s)
106
+ dsData << x_node('digestType', ds[:digest_type].to_s)
107
+ dsData << x_node('digest', ds[:digest].gsub(/\s/,''))
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ if @add && !@add.empty?
114
+ node << x_node('add').tap do |n|
115
+ @add.each do |ds|
116
+ n << x_node('dsData').tap do |dsData|
117
+ dsData << x_node('keyTag', ds[:key_tag].to_s)
118
+ dsData << x_node('alg', ds[:alg].to_s)
119
+ dsData << x_node('digestType', ds[:digest_type].to_s)
120
+ dsData << x_node('digest', ds[:digest].gsub(/\s/,''))
121
+ end
122
+ end
123
+ end
124
+ end
125
+
126
+ if @chg && !@chg.empty?
127
+ # Nominet don't support maxSigLife so nothing happens here
128
+ end
129
+
130
+ node
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,9 @@
1
+ module NominetEPP
2
+ module Host
3
+ class Check < Request
4
+ def initialize(*names)
5
+ @command = EPP::Host::Check.new(*names)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module NominetEPP
2
+ module Host
3
+ class Create < Request
4
+ def initialize(name, attributes = {})
5
+ @command = EPP::Host::Create.new(name, attributes)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module NominetEPP
2
+ module Host
3
+ class Delete < Request
4
+ def initialize(name)
5
+ @command = EPP::Host::Delete.new(name)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module NominetEPP
2
+ module Host
3
+ class Info < Request
4
+ def initialize(name)
5
+ @command = EPP::Host::Info.new(name)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module NominetEPP
2
+ module Host
3
+ class Update < Request
4
+ def initialize(name, attributes = {})
5
+ @command = EPP::Host::Update.new(name, attributes)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ module NominetEPP
2
+ module Contact
3
+ class CheckResponse < BasicResponse
4
+ def initialize(response)
5
+ raise ArgumentError, "must be an EPP::Response" unless response.kind_of?(EPP::Response)
6
+ super EPP::Contact::CheckResponse.new(response)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ module NominetEPP
2
+ module Contact
3
+ class CreateResponse < BasicResponse
4
+ def initialize(response)
5
+ raise ArgumentError, "must be an EPP::Response" unless response.kind_of?(EPP::Response)
6
+ super EPP::Contact::CreateResponse.new(response)
7
+ end
8
+
9
+ def name
10
+ @response.id
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ module NominetEPP
2
+ module Contact
3
+ class DeleteResponse < BasicResponse
4
+ def initialize(response)
5
+ raise ArgumentError, "must be an EPP::Response" unless response.kind_of?(EPP::Response)
6
+ super EPP::Contact::DeleteResponse.new(response)
7
+ end
8
+ end
9
+ end
10
+ end