NAME
IO::EPP::Verisign
SYNOPSIS
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;
DESCRIPTION
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.
FUNCTIONS
make_request
Make a single request to the registry
A complete example is found in IO::EPP
METHODS
Here are the features that distinguish the registry from the EPP RFC. All basic information about functions is in IO::EPP::Base
new
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.
login
Ext params for login,
INPUT: new password for change
check_contacts
.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'
};
create_contact
You cannot register a contact that has two data types at once -- int
and loc
, a contact can have any type, but only one.
.com/.net/.edu zones are not currently supported.
For .jobs need additional parameters: 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
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'
};
get_contact_info
.com/.net/.edu zones are not currently supported.
For more information, see "get_contact_info" in IO::EPP::Base.
An Example
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' => '+'
}
};
update_contact
.com/.net/.edu zones are not currently supported.
For more information, see "update_contact" in IO::EPP::Base.
delete_contact
.com/.net/.edu zones are not currently supported.
For more information, see "delete_contact" in IO::EPP::Base.
create_ns
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.
check_domains
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.
create_domain
For IDN domains you need to specify the language code in the idn_lang
field
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.
get_domain_info
For details, see "check_domains" in IO::EPP::Base.
An Example
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
};
delete_domain
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.
For more information about delete
, see "delete_domain" in IO::EPP::Base
restore_domain
First call of restore — request
INPUT:
params with key:
dname
— domain name
OUTPUT: see "simple_request" in IO::EPP::Base.
confirmations_restore_domain
Secont call of restore — confirmation
INPUT:
params with keys:
dname
— domain name
pre_data
— whois before delete, may be none;
post_data
— whois now, may be none;
del_time
— domain delete datetime in UTC;
rest_time
— restore request call datetime in UTC.
The following fields already contain the required value, they do not need to be passed:
resReason
— restore reason: "Customer forgot to renew.";
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.";
other
— additional information, may be empty.
OUTPUT: see "simple_request" in IO::EPP::Base.
req_poll_ext
Processing a special messages from a poll. Now only processing the message about deleting NS.
An Example
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'
};
get_registry_info
Registry information for the specified zone
key in params: 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'
};
AUTHORS
Vadim Likhota <vadiml@cpan.org>
COPYRIGHT
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.