Author image Vadim Likhota (Вадим Лихота)

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.