5 @ISA @EXPORT_OK $cgi $dbh $freeside_uid $user
6 $conf_dir $secrets $datasrc $db_user $db_pass %callback $driver_name
10 getsecrets cgisetotaker
13 use Carp qw(carp croak cluck);
18 @EXPORT_OK = qw(checkeuid checkruid cgisuidsetup
19 adminsuidsetup getotaker dbh datasrc getsecrets driver_name );
21 $freeside_uid = scalar(getpwnam('freeside'));
23 $conf_dir = "/usr/local/etc/freeside/";
25 $AutoCommit = 1; #ours, not DBI
29 FS::UID - Subroutines for database login and assorted other stuff
33 use FS::UID qw(adminsuidsetup cgisuidsetup dbh datasrc getotaker
39 $dbh = cgisuidsetup($cgi);
45 $driver_name = driver_name;
49 Provides a hodgepodge of subroutines.
55 =item adminsuidsetup USER
57 Sets the user to USER (see config.html from the base documentation).
58 Cleans the environment.
59 Make sure the script is running as freeside, or setuid freeside.
60 Opens a connection to the database.
61 Swaps real and effective UIDs.
62 Runs any defined callbacks (see below).
63 Returns the DBI database handle (usually you don't need this).
70 croak "fatal: adminsuidsetup called without arguements" unless $user;
72 $ENV{'PATH'} ='/usr/local/bin:/usr/bin:/usr/ucb:/bin';
73 $ENV{'SHELL'} = '/bin/sh';
74 $ENV{'IFS'} = " \t\n";
77 $ENV{'BASH_ENV'} = '';
79 croak "Not running uid freeside!" unless checkeuid();
81 $dbh->disconnect if $dbh;
82 $dbh = DBI->connect($datasrc,$db_user,$db_pass, {
85 } ) or die "DBI->connect error: $DBI::errstr\n";
87 foreach ( keys %callback ) {
94 =item cgisuidsetup CGI_object
96 Takes a single argument, which is a CGI (see L<CGI>) or Apache (see L<Apache>)
97 object (CGI::Base is depriciated). Runs cgisetotaker and then adminsuidsetup.
103 if ( $cgi->isa('CGI::Base') ) {
104 carp "Use of CGI::Base is depriciated";
105 } elsif ( $cgi->isa('Apache') ) {
107 } elsif ( ! $cgi->isa('CGI') ) {
108 croak "fatal: unrecognized object $cgi";
111 adminsuidsetup($user);
116 Returns the CGI (see L<CGI>) object.
121 #carp "warning: \$FS::UID::cgi isa Apache" if $cgi->isa('Apache');
127 Returns the DBI database handle.
137 Returns the DBI data source.
147 Returns just the driver name portion of the DBI data source.
152 return $driver_name if defined $driver_name;
153 $driver_name = ( split(':', $datasrc) )[1];
157 croak "suidsetup depriciated";
162 Returns the current Freeside user.
172 Sets and returns the CGI REMOTE_USER. $cgi should be defined as a CGI.pm
173 object (see L<CGI>) or an Apache object (see L<Apache>). Support for CGI::Base
174 and derived classes is depriciated.
179 if ( $cgi && $cgi->isa('CGI::Base') && defined $cgi->var('REMOTE_USER')) {
180 carp "Use of CGI::Base is depriciated";
181 $user = lc ( $cgi->var('REMOTE_USER') );
182 } elsif ( $cgi && $cgi->isa('CGI') && defined $cgi->remote_user ) {
183 $user = lc ( $cgi->remote_user );
184 } elsif ( $cgi && $cgi->isa('Apache') ) {
185 $user = lc ( $cgi->connection->user );
187 die "fatal: Can't get REMOTE_USER! for cgi $cgi - you need to setup ".
188 "Apache user authentication as documented in htdocs/docs/config.html";
195 Returns true if effective UID is that of the freeside user.
200 ( $> == $freeside_uid );
205 Returns true if the real UID is that of the freeside user.
210 ( $< == $freeside_uid );
213 =item getsecrets [ USER ]
215 Sets the user to USER, if supplied.
216 Sets and returns the DBI datasource, username and password for this user from
217 the `/usr/local/etc/freeside/mapsecrets' file.
222 my($setuser) = shift;
223 $user = $setuser if $setuser;
224 die "No user!" unless $user;
225 my($conf) = new FS::Conf $conf_dir;
226 my($line) = grep /^\s*$user\s/, $conf->config('mapsecrets');
227 die "User not found in mapsecrets!" unless $line;
228 $line =~ /^\s*$user\s+(.*)$/;
230 die "Illegal mapsecrets line for user?!" unless $secrets;
231 ($datasrc, $db_user, $db_pass) = $conf->config($secrets)
232 or die "Can't get secrets: $!";
233 $FS::Conf::default_dir = $conf_dir. "/conf.$datasrc";
235 ($datasrc, $db_user, $db_pass);
242 Warning: this interface is likely to change in future releases.
244 A package can install a callback to be run in adminsuidsetup by putting a
245 coderef into the hash %FS::UID::callback :
247 $coderef = sub { warn "Hi, I'm returning your call!" };
248 $FS::UID::callback{'Package::Name'};
252 $Id: UID.pm,v 1.9 2001-09-06 20:41:59 ivan Exp $
256 Too many package-global variables.
260 No capabilities yet. When mod_perl and Authen::DBI are implemented,
261 cgisuidsetup will go away as well.
263 Goes through contortions to support non-OO syntax with multiple datasrc's.
265 Callbacks are inelegant.
269 L<FS::Record>, L<CGI>, L<DBI>, config.html from the base documentation.