IO::EPP::Verisign
use IO::EPP::Verisign; # Parameters for IO::Socket::SSL my %sock_params = ( PeerHost => 'epp.verisign-grs.com', PeerPort => 700, SSL_key_file => 'key_file.pem', SSL_cert_file => 'cert_file.pem', Timeout => 30, ); # Create object, get greeting and call login() my $conn = IO::EPP::Verisign->new( { user => 'login', pass => 'XXXXX', sock_params => \%sock_params, server => 'Core', # or NameStore, or DotName test_mode => 0, # real connect } ); # Check domain my ( $answ, $code, $msg ) = $conn->check_domains( { domains => [ 'com.net', 'net.com' ] } ); # Call logout() and destroy object undef $conn;
Work with Verisign EPP API
Features: Very mach extension, verisign here is leader. Absolutely all extensions have not yet been implemented
docs: https://www.verisign.com/en_US/channel-resources/domain-registry-products/epp-sdks/index.xhtml?loc=en_US, https://epptool-ctld.verisign-grs.com/epptool/ (need white IP)
for .name: https://www.verisign.com/assets/email-forwarding-mapping.pdf
The behavior of Core and NameStore servers is markedly different.
Core
NameStore
Make a single request to the registry
A complete example is found in IO::EPP
Here are the features that distinguish the registry from the EPP RFC. All basic information about functions is in IO::EPP::Base
See description in "new" in IO::EPP::Base
Requires the server field to be specified, which can have values: Core for .com/.net/.edu, DotName for .name, NameStore for cctld and new gtlds.
server
DotName
Ext params for login,
INPUT: new password for change
.com/.net/.edu zones are not currently supported
For more information, see "check_contacts" in IO::EPP::Base
An Example
my ( $answ, $msg ) = make_request( 'check_contacts', { tld => 'name', contacts => [ 'PP-SP-001', 'GB789HBHKS' ] } ); # answer: { 'msg' => 'Command completed successfully', 'PP-SP-001' => { 'avail' => '0' }, 'GB789HBHKS' => { 'avail' => '1' }, 'BHJVJH' => { 'avail' => '1' }, 'code' => '1000' };
You cannot register a contact that has two data types at once -- int and loc, a contact can have any type, but only one.
int
loc
.com/.net/.edu zones are not currently supported.
For .jobs need additional parameters: jobs_title, jobs_website, jobs_industry_type, is_admin.
jobs_title
jobs_website
jobs_industry_type
is_admin
About .jobs parameters see https://www.verisign.com/assets/epp-jobscontact-extension.pdf.
The pp_flag / <disclose> flag is not supported, and the registry does not display contacts in whois
pp_flag
For more information, see "create_contact" in IO::EPP::Base.
Example with int data type
my %cont = ( name => 'Protection of Private Person', org => 'Private Person', addr => 'PO box 01, Protection Service', city => 'Moscow', state => '', postcode => '125000', country_code => 'RU', phone => '+7.4951111111', fax => '+7.4951111111', email => 'my@private.ru', ); my ( $answ, $msg ) = make_request( 'create_contact', { tld => 'name', %cont } ); # answer { 'msg' => 'Command completed successfully', 'cont_id' => '5555LECTU555', 'cre_date' => '2020-01-11 11:11:11', 'cltrid' => '5552d5cc9ab81c787eb9892eed888888', 'code' => 1000, 'svtrid' => '8888176177629-666916888' };
Example with loc data type
my %cont = ( loc => { name => 'Защита персональных данных', org => 'Частное лицо', addr => 'А/Я 01, Сервис защиты персональных данных', city => 'Москва', state => '', postcode => '125000', country_code => 'RU', }, phone => '+7.4951111111', fax => '+7.4951111111', email => 'my@private.ru', ); my ( $answ, $msg ) = make_request( 'create_contact', { tld => 'name', %cont } ); # answer { 'msg' => 'Command completed successfully', 'cont_id' => '5555EMELT555', 'cre_date' => '2020-01-11 11:11:11', 'cltrid' => '88807717dfcb0ea49d0106697e888888', 'code' => 1000, 'svtrid' => '8889175980353-666988888' };
For more information, see "get_contact_info" in IO::EPP::Base.
my ( $answ, $msg ) = make_request( 'get_contact_info', { tld => 'name', cont_id => '5555LECTU555' } ); # answer { 'int' => { 'city' => 'Moscow', 'country_code' => 'RU', 'name' => 'Protection of Private Person', 'postcode' => '125000', 'addr' => 'PO box 01, Protection Service', 'state' => undef }, 'roid' => '22222100_CONTACT_NAME-VRSN', 'cre_date' => '2020-01-11 11:11:11', 'email' => [ 'my@private.ru' ], 'upd_date' => '2020-01-11 11:11:11', 'fax' => [ '+7.4951111111' ], 'creater' => 'login', 'authinfo' => 'HF+B5ON$,qUDkyYW', 'code' => '1000', 'owner' => 'LOGIN', 'msg' => 'Command completed successfully', 'phone' => [ '+7.4951111111' ], 'updater' => 'login', 'cont_id' => '5555LECTU555', 'statuses' => { 'ok' => '+' } };
For more information, see "update_contact" in IO::EPP::Base.
For more information, see "delete_contact" in IO::EPP::Base.
Within a single server, all NS-s are shared, that is, if you register NS for the .com tld, it will be available for the .net tld as well.
For details, see "create_ns" in IO::EPP::Base.
With a single request, you can check availability in all zones of this server at once, if they have accreditation
In the example, accreditation is not available in the .edu tld. The .info tld belongs to a different registry.
my ( $answ, $msg ) = make_request( 'check_domains', { tld => 'com', domains => [ 'qwerty.com', 'bjdwferbkr-e3jd0hf.net', 'bjk8bj-kewew.edu', 'xn--xx.com', 'hiebw.info' ] } ); # answer { 'msg' => 'Command completed successfully', 'qwerty.com' => { 'reason' => 'Domain exists', 'avail' => '0' }, 'hiebw.info' => { 'reason' => 'Not an authoritative TLD', 'avail' => '0' }, 'bjk8bj-kewew.edu' => { 'reason' => 'Not authorized', 'avail' => '0' }, 'code' => '1000', 'xn--xx.com' => { 'reason' => 'Invalid punycode encoding', 'avail' => '0' }, 'bjdwferbkr-e3jd0hf.net' => { 'avail' => '1' } };
For details, see "check_domains" in IO::EPP::Base.
For IDN domains you need to specify the language code in the idn_lang field
idn_lang
See https://www.verisign.com/assets/idn-valid-language-tags.pdf, and https://www.iana.org/domains/idn-tables for .com, .net
An Example of a domain with idn_lang, without NSs
( $answ, $code, $msg ) = $conn->create_domain( { tld => 'com', dname => 'xn----htbdjfuifot5a9e.com', # хитрый-домен.com period => 1, idn_lang => 'RUS' } ); # answer { 'dname' => 'xn----htbdjfuifot5a9e.com', 'exp_date' => '2021-01-01 01:01:01', 'cre_date' => '2020-01-01 01:01:01', 'cltrid' => '37777a45e43d0c691c65538aacd77777', 'svtrid' => '8888827708-7856526698888' };
For more information, see "create_domain" in IO::EPP::Base.
my ( $answ, $msg, $conn ) = make_request( 'get_domain_info', { dname => 'llll.com' } ); # answer { 'msg' => 'Command completed successfully', 'owner' => '1000', 'hosts' => [ 'ns2.llll.com', 'ns1.llll.com' ], 'roid' => '2222489946_DOMAIN_COM-VRSN', 'exp_date' => '2020-01-01 01:01:01', 'cre_date' => '2018-01-01 01:01:01', 'nss' => [ 'ns1.rrr.ru', 'ns2.rrr.ru' ], 'dname' => 'llll.com', 'updater' => 'login', 'upd_date' => '2019-12-30 13:17:54', 'creater' => 'login', 'authinfo' => 'AAA:8k.o5*p"_pAA', 'statuses' => { 'clientTransferProhibited' => '+' }, 'code' => 1000 };
You can delete a domain only if it does not have NS-s that are used by other domains. If there are such NS-s, they should be renamed using the update_ns( chg => { new_name => 'new.ns.xxxx.com' } ), For details see "update_ns" in IO::EPP::Base.
update_ns( chg => { new_name => 'new.ns.xxxx.com' } )
For more information about delete, see "delete_domain" in IO::EPP::Base
delete
First call of restore — request
INPUT:
params with key:
dname — domain name
dname
OUTPUT: see "simple_request" in IO::EPP::Base.
Secont call of restore — confirmation
params with keys:
pre_data — whois before delete, may be none;
pre_data
post_data — whois now, may be none;
post_data
del_time — domain delete datetime in UTC;
del_time
rest_time — restore request call datetime in UTC.
rest_time
The following fields already contain the required value, they do not need to be passed:
resReason — restore reason: "Customer forgot to renew.";
resReason
statement — need to write what it is for the client: "I agree that the Domain Name has not been restored in order to assume the rights to use or sell the name to myself or for any third party. I agree that the information provided in this Restore Report is true to the best of my knowledge, and acknowledge that intentionally supplying false information in the Restore Report shall constitute an incurable material breach of the Registry-Registrar Agreement.";
statement
other — additional information, may be empty.
other
Processing a special messages from a poll. Now only processing the message about deleting NS.
my ( $answ, $msg, $conn ) = make_request( 'req_poll', \%conn_params ); # answer: { 'roid' => '77777866_HOST_NAME-VRSN', 'date' => '2020-01-10 10:10:10', 'cre_date' => '2010-01-10 10:15:05', 'ips' => [ '3.1.1.1' ], 'upd_date' => '2013-01-01 10:00:01', 'qmsg' => 'Unused Objects Policy', 'creater' => 'direct', 'id' => '2222282', 'ext' => { 'change' => { 'who' => 'ctldbatch', 'row_msg' => '<changePoll:operation op="purge">delete</changePoll:operation>', 'date' => '2020-01-10 10:00:10.000', 'reason' => 'Unused objects policy', 'svtrid' => '416801225', 'state' => 'before' } }, 'code' => 1301, 'msg' => 'Command completed successfully; ack to dequeue', 'owner' => 'LOGIN', 'count' => '13', 'cltrid' => '2222701245bb287334838a273fd22222', 'ns' => 'ns1.abuse.name', 'updater' => 'ctldbatch', 'statuses' => { 'ok' => '+' }, 'svtrid' => '7777770945650-666947777' };
Registry information for the specified zone
key in params: tld
tld
An Example:
my ( $answ, $code, $msg ) = $conn->get_registry_info( { tld => 'net' } ); # answer { 'alphaNumStart' => 'true', 'max' => [ '13', '13' ], 'language code' => [ 'ARG', 'ASM', 'AST', 'AVE', 'AWA', 'BAK', 'BAL', 'BAN', 'BAS', 'BEL', 'BOS', 'CAR', 'CHE', 'CHV', 'COP', 'COS', 'WEL', 'DIV', 'DOI', 'FIJ', 'FRY', 'GLA', 'GLE', 'GON', 'INC', 'IND', 'INH', 'JAV', 'KAS', 'KAZ', 'KHM', 'KIR', 'LTZ', 'MAO', 'MAY', 'MLT', 'MOL', 'MON', 'OSS', 'PUS', 'SIN', 'SMO', 'SOM', 'SRD', 'TGK', 'YID', 'AFR', 'ALB', 'ARA', 'ARM', 'AZE', 'BAQ', 'BEN', 'BHO', 'TIB', 'BUL', 'BUR', 'CAT', 'CZE', 'CHI', 'DAN', 'GER', 'DUT', 'GRE', 'ENG', 'EST', 'FAO', 'PER', 'FIN', 'FRE', 'GEO', 'GUJ', 'HEB', 'HIN', 'SCR', 'HUN', 'ICE', 'ITA', 'JPN', 'KOR', 'KUR', 'LAO', 'LAV', 'LIT', 'MAC', 'MAL', 'NEP', 'NOR', 'ORI', 'PAN', 'POL', 'POR', 'RAJ', 'RUM', 'RUS', 'SAN', 'SCC', 'SLO', 'SLV', 'SND', 'SPA', 'SWA', 'SWE', 'SYR', 'TAM', 'TEL', 'THA', 'TUR', 'UKR', 'URD', 'UZB', 'VIE' ], 'gracePeriod command:transfer unit:d' => '5', 'gracePeriod command:create unit:d' => '5', 'default unit:y' => [ '1', '1', '1' ], 'gracePeriod command:autorenew unit:d' => '45', 'subProduct' => 'NET', 'idnVersion' => '1.1', 'expression' => [ '[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?', '^(?=.*\\\\d)(?=.*[a-zA-Z])(?=.*[\\\\x21-\\\\x2F\\\\x3A-\\\\x40\\\\x5B-\\\\x60\\\\x7B-\\\\x7E])[\\\\x21-\\\\x7e]{8,32}$', '^([\\-|\\w])+\\.([\\-|\\w])+\\s{0,}$)$' ], 'redemptionPeriod unit:d' => '30', 'encoding' => 'PunyCode', 'max unit:y' => [ '10', '10', '1' ], 'name' => 'NET', 'maxCheckHost' => '20', 'urgent' => 'false', 'default' => '604800', 'onlyDnsChars' => 'true', 'maxCheckDomain' => '20', 'transferHoldPeriod unit:d' => '5', 'digestType' => [ 'SHA-1', 'SHA-256', 'GOST R 34.11-94', 'SHA-384' ], 'alg' => [ 'RSAMD5', 'DH', 'DSA', 'RSASHA1', 'DSA-NSEC3-SHA1', 'RSASHA1-NSEC3-SHA1', 'RSASHA256', 'RSASHA512', 'ECC-GOST', 'ECDSAP256SHA256', 'ECDSAP384SHA384' ], 'startDate' => '2000-01-01T00:00:00Z', 'minLength' => '3', 'status' => [ 'ok', 'serverHold', 'serverRenewProhibited', 'serverTransferProhibited', 'serverUpdateProhibited', 'serverDeleteProhibited', 'redemptionPeriod', 'pendingRestore', 'pendingDelete', 'clientRenewProhibited', 'clientTransferProhibited', 'clientUpdateProhibited', 'clientDeleteProhibited', 'pendingTransfer', 'clientHold', 'ok', 'pendingDelete', 'pendingTransfer', 'serverUpdateProhibited', 'serverDeleteProhibited', 'clientUpdateProhibited', 'clientDeleteProhibited', 'linked' ], 'zoneMember type:equal' => 'NET', 'group' => 'THIN', 'clientDefined' => 'false', 'pendingRestore unit:d' => '7', 'minIP' => [ '1', '0' ], 'extURI required:true' => [ 'urn:ietf:params:xml:ns:coa-1.0', 'http://www.verisign.com/epp/idnLang-1.0', 'urn:ietf:params:xml:ns:secDNS-1.1', 'http://www.verisign-grs.com/epp/namestoreExt-1.1', 'urn:ietf:params:xml:ns:rgp-1.0', 'http://www.verisign.com/epp/whoisInf-1.0', 'http://www.verisign.com/epp/sync-1.0', 'http://www.verisign.com/epp/relatedDomain-1.0', 'urn:ietf:params:xml:ns:launch-1.0' ], 'upDate' => '2013-08-10T21:16:01Z', 'min unit:y' => [ '1', '1', '1' ], 'unicodeVersion' => '6.0', 'commingleAllowed' => 'false', 'pendingDelete unit:d' => '5', 'sharePolicy' => [ 'perSystem', 'perSystem' ], 'min' => [ '0', '0', '1' ], 'idnaVersion' => 'IDNA 2008', 'objURI required:true' => [ 'urn:ietf:params:xml:ns:domain-1.0', 'urn:ietf:params:xml:ns:contact-1.0', 'urn:ietf:params:xml:ns:host-1.0', 'http://www.verisign.com/epp/registry-1.0', 'http://www.verisign.com/epp/lowbalance-poll-1.0', 'http://www.verisign.com/epp/rgp-poll-1.0' ], 'crDate' => '2000-01-01T00:00:00Z', 'premiumSupport' => 'false', 'alphaNumEnd' => 'true', 'gracePeriod command:renew unit:d' => '5', 'maxLength' => '63', 'maxIP' => [ '13', '0' ], 'contactsSupported' => 'false' };
Vadim Likhota <vadiml@cpan.org>
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install IO::EPP::TCI, copy and paste the appropriate command in to your terminal.
cpanm
cpanm IO::EPP::TCI
CPAN shell
perl -MCPAN -e shell install IO::EPP::TCI
For more information on module installation, please visit the detailed CPAN module installation guide.