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 1 14 7.1
total 17 185 9.1


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