nominet-epp 0.0.12 → 1.0.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.
- checksums.yaml +7 -0
- data/.gitignore +24 -0
- data/.travis.yml +14 -0
- data/.yardopts +8 -2
- data/Gemfile +22 -0
- data/Gemfile.lock +64 -0
- data/HISTORY.md +78 -0
- data/LICENSE +1 -1
- data/README.md +23 -0
- data/Rakefile +2 -37
- data/gemfiles/Gemfile.ruby18 +13 -0
- data/lib/nominet-epp/client.rb +364 -0
- data/lib/nominet-epp/notification.rb +346 -0
- data/lib/nominet-epp/operations.rb +2 -7
- data/lib/nominet-epp/request.rb +165 -0
- data/lib/nominet-epp/requests/contact/check.rb +9 -0
- data/lib/nominet-epp/requests/contact/create.rb +60 -0
- data/lib/nominet-epp/requests/contact/delete.rb +9 -0
- data/lib/nominet-epp/requests/contact/info.rb +9 -0
- data/lib/nominet-epp/requests/contact/release.rb +33 -0
- data/lib/nominet-epp/requests/contact/update.rb +63 -0
- data/lib/nominet-epp/requests/custom/handshake.rb +36 -0
- data/lib/nominet-epp/requests/custom/list.rb +38 -0
- data/lib/nominet-epp/requests/custom/tag_list.rb +25 -0
- data/lib/nominet-epp/requests/domain/check.rb +98 -0
- data/lib/nominet-epp/requests/domain/create.rb +97 -0
- data/lib/nominet-epp/requests/domain/delete.rb +9 -0
- data/lib/nominet-epp/requests/domain/info.rb +9 -0
- data/lib/nominet-epp/requests/domain/release.rb +33 -0
- data/lib/nominet-epp/requests/domain/renew.rb +9 -0
- data/lib/nominet-epp/requests/domain/unrenew.rb +33 -0
- data/lib/nominet-epp/requests/domain/update.rb +134 -0
- data/lib/nominet-epp/requests/host/check.rb +9 -0
- data/lib/nominet-epp/requests/host/create.rb +9 -0
- data/lib/nominet-epp/requests/host/delete.rb +9 -0
- data/lib/nominet-epp/requests/host/info.rb +9 -0
- data/lib/nominet-epp/requests/host/update.rb +9 -0
- data/lib/nominet-epp/responses/contact/check_response.rb +10 -0
- data/lib/nominet-epp/responses/contact/create_response.rb +14 -0
- data/lib/nominet-epp/responses/contact/delete_response.rb +10 -0
- data/lib/nominet-epp/responses/contact/info_response.rb +89 -0
- data/lib/nominet-epp/responses/contact/release_response.rb +10 -0
- data/lib/nominet-epp/responses/contact/update_response.rb +10 -0
- data/lib/nominet-epp/responses/custom/handshake_response.rb +33 -0
- data/lib/nominet-epp/responses/custom/list_response.rb +29 -0
- data/lib/nominet-epp/responses/custom/tag_list_response.rb +37 -0
- data/lib/nominet-epp/responses/domain/check_response.rb +40 -0
- data/lib/nominet-epp/responses/domain/create_response.rb +10 -0
- data/lib/nominet-epp/responses/domain/delete_response.rb +10 -0
- data/lib/nominet-epp/responses/domain/info_response.rb +128 -0
- data/lib/nominet-epp/responses/domain/release_response.rb +10 -0
- data/lib/nominet-epp/responses/domain/renew_response.rb +10 -0
- data/lib/nominet-epp/responses/domain/unrenew_response.rb +26 -0
- data/lib/nominet-epp/responses/domain/update_response.rb +10 -0
- data/lib/nominet-epp/responses/host/check_response.rb +10 -0
- data/lib/nominet-epp/responses/host/create_response.rb +14 -0
- data/lib/nominet-epp/responses/host/delete_response.rb +10 -0
- data/lib/nominet-epp/responses/host/info_response.rb +14 -0
- data/lib/nominet-epp/responses/host/update_response.rb +10 -0
- data/lib/nominet-epp/responses/response.rb +27 -0
- data/lib/nominet-epp/version.rb +4 -0
- data/lib/nominet-epp.rb +60 -161
- data/nominet-epp.gemspec +15 -65
- data/test/helper.rb +57 -0
- data/test/notifications/test_contact_deleted_notification.rb +23 -0
- data/test/notifications/test_domain_cancelled_notification.rb +23 -0
- data/test/notifications/test_domains_released_notification.rb +34 -0
- data/test/notifications/test_domains_suspended_notification.rb +30 -0
- data/test/notifications/test_handshake_rejected_notification.rb +34 -0
- data/test/notifications/test_registrant_transfer_notification.rb +78 -0
- data/test/notifications/test_registrar_change_notification.rb +119 -0
- data/test/requests/contact/test_contact_check_request.rb +25 -0
- data/test/requests/contact/test_contact_create_request.rb +104 -0
- data/test/requests/contact/test_contact_delete_request.rb +20 -0
- data/test/requests/contact/test_contact_info_request.rb +20 -0
- data/test/requests/contact/test_contact_release_request.rb +29 -0
- data/test/requests/contact/test_contact_update_request.rb +111 -0
- data/test/requests/custom/test_custom_handshake_request.rb +42 -0
- data/test/requests/custom/test_custom_list_request.rb +44 -0
- data/test/requests/custom/test_custom_tag_list_request.rb +21 -0
- data/test/requests/domain/test_domain_check_request.rb +140 -0
- data/test/requests/domain/test_domain_create_request.rb +136 -0
- data/test/requests/domain/test_domain_delete_request.rb +20 -0
- data/test/requests/domain/test_domain_info_request.rb +20 -0
- data/test/requests/domain/test_domain_release_request.rb +29 -0
- data/test/requests/domain/test_domain_renew_request.rb +15 -0
- data/test/requests/domain/test_domain_unrenew_request.rb +32 -0
- data/test/requests/domain/test_domain_update_request.rb +163 -0
- data/test/requests/host/test_host_check_request.rb +25 -0
- data/test/requests/host/test_host_create_request.rb +33 -0
- data/test/requests/host/test_host_delete_request.rb +20 -0
- data/test/requests/host/test_host_info_request.rb +20 -0
- data/test/requests/host/test_host_update_request.rb +55 -0
- data/test/responses/contact/test_contact_check_response.rb +28 -0
- data/test/responses/contact/test_contact_create_response.rb +28 -0
- data/test/responses/contact/test_contact_delete_response.rb +18 -0
- data/test/responses/contact/test_contact_info_response.rb +79 -0
- data/test/responses/contact/test_contact_release_response.rb +18 -0
- data/test/responses/contact/test_contact_update_response.rb +18 -0
- data/test/responses/custom/test_custom_handshake_response.rb +27 -0
- data/test/responses/custom/test_custom_list_response.rb +44 -0
- data/test/responses/custom/test_custom_tag_list_response.rb +43 -0
- data/test/responses/domain/test_domain_check_response.rb +56 -0
- data/test/responses/domain/test_domain_create_response.rb +34 -0
- data/test/responses/domain/test_domain_delete_response.rb +18 -0
- data/test/responses/domain/test_domain_info_response.rb +76 -0
- data/test/responses/domain/test_domain_release_response.rb +18 -0
- data/test/responses/domain/test_domain_renew_response.rb +27 -0
- data/test/responses/domain/test_domain_unrenew_response.rb +32 -0
- data/test/responses/domain/test_domain_update_response.rb +18 -0
- data/test/responses/host/test_host_check_response.rb +28 -0
- data/test/responses/host/test_host_create_response.rb +28 -0
- data/test/responses/host/test_host_delete_response.rb +18 -0
- data/test/responses/host/test_host_info_response.rb +28 -0
- data/test/responses/host/test_host_update_response.rb +18 -0
- data/test/support/responses/contact/check.xml +23 -0
- data/test/support/responses/contact/create.xml +23 -0
- data/test/support/responses/contact/delete.xml +12 -0
- data/test/support/responses/contact/info.xml +46 -0
- data/test/support/responses/contact/release.xml +12 -0
- data/test/support/responses/contact/update.xml +12 -0
- data/test/support/responses/custom/handshake.xml +24 -0
- data/test/support/responses/custom/list.xml +28 -0
- data/test/support/responses/custom/list_empty.xml +21 -0
- data/test/support/responses/custom/tag_list.xml +28 -0
- data/test/support/responses/domain/check-direct-rights.xml +1 -0
- data/test/support/responses/domain/check.xml +25 -0
- data/test/support/responses/domain/create.xml +24 -0
- data/test/support/responses/domain/delete.xml +12 -0
- data/test/support/responses/domain/info.xml +45 -0
- data/test/support/responses/domain/release.xml +12 -0
- data/test/support/responses/domain/renew.xml +24 -0
- data/test/support/responses/domain/unrenew.xml +26 -0
- data/test/support/responses/domain/update.xml +12 -0
- data/test/support/responses/host/check.xml +23 -0
- data/test/support/responses/host/create.xml +18 -0
- data/test/support/responses/host/delete.xml +12 -0
- data/test/support/responses/host/info.xml +25 -0
- data/test/support/responses/host/update.xml +12 -0
- data/test/support/responses/notifications/abuse-feed.xml +31 -0
- data/test/support/responses/notifications/account-change.xml +39 -0
- data/test/support/responses/notifications/contact-deleted.xml +22 -0
- data/test/support/responses/notifications/data-quality.xml +53 -0
- data/test/support/responses/notifications/domain-cancelled.xml +22 -0
- data/test/support/responses/notifications/domains-released.xml +31 -0
- data/test/support/responses/notifications/domains-suspended.xml +26 -0
- data/test/support/responses/notifications/handshake-rejected.xml +31 -0
- data/test/support/responses/notifications/handshake-request.xml +65 -0
- data/test/support/responses/notifications/hosts-cancelled.xml +28 -0
- data/test/support/responses/notifications/referral-accepted.xml +23 -0
- data/test/support/responses/notifications/referral-rejected.xml +22 -0
- data/test/support/responses/notifications/registrant-transfer.xml +54 -0
- data/test/support/responses/notifications/registrar-change.xml +67 -0
- data/test/support/schemas/README +12 -0
- data/test/support/schemas/RELEASENOTES +54 -0
- data/test/support/schemas/contact-1.0.xsd +387 -0
- data/test/support/schemas/contact-nom-ext-1.0.xsd +144 -0
- data/test/support/schemas/domain-1.0.xsd +432 -0
- data/test/support/schemas/domain-nom-ext-1.2.xsd +215 -0
- data/test/support/schemas/epp-1.0.xsd +403 -0
- data/test/support/schemas/eppcom-1.0.xsd +93 -0
- data/test/support/schemas/host-1.0.xsd +240 -0
- data/test/support/schemas/nom-abuse-feed-1.0.xsd +46 -0
- data/test/support/schemas/nom-direct-rights-1.0.xsd +48 -0
- data/test/support/schemas/nom-root-std-1.0.7.xsd +47 -0
- data/test/support/schemas/nom-root-tag-1.0.xsd +31 -0
- data/test/support/schemas/nom-tag-1.0.xsd +71 -0
- data/test/support/schemas/secDNS-1.1.xsd +127 -0
- data/test/support/schemas/std-contact-id-1.0.xsd +35 -0
- data/test/support/schemas/std-fork-1.0.xsd +31 -0
- data/test/support/schemas/std-handshake-1.0.xsd +61 -0
- data/test/support/schemas/std-list-1.0.xsd +55 -0
- data/test/support/schemas/std-locks-1.0.xsd +53 -0
- data/test/support/schemas/std-notifications-1.2.xsd +197 -0
- data/test/support/schemas/std-release-1.0.xsd +39 -0
- data/test/support/schemas/std-unrenew-1.0.xsd +26 -0
- data/test/support/schemas/std-warning-1.1.xsd +145 -0
- data/test/test_nominet-epp.rb +3 -3
- metadata +324 -104
- data/History.rdoc +0 -78
- data/README.rdoc +0 -23
- data/VERSION +0 -1
- data/lib/nominet-epp/operations/check.rb +0 -39
- data/lib/nominet-epp/operations/create.rb +0 -138
- data/lib/nominet-epp/operations/delete.rb +0 -20
- data/lib/nominet-epp/operations/fork.rb +0 -53
- data/lib/nominet-epp/operations/hello.rb +0 -11
- data/lib/nominet-epp/operations/info.rb +0 -93
- data/lib/nominet-epp/operations/list.rb +0 -83
- data/lib/nominet-epp/operations/lock.rb +0 -56
- data/lib/nominet-epp/operations/merge.rb +0 -41
- data/lib/nominet-epp/operations/poll.rb +0 -64
- data/lib/nominet-epp/operations/renew.rb +0 -40
- data/lib/nominet-epp/operations/transfer.rb +0 -84
- data/lib/nominet-epp/operations/unlock.rb +0 -56
- data/lib/nominet-epp/operations/unrenew.rb +0 -36
- data/lib/nominet-epp/operations/update.rb +0 -176
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 1baec8eaf94460dfaaffe706aab21f691db5e124
|
|
4
|
+
data.tar.gz: 18c591b8f71fc9af7ff4b67b6bd600e9c4402f37
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 30bff530d232683cc4b6724c193c562fecd39b4ebfc09208c524c8f4e4a89900038485dd2c34f94714cc09b0088b4aa6afb6c0cbe81bb0f23964ea82b568ed08
|
|
7
|
+
data.tar.gz: ced5fbd803365d58a870a0e791be50b00f447518cb421a255a2936410ab5f9c8ed0f3d73b99f6384a05724790c19879e24dfd28d6ec126610848be38bf17df54
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
language: ruby
|
|
2
|
+
bundler_args: --without doc coverage development
|
|
3
|
+
rvm:
|
|
4
|
+
- 1.9.3
|
|
5
|
+
- 2.0.0
|
|
6
|
+
matrix:
|
|
7
|
+
include:
|
|
8
|
+
- rvm: 1.8.7
|
|
9
|
+
gemfile: gemfiles/Gemfile.ruby18
|
|
10
|
+
- rvm: ree
|
|
11
|
+
gemfile: gemfiles/Gemfile.ruby18
|
|
12
|
+
branches:
|
|
13
|
+
only:
|
|
14
|
+
- standard-epp
|
data/.yardopts
CHANGED
data/Gemfile
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
source 'https://rubygems.org'
|
|
2
|
+
|
|
3
|
+
# Specify your gem's dependencies in nominet-epp.gemspec
|
|
4
|
+
gemspec
|
|
5
|
+
|
|
6
|
+
gem 'rake'
|
|
7
|
+
gem 'epp-client', :github => "m247/epp-client"
|
|
8
|
+
|
|
9
|
+
group :development do
|
|
10
|
+
gem 'pry'
|
|
11
|
+
gem 'pry-doc'
|
|
12
|
+
gem 'awesome_print'
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
group :test do
|
|
16
|
+
gem 'shoulda'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
group :doc do
|
|
20
|
+
gem 'yard'
|
|
21
|
+
gem 'redcarpet'
|
|
22
|
+
end
|
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
GIT
|
|
2
|
+
remote: git://github.com/m247/epp-client.git
|
|
3
|
+
revision: a07e51fefcc2a68a317cf1200d4d80ce0b7dbfe0
|
|
4
|
+
specs:
|
|
5
|
+
epp-client (1.0.0)
|
|
6
|
+
libxml-ruby
|
|
7
|
+
|
|
8
|
+
PATH
|
|
9
|
+
remote: .
|
|
10
|
+
specs:
|
|
11
|
+
nominet-epp (1.0.0)
|
|
12
|
+
epp-client (~> 1.0.0)
|
|
13
|
+
|
|
14
|
+
GEM
|
|
15
|
+
remote: https://rubygems.org/
|
|
16
|
+
specs:
|
|
17
|
+
activesupport (4.0.0)
|
|
18
|
+
i18n (~> 0.6, >= 0.6.4)
|
|
19
|
+
minitest (~> 4.2)
|
|
20
|
+
multi_json (~> 1.3)
|
|
21
|
+
thread_safe (~> 0.1)
|
|
22
|
+
tzinfo (~> 0.3.37)
|
|
23
|
+
atomic (1.1.14)
|
|
24
|
+
awesome_print (1.2.0)
|
|
25
|
+
coderay (1.0.9)
|
|
26
|
+
i18n (0.6.5)
|
|
27
|
+
libxml-ruby (2.7.0)
|
|
28
|
+
method_source (0.8.2)
|
|
29
|
+
minitest (4.7.5)
|
|
30
|
+
multi_json (1.8.0)
|
|
31
|
+
pry (0.9.12.2)
|
|
32
|
+
coderay (~> 1.0.5)
|
|
33
|
+
method_source (~> 0.8)
|
|
34
|
+
slop (~> 3.4)
|
|
35
|
+
pry-doc (0.4.6)
|
|
36
|
+
pry (>= 0.9)
|
|
37
|
+
yard (>= 0.8)
|
|
38
|
+
rake (10.1.0)
|
|
39
|
+
redcarpet (3.0.0)
|
|
40
|
+
shoulda (3.5.0)
|
|
41
|
+
shoulda-context (~> 1.0, >= 1.0.1)
|
|
42
|
+
shoulda-matchers (>= 1.4.1, < 3.0)
|
|
43
|
+
shoulda-context (1.1.5)
|
|
44
|
+
shoulda-matchers (2.4.0)
|
|
45
|
+
activesupport (>= 3.0.0)
|
|
46
|
+
slop (3.4.6)
|
|
47
|
+
thread_safe (0.1.3)
|
|
48
|
+
atomic
|
|
49
|
+
tzinfo (0.3.37)
|
|
50
|
+
yard (0.8.7.2)
|
|
51
|
+
|
|
52
|
+
PLATFORMS
|
|
53
|
+
ruby
|
|
54
|
+
|
|
55
|
+
DEPENDENCIES
|
|
56
|
+
awesome_print
|
|
57
|
+
epp-client!
|
|
58
|
+
nominet-epp!
|
|
59
|
+
pry
|
|
60
|
+
pry-doc
|
|
61
|
+
rake
|
|
62
|
+
redcarpet
|
|
63
|
+
shoulda
|
|
64
|
+
yard
|
data/HISTORY.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# NominetEPP History
|
|
2
|
+
|
|
3
|
+
## 0.0.12 / 2011-05-24
|
|
4
|
+
|
|
5
|
+
* Capture +domain:failData+ information from +create+ operation failures.
|
|
6
|
+
|
|
7
|
+
## 0.0.11 / 2011-05-17
|
|
8
|
+
|
|
9
|
+
* Remove setting account:contact[type] attribute as this is not in the schema
|
|
10
|
+
|
|
11
|
+
## 0.0.10 / 2011-05-04
|
|
12
|
+
|
|
13
|
+
* Fix syntax error in helpers.rb
|
|
14
|
+
|
|
15
|
+
## 0.0.9 / 2011-05-04
|
|
16
|
+
|
|
17
|
+
* Correct implementation of Update Operation for domain, account and contact to send
|
|
18
|
+
the correct sequence of XML elements
|
|
19
|
+
|
|
20
|
+
## 0.0.8 / 2011-05-03
|
|
21
|
+
|
|
22
|
+
* Amend account:contact elements in Create operation to ensure order attribute range
|
|
23
|
+
* Fix sequencing of elements in account:addr block
|
|
24
|
+
* Fix sequencing of elements in contact:create block
|
|
25
|
+
* Fix sequencing of elements in account:create block
|
|
26
|
+
* Enforce the correct element sequencing for the domain:create operation
|
|
27
|
+
|
|
28
|
+
## 0.0.7 / 2011-04-21
|
|
29
|
+
|
|
30
|
+
* Yank v0.0.6 and bump version to fix bug introduced in v0.0.6
|
|
31
|
+
|
|
32
|
+
## 0.0.6 / 2011-04-21
|
|
33
|
+
|
|
34
|
+
* Fix "Command Syntax Error" response for Create operation with "2y" style periods
|
|
35
|
+
|
|
36
|
+
## 0.0.5 / 2011-02-24
|
|
37
|
+
|
|
38
|
+
* Many bug fixes in Create operation
|
|
39
|
+
* Support for using `host:update` to modify name server glue information.
|
|
40
|
+
|
|
41
|
+
## 0.0.4 / 2011-01-31
|
|
42
|
+
|
|
43
|
+
* Operations now cache their responses, accessible through `Client#last_response`
|
|
44
|
+
* Last response messages are available through `Client#last_message`
|
|
45
|
+
|
|
46
|
+
## 0.0.3 / 2011-01-17
|
|
47
|
+
|
|
48
|
+
* Tweak how #poll method works w.r.t blocks
|
|
49
|
+
|
|
50
|
+
## 0.0.2 / 2011-01-07
|
|
51
|
+
|
|
52
|
+
* Add Documentation
|
|
53
|
+
* Support the 'abuse-limit' on Nominet check operation
|
|
54
|
+
* Fix issue with info operation XML response parsing
|
|
55
|
+
|
|
56
|
+
## 0.0.1 / 2010-05-26
|
|
57
|
+
|
|
58
|
+
* Add support for 'none' and 'all' options on list operation
|
|
59
|
+
* Fix bugs in info operation for account objects
|
|
60
|
+
* Improve handling of XML namespaces and schema locations
|
|
61
|
+
|
|
62
|
+
## 0.0.0 / 2010-05-25
|
|
63
|
+
|
|
64
|
+
* Initial release
|
|
65
|
+
* Supports the following operations
|
|
66
|
+
* Create
|
|
67
|
+
* Delete
|
|
68
|
+
* Fork
|
|
69
|
+
* Hello
|
|
70
|
+
* Info
|
|
71
|
+
* List
|
|
72
|
+
* Lock
|
|
73
|
+
* Merge
|
|
74
|
+
* Poll
|
|
75
|
+
* Transfer
|
|
76
|
+
* Unlock
|
|
77
|
+
* Unrenew
|
|
78
|
+
* Update
|
data/LICENSE
CHANGED
data/README.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Nominet EPP
|
|
2
|
+
|
|
3
|
+
Ruby interface to the [Nominet EPP][http://www.nominet.org.uk/registrars/systems/nominetepp] registrar interface.
|
|
4
|
+
|
|
5
|
+
## Initialise a client
|
|
6
|
+
|
|
7
|
+
require 'nominet-epp'
|
|
8
|
+
client = NominetEPP::Client.new('TAGNAME', 'password')
|
|
9
|
+
testclient = NominetEPP::Client.new('TAGNAME', 'password', 'testbed-epp.nominet.org.uk')
|
|
10
|
+
|
|
11
|
+
## Note on Patches/Pull Requests
|
|
12
|
+
|
|
13
|
+
* Fork the project.
|
|
14
|
+
* Make your feature addition or bug fix.
|
|
15
|
+
* Add tests for it. This is important so I don't break it in a
|
|
16
|
+
future version unintentionally.
|
|
17
|
+
* Commit, do not mess with rakefile, version, or history.
|
|
18
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
|
19
|
+
* Send me a pull request. Bonus points for topic branches.
|
|
20
|
+
|
|
21
|
+
## Copyright
|
|
22
|
+
|
|
23
|
+
Copyright (c) 2010 Geoff Garside (M247 Ltd). See LICENSE for details.
|
data/Rakefile
CHANGED
|
@@ -1,25 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
require
|
|
3
|
-
|
|
4
|
-
begin
|
|
5
|
-
require 'jeweler'
|
|
6
|
-
Jeweler::Tasks.new do |gem|
|
|
7
|
-
gem.name = "nominet-epp"
|
|
8
|
-
gem.summary = %Q{Nominet EPP (Extensible Provisioning Protocol) Client}
|
|
9
|
-
gem.description = %Q{Client for communicating with the Nominet EPP}
|
|
10
|
-
gem.email = "geoff@geoffgarside.co.uk"
|
|
11
|
-
gem.homepage = "http://github.com/geoffgarside/nominet-epp"
|
|
12
|
-
gem.authors = ["Geoff Garside"]
|
|
13
|
-
gem.add_development_dependency "shoulda", ">= 0"
|
|
14
|
-
gem.add_development_dependency "yard", ">= 0"
|
|
15
|
-
|
|
16
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
|
17
|
-
gem.add_dependency "epp-client", ">= 0"
|
|
18
|
-
end
|
|
19
|
-
Jeweler::GemcutterTasks.new
|
|
20
|
-
rescue LoadError
|
|
21
|
-
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
|
22
|
-
end
|
|
1
|
+
#!/usr/bin/env rake
|
|
2
|
+
require "bundler/gem_tasks"
|
|
23
3
|
|
|
24
4
|
require 'rake/testtask'
|
|
25
5
|
Rake::TestTask.new(:test) do |test|
|
|
@@ -28,21 +8,6 @@ Rake::TestTask.new(:test) do |test|
|
|
|
28
8
|
test.verbose = true
|
|
29
9
|
end
|
|
30
10
|
|
|
31
|
-
begin
|
|
32
|
-
require 'rcov/rcovtask'
|
|
33
|
-
Rcov::RcovTask.new do |test|
|
|
34
|
-
test.libs << 'test'
|
|
35
|
-
test.pattern = 'test/**/test_*.rb'
|
|
36
|
-
test.verbose = true
|
|
37
|
-
end
|
|
38
|
-
rescue LoadError
|
|
39
|
-
task :rcov do
|
|
40
|
-
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
task :test => :check_dependencies
|
|
45
|
-
|
|
46
11
|
task :default => :test
|
|
47
12
|
|
|
48
13
|
begin
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
source 'https://rubygems.org'
|
|
2
|
+
|
|
3
|
+
# Specify your gem's dependencies in nominet-epp.gemspec
|
|
4
|
+
gemspec :path => '../'
|
|
5
|
+
|
|
6
|
+
gem 'rake'
|
|
7
|
+
gem 'activesupport', '~> 3.2.14'
|
|
8
|
+
gem 'epp-client', :github => "m247/epp-client"
|
|
9
|
+
|
|
10
|
+
group :test do
|
|
11
|
+
gem 'shoulda-matchers', '~> 1.5.6'
|
|
12
|
+
gem 'shoulda'
|
|
13
|
+
end
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
module NominetEPP
|
|
2
|
+
# Front end interface Client to the NominetEPP Service
|
|
3
|
+
class Client
|
|
4
|
+
# Standard EPP Services to be used
|
|
5
|
+
SERVICE_URNS = EPP::Client::DEFAULT_SERVICES
|
|
6
|
+
|
|
7
|
+
# Additional Nominet specific service extensions
|
|
8
|
+
SERVICE_EXTENSION_URNS = %w(
|
|
9
|
+
urn:ietf:params:xml:ns:secDNS-1.1
|
|
10
|
+
http://www.nominet.org.uk/epp/xml/domain-nom-ext-1.2
|
|
11
|
+
http://www.nominet.org.uk/epp/xml/contact-nom-ext-1.0
|
|
12
|
+
http://www.nominet.org.uk/epp/xml/std-notifications-1.2
|
|
13
|
+
http://www.nominet.org.uk/epp/xml/std-handshake-1.0
|
|
14
|
+
http://www.nominet.org.uk/epp/xml/std-warning-1.1
|
|
15
|
+
http://www.nominet.org.uk/epp/xml/std-release-1.0
|
|
16
|
+
http://www.nominet.org.uk/epp/xml/std-unrenew-1.0
|
|
17
|
+
http://www.nominet.org.uk/epp/xml/std-list-1.0
|
|
18
|
+
http://www.nominet.org.uk/epp/xml/nom-direct-rights-1.0)
|
|
19
|
+
|
|
20
|
+
# Create a new instance of NominetEPP::Client
|
|
21
|
+
#
|
|
22
|
+
# @param [String] tag Nominet TAG
|
|
23
|
+
# @param [String] passwd Nominet TAG EPP Password
|
|
24
|
+
# @param [String] server Nominet EPP Server address (nil forces default)
|
|
25
|
+
# @param [String] address_family 'AF_INET' or 'AF_INET6' or either of the
|
|
26
|
+
# appropriate socket constants. Will cause connections to be
|
|
27
|
+
# limited to this address family. Default try all addresses.
|
|
28
|
+
def initialize(tag, passwd, server = 'epp.nominet.org.uk', address_family = nil)
|
|
29
|
+
@tag, @server = tag, (server || 'epp.nominet.org.uk')
|
|
30
|
+
@client = EPP::Client.new(@tag, passwd, @server, :services => SERVICE_URNS,
|
|
31
|
+
:extensions => SERVICE_EXTENSION_URNS, :address_family => address_family)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# @see Object#inspect
|
|
35
|
+
def inspect
|
|
36
|
+
"#<#{self.class} #{@tag}@#{@server}>"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def self.logger=(l)
|
|
40
|
+
@@logger = l
|
|
41
|
+
end
|
|
42
|
+
def self.logger
|
|
43
|
+
@@logger ||= Logger.new(STDERR).tap do |l|
|
|
44
|
+
l.level = Logger::ERROR
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
def logger
|
|
48
|
+
self.class.logger
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Returns the last EPP::Request sent
|
|
52
|
+
#
|
|
53
|
+
# @return [EPP::Request] last sent request
|
|
54
|
+
def last_request
|
|
55
|
+
@client.last_request
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Returns the last EPP::Response received
|
|
59
|
+
#
|
|
60
|
+
# @return [EPP::Response] last received response
|
|
61
|
+
def last_response
|
|
62
|
+
@client.last_response
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Returns the last EPP message received
|
|
66
|
+
#
|
|
67
|
+
# @return [String] last EPP message
|
|
68
|
+
# @see #last_response
|
|
69
|
+
def last_message
|
|
70
|
+
last_response.message
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Returns the last Nominet failData response found
|
|
74
|
+
#
|
|
75
|
+
# @note This is presently only set by certain method calls,
|
|
76
|
+
# so it may not always be present.
|
|
77
|
+
# @return [Hash] last failData found
|
|
78
|
+
def last_error_info
|
|
79
|
+
@error_info || {}
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def greeting
|
|
83
|
+
@client._greeting
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def hello
|
|
87
|
+
@client.hello
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def check(entity, *names)
|
|
91
|
+
check_entity! entity
|
|
92
|
+
|
|
93
|
+
mod = module_for_type(entity)
|
|
94
|
+
req = mod::Check.new(*names)
|
|
95
|
+
res = @client.check(req.command, req.extension)
|
|
96
|
+
|
|
97
|
+
mod::CheckResponse.new(res)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def create(entity, name, attributes = {})
|
|
101
|
+
check_entity! entity
|
|
102
|
+
|
|
103
|
+
mod = module_for_type(entity)
|
|
104
|
+
req = mod::Create.new(name, attributes)
|
|
105
|
+
res = @client.create(req.command, req.extension)
|
|
106
|
+
|
|
107
|
+
mod::CreateResponse.new(res)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def delete(entity, name)
|
|
111
|
+
check_entity! entity
|
|
112
|
+
|
|
113
|
+
unless entity == :domain || entity == 'domain'
|
|
114
|
+
raise ArgumentError, "#{entity} entity is not supported for the delete operation at this time"
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
mod = module_for_type(entity)
|
|
118
|
+
req = mod::Delete.new(name)
|
|
119
|
+
res = @client.delete(req.command, req.extension)
|
|
120
|
+
|
|
121
|
+
mod::DeleteResponse.new(res)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def info(entity, name)
|
|
125
|
+
check_entity! entity
|
|
126
|
+
|
|
127
|
+
mod = module_for_type(entity)
|
|
128
|
+
req = mod::Info.new(name)
|
|
129
|
+
res = @client.info(req.command, req.extension)
|
|
130
|
+
|
|
131
|
+
mod::InfoResponse.new(res)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def poll
|
|
135
|
+
while res = @client.poll
|
|
136
|
+
res = Notification.new(res)
|
|
137
|
+
|
|
138
|
+
return if res.code != 1301 || res.msgQ['count'] == '0'
|
|
139
|
+
return [res.msgQ['id'], res] unless block_given?
|
|
140
|
+
|
|
141
|
+
result = yield res
|
|
142
|
+
return if result == false
|
|
143
|
+
|
|
144
|
+
raise AckError, "failed to acknowledge #{res.msgQ['id']}" unless @client.ack(res.msgQ['id'])
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def ack(msgID)
|
|
149
|
+
@client.ack(msgID)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def release(entity, name, tag)
|
|
153
|
+
entity = :contact if entity == 'registrant' || entity == :registrant
|
|
154
|
+
check_entity! entity
|
|
155
|
+
|
|
156
|
+
if entity == 'host' || entity == :host
|
|
157
|
+
raise ArgumentError, "host entity is not support for the release operation"
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
mod = module_for_type(entity)
|
|
161
|
+
req = mod::Release.new(name, tag)
|
|
162
|
+
res = @client.update(req.command, req.extension)
|
|
163
|
+
|
|
164
|
+
mod::ReleaseResponse.new(res)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def renew(name, expiry_date, period = '2y')
|
|
168
|
+
req = Domain::Renew.new(name, expiry_date, period)
|
|
169
|
+
res = @client.renew(req.command, req.extension)
|
|
170
|
+
|
|
171
|
+
Domain::RenewResponse.new(res)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def update(entity, name, changes = {})
|
|
175
|
+
check_entity! entity
|
|
176
|
+
|
|
177
|
+
mod = module_for_type(entity)
|
|
178
|
+
req = mod::Update.new(name, changes)
|
|
179
|
+
res = @client.update(req.command, req.extension)
|
|
180
|
+
|
|
181
|
+
mod::UpdateResponse.new(res)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
private
|
|
185
|
+
def check_entity!(entity)
|
|
186
|
+
unless [:domain, :contact, :host, 'domain', 'contact', 'host'].include?(entity)
|
|
187
|
+
raise ArgumentError, "Unsupported entity #{entity}"
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
def module_for_type(name)
|
|
191
|
+
case name
|
|
192
|
+
when :domain, 'domain'
|
|
193
|
+
Domain
|
|
194
|
+
when :contact, 'contact'
|
|
195
|
+
Contact
|
|
196
|
+
when :host, 'host'
|
|
197
|
+
Host
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
# Wrapper for ActiveSupport::Notifications if available to perform
|
|
202
|
+
# instrumentation of methods.
|
|
203
|
+
#
|
|
204
|
+
# @internal
|
|
205
|
+
# @param [String,Symbol] name Instrument name. Will be prefixed with "request.nominetepp".
|
|
206
|
+
# @param [Hash] payload Extra information to be included with the instrumentation data.
|
|
207
|
+
def instrument(name, payload = {})
|
|
208
|
+
if defined?(ActiveSupport::Notifications)
|
|
209
|
+
ActiveSupport::Notifications.instrument("request.nominetepp.#{name}", payload) do
|
|
210
|
+
yield
|
|
211
|
+
end
|
|
212
|
+
else
|
|
213
|
+
yield
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
# OldAPI
|
|
218
|
+
public
|
|
219
|
+
alias_method :new_check, :check
|
|
220
|
+
alias_method :new_create, :create
|
|
221
|
+
alias_method :new_delete, :delete
|
|
222
|
+
alias_method :new_release, :release
|
|
223
|
+
alias_method :new_renew, :renew
|
|
224
|
+
alias_method :new_update, :update
|
|
225
|
+
alias_method :new_info, :info
|
|
226
|
+
|
|
227
|
+
def check(entity, *names)
|
|
228
|
+
res = new_check(entity, *names)
|
|
229
|
+
|
|
230
|
+
if res.respond_to?(:abuse_limit)
|
|
231
|
+
@check_limit = res.abuse_limit
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
return res.available?(names.first) if names.length == 1
|
|
235
|
+
|
|
236
|
+
names.inject({}) do |hash, name|
|
|
237
|
+
hash[name] = res.available?(name)
|
|
238
|
+
hash
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
def create(entity, name, attributes = {})
|
|
242
|
+
res = new_create(entity, name, attributes)
|
|
243
|
+
|
|
244
|
+
if res.success?
|
|
245
|
+
case entity
|
|
246
|
+
when :domain, 'domain'
|
|
247
|
+
{ :name => res.name,
|
|
248
|
+
:crDate => res.creation_date,
|
|
249
|
+
:exDate => res.expiration_date }
|
|
250
|
+
when :contact, 'contact'
|
|
251
|
+
{ :name => res.id,
|
|
252
|
+
:crDate => res.creation_date }
|
|
253
|
+
when :host, 'host'
|
|
254
|
+
{ :name => res.id,
|
|
255
|
+
:crDate => res.creation_date }
|
|
256
|
+
end
|
|
257
|
+
else
|
|
258
|
+
@error_info = { :name => res.message, :reason => res.error_reason }
|
|
259
|
+
return false
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
def delete(entity, name)
|
|
263
|
+
res = new_delete(entity, name)
|
|
264
|
+
res.success?
|
|
265
|
+
end
|
|
266
|
+
def release(entity, name, tag)
|
|
267
|
+
res = new_release(entity, name, tag)
|
|
268
|
+
|
|
269
|
+
case res.code
|
|
270
|
+
when 1000
|
|
271
|
+
{ :result => true }
|
|
272
|
+
when 1001
|
|
273
|
+
{ :result => :handshake }
|
|
274
|
+
else
|
|
275
|
+
false
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
def renew(name, expiry_date, period = '2y')
|
|
279
|
+
res = new_renew(name, expiry_date, period)
|
|
280
|
+
|
|
281
|
+
return false unless res.success?
|
|
282
|
+
|
|
283
|
+
raise "Renewed name #{res.name} does not match #{name}" if res.name != name
|
|
284
|
+
return res.expiration_date
|
|
285
|
+
end
|
|
286
|
+
def update(entity, name, changes = {})
|
|
287
|
+
res = new_update(entity, name, changes)
|
|
288
|
+
res.success?
|
|
289
|
+
end
|
|
290
|
+
def info(entity, name)
|
|
291
|
+
res = new_info(entity, name)
|
|
292
|
+
|
|
293
|
+
return false unless res.success?
|
|
294
|
+
return self.send(:"old_info_#{entity}", res)
|
|
295
|
+
end
|
|
296
|
+
def old_info_domain(res)
|
|
297
|
+
nameservers = res.nameservers.map do |ns|
|
|
298
|
+
h = { :name => ns['name'] }
|
|
299
|
+
h[:v4] = ns['ipv4'] if ns['ipv4']
|
|
300
|
+
h[:v6] = ns['ipv6'] if ns['ipv6']
|
|
301
|
+
h
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
{
|
|
305
|
+
:name => res.name,
|
|
306
|
+
:roid => res.roid,
|
|
307
|
+
:registrant => res.registrant,
|
|
308
|
+
:ns => nameservers,
|
|
309
|
+
:host => res.hosts,
|
|
310
|
+
:clID => res.client_id,
|
|
311
|
+
:crID => res.creator_id,
|
|
312
|
+
:crDate => res.created_date,
|
|
313
|
+
:upDate => res.updated_date,
|
|
314
|
+
:exDate => res.expiration_date,
|
|
315
|
+
:reg_status => res.reg_status,
|
|
316
|
+
:first_bill => res.first_bill,
|
|
317
|
+
:recur_bill => res.recur_bill,
|
|
318
|
+
:auto_bill => res.auto_bill,
|
|
319
|
+
:auto_period => res.auto_period,
|
|
320
|
+
:next_bill => res.next_bill,
|
|
321
|
+
:next_period => res.next_period,
|
|
322
|
+
:renew_not_required => res.renew_not_required,
|
|
323
|
+
:notes => res.notes,
|
|
324
|
+
:reseller => res.reseller,
|
|
325
|
+
:ds => res.ds
|
|
326
|
+
}
|
|
327
|
+
end
|
|
328
|
+
def old_info_contact(res)
|
|
329
|
+
{
|
|
330
|
+
:id => res.id,
|
|
331
|
+
:roid => res.roid,
|
|
332
|
+
:status => res.status[0],
|
|
333
|
+
:postal_info => res.postal_info,
|
|
334
|
+
:voice => res.voice,
|
|
335
|
+
:email => res.email,
|
|
336
|
+
:clID => res.client_id,
|
|
337
|
+
:crID => res.creator_id,
|
|
338
|
+
:crDate => res.created_date,
|
|
339
|
+
:type => res.type,
|
|
340
|
+
:trad_name => res.trad_name,
|
|
341
|
+
:co_no => res.co_no,
|
|
342
|
+
:opt_out => res.opt_out
|
|
343
|
+
}
|
|
344
|
+
end
|
|
345
|
+
def old_info_host(res)
|
|
346
|
+
addrs = res.addresses.try(:dup) || {}
|
|
347
|
+
addrs[:v4] = addrs.delete('ipv4')
|
|
348
|
+
addrs[:v6] = addrs.delete('ipv6')
|
|
349
|
+
|
|
350
|
+
addrs[:v4] = addrs[:v4][0] if addrs[:v4].kind_of?(Array)
|
|
351
|
+
addrs[:v6] = addrs[:v6][0] if addrs[:v6].kind_of?(Array)
|
|
352
|
+
|
|
353
|
+
{
|
|
354
|
+
:name => res.name,
|
|
355
|
+
:roid => res.roid,
|
|
356
|
+
:status => res.status[0],
|
|
357
|
+
:clID => res.client_id,
|
|
358
|
+
:crID => res.creator_id,
|
|
359
|
+
:crDate => res.created_date,
|
|
360
|
+
:addr => addrs
|
|
361
|
+
}
|
|
362
|
+
end
|
|
363
|
+
end
|
|
364
|
+
end
|