kono_epp_client 0.0.2 → 0.1.0

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 (47) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +2 -0
  3. data/lib/epp/epp_command/check_contacts.rb +17 -0
  4. data/lib/epp/epp_command/create_contact.rb +87 -0
  5. data/lib/epp/epp_command/create_domain.rb +44 -0
  6. data/lib/epp/epp_command/delete_contact.rb +15 -0
  7. data/lib/epp/epp_command/delete_domain.rb +14 -0
  8. data/lib/epp/epp_command/hello.rb +13 -0
  9. data/lib/epp/epp_command/info_contact.rb +15 -0
  10. data/lib/epp/epp_command/info_domain.rb +14 -0
  11. data/lib/epp/epp_command/kono_epp_check_domains.rb +18 -0
  12. data/lib/epp/epp_command/login.rb +79 -0
  13. data/lib/epp/epp_command/logout.rb +10 -0
  14. data/lib/epp/epp_command/poll.rb +16 -0
  15. data/lib/epp/epp_command/transfer_domain.rb +36 -0
  16. data/lib/epp/epp_command/update_contact.rb +115 -0
  17. data/lib/epp/epp_command/update_domain.rb +104 -0
  18. data/lib/epp/epp_command.rb +15 -0
  19. data/lib/epp/exceptions.rb +28 -0
  20. data/lib/epp/server.rb +295 -0
  21. data/lib/epp/transport/http.rb +71 -0
  22. data/lib/epp/transport/tcp.rb +93 -0
  23. data/lib/epp/transport.rb +13 -0
  24. data/lib/kono_epp_client.rb +5 -14
  25. data/lib/require_parameters.rb +14 -0
  26. data/spec/epp/epp_command/kono_epp_check_contacts_spec.rb +25 -0
  27. data/spec/epp/epp_command/kono_epp_check_domains_spec.rb +16 -0
  28. data/spec/epp/epp_command/kono_epp_create_domain_spec.rb +37 -0
  29. data/spec/epp/epp_command/kono_epp_transfer_domain_spec.rb +33 -0
  30. data/spec/epp/epp_command/kono_epp_update_domain_spec.rb +125 -0
  31. data/spec/epp/kono_epp_command_spec.rb +16 -0
  32. data/spec/fixtures/snapshots/kono_epp_check_contacts/_construct.xml.snap +13 -0
  33. data/spec/fixtures/snapshots/kono_epp_check_domains/_construct.xml.snap +11 -0
  34. data/spec/fixtures/snapshots/kono_epp_create_domain/_create.xml.snap +29 -0
  35. data/spec/fixtures/snapshots/kono_epp_transfer_domain/_con_extension_construct.xml.snap +23 -0
  36. data/spec/fixtures/snapshots/kono_epp_transfer_domain/_construct.xml.snap +13 -0
  37. data/spec/fixtures/snapshots/kono_epp_update_domain/_restore_esiste_l'estensione_di_restore.xml.snap +15 -0
  38. data/spec/fixtures/snapshots/kono_epp_update_domain/_update_auth_info_cambia_AUTH_INFO.xml.snap +15 -0
  39. data/spec/fixtures/snapshots/kono_epp_update_domain/_update_auth_info_con_nuovo_registrant_cambia_REGISTRANT.xml.snap +16 -0
  40. data/spec/fixtures/snapshots/kono_epp_update_domain/_update_contacts_cambia_ADMIN_TECH.xml.snap +18 -0
  41. data/spec/fixtures/snapshots/kono_epp_update_domain/_update_nameservers_aggiunge_e_rimuove_ns.xml.snap +28 -0
  42. data/spec/fixtures/snapshots/kono_epp_update_domain/_update_status_cambia_status.xml.snap +16 -0
  43. data/spec/spec_helper.rb +111 -0
  44. data/spec/support/context.rb +15 -0
  45. data/spec/support/matchers.rb +6 -0
  46. data/spec/support/snapshot.rb +20 -0
  47. metadata +157 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 9c73e951c49f6a622590103b3359eb73b94f7534
4
- data.tar.gz: 987a223e10b4e7c57c325e66c559d64780502971
2
+ SHA256:
3
+ metadata.gz: 8a4bd5d2aace0903e87fdb0dfa0e5c0b6d6c5252bc174536eeae420c07334197
4
+ data.tar.gz: e40f8a2a045e31022ab9dcf011e9a5b6eb03f89f798054e9b6d096263583cce8
5
5
  SHA512:
6
- metadata.gz: 31994158d73ee50067dc702f35f9fb3a2519023f3dcbf84dfd471ad9af84bc9d83277005ab98c2a5ff5601d847b31159e6cc4ad5feec6bf06727e3a3113d330e
7
- data.tar.gz: de2d01f1a0a142d05059ebfcdda1855d7095ba2f5fa5cd349d94493a55e0c315315e01d024dbc47992c1c3f7909ae64564992885e93671a8d1f2afb40e4d2723
6
+ metadata.gz: c13b257e76b8e742e42f6636e00c9b138ccedabedb26f96dfadcc68ab9b3b7f535258c27789aaa5a803e2265dec08ace2ad9bd4abf2791dbfb4080207c4fd393
7
+ data.tar.gz: e782dd2e967c202cc9e85c37e0ecc7befc605d4a77f3b83c86878dc3a002433c99cb70441a5cf81e15b631fa8433bf9e534f60a86f4c06bacb7679b14a57ce66
data/README.md ADDED
@@ -0,0 +1,2 @@
1
+ # kono_epp_client
2
+ A simple EPP Client
@@ -0,0 +1,17 @@
1
+ class KonoEppCheckContacts < KonoEppCommand
2
+ def initialize(ids)
3
+ super(nil, nil)
4
+
5
+ command = root.elements['command']
6
+
7
+ info = command.add_element "check"
8
+
9
+ contact_check = info.add_element("contact:check", {"xmlns:contact" => "urn:ietf:params:xml:ns:contact-1.0"})
10
+
11
+ ids.each do |t|
12
+ contact_id = contact_check.add_element "contact:id"
13
+ contact_id.text = t
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,87 @@
1
+ class KonoEppCreateContact < KonoEppCommand
2
+ def initialize( options )
3
+ super( nil, nil )
4
+
5
+ command = root.elements['command']
6
+
7
+ create = command.add_element "create"
8
+
9
+ contact_create = create.add_element( "contact:create", { "xmlns:contact" => "urn:ietf:params:xml:ns:contact-1.0",
10
+ "xsi:schemaLocation" => "urn:ietf:params:xml:ns:contact-1.0 contact-1.0.xsd" } )
11
+
12
+ puts options
13
+ id = contact_create.add_element "contact:id"
14
+ id.text = options[:id]
15
+
16
+ postal_info = contact_create.add_element "contact:postalInfo", { "type" => "loc" }
17
+
18
+ name = postal_info.add_element "contact:name"
19
+ name.text = options[:name]
20
+
21
+ unless options[:organization].blank?
22
+ organization = postal_info.add_element "contact:org"
23
+ organization.text = options[:organization]
24
+ end
25
+
26
+ addr = postal_info.add_element "contact:addr"
27
+
28
+ unless options[:street].blank?
29
+ street = addr.add_element "contact:street"
30
+ street.text = options[:street]
31
+ end
32
+
33
+ city = addr.add_element "contact:city"
34
+ city.text = options[:city]
35
+
36
+ unless options[:state].blank?
37
+ state = addr.add_element "contact:sp"
38
+ state.text = options[:state]
39
+ end
40
+
41
+ unless options[:postal_code].blank?
42
+ postal_code = addr.add_element "contact:pc"
43
+ postal_code.text = options[:postal_code]
44
+ end
45
+
46
+ country_code = addr.add_element "contact:cc"
47
+ country_code.text = options[:country_code]
48
+
49
+ if options[:voice]
50
+ voice = contact_create.add_element "contact:voice"
51
+ voice.text = options[:voice]
52
+ end
53
+
54
+ if options[:fax]
55
+ fax = contact_create.add_element "contact:fax"
56
+ fax.text = options[:fax]
57
+ end
58
+
59
+ email = contact_create.add_element "contact:email"
60
+ email.text = options[:email]
61
+
62
+ auth_info = contact_create.add_element "contact:authInfo"
63
+ pw = auth_info.add_element "contact:pw"
64
+ pw.text = options[:auth_info]
65
+
66
+ # FIXME
67
+ extension = command.add_element "extension"
68
+ extension_create = extension.add_element "extcon:create", { "xmlns:extcon" => 'http://www.nic.it/ITNIC-EPP/extcon-1.0',
69
+ "xsi:schemaLocation" => 'http://www.nic.it/ITNIC-EPP/extcon-1.0 extcon-1.0.xsd' }
70
+
71
+ publish = extension_create.add_element "extcon:consentForPublishing"
72
+ publish.text = options[:publish] == "1" ? "true" : "false"
73
+
74
+ if options[:is_registrant]
75
+ extcon_registrant = extension_create.add_element "extcon:registrant"
76
+
77
+ extcon_nationality = extcon_registrant.add_element "extcon:nationalityCode"
78
+ extcon_nationality.text = options[:nationality]
79
+
80
+ extcon_entity = extcon_registrant.add_element "extcon:entityType"
81
+ extcon_entity.text = options[:entity_type]
82
+
83
+ extcon_regcode = extcon_registrant.add_element "extcon:regCode"
84
+ extcon_regcode.text = options[:reg_code]
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,44 @@
1
+ class KonoEppCreateDomain < KonoEppCommand
2
+ def initialize( options )
3
+ super( nil, nil )
4
+
5
+ command = root.elements['command']
6
+ create = command.add_element( "create" )
7
+
8
+
9
+ domain_create = create.add_element( "domain:create", { "xmlns:domain" => "urn:ietf:params:xml:ns:domain-1.0",
10
+ "xsi:schemaLocation" => "urn:ietf:params:xml:ns:domain-1.0 domain-1.0.xsd" } )
11
+
12
+ name = domain_create.add_element "domain:name"
13
+ name.text = options[:name]
14
+
15
+ domain_ns = domain_create.add_element "domain:ns"
16
+
17
+ options[:nameservers].each do |ns|
18
+ host_attr = domain_ns.add_element "domain:hostAttr"
19
+ host_name = host_attr.add_element "domain:hostName"
20
+
21
+ host_name.text = ns[0]
22
+
23
+ # FIXME IPv6
24
+ if ns[1]
25
+ host_addr = host_attr.add_element "domain:hostAddr", {"ip" => "v4"}
26
+ host_addr.text = ns[1]
27
+ end
28
+ end
29
+
30
+ domain_registrant = domain_create.add_element "domain:registrant"
31
+ domain_registrant.text = options[:registrant]
32
+
33
+ domain_contact = domain_create.add_element "domain:contact", { "type" => "admin" }
34
+ domain_contact.text = options[:admin]
35
+
36
+ domain_contact = domain_create.add_element "domain:contact", { "type" => "tech" }
37
+ domain_contact.text = options[:tech]
38
+
39
+ domain_authinfo = domain_create.add_element "domain:authInfo"
40
+
41
+ domain_pw = domain_authinfo.add_element "domain:pw"
42
+ domain_pw.text = options[:authinfo]
43
+ end
44
+ end
@@ -0,0 +1,15 @@
1
+ class KonoEppDeleteContact < KonoEppCommand
2
+ def initialize( id )
3
+ super( nil, nil )
4
+
5
+ command = root.elements['command']
6
+
7
+ delete = command.add_element "delete"
8
+
9
+ contact_delete = delete.add_element( "contact:delete", { "xmlns:contact" => "urn:ietf:params:xml:ns:contact-1.0",
10
+ "xsi:schemaLocation" => "urn:ietf:params:xml:ns:contact-1.0 contact-1.0.xsd" } )
11
+
12
+ contact_id = contact_delete.add_element "contact:id"
13
+ contact_id.text = id
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ class KonoEppDeleteDomain < KonoEppCommand
2
+ def initialize( name )
3
+ super( nil, nil )
4
+
5
+ command = root.elements['command']
6
+ delete = command.add_element( "delete" )
7
+
8
+ domain_delete = delete.add_element( "domain:delete", { "xmlns:domain" => "urn:ietf:params:xml:ns:domain-1.0",
9
+ "xsi:schemaLocation" => "urn:ietf:params:xml:ns:domain-1.0 domain-1.0.xsd" } )
10
+
11
+ domain_name = domain_delete.add_element "domain:name"
12
+ domain_name.text = name
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ class KonoEppHello < REXML::Document
2
+ def initialize
3
+ super
4
+
5
+ add( XMLDecl.new( "1.0", "UTF-8", "no" ) )
6
+
7
+ epp = add_element( "epp", { "xmlns" => "urn:ietf:params:xml:ns:epp-1.0",
8
+ "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
9
+ "xsi:schemaLocation" => "urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd" } )
10
+
11
+ epp.add_element( "hello" )
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ class KonoEppInfoContact < KonoEppCommand
2
+ def initialize( id )
3
+ super( nil, nil )
4
+
5
+ command = root.elements['command']
6
+
7
+ info = command.add_element "info"
8
+
9
+ contact_info = info.add_element( "contact:info", { "xmlns:contact" => "urn:ietf:params:xml:ns:contact-1.0",
10
+ "xsi:schemaLocation" => "urn:ietf:params:xml:ns:contact-1.0 contact-1.0.xsd" } )
11
+
12
+ contact_id = contact_info.add_element "contact:id"
13
+ contact_id.text = id
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ class KonoEppInfoDomain < KonoEppCommand
2
+ def initialize( name )
3
+ super( nil, nil )
4
+
5
+ command = root.elements['command']
6
+ info = command.add_element( "info" )
7
+
8
+ domain_info = info.add_element( "domain:info", { "xmlns:domain" => "urn:ietf:params:xml:ns:domain-1.0",
9
+ "xsi:schemaLocation" => "urn:ietf:params:xml:ns:domain-1.0 domain-1.0.xsd" } )
10
+
11
+ domain_name = domain_info.add_element "domain:name", { "hosts" => "all" }
12
+ domain_name.text = name
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ class KonoEppCheckDomains < KonoEppCommand
4
+ def initialize( *domains )
5
+ super( nil, nil )
6
+
7
+ command = root.elements['command']
8
+ check = command.add_element( "check" )
9
+
10
+ domain_check = check.add_element( "domain:check", { "xmlns:domain" => "urn:ietf:params:xml:ns:domain-1.0",
11
+ "xsi:schemaLocation" => "urn:ietf:params:xml:ns:domain-1.0 domain-1.0.xsd" } )
12
+
13
+ domains.each do |d|
14
+ domain_name = domain_check.add_element "domain:name"
15
+ domain_name.text = d
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,79 @@
1
+ class KonoEppLogin < KonoEppCommand
2
+ def initialize( id = nil, password = nil )
3
+ super( nil, nil )
4
+
5
+ @command = root.elements['command']
6
+ @login = @command.add_element( "login" )
7
+
8
+ @login.add_element( "clID" ).text = id if id
9
+ @login.add_element( "pw" ).text = password if password
10
+
11
+ @command.add_element( "clTRID" ).text = "ABC-12345"
12
+ end
13
+
14
+ def version=( value )
15
+ @options = @login.add_element( "options" ) unless @options
16
+ @options.add_element( "version") unless @options.elements['version']
17
+
18
+ @options.elements['version'].text = value
19
+ end
20
+
21
+ def version
22
+ version = @options.elements['version']
23
+
24
+ version.text if version
25
+ end
26
+
27
+ def lang=( value )
28
+ @options = @login.add_element( "options" ) unless @options
29
+ @options.add_element( "lang") unless @options.elements['lang']
30
+
31
+ @options.elements['lang'].text = value
32
+ end
33
+
34
+ def lang
35
+ lang = @options.elements['lang']
36
+
37
+ lang.text if version
38
+ end
39
+
40
+ def new_password=( value )
41
+ newpw = @login.add_element( "newPW" )
42
+ newpw.text = value
43
+ end
44
+
45
+ def services=( services )
46
+ svcs = @login.add_element( "svcs" ) unless @login.elements['svcs']
47
+ services.each {|service| svcs.add_element("objURI").text = service }
48
+ end
49
+
50
+ def services
51
+ svcs = @login.elements['svcs']
52
+
53
+ res = []
54
+ svcs.elements.each( "objURI" ) { |obj| res << obj.text } if svcs
55
+
56
+ return res
57
+ end
58
+
59
+ def extensions=( extensions )
60
+ svcs = @login.elements['svcs']
61
+
62
+ svcs = @login.add_element( "svcs" ) unless svcs
63
+
64
+ # Include schema extensions for registrars which require it
65
+ extensions_container = svcs.add_element("svcExtension") unless extensions.empty?
66
+
67
+ for uri in extensions
68
+ extensions_container.add_element("extURI").text = uri
69
+ end
70
+ end
71
+
72
+ def extensions
73
+ svc_extension = @login.elements['svcs/svcExtension']
74
+
75
+ svc_extension.elements.each( "extURI" ) { |obj| res << obj.text } if svcs_extension
76
+
77
+ return res
78
+ end
79
+ end
@@ -0,0 +1,10 @@
1
+ class KonoEppLogout < KonoEppCommand
2
+ def initialize( id = nil, password = nil )
3
+ super( nil, nil )
4
+
5
+ command = root.elements['command']
6
+ command.add_element( "logout" )
7
+
8
+ command.add_element( "clTRID" ).text = "ABC-12345"
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ class KonoEppPoll < KonoEppCommand
2
+ def initialize( op = :req )
3
+ super( nil, nil )
4
+
5
+ command = root.elements['command']
6
+ poll = command.add_element( "poll" )
7
+
8
+ poll.add_attribute( "op", op.to_s )
9
+ end
10
+
11
+ def ack_id=( id )
12
+ poll = root.elements['command/poll']
13
+
14
+ poll.add_attribute( "msgID", id )
15
+ end
16
+ end
@@ -0,0 +1,36 @@
1
+ class KonoEppTransferDomain < KonoEppCommand
2
+ def initialize(name, authinfo, op, extension: nil)
3
+ super(nil, nil)
4
+
5
+ command = root.elements['command']
6
+ transfer = command.add_element("transfer", {"op" => op})
7
+ # FIXME dovremmo controllare che le possibili opzioni di OP sono 'request', 'cancel', 'approve', 'reject', 'query'
8
+
9
+ domain_transfer = transfer.add_element("domain:transfer", {"xmlns:domain" => "urn:ietf:params:xml:ns:domain-1.0",
10
+ "xsi:schemaLocation" => "urn:ietf:params:xml:ns:domain-1.0 domain-1.0.xsd"})
11
+
12
+ domain_name = domain_transfer.add_element "domain:name"
13
+ domain_name.text = name
14
+
15
+ domain_authinfo = domain_transfer.add_element "domain:authInfo"
16
+ domain_pw = domain_authinfo.add_element "domain:pw"
17
+
18
+ domain_pw.text = authinfo
19
+
20
+ ## Questa estensione è per Modifica del Registrar con contestuale modifica del Registrante
21
+ if extension
22
+
23
+ ext_elm = command.add_element "extension"
24
+ ext_trade = ext_elm.add_element "extdom:trade", {"xmlns:extdom"=>"http://www.nic.it/ITNIC-EPP/extdom-2.0",
25
+ "xsi:schemaLocation" => "http://www.nic.it/ITNIC-EPP/extdom-2.0 extdom-2.0.xsd"}
26
+
27
+ transfer_trade = ext_trade.add_element "extdom:transferTrade"
28
+ transfer_trade.add_element("extdom:newRegistrant").text = extension[:new_registrant] if extension[:new_registrant]
29
+ if extension[:new_auth_info]
30
+ transfer_trade.add_element("extdom:newAuthInfo").add_element("extdom:pw").tap{|x|x.text=extension[:new_auth_info]}
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,115 @@
1
+ class KonoEppUpdateContact < KonoEppCommand
2
+
3
+ # TODO: Add and remove fields
4
+ def initialize( options )
5
+ super( nil, nil )
6
+
7
+ command = root.elements['command']
8
+
9
+ update = command.add_element "update"
10
+
11
+ contact_update = update.add_element( "contact:update", { "xmlns:contact" => "urn:ietf:params:xml:ns:contact-1.0",
12
+ "xsi:schemaLocation" => "urn:ietf:params:xml:ns:contact-1.0 contact-1.0.xsd" } )
13
+
14
+ id = contact_update.add_element "contact:id"
15
+ id.text = options[:id]
16
+
17
+ contact_chg = contact_update.add_element "contact:chg"
18
+
19
+ unless options[:name].blank? \
20
+ and options[:organization].blank? \
21
+ and options[:address].blank? \
22
+ and options[:city].blank? \
23
+ and options[:state].blank? \
24
+ and options[:postal_code].blank? \
25
+ and options[:country].blank?
26
+
27
+ postal_info = contact_chg.add_element "contact:postalInfo", { "type" => "loc" }
28
+
29
+ unless options[:name].blank?
30
+ name = postal_info.add_element "contact:name"
31
+ name.text = options[:name]
32
+ end
33
+
34
+ unless options[:organization].blank?
35
+ organization = postal_info.add_element "contact:org"
36
+ organization.text = options[:organization]
37
+ end
38
+
39
+ # NOTE: city and country are REQUIRED
40
+ unless options[:address].blank? \
41
+ and options[:city].blank? \
42
+ and options[:state].blank? \
43
+ and options[:postal_code].blank? \
44
+ and options[:country].blank?
45
+
46
+ addr = postal_info.add_element "contact:addr"
47
+
48
+ unless options[:address].blank?
49
+ street = addr.add_element "contact:street"
50
+ street.text = options[:address]
51
+ end
52
+
53
+ city = addr.add_element "contact:city"
54
+ city.text = options[:city]
55
+
56
+ unless options[:state].blank?
57
+ state = addr.add_element "contact:sp"
58
+ state.text = options[:state]
59
+ end
60
+
61
+ unless options[:postal_code].blank?
62
+ postal_code = addr.add_element "contact:pc"
63
+ postal_code.text = options[:postal_code]
64
+ end
65
+
66
+ country_code = addr.add_element "contact:cc"
67
+ country_code.text = options[:country]
68
+ end
69
+ end
70
+
71
+ if options[:voice]
72
+ voice = contact_chg.add_element "contact:voice"
73
+ voice.text = options[:voice]
74
+ end
75
+
76
+ if options[:fax]
77
+ fax = contact_chg.add_element "contact:fax"
78
+ fax.text = options[:fax]
79
+ end
80
+
81
+ if options[:email]
82
+ email = contact_chg.add_element "contact:email"
83
+ email.text = options[:email]
84
+ end
85
+
86
+
87
+ unless not options.has_key?( :publish ) \
88
+ and options[:nationality].blank? \
89
+ and options[:entity_type].blank? \
90
+ and options[:reg_code].blank?
91
+
92
+ # FIXME
93
+ extension = command.add_element "extension"
94
+ extension_update = extension.add_element "extcon:update", { "xmlns:extcon" => 'http://www.nic.it/ITNIC-EPP/extcon-1.0',
95
+ "xsi:schemaLocation" => 'http://www.nic.it/ITNIC-EPP/extcon-1.0 extcon-1.0.xsd' }
96
+ if options.has_key?( :publish )
97
+ publish = extension_update.add_element "extcon:consentForPublishing"
98
+ publish.text = options[:publish]
99
+ end
100
+
101
+ if options[:becomes_registrant]
102
+ extcon_registrant = extension_update.add_element "extcon:registrant"
103
+
104
+ extcon_nationality = extcon_registrant.add_element "extcon:nationalityCode"
105
+ extcon_nationality.text = options[:nationality]
106
+
107
+ extcon_entity = extcon_registrant.add_element "extcon:entityType"
108
+ extcon_entity.text = options[:entity_type]
109
+
110
+ extcon_regcode = extcon_registrant.add_element "extcon:regCode"
111
+ extcon_regcode.text = options[:reg_code]
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,104 @@
1
+ class KonoEppUpdateDomain < KonoEppCommand
2
+ def initialize(options)
3
+ super(nil, nil)
4
+
5
+ command = root.elements['command']
6
+ update = command.add_element("update")
7
+
8
+ domain_update = update.add_element("domain:update", {"xmlns:domain" => "urn:ietf:params:xml:ns:domain-1.0",
9
+ "xsi:schemaLocation" => "urn:ietf:params:xml:ns:domain-1.0 domain-1.0.xsd"})
10
+
11
+ name = domain_update.add_element "domain:name"
12
+ name.text = options[:name]
13
+
14
+ if not options[:add_nameservers].blank? or options[:add_admin] or options[:add_tech] or options[:add_status]
15
+ # <domain:add>
16
+ domain_add = domain_update.add_element "domain:add"
17
+
18
+ unless options[:add_nameservers].blank?
19
+ domain_add_ns = domain_add.add_element "domain:ns"
20
+
21
+ options[:add_nameservers].each do |ns|
22
+ host_attr = domain_add_ns.add_element "domain:hostAttr"
23
+ host_name = host_attr.add_element "domain:hostName"
24
+
25
+ host_name.text = ns[0]
26
+
27
+ # FIXME IPv6
28
+ if ns[1]
29
+ host_addr = host_attr.add_element "domain:hostAddr", {"ip" => "v4"}
30
+ host_addr.text = ns[1]
31
+ end
32
+ end
33
+ end
34
+
35
+ if options[:add_admin]
36
+ domain_contact = domain_add.add_element "domain:contact", {"type" => "admin"}
37
+ domain_contact.text = options[:add_admin]
38
+ end
39
+
40
+ if options[:add_status]
41
+ domain_add.add_element "domain:status", {"s" => options[:add_status]}
42
+ end
43
+
44
+ if options[:add_tech]
45
+ domain_contact = domain_add.add_element "domain:contact", {"type" => "tech"}
46
+ domain_contact.text = options[:add_tech]
47
+ end
48
+ end
49
+
50
+ if not options[:remove_nameservers].blank? or options[:remove_admin] or options[:remove_tech] or options[:remove_status]
51
+ # <domain:rem>
52
+ domain_remove = domain_update.add_element "domain:rem"
53
+
54
+ unless options[:remove_nameservers].blank?
55
+ domain_remove_ns = domain_remove.add_element "domain:ns"
56
+
57
+ options[:remove_nameservers].each do |ns_name|
58
+ host_attr = domain_remove_ns.add_element "domain:hostAttr"
59
+ host_name = host_attr.add_element "domain:hostName"
60
+
61
+ host_name.text = ns_name
62
+ end
63
+ end
64
+
65
+ if options[:remove_admin]
66
+ domain_contact = domain_remove.add_element "domain:contact", {"type" => "admin"}
67
+ domain_contact.text = options[:remove_admin]
68
+ end
69
+
70
+ if options[:remove_status]
71
+ domain_remove.add_element "domain:status", {"s" => options[:remove_status]}
72
+ end
73
+
74
+ if options[:remove_tech]
75
+ domain_contact = domain_remove.add_element "domain:contact", {"type" => "tech"}
76
+ domain_contact.text = options[:remove_tech]
77
+ end
78
+ end
79
+
80
+ # <domain:chg>
81
+ if options[:auth_info]
82
+ domain_change = domain_update.add_element "domain:chg"
83
+
84
+ if options[:registrant]
85
+ domain_registrant = domain_change.add_element "domain:registrant"
86
+ domain_registrant.text = options[:registrant]
87
+ end
88
+
89
+ domain_authinfo = domain_change.add_element "domain:authInfo"
90
+
91
+ domain_pw = domain_authinfo.add_element "domain:pw"
92
+ domain_pw.text = options[:auth_info]
93
+ end
94
+
95
+ if options[:restore]
96
+ command.add_element("extension").tap do |ext|
97
+ ext.add_element("rgp:update", {"xmlns:rgp"=>"urn:ietf:params:xml:ns:rgp-1.0",
98
+ "xsi:schemaLocation"=>"urn:ietf:params:xml:ns:rgp-1.0 rgp-1.0.xsd"}).
99
+ add_element("rgp:restore", {"op"=> "request"})
100
+ end
101
+ end
102
+ # TODO: Registrant
103
+ end
104
+ end
@@ -0,0 +1,15 @@
1
+ include REXML
2
+
3
+ class KonoEppCommand < REXML::Document
4
+ def initialize( source = nil, context = nil )
5
+ super( source, context )
6
+
7
+ add( XMLDecl.new( "1.0", "UTF-8", "no" ) )
8
+
9
+ epp = add_element( "epp", { "xmlns" => "urn:ietf:params:xml:ns:epp-1.0",
10
+ "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
11
+ "xsi:schemaLocation" => "urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd" } )
12
+
13
+ epp.add_element( "command" )
14
+ end
15
+ end
@@ -0,0 +1,28 @@
1
+ class KonoEppErrorResponse < StandardError #:nodoc:
2
+ attr_accessor :response_xml, :response_code, :reason_code, :message
3
+
4
+ # Generic EPP exception. Accepts a response code and a message
5
+ def initialize(attributes = {})
6
+ @response_xml = attributes[:xml]
7
+ @response_code = attributes[:response_code]
8
+ @reason_code = attributes[:reason_code]
9
+ @message = attributes[:message]
10
+ end
11
+
12
+ def to_s
13
+ "#{@message} (reason: #{@reason_code} code: #{@response_code})"
14
+ end
15
+ end
16
+
17
+ class KonoEppAuthenticationPasswordExpired < KonoEppErrorResponse ; end
18
+ class KonoEppLoginNeeded < KonoEppErrorResponse ; end
19
+
20
+ ##
21
+ # Errore NIC:
22
+ # 2304=Object status prohibits operation 9022=Domain has status clientTransferProhibited
23
+ class KonoEppDomainHasStatusCliTransProhibited < KonoEppErrorResponse; end
24
+
25
+ ##
26
+ # Errore NIC:
27
+ # 2304=Object status prohibits operation 9026=Domain has status clientUpdateProhibited
28
+ class KonoEppDomainHasStatusClientUpdateProhibited < KonoEppErrorResponse; end