5 @ISA @EXPORT_OK $cgi $dbh $freeside_uid $user
6 $conf_dir $secrets $datasrc $db_user $db_pass %callback $driver_name
9 getsecrets cgisetotaker
12 use Carp qw(carp croak cluck);
17 @EXPORT_OK = qw(checkeuid checkruid swapuid cgisuidsetup
18 adminsuidsetup getotaker dbh datasrc getsecrets driver_name );
20 $freeside_uid = scalar(getpwnam('freeside'));
22 $conf_dir = "/usr/local/etc/freeside/";
26 FS::UID - Subroutines for database login and assorted other stuff
30 use FS::UID qw(adminsuidsetup cgisuidsetup dbh datasrc getotaker
31 checkeuid checkruid swapuid);
36 $dbh = cgisuidsetup($cgi);
42 $driver_name = driver_name;
46 Provides a hodgepodge of subroutines.
52 =item adminsuidsetup USER
54 Sets the user to USER (see config.html from the base documentation).
55 Cleans the environment.
56 Make sure the script is running as freeside, or setuid freeside.
57 Opens a connection to the database.
58 Swaps real and effective UIDs.
59 Runs any defined callbacks (see below).
60 Returns the DBI database handle (usually you don't need this).
67 croak "fatal: adminsuidsetup called without arguements" unless $user;
69 $ENV{'PATH'} ='/usr/local/bin:/usr/bin:/usr/ucb:/bin';
70 $ENV{'SHELL'} = '/bin/sh';
71 $ENV{'IFS'} = " \t\n";
74 $ENV{'BASH_ENV'} = '';
76 croak "Not running uid freeside!" unless checkeuid();
78 $dbh = DBI->connect($datasrc,$db_user,$db_pass, {
79 'AutoCommit' => 'true',
80 'ChopBlanks' => 'true',
81 } ) or die "DBI->connect error: $DBI::errstr\n";
83 swapuid(); #go to non-privledged user if running setuid freeside
85 foreach ( keys %callback ) {
92 =item cgisuidsetup CGI_object
94 Takes a single argument, which is a CGI (see L<CGI>) or Apache (see L<Apache>)
95 object (CGI::Base is depriciated). Runs cgisetotaker and then adminsuidsetup.
101 if ( $cgi->isa('CGI::Base') ) {
102 carp "Use of CGI::Base is depriciated";
103 } elsif ( $cgi->isa('Apache') ) {
105 } elsif ( ! $cgi->isa('CGI') ) {
106 croak "fatal: unrecognized object $cgi";
109 adminsuidsetup($user);
114 Returns the CGI (see L<CGI>) object.
119 carp "warning: \$FS::UID::cgi isa Apache" if $cgi->isa('Apache');
125 Returns the DBI database handle.
135 Returns the DBI data source.
145 Returns just the driver name portion of the DBI data source.
150 return $driver_name if defined $driver_name;
151 $driver_name = ( split(':', $datasrc) )[1];
155 croak "suidsetup depriciated";
160 Returns the current Freeside user.
170 Sets and returns the CGI REMOTE_USER. $cgi should be defined as a CGI.pm
171 object (see L<CGI>) or an Apache object (see L<Apache>). Support for CGI::Base
172 and derived classes is depriciated.
177 if ( $cgi && $cgi->isa('CGI::Base') && defined $cgi->var('REMOTE_USER')) {
178 carp "Use of CGI::Base is depriciated";
179 $user = lc ( $cgi->var('REMOTE_USER') );
180 } elsif ( $cgi && $cgi->isa('CGI') && defined $cgi->remote_user ) {
181 $user = lc ( $cgi->remote_user );
182 } elsif ( $cgi && $cgi->isa('Apache') ) {
183 $user = lc ( $cgi->connection->user );
185 die "fatal: Can't get REMOTE_USER! for cgi $cgi";
192 Returns true if effective UID is that of the freeside user.
197 ( $> == $freeside_uid );
202 Returns true if the real UID is that of the freeside user.
207 ( $< == $freeside_uid );
212 Swaps real and effective UIDs.
217 ($<,$>) = ($>,$<) if $< != $>;
220 =item getsecrets [ USER ]
222 Sets the user to USER, if supplied.
223 Sets and returns the DBI datasource, username and password for this user from
224 the `/usr/local/etc/freeside/mapsecrets' file.
229 my($setuser) = shift;
230 $user = $setuser if $setuser;
231 die "No user!" unless $user;
232 my($conf) = new FS::Conf $conf_dir;
233 my($line) = grep /^\s*$user\s/, $conf->config('mapsecrets');
234 die "User not found in mapsecrets!" unless $line;
235 $line =~ /^\s*$user\s+(.*)$/;
237 die "Illegal mapsecrets line for user?!" unless $secrets;
238 ($datasrc, $db_user, $db_pass) = $conf->config($secrets)
239 or die "Can't get secrets: $!";
240 $FS::Conf::default_dir = $conf_dir. "/conf.$datasrc";
242 ($datasrc, $db_user, $db_pass);
249 Warning: this interface is likely to change in future releases.
251 A package can install a callback to be run in adminsuidsetup by putting a
252 coderef into the hash %FS::UID::callback :
254 $coderef = sub { warn "Hi, I'm returning your call!" };
255 $FS::UID::callback{'Package::Name'};
259 $Id: UID.pm,v 1.3 2000-06-23 12:25:59 ivan Exp $
263 Too many package-global variables.
267 No capabilities yet. When mod_perl and Authen::DBI are implemented,
268 cgisuidsetup will go away as well.
270 Goes through contortions to support non-OO syntax with multiple datasrc's.
272 Callbacks are inelegant.
276 L<FS::Record>, L<CGI>, L<DBI>, config.html from the base documentation.