epp-client 0.0.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +24 -0
  3. data/.simplecov +16 -0
  4. data/.travis.yml +11 -0
  5. data/.yardopts +4 -0
  6. data/Gemfile +20 -0
  7. data/Gemfile.lock +51 -0
  8. data/LICENSE +1 -1
  9. data/README.md +75 -0
  10. data/Rakefile +2 -37
  11. data/epp-client.gemspec +15 -58
  12. data/gemfiles/Gemfile.ruby18 +13 -0
  13. data/lib/epp-client.rb +94 -7
  14. data/lib/epp-client/client.rb +117 -20
  15. data/lib/epp-client/commands/check.rb +11 -0
  16. data/lib/epp-client/commands/command.rb +24 -0
  17. data/lib/epp-client/commands/create.rb +11 -0
  18. data/lib/epp-client/commands/delete.rb +11 -0
  19. data/lib/epp-client/commands/info.rb +11 -0
  20. data/lib/epp-client/commands/login.rb +40 -0
  21. data/lib/epp-client/commands/logout.rb +11 -0
  22. data/lib/epp-client/commands/poll.rb +28 -0
  23. data/lib/epp-client/commands/read_write_command.rb +18 -0
  24. data/lib/epp-client/commands/renew.rb +11 -0
  25. data/lib/epp-client/commands/transfer.rb +25 -0
  26. data/lib/epp-client/commands/update.rb +11 -0
  27. data/lib/epp-client/contact/check.rb +23 -0
  28. data/lib/epp-client/contact/check_response.rb +22 -0
  29. data/lib/epp-client/contact/command.rb +87 -0
  30. data/lib/epp-client/contact/create.rb +34 -0
  31. data/lib/epp-client/contact/create_response.rb +14 -0
  32. data/lib/epp-client/contact/delete.rb +21 -0
  33. data/lib/epp-client/contact/delete_response.rb +9 -0
  34. data/lib/epp-client/contact/info.rb +21 -0
  35. data/lib/epp-client/contact/info_response.rb +74 -0
  36. data/lib/epp-client/contact/response.rb +34 -0
  37. data/lib/epp-client/contact/transfer.rb +21 -0
  38. data/lib/epp-client/contact/transfer_response.rb +26 -0
  39. data/lib/epp-client/contact/update.rb +80 -0
  40. data/lib/epp-client/contact/update_response.rb +9 -0
  41. data/lib/epp-client/domain/check.rb +23 -0
  42. data/lib/epp-client/domain/check_response.rb +22 -0
  43. data/lib/epp-client/domain/command.rb +92 -0
  44. data/lib/epp-client/domain/create.rb +49 -0
  45. data/lib/epp-client/domain/create_response.rb +17 -0
  46. data/lib/epp-client/domain/delete.rb +21 -0
  47. data/lib/epp-client/domain/delete_response.rb +9 -0
  48. data/lib/epp-client/domain/info.rb +21 -0
  49. data/lib/epp-client/domain/info_response.rb +66 -0
  50. data/lib/epp-client/domain/renew.rb +34 -0
  51. data/lib/epp-client/domain/renew_response.rb +14 -0
  52. data/lib/epp-client/domain/response.rb +34 -0
  53. data/lib/epp-client/domain/transfer.rb +27 -0
  54. data/lib/epp-client/domain/transfer_response.rb +29 -0
  55. data/lib/epp-client/domain/update.rb +81 -0
  56. data/lib/epp-client/domain/update_response.rb +9 -0
  57. data/lib/epp-client/host/check.rb +23 -0
  58. data/lib/epp-client/host/check_response.rb +22 -0
  59. data/lib/epp-client/host/command.rb +47 -0
  60. data/lib/epp-client/host/create.rb +24 -0
  61. data/lib/epp-client/host/create_response.rb +14 -0
  62. data/lib/epp-client/host/delete.rb +21 -0
  63. data/lib/epp-client/host/delete_response.rb +9 -0
  64. data/lib/epp-client/host/info.rb +21 -0
  65. data/lib/epp-client/host/info_response.rb +42 -0
  66. data/lib/epp-client/host/response.rb +34 -0
  67. data/lib/epp-client/host/update.rb +76 -0
  68. data/lib/epp-client/host/update_response.rb +9 -0
  69. data/lib/epp-client/request.rb +29 -74
  70. data/lib/epp-client/requests/abstract.rb +30 -0
  71. data/lib/epp-client/requests/command.rb +28 -0
  72. data/lib/epp-client/requests/extension.rb +28 -0
  73. data/lib/epp-client/requests/hello.rb +12 -0
  74. data/lib/epp-client/response.rb +45 -8
  75. data/lib/epp-client/response_helper.rb +25 -0
  76. data/lib/epp-client/server.rb +167 -63
  77. data/lib/epp-client/testing.rb +59 -0
  78. data/lib/epp-client/version.rb +3 -0
  79. data/lib/epp-client/xml_helper.rb +71 -0
  80. data/test/commands/test_check_command.rb +33 -0
  81. data/test/commands/test_create_command.rb +53 -0
  82. data/test/commands/test_delete_command.rb +28 -0
  83. data/test/commands/test_info_command.rb +28 -0
  84. data/test/commands/test_login_command.rb +56 -0
  85. data/test/commands/test_logout_command.rb +22 -0
  86. data/test/commands/test_poll_command.rb +54 -0
  87. data/test/commands/test_renew_command.rb +39 -0
  88. data/test/commands/test_transfer_command.rb +37 -0
  89. data/test/commands/test_update_command.rb +60 -0
  90. data/test/contact/test_contact_check.rb +33 -0
  91. data/test/contact/test_contact_check_response.rb +38 -0
  92. data/test/contact/test_contact_create.rb +70 -0
  93. data/test/contact/test_contact_create_response.rb +33 -0
  94. data/test/contact/test_contact_delete.rb +28 -0
  95. data/test/contact/test_contact_delete_response.rb +23 -0
  96. data/test/contact/test_contact_info.rb +28 -0
  97. data/test/contact/test_contact_info_response.rb +100 -0
  98. data/test/contact/test_contact_transfer.rb +28 -0
  99. data/test/contact/test_contact_transfer_response.rb +100 -0
  100. data/test/contact/test_contact_update.rb +83 -0
  101. data/test/contact/test_contact_update_response.rb +23 -0
  102. data/test/domain/test_domain_check.rb +33 -0
  103. data/test/domain/test_domain_check_response.rb +38 -0
  104. data/test/domain/test_domain_create.rb +53 -0
  105. data/test/domain/test_domain_create_response.rb +39 -0
  106. data/test/domain/test_domain_delete.rb +28 -0
  107. data/test/domain/test_domain_delete_response.rb +23 -0
  108. data/test/domain/test_domain_info.rb +28 -0
  109. data/test/domain/test_domain_info_response.rb +107 -0
  110. data/test/domain/test_domain_renew.rb +39 -0
  111. data/test/domain/test_domain_renew_response.rb +32 -0
  112. data/test/domain/test_domain_transfer.rb +37 -0
  113. data/test/domain/test_domain_transfer_response.rb +112 -0
  114. data/test/domain/test_domain_update.rb +73 -0
  115. data/test/domain/test_domain_update_response.rb +23 -0
  116. data/test/fixtures/responses/contact/check.xml +27 -0
  117. data/test/fixtures/responses/contact/create.xml +19 -0
  118. data/test/fixtures/responses/contact/delete.xml +12 -0
  119. data/test/fixtures/responses/contact/info.xml +49 -0
  120. data/test/fixtures/responses/contact/transfer-query.xml +23 -0
  121. data/test/fixtures/responses/contact/transfer-request.xml +23 -0
  122. data/test/fixtures/responses/contact/update.xml +12 -0
  123. data/test/fixtures/responses/domain/check.xml +27 -0
  124. data/test/fixtures/responses/domain/create.xml +20 -0
  125. data/test/fixtures/responses/domain/delete.xml +12 -0
  126. data/test/fixtures/responses/domain/info-no-exDate.xml +38 -0
  127. data/test/fixtures/responses/domain/info.xml +39 -0
  128. data/test/fixtures/responses/domain/renew.xml +19 -0
  129. data/test/fixtures/responses/domain/transfer-query.xml +24 -0
  130. data/test/fixtures/responses/domain/transfer-request.xml +24 -0
  131. data/test/fixtures/responses/domain/update.xml +12 -0
  132. data/test/fixtures/responses/greeting.xml +25 -0
  133. data/test/fixtures/responses/host/check.xml +27 -0
  134. data/test/fixtures/responses/host/create.xml +19 -0
  135. data/test/fixtures/responses/host/delete.xml +12 -0
  136. data/test/fixtures/responses/host/info.xml +30 -0
  137. data/test/fixtures/responses/host/update.xml +12 -0
  138. data/test/helper.rb +89 -0
  139. data/test/host/test_host_check.rb +33 -0
  140. data/test/host/test_host_check_response.rb +38 -0
  141. data/test/host/test_host_create.rb +37 -0
  142. data/test/host/test_host_create_response.rb +33 -0
  143. data/test/host/test_host_delete.rb +28 -0
  144. data/test/host/test_host_delete_response.rb +23 -0
  145. data/test/host/test_host_info.rb +28 -0
  146. data/test/host/test_host_info_response.rb +72 -0
  147. data/test/host/test_host_update.rb +68 -0
  148. data/test/host/test_host_update_response.rb +23 -0
  149. data/test/requests/test_command_request.rb +16 -0
  150. data/test/requests/test_extension_request.rb +55 -0
  151. data/test/requests/test_hello_request.rb +15 -0
  152. data/test/support/schemas/all.xsd +21 -0
  153. data/test/support/schemas/contact-1.0.xsd +387 -0
  154. data/test/support/schemas/domain-1.0.xsd +432 -0
  155. data/test/support/schemas/epp-1.0.xsd +403 -0
  156. data/test/support/schemas/eppcom-1.0.xsd +93 -0
  157. data/test/support/schemas/host-1.0.xsd +240 -0
  158. data/test/test_client.rb +54 -0
  159. data/test/test_request.rb +15 -0
  160. data/test/test_server.rb +57 -0
  161. metadata +270 -91
  162. data/.document +0 -5
  163. data/README.rdoc +0 -17
  164. data/VERSION +0 -1
  165. data/lib/epp-client/hello_request.rb +0 -9
  166. data/test/test_epp-client.rb +0 -7
@@ -0,0 +1,87 @@
1
+ module EPP
2
+ module Contact
3
+ class Command
4
+ include XMLHelpers
5
+ attr_reader :namespaces
6
+
7
+ DISCLOSE_ORDER = ['name', 'org', 'addr', 'voice', 'fax', 'email']
8
+
9
+ def set_namespaces(namespaces)
10
+ @namespaces = namespaces
11
+ end
12
+
13
+ def name
14
+ raise NotImplementedError, "#name must be implemented in subclasses"
15
+ end
16
+
17
+ def to_xml
18
+ @namespaces ||= {}
19
+ node = contact_node(name)
20
+
21
+ xattr = XML::Attr.new(node, "schemaLocation", SCHEMA_LOCATION)
22
+ xattr.namespaces.namespace = @namespaces['xsi'] || XML::Namespace.new(node, 'xsi', 'http://www.w3.org/2001/XMLSchema-instance')
23
+
24
+ node
25
+ end
26
+
27
+ protected
28
+ def contact_node(name, value = nil)
29
+ node = xml_node(name, value)
30
+ node.namespaces.namespace = contact_namespace(node)
31
+ node
32
+ end
33
+ def contact_namespace(node)
34
+ return @namespaces['contact'] if @namespaces.has_key?('contact')
35
+ @namespaces['contact'] = xml_namespace(node, 'contact', NAMESPACE)
36
+ end
37
+
38
+ def postal_info_to_xml(postal_info)
39
+ node = contact_node('postalInfo')
40
+ node['type'] = 'loc'
41
+
42
+ node << contact_node('name', postal_info[:name])
43
+ node << contact_node('org', postal_info[:org]) if postal_info[:org]
44
+ node << addr_to_xml(postal_info[:addr])
45
+
46
+ node
47
+ end
48
+ def addr_to_xml(addr)
49
+ node = contact_node('addr')
50
+
51
+ node << contact_node('street', addr[:street]) if addr[:street]
52
+ node << contact_node('city', addr[:city])
53
+ node << contact_node('sp', addr[:sp]) if addr[:sp]
54
+ node << contact_node('pc', addr[:pc]) if addr[:pc]
55
+ node << contact_node('cc', addr[:cc])
56
+
57
+ node
58
+ end
59
+ def disclose_to_xml(disclose)
60
+ flag = disclose.keys.first
61
+ node = contact_node('disclose')
62
+ node['flag'] = flag
63
+
64
+ DISCLOSE_ORDER.each do |name|
65
+ next unless disclose[flag].include?(name)
66
+ node << n = contact_node(name)
67
+ n['type'] = 'loc' if ['name', 'org', 'addr'].include?(name)
68
+ end
69
+
70
+ node
71
+ end
72
+
73
+ def auth_info_to_xml(auth_info)
74
+ a = contact_node('authInfo')
75
+
76
+ if auth_info.has_key?(:pw)
77
+ a << pw = contact_node('pw', auth_info[:pw])
78
+ pw['roid'] = auth_info[:roid] if auth_info.has_key?(:roid)
79
+ elsif auth_info.has_key?(:ext)
80
+ a << contact_node('ext', auth_info[:ext])
81
+ end
82
+
83
+ a
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,34 @@
1
+ require File.expand_path('../command', __FILE__)
2
+
3
+ module EPP
4
+ module Contact
5
+ class Create < Command
6
+ def initialize(id, options = {})
7
+ @id = id
8
+
9
+ @postal_info = options.delete(:postal_info)
10
+ @voice = options.delete(:voice)
11
+ @fax = options.delete(:fax)
12
+ @email = options.delete(:email)
13
+ @auth_info = options.delete(:auth_info)
14
+ @disclose = options.delete(:disclose)
15
+ end
16
+
17
+ def name
18
+ 'create'
19
+ end
20
+
21
+ def to_xml
22
+ node = super
23
+ node << contact_node('id', @id)
24
+ node << postal_info_to_xml(@postal_info)
25
+ node << contact_node('voice', @voice) if @voice
26
+ node << contact_node('fax', @fax) if @fax
27
+ node << contact_node('email', @email)
28
+ node << auth_info_to_xml(@auth_info)
29
+ node << disclose_to_xml(@disclose) if @disclose
30
+ node
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path('../response', __FILE__)
2
+
3
+ module EPP
4
+ module Contact
5
+ class CreateResponse < Response
6
+ def id
7
+ @id ||= value_for_xpath('//contact:id')
8
+ end
9
+ def creation_date
10
+ @crdate ||= value_for_xpath('//contact:crDate') && Time.parse(value_for_xpath('//contact:crDate'))
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path('../command', __FILE__)
2
+
3
+ module EPP
4
+ module Contact
5
+ class Delete < Command
6
+ def initialize(id)
7
+ @id = id
8
+ end
9
+
10
+ def name
11
+ 'delete'
12
+ end
13
+
14
+ def to_xml
15
+ node = super
16
+ node << contact_node('id', @id)
17
+ node
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ require File.expand_path('../response', __FILE__)
2
+
3
+ module EPP
4
+ module Contact
5
+ class DeleteResponse < Response
6
+
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path('../command', __FILE__)
2
+
3
+ module EPP
4
+ module Contact
5
+ class Info < Command
6
+ def initialize(id)
7
+ @id = id
8
+ end
9
+
10
+ def name
11
+ 'info'
12
+ end
13
+
14
+ def to_xml
15
+ node = super
16
+ node << contact_node('id', @id)
17
+ node
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,74 @@
1
+ require File.expand_path('../response', __FILE__)
2
+
3
+ module EPP
4
+ module Contact
5
+ class InfoResponse < Response
6
+ def id
7
+ @id ||= value_for_xpath('//contact:id')
8
+ end
9
+ def roid
10
+ @roid ||= value_for_xpath('//contact:roid')
11
+ end
12
+ def status
13
+ @status ||= values_for_xpath('//contact:status/@s')
14
+ end
15
+ def email
16
+ @email ||= value_for_xpath('//contact:email')
17
+ end
18
+ def fax
19
+ @fax ||= value_for_xpath('//contact:fax') do |node|
20
+ [node.content.strip, node['x']].compact.join(".")
21
+ end
22
+ end
23
+ def voice
24
+ @voice ||= value_for_xpath('//contact:voice') do |node|
25
+ [node.content.strip, node['x']].compact.join(".")
26
+ end
27
+ end
28
+ def postal_info
29
+ @postal_info ||= {
30
+ :name => value_for_xpath('//contact:postalInfo/contact:name'),
31
+ :org => value_for_xpath('//contact:postalInfo/contact:org'),
32
+ :addr => {
33
+ :street => values_for_xpath('//contact:postalInfo/contact:addr/contact:street').join("\n"),
34
+ :city => value_for_xpath('//contact:postalInfo/contact:addr/contact:city'),
35
+ :sp => value_for_xpath('//contact:postalInfo/contact:addr/contact:sp'),
36
+ :pc => value_for_xpath('//contact:postalInfo/contact:addr/contact:pc'),
37
+ :cc => value_for_xpath('//contact:postalInfo/contact:addr/contact:cc')
38
+ }
39
+ }
40
+ end
41
+ def client_id
42
+ @clid ||= value_for_xpath('//contact:clID')
43
+ end
44
+ def creator_id
45
+ @crid ||= value_for_xpath('//contact:crID')
46
+ end
47
+ def created_date
48
+ @crdate ||= value_for_xpath('//contact:crDate') && Time.parse(value_for_xpath('//contact:crDate'))
49
+ end
50
+ def updator_id
51
+ @upid ||= value_for_xpath('//contact:upID')
52
+ end
53
+ def updated_date
54
+ @update ||= value_for_xpath('//contact:upDate') && Time.parse(value_for_xpath('//contact:upDate'))
55
+ end
56
+ def transfer_date
57
+ @trdate ||= value_for_xpath('//contact:trDate') && Time.parse(value_for_xpath('//contact:trDate'))
58
+ end
59
+ def auth_info
60
+ @auth_info ||= begin
61
+ { 'pw' => value_for_xpath('//contact:authInfo/contact:pw') }
62
+ end
63
+ end
64
+ def disclose
65
+ @disclose ||= begin
66
+ nodes_for_xpath('//contact:disclose').inject({}) do |hash, node|
67
+ hash[node['flag'].to_s] = node.children.reject{|n| n.empty?}.map { |child| child.name }
68
+ hash
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,34 @@
1
+ module EPP
2
+ module Contact
3
+ class Response
4
+ include ResponseHelper
5
+
6
+ def initialize(response)
7
+ @response = response
8
+ end
9
+
10
+ def method_missing(meth, *args, &block)
11
+ return super unless @response.respond_to?(meth)
12
+ @response.send(meth, *args, &block)
13
+ end
14
+
15
+ def respond_to_missing?(method, include_private)
16
+ @response.respond_to?(method, include_private)
17
+ end
18
+
19
+ unless RUBY_VERSION >= "1.9.2"
20
+ def respond_to?(method, include_private = false)
21
+ respond_to_missing?(method, include_private) || super
22
+ end
23
+ def method(sym)
24
+ respond_to_missing?(sym, true) ? @response.method(sym) : super
25
+ end
26
+ end
27
+
28
+ protected
29
+ def namespaces
30
+ {'contact' => NAMESPACE}
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path('../command', __FILE__)
2
+
3
+ module EPP
4
+ module Contact
5
+ class Transfer < Command
6
+ def initialize(id)
7
+ @id = id
8
+ end
9
+
10
+ def name
11
+ 'transfer'
12
+ end
13
+
14
+ def to_xml
15
+ node = super
16
+ node << contact_node('id', @id)
17
+ node
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,26 @@
1
+ require File.expand_path('../response', __FILE__)
2
+
3
+ module EPP
4
+ module Contact
5
+ class TransferResponse < Response
6
+ def id
7
+ @id ||= value_for_xpath('//contact:id')
8
+ end
9
+ def status
10
+ @trStatus ||= value_for_xpath('//contact:trStatus')
11
+ end
12
+ def requested_id
13
+ @reID ||= value_for_xpath('//contact:reID')
14
+ end
15
+ def requested_date
16
+ @reDate ||= value_for_xpath('//contact:reDate') && Time.parse(value_for_xpath('//contact:reDate'))
17
+ end
18
+ def action_id
19
+ @acID ||= value_for_xpath('//contact:acID')
20
+ end
21
+ def action_date
22
+ @acDate ||= value_for_xpath('//contact:acDate') && Time.parse(value_for_xpath('//contact:acDate'))
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,80 @@
1
+ require File.expand_path('../command', __FILE__)
2
+
3
+ module EPP
4
+ module Contact
5
+ class Update < Command
6
+ ADD_REM_ORDER = [:status]
7
+ CHG_ORDER = [:postal_info, :voice, :fax, :email, :auth_info, :disclose]
8
+
9
+ # @option [Hash] :status A Hash of status value to text. Text may optionally be an array in the form ["Text", "lang"] if a custom language value needs to be set.
10
+ def initialize(id, options = {})
11
+ @id = id
12
+ @add = options.delete(:add) || {}
13
+ @rem = options.delete(:rem) || {}
14
+ @chg = options.delete(:chg) || {}
15
+
16
+ @add.delete_if { |k,_| !ADD_REM_ORDER.include?(k) }
17
+ @rem.delete_if { |k,_| !ADD_REM_ORDER.include?(k) }
18
+ @chg.delete_if { |k,_| !CHG_ORDER.include?(k) }
19
+ end
20
+
21
+ def name
22
+ 'update'
23
+ end
24
+
25
+ def to_xml
26
+ node = super
27
+ node << contact_node('id', @id)
28
+
29
+ unless @add.empty?
30
+ node << add = contact_node('add')
31
+ add_rem_to_xml(add, @add)
32
+ end
33
+
34
+ unless @rem.empty?
35
+ node << rem = contact_node('rem')
36
+ add_rem_to_xml(rem, @rem)
37
+ end
38
+
39
+ unless @chg.empty?
40
+ node << chg = contact_node('chg')
41
+ CHG_ORDER.each do |key|
42
+ value = @chg[key]
43
+ next if value.nil? || value.empty?
44
+
45
+ case key
46
+ when :postal_info
47
+ chg << postal_info_to_xml(value)
48
+ when :auth_info
49
+ chg << auth_info_to_xml(value)
50
+ when :disclose
51
+ chg << disclose_to_xml(value)
52
+ when :voice, :fax, :email
53
+ chg << contact_node(key.to_s, value)
54
+ end
55
+ end
56
+ end
57
+
58
+ node
59
+ end
60
+
61
+ protected
62
+ def add_rem_to_xml(node, hash)
63
+ ADD_REM_ORDER.each do |key|
64
+ value = hash[key]
65
+ next if value.nil? || value.empty?
66
+
67
+ case key
68
+ when :status
69
+ value.each do |status, text|
70
+ text, lang = Array(text)
71
+ node << s = contact_node('status', text)
72
+ s['lang'] = lang if lang
73
+ s['s'] = status.to_s
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,9 @@
1
+ require File.expand_path('../response', __FILE__)
2
+
3
+ module EPP
4
+ module Contact
5
+ class UpdateResponse < Response
6
+
7
+ end
8
+ end
9
+ end