kono_epp_client 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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