File Coverage

blib/lib/Net/DRI/Protocol/EPP/Extensions/PRO/AV.pm
Criterion Covered Total %
statement 15 137 10.9
branch 0 80 0.0
condition 0 36 0.0
subroutine 5 13 38.4
pod 0 8 0.0
total 20 274 7.3


line stmt bran cond sub pod time code
1             ## Domain Registry Interface, .PRO A/V extensions
2             ##
3             ## Copyright (c) 2008,2009,2013 Tonnerre Lombard .
4             ## All rights reserved.
5             ##
6             ## This file is part of Net::DRI
7             ##
8             ## Net::DRI is free software; you can redistribute it and/or modify
9             ## it under the terms of the GNU General Public License as published by
10             ## the Free Software Foundation; either version 2 of the License, or
11             ## (at your option) any later version.
12             ##
13             ## See the LICENSE file that comes with this distribution for more details.
14             ####################################################################################################
15              
16             package Net::DRI::Protocol::EPP::Extensions::PRO::AV;
17              
18 1     1   1439 use strict;
  1         1  
  1         29  
19 1     1   4 use warnings;
  1         1  
  1         21  
20              
21 1     1   4 use Net::DRI::Util;
  1         2  
  1         16  
22 1     1   4 use Net::DRI::Exception;
  1         1  
  1         20  
23 1     1   4 use DateTime::Format::ISO8601;
  1         1  
  1         1883  
24              
25             =pod
26              
27             =head1 NAME
28              
29             Net::DRI::Protocol::EPP::Extensions::PRO::AV - .PRO EPP A/V extensions for Net::DRI
30              
31             =head1 DESCRIPTION
32              
33             Please see the README file for details.
34              
35             =head1 SUPPORT
36              
37             For now, support questions should be sent to:
38              
39             Edevelopment@sygroup.chE
40              
41             Please also see the SUPPORT file in the distribution.
42              
43             =head1 SEE ALSO
44              
45             Ehttp://www.dotandco.com/services/software/Net-DRI/E and
46             Ehttp://oss.bdsprojects.net/projects/netdri/E
47              
48             =head1 AUTHOR
49              
50             Tonnerre Lombard Etonnerre.lombard@sygroup.chE,
51             Alexander Biehl, Einfo@hexonet.netE, HEXONET Support GmbH,
52             Ehttp://www.hexonet.net/E.
53              
54             =head1 COPYRIGHT
55              
56             Copyright (c) 2008,2009,2013 Tonnerre Lombard .
57             All rights reserved.
58              
59             This program is free software; you can redistribute it and/or modify
60             it under the terms of the GNU General Public License as published by
61             the Free Software Foundation; either version 2 of the License, or
62             (at your option) any later version.
63              
64             See the LICENSE file that comes with this distribution for more details.
65              
66             =cut
67              
68             ####################################################################################################
69              
70             sub register_commands
71             {
72 0     0 0   my ($class, $version) = @_;
73 0           my %avcmds = (
74             create => [ \&create, \&create_parse ],
75             check => [ \&check, \&check_parse ],
76             info => [ \&info, \&info_parse ],
77             );
78              
79 0           return { 'av' => \%avcmds };
80             }
81              
82             ####################################################################################################
83             ############ Query commands
84              
85             sub build_command
86             {
87 0     0 0   my ($msg, $command, $domain, $domainattr) = @_;
88 0 0         my @dom = (ref($domain) ? @$domain : ($domain));
89              
90 0 0         Net::DRI::Exception->die(1, 'protocol/EPP', 2, 'Domain name needed')
91             unless @dom;
92              
93 0           foreach my $d (@dom)
94             {
95 0 0 0       Net::DRI::Exception->die(1, 'protocol/EPP', 2,
96             'Domain name needed') unless (defined($d) && $d);
97 0 0         Net::DRI::Exception->die(1, 'protocol/EPP', 10,
98             'Invalid domain name: ' . $d)
99             unless Net::DRI::Util::is_hostname($d);
100             }
101              
102 0 0         my $tcommand = (ref($command) ? $command->[0] : $command);
103 0           $msg->command([$command, 'av:' . $tcommand,sprintf('xmlns:av="%s" xsi:schemaLocation="%s %s"',$msg->nsattrs('av'))]);
104 0           return map { ['av:id', $_, $domainattr] } @dom;
  0            
105             }
106              
107             sub check
108             {
109 0     0 0   my ($epp, $av, $rd) = @_;
110 0           my $mes = $epp->message();
111 0           my @d = build_command($mes, 'check', $av);
112 0           $mes->command_body(\@d);
113 0           return;
114             }
115              
116             sub check_parse
117             {
118 0     0 0   my ($po, $otype, $oaction, $oname, $rinfo) = @_;
119 0           my $mes = $po->message();
120              
121 0 0         return unless ($mes->is_success());
122              
123 0           my $chkdata = $mes->get_response('av','chkData');
124 0 0         return unless $chkdata;
125              
126 0           my $cd = $chkdata->getFirstChild();
127              
128 0   0       while (defined($cd) && $cd)
129             {
130 0           my $cdn;
131             my $avid;
132 0           my $c;
133              
134 0 0         next unless ($cd->nodeType() == 1); ## only for element nodes
135 0   0       $cdn = $cd->localname() || $cd->nodeName();
136 0           $c = $cd->getFirstChild();
137              
138 0   0       while (defined($c) && $c)
139             {
140             ## only for element nodes
141 0 0         next unless ($c->nodeType() == 1);
142 0   0       my $n = $c->localname() || $c->nodeName();
143              
144 0 0         if ($n eq 'id')
    0          
145             {
146 0           $avid = $c->getFirstChild()->getData();
147 0           $rinfo->{av}->{$avid}->{action} = 'check';
148             $rinfo->{av}->{$avid}->{exist} =
149 0           1 - Net::DRI::Util::xml_parse_boolean($c->getAttribute('avail'));
150             }
151             elsif ($n eq 'reason')
152             {
153             $rinfo->{av}->{$avid}->{exist_reason} =
154 0           $c->getFirstChild()->getData();
155             }
156 0           } continue { $c = $c->getNextSibling(); }
157 0           } continue { $cd = $cd->getNextSibling(); }
158 0           return;
159             }
160              
161             sub info
162             {
163 0     0 0   my ($epp, $av, $rd) = @_;
164 0           my $mes = $epp->message();
165 0           my @d = build_command($mes, 'info', $av);
166 0           $mes->command_body(\@d);
167 0           return;
168             }
169              
170             sub info_parse
171             {
172 0     0 0   my ($po, $otype, $oaction, $oname, $rinfo) = @_;
173 0           my $mes = $po->message();
174 0           my $ns = $mes->ns('av');
175 0           my $infdata;
176             my $avid;
177 0           my $cd;
178 0           my $pd;
179              
180 0 0         return unless ($mes->is_success());
181              
182 0           $infdata = $mes->get_response('av','infData');
183 0 0         return unless $infdata;
184              
185 0           $cd = $infdata->getFirstChild();
186 0           $pd = DateTime::Format::ISO8601->new();
187              
188 0   0       while (defined($cd) && $cd)
189             {
190 0 0         next unless ($cd->nodeType() == 1); ## only for element nodes
191 0   0       my $cdn = $cd->localname() || $cd->nodeName();
192              
193 0 0         if ($cdn eq 'id')
    0          
    0          
    0          
    0          
    0          
    0          
194             {
195 0           $avid = $cd->getFirstChild()->getData();
196 0           $rinfo->{av}->{$avid}->{id} = $avid;
197 0           $rinfo->{av}->{$avid}->{action} = 'info';
198             }
199             elsif ($cdn =~ /^(?:avurl|roid|host)$/i)
200             {
201 0           $rinfo->{av}->{$avid}->{lc($cdn)} =
202             $cd->getFirstChild()->getData();
203             }
204             elsif (lc($cdn) eq 'checktype')
205             {
206             $rinfo->{av}->{$avid}->{type} =
207 0           $cd->getFirstChild()->getData();
208             }
209             elsif ($cdn =~ /^(?:c[lr]|up)id$/i)
210             {
211 0           $cdn = lc($cdn); $cdn =~ s/id$/ID/;
  0            
212 0           $rinfo->{av}->{$avid}->{$cdn} =
213             $cd->getFirstChild()->getData();
214             }
215             elsif ($cdn =~ /^(?:c[lr]|up)date$/i)
216             {
217 0           $cdn = lc($cdn); $cdn =~ s/date$/Date/;
  0            
218 0           $rinfo->{av}->{$avid}->{$cdn} = $pd->parse_datetime(
219             $cd->getFirstChild()->getData());
220             }
221             elsif (lc($cdn) eq 'contactid')
222             {
223 0           my $c = $po->create_local_object('contact');
224 0           $c->srid($cd->getFirstChild()->getData());
225 0           $rinfo->{av}->{$avid}->{contact} = $c;
226             }
227             elsif (lc($cdn) eq 'avresult')
228             {
229 0           my $res = +{};
230 0           my $c = $cd->getFirstChild();
231              
232 0   0       while (defined($c) && $c)
233             {
234             ## only for element nodes
235 0 0         next unless ($c->nodeType() == 1);
236 0   0       my $name = $c->localname() || $c->nodeName();
237 0 0         next unless ($name);
238              
239 0 0         if (lc($name) eq 'avcheckid')
    0          
    0          
    0          
    0          
    0          
240             {
241             $res->{checkid} =
242 0           $c->getFirstChild()->getData();
243             }
244             elsif (lc($name) eq 'personalavdatafingerprint')
245             {
246             $res->{persfingerprint} =
247 0           $c->getFirstChild()->getData();
248             }
249             elsif (lc($name) eq 'professionalavdatafingerprint')
250             {
251             $res->{proffingerprint} =
252 0           $c->getFirstChild()->getData();
253             }
254             elsif (lc($name) eq 'professionalavdatafingerprint')
255             {
256             $res->{proffingerprint} =
257 0           $c->getFirstChild()->getData();
258             }
259             elsif ($name =~ /^(?:oobmethodid|profession|jurisdiction|status)$/i)
260             {
261 0           $res->{lc($name)} =
262             $c->getFirstChild()->getData();
263             }
264             elsif (lc($name) eq 'resultdata')
265             {
266 0           my $inf = $c->getElementsByTagNameNS($ns, 'result');
267 0 0         $res->{avresult} = $inf->shift()->getFirstChild()->getData() if ($inf);
268 0           $inf = $c->getElementsByTagNameNS($ns, 'date');
269 0 0         $res->{avDate} = $pd->parse_datetime($inf->shift()->getFirstChild()->getData()) if ($inf);
270             }
271 0           } continue { $c = $c->getNextSibling(); }
272              
273 0           $rinfo->{av}->{$avid}->{avresult} = $res;
274             }
275 0           } continue { $cd = $cd->getNextSibling(); }
276 0           return;
277             }
278              
279             ####################################################################################################
280             ############ Transform commands
281              
282             sub create
283             {
284 0     0 0   my ($epp, $av, $rd) = @_;
285 0           my $mes = $epp->message();
286 0           my @d = build_command($mes, 'create', $av);
287              
288 0 0         push(@d, ['av:checkType', $rd->{type}]) if Net::DRI::Util::has_key($rd, 'type');
289 0 0         push(@d, ['av:host', $rd->{host}]) if Net::DRI::Util::has_key($rd, 'host');
290 0 0 0       push(@d, ['av:contact', ['av:contactId', $rd->{contact}->srid()]]) if (Net::DRI::Util::has_key($rd,'contact') && Net::DRI::Util::isa_contact($rd->{contact}));
291              
292 0           $mes->command_body(\@d);
293 0           return;
294             }
295              
296             sub create_parse
297             {
298 0     0 0   my ($po, $otype, $oaction, $oname, $rinfo) = @_;
299 0           my $mes = $po->message();
300 0           my $avid;
301              
302 0 0         return unless ($mes->is_success());
303              
304 0           my $credata = $mes->get_response('av','creData');
305 0 0         return unless $credata;
306              
307 0           my $cd = $credata->getFirstChild();
308 0           my $pd = DateTime::Format::ISO8601->new();
309              
310 0   0       while (defined($cd) && $cd)
311             {
312 0 0         next unless ($cd->nodeType() == 1); ## only for element nodes
313 0   0       my $cdn = $cd->localname() || $cd->nodeName();
314              
315 0 0         if ($cdn eq 'id')
    0          
    0          
316             {
317 0           $avid = $cd->getFirstChild()->getData();
318 0           $rinfo->{av}->{$avid}->{id} = $avid;
319 0           $rinfo->{av}->{$avid}->{action} = 'create';
320             }
321             elsif ($cdn =~ /^(avurl|roid)$/i)
322             {
323 0           $rinfo->{av}->{$avid}->{lc($cdn)} =
324             $cd->getFirstChild()->getData();
325             }
326             elsif (lc($cdn) eq 'crdate')
327             {
328 0           $rinfo->{av}->{$avid}->{crDate} = $pd->parse_datetime(
329             $cd->getFirstChild()->getData());
330             }
331 0           } continue { $cd = $cd->getNextSibling(); }
332 0           return;
333             }
334              
335             ####################################################################################################
336             1;