X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2FUID.pm;h=31c2887d3dbd7312048527273c2f7620394dc84c;hp=83b652b0f7acf641222a1f1b3a574f7240e1752f;hb=9b37fb82c94a480ef6af2f7b9a8b889d4381e703;hpb=7279a60bfb12751895e06dfa4bad60e32a7d7376 diff --git a/FS/FS/UID.pm b/FS/FS/UID.pm index 83b652b0f..31c2887d3 100644 --- a/FS/FS/UID.pm +++ b/FS/FS/UID.pm @@ -2,27 +2,35 @@ package FS::UID; use strict; use vars qw( - @ISA @EXPORT_OK $cgi $dbh $freeside_uid $user - $conf_dir $secrets $datasrc $db_user $db_pass %callback @callback - $driver_name $AutoCommit + @ISA @EXPORT_OK $DEBUG $me $cgi $freeside_uid $user $conf_dir $cache_dir + $secrets $datasrc $db_user $db_pass $schema $dbh $driver_name + $AutoCommit %callback @callback $callback_hack $use_confcompat ); use subs qw( getsecrets cgisetotaker ); use Exporter; -use Carp qw(carp croak cluck); +use Carp qw(carp croak cluck confess); use DBI; -use FS::Conf; +use IO::File; +use FS::CurrentUser; @ISA = qw(Exporter); @EXPORT_OK = qw(checkeuid checkruid cgisuidsetup adminsuidsetup forksuidsetup - getotaker dbh datasrc getsecrets driver_name myconnect ); + getotaker dbh datasrc getsecrets driver_name myconnect + use_confcompat); + +$DEBUG = 0; +$me = '[FS::UID]'; $freeside_uid = scalar(getpwnam('freeside')); -$conf_dir = "/usr/local/etc/freeside/"; +$conf_dir = "%%%FREESIDE_CONF%%%"; +$cache_dir = "%%%FREESIDE_CACHE%%%"; $AutoCommit = 1; #ours, not DBI +$use_confcompat = 1; +$callback_hack = 0; =head1 NAME @@ -71,10 +79,17 @@ sub adminsuidsetup { sub forksuidsetup { $user = shift; - croak "fatal: adminsuidsetup called without arguements" unless $user; + my $olduser = $user; + warn "$me forksuidsetup starting for $user\n" if $DEBUG; + + if ( $FS::CurrentUser::upgrade_hack ) { + $user = 'fs_bootstrap'; + } else { + croak "fatal: adminsuidsetup called without arguements" unless $user; - $user =~ /^([\w\-\.]+)$/ or croak "fatal: illegal user $user"; - $user = $1; + $user =~ /^([\w\-\.]+)$/ or croak "fatal: illegal user $user"; + $user = $1; + } $ENV{'PATH'} ='/usr/local/bin:/usr/bin:/usr/ucb:/bin'; $ENV{'SHELL'} = '/bin/sh'; @@ -83,23 +98,78 @@ sub forksuidsetup { $ENV{'ENV'} = ''; $ENV{'BASH_ENV'} = ''; - croak "Not running uid freeside!" unless checkeuid(); + croak "Not running uid freeside (\$>=$>, \$<=$<)\n" unless checkeuid(); + + warn "$me forksuidsetup connecting to database\n" if $DEBUG; + if ( $FS::CurrentUser::upgrade_hack && $olduser ) { + $dbh = &myconnect($olduser); + } else { + $dbh = &myconnect(); + } + warn "$me forksuidsetup connected to database with handle $dbh\n" if $DEBUG; + + warn "$me forksuidsetup loading schema\n" if $DEBUG; + use FS::Schema qw(reload_dbdef dbdef); + reload_dbdef("$conf_dir/dbdef.$datasrc") + unless $FS::Schema::setup_hack; - $dbh = &myconnect; + warn "$me forksuidsetup deciding upon config system to use\n" if $DEBUG; - foreach ( keys %callback ) { - &{$callback{$_}}; - # breaks multi-database installs # delete $callback{$_}; #run once + if ( ! $FS::Schema::setup_hack && dbdef->table('conf') ) { + + my $sth = $dbh->prepare("SELECT COUNT(*) FROM conf") or die $dbh->errstr; + $sth->execute or die $sth->errstr; + my $confcount = $sth->fetchrow_arrayref->[0]; + + if ($confcount) { + $use_confcompat = 0; + }else{ + die "NO CONFIGURATION RECORDS FOUND"; + } + + } else { + die "NO CONFIGURATION TABLE FOUND" unless $FS::Schema::setup_hack; + } + + unless ( $callback_hack ) { + warn "$me calling callbacks\n" if $DEBUG; + foreach ( keys %callback ) { + &{$callback{$_}}; + # breaks multi-database installs # delete $callback{$_}; #run once + } + + &{$_} foreach @callback; + } else { + warn "$me skipping callbacks (callback_hack set)\n" if $DEBUG; } - &{$_} foreach @callback; + warn "$me forksuidsetup loading user\n" if $DEBUG; + FS::CurrentUser->load_user($user); $dbh; } sub myconnect { - DBI->connect( getsecrets, {'AutoCommit' => 0, 'ChopBlanks' => 1, } ) + my $handle = DBI->connect( getsecrets(@_), { 'AutoCommit' => 0, + 'ChopBlanks' => 1, + 'ShowErrorStatement' => 1, + 'pg_enable_utf8' => 1, + #'mysql_enable_utf8' => 1, + } + ) or die "DBI->connect error: $DBI::errstr\n"; + + if ( $schema ) { + use DBIx::DBSchema::_util qw(_load_driver ); #quelle hack + my $driver = _load_driver($handle); + if ( $driver =~ /^Pg/ ) { + no warnings 'redefine'; + eval "sub DBIx::DBSchema::DBD::${driver}::default_db_schema {'$schema'}"; + die $@ if $@; + } + } + + $handle; } =item install_callback @@ -230,6 +300,7 @@ Returns true if effective UID is that of the freeside user. =cut sub checkeuid { + #$> = $freeside_uid unless $>; #huh. mpm-itk hack ( $> == $freeside_uid ); } @@ -254,20 +325,38 @@ the `/usr/local/etc/freeside/mapsecrets' file. sub getsecrets { my($setuser) = shift; $user = $setuser if $setuser; - die "No user!" unless $user; - my($conf) = new FS::Conf $conf_dir; - my($line) = grep /^\s*$user\s/, $conf->config('mapsecrets'); - die "User $user not found in mapsecrets!" unless $line; - $line =~ /^\s*$user\s+(.*)$/; - $secrets = $1; - die "Illegal mapsecrets line for user?!" unless $secrets; - ($datasrc, $db_user, $db_pass) = $conf->config($secrets) - or die "Can't get secrets: $secrets: $!\n"; - $FS::Conf::default_dir = $conf_dir. "/conf.$datasrc"; + + if ( -e "$conf_dir/mapsecrets" ) { + die "No user!" unless $user; + my($line) = grep /^\s*($user|\*)\s/, + map { /^(.*)$/; $1 } readline(new IO::File "$conf_dir/mapsecrets"); + confess "User $user not found in mapsecrets!" unless $line; + $line =~ /^\s*($user|\*)\s+(.*)$/; + $secrets = $2; + die "Illegal mapsecrets line for user?!" unless $secrets; + } else { + # no mapsecrets file at all, so do the default thing + $secrets = 'secrets'; + } + + ($datasrc, $db_user, $db_pass, $schema) = + map { /^(.*)$/; $1 } readline(new IO::File "$conf_dir/$secrets") + or die "Can't get secrets: $conf_dir/$secrets: $!\n"; undef $driver_name; + ($datasrc, $db_user, $db_pass); } +=item use_confcompat + +Returns true whenever we should use 1.7 configuration compatibility. + +=cut + +sub use_confcompat { + $use_confcompat; +} + =back =head1 CALLBACKS