kono_epp_client 0.0.3 → 0.1.1

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 (40) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +17 -0
  3. data/README.md +16 -0
  4. data/Rakefile +6 -0
  5. data/kono_epp_client.gemspec +39 -0
  6. data/lib/epp/epp_command/check_contacts.rb +17 -0
  7. data/lib/epp/epp_command/create_domain.rb +4 -2
  8. data/lib/epp/epp_command/kono_epp_check_domains.rb +18 -0
  9. data/lib/epp/epp_command/transfer_domain.rb +22 -5
  10. data/lib/epp/epp_command/update_domain.rb +60 -44
  11. data/lib/epp/exceptions.rb +10 -0
  12. data/lib/epp/server.rb +116 -84
  13. data/lib/epp/transport/http.rb +10 -5
  14. data/lib/kono_epp_client/VERSION +1 -0
  15. data/lib/kono_epp_client/version.rb +3 -0
  16. data/lib/kono_epp_client.rb +5 -14
  17. data/spec/epp/epp_command/kono_epp_check_contacts_spec.rb +25 -0
  18. data/spec/epp/epp_command/kono_epp_check_domains_spec.rb +16 -0
  19. data/spec/epp/epp_command/kono_epp_create_domain_spec.rb +37 -0
  20. data/spec/epp/epp_command/kono_epp_transfer_domain_spec.rb +33 -0
  21. data/spec/epp/epp_command/kono_epp_update_domain_spec.rb +125 -0
  22. data/spec/epp/kono_epp_command_spec.rb +16 -0
  23. data/spec/epp/server_spec.rb +69 -0
  24. data/spec/fixtures/snapshots/kono_epp_check_contacts/_construct.xml.snap +13 -0
  25. data/spec/fixtures/snapshots/kono_epp_check_domains/_construct.xml.snap +11 -0
  26. data/spec/fixtures/snapshots/kono_epp_create_domain/_create.xml.snap +29 -0
  27. data/spec/fixtures/snapshots/kono_epp_transfer_domain/_con_extension_construct.xml.snap +23 -0
  28. data/spec/fixtures/snapshots/kono_epp_transfer_domain/_construct.xml.snap +13 -0
  29. data/spec/fixtures/snapshots/kono_epp_update_domain/_restore_esiste_l'estensione_di_restore.xml.snap +15 -0
  30. data/spec/fixtures/snapshots/kono_epp_update_domain/_update_auth_info_cambia_AUTH_INFO.xml.snap +15 -0
  31. data/spec/fixtures/snapshots/kono_epp_update_domain/_update_auth_info_con_nuovo_registrant_cambia_REGISTRANT.xml.snap +16 -0
  32. data/spec/fixtures/snapshots/kono_epp_update_domain/_update_contacts_cambia_ADMIN_TECH.xml.snap +18 -0
  33. data/spec/fixtures/snapshots/kono_epp_update_domain/_update_nameservers_aggiunge_e_rimuove_ns.xml.snap +28 -0
  34. data/spec/fixtures/snapshots/kono_epp_update_domain/_update_status_cambia_status.xml.snap +16 -0
  35. data/spec/spec_helper.rb +111 -0
  36. data/spec/support/context.rb +15 -0
  37. data/spec/support/matchers.rb +6 -0
  38. data/spec/support/snapshot.rb +20 -0
  39. data/spec/support/superdiff.rb +1 -0
  40. metadata +159 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 80640a05d680c3d25c1371495913b4816266e4c2
4
- data.tar.gz: 1e2fa73d4c1e1d51ef7a487c275a9a8a08226acb
2
+ SHA256:
3
+ metadata.gz: 2c14b24f2b061e44d80192c0e9612382f6f3f2f159bb3266c3750968dc56640d
4
+ data.tar.gz: bb38b49904a2b3205a270fb0d308cab943a710c54879cc193d2bacc868d16c95
5
5
  SHA512:
6
- metadata.gz: 3bdcb5660089b22ec5ec0f026a35517d04c4c75006b863154db2a04cc0c8809348f0eda14496cd3ed105941c195666ee7a78b8b0eace40db8f44b22efeb1b418
7
- data.tar.gz: 4f1eca44ce49bee99b1ededec75b3e30c058de3ffd1a5cf186e3579355767bbbb25b9f7d83930595b8a7e721bc7b271ca295c23c5642f1353d870fdd7a6fd90b
6
+ metadata.gz: 4361d5610d860fd4d1bcadebe2dfb68eb19f52a12bd7e49eff016eec4ca756229efc69a3fc4473d9be7a4a622e7d993c52a8befb6bf0d7342e4c2fb28fbeee1d
7
+ data.tar.gz: 84f087306f9ce8b5fb2f16dc50e5022063e588b9535847e8edd85b6ad3fadc1d3f6e4d40815ff44e344a745101b4ec42ffb9377479ff0a8a240c801dc2fa6841
data/CHANGELOG.md ADDED
@@ -0,0 +1,17 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file. See [conventional commits](https://www.conventionalcommits.org/) for commit guidelines.
3
+
4
+ - - -
5
+ ## 0.1.1 - 2024-05-23
6
+ #### Continuous Integration
7
+ - Cog typo - (f91c1b9) - Marino Bonetti
8
+ #### Features
9
+ - Add configuration options for transport - (d83d723) - Marino Bonetti
10
+ #### Miscellaneous Chores
11
+ - Configuration for development and deploy - (563edac) - Marino Bonetti
12
+ #### Tests
13
+ - Fix methods non present in std - (e0393ff) - Marino Bonetti
14
+
15
+ - - -
16
+
17
+ Changelog generated by [cocogitto](https://github.com/cocogitto/cocogitto).
data/README.md CHANGED
@@ -1,2 +1,18 @@
1
1
  # kono_epp_client
2
2
  A simple EPP Client
3
+
4
+
5
+
6
+ ## Development
7
+ Build dell'immagine di docker
8
+ ```shell
9
+ docker compose build
10
+ ```
11
+ Installazione dipendenze
12
+ ```shell
13
+ docker compose run app bundle
14
+ ```
15
+ Run rspec
16
+ ```shell
17
+ docker compose run app bundle exec rspec
18
+ ```
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,39 @@
1
+ require_relative "lib/kono_epp_client/version"
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'kono_epp_client'
5
+ s.version = KonoEppClient::VERSION
6
+ s.date = '2019-10-08'
7
+ s.summary = "Kono Epp client"
8
+ s.description = "A simple EPP Client"
9
+ s.authors = ["Fabio Bonelli", "Jury Ghidinelli", "Marino Bonetti"]
10
+ s.email = ['jury@archimedianet.it', 'marinobonetti@gmail.com']
11
+ s.files = ["lib/kono_epp_client.rb"]
12
+ s.homepage = 'https://github.com/ArchimediaZerogroup/kono_epp_client'
13
+ s.license = 'MIT'
14
+
15
+ s.files = Dir.chdir(__dir__) do
16
+ `git ls-files -z`.split("\x0").reject do |f|
17
+ (File.expand_path(f) == __FILE__) ||
18
+ f.start_with?(*[
19
+ "bin/", "test/", "spec/", "features/",
20
+ ".git", ".gitlab-ci.yml", "appveyor", "Gemfile",
21
+ "cog.toml", "docker-compose.yml", "Dockerfile",
22
+ ".rspec", ".rubocop.yml"
23
+ ])
24
+ end
25
+ end
26
+
27
+ files = `git ls-files -z`.split("\x0")
28
+ s.test_files = files.grep(%r{^(spec)/})
29
+
30
+ s.add_dependency 'activesupport', '>= 5.2'
31
+ s.add_dependency 'rexml'
32
+ s.add_dependency 'nokogiri', '>= 1.10'
33
+
34
+ s.add_development_dependency "rspec"
35
+ s.add_development_dependency "super_diff"
36
+ s.add_development_dependency "rspec-html-matchers"
37
+ s.add_development_dependency 'rspec-snapshot'
38
+
39
+ end
@@ -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
@@ -21,8 +21,10 @@ class KonoEppCreateDomain < KonoEppCommand
21
21
  host_name.text = ns[0]
22
22
 
23
23
  # FIXME IPv6
24
- host_addr = host_attr.add_element "domain:hostAddr", { "ip" => "v4" }
25
- host_addr.text = ns[1]
24
+ if ns[1]
25
+ host_addr = host_attr.add_element "domain:hostAddr", {"ip" => "v4"}
26
+ host_addr.text = ns[1]
27
+ end
26
28
  end
27
29
 
28
30
  domain_registrant = domain_create.add_element "domain:registrant"
@@ -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
@@ -1,12 +1,13 @@
1
1
  class KonoEppTransferDomain < KonoEppCommand
2
- def initialize( name, authinfo, op )
3
- super( nil, nil )
2
+ def initialize(name, authinfo, op, extension: nil)
3
+ super(nil, nil)
4
4
 
5
5
  command = root.elements['command']
6
- transfer = command.add_element( "transfer", { "op" => op } )
6
+ transfer = command.add_element("transfer", {"op" => op})
7
+ # FIXME dovremmo controllare che le possibili opzioni di OP sono 'request', 'cancel', 'approve', 'reject', 'query'
7
8
 
8
- domain_transfer = transfer.add_element( "domain:transfer", { "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" } )
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"})
10
11
 
11
12
  domain_name = domain_transfer.add_element "domain:name"
12
13
  domain_name.text = name
@@ -15,5 +16,21 @@ class KonoEppTransferDomain < KonoEppCommand
15
16
  domain_pw = domain_authinfo.add_element "domain:pw"
16
17
 
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
+
18
35
  end
19
36
  end
@@ -1,71 +1,80 @@
1
1
  class KonoEppUpdateDomain < KonoEppCommand
2
- def initialize( options )
3
- super( nil, nil )
2
+ def initialize(options)
3
+ super(nil, nil)
4
4
 
5
5
  command = root.elements['command']
6
- update = command.add_element( "update" )
6
+ update = command.add_element("update")
7
7
 
8
-
9
- domain_update = update.add_element( "domain:update", { "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" } )
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"})
11
10
 
12
11
  name = domain_update.add_element "domain:name"
13
12
  name.text = options[:name]
14
13
 
15
- if not options[:add_nameservers].blank? or options[:add_admin] or options[:add_tech]
14
+ if not options[:add_nameservers].blank? or options[:add_admin] or options[:add_tech] or options[:add_status]
15
+ # <domain:add>
16
16
  domain_add = domain_update.add_element "domain:add"
17
- end
18
17
 
19
- if not options[:remove_nameservers].blank? or options[:remove_admin] or options[:remove_tech]
20
- domain_remove = domain_update.add_element "domain:rem"
21
- end
18
+ unless options[:add_nameservers].blank?
19
+ domain_add_ns = domain_add.add_element "domain:ns"
22
20
 
23
- # <domain:add>
24
- unless options[:add_nameservers].blank?
25
- domain_add_ns = domain_add.add_element "domain:ns"
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"
26
24
 
27
- options[:add_nameservers].each do |ns|
28
- host_attr = domain_add_ns.add_element "domain:hostAttr"
29
- host_name = host_attr.add_element "domain:hostName"
25
+ host_name.text = ns[0]
30
26
 
31
- host_name.text = ns[0]
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
32
34
 
33
- # FIXME IPv6
34
- host_addr = host_attr.add_element "domain:hostAddr", { "ip" => "v4" }
35
- host_addr.text = ns[1]
35
+ if options[:add_admin]
36
+ domain_contact = domain_add.add_element "domain:contact", {"type" => "admin"}
37
+ domain_contact.text = options[:add_admin]
36
38
  end
37
- end
38
39
 
39
- if options[:add_admin]
40
- domain_contact = domain_add.add_element "domain:contact", { "type" => "admin" }
41
- domain_contact.text = options[:add_admin]
42
- end
40
+ if options[:add_status]
41
+ domain_add.add_element "domain:status", {"s" => options[:add_status]}
42
+ end
43
43
 
44
- if options[:add_tech]
45
- domain_contact = domain_add.add_element "domain:contact", { "type" => "tech" }
46
- domain_contact.text = options[:add_tech]
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
47
48
  end
48
49
 
49
- # <domain:rem>
50
- unless options[:remove_nameservers].blank?
51
- domain_remove_ns = domain_remove.add_element "domain:ns"
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"
52
53
 
53
- options[:remove_nameservers].each do |name|
54
- host_attr = domain_remove_ns.add_element "domain:hostAttr"
55
- host_name = host_attr.add_element "domain:hostName"
54
+ unless options[:remove_nameservers].blank?
55
+ domain_remove_ns = domain_remove.add_element "domain:ns"
56
56
 
57
- host_name.text = name
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
58
63
  end
59
- end
60
64
 
61
- if options[:remove_admin]
62
- domain_contact = domain_remove.add_element "domain:contact", { "type" => "admin" }
63
- domain_contact.text = options[:remove_admin]
64
- end
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
65
69
 
66
- if options[:remove_tech]
67
- domain_contact = domain_remove.add_element "domain:contact", { "type" => "tech" }
68
- domain_contact.text = options[:remove_tech]
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
69
78
  end
70
79
 
71
80
  # <domain:chg>
@@ -83,6 +92,13 @@ class KonoEppUpdateDomain < KonoEppCommand
83
92
  domain_pw.text = options[:auth_info]
84
93
  end
85
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
86
102
  # TODO: Registrant
87
103
  end
88
104
  end
@@ -16,3 +16,13 @@ end
16
16
 
17
17
  class KonoEppAuthenticationPasswordExpired < KonoEppErrorResponse ; end
18
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