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 swapuid 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
34 checkeuid checkruid swapuid);
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 swapuid(); #go to non-privledged user if running setuid freeside
89 foreach ( keys %callback ) {
96 =item cgisuidsetup CGI_object
98 Takes a single argument, which is a CGI (see L<CGI>) or Apache (see L<Apache>)
99 object (CGI::Base is depriciated). Runs cgisetotaker and then adminsuidsetup.
105 if ( $cgi->isa('CGI::Base') ) {
106 carp "Use of CGI::Base is depriciated";
107 } elsif ( $cgi->isa('Apache') ) {
109 } elsif ( ! $cgi->isa('CGI') ) {
110 croak "fatal: unrecognized object $cgi";
113 adminsuidsetup($user);
118 Returns the CGI (see L<CGI>) object.
123 carp "warning: \$FS::UID::cgi isa Apache" if $cgi->isa('Apache');
129 Returns the DBI database handle.
139 Returns the DBI data source.
149 Returns just the driver name portion of the DBI data source.
154 return $driver_name if defined $driver_name;
155 $driver_name = ( split(':', $datasrc) )[1];
159 croak "suidsetup depriciated";
164 Returns the current Freeside user.
174 Sets and returns the CGI REMOTE_USER. $cgi should be defined as a CGI.pm
175 object (see L<CGI>) or an Apache object (see L<Apache>). Support for CGI::Base
176 and derived classes is depriciated.
181 if ( $cgi && $cgi->isa('CGI::Base') && defined $cgi->var('REMOTE_USER')) {
182 carp "Use of CGI::Base is depriciated";
183 $user = lc ( $cgi->var('REMOTE_USER') );
184 } elsif ( $cgi && $cgi->isa('CGI') && defined $cgi->remote_user ) {
185 $user = lc ( $cgi->remote_user );
186 } elsif ( $cgi && $cgi->isa('Apache') ) {
187 $user = lc ( $cgi->connection->user );
189 die "fatal: Can't get REMOTE_USER! for cgi $cgi - you need to setup ".
190 "Apache user authentication as documented in htdocs/docs/config.html";
197 Returns true if effective UID is that of the freeside user.
202 ( $> == $freeside_uid );
207 Returns true if the real UID is that of the freeside user.
212 ( $< == $freeside_uid );
217 Swaps real and effective UIDs.
222 ($<,$>) = ($>,$<) if $< != $>;
225 =item getsecrets [ USER ]
227 Sets the user to USER, if supplied.
228 Sets and returns the DBI datasource, username and password for this user from
229 the `/usr/local/etc/freeside/mapsecrets' file.
234 my($setuser) = shift;
235 $user = $setuser if $setuser;
236 die "No user!" unless $user;
237 my($conf) = new FS::Conf $conf_dir;
238 my($line) = grep /^\s*$user\s/, $conf->config('mapsecrets');
239 die "User not found in mapsecrets!" unless $line;
240 $line =~ /^\s*$user\s+(.*)$/;
242 die "Illegal mapsecrets line for user?!" unless $secrets;
243 ($datasrc, $db_user, $db_pass) = $conf->config($secrets)
244 or die "Can't get secrets: $!";
245 $FS::Conf::default_dir = $conf_dir. "/conf.$datasrc";
247 ($datasrc, $db_user, $db_pass);
254 Warning: this interface is likely to change in future releases.
256 A package can install a callback to be run in adminsuidsetup by putting a
257 coderef into the hash %FS::UID::callback :
259 $coderef = sub { warn "Hi, I'm returning your call!" };
260 $FS::UID::callback{'Package::Name'};
264 $Id: UID.pm,v 1.7 2001-06-21 16:27:52 ivan Exp $
268 Too many package-global variables.
272 No capabilities yet. When mod_perl and Authen::DBI are implemented,
273 cgisuidsetup will go away as well.
275 Goes through contortions to support non-OO syntax with multiple datasrc's.
277 Callbacks are inelegant.
281 L<FS::Record>, L<CGI>, L<DBI>, config.html from the base documentation.