1 package FS::ClientAPI::Freeside;
4 #use vars qw($DEBUG $me);
5 use FS::Record qw(qsearchs);
8 use FS::webservice_log;
11 #$me = '[FS::ClientAPI:Freeside]';
16 # quantity (i.e. pages) - defaults to 1
19 # error (empty, or error message)
22 sub freesideinc_service {
25 my $svcpart = FS::Conf->new->config('freesideinc-webservice-svcpart')
26 or return { 'error' => 'guru meditation #pow' };
27 die 'no' unless $svcpart =~ /^\d+$/;
29 ( my $support_key = $packet->{'support-key'} ) =~ /^\s*([^:]+):(.+)\s*$/
30 or return { 'error' => 'bad support-key' };
31 my($username, $_password) = ($1,$2);
33 my $svc_acct = qsearchs({
34 'table' => 'svc_acct',
35 'addl_from' => 'LEFT JOIN cust_svc USING ( svcnum )',
36 'hashref' => { 'username' => $username,
37 '_password' => $_password,
39 'extra_sql' => "AND svcpart = $svcpart",
41 unless ( $svc_acct ) {
42 warn "bad support-key for $username from $ENV{REMOTE_IP}\n";
43 sleep 5; #ideally also rate-limit and eventually ban their IP
44 return { 'error' => 'bad support-key' };
47 #XXX check if some customers can use some API calls, rate-limiting, etc.
48 # but for now, everybody can use everything
51 my $custnum = $svc_acct->cust_svc->cust_pkg->custnum;
52 my $webservice_log = new FS::webservice_log {
53 'custnum' => $custnum,
54 'svcnum' => $svc_acct->svcnum,
55 'method' => $packet->{'method'},
56 'quantity' => $packet->{'quantity'} || 1,
58 my $error = $webservice_log->insert;
59 return { 'error' => $error } if $error;
61 return { 'error' => '',
62 'custnum' => $custnum,