X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FUser.pm;h=8e60b8d0be9e10f2609d0387105526f2112daa73;hb=dbfa733e42a95481ab6231334321c6a82ce68064;hp=93c88834e0f6e97bb200126c4e96dfe5504b3fba;hpb=a200453a04fc89fdf02dbe39e1d951cb1b55191c;p=kivitendo-erp.git diff --git a/SL/User.pm b/SL/User.pm index 93c88834e..8e60b8d0b 100644 --- a/SL/User.pm +++ b/SL/User.pm @@ -40,6 +40,7 @@ use Fcntl qw(:seek); use SL::DBUpgrade2; use SL::DBUtils; use SL::Iconv; +use SL::Inifile; sub new { $main::lxdebug->enter_sub(); @@ -48,6 +49,10 @@ sub new { my $self = {}; if ($login ne "") { + local *MEMBER; + + $login =~ s|.*/||; + &error("", "$memfile locked!") if (-f "${memfile}.LCK"); open(MEMBER, "$memfile") or &error("", "$memfile : $!"); @@ -55,8 +60,8 @@ sub new { while () { if (/^\[$login\]/) { while () { - last if /^\[/; - next if /^(#|\s)/; + last if m/^\[/; + next if m/^(#|\s)/; # remove comments s/\s#.*//g; @@ -88,6 +93,8 @@ sub new { sub country_codes { $main::lxdebug->enter_sub(); + local *DIR; + my %cc = (); my @language = (); @@ -116,6 +123,8 @@ sub login { my ($self, $form, $userspath) = @_; + local *FH; + my $rc = -3; if ($self->{login}) { @@ -134,7 +143,7 @@ sub login { } unless (-e "$userspath/$self->{login}.conf") { - $self->create_config("$userspath/$self->{login}.conf"); + $self->create_config(); } do "$userspath/$self->{login}.conf"; @@ -207,6 +216,8 @@ sub login { $self->dbupdate($form); $self->dbupdate2($form, $controls); + close(FH); + # remove lock file unlink("$userspath/nologin"); @@ -616,6 +627,8 @@ sub dbsources_unused { my ($self, $form, $memfile) = @_; + local *FH; + my @dbexcl = (); my @dbsources = (); @@ -654,84 +667,43 @@ sub dbneedsupdate { my ($self, $form) = @_; - my %dbsources = (); - my $query; - - $form->{sid} = $form->{dbdefault}; - &dbconnect_vars($form, $form->{dbdefault}); - - my $dbh = - DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) - or $form->dberror; - - if ($form->{dbdriver} eq 'Pg') { + my $members = Inifile->new($main::memberfile); + my $controls = parse_dbupdate_controls($form, $form->{dbdriver}); - $query = - qq|SELECT d.datname FROM pg_database d, pg_user u | . - qq|WHERE d.datdba = u.usesysid AND u.usename = ?|; - my $sth = prepare_execute_query($form, $dbh, $query, $form->{dbuser}); + my ($query, $sth, %dbs_needing_updates); - while (my ($db) = $sth->fetchrow_array) { + foreach my $login (grep /[a-z]/, keys %{ $members }) { + my $member = $members->{$login}; - next if ($db =~ /^template/); + map { $form->{$_} = $member->{$_} } qw(dbname dbuser dbpasswd dbhost dbport); + dbconnect_vars($form, $form->{dbname}); + $main::lxdebug->dump(0, "form", $form); + my $dbh = DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}); - &dbconnect_vars($form, $db); + next unless $dbh; - my $dbh2 = - DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) - or $form->dberror; + my $version; - $query = - qq|SELECT tablename FROM pg_tables | . - qq|WHERE tablename = 'defaults'|; - my $sth2 = prepare_execute_query($form, $dbh, $query); - - if ($sth2->fetchrow_array) { - $query = qq|SELECT version FROM defaults|; - my ($version) = selectrow_query($form, $dbh2, $query); - $dbsources{$db} = $version; - } - $sth2->finish; - $dbh2->disconnect; + $query = qq|SELECT version FROM defaults|; + $sth = prepare_query($form, $dbh, $query); + if ($sth->execute()) { + ($version) = $sth->fetchrow_array(); } - $sth->finish; - } - - if ($form->{dbdriver} eq 'Oracle') { - $query = - qq|SELECT owner FROM dba_objects |. - qq|WHERE object_name = 'DEFAULTS' AND object_type = 'TABLE'|; - - $sth = $dbh->prepare($query); - $sth->execute || $form->dberror($query); - - while (my ($db) = $sth->fetchrow_array) { - - $form->{dbuser} = $db; - &dbconnect_vars($form, $db); - - my $dbh = - DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) - or $form->dberror; + $sth->finish(); + $dbh->disconnect(); - $query = qq|SELECT version FROM defaults|; - my $sth = $dbh->prepare($query); - $sth->execute; + next unless $version; - if (my ($version) = $sth->fetchrow_array) { - $dbsources{$db} = $version; - } - $sth->finish; - $dbh->disconnect; + if (update_available($form->{dbdriver}, $version) || update2_available($form, $controls)) { + my $dbinfo = {}; + map { $dbinfo->{$_} = $member->{$_} } grep /^db/, keys %{ $member }; + $dbs_needing_updates{$member->{dbhost} . "::" . $member->{dbname}} = $dbinfo; } - $sth->finish; } - $dbh->disconnect; - $main::lxdebug->leave_sub(); - return %dbsources; + return values %dbs_needing_updates; } sub calc_version { @@ -779,12 +751,11 @@ sub cmp_script_version { sub update_available { my ($dbdriver, $cur_version) = @_; - opendir(SQLDIR, "sql/${dbdriver}-upgrade") - or &error("", "sql/${dbdriver}-upgrade: $!"); - my @upgradescripts = - grep(/$form->{dbdriver}-upgrade-\Q$cur_version\E.*\.(sql|pl)$/, - readdir(SQLDIR)); - closedir(SQLDIR); + local *SQLDIR; + + opendir SQLDIR, "sql/${dbdriver}-upgrade" || error("", "sql/${dbdriver}-upgrade: $!"); + my @upgradescripts = grep /${dbdriver}-upgrade-\Q$cur_version\E.*\.(sql|pl)$/, readdir SQLDIR; + closedir SQLDIR; return ($#upgradescripts > -1); } @@ -814,6 +785,8 @@ sub dbupdate { my ($self, $form) = @_; + local *SQLDIR; + $form->{sid} = $form->{dbdefault}; my @upgradescripts = (); @@ -857,7 +830,7 @@ sub dbupdate { foreach my $upgradescript (@upgradescripts) { my $a = $upgradescript; - $a =~ s/^$form->{dbdriver}-upgrade-|\.(sql|pl)$//g; + $a =~ s/^\Q$form->{dbdriver}\E-upgrade-|\.(sql|pl)$//g; my $file_type = $1; my ($mindb, $maxdb) = split /-/, $a; @@ -924,6 +897,8 @@ sub dbupdate2 { map({ $_->{"applied"} = 0; } @upgradescripts); + $self->create_schema_info_table($form, $dbh); + $query = qq|SELECT tag FROM schema_info|; $sth = $dbh->prepare($query); $sth->execute() || $form->dberror($query); @@ -991,9 +966,10 @@ sub update2_available { $query = qq|SELECT tag FROM schema_info|; $sth = $dbh->prepare($query); - $sth->execute() || $form->dberror($query); - while (($tag) = $sth->fetchrow_array()) { - $controls->{$tag}->{"applied"} = 1 if (defined($controls->{$tag})); + if ($sth->execute()) { + while (($tag) = $sth->fetchrow_array()) { + $controls->{$tag}->{"applied"} = 1 if (defined($controls->{$tag})); + } } $sth->finish(); $dbh->disconnect(); @@ -1008,11 +984,15 @@ sub update2_available { sub create_config { $main::lxdebug->enter_sub(); - my ($self, $filename) = @_; + my ($self) = @_; + + local *CONF; + + @config = config_vars(); - @config = &config_vars; + my $userspath = $main::userspath; - open(CONF, ">$filename") or $self->error("$filename : $!"); + open(CONF, ">", "$userspath/$self->{login}.conf") || $self->error("$userspath/$self->{login}.conf : $!"); # create the config file print CONF qq|# configuration file for $self->{login} @@ -1020,7 +1000,7 @@ sub create_config { \%myconfig = ( |; - foreach $key (sort @config) { + foreach my $key (sort @config) { $self->{$key} =~ s/\'/\\\'/g; print CONF qq| $key => '$self->{$key}',\n|; } @@ -1037,6 +1017,8 @@ sub save_member { my ($self, $memberfile, $userspath) = @_; + local (*FH, *CONF); + my $newmember = 1; # format dbconnect and dboptions string @@ -1054,7 +1036,7 @@ sub save_member { truncate(CONF, 0); while ($line = shift @config) { - if ($line =~ /^\[$self->{login}\]/) { + if ($line =~ /^\[\Q$self->{login}\E\]/) { $newmember = 0; last; } @@ -1110,8 +1092,7 @@ sub save_member { unlink "${memberfile}.LCK"; # create conf file - $self->create_config("$userspath/$self->{login}.conf") - unless $self->{'root login'}; + $self->create_config() unless $self->{'root login'}; $main::lxdebug->leave_sub(); } @@ -1137,6 +1118,8 @@ sub error { my ($self, $msg) = @_; + $main::lxdebug->show_backtrace(); + if ($ENV{HTTP_USER_AGENT}) { print qq|Content-Type: text/html