X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FUser.pm;h=62bc94f6d6b71290d82a9dbfaa6248359580937b;hb=5e49b259ece6c5e4aa80e9c775a894972a139547;hp=c35ff0e9122b5715f7f5db4c00b6ca0f91d70b1f;hpb=c12ec0016cd30952749282401998b37474dafdd1;p=kivitendo-erp.git diff --git a/SL/User.pm b/SL/User.pm index c35ff0e91..62bc94f6d 100644 --- a/SL/User.pm +++ b/SL/User.pm @@ -57,7 +57,7 @@ sub new { # remove any trailing whitespace s/^\s*(.*?)\s*$/$1/; - ($key, $value) = split /=/, $_, 2; + ($key, $value) = split(/=/, $_, 2); if (($key eq "stylesheet") && ($value eq "sql-ledger.css")) { $value = "lx-office-erp.css"; @@ -114,8 +114,12 @@ sub login { if ($self->{login}) { if ($self->{password}) { - $form->{password} = crypt $form->{password}, - substr($self->{login}, 0, 2); + if ($form->{hashed_password}) { + $form->{password} = $form->{hashed_password}; + } else { + $form->{password} = crypt($form->{password}, + substr($self->{login}, 0, 2)); + } if ($self->{password} ne $form->{password}) { $main::lxdebug->leave_sub(); return -1; @@ -162,19 +166,23 @@ sub login { $rc = 0; - if (&update_available($dbversion)) { + if (&update_available($myconfig{"dbdriver"}, $dbversion)) { # update the tables open FH, ">$userspath/nologin" or die " $!"; map { $form->{$_} = $myconfig{$_} } - qw(dbname dbhost dbport dbdriver dbuser dbpasswd); + qw(dbname dbhost dbport dbdriver dbuser dbpasswd dbconnect); $form->{dbupdate} = "db$myconfig{dbname}"; $form->{ $form->{dbupdate} } = 1; - $form->info("Upgrading Dataset $myconfig{dbname} ..."); + $form->{"stylesheet"} = "lx-office-erp.css"; + $form->{"title"} = $main::locale->text("Dataset upgrade"); + $form->header(); + print($form->parse_html_template("dbupgrade/header", + { "dbname" => $myconfig{dbname} })); # required for Oracle $form->{dbdefault} = $sid; @@ -188,7 +196,7 @@ $!"; # remove lock file unlink "$userspath/nologin"; - $form->info("... done"); + print($form->parse_html_template("dbupgrade/footer")); $rc = -2; @@ -272,7 +280,7 @@ sub dbsources { if ($form->{dbdriver} eq 'Pg') { - $query = qq|SELECT datname FROM pg_database|; + $query = qq|SELECT datname FROM pg_database WHERE NOT ((datname = 'template0') OR (datname = 'template1'))|; $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); @@ -380,16 +388,64 @@ sub dbcreate { $filename = qq|sql/$form->{chart}-chart.sql|; $self->process_query($form, $dbh, $filename); - # create indices - # Indices sind auch in lx-office.sql - # $filename = qq|sql/$form->{dbdriver}-indices.sql|; - # $self->process_query($form, $dbh, $filename); + $query = "UPDATE defaults SET coa = " . $dbh->quote($form->{"chart"}); + $dbh->do($query) || $form->dberror($query); $dbh->disconnect; $main::lxdebug->leave_sub(); } +# Process a Perl script which updates the database. +# If the script returns 1 then the update was successful. +# Return code "2" means "needs more interaction; remove +# users/nologin and exit". +# All other return codes are fatal errors. +sub process_perl_script { + $main::lxdebug->enter_sub(); + + my ($self, $form, $dbh, $filename, $version) = @_; + + open(FH, "$filename") or $form->error("$filename : $!\n"); + my $contents = join("", ); + close(FH); + + $dbh->begin_work(); + + my %dbup_myconfig = (); + map({ $dbup_myconfig{$_} = $form->{$_}; } + qw(dbname dbuser dbpasswd dbhost dbport dbconnect)); + + my $nls_file = $filename; + $nls_file =~ s|.*/||; + $nls_file =~ s|.pl$||; + my $dbup_locale = Locale->new($main::language, $nls_file); + + my $result = eval($contents); + + if (1 != $result) { + $dbh->rollback(); + $dbh->disconnect(); + } + + if (!defined($result)) { + print($form->parse_html_template("dbupgrade/error", + { "file" => $filename, + "error" => $@ })); + exit(0); + } elsif (1 != $result) { + unlink("users/nologin") if (2 == $result); + exit(0); + } + + if ($version) { + $dbh->do("UPDATE defaults SET version = " . $dbh->quote($version)); + } + $dbh->commit(); + + $main::lxdebug->leave_sub(); +} + sub process_query { $main::lxdebug->enter_sub(); @@ -407,10 +463,10 @@ sub process_query { while () { # Remove DOS and Unix style line endings. - s/[\r\n]//g; + chomp; - # don't add comments or empty lines - next if /^(--.*|\s+)$/; + # remove comments + s/--.*$//; for (my $i = 0; $i < length($_); $i++) { my $char = substr($_, $i, 1); @@ -496,7 +552,7 @@ sub dbsources_unused { while () { if (/^dbname=/) { - my ($null, $item) = split /=/; + my ($null, $item) = split(/=/); push @dbexcl, $item; } } @@ -612,7 +668,7 @@ sub dbneedsupdate { ## LINET sub calc_version { - $main::lxdebug->enter_sub(); + $main::lxdebug->enter_sub(2); my (@v, $version, $i); @@ -626,7 +682,7 @@ sub calc_version { $version += $v[$i]; } - $main::lxdebug->leave_sub(); + $main::lxdebug->leave_sub(2); return $version; } @@ -655,13 +711,14 @@ sub cmp_script_version { ## /LINET sub update_available { - ($cur_version) = @_; - opendir SQLDIR, "sql/." or &error("", "$!"); - my @upgradescripts = - grep(/$form->{dbdriver}-upgrade-$cur_version.*\.sql/, readdir(SQLDIR)); - closedir SQLDIR; - - return ($#upgradescripts > -1); + 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; + + return ($#upgradescripts > -1); } sub dbupdate { @@ -678,11 +735,11 @@ sub dbupdate { if ($form->{dbupdate}) { # read update scripts into memory - opendir SQLDIR, "sql/." or &error("", "$!"); + opendir SQLDIR, "sql/" . $form->{dbdriver} . "-upgrade" or &error("", "sql/" . $form->{dbdriver} . "-upgrade : $!"); ## LINET @upgradescripts = sort(cmp_script_version - grep(/$form->{dbdriver}-upgrade-.*?\.sql$/, readdir(SQLDIR))); + grep(/$form->{dbdriver}-upgrade-.*?\.(sql|pl)$/, readdir(SQLDIR))); ## /LINET closedir SQLDIR; } @@ -717,7 +774,8 @@ sub dbupdate { foreach my $upgradescript (@upgradescripts) { my $a = $upgradescript; - $a =~ s/^$form->{dbdriver}-upgrade-|\.sql$//g; + $a =~ s/^$form->{dbdriver}-upgrade-|\.(sql|pl)$//g; + my $file_type = $1; my ($mindb, $maxdb) = split /-/, $a; my $str_maxdb = $maxdb; @@ -732,7 +790,12 @@ sub dbupdate { last if ($version < $mindb); # apply upgrade - $self->process_query($form, $dbh, "sql/$upgradescript", $str_maxdb); + $main::lxdebug->message(DEBUG2, "Appliying Update $upgradescript"); + if ($file_type eq "sql") { + $self->process_query($form, $dbh, "sql/" . $form->{"dbdriver"} . "-upgrade/$upgradescript", $str_maxdb); + } else { + $self->process_perl_script($form, $dbh, "sql/" . $form->{"dbdriver"} . "-upgrade/$upgradescript", $str_maxdb); + } $version = $maxdb;