File Coverage

blib/lib/IO/EPP/CoreNic.pm
Criterion Covered Total %
statement 12 157 7.6
branch 0 54 0.0
condition 0 13 0.0
subroutine 4 12 33.3
pod 8 8 100.0
total 24 244 9.8


line stmt bran cond sub pod time code
1             package IO::EPP::CoreNic;
2              
3             =encoding utf8
4              
5             =head1 NAME
6              
7             IO::EPP::CoreNic
8              
9             =head1 SYNOPSIS
10              
11             use IO::EPP::CoreNic;
12              
13             # Parameters for IO::Socket::SSL
14             my %sock_params = (
15             PeerHost => 'epp.nic.xn--80aswg',
16             PeerPort => 700,
17             # without certificate
18             Timeout => 30,
19             );
20              
21             # Create object, get greeting and call login()
22             my $conn = IO::EPP::CoreNic->new( {
23             user => 'login',
24             pass => 'xxxx',
25             sock_params => \%sock_params,
26             test_mode => 0, # real connect
27             } );
28              
29             # Check domain
30             my ( $answ, $code, $msg ) = $conn->check_domains( { domains => [ 'xn--d1acufc.xn--80aswg' ] } );
31              
32             # Call logout() and destroy object
33             undef $conn;
34              
35             =head1 DESCRIPTION
36              
37             Module for work with CoreNic domains
38              
39             Feature: in all responses incomplete xml schemas, for example, instead of C<< >> is written C<< >>
40              
41             =cut
42              
43 1     1   2293 use IO::EPP::Base;
  1         4  
  1         43  
44 1     1   8 use parent qw( IO::EPP::Base );
  1         2  
  1         8  
45              
46 1     1   66 use strict;
  1         2  
  1         20  
47 1     1   4 use warnings;
  1         2  
  1         2446  
48              
49              
50             sub make_request {
51 0     0 1   my ( $action, $params ) = @_;
52              
53 0           $params = IO::EPP::Base::recursive_utf8_unflaged( $params );
54              
55 0 0 0       if ( !$params->{tld} && $params->{dname} ) {
56 0           ( $params->{tld} ) = $params->{dname} =~ /^[0-9a-z\-]+\.(.+)$/;
57             }
58              
59 0           my ( $self, $code, $msg, $answ );
60              
61 0 0         unless ( $params->{conn} ) {
62 0   0       $params->{sock_params}{PeerHost} ||= 'epp.nic.xn--80aswg';
63 0   0       $params->{sock_params}{PeerPort} ||= 700;
64              
65 0           ( $self, $code, $msg ) = __PACKAGE__->new( $params );
66              
67 0 0 0       unless ( $code and $code == 1000 ) {
68 0           goto END_MR;
69             }
70             }
71             else {
72 0           $self = $params->{conn};
73             }
74              
75              
76 0           $self->{critical_error} = '';
77              
78 0 0         if ( $self->can( $action ) ) {
79 0           ( $answ, $code, $msg ) = $self->$action( $params );
80             }
81             else {
82 0           $msg = "undefined command <$action>, request cancelled";
83 0           $code = 0;
84             }
85              
86              
87             END_MR:
88              
89 0 0         $msg .= '; ' . $self->{critical_error} if $self->{critical_error};
90              
91 0           my $full_answ = "code: $code\nmsg: $msg";
92              
93 0 0 0       $answ = {} unless $answ && ref $answ;
94              
95 0           $answ->{code} = $code;
96 0           $answ->{msg} = $msg;
97              
98 0 0         return wantarray ? ( $answ, $full_answ, $self ) : $answ;
99             }
100              
101              
102             =head1 METHODS
103              
104             Next, those functions are redefined in which the provider has additions to the EPP
105              
106             =head2 login
107              
108             Ext params for login,
109              
110             INPUT: new password for change
111              
112             =cut
113              
114             sub login {
115 0     0 1   my ( $self, $pw ) = @_;
116              
117 0           my ( $svcs, $extension );
118              
119 0           $svcs = '
120             urn:ietf:params:xml:ns:host-1.0
121             urn:ietf:params:xml:ns:domain-1.0
122             urn:ietf:params:xml:ns:contact-1.0';
123 0           $extension = '
124             urn:ietf:params:xml:ns:rgp-1.0
125             http://xmlns.corenic.net/epp/idn-1.0
126             urn:ietf:params:xml:ns:launch-1.0
127             urn:ietf:params:xml:ns:secDNS-1.1';
128              
129             # http://xmlns.corenic.net/epp/auction-1.0
130              
131 0           return $self->SUPER::login( $pw, $svcs, $extension );
132             }
133              
134              
135             sub cont_from_xml {
136 0     0 1   my ( undef, $rdata ) = @_;
137              
138 0           my %cont;
139              
140 0           ( $cont{cont_id} ) = $rdata =~ /([^<>]+)<\/id>/;
141              
142 0           ( $cont{roid} ) = $rdata =~ /([^<>]+)<\/roid>/;
143              
144 0           my @atypes = ( 'int', 'loc' );
145 0           foreach my $atype ( @atypes ) {
146 0           my ( $postal ) = $rdata =~ /(.+?)<\/postalInfo>/;
147              
148 0 0         next unless $postal;
149              
150 0           ( $cont{$atype}{name} ) = $postal =~ /([^<>]+)<\/name>/;
151              
152 0           ( $cont{$atype}{company} ) = $rdata =~ /([^<>]*)<\/org>/;
153              
154 0           $cont{$atype}{addr} = join(', ', $postal =~ /([^<>]*)<\/street>/ );
155              
156 0           ( $cont{$atype}{city} ) = $postal =~ /([^<>]*)<\/city>/;
157              
158 0           ( $cont{$atype}{'state'} ) = $postal =~ /([^<>]*)<\/sp>/;
159              
160 0           ( $cont{$atype}{postcode} ) = $postal =~ /([^<>]*)<\/pc>/;
161              
162 0           ( $cont{$atype}{country_code} ) = $postal =~ /([A-Z]+)<\/cc>/;
163             }
164              
165 0           ( $cont{phone} ) = $rdata =~ /]*>([0-9+.]*)<\/voice>/;
166              
167 0           ( $cont{fax} ) = $rdata =~ /]*>([0-9+.]*)<\/fax>/;
168              
169 0           ( $cont{email} ) = $rdata =~ /([^<>]+)<\/email>/;
170              
171             #
172 0           my @ss = $rdata =~ //g;
173 0           $cont{statuses}{$_} = '+' for @ss;
174              
175 0 0         if ( $rdata =~ /(.+?)<\/pw>/ ) {
176 0           $cont{authinfo} = $1;
177             }
178              
179 0           my ( $visible ) = $rdata =~ //;
180 0 0         $cont{pp_flag} = $visible ? 0 : 1;
181              
182 0           my %id = %IO::EPP::Base::id;
183 0           foreach my $k ( keys %id ) {
184 0 0         if ( $rdata =~ /<$k>([^<>]+)<\/$k>/ ) {
185 0           $cont{$id{$k}} = $1;
186             }
187             }
188              
189 0           my %dt = %IO::EPP::Base::dt;
190 0           foreach my $k ( keys %dt ) {
191 0 0         if ( $rdata =~ /<$k>([^<>]+)<\/$k>/ ) {
192 0           $cont{$dt{$k}} = $1;
193              
194 0           $cont{$dt{$k}} =~ s/T/ /;
195 0           $cont{$dt{$k}} =~ s/\.\d+Z$//;
196             }
197             }
198              
199 0           return \%cont;
200             }
201              
202              
203             sub update_contact {
204 0     0 1   my ( $self, $params ) = @_;
205              
206 0 0         if ( $params->{chg} ) {
207 0           $params->{chg}{need_name} = 1;
208 0           $params->{chg}{authinfo} = IO::EPP::Base::gen_pw( 12 );
209             }
210              
211 0           return $self->SUPER::update_contact( $params );
212             }
213              
214             sub get_ns_info_rdata {
215 0     0 1   my ( undef, $rdata ) = @_;
216              
217 0           my %ns;
218              
219 0           ( $ns{name} ) = $rdata =~ /([^<>]+)<\/name>/;
220 0           $ns{name} = lc $ns{name};
221              
222 0           ( $ns{roid} ) = $rdata =~ /([^<>]+)<\/roid>/;
223              
224             #
225 0           my @ss = $rdata =~ //g;
226 0           $ns{statuses}{$_} = '+' for @ss;
227              
228 0           $ns{addrs} = [ $rdata =~ /([0-9A-Fa-f.:]+)<\/addr>/g ];
229              
230 0           my %id = %IO::EPP::Base::id;
231 0           foreach my $k ( keys %id ) {
232 0 0         if ( $rdata =~ /<$k>([^<>]+)<\/$k>/ ) {
233 0           $ns{$id{$k}} = $1;
234             }
235             }
236              
237 0           my %dt = %IO::EPP::Base::dt;
238 0           foreach my $k ( keys %dt ) {
239 0 0         if ( $rdata =~ /<$k>([^<>]+)<\/$k>/ ) {
240 0           $ns{$dt{$k}} = $1;
241              
242 0           $ns{$dt{$k}} =~ s/T/ /;
243 0           $ns{$dt{$k}} =~ s/\.\d+Z$//;
244             }
245             }
246              
247 0           return \%ns;
248             }
249              
250              
251             sub check_domains_rdata {
252 0     0 1   my ( undef, $rdata ) = @_;
253              
254 0           my @aa = $rdata =~ /([^<>]+<\/name>(?:[^<>]+<\/reason>)?)<\/cd>/sg;
255              
256 0           my %domlist;
257 0           foreach my $a ( @aa ) {
258 0 0         if ( $a =~ /([^<>]+)<\/name>/ ) {
259 0           my $dm = lc($2);
260 0 0         $domlist{$dm} = { avail => ( $1 eq 'true' ? 1 : 0 ) }; # no utf8, puny only
261              
262 0 0         if ( $a =~ /([^<>]+)<\/reason>/ ) {
263 0           $domlist{$dm}{reason} = $1;
264             }
265             }
266             }
267              
268 0           return \%domlist;
269             }
270              
271              
272             sub get_domain_info_rdata {
273 0     0 1   my ( undef, $rdata ) = @_;
274              
275 0           my $info = {};
276              
277 0           ( $info->{dname} ) = $rdata =~ /([^<>]+)<\/name>/;
278 0           $info->{dname} = lc $info->{dname};
279              
280             #
281 0           my @ss = $rdata =~ //g;
282 0           $info->{statuses}{$_} = '+' for @ss;
283              
284 0           ( $info->{reg_id} ) = $rdata =~ /([^<>]+)<\/registrant>/;
285              
286 0           my @cc = $rdata =~ /[^<>]+<\/contact>/g;
287 0           foreach my $row ( @cc ) {
288 0 0         if ( $row =~ /([^<>]+)<\/contact>/ ) {
289 0           $info->{ lc($1) . '_id' } = $2;
290             }
291             }
292              
293 0 0         if ( $rdata =~ // ) {
294 0           $info->{nss} = [ $rdata =~ /([^<>]+)<\/hostObj>/g ];
295             }
296              
297 0 0         if ( $info->{nss} ) {
298 0           $info->{nss} = [ map{ lc $_ } @{$info->{nss}} ];
  0            
  0            
299             }
300              
301             # domain-based nss
302 0 0         if ( $rdata =~ // ) {
303 0           $info->{hosts} = [ $rdata =~ /([^<>]+)<\/host>/g ];
304 0           $info->{hosts} = [ map{ lc $_ } @{$info->{hosts}} ];
  0            
  0            
305             }
306              
307 0           my %id = %IO::EPP::Base::id;
308 0           foreach my $k ( keys %id ) {
309 0 0         if ( $rdata =~ /<$k>([^<>]+)<\/$k>/ ) {
310 0           $info->{$id{$k}} = $1;
311             }
312             }
313              
314 0           my %dt = %IO::EPP::Base::dt;
315 0           foreach my $k ( keys %dt ) {
316 0 0         if ( $rdata =~ /<$k>([^<>]+)<\/$k>/ ) {
317 0           $info->{$dt{$k}} = $1;
318              
319 0           $info->{$dt{$k}} =~ s/T/ /;
320 0           $info->{$dt{$k}} =~ s/\.\d+Z$//;
321             }
322             }
323              
324 0 0         if ( $rdata =~ /authInfo.+([^<>]+)<\/pw>.+authInfo/s ) {
325 0           ( $info->{authinfo} ) = $1;
326              
327             #$info->{authinfo} =~ s/>/>/g;
328             #$info->{authinfo} =~ s/</
329             #$info->{authinfo} =~ s/&/&/g;
330             }
331              
332 0           return $info;
333             }
334              
335              
336             sub req_poll_rdata {
337 0     0 1   my ( $self, $rdata, undef ) = @_;
338              
339 0           my %info;
340              
341 0 0         if ( $rdata =~ /^]*>(.+)<\/trnData>/ ) {
342 0           my $trn = $1;
343 0           $info{transfer} = {};
344 0           ( $info{transfer}{dname} ) = $trn =~ /([^<>]+)<\/name>/;
345 0           ( $info{transfer}{status} ) = $trn =~ /([^<>]+)<\/trStatus>/;
346              
347 0           my %id = %IO::EPP::Base::id;
348 0           foreach my $k ( keys %id ) {
349 0 0         if ( $rdata =~ /([^<>]+)<\/domain:$k>/ ) {
350 0           $info{transfer}{$id{$k}} = $1;
351             }
352             }
353             }
354             else {
355 0           return ( 0, 'New CoreNic message type!' );
356             }
357              
358 0           return ( \%info, '' );
359             }
360              
361              
362             1;
363              
364              
365             __END__