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 adminsuidsetup forksuidsetup
19 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).
68 $dbh->disconnect if $dbh;
74 croak "fatal: adminsuidsetup called without arguements" unless $user;
76 $user =~ /^([\w\-\.]+)$/ or croak "fatal: illegal user $user";
79 $ENV{'PATH'} ='/usr/local/bin:/usr/bin:/usr/ucb:/bin';
80 $ENV{'SHELL'} = '/bin/sh';
81 $ENV{'IFS'} = " \t\n";
84 $ENV{'BASH_ENV'} = '';
86 croak "Not running uid freeside!" unless checkeuid();
88 $dbh = DBI->connect($datasrc,$db_user,$db_pass, {
91 } ) or die "DBI->connect error: $DBI::errstr\n";
93 foreach ( keys %callback ) {
95 # breaks multi-database installs # delete $callback{$_}; #run once
101 =item cgisuidsetup CGI_object
103 Takes a single argument, which is a CGI (see L<CGI>) or Apache (see L<Apache>)
104 object (CGI::Base is depriciated). Runs cgisetotaker and then adminsuidsetup.
110 if ( $cgi->isa('CGI::Base') ) {
111 carp "Use of CGI::Base is depriciated";
112 } elsif ( $cgi->isa('Apache') ) {
114 } elsif ( ! $cgi->isa('CGI') ) {
115 croak "fatal: unrecognized object $cgi";
118 adminsuidsetup($user);
123 Returns the CGI (see L<CGI>) object.
128 carp "warning: \$FS::UID::cgi isa Apache" if $cgi->isa('Apache');
134 Returns the DBI database handle.
144 Returns the DBI data source.
154 Returns just the driver name portion of the DBI data source.
159 return $driver_name if defined $driver_name;
160 $driver_name = ( split(':', $datasrc) )[1];
164 croak "suidsetup depriciated";
169 Returns the current Freeside user.
175 #stupid kludge until schema otaker fields are not 8 chars
181 Sets and returns the CGI REMOTE_USER. $cgi should be defined as a CGI.pm
182 object (see L<CGI>) or an Apache object (see L<Apache>). Support for CGI::Base
183 and derived classes is depriciated.
188 if ( $cgi && $cgi->isa('CGI::Base') && defined $cgi->var('REMOTE_USER')) {
189 carp "Use of CGI::Base is depriciated";
190 $user = lc ( $cgi->var('REMOTE_USER') );
191 } elsif ( $cgi && $cgi->isa('CGI') && defined $cgi->remote_user ) {
192 $user = lc ( $cgi->remote_user );
193 } elsif ( $cgi && $cgi->isa('Apache') ) {
194 $user = lc ( $cgi->connection->user );
196 die "fatal: Can't get REMOTE_USER! for cgi $cgi - you need to setup ".
197 "Apache user authentication as documented in httemplate/docs/install.html";
204 Returns true if effective UID is that of the freeside user.
209 ( $> == $freeside_uid );
214 Returns true if the real UID is that of the freeside user.
219 ( $< == $freeside_uid );
222 =item getsecrets [ USER ]
224 Sets the user to USER, if supplied.
225 Sets and returns the DBI datasource, username and password for this user from
226 the `/usr/local/etc/freeside/mapsecrets' file.
231 my($setuser) = shift;
232 $user = $setuser if $setuser;
233 die "No user!" unless $user;
234 my($conf) = new FS::Conf $conf_dir;
235 my($line) = grep /^\s*$user\s/, $conf->config('mapsecrets');
236 die "User $user not found in mapsecrets!" unless $line;
237 $line =~ /^\s*$user\s+(.*)$/;
239 die "Illegal mapsecrets line for user?!" unless $secrets;
240 ($datasrc, $db_user, $db_pass) = $conf->config($secrets)
241 or die "Can't get secrets: $!";
242 $FS::Conf::default_dir = $conf_dir. "/conf.$datasrc";
244 ($datasrc, $db_user, $db_pass);
251 Warning: this interface is likely to change in future releases.
253 A package can install a callback to be run in adminsuidsetup by putting a
254 coderef into the hash %FS::UID::callback :
256 $coderef = sub { warn "Hi, I'm returning your call!" };
257 $FS::UID::callback{'Package::Name'};
261 $Id: UID.pm,v 1.19 2002-08-29 06:02:52 ivan Exp $
265 Too many package-global variables.
269 No capabilities yet. When mod_perl and Authen::DBI are implemented,
270 cgisuidsetup will go away as well.
272 Goes through contortions to support non-OO syntax with multiple datasrc's.
274 Callbacks are inelegant.
278 L<FS::Record>, L<CGI>, L<DBI>, config.html from the base documentation.