File Coverage

blib/lib/Net/EPP/Frame/Command/Update/Domain.pm
Criterion Covered Total %
statement 12 132 9.0
branch 0 14 0.0
condition 0 6 0.0
subroutine 4 19 21.0
pod 0 14 0.0
total 16 185 8.6


line stmt bran cond sub pod time code
1             # Copyright (c) 2016 CentralNic Ltd. All rights reserved. This program is
2             # free software; you can redistribute it and/or modify it under the same
3             # terms as Perl itself.
4             #
5             # $Id: Domain.pm,v 1.3 2011/12/03 11:44:52 gavin Exp $
6             package Net::EPP::Frame::Command::Update::Domain;
7 1     1   4 use base qw(Net::EPP::Frame::Command::Update);
  1         2  
  1         57  
8 1     1   4 use Net::EPP::Frame::ObjectSpec;
  1         1  
  1         13  
9 1     1   2 use strict;
  1         2  
  1         12  
10 1     1   3 use warnings;
  1         1  
  1         944  
11              
12             our $DNSSEC_URN = 'urn:ietf:params:xml:ns:secDNS-1.1';
13              
14             =pod
15              
16             =head1 NAME
17              
18             Net::EPP::Frame::Command::Update::Domain - an instance of L
19             for domain names.
20              
21             =head1 SYNOPSIS
22              
23             use Net::EPP::Frame::Command::Update::Domain;
24             use strict;
25              
26             my $info = Net::EPP::Frame::Command::Update::Domain->new;
27             $info->setDomain('example.tld');
28              
29             print $info->toString(1);
30              
31             This results in an XML document like this:
32              
33            
34            
35             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
36             xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0
37             epp-1.0.xsd">
38            
39            
40            
41             xmlns:domain="urn:ietf:params:xml:ns:domain-1.0"
42             xsi:schemaLocation="urn:ietf:params:xml:ns:domain-1.0
43             domain-1.0.xsd">
44             example-1.tldE/domain:name>
45            
46            
47             0cf1b8f7e14547d26f03b7641660c641d9e79f45
48            
49            
50              
51             =head1 OBJECT HIERARCHY
52              
53             L
54             +----L
55             +----L
56             +----L
57             +----L
58             +----L
59              
60             =cut
61              
62             sub new {
63 0     0 0   my $package = shift;
64 0           my $self = bless($package->SUPER::new('update'), $package);
65              
66 0           my $domain = $self->addObject(Net::EPP::Frame::ObjectSpec->spec('domain'));
67              
68 0           foreach my $grp (qw(add rem chg)) {
69 0           my $el = $self->createElement(sprintf('domain:%s', $grp));
70 0           $self->getNode('update')->getChildNodes->shift->appendChild($el);
71             }
72              
73 0           return $self;
74             }
75              
76             =pod
77              
78             =head1 METHODS
79              
80             $frame->setDomain($domain_name);
81              
82             This specifies the domain name to be updated.
83              
84             =cut
85              
86             sub setDomain {
87 0     0 0   my ($self, $domain) = @_;
88              
89 0           my $name = $self->createElement('domain:name');
90 0           $name->appendText($domain);
91              
92 0           my $n = $self->getNode('update')->getChildNodes->shift;
93 0           $n->insertBefore( $name, $n->firstChild );
94              
95 0           return 1;
96             }
97              
98             =pod
99              
100             $frame->addStatus($type, $info);
101              
102             Add a status of $type with the optional extra $info.
103              
104             =cut
105              
106             sub addStatus {
107 0     0 0   my ($self, $type, $info) = @_;
108 0           my $status = $self->createElement('domain:status');
109 0           $status->setAttribute('s', $type);
110 0           $status->setAttribute('lang', 'en');
111 0 0         if ($info) {
112 0           $status->appendText($info);
113             }
114 0           $self->getElementsByLocalName('domain:add')->shift->appendChild($status);
115 0           return 1;
116             }
117              
118             =pod
119              
120             $frame->remStatus($type);
121              
122             Remove a status of $type.
123              
124             =cut
125              
126             sub remStatus {
127 0     0 0   my ($self, $type) = @_;
128 0           my $status = $self->createElement('domain:status');
129 0           $status->setAttribute('s', $type);
130 0           $self->getElementsByLocalName('domain:rem')->shift->appendChild($status);
131 0           return 1;
132             }
133              
134             =pod
135              
136             $frame->addContact($type, $contact);
137            
138             Add a contact of $type.
139              
140             =cut
141              
142             sub addContact {
143 0     0 0   my ($self, $type, $contact_id) = @_;
144            
145 0           my $contact = $self->createElement('domain:contact');
146 0           $contact->setAttribute('type', $type);
147 0           $contact->appendText($contact_id);
148              
149 0           $self->getElementsByLocalName('domain:add')->shift->appendChild($contact);
150 0           return 1;
151             }
152              
153             =pod
154            
155             $frame->remContact($type, $contact);
156            
157             Remove a contact of $type.
158              
159             =cut
160              
161             sub remContact {
162 0     0 0   my ($self, $type, $contact_id) = @_;
163            
164 0           my $contact = $self->createElement('domain:contact');
165 0           $contact->setAttribute('type', $type);
166 0           $contact->appendText($contact_id);
167              
168 0           $self->getElementsByLocalName('domain:rem')->shift->appendChild($contact);
169 0           return 1;
170             }
171              
172             =pod
173              
174             $frame->chgAuthinfo($auth);
175              
176             Change the authinfo.
177              
178             =cut
179              
180             sub chgAuthInfo {
181 0     0 0   my ($self,$authInfo) = @_;
182              
183 0           my $el = $self->createElement('domain:authInfo');
184 0           my $pw = $self->createElement('domain:pw');
185 0           $pw->appendText($authInfo);
186 0           $el->appendChild($pw);
187              
188 0           $self->getElementsByLocalName('domain:chg')->shift->appendChild($el);
189 0           return 1;
190             }
191              
192             =pod
193              
194             $frame->chgRegistrant($registrant);
195              
196             Change the authinfo.
197              
198             =cut
199              
200             sub chgRegistrant {
201 0     0 0   my ($self,$contact) = @_;
202              
203 0           my $registrant = $self->createElement('domain:registrant');
204 0           $registrant->appendText($contact);
205              
206 0           $self->getElementsByLocalName('domain:chg')->shift->appendChild($registrant);
207 0           return 1;
208             }
209              
210             =pod
211              
212             $frame->addNS('ns0.example.com'); # host object mode
213              
214             $frame->addNS({'name' => 'ns0.example.com', 'addrs' => [ { 'addr' => '127.0.0.1', 'type' => 4 } ] }); # host attribute mode
215              
216             =cut
217              
218             sub addNS {
219 0     0 0   my ($self, @ns) = @_;
220              
221 0 0         if ( ref $ns[0] eq 'HASH' ) {
222 0           $self->addHostAttrNS(@ns);
223             }
224             else {
225 0           $self->addHostObjNS(@ns);
226             }
227 0           return 1;
228             }
229              
230              
231             sub addHostAttrNS {
232 0     0 0   my ($self, @ns) = @_;
233              
234 0           my $ns = $self->createElement('domain:ns');
235              
236             # Adding attributes
237 0           foreach my $host (@ns) {
238 0           my $hostAttr = $self->createElement('domain:hostAttr');
239              
240             # Adding NS name
241 0           my $hostName = $self->createElement('domain:hostName');
242 0           $hostName->appendText($host->{name});
243 0           $hostAttr->appendChild($hostName);
244              
245             # Adding IP addresses
246 0 0 0       if ( exists $host->{addrs} && ref $host->{addrs} eq 'ARRAY' ) {
247 0           foreach my $addr ( @{ $host->{addrs} } ) {
  0            
248 0           my $hostAddr = $self->createElement('domain:hostAddr');
249 0           $hostAddr->appendText($addr->{addr});
250 0           $hostAddr->setAttribute(ip => $addr->{version});
251 0           $hostAttr->appendChild($hostAddr);
252             }
253             }
254              
255             # Adding host info to frame
256 0           $ns->appendChild($hostAttr);
257             }
258            
259 0           $self->getElementsByLocalName('domain:add')->shift->appendChild($ns);
260 0           return 1;
261             }
262              
263              
264             sub addHostObjNS {
265 0     0 0   my ($self, @ns) = @_;
266              
267 0           my $ns = $self->createElement('domain:ns');
268 0           foreach my $host (@ns) {
269 0           my $el = $self->createElement('domain:hostObj');
270 0           $el->appendText($host);
271 0           $ns->appendChild($el);
272             }
273            
274 0           $self->getElementsByLocalName('domain:add')->shift->appendChild($ns);
275 0           return 1;
276             }
277              
278             =pod
279              
280             $frame->remNS('ns0.example.com'); # host object mode
281              
282             $frame->remNS({'name' => 'ns0.example.com', 'addrs' => [ { 'addr' => '127.0.0.1', 'type' => 4 } ] }); # host attribute mode
283              
284             =cut
285              
286             sub remNS {
287 0     0 0   my ($self, @ns) = @_;
288              
289 0 0         if ( ref $ns[0] eq 'HASH' ) {
290 0           $self->remHostAttrNS(@ns);
291             }
292             else {
293 0           $self->remHostObjNS(@ns);
294             }
295 0           return 1;
296             }
297              
298              
299             sub remHostAttrNS {
300 0     0 0   my ($self, @ns) = @_;
301              
302 0           my $ns = $self->createElement('domain:ns');
303              
304             # Adding attributes
305 0           foreach my $host (@ns) {
306 0           my $hostAttr = $self->createElement('domain:hostAttr');
307              
308             # Adding NS name
309 0           my $hostName = $self->createElement('domain:hostName');
310 0           $hostName->appendText($host->{name});
311 0           $hostAttr->appendChild($hostName);
312              
313             # Adding IP addresses
314 0 0 0       if ( exists $host->{addrs} && ref $host->{addrs} eq 'ARRAY' ) {
315 0           foreach my $addr ( @{ $host->{addrs} } ) {
  0            
316 0           my $hostAddr = $self->createElement('domain:hostAddr');
317 0           $hostAddr->appendText($addr->{addr});
318 0           $hostAddr->setAttribute(ip => $addr->{version});
319 0           $hostAttr->appendChild($hostAddr);
320             }
321             }
322              
323             # Adding host info to frame
324 0           $ns->appendChild($hostAttr);
325             }
326            
327 0           $self->getElementsByLocalName('domain:rem')->shift->appendChild($ns);
328 0           return 1;
329             }
330              
331              
332             sub remHostObjNS {
333 0     0 0   my ($self, @ns) = @_;
334              
335 0           my $ns = $self->createElement('domain:ns');
336 0           foreach my $host (@ns) {
337 0           my $el = $self->createElement('domain:hostObj');
338 0           $el->appendText($host);
339 0           $ns->appendChild($el);
340             }
341            
342 0           $self->getElementsByLocalName('domain:rem')->shift->appendChild($ns);
343 0           return 1;
344             }
345              
346             =pod
347              
348             =head2 DNSSEC methods
349              
350             =cut
351              
352             sub _get_dnsssec {
353 0     0     my $self = shift;
354 0           my $tag = shift;
355              
356 0           my $el = self->getElementsByTagNameNS($DNSSEC_URN, $tag);
357 0 0         return $el if $el;
358              
359 0           my $ext = $self->getNode('extension');
360 0 0         $ext = $self->getNode('command')->addNewChild(undef, 'extension')
361             if not defined $ext;
362              
363 0           my $upd = $ext->addNewChild($DNSSEC_URN, 'secDNS:update');
364 0           $upd->addNewChild($DNSSEC_URN, 'secDNS:add');
365 0           $upd->addNewChild($DNSSEC_URN, 'secDNS:rem');
366              
367 0           return $self->_get_dnssec($tag);
368             }
369              
370             =pod
371              
372             =head1 AUTHOR
373              
374             CentralNic Ltd (http://www.centralnic.com/), with contributions from United Domains AG (http://www.united-domains.de/).
375              
376             =head1 COPYRIGHT
377              
378             This module is (c) 2016 CentralNic Ltd. This module is free software; you can
379             redistribute it and/or modify it under the same terms as Perl itself.
380              
381             =head1 SEE ALSO
382              
383             =over
384              
385             =item * L
386              
387             =back
388              
389             =cut
390              
391             1;