IO-EPP
view release on metacpan or search on metacpan
lib/IO/EPP/DrsUa.pm view on Meta::CPAN
sub login {
my ( $self, $pw ) = @_;
# wihout urn:ietf:params:xml:ns:host
my $svcs = '
<objURI>urn:ietf:params:xml:ns:contact-1.0</objURI>
<objURI>urn:ietf:params:xml:ns:domain-1.0</objURI>';
my $extension = '
<objURI>http://drs.ua/epp/drs-1.0</objURI>'; # objURI !!! not extURI !!!
return $self->SUPER::login( $pw, $svcs, $extension );
}
sub _prepare_contact {
my ( $params ) = @_;
# int only: code: 2400, msg: Only 'loc' type of postal info is supported
# int + loc: code: 2400, msg: Multiple postal info not supported
unless ( $$params{'loc'} ) {
foreach my $f ( 'name','first_name','last_name','company','addr','city','state','postcode','country_code' ) {
$$params{'loc'}{$f} = delete $$params{$f} if defined $$params{$f};
}
}
}
=head1 create_contact
It has many features, see the description of the module above
=cut
sub create_contact {
my ( $self, $params ) = @_;
_prepare_contact( $params );
my $visible = $$params{pp_flag} ? 0 : 1;
# This format is feature drs, but for biz.ua, co.ua only
$params->{pp_ext} = '
<contact:disclose flag="'.$visible.'">
<contact:name type="loc"/>
<contact:org type="loc"/>
<contact:addr type="loc"/>
<contact:voice/>
<contact:fax/>
<contact:email/>
</contact:disclose>';
return $self->SUPER::create_contact( $params );
}
=head1 update_contact
It has many features, see the description of the module above
=cut
sub update_contact {
my ( $self, $params ) = @_;
_prepare_contact( $params );
$params->{chg}{need_name} = 1;
my $visible = $$params{pp_flag} ? 0 : 1;
$params->{pp_ext} = '
<contact:disclose flag="'.$visible.'">
<contact:name type="loc"/>
<contact:org type="loc"/>
<contact:addr type="loc"/>
<contact:voice/>
<contact:fax/>
<contact:email/>
</contact:disclose>';
return $self->SUPER::update_contact( $params );
}
sub create_domain_nss {
my ( $self, $params ) = @_;
my $nss = '';
# Old EPP version, sbut it was resolved in https://tools.ietf.org/html/rfc3731
foreach my $ns ( @{$params->{nss}} ) {
$nss .= " <domain:hostAttr>\n <domain:hostName>$ns</domain:hostName>\n </domain:hostAttr>\n";
}
$nss = "\n <domain:ns>\n$nss </domain:ns>" if $nss;
return $nss;
}
sub create_domain {
my ( $self, $params ) = @_;
$params->{authinfo} ||= IO::EPP::Base::gen_pw( 16 );
return $self->SUPER::create_domain( $params );
}
sub update_domain_add_nss {
my ( $self, $params ) = @_;
my $add = " <domain:ns>\n";
# Old EPP version, see in https://tools.ietf.org/html/rfc3731
foreach my $ns ( @{$$params{add}{nss}} ) {
$add .= " <domain:hostAttr>\n <domain:hostName>$$ns{ns}</domain:hostName>\n";
if ( $ns->{ips} ) {
foreach my $ip ( @{$ns->{ips}} ) {
if ( $ip =~ /^\d+\.\d+\.\d+\.\d+$/ ) {
$add .= " <domain:hostAddr ip=\"v4\">$ip</domain:hostAddr>\n";
}
else {
$add .= " <domain:hostAddr ip=\"v6\">$ip</domain:hostAddr>\n";
}
}
}
$add .= " </domain:hostAttr>\n";
}
$add .= " </domain:ns>\n";
return $add;
}
sub update_domain_rem_nss {
my ( $self, $params ) = @_;
my $rem = " <domain:ns>\n";
# Old EPP version, see in https://tools.ietf.org/html/rfc3731
foreach my $ns ( @{$$params{rem}{nss}} ) {
$rem .= " <domain:hostAttr>\n <domain:hostName>$$ns{ns}</domain:hostName>\n";
if ( $ns->{ips} ) {
foreach my $ip ( @{$ns->{ips}} ) {
if ( $ip =~ /^\d+\.\d+\.\d+\.\d+$/ ) {
$rem .= " <domain:hostAddr ip=\"v4\">$ip</domain:hostAddr>\n";
}
else {
$rem .= " <domain:hostAddr ip=\"v6\">$ip</domain:hostAddr>\n";
}
}
}
$rem .= " </domain:hostAttr>\n";
}
$rem .= " </domain:ns>\n";
return $rem;
}
sub update_domain {
my ( $self, $params ) = @_;
$params->{nss_as_attr} = 1;
return $self->SUPER::update_domain( $params );
}
=head1 req_poll
It has many features, see the description of the module above
=cut
sub req_poll_rdata {
my ( $self, $rdata, undef ) = @_;
my %info;
if ( $rdata =~ /^<domain:trnData/ ) {
# TRANSFER_PENDING, TRANSFER_CLIENT_APPROVED, TRANSFER_SERVER_APPROVED
$info{transfer} = {};
( $info{transfer}{dname} ) = $rdata =~ /<domain:name>([^<>]+)<\/domain:name>/;
( $info{transfer}{status} ) = $rdata =~ /<domain:trStatus>([^<>]+)<\/domain:trStatus>/;
my %id = %IO::EPP::Base::id;
foreach my $k ( keys %id ) {
if ( $rdata =~ /<domain:$k>([^<>]+)<\/domain:$k>/ ) {
$info{transfer}{$id{$k}} = $1;
}
}
#( $info{transfer}{from} ) = $rdata =~ /<domain:acID>([^<>]+)<\/domain:acID>/;
#( $info{transfer}{to} ) = $rdata =~ /<domain:reID>([^<>]+)<\/domain:reID>/;
my %dt = %IO::EPP::Base::dt;
foreach my $k ( keys %dt ) {
if ( $rdata =~ /<domain:$k>([^<>]+)<\/domain:$k>/ ) {
$info{transfer}{$dt{$k}} = IO::EPP::Base::cldate( $1 );
}
}
}
elsif ( $rdata =~ /^<domain:panData/ ) {
# Pending action completed with error.
# Pending action completed successfully.
$info{upd_del} = {};
( $info{upd_del}{result}, $info{upd_del}{dname} ) = $rdata =~ /<domain:name paResult="([^"]+)">([^<>]+)<\/domain:name>/;
if ( $rdata =~ /<domain:paTRID>(.+)<\/domain:paTRID>/ ) {
my $trids = $1;
( $info{upd_del}{cltrid} ) = $trids =~ /<clTRID>([^<>]+)<\/clTRID>/;
( $info{upd_del}{svtrid} ) = $trids =~ /<svTRID>([^<>]+)<\/svTRID>/;
}
if ( $rdata =~ /<domain:paDate>([^<>]+)<\/domain:paDate>/ ) {
$info{upd_del}{date} = IO::EPP::Base::cldate( $1 );
}
}
elsif ( $rdata =~ /^<drs:notify/ ) {
# drs feature
$info{notify} = {};
( $info{notify}{type} ) = $rdata =~ /<drs:type>([^<>]+)<\/drs:type>/; # command
( $info{notify}{object} ) = $rdata =~ /<drs:object>([^<>]+)<\/drs:object>/; # domain
( run in 0.922 second using v1.01-cache-2.11-cpan-f56aa216473 )