line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
## Domain Registry Interface, OpenSRS XCP Domain commands |
2
|
|
|
|
|
|
|
## |
3
|
|
|
|
|
|
|
## Copyright (c) 2008-2011 Patrick Mevzek . All rights reserved. |
4
|
|
|
|
|
|
|
## (c) 2012-2013 Dmitry Belyavsky . 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::OpenSRS::XCP::Domain; |
17
|
|
|
|
|
|
|
|
18
|
1
|
|
|
1
|
|
676
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
23
|
|
19
|
1
|
|
|
1
|
|
4
|
use warnings; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
22
|
|
20
|
|
|
|
|
|
|
|
21
|
1
|
|
|
1
|
|
4
|
use Net::DRI::Exception; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
16
|
|
22
|
1
|
|
|
1
|
|
4
|
use Net::DRI::Util; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
2783
|
|
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
=pod |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
=head1 NAME |
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
Net::DRI::Protocol::OpenSRS::XCP::Domain - OpenSRS XCP Domain commands for Net::DRI |
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
=head1 DESCRIPTION |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
Please see the README file for details. |
33
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
=head1 SUPPORT |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
For now, support questions should be sent to: |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
Enetdri@dotandco.comE |
39
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
Please also see the SUPPORT file in the distribution. |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
=head1 SEE ALSO |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
Ehttp://www.dotandco.com/services/software/Net-DRI/E |
45
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
=head1 AUTHOR |
47
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
Patrick Mevzek, Enetdri@dotandco.comE |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
=head1 COPYRIGHT |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
Copyright (c) 2008-2011 Patrick Mevzek . |
53
|
|
|
|
|
|
|
(c) 2012-2013 Dmitry Belyavsky . |
54
|
|
|
|
|
|
|
All rights reserved. |
55
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify |
57
|
|
|
|
|
|
|
it under the terms of the GNU General Public License as published by |
58
|
|
|
|
|
|
|
the Free Software Foundation; either version 2 of the License, or |
59
|
|
|
|
|
|
|
(at your option) any later version. |
60
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
See the LICENSE file that comes with this distribution for more details. |
62
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
=cut |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
#################################################################################################### |
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
sub register_commands |
68
|
|
|
|
|
|
|
{ |
69
|
0
|
|
|
0
|
0
|
|
my ($class,$version)=@_; |
70
|
0
|
|
|
|
|
|
my %tmp=( |
71
|
|
|
|
|
|
|
info => [\&info, \&info_parse ], |
72
|
|
|
|
|
|
|
check => [\&check, \&check_parse ], |
73
|
|
|
|
|
|
|
create => [ \&create, \&create_parse ], ## TODO : parsing of return messages |
74
|
|
|
|
|
|
|
delete => [ \&delete, \&delete_parse ], |
75
|
|
|
|
|
|
|
renew => [ \&renew, \&renew_parse ], |
76
|
|
|
|
|
|
|
transfer_request => [ \&transfer_request, \&transfer_request_parse ], |
77
|
|
|
|
|
|
|
transfer_query => [ \&transfer_query, \&transfer_query_parse ], |
78
|
|
|
|
|
|
|
transfer_cancel => [ \&transfer_cancel, \&transfer_cancel_parse ], |
79
|
|
|
|
|
|
|
is_mine => [\&is_mine, \&is_mine_parse ], |
80
|
|
|
|
|
|
|
update => [\&update, undef], |
81
|
|
|
|
|
|
|
send_authcode => [ \&send_authcode ], |
82
|
|
|
|
|
|
|
); |
83
|
|
|
|
|
|
|
|
84
|
0
|
|
|
|
|
|
return { 'domain' => \%tmp }; |
85
|
|
|
|
|
|
|
} |
86
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
sub build_msg_cookie |
88
|
|
|
|
|
|
|
{ |
89
|
0
|
|
|
0
|
0
|
|
my ($msg,$action,$cookie,$regip)=@_; |
90
|
0
|
|
|
|
|
|
my %r=(action=>$action,object=>'domain',cookie=>$cookie); |
91
|
0
|
0
|
|
|
|
|
$r{registrant_ip}=$regip if defined($regip); |
92
|
0
|
|
|
|
|
|
$msg->command(\%r); |
93
|
0
|
|
|
|
|
|
return; |
94
|
|
|
|
|
|
|
} |
95
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
sub info |
97
|
|
|
|
|
|
|
{ |
98
|
0
|
|
|
0
|
0
|
|
my ($xcp,$domain,$rd)=@_; |
99
|
0
|
|
|
|
|
|
my $msg=$xcp->message(); |
100
|
0
|
0
|
|
|
|
|
Net::DRI::Exception::usererr_insufficient_parameters('A cookie is needed for domain_info') unless Net::DRI::Util::has_key($rd,'cookie'); |
101
|
0
|
|
|
|
|
|
build_msg_cookie($msg,'get',$rd->{cookie},$rd->{registrant_ip}); |
102
|
0
|
0
|
|
|
|
|
my $info_type=exists $rd->{type} ? $rd->{type} : 'all_info'; |
103
|
0
|
|
|
|
|
|
$msg->command_attributes({type => $info_type}); |
104
|
0
|
|
|
|
|
|
return; |
105
|
|
|
|
|
|
|
} |
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
sub info_parse |
108
|
|
|
|
|
|
|
{ |
109
|
0
|
|
|
0
|
0
|
|
my ($xcp,$otype,$oaction,$oname,$rinfo)=@_; |
110
|
0
|
|
|
|
|
|
my $mes=$xcp->message(); |
111
|
0
|
0
|
|
|
|
|
return unless $mes->is_success(); |
112
|
|
|
|
|
|
|
|
113
|
0
|
|
|
|
|
|
$rinfo->{domain}->{$oname}->{action}='info'; |
114
|
0
|
|
|
|
|
|
$rinfo->{domain}->{$oname}->{exist}=1; |
115
|
0
|
|
|
|
|
|
my $ra=$mes->response_attributes(); ## Not parsed: dns_errors, descr |
116
|
|
|
|
|
|
|
|
117
|
0
|
|
|
|
|
|
my %d=(registry_createdate => 'crDate', registry_expiredate => 'exDate', registry_updatedate => 'upDate', registry_transferdate => 'trDate', expiredate => 'exDateLocal'); |
118
|
0
|
|
|
|
|
|
while (my ($k,$v)=each(%d)) |
119
|
|
|
|
|
|
|
{ |
120
|
0
|
0
|
|
|
|
|
next unless exists($ra->{$k}); |
121
|
0
|
|
|
|
|
|
$ra->{$k}=~s/\s+/T/; ## with a little effort we become ISO8601 |
122
|
0
|
|
|
|
|
|
$rinfo->{domain}->{$oname}->{$v}=$xcp->parse_iso8601($ra->{$k}); |
123
|
|
|
|
|
|
|
} |
124
|
|
|
|
|
|
|
|
125
|
0
|
|
|
|
|
|
my $ns=$ra->{nameserver_list}; |
126
|
0
|
0
|
0
|
|
|
|
if (defined($ns) && ref($ns) && @$ns) |
|
|
|
0
|
|
|
|
|
127
|
|
|
|
|
|
|
{ |
128
|
0
|
|
|
|
|
|
my $nso=$xcp->create_local_object('hosts'); |
129
|
0
|
|
|
|
|
|
foreach my $h (@$ns) |
130
|
|
|
|
|
|
|
{ |
131
|
0
|
|
|
|
|
|
$nso->add($h->{name},[$h->{ipaddress}]); |
132
|
|
|
|
|
|
|
} |
133
|
0
|
|
|
|
|
|
$rinfo->{domain}->{$oname}->{ns}=$nso; |
134
|
|
|
|
|
|
|
} |
135
|
|
|
|
|
|
|
|
136
|
0
|
|
|
|
|
|
foreach my $bool (qw/sponsoring_rsp auto_renew let_expire/) |
137
|
|
|
|
|
|
|
{ |
138
|
0
|
0
|
|
|
|
|
next unless exists($ra->{$bool}); |
139
|
0
|
|
|
|
|
|
$rinfo->{domain}->{$oname}->{$bool}=$ra->{$bool}; |
140
|
|
|
|
|
|
|
} |
141
|
|
|
|
|
|
|
|
142
|
0
|
|
|
|
|
|
my $c=$ra->{contact_set}; |
143
|
0
|
0
|
0
|
|
|
|
if (defined($c) && ref($c) && keys(%$c)) |
|
|
|
0
|
|
|
|
|
144
|
|
|
|
|
|
|
{ |
145
|
0
|
|
|
|
|
|
my $cs=$xcp->create_local_object('contactset'); |
146
|
0
|
|
|
|
|
|
while (my ($type,$v)=each(%$c)) |
147
|
|
|
|
|
|
|
{ |
148
|
0
|
|
|
|
|
|
my $c=parse_contact($xcp,$v); |
149
|
0
|
0
|
|
|
|
|
$cs->add($c,$type eq 'owner'? 'registrant' : $type); |
150
|
|
|
|
|
|
|
} |
151
|
0
|
|
|
|
|
|
$rinfo->{domain}->{$oname}->{contact}=$cs; |
152
|
|
|
|
|
|
|
} |
153
|
|
|
|
|
|
|
|
154
|
|
|
|
|
|
|
# Status data is available for the separate request |
155
|
0
|
|
|
|
|
|
foreach my $opensrs_status (qw/parkp_status lock_state can_modify domain_supports transfer_away_in_progress auctionescrow/) |
156
|
|
|
|
|
|
|
{ |
157
|
0
|
0
|
|
|
|
|
next unless exists $ra->{$opensrs_status}; |
158
|
0
|
|
|
|
|
|
$rinfo->{domain}->{$oname}->{$opensrs_status}=$ra->{$opensrs_status}; |
159
|
|
|
|
|
|
|
} |
160
|
0
|
|
|
|
|
|
return; |
161
|
|
|
|
|
|
|
} |
162
|
|
|
|
|
|
|
|
163
|
|
|
|
|
|
|
sub parse_contact |
164
|
|
|
|
|
|
|
{ |
165
|
0
|
|
|
0
|
0
|
|
my ($xcp,$rh)=@_; |
166
|
0
|
|
|
|
|
|
my $c=$xcp->create_local_object('contact'); |
167
|
|
|
|
|
|
|
## No ID given back ! Waouh that is great... not ! |
168
|
0
|
|
|
|
|
|
$c->firstname($rh->{first_name}); |
169
|
0
|
|
|
|
|
|
$c->name($rh->{last_name}); |
170
|
0
|
0
|
|
|
|
|
$c->org($rh->{org_name}) if exists($rh->{org_name}); |
171
|
0
|
0
|
|
|
|
|
$c->street([map { $rh->{'address'.$_} } grep {exists($rh->{'address'.$_}) && defined($rh->{'address'.$_}) } (1,2,3)]); |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
172
|
0
|
0
|
|
|
|
|
$c->city($rh->{city}) if exists($rh->{city}); |
173
|
0
|
0
|
|
|
|
|
$c->sp($rh->{state}) if exists($rh->{state}); |
174
|
0
|
0
|
|
|
|
|
$c->pc($rh->{postal_code}) if exists($rh->{postal_code}); |
175
|
0
|
0
|
|
|
|
|
$c->cc($rh->{country}) if exists($rh->{country}); |
176
|
0
|
0
|
|
|
|
|
$c->voice($rh->{phone}) if exists($rh->{voice}); |
177
|
0
|
0
|
|
|
|
|
$c->fax($rh->{fax}) if exists($rh->{fax}); |
178
|
0
|
0
|
|
|
|
|
$c->email($rh->{email}) if exists($rh->{email}); |
179
|
0
|
0
|
|
|
|
|
$c->url($rh->{url}) if exists($rh->{url}); |
180
|
0
|
|
|
|
|
|
return $c; |
181
|
|
|
|
|
|
|
} |
182
|
|
|
|
|
|
|
|
183
|
|
|
|
|
|
|
sub check |
184
|
|
|
|
|
|
|
{ |
185
|
0
|
|
|
0
|
0
|
|
my ($xcp,$domain,$rd)=@_; |
186
|
0
|
|
|
|
|
|
my $msg=$xcp->message(); |
187
|
0
|
|
|
|
|
|
my %r=(action=>'lookup',object=>'domain'); |
188
|
0
|
0
|
|
|
|
|
$r{registrant_ip}=$rd->{registrant_ip} if exists $rd->{registrant_ip}; |
189
|
0
|
|
|
|
|
|
$msg->command(\%r); |
190
|
0
|
|
|
|
|
|
$msg->command_attributes({domain => $domain}); |
191
|
0
|
|
|
|
|
|
return; |
192
|
|
|
|
|
|
|
} |
193
|
|
|
|
|
|
|
|
194
|
|
|
|
|
|
|
sub check_parse |
195
|
|
|
|
|
|
|
{ |
196
|
0
|
|
|
0
|
0
|
|
my ($xcp,$otype,$oaction,$oname,$rinfo)=@_; |
197
|
0
|
|
|
|
|
|
my $mes=$xcp->message(); |
198
|
0
|
0
|
|
|
|
|
return unless $mes->is_success(); |
199
|
|
|
|
|
|
|
|
200
|
0
|
|
|
|
|
|
$rinfo->{domain}->{$oname}->{action}='check'; |
201
|
0
|
|
|
|
|
|
my $ra=$mes->response_attributes(); |
202
|
0
|
0
|
0
|
|
|
|
$rinfo->{domain}->{$oname}->{exist}=(exists $ra->{status} && defined($ra->{status}) && $ra->{status} eq 'available' && $mes->response_code()==210)? 0 : 1; |
203
|
0
|
|
|
|
|
|
$rinfo->{domain}->{$oname}->{exist_reason}=$mes->response_text(); |
204
|
0
|
|
|
|
|
|
return; |
205
|
|
|
|
|
|
|
} |
206
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
sub create |
208
|
|
|
|
|
|
|
{ |
209
|
0
|
|
|
0
|
0
|
|
my ($xcp,$domain,$rd)=@_; |
210
|
|
|
|
|
|
|
|
211
|
0
|
|
|
|
|
|
sw_register($xcp, $domain, $rd, 'new'); # TBD: premium, sunrise, whois_privacy |
212
|
0
|
|
|
|
|
|
return; |
213
|
|
|
|
|
|
|
} |
214
|
|
|
|
|
|
|
|
215
|
|
|
|
|
|
|
sub create_parse |
216
|
|
|
|
|
|
|
{ |
217
|
0
|
|
|
0
|
0
|
|
my ($xcp,$otype,$oaction,$oname,$rinfo)=@_; |
218
|
0
|
|
|
|
|
|
my $mes=$xcp->message(); |
219
|
0
|
0
|
|
|
|
|
return unless $mes->is_success(); |
220
|
|
|
|
|
|
|
|
221
|
0
|
|
|
|
|
|
$rinfo->{domain}->{$oname}->{action}='create'; |
222
|
0
|
|
|
|
|
|
my $ra=$mes->response_attributes(); |
223
|
0
|
|
|
|
|
|
foreach (qw/admin_email cancelled_orders error id queue_request_id forced_pending whois_privacy/) { |
224
|
0
|
0
|
|
|
|
|
$rinfo->{domain}->{$oname}->{$_} = $ra->{$_} if exists $ra->{$_}; |
225
|
|
|
|
|
|
|
} |
226
|
0
|
|
|
|
|
|
return; |
227
|
|
|
|
|
|
|
} |
228
|
|
|
|
|
|
|
|
229
|
|
|
|
|
|
|
sub sw_register |
230
|
|
|
|
|
|
|
{ |
231
|
0
|
|
|
0
|
0
|
|
my ($xcp,$domain,$rd,$reg_type)=@_; |
232
|
|
|
|
|
|
|
|
233
|
0
|
|
|
|
|
|
my $msg=$xcp->message(); |
234
|
|
|
|
|
|
|
|
235
|
0
|
|
|
|
|
|
my %r=(action => 'sw_register', object => 'domain'); |
236
|
0
|
0
|
|
|
|
|
$r{registrant_ip}=$rd->{registrant_ip} if exists $rd->{registrant_ip}; |
237
|
|
|
|
|
|
|
|
238
|
0
|
|
|
|
|
|
$msg->command(\%r); |
239
|
|
|
|
|
|
|
|
240
|
0
|
0
|
|
|
|
|
Net::DRI::Exception::usererr_insufficient_parameters('Username+Password are required for sw_register') if grep { ! Net::DRI::Util::has_key($rd,$_) } qw/username password/; |
|
0
|
|
|
|
|
|
|
241
|
|
|
|
|
|
|
|
242
|
0
|
0
|
|
|
|
|
Net::DRI::Exception::usererr_insufficient_parameters('contacts are mandatory') unless Net::DRI::Util::has_contact($rd); |
243
|
0
|
|
|
|
|
|
my $cs=$rd->{contact}; |
244
|
0
|
|
|
|
|
|
foreach my $t (qw/registrant admin billing/) |
245
|
|
|
|
|
|
|
{ |
246
|
0
|
|
|
|
|
|
my @t=$cs->get($t); |
247
|
0
|
0
|
|
|
|
|
Net::DRI::Exception::usererr_invalid_parameters('one ' . $t . ' contact is mandatory') unless @t==1; |
248
|
0
|
|
|
|
|
|
my $co=$cs->get($t); |
249
|
0
|
0
|
|
|
|
|
Net::DRI::Exception::usererr_insufficient_parameters($t . 'contact is mandatory') unless Net::DRI::Util::isa_contact($co); |
250
|
0
|
|
|
|
|
|
$co->validate(); |
251
|
|
|
|
|
|
|
} |
252
|
|
|
|
|
|
|
|
253
|
0
|
|
|
|
|
|
my %contact_set = (); |
254
|
0
|
|
|
|
|
|
my $attr = {reg_type => $reg_type, domain => $domain, contact_set => \%contact_set}; |
255
|
0
|
|
|
|
|
|
$contact_set{owner} = add_owner_contact($msg,$cs); |
256
|
0
|
|
|
|
|
|
$contact_set{admin} = add_admin_contact($msg,$cs); |
257
|
0
|
|
|
|
|
|
$contact_set{billing} = add_billing_contact($msg,$cs); |
258
|
0
|
0
|
|
|
|
|
if ($cs->get('tech')) { |
259
|
0
|
|
|
|
|
|
$contact_set{tech} = add_tech_contact($msg,$cs); ## optional |
260
|
0
|
|
|
|
|
|
$attr->{custom_tech_contact} = 1; |
261
|
|
|
|
|
|
|
} else { |
262
|
0
|
|
|
|
|
|
$attr->{custom_tech_contact} = 0; # Use default tech contact |
263
|
|
|
|
|
|
|
} |
264
|
|
|
|
|
|
|
|
265
|
|
|
|
|
|
|
# These are all the OpenSRS names for optional parameters. Might need to map generic names to OpenSRS namespace later. |
266
|
0
|
|
|
|
|
|
foreach (qw/auto_renew affiliate_id f_lock_domain f_parkp f_whois_privacy/) { |
267
|
0
|
0
|
|
|
|
|
$attr->{$_} = ($rd->{$_} ? 1 : 0 ) if Net::DRI::Util::has_key($rd, $_); |
|
|
0
|
|
|
|
|
|
268
|
|
|
|
|
|
|
} |
269
|
0
|
|
|
|
|
|
foreach (qw/affiliate_id reg_domain encoding_type tld_data/) { |
270
|
0
|
0
|
|
|
|
|
$attr->{$_} = ($rd->{$_}) if Net::DRI::Util::has_key($rd, $_); |
271
|
|
|
|
|
|
|
} |
272
|
|
|
|
|
|
|
|
273
|
0
|
0
|
0
|
|
|
|
if (Net::DRI::Util::has_key($rd, 'f_bypass_confirm') && Net::DRI::Util::has_auth($rd)) { |
274
|
0
|
|
|
|
|
|
$attr->{'f_bypass_confirm'} = 1; |
275
|
0
|
|
|
|
|
|
$attr->{'auth_info'} = $rd->{'auth'}->{'pw'}; |
276
|
|
|
|
|
|
|
} |
277
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
# TBD: ccTLD-specific flags including domain encoding. |
279
|
|
|
|
|
|
|
# TBD: handle, link_domains, etc. |
280
|
|
|
|
|
|
|
|
281
|
0
|
0
|
|
|
|
|
if ($reg_type eq 'new') { |
282
|
0
|
0
|
|
|
|
|
Net::DRI::Exception::usererr_insufficient_parameters('duration is mandatory') unless Net::DRI::Util::has_duration($rd); |
283
|
0
|
|
|
|
|
|
$attr->{period} = $rd->{duration}->years(); |
284
|
|
|
|
|
|
|
} |
285
|
|
|
|
|
|
|
|
286
|
0
|
|
|
|
|
|
$attr->{reg_username} = $rd->{username}; |
287
|
0
|
|
|
|
|
|
$attr->{reg_password} = $rd->{password}; |
288
|
|
|
|
|
|
|
|
289
|
0
|
|
|
|
|
|
$msg->command_attributes($attr); |
290
|
|
|
|
|
|
|
|
291
|
0
|
|
|
|
|
|
add_all_ns($domain,$msg,$rd->{ns}); |
292
|
0
|
|
|
|
|
|
return; |
293
|
|
|
|
|
|
|
} |
294
|
|
|
|
|
|
|
|
295
|
|
|
|
|
|
|
sub update |
296
|
|
|
|
|
|
|
{ |
297
|
0
|
|
|
0
|
0
|
|
my ($xcp,$domain,$todo,$rd)=@_; |
298
|
|
|
|
|
|
|
|
299
|
0
|
|
|
|
|
|
my $msg=$xcp->message(); |
300
|
0
|
|
|
|
|
|
my $attr = { domain => $domain }; |
301
|
0
|
|
|
|
|
|
$msg->command_attributes($attr); |
302
|
|
|
|
|
|
|
|
303
|
0
|
0
|
|
|
|
|
Net::DRI::Exception::usererr_invalid_parameters($todo.' must be a non empty Net::DRI::Data::Changes object') unless Net::DRI::Util::isa_changes($todo); |
304
|
0
|
0
|
|
|
|
|
Net::DRI::Exception::usererr_insufficient_parameters('A cookie is needed for domain_info') unless Net::DRI::Util::has_key($rd,'cookie'); |
305
|
|
|
|
|
|
|
|
306
|
0
|
|
|
|
|
|
my $nsset=$todo->set('ns'); |
307
|
0
|
|
|
|
|
|
my $contactset=$todo->set('contact'); |
308
|
|
|
|
|
|
|
|
309
|
0
|
0
|
|
|
|
|
if (defined $nsset) |
310
|
|
|
|
|
|
|
{ |
311
|
0
|
0
|
|
|
|
|
Net::DRI::Exception::usererr_invalid_parameters('ns changes for set must be a Net::DRI::Data::Hosts object') unless Net::DRI::Util::isa_hosts($nsset); |
312
|
0
|
0
|
|
|
|
|
Net::DRI::Exception::usererr_invalid_parameters('change of nameservers and contacts is not supported in the same operation') if defined $contactset; |
313
|
0
|
0
|
|
|
|
|
Net::DRI::Exception::usererr_insufficient_parameters('at least 2 nameservers are mandatory') unless ($nsset->count()>=2); |
314
|
|
|
|
|
|
|
|
315
|
0
|
|
|
|
|
|
build_msg_cookie($msg,'advanced_update_nameservers',$rd->{cookie},$rd->{registrant_ip}); |
316
|
0
|
|
|
|
|
|
$attr->{op_type}='assign'; |
317
|
0
|
|
|
|
|
|
$attr->{assign_ns}=[ $nsset->get_names() ]; |
318
|
|
|
|
|
|
|
} |
319
|
|
|
|
|
|
|
else |
320
|
|
|
|
|
|
|
{ |
321
|
0
|
0
|
0
|
|
|
|
Net::DRI::Exception::usererr_invalid_parameters('contact changes for set must be a Net::DRI::Data::ContactSet') unless defined($contactset) && Net::DRI::Util::isa_contactset($contactset); |
322
|
|
|
|
|
|
|
|
323
|
0
|
|
|
|
|
|
build_msg_cookie($msg,'update_contacts',$rd->{cookie},$rd->{registrant_ip}); |
324
|
0
|
|
|
|
|
|
my %contact_set = (); |
325
|
0
|
|
|
|
|
|
my $types = []; |
326
|
0
|
|
|
|
|
|
foreach my $t (qw/registrant admin billing tech/) |
327
|
|
|
|
|
|
|
{ |
328
|
0
|
|
|
|
|
|
my @t=$contactset->get($t); |
329
|
0
|
0
|
|
|
|
|
next unless @t==1; |
330
|
0
|
|
|
|
|
|
my $co=$t[0]; |
331
|
0
|
0
|
|
|
|
|
next unless Net::DRI::Util::isa_contact($co); |
332
|
0
|
|
|
|
|
|
$co->validate(); |
333
|
0
|
0
|
|
|
|
|
my $registry_type = $t eq 'registrant' ? 'owner' : $t; |
334
|
0
|
|
|
|
|
|
$contact_set{$registry_type}=add_contact_info($msg,$co); |
335
|
0
|
|
|
|
|
|
push @$types, $registry_type; |
336
|
|
|
|
|
|
|
} |
337
|
0
|
|
|
|
|
|
$attr->{contact_set} = \%contact_set; |
338
|
0
|
|
|
|
|
|
$attr->{types} = $types; |
339
|
|
|
|
|
|
|
} |
340
|
0
|
|
|
|
|
|
return; |
341
|
|
|
|
|
|
|
} |
342
|
|
|
|
|
|
|
|
343
|
|
|
|
|
|
|
sub add_contact_info |
344
|
|
|
|
|
|
|
{ |
345
|
0
|
|
|
0
|
0
|
|
my ($msg,$co)=@_; |
346
|
0
|
|
|
|
|
|
my %contact = (); |
347
|
|
|
|
|
|
|
|
348
|
0
|
|
|
|
|
|
$contact{first_name} = $co->firstname(); |
349
|
0
|
|
|
|
|
|
$contact{last_name} = $co->name(); |
350
|
|
|
|
|
|
|
|
351
|
0
|
0
|
|
|
|
|
$contact{org_name} = $co->org() if $co->org(); |
352
|
|
|
|
|
|
|
|
353
|
0
|
|
|
|
|
|
my $s=$co->street(); |
354
|
0
|
0
|
0
|
|
|
|
Net::DRI::Exception::usererr_insufficient_parameters('1 line of address at least needed') unless ($s && (ref($s) eq 'ARRAY') && @$s && $s->[0]); |
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
355
|
|
|
|
|
|
|
|
356
|
0
|
|
|
|
|
|
$contact{address1} = $s->[0]; |
357
|
0
|
0
|
|
|
|
|
$contact{address2} = $s->[1] if $s->[1]; |
358
|
0
|
0
|
|
|
|
|
$contact{address3} = $s->[2] if $s->[2]; |
359
|
0
|
0
|
0
|
|
|
|
Net::DRI::Exception::usererr_insufficient_parameters('city & cc mandatory') unless ($co->city() && $co->cc()); |
360
|
0
|
|
|
|
|
|
$contact{city} = $co->city(); |
361
|
|
|
|
|
|
|
#TODO state and postal_code are required for US/CA |
362
|
0
|
0
|
|
|
|
|
$contact{state} = $co->sp() if $co->sp(); |
363
|
0
|
0
|
|
|
|
|
$contact{postal_code} = $co->pc() if $co->pc(); |
364
|
0
|
|
|
|
|
|
$contact{country} = uc($co->cc()); |
365
|
0
|
0
|
0
|
|
|
|
Net::DRI::Exception::usererr_insufficient_parameters('voice & email mandatory') unless ($co->voice() && $co->email()); |
366
|
0
|
|
|
|
|
|
$contact{phone} = $co->voice(); |
367
|
0
|
0
|
|
|
|
|
$contact{fax} = $co->fax() if $co->fax(); |
368
|
0
|
|
|
|
|
|
$contact{email} = $co->email(); |
369
|
0
|
0
|
|
|
|
|
$contact{url} = $co->url() if $co->url(); |
370
|
0
|
|
|
|
|
|
return \%contact; |
371
|
|
|
|
|
|
|
} |
372
|
|
|
|
|
|
|
|
373
|
|
|
|
|
|
|
sub add_owner_contact |
374
|
|
|
|
|
|
|
{ |
375
|
0
|
|
|
0
|
0
|
|
my ($msg,$cs)=@_; |
376
|
0
|
|
|
|
|
|
my $co=$cs->get('registrant'); |
377
|
0
|
0
|
|
|
|
|
return add_contact_info($msg,$co) if Net::DRI::Util::isa_contact($co); |
378
|
0
|
|
|
|
|
|
return; |
379
|
|
|
|
|
|
|
} |
380
|
|
|
|
|
|
|
|
381
|
|
|
|
|
|
|
sub add_admin_contact |
382
|
|
|
|
|
|
|
{ |
383
|
0
|
|
|
0
|
0
|
|
my ($msg,$cs)=@_; |
384
|
0
|
|
|
|
|
|
my $co=$cs->get('admin'); |
385
|
0
|
0
|
|
|
|
|
return add_contact_info($msg,$co) if Net::DRI::Util::isa_contact($co); |
386
|
0
|
|
|
|
|
|
return; |
387
|
|
|
|
|
|
|
} |
388
|
|
|
|
|
|
|
|
389
|
|
|
|
|
|
|
sub add_billing_contact |
390
|
|
|
|
|
|
|
{ |
391
|
0
|
|
|
0
|
0
|
|
my ($msg,$cs)=@_; |
392
|
0
|
|
|
|
|
|
my $co=$cs->get('billing'); |
393
|
0
|
0
|
|
|
|
|
return add_contact_info($msg,$co) if Net::DRI::Util::isa_contact($co); |
394
|
0
|
|
|
|
|
|
return; |
395
|
|
|
|
|
|
|
} |
396
|
|
|
|
|
|
|
|
397
|
|
|
|
|
|
|
sub add_tech_contact |
398
|
|
|
|
|
|
|
{ |
399
|
0
|
|
|
0
|
0
|
|
my ($msg,$cs)=@_; |
400
|
0
|
|
|
|
|
|
my $co=$cs->get('tech'); |
401
|
0
|
0
|
|
|
|
|
return add_contact_info($msg,$co) if Net::DRI::Util::isa_contact($co); |
402
|
0
|
|
|
|
|
|
return; |
403
|
|
|
|
|
|
|
} |
404
|
|
|
|
|
|
|
|
405
|
|
|
|
|
|
|
sub add_all_ns |
406
|
|
|
|
|
|
|
{ |
407
|
0
|
|
|
0
|
0
|
|
my ($domain,$msg,$ns)=@_; |
408
|
0
|
|
|
|
|
|
my @nslist = (); |
409
|
|
|
|
|
|
|
|
410
|
0
|
|
|
|
|
|
my $attr = $msg->command_attributes(); |
411
|
0
|
|
|
|
|
|
$attr->{custom_nameservers} = 0; |
412
|
|
|
|
|
|
|
|
413
|
0
|
0
|
|
|
|
|
if (defined($ns)) { |
414
|
0
|
0
|
0
|
|
|
|
Net::DRI::Exception::usererr_insufficient_parameters('at least 2 nameservers are mandatory') unless (Net::DRI::Util::isa_hosts($ns) && $ns->count()>=2); # Name servers are optional; if present must be >=2 |
415
|
|
|
|
|
|
|
|
416
|
0
|
|
|
|
|
|
for (my $i = 1; $i <= $ns->count(); $i++) { # Net:DRI name server list starts at 1. |
417
|
0
|
|
|
|
|
|
my $name = $ns->get_details($i); # get_details in scalar returns name |
418
|
0
|
|
|
|
|
|
push @nslist, { sortorder => $i, name => $name }; |
419
|
|
|
|
|
|
|
} |
420
|
0
|
|
|
|
|
|
$attr->{custom_nameservers} = 1; |
421
|
0
|
|
|
|
|
|
$attr->{nameserver_list} = \@nslist; |
422
|
|
|
|
|
|
|
} |
423
|
0
|
|
|
|
|
|
$msg->command_attributes($attr); |
424
|
0
|
|
|
|
|
|
return; |
425
|
|
|
|
|
|
|
} |
426
|
|
|
|
|
|
|
|
427
|
|
|
|
|
|
|
sub delete ## no critic (Subroutines::ProhibitBuiltinHomonyms) |
428
|
|
|
|
|
|
|
{ |
429
|
0
|
|
|
0
|
0
|
|
my ($xcp,$domain,$rd)=@_; |
430
|
0
|
|
|
|
|
|
my $msg=$xcp->message(); |
431
|
|
|
|
|
|
|
|
432
|
0
|
0
|
|
|
|
|
Net::DRI::Exception::usererr_insufficient_parameters('Reseller ID is mandatory') unless (Net::DRI::Util::has_key($rd, 'reseller_id')); |
433
|
|
|
|
|
|
|
|
434
|
0
|
|
|
|
|
|
my %r=(action => 'revoke', object => 'domain'); |
435
|
0
|
0
|
|
|
|
|
$r{registrant_ip}=$rd->{registrant_ip} if exists $rd->{registrant_ip}; |
436
|
|
|
|
|
|
|
|
437
|
0
|
|
|
|
|
|
$msg->command(\%r); |
438
|
0
|
|
|
|
|
|
my $attr = {domain => $domain, reseller => $rd->{reseller_id}}; |
439
|
0
|
0
|
|
|
|
|
$attr->{notes} = $rd->{notes} if Net::DRI::Util::has_key($rd, 'notes'); |
440
|
0
|
|
|
|
|
|
$msg->command_attributes({domain => $domain, reseller => $rd->{reseller_id}}); |
441
|
0
|
|
|
|
|
|
return; |
442
|
|
|
|
|
|
|
} |
443
|
|
|
|
|
|
|
|
444
|
|
|
|
|
|
|
sub delete_parse |
445
|
|
|
|
|
|
|
{ |
446
|
0
|
|
|
0
|
0
|
|
my ($xcp,$otype,$oaction,$oname,$rinfo)=@_; |
447
|
0
|
|
|
|
|
|
my $mes=$xcp->message(); |
448
|
0
|
0
|
|
|
|
|
return unless $mes->is_success(); |
449
|
|
|
|
|
|
|
|
450
|
0
|
|
|
|
|
|
$rinfo->{domain}->{$oname}->{action}='delete'; |
451
|
0
|
|
|
|
|
|
my $ra=$mes->response_attributes(); |
452
|
0
|
|
|
|
|
|
foreach (qw/charge price/) { |
453
|
0
|
0
|
|
|
|
|
$rinfo->{domain}->{$oname}->{$_} = $ra->{$_} if exists $ra->{$_}; |
454
|
|
|
|
|
|
|
} |
455
|
0
|
|
|
|
|
|
return; |
456
|
|
|
|
|
|
|
} |
457
|
|
|
|
|
|
|
|
458
|
|
|
|
|
|
|
sub renew |
459
|
|
|
|
|
|
|
{ |
460
|
0
|
|
|
0
|
0
|
|
my ($xcp,$domain,$rd)=@_; |
461
|
0
|
|
|
|
|
|
my $msg=$xcp->message(); |
462
|
|
|
|
|
|
|
|
463
|
0
|
|
|
|
|
|
my %r=(action => 'renew', object => 'domain'); |
464
|
0
|
0
|
|
|
|
|
$r{registrant_ip}=$rd->{registrant_ip} if exists $rd->{registrant_ip}; |
465
|
|
|
|
|
|
|
|
466
|
0
|
0
|
|
|
|
|
Net::DRI::Exception::usererr_insufficient_parameters('auto_renew setting is mandatory') unless (Net::DRI::Util::has_key($rd, 'auto_renew')); |
467
|
|
|
|
|
|
|
|
468
|
0
|
0
|
|
|
|
|
Net::DRI::Exception::usererr_insufficient_parameters('duration is mandatory') unless Net::DRI::Util::has_duration($rd); |
469
|
0
|
0
|
0
|
|
|
|
Net::DRI::Exception::usererr_insufficient_parameters('current expiration is mandatory') unless (Net::DRI::Util::has_key($rd, 'current_expiration') && Net::DRI::Util::check_isa($rd->{current_expiration}, 'DateTime')); # Can get this from set_cookie response. |
470
|
|
|
|
|
|
|
|
471
|
0
|
|
|
|
|
|
my $attr = {domain => $domain, period => $rd->{duration}->years(), currentexpirationyear => $rd->{current_expiration}->year()}; |
472
|
|
|
|
|
|
|
|
473
|
|
|
|
|
|
|
# These are all the OpenSRS names for optional parameters. Might need to map generic names to OpenSRS namespace later. |
474
|
0
|
|
|
|
|
|
foreach (qw/auto_renew f_parkp/) { |
475
|
0
|
0
|
|
|
|
|
$attr->{$_} = ($rd->{$_} ? 1 : 0 ) if Net::DRI::Util::has_key($rd, $_); |
|
|
0
|
|
|
|
|
|
476
|
|
|
|
|
|
|
} |
477
|
0
|
|
|
|
|
|
foreach (qw/affiliate_id notes/) { |
478
|
0
|
0
|
|
|
|
|
$attr->{$_} = ($rd->{$_}) if Net::DRI::Util::has_key($rd, $_); |
479
|
|
|
|
|
|
|
} |
480
|
|
|
|
|
|
|
|
481
|
0
|
|
0
|
|
|
|
$rd->{handle} ||= 'process'; |
482
|
0
|
|
|
|
|
|
$attr->{handle} = $rd->{handle}; |
483
|
|
|
|
|
|
|
# TBD: handle, etc. |
484
|
|
|
|
|
|
|
|
485
|
0
|
|
|
|
|
|
$msg->command(\%r); |
486
|
0
|
|
|
|
|
|
$msg->command_attributes($attr); |
487
|
0
|
|
|
|
|
|
return; |
488
|
|
|
|
|
|
|
} |
489
|
|
|
|
|
|
|
|
490
|
|
|
|
|
|
|
sub renew_parse |
491
|
|
|
|
|
|
|
{ |
492
|
0
|
|
|
0
|
0
|
|
my ($xcp,$otype,$oaction,$oname,$rinfo)=@_; |
493
|
0
|
|
|
|
|
|
my $mes=$xcp->message(); |
494
|
0
|
0
|
|
|
|
|
return unless $mes->is_success(); |
495
|
|
|
|
|
|
|
|
496
|
0
|
|
|
|
|
|
$rinfo->{domain}->{$oname}->{action}='renew'; |
497
|
0
|
|
|
|
|
|
my $ra=$mes->response_attributes(); |
498
|
0
|
|
|
|
|
|
foreach (qw/auto_renew admin_email order_id id queue_request_id/) { |
499
|
0
|
0
|
|
|
|
|
$rinfo->{domain}->{$oname}->{$_} = $ra->{$_} if exists $ra->{$_}; |
500
|
|
|
|
|
|
|
} |
501
|
0
|
|
|
|
|
|
my ($k,$v)=('registration expiration date', 'exDate'); |
502
|
0
|
|
|
|
|
|
$ra->{$k}=~s/\s+/T/; ## with a little effort we become ISO8601 |
503
|
0
|
0
|
|
|
|
|
$rinfo->{domain}->{$oname}->{$v}=$xcp->parse_iso8601($ra->{$k}) if defined($ra->{$k}); |
504
|
0
|
|
|
|
|
|
return; |
505
|
|
|
|
|
|
|
} |
506
|
|
|
|
|
|
|
|
507
|
|
|
|
|
|
|
sub transfer_request |
508
|
|
|
|
|
|
|
{ |
509
|
0
|
|
|
0
|
0
|
|
my ($xcp,$domain,$rd)=@_; |
510
|
|
|
|
|
|
|
|
511
|
0
|
|
|
|
|
|
sw_register($xcp, $domain, $rd, 'transfer'); |
512
|
0
|
|
|
|
|
|
return; |
513
|
|
|
|
|
|
|
} |
514
|
|
|
|
|
|
|
|
515
|
|
|
|
|
|
|
sub transfer_request_parse |
516
|
|
|
|
|
|
|
{ |
517
|
0
|
|
|
0
|
0
|
|
my ($xcp,$otype,$oaction,$oname,$rinfo)=@_; |
518
|
0
|
|
|
|
|
|
my $mes=$xcp->message(); |
519
|
0
|
0
|
|
|
|
|
return unless $mes->is_success(); |
520
|
|
|
|
|
|
|
|
521
|
0
|
|
|
|
|
|
$rinfo->{domain}->{$oname}->{action}='transfer_start'; |
522
|
0
|
|
|
|
|
|
my $ra=$mes->response_attributes(); |
523
|
0
|
|
|
|
|
|
foreach (qw/admin_email cancelled_orders error id queue_request_id forced_pending whois_privacy/) { |
524
|
0
|
0
|
|
|
|
|
$rinfo->{domain}->{$oname}->{$_} = $ra->{$_} if exists $ra->{$_}; |
525
|
|
|
|
|
|
|
} |
526
|
0
|
|
|
|
|
|
return; |
527
|
|
|
|
|
|
|
} |
528
|
|
|
|
|
|
|
|
529
|
|
|
|
|
|
|
sub transfer_query |
530
|
|
|
|
|
|
|
{ |
531
|
0
|
|
|
0
|
0
|
|
my ($xcp,$domain,$rd)=@_; |
532
|
0
|
|
|
|
|
|
my $msg=$xcp->message(); |
533
|
|
|
|
|
|
|
|
534
|
0
|
|
|
|
|
|
my %r=(action => 'check_transfer', object => 'domain'); |
535
|
0
|
0
|
|
|
|
|
$r{registrant_ip}=$rd->{registrant_ip} if exists $rd->{registrant_ip}; |
536
|
|
|
|
|
|
|
|
537
|
0
|
|
|
|
|
|
$msg->command(\%r); |
538
|
0
|
|
|
|
|
|
$msg->command_attributes({domain => $domain, check_status => 1, get_request_address => 1}); # TBD: usable for checking transferability |
539
|
0
|
|
|
|
|
|
return; |
540
|
|
|
|
|
|
|
} |
541
|
|
|
|
|
|
|
|
542
|
|
|
|
|
|
|
sub transfer_query_parse |
543
|
|
|
|
|
|
|
{ |
544
|
0
|
|
|
0
|
0
|
|
my ($xcp,$otype,$oaction,$oname,$rinfo)=@_; |
545
|
0
|
|
|
|
|
|
my $mes=$xcp->message(); |
546
|
0
|
0
|
|
|
|
|
return unless $mes->is_success(); |
547
|
|
|
|
|
|
|
|
548
|
0
|
|
|
|
|
|
$rinfo->{domain}->{$oname}->{action}='check_transfer'; |
549
|
0
|
|
|
|
|
|
my $ra=$mes->response_attributes(); |
550
|
0
|
|
|
|
|
|
foreach (qw/transferrable status request_address timestamp unixtime reason type noservice/) { |
551
|
0
|
0
|
|
|
|
|
$rinfo->{domain}->{$oname}->{$_} = $ra->{$_} if exists $ra->{$_}; |
552
|
|
|
|
|
|
|
} |
553
|
0
|
|
|
|
|
|
return; |
554
|
|
|
|
|
|
|
} |
555
|
|
|
|
|
|
|
|
556
|
|
|
|
|
|
|
sub transfer_cancel |
557
|
|
|
|
|
|
|
{ |
558
|
0
|
|
|
0
|
0
|
|
my ($xcp,$domain,$rd)=@_; |
559
|
0
|
|
|
|
|
|
my $msg=$xcp->message(); |
560
|
|
|
|
|
|
|
|
561
|
0
|
0
|
|
|
|
|
Net::DRI::Exception::usererr_insufficient_parameters('Reseller ID is mandatory') unless (Net::DRI::Util::has_key($rd, 'reseller_id')); |
562
|
|
|
|
|
|
|
|
563
|
0
|
|
|
|
|
|
my %r=(action => 'cancel_transfer', object => 'transfer'); |
564
|
0
|
0
|
|
|
|
|
$r{registrant_ip}=$rd->{registrant_ip} if exists $rd->{registrant_ip}; |
565
|
|
|
|
|
|
|
|
566
|
0
|
|
|
|
|
|
$msg->command(\%r); |
567
|
0
|
|
|
|
|
|
$msg->command_attributes({domain => $domain, reseller => $rd->{reseller_id}}); # TBD: optional order ID |
568
|
0
|
|
|
|
|
|
return; |
569
|
|
|
|
|
|
|
} |
570
|
|
|
|
|
|
|
|
571
|
|
|
|
|
|
|
sub transfer_cancel_parse |
572
|
|
|
|
|
|
|
{ |
573
|
0
|
|
|
0
|
0
|
|
my ($xcp,$otype,$oaction,$oname,$rinfo)=@_; |
574
|
0
|
|
|
|
|
|
my $mes=$xcp->message(); |
575
|
0
|
0
|
|
|
|
|
return unless $mes->is_success(); |
576
|
|
|
|
|
|
|
|
577
|
0
|
|
|
|
|
|
$rinfo->{domain}->{$oname}->{action}='cancel_transfer'; |
578
|
|
|
|
|
|
|
# This response has no attributes to capture |
579
|
0
|
|
|
|
|
|
return; |
580
|
|
|
|
|
|
|
} |
581
|
|
|
|
|
|
|
|
582
|
|
|
|
|
|
|
sub is_mine |
583
|
|
|
|
|
|
|
{ |
584
|
0
|
|
|
0
|
0
|
|
my ($xcp,$domain,$rd)=@_; |
585
|
0
|
|
|
|
|
|
my $msg=$xcp->message(); |
586
|
|
|
|
|
|
|
|
587
|
|
|
|
|
|
|
# Cookie isn't used with belongs_to_rsp |
588
|
|
|
|
|
|
|
|
589
|
0
|
|
|
|
|
|
$msg->command ({ action => 'belongs_to_rsp' }); |
590
|
0
|
|
|
|
|
|
$msg->command_attributes ({ domain => $domain }); |
591
|
0
|
|
|
|
|
|
return; |
592
|
|
|
|
|
|
|
} |
593
|
|
|
|
|
|
|
|
594
|
|
|
|
|
|
|
sub is_mine_parse |
595
|
|
|
|
|
|
|
{ |
596
|
0
|
|
|
0
|
0
|
|
my ($xcp,$otype,$oaction,$oname,$rinfo)=@_; |
597
|
0
|
|
|
|
|
|
my $mes=$xcp->message(); |
598
|
0
|
0
|
|
|
|
|
return unless $mes->is_success(); |
599
|
|
|
|
|
|
|
|
600
|
0
|
|
|
|
|
|
$rinfo->{domain}->{$oname}->{action} = 'is_mine'; |
601
|
0
|
|
|
|
|
|
$rinfo->{domain}->{$oname}->{exist} = 1; |
602
|
|
|
|
|
|
|
|
603
|
0
|
|
|
|
|
|
my $ra=$mes->response_attributes(); |
604
|
0
|
0
|
0
|
|
|
|
return unless exists $ra->{belongs_to_rsp} && defined $ra->{belongs_to_rsp}; |
605
|
|
|
|
|
|
|
|
606
|
0
|
0
|
|
|
|
|
$rinfo->{domain}->{$oname}->{mine}=($ra->{belongs_to_rsp})? 1 : 0; |
607
|
0
|
0
|
0
|
|
|
|
if (exists $ra->{domain_expdate} && defined $ra->{domain_expdate}) ## only here if belongs_to_rsp=1 |
608
|
|
|
|
|
|
|
{ |
609
|
0
|
|
|
|
|
|
my $d=$ra->{domain_expdate}; |
610
|
0
|
|
|
|
|
|
$d=~s/\s+/T/; ## with a little effort we become ISO8601 |
611
|
0
|
|
|
|
|
|
$rinfo->{domain}->{$oname}->{exDate}=$xcp->parse_iso8601($d); |
612
|
|
|
|
|
|
|
} |
613
|
0
|
|
|
|
|
|
return; |
614
|
|
|
|
|
|
|
} |
615
|
|
|
|
|
|
|
|
616
|
|
|
|
|
|
|
sub send_authcode |
617
|
|
|
|
|
|
|
{ |
618
|
0
|
|
|
0
|
0
|
|
my ($xcp,$domain,$rd)=@_; |
619
|
0
|
|
|
|
|
|
my $msg=$xcp->message(); |
620
|
0
|
|
|
|
|
|
my %r=(action=>'send_authcode',object=>'domain'); |
621
|
0
|
|
|
|
|
|
$msg->command(\%r); |
622
|
0
|
|
|
|
|
|
$msg->command_attributes({domain_name => $domain}); |
623
|
0
|
|
|
|
|
|
return; |
624
|
|
|
|
|
|
|
} |
625
|
|
|
|
|
|
|
|
626
|
|
|
|
|
|
|
#################################################################################################### |
627
|
|
|
|
|
|
|
1; |