line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Atheme; |
2
|
|
|
|
|
|
|
our $VERSION = '0.0001'; |
3
|
|
|
|
|
|
|
|
4
|
1
|
|
|
1
|
|
46091
|
use strict; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
41
|
|
5
|
1
|
|
|
1
|
|
6
|
use warnings; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
30
|
|
6
|
1
|
|
|
1
|
|
1124
|
use utf8; |
|
1
|
|
|
|
|
138
|
|
|
1
|
|
|
|
|
7
|
|
7
|
1
|
|
|
1
|
|
45
|
use vars qw($ERROR); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
47
|
|
8
|
|
|
|
|
|
|
|
9
|
1
|
|
|
1
|
|
6
|
use Carp; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
112
|
|
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
$ERROR = ''; |
12
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
require RPC::XML; |
14
|
|
|
|
|
|
|
require RPC::XML::Client; |
15
|
1
|
|
|
1
|
|
596
|
use Atheme::Fault; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
1114
|
|
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
=head1 NAME |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
Atheme - Perl interface to Atheme's XML-RPC methods |
20
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
=head1 VERSION |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
version 0.0001 |
24
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
=head1 DESCRIPTION |
26
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
This class provides an interface to the XML-RPC methods of the Atheme IRC Services. |
28
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
=head1 METHODS |
30
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
These are all either virtual or helper methods. They are being implemented in |
32
|
|
|
|
|
|
|
service-specific classes. |
33
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
=head2 new |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
Services constructor. Takes a hash as argument: |
37
|
|
|
|
|
|
|
my $svs = new Atheme(url => "http://localhost:8000"); |
38
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
url: URL to Atheme's XML-RPC server. |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
lang: Language for result strings (en, ...). |
42
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
validate: If 1 then validation should be done in perl already, if 0 |
44
|
|
|
|
|
|
|
then validation is only done in atheme itself. In both cases, atheme |
45
|
|
|
|
|
|
|
validates. If you choose to use the perl validation, you will get more verbose |
46
|
|
|
|
|
|
|
fault messages containing an additional key 'subtype'. |
47
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
=cut |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
sub new { |
51
|
0
|
|
|
0
|
|
|
my ($self, %arg) = @_; |
52
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
# There is no default for url |
54
|
0
|
0
|
|
|
|
|
my $url = delete $arg{url} or croak "Atheme: You need to provide an url"; |
55
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
# Some default values |
57
|
0
|
|
|
|
|
|
my $svs = bless { |
58
|
|
|
|
|
|
|
rpc => RPC::XML::Client->new($url), |
59
|
|
|
|
|
|
|
lang => 'en', |
60
|
|
|
|
|
|
|
validate => 1, |
61
|
|
|
|
|
|
|
%arg, |
62
|
|
|
|
|
|
|
}, $self; |
63
|
|
|
|
|
|
|
|
64
|
0
|
|
|
|
|
|
$svs |
65
|
|
|
|
|
|
|
} |
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
=head2 return_dispatch |
68
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
Handles results from RPC Calls! |
70
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
Here is the list of fault types and default strings (these are likely to be |
72
|
|
|
|
|
|
|
at least partially overridden by Atheme::*Serv classes. |
73
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
fault_needmoreparams = "Insufficient parameters." |
75
|
|
|
|
|
|
|
fault_badparams = "Invalid parameters." |
76
|
|
|
|
|
|
|
fault_nosuch_source = "No such source." |
77
|
|
|
|
|
|
|
fault_nosuch_target = "No such target." |
78
|
|
|
|
|
|
|
fault_authfail = "Authentication failed." |
79
|
|
|
|
|
|
|
fault_noprivs = "Insufficient privileges." |
80
|
|
|
|
|
|
|
fault_nosuch_key = "No such key." |
81
|
|
|
|
|
|
|
fault_alreadyexists = "Item already exists." |
82
|
|
|
|
|
|
|
fault_toomany = "Too many items." |
83
|
|
|
|
|
|
|
fault_emailfail = "Email verification failed." |
84
|
|
|
|
|
|
|
fault_notverified = "Action not verified." |
85
|
|
|
|
|
|
|
fault_nochange = "No change." |
86
|
|
|
|
|
|
|
fault_already_authed = "You are already authenticated." |
87
|
|
|
|
|
|
|
fault_unimplemented = "Method not implemented." |
88
|
|
|
|
|
|
|
=cut |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
sub return_dispatch { |
91
|
0
|
|
|
0
|
|
|
my ($self, $return, @fault_strings_override) = @_; |
92
|
|
|
|
|
|
|
|
93
|
0
|
0
|
|
|
|
|
if(ref($return) eq "RPC::XML::fault") |
|
|
0
|
|
|
|
|
|
94
|
|
|
|
|
|
|
{ |
95
|
0
|
|
|
|
|
|
my $faultcode = $return->code; |
96
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
# Default string table for the fault dispatch table (should be overridden per method) |
98
|
0
|
|
|
|
|
|
my @fault_strings = ( |
99
|
|
|
|
|
|
|
[ "Insufficient parameters.", "fault_needmoreparams"], |
100
|
|
|
|
|
|
|
[ "Invalid parameters.", "fault_badparams"], |
101
|
|
|
|
|
|
|
[ "No such source.", "fault_nosuch_source"], |
102
|
|
|
|
|
|
|
[ "No such target.", "fault_nosuch_target"], |
103
|
|
|
|
|
|
|
[ "Authentication failed.", "fault_authfail" ], |
104
|
|
|
|
|
|
|
[ "Insufficient privileges.", "fault_noprivs" ], |
105
|
|
|
|
|
|
|
[ "No such key.", "fault_nosuch_key" ], |
106
|
|
|
|
|
|
|
[ "Item already exists.", "fault_alreadyexists" ], |
107
|
|
|
|
|
|
|
[ "Too many items.", "fault_toomany" ], |
108
|
|
|
|
|
|
|
[ "Email verification failed.", "fault_emailfail" ], |
109
|
|
|
|
|
|
|
[ "Action not verified.", "fault_notverified" ], |
110
|
|
|
|
|
|
|
[ "No change.", "fault_nochange" ], |
111
|
|
|
|
|
|
|
[ "You are already authenticated.", "fault_already_authed" ], |
112
|
|
|
|
|
|
|
[ "Method not implemented.", "fault_unimplemented" ], |
113
|
|
|
|
|
|
|
); |
114
|
|
|
|
|
|
|
|
115
|
0
|
|
0
|
|
|
|
@fault_strings = map { $fault_strings_override[$_] ||= $fault_strings[$_] } (0..$#fault_strings); |
|
0
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
|
117
|
0
|
|
|
|
|
|
return { type => $fault_strings[$faultcode-1][1], string => $fault_strings[$faultcode-1][0], code => $faultcode}; |
118
|
|
|
|
|
|
|
} |
119
|
|
|
|
|
|
|
elsif(ref($return) eq "RPC::XML::string") |
120
|
|
|
|
|
|
|
{ |
121
|
0
|
|
|
|
|
|
my $value = $return->value; |
122
|
0
|
|
|
|
|
|
return { type => 'success', string => $value }; |
123
|
|
|
|
|
|
|
} |
124
|
|
|
|
|
|
|
else |
125
|
|
|
|
|
|
|
{ |
126
|
0
|
|
|
|
|
|
return { type => 'fault_http', string => "Connection refused." }; |
127
|
|
|
|
|
|
|
} |
128
|
|
|
|
|
|
|
} |
129
|
|
|
|
|
|
|
|
130
|
|
|
|
|
|
|
=head2 call_svs |
131
|
|
|
|
|
|
|
|
132
|
|
|
|
|
|
|
Method call |
133
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
=cut |
135
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
sub call_svs { |
137
|
0
|
|
|
0
|
|
|
my ($self, $args) = @_; |
138
|
|
|
|
|
|
|
|
139
|
0
|
|
0
|
|
|
|
my $result = $self->{rpc}->send_request('atheme.command', $args->{authcookie} || "x", $args->{nick} || "x", $args->{address} || "x", $args->{svs} || "x",$args->{cmd} || "x", @{$args->{params}}); |
|
0
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
140
|
|
|
|
|
|
|
|
141
|
0
|
0
|
|
|
|
|
return $self->return_dispatch($result, ($args->{fault_overwrite} ? $args->{fault_overwrite} : {})); |
142
|
|
|
|
|
|
|
} |
143
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
=head2 login |
145
|
|
|
|
|
|
|
|
146
|
|
|
|
|
|
|
A common method used to log into the services in order to execute other |
147
|
|
|
|
|
|
|
methods. Every service inherits this, so you can load just Atheme::MemoServ |
148
|
|
|
|
|
|
|
and log in through that. |
149
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
=cut |
151
|
|
|
|
|
|
|
|
152
|
|
|
|
|
|
|
sub login { |
153
|
0
|
|
|
0
|
|
|
my ($self, $args) = @_; |
154
|
|
|
|
|
|
|
|
155
|
|
|
|
|
|
|
# This method is different from all others and so has to be called separately. |
156
|
0
|
|
|
|
|
|
my $result = $self->{rpc}->send_request('atheme.login', $args->{nick}, $args->{pass}, $args->{address}); |
157
|
|
|
|
|
|
|
|
158
|
0
|
|
|
|
|
|
my @overrides; |
159
|
|
|
|
|
|
|
|
160
|
0
|
|
|
|
|
|
$overrides[fault_needmoreparams-1] = ["Insufficient parameters.","fault_needmoreparams"]; |
161
|
0
|
|
|
|
|
|
$overrides[fault_nosuch_source-1] = ["The account is not registered.","fault_nosuch_source"]; |
162
|
0
|
|
|
|
|
|
$overrides[fault_authfail-1] = ["The password is not valid for this account.","fault_authfail"]; |
163
|
0
|
|
|
|
|
|
$overrides[fault_noprivs-1] = ["The account has been frozen.","fault_noprivs"]; |
164
|
|
|
|
|
|
|
|
165
|
0
|
|
|
|
|
|
return $self->return_dispatch($result, @overrides); |
166
|
|
|
|
|
|
|
} |
167
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
=head2 logout |
169
|
|
|
|
|
|
|
|
170
|
|
|
|
|
|
|
A common method used to log out and clean up your authcookie. This should be |
171
|
|
|
|
|
|
|
done, but does not have to be done. This method is also inherited and |
172
|
|
|
|
|
|
|
therefore usable in every *Serv. |
173
|
|
|
|
|
|
|
|
174
|
|
|
|
|
|
|
=cut |
175
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
sub logout { |
177
|
0
|
|
|
0
|
|
|
my ($self, $args) = @_; |
178
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
# Set required variables |
180
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
# This method is different from all others and so has to be called separately. |
182
|
0
|
|
|
|
|
|
my $result = $self->{rpc}->send_request('atheme.logout', $args->{authcookie}, $args->{nick}); |
183
|
|
|
|
|
|
|
|
184
|
0
|
|
|
|
|
|
my @overrides; |
185
|
0
|
|
|
|
|
|
$overrides[Atheme::Fault::fault_nosuch_source()-1] = ["Unknown user.","fault_nosuch_source"]; |
186
|
0
|
|
|
|
|
|
$overrides[Atheme::Fault::fault_authfail()-1] = ["Invalid authcookie for this account.","fault_authfail"]; |
187
|
|
|
|
|
|
|
|
188
|
0
|
|
|
|
|
|
return $self->return_dispatch($result, @overrides); |
189
|
|
|
|
|
|
|
|
190
|
|
|
|
|
|
|
} |
191
|
|
|
|
|
|
|
|
192
|
|
|
|
|
|
|
=head1 AUTHORS |
193
|
|
|
|
|
|
|
|
194
|
|
|
|
|
|
|
Pippijn van Steenhoven |
195
|
|
|
|
|
|
|
Stephan Jauernick |
196
|
|
|
|
|
|
|
|
197
|
|
|
|
|
|
|
=cut |
198
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
1; |