File Coverage

blib/lib/IO/EPP/RRPProxy.pm
Criterion Covered Total %
statement 12 134 8.9
branch 0 72 0.0
condition 0 31 0.0
subroutine 4 15 26.6
pod 9 10 90.0
total 25 262 9.5


line stmt bran cond sub pod time code
1             package IO::EPP::RRPProxy;
2              
3             =encoding utf8
4              
5             =head1 NAME
6              
7             IO::EPP::RRPProxy
8              
9             =head1 SYNOPSIS
10              
11             use IO::EPP::RRPProxy;
12              
13             # Parameters for IO::Socket::SSL
14             my %sock_params = (
15             PeerHost => 'epp.rrpproxy.net',
16             PeerPort => 700,
17             Timeout => 30,
18             );
19              
20             # Create object, get greeting and call login()
21             my $conn = IO::EPP::RRPProxy->new( {
22             user => 'login',
23             pass => 'xxxxx',
24             sock_params => \%sock_params,
25             test_mode => 0, # real connect
26             } );
27              
28             # Check domain
29             my ( $answ, $code, $msg ) = $conn->check_domains( { domains => [ 'info.name', 'name.info' ] } );
30              
31             # Call logout() and destroy object
32             undef $conn;
33              
34             =head1 DESCRIPTION
35              
36             Work with RRPProxy EPP API
37              
38             Features:
39              
40             =over 3
41              
42             item *
43              
44             has its own epp extension for specifying additional parameters;
45              
46             =item *
47              
48             has additional functions.
49              
50             =back
51              
52             Examples: L, L.
53              
54             =cut
55              
56 1     1   2117 use IO::EPP::Base;
  1         9  
  1         31  
57 1     1   6 use parent qw( IO::EPP::Base );
  1         1  
  1         6  
58              
59 1     1   53 use strict;
  1         2  
  1         15  
60 1     1   4 use warnings;
  1         1  
  1         1460  
61              
62             sub make_request {
63 0     0 1   my ( $action, $params ) = @_;
64              
65 0           my ( $self, $code, $msg, $answ );
66              
67 0 0         unless ( $params->{conn} ) {
68 0   0       $params->{sock_params}{PeerHost} ||= 'epp.rrpproxy.net';
69 0   0       $params->{sock_params}{PeerPort} ||= 700;
70              
71 0           ( $self, $code, $msg ) = __PACKAGE__->new( $params );
72              
73 0 0 0       unless ( $code and $code == 1000 ) {
74 0           goto END_MR;
75             }
76             }
77             else {
78 0           $self = $params->{conn};
79             }
80              
81              
82 0           $self->{critical_error} = '';
83              
84 0 0         if ( $self->can( $action ) ) {
85 0           ( $answ, $code, $msg ) = $self->$action( $params );
86             }
87             else {
88 0           $msg = "undefined command <$action>, request cancelled";
89 0           $code = 0;
90             }
91              
92              
93             END_MR:
94              
95 0 0         $msg .= '; ' . $self->{critical_error} if $self->{critical_error};
96              
97 0           my $full_answ = "code: $code\nmsg: $msg";
98              
99 0 0 0       $answ = {} unless $answ && ref $answ;
100              
101 0           $answ->{code} = $code;
102 0           $answ->{msg} = $msg;
103              
104 0 0         return wantarray ? ( $answ, $full_answ, $self ) : $answ;
105             }
106              
107             =head1 METHODS
108              
109             Further overlap functions where the provider has features
110              
111             =head2 login
112              
113             Ext params for login,
114              
115             INPUT: new password for change
116              
117             =cut
118              
119             sub login {
120 0     0 1   my ( $self, $pw ) = @_;
121              
122 0           my $svcs = '
123             urn:ietf:params:xml:ns:contact-1.0
124             urn:ietf:params:xml:ns:domain-1.0
125             urn:ietf:params:xml:ns:host-1.0';
126              
127 0           my $extension = '
128             http://www.key-systems.net/epp/keysys-1.0
129             http://www.key-systems.net/epp/query-1.0
130             urn:ietf:params:xml:ns:secDNS-1.1
131             urn:ietf:params:xml:ns:rgp-1.0
132             urn:ietf:params:xml:ns:launchphase-1.0
133             urn:ietf:params:xml:ns:launch-1.0
134             urn:ietf:params:xml:ns:idn-1.0
135             urn:ietf:params:xml:ns:fee-0.7';
136              
137 0           return $self->SUPER::login( $pw, $svcs, $extension );
138             }
139              
140             =head2 create_contact
141              
142             =cut
143              
144             sub create_contact {
145 0     0 1   my ( $self, $params ) = @_;
146              
147 0           $params->{id} = 'AUTO';
148              
149 0 0         $params->{company} =~ s/&/&/g if $params->{company};
150 0 0         $params->{addr} =~ s/&/&/g if $params->{addr};
151              
152             =pod
153              
154             For german characters changes html codes to double symbols:
155             ß = ss
156             ä = ae
157             ü = ue
158             ö = oe
159              
160             =cut
161 0           foreach my $f ( 'name', 'company', 'addr', 'city', 'state' ) {
162 0 0         next unless $params->{$f};
163              
164 0           $params->{$f} =~ s/Ä/Ae/g;
165 0           $params->{$f} =~ s/Ö/Oe/g;
166 0           $params->{$f} =~ s/Ü/Ue/g;
167 0           $params->{$f} =~ s/ß/ss/g;
168 0           $params->{$f} =~ s/ä/ae/g;
169 0           $params->{$f} =~ s/ö/oe/g;
170 0           $params->{$f} =~ s/ü/ue/g;
171             }
172              
173             # the extension fields must be arranged in alphabetical order
174              
175 0           my $fields = "\n 1\n";
176              
177             # each contact is registered separately even if they are the same
178             $params->{extension} =
179 0           '
180             '.$fields.'
181            
182            
183             ';
184              
185 0           return $self->SUPER::create_contact( $params );
186             }
187              
188              
189             =head2 check_claims
190              
191             Get info on Claims Notice
192              
193             For details see L
194              
195             INPUT:
196              
197             key of params:
198             C -- domain name
199              
200             =cut
201              
202             sub check_claims {
203 0     0 1   my ( $self, $params ) = @_;
204              
205 0           $params->{domains} = [ $params->{dname} ];
206              
207             $params->{extension} =
208 0           '
209             claims
210            
211             ';
212              
213 0           return $self->SUPER::check_domains( $params );
214             }
215              
216             # Compile trade, premium and tlds extension
217             sub _keysys_domain_ext {
218 0     0     my ( $params ) = @_;
219              
220 0           foreach my $f ( keys %$params ) {
221 0 0         if ( $f =~ /^x-/ ) {
222 0           $params->{ uc($f) } = delete $params->{$f};
223             }
224             }
225              
226 0 0         unless ( $params->{tld} ) {
227 0           ( $params->{tld} ) = $params->{dname} =~ /\.([0-9A-Za-z\-]+)$/;
228             }
229              
230 0           my $tld = uc $params->{tld};
231              
232 0           my %ext;
233              
234             # for epp need lc
235 0           foreach my $f ( keys %$params ) {
236 0 0 0       if ( $f =~ /^X-$tld-$/ or $f eq 'X-ACCEPT-PREMIUMPRICE' or $f eq 'X-ACCEPT-TRADE' ) {
      0        
237 0           $ext{ lc($f) } = delete $params->{$f};
238             }
239             }
240              
241 0           my $extension = '';
242             # the extension fields must be arranged in alphabetical order
243 0           foreach my $f ( sort keys %ext ) {
244 0           my $f1 = $f;
245 0           $f1 =~ s/^x-//;
246 0           $extension .= " $ext{$f}\n";
247             }
248              
249 0           return $extension;
250             }
251              
252             =head2 create_domain
253              
254             additional keys of params:
255              
256             C -- register a premium domain without specifying the price, but it must be allowed in the panel;
257              
258             C, C -- price for premium domain;
259              
260             C -- currency for price for premium domain;
261              
262             C -- subhash for claims parameters:
263             C, C, C.
264             For details see L;
265              
266             The other parameters are zone-specific and are set as specified in The RRPProxy documentation: C.
267              
268             =cut
269              
270             sub create_domain {
271 0     0 1   my ( $self, $params ) = @_;
272              
273 0           $params->{authinfo} = ''; # need empty
274              
275             # Set as RRPProxy documentation, but not epp extension documentation
276 0 0         $params->{'X-ACCEPT-PREMIUMPRICE'} = 1 if delete $params->{is_premium}; # https://wiki.rrpproxy.net/domains/premium-domains
277 0 0         $params->{'X-FEE-AMOUNT'} = delete $params->{premium_price} if defined $params->{premium_price}; # zero is correct price
278 0 0         $params->{'X-FEE-AMOUNT'} = delete $params->{'fee-fee'} if defined $params->{'fee-fee'};
279 0 0         $params->{'X-FEE-CURRENCY'} = delete $params->{premium_currency} if $params->{premium_currency};
280              
281 0           my $extension = _keysys_domain_ext( $params );
282              
283             # closing special domain extensions
284 0 0         if ( $extension ) {
285 0           $extension =
286             '
287             '.$extension.'
288            
289            
290             ';
291             }
292              
293              
294 0 0         if ( defined $params->{'X-FEE-AMOUNT'} ) { # https://wiki.rrpproxy.net/domains/premium-domains/x-fee-parameters
295             # price can be zero
296 0           $extension .= qq| \n|;
297              
298 0 0         if ( $params->{'X-FEE-CURRENCY'} ) {
299 0           $extension .= ' ' . $params->{'X-FEE-CURRENCY'} . "\n";
300             }
301              
302 0           $extension .= ' ' . $params->{'X-FEE-AMOUNT'} . "\n \n";
303             }
304              
305              
306 0 0         if ( $params->{claims} ) {
307             $extension .=
308             '
309             claims
310            
311             '. $params->{claims}{noticeID} .'
312             '. $params->{claims}{notAfter} .'
313 0           '.$params->{claims}{acceptedDate}.'
314            
315            
316             ';
317             }
318              
319 0 0         $params->{extension} = $extension if $extension;
320              
321 0           return $self->SUPER::create_domain( $params );
322             }
323              
324              
325             sub transfer {
326 0     0 1   my ( $self, $params ) = @_;
327              
328 0 0         if ( defined $params->{authinfo} ) {
329 0           $params->{authinfo} =~ s/&/&/g;
330 0           $params->{authinfo} =~ s/
331 0           $params->{authinfo} =~ s/>/>/g;
332             }
333              
334 0           my $extension = '';
335              
336 0 0 0       if ( $params->{is_premium} || $params->{'X-ACCEPT-PREMIUMPRICE'} || $params->{'x-accept-premiumprice'} ) {
      0        
337 0           $extension .= " 1\n";
338             }
339              
340 0 0 0       if ( $params->{reg_id} || $params->{admin_id} ) {
341 0 0         $extension .= " $$params{reg_id}\n" if $params->{reg_id};
342 0 0         $extension .= " $$params{admin_id}\n" if $params->{admin_id};
343 0 0         $extension .= " $$params{tech_id}\n" if $params->{tech_id};
344 0 0         $extension .= " $$params{billing_id}\n" if $params->{billing_id};
345             }
346              
347 0 0         if ( $extension ) {
348             $params->{extension} =
349 0           '
350            
351             '.$extension.'
352            
353             ';
354             }
355              
356 0           return $self->SUPER::transfer( $params );
357             }
358              
359             =head2 renew_domain
360              
361             For renewal of the premium domain name, you need to pass a parameter C or C
362              
363             =cut
364              
365             sub renew_domain {
366 0     0 1   my ( $self, $params ) = @_;
367              
368 0 0 0       if ( $params->{is_premium} || $params->{'X-ACCEPT-PREMIUMPRICE'} || $params->{'x-accept-premiumprice'} ) {
      0        
369             # https://wiki.rrpproxy.net/domains/premium-domains
370             $params->{extension} =
371 0           '
372            
373             1
374            
375            
376             ';
377             }
378              
379 0           return $self->SUPER::renew_domain( $params );
380             }
381              
382              
383             =head2 update_domain
384              
385             C -- option for special change of domain owner -- paid or requires confirmation;
386              
387             =cut
388              
389             sub update_domain {
390 0     0 1   my ( $self, $params ) = @_;
391              
392 0 0         $params->{'X-ACCEPT-TRADE'} = 1 if delete $params->{trade};
393              
394 0           my $extension = _keysys_domain_ext( $params );
395              
396 0 0         if ( $extension ) {
397             $params->{extension} =
398 0           '
399             ' . $extension . '
400            
401            
402             ';
403             }
404              
405 0           return $self->SUPER::update_domain( $params );
406             }
407              
408              
409             =head2 update_renewalmode
410              
411             Set renewal mode for domain.
412              
413             key of params:
414              
415             C -- variants: C | C | C | C | C | ...
416              
417             For details see L
418              
419             =cut
420              
421             sub update_renewalmode {
422 0     0 1   my ( $self, $params ) = @_;
423              
424             $params->{extension} =
425             '
426            
427 0           ' . uc( $params->{renewalmode} ) . '
428            
429            
430             ';
431              
432 0           return $self->update_domain( $params );
433             }
434              
435              
436             sub req_poll_ext {
437 0     0 0   my ( undef, $ext ) = @_;
438              
439 0           my %info;
440              
441 0 0         if ( $ext =~ /]+>(.+?)<\/keysys:poll>/s ) {
442 0           my $key_ext = $1;
443              
444 0           foreach my $type ( 'data', 'info' ) {
445 0 0         if ( $key_ext =~ /(.+?)<\/keysys:$type>/s ) {
446 0           my $data = $1;
447              
448 0           my @data = $data =~ /<[^<>]+>[^<>]+<\/[^<>]+>/g;
449              
450 0 0         if ( scalar @data ) {
451 0           foreach my $row ( @data ) {
452 0 0         if ( $row =~ /<([^<>]+)>([^<>]+)<\/[^<>]+>/ ) {
453 0           $info{$1} = $2;
454             }
455             }
456             }
457             else {
458 0           $info{$type} = $data;
459             }
460             }
461             }
462             }
463              
464 0           return \%info;
465             }
466              
467              
468             1;
469              
470             __END__