diff options
Diffstat (limited to 'fs_selfadmin/FS-MailAdminServer/MailAdminClient.pm')
-rwxr-xr-x | fs_selfadmin/FS-MailAdminServer/MailAdminClient.pm | 541 |
1 files changed, 541 insertions, 0 deletions
diff --git a/fs_selfadmin/FS-MailAdminServer/MailAdminClient.pm b/fs_selfadmin/FS-MailAdminServer/MailAdminClient.pm new file mode 100755 index 000000000..46cde4c0d --- /dev/null +++ b/fs_selfadmin/FS-MailAdminServer/MailAdminClient.pm @@ -0,0 +1,541 @@ +package FS::MailAdminClient; + +use strict; +use vars qw($VERSION @ISA @EXPORT_OK $fs_mailadmind_socket); +use Exporter; +use Socket; +use FileHandle; +use IO::Handle; + +$VERSION = '0.01'; + +@ISA = qw( Exporter ); +@EXPORT_OK = qw( signup_info authenticate list_packages list_mailboxes delete_mailbox password_mailbox add_mailbox list_forwards list_pkg_forwards delete_forward add_forward new_customer ); + +$fs_mailadmind_socket = "/usr/local/freeside/fs_mailadmind_socket"; + +$ENV{'PATH'} ='/usr/bin:/usr/ucb:/bin'; +$ENV{'SHELL'} = '/bin/sh'; +$ENV{'IFS'} = " \t\n"; +$ENV{'CDPATH'} = ''; +$ENV{'ENV'} = ''; +$ENV{'BASH_ENV'} = ''; + +my $freeside_uid = scalar(getpwnam('freeside')); +die "not running as the freeside user\n" if $> != $freeside_uid; + +=head1 NAME + +FS::MailAdminClient - Freeside mail administration client API + +=head1 SYNOPSIS + + use FS::MailAdminClient qw( signup_info list_mailboxes new_customer ); + + ( $locales, $packages, $pops ) = signup_info; + + ( $accounts ) = list_mailboxes; + + $error = new_customer ( { + 'first' => $first, + 'last' => $last, + 'ss' => $ss, + 'comapny' => $company, + 'address1' => $address1, + 'address2' => $address2, + 'city' => $city, + 'county' => $county, + 'state' => $state, + 'zip' => $zip, + 'country' => $country, + 'daytime' => $daytime, + 'night' => $night, + 'fax' => $fax, + 'payby' => $payby, + 'payinfo' => $payinfo, + 'paydate' => $paydate, + 'payname' => $payname, + 'invoicing_list' => $invoicing_list, + 'pkgpart' => $pkgpart, + 'username' => $username, + '_password' => $password, + 'popnum' => $popnum, + } ); + +=head1 DESCRIPTION + +This module provides an API for a remote mail administration server. + +It needs to be run as the freeside user. Because of this, the program which +calls these subroutines should be written very carefully. + +=head1 SUBROUTINES + +=over 4 + +=item signup_info + +Returns three array references of hash references. + +The first set of hash references is of allowable locales. Each hash reference +has the following keys: + taxnum + state + county + country + +The second set of hash references is of allowable packages. Each hash +reference has the following keys: + pkgpart + pkg + +The third set of hash references is of allowable POPs (Points Of Presence). +Each hash reference has the following keys: + popnum + city + state + ac + exch + +=cut + +sub signup_info { + socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!"; + connect(SOCK, sockaddr_un($fs_mailadmind_socket)) or die "connect: $!"; + print SOCK "signup_info\n"; + SOCK->flush; + + chop ( my $n_cust_main_county = <SOCK> ); + my @cust_main_county = map { + chop ( my $taxnum = <SOCK> ); + chop ( my $state = <SOCK> ); + chop ( my $county = <SOCK> ); + chop ( my $country = <SOCK> ); + { + 'taxnum' => $taxnum, + 'state' => $state, + 'county' => $county, + 'country' => $country, + }; + } 1 .. $n_cust_main_county; + + chop ( my $n_part_pkg = <SOCK> ); + my @part_pkg = map { + chop ( my $pkgpart = <SOCK> ); + chop ( my $pkg = <SOCK> ); + { + 'pkgpart' => $pkgpart, + 'pkg' => $pkg, + }; + } 1 .. $n_part_pkg; + + chop ( my $n_svc_acct_pop = <SOCK> ); + my @svc_acct_pop = map { + chop ( my $popnum = <SOCK> ); + chop ( my $city = <SOCK> ); + chop ( my $state = <SOCK> ); + chop ( my $ac = <SOCK> ); + chop ( my $exch = <SOCK> ); + chop ( my $loc = <SOCK> ); + { + 'popnum' => $popnum, + 'city' => $city, + 'state' => $state, + 'ac' => $ac, + 'exch' => $exch, + 'loc' => $loc, + }; + } 1 .. $n_svc_acct_pop; + + close SOCK; + + \@cust_main_county, \@part_pkg, \@svc_acct_pop; +} + +=item authenticate + +Authentictes against a service on the remote Freeside system. Requires a hash +reference as a parameter with the following keys: + authuser + _password + +Returns a scalar error message of the form "authuser OK|FAILED" or an error +message. + +=cut + +sub authenticate { + my $hashref = shift; + socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!"; + connect(SOCK, sockaddr_un($fs_mailadmind_socket)) or die "connect: $!"; + print SOCK "authenticate", "\n"; + SOCK->flush; + + print SOCK join("\n", map { $hashref->{$_} } qw( + authuser _password + ) ), "\n"; + SOCK->flush; + + chop( my $error = <SOCK> ); + close SOCK; + + $error; +} + +=item list_packages + +Returns one array reference of hash references. + +The set of hash references is of existing packages. Each hash reference +has the following keys: + pkgnum + domain + account + +=cut + +sub list_packages { + my $user = shift; + socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!"; + connect(SOCK, sockaddr_un($fs_mailadmind_socket)) or die "connect: $!"; + print SOCK "list_packages\n", $user, "\n"; + SOCK->flush; + + chop ( my $n_packages = <SOCK> ); + my @packages = map { + chop ( my $pkgnum = <SOCK> ); + chop ( my $domain = <SOCK> ); + chop ( my $account = <SOCK> ); + { + 'pkgnum' => $pkgnum, + 'domain' => $domain, + 'account' => $account, + }; + } 1 .. $n_packages; + + close SOCK; + + \@packages; +} + +=item list_mailboxes + +Returns one array references of hash references. + +The set of hash references is of existing accounts. Each hash reference +has the following keys: + svcnum + username + _password + +=cut + +sub list_mailboxes { + my ($user, $package) = @_; + socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!"; + connect(SOCK, sockaddr_un($fs_mailadmind_socket)) or die "connect: $!"; + print SOCK "list_mailboxes\n", $user, "\n", $package, "\n"; + SOCK->flush; + + chop ( my $n_svc_acct = <SOCK> ); + my @svc_acct = map { + chop ( my $svcnum = <SOCK> ); + chop ( my $username = <SOCK> ); + chop ( my $_password = <SOCK> ); + { + 'svcnum' => $svcnum, + 'username' => $username, + '_password' => $_password, + }; + } 1 .. $n_svc_acct; + + close SOCK; + + \@svc_acct; +} + +=item delete_mailbox + +Deletes a mailbox service from the remote Freeside system. Requires a hash +reference as a paramater with the following keys: + authuser + account + +Returns a scalar error message, or the empty string for success. + +=cut + +sub delete_mailbox { + my $hashref = shift; + socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!"; + connect(SOCK, sockaddr_un($fs_mailadmind_socket)) or die "connect: $!"; + print SOCK "delete_mailbox", "\n"; + SOCK->flush; + + print SOCK join("\n", map { $hashref->{$_} } qw( + authuser account + ) ), "\n"; + SOCK->flush; + + chop( my $error = <SOCK> ); + close SOCK; + + $error; +} + +=item password_mailbox + +Changes the password for a mailbox service on the remote Freeside system. + Requires a hash reference as a paramater with the following keys: + authuser + account + _password + +Returns a scalar error message, or the empty string for success. + +=cut + +sub password_mailbox { + my $hashref = shift; + socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!"; + connect(SOCK, sockaddr_un($fs_mailadmind_socket)) or die "connect: $!"; + print SOCK "password_mailbox", "\n"; + SOCK->flush; + + print SOCK join("\n", map { $hashref->{$_} } qw( + authuser account _password + ) ), "\n"; + SOCK->flush; + + chop( my $error = <SOCK> ); + close SOCK; + + $error; +} + +=item add_mailbox + +Creates a mailbox service on the remote Freeside system. Requires a hash +reference as a parameter with the following keys: + authuser + package + account + _password + +Returns a scalar error message, or the empty string for success. + +=cut + +sub add_mailbox { + my $hashref = shift; + socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!"; + connect(SOCK, sockaddr_un($fs_mailadmind_socket)) or die "connect: $!"; + print SOCK "add_mailbox", "\n"; + SOCK->flush; + + print SOCK join("\n", map { $hashref->{$_} } qw( + authuser package account _password + ) ), "\n"; + SOCK->flush; + + chop( my $error = <SOCK> ); + close SOCK; + + $error; +} + +=item list_forwards + +Returns one array references of hash references. + +The set of hash references is of existing forwards. Each hash reference +has the following keys: + svcnum + dest + +=cut + +sub list_forwards { + my ($user, $service) = @_; + socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!"; + connect(SOCK, sockaddr_un($fs_mailadmind_socket)) or die "connect: $!"; + print SOCK "list_forwards\n", $user, "\n", $service, "\n"; + SOCK->flush; + + chop ( my $n_svc_forward = <SOCK> ); + my @svc_forward = map { + chop ( my $svcnum = <SOCK> ); + chop ( my $dest = <SOCK> ); + { + 'svcnum' => $svcnum, + 'dest' => $dest, + }; + } 1 .. $n_svc_forward; + + close SOCK; + + \@svc_forward; +} + +=item list_pkg_forwards + +Returns one array references of hash references. + +The set of hash references is of existing forwards. Each hash reference +has the following keys: + svcnum + srcsvc + dest + +=cut + +sub list_pkg_forwards { + my ($user, $package) = @_; + socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!"; + connect(SOCK, sockaddr_un($fs_mailadmind_socket)) or die "connect: $!"; + print SOCK "list_pkg_forwards\n", $user, "\n", $package, "\n"; + SOCK->flush; + + chop ( my $n_svc_forward = <SOCK> ); + my @svc_forward = map { + chop ( my $svcnum = <SOCK> ); + chop ( my $srcsvc = <SOCK> ); + chop ( my $dest = <SOCK> ); + { + 'svcnum' => $svcnum, + 'srcsvc' => $srcsvc, + 'dest' => $dest, + }; + } 1 .. $n_svc_forward; + + close SOCK; + + \@svc_forward; +} + +=item delete_forward + +Deletes a forward service from the remote Freeside system. Requires a hash +reference as a paramater with the following keys: + authuser + svcnum + +Returns a scalar error message, or the empty string for success. + +=cut + +sub delete_forward { + my $hashref = shift; + socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!"; + connect(SOCK, sockaddr_un($fs_mailadmind_socket)) or die "connect: $!"; + print SOCK "delete_forward", "\n"; + SOCK->flush; + + print SOCK join("\n", map { $hashref->{$_} } qw( + authuser svcnum + ) ), "\n"; + SOCK->flush; + + chop( my $error = <SOCK> ); + close SOCK; + + $error; +} + +=item add_forward + +Creates a forward service on the remote Freeside system. Requires a hash +reference as a parameter with the following keys: + authuser + package + source + dest + +Returns a scalar error message, or the empty string for success. + +=cut + +sub add_forward { + my $hashref = shift; + socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!"; + connect(SOCK, sockaddr_un($fs_mailadmind_socket)) or die "connect: $!"; + print SOCK "add_forward", "\n"; + SOCK->flush; + + print SOCK join("\n", map { $hashref->{$_} } qw( + authuser package source dest + ) ), "\n"; + SOCK->flush; + + chop( my $error = <SOCK> ); + close SOCK; + + $error; +} + +=item new_customer HASHREF + +Adds a customer to the remote Freeside system. Requires a hash reference as +a paramater with the following keys: + first + last + ss + comapny + address1 + address2 + city + county + state + zip + country + daytime + night + fax + payby + payinfo + paydate + payname + invoicing_list + pkgpart + username + _password + popnum + +Returns a scalar error message, or the empty string for success. + +=cut + +sub new_customer { + my $hashref = shift; + + socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!"; + connect(SOCK, sockaddr_un($fs_mailadmind_socket)) or die "connect: $!"; + print SOCK "new_customer\n"; + + print SOCK join("\n", map { $hashref->{$_} } qw( + first last ss company address1 address2 city county state zip country + daytime night fax payby payinfo paydate payname invoicing_list + pkgpart username _password popnum + ) ), "\n"; + SOCK->flush; + + chop( my $error = <SOCK> ); + $error; +} + +=back + +=head1 VERSION + +$Id: MailAdminClient.pm,v 1.1 2001-10-18 15:04:54 jeff Exp $ + +=head1 BUGS + +=head1 SEE ALSO + +L<fs_signupd>, L<FS::SignupServer>, L<FS::cust_main> + +=cut + +1; + |