X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FUser.pm;h=368a0a278ef869b75fc6f999c5bb1db64ab48742;hb=56f7991d4910ae12c7d16aab025a2ab242ca5eeb;hp=13bde36ec128cfeca0d0063744b7cfe0f5b7f8af;hpb=f559ec45ea2fc09c361ef7e4a40a59b1f2133737;p=kivitendo-erp.git diff --git a/SL/User.pm b/SL/User.pm index 13bde36ec..368a0a278 100644 --- a/SL/User.pm +++ b/SL/User.pm @@ -37,56 +37,29 @@ package User; use IO::File; use Fcntl qw(:seek); +#use SL::Auth; +use SL::DBConnect; use SL::DBUpgrade2; use SL::DBUtils; use SL::Iconv; use SL::Inifile; +use strict; + sub new { $main::lxdebug->enter_sub(); - my ($type, $memfile, $login) = @_; - my $self = {}; - - if ($login ne "") { - local *MEMBER; - - $login =~ s|.*/||; - - &error("", "$memfile locked!") if (-f "${memfile}.LCK"); - - open(MEMBER, "$memfile") or &error("", "$memfile : $!"); - - while () { - if (/^\[$login\]/) { - while () { - last if m/^\[/; - next if m/^(#|\s)/; - - # remove comments - s/\s#.*//g; - - # remove any trailing whitespace - s/^\s*(.*?)\s*$/$1/; - - ($key, $value) = split(/=/, $_, 2); - - if (($key eq "stylesheet") && ($value eq "sql-ledger.css")) { - $value = "lx-office-erp.css"; - } - - $self->{$key} = $value; - } + my ($type, %params) = @_; - $self->{login} = $login; + my $self = {}; - last; - } - } - close MEMBER; + if ($params{id} || $params{login}) { + my %user_data = $main::auth->read_user(%params); + map { $self->{$_} = $user_data{$_} } keys %user_data; } $main::lxdebug->leave_sub(); + bless $self, $type; } @@ -104,9 +77,9 @@ sub country_codes { my @dir = grep(!/(^\.\.?$|\..*)/, readdir(DIR)); foreach my $dir (@dir) { - next unless open(FH, "locale/$dir/LANGUAGE"); - @language = ; - close FH; + next unless open(my $fh, '<:encoding(UTF-8)', "locale/$dir/LANGUAGE"); + @language = <$fh>; + close $fh; $cc{$dir} = "@language"; } @@ -121,39 +94,19 @@ sub country_codes { sub login { $main::lxdebug->enter_sub(); - my ($self, $form, $userspath) = @_; + my ($self, $form) = @_; + our $sid; local *FH; my $rc = -3; if ($self->{login}) { - - if ($self->{password}) { - 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; - } - } - - unless (-e "$userspath/$self->{login}.conf") { - $self->create_config(); - } - - do "$userspath/$self->{login}.conf"; - $myconfig{dbpasswd} = unpack('u', $myconfig{dbpasswd}); + my %myconfig = $main::auth->read_user(login => $self->{login}); # check if database is down - my $dbh = - DBI->connect($myconfig{dbconnect}, $myconfig{dbuser}, - $myconfig{dbpasswd}) - or $self->error(DBI::errstr); + my $dbh = SL::DBConnect->connect($myconfig{dbconnect}, $myconfig{dbuser}, $myconfig{dbpasswd}) + or $self->error($DBI::errstr); # we got a connection, check the version my $query = qq|SELECT version FROM defaults|; @@ -163,48 +116,45 @@ sub login { my ($dbversion) = $sth->fetchrow_array; $sth->finish; - # add login to employee table if it does not exist - # no error check for employee table, ignore if it does not exist - $query = qq|SELECT id FROM employee WHERE login = ?|; - my ($login) = selectrow_query($form, $dbh, $query, $self->{login}); - - if (!$login) { - $query = qq|INSERT INTO employee (login, name, workphone, role)| . - qq|VALUES (?, ?, ?, ?)|; - my @values = ($self->{login}, $myconfig{name}, $myconfig{tel}, "user"); - do_query($form, $dbh, $query, @values); - } + $self->create_employee_entry($form, $dbh, \%myconfig); $self->create_schema_info_table($form, $dbh); - $dbh->disconnect; + my $dbupdater_auth = SL::DBUpgrade2->new(form => $form, dbdriver => 'Pg', auth => 1)->parse_dbupdate_controls; + if ($dbupdater_auth->unapplied_upgrade_scripts($::auth->dbconnect)) { + $::lxdebug->leave_sub; + return -3; + } $rc = 0; - my $controls = - parse_dbupdate_controls($form, $myconfig{"dbdriver"}); - - map({ $form->{$_} = $myconfig{$_} } - qw(dbname dbhost dbport dbdriver dbuser dbpasswd dbconnect)); + my $dbupdater = SL::DBUpgrade2->new(form => $form, dbdriver => $myconfig{dbdriver})->parse_dbupdate_controls; - if (update_available($myconfig{"dbdriver"}, $dbversion) || - update2_available($form, $controls)) { + map({ $form->{$_} = $myconfig{$_} } qw(dbname dbhost dbport dbdriver dbuser dbpasswd dbconnect dateformat)); + dbconnect_vars($form, $form->{dbname}); + my $update_available = $dbupdater->update_available($dbversion) || $dbupdater->update2_available($dbh); + $dbh->disconnect; - $form->{"stylesheet"} = "lx-office-erp.css"; + if ($update_available) { $form->{"title"} = $main::locale->text("Dataset upgrade"); $form->header(); - print($form->parse_html_template2("dbupgrade/header")); + print $form->parse_html_template("dbupgrade/header"); $form->{dbupdate} = "db$myconfig{dbname}"; $form->{ $form->{dbupdate} } = 1; if ($form->{"show_dbupdate_warning"}) { - print($form->parse_html_template2("dbupgrade/warning")); - exit(0); + print $form->parse_html_template("dbupgrade/warning"); + ::end_of_request(); } # update the tables - open(FH, ">$userspath/nologin") or die("$!"); + if (!$::lx_office_conf{debug}->{keep_installation_unlocked} && !open(FH, ">", $::lx_office_conf{paths}->{userspath} . "/nologin")) { + $form->show_generic_error($main::locale->text('A temporary file could not be created. ' . + 'Please verify that the directory "#1" is writeable by the webserver.', + $::lx_office_conf{paths}->{userspath}), + 'back_button' => 1); + } # required for Oracle $form->{dbdefault} = $sid; @@ -214,24 +164,17 @@ sub login { $SIG{QUIT} = 'IGNORE'; $self->dbupdate($form); - $self->dbupdate2($form, $controls); + $self->dbupdate2($form, $dbupdater); + SL::DBUpgrade2->new(form => $::form, dbdriver => 'Pg', auth => 1)->apply_admin_dbupgrade_scripts(0); close(FH); # remove lock file - unlink("$userspath/nologin"); + unlink($::lx_office_conf{paths}->{userspath} . "/nologin"); - my $menufile = - $self->{"menustyle"} eq "v3" ? "menuv3.pl" : - $self->{"menustyle"} eq "neu" ? "menunew.pl" : - $self->{"menustyle"} eq "xml" ? "menuXML.pl" : - "menu.pl"; - - print($form->parse_html_template2("dbupgrade/footer", - { "menufile" => $menufile })); + print $form->parse_html_template("dbupgrade/footer"); $rc = -2; - } } @@ -249,18 +192,14 @@ sub dbconnect_vars { 'Pg' => { 'yy-mm-dd' => 'set DateStyle to \'ISO\'', 'yyyy-mm-dd' => 'set DateStyle to \'ISO\'', 'mm/dd/yy' => 'set DateStyle to \'SQL, US\'', - 'mm-dd-yy' => 'set DateStyle to \'POSTGRES, US\'', 'dd/mm/yy' => 'set DateStyle to \'SQL, EUROPEAN\'', - 'dd-mm-yy' => 'set DateStyle to \'POSTGRES, EUROPEAN\'', 'dd.mm.yy' => 'set DateStyle to \'GERMAN\'' }, 'Oracle' => { 'yy-mm-dd' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'YY-MM-DD\'', 'yyyy-mm-dd' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'YYYY-MM-DD\'', 'mm/dd/yy' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'MM/DD/YY\'', - 'mm-dd-yy' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'MM-DD-YY\'', 'dd/mm/yy' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'DD/MM/YY\'', - 'dd-mm-yy' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'DD-MM-YY\'', 'dd.mm.yy' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'DD.MM.YY\'', }); @@ -306,8 +245,7 @@ sub dbsources { $form->{sid} = $form->{dbdefault}; &dbconnect_vars($form, $form->{dbdefault}); - my $dbh = - DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) + my $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) or $form->dberror; if ($form->{dbdriver} eq 'Pg') { @@ -324,8 +262,7 @@ sub dbsources { next if ($db =~ /^template/); &dbconnect_vars($form, $db); - my $dbh = - DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) + my $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) or $form->dberror; $query = @@ -371,6 +308,25 @@ sub dbsources { return @dbsources; } +sub dbclusterencoding { + $main::lxdebug->enter_sub(); + + my ($self, $form) = @_; + + $form->{dbdefault} ||= $form->{dbuser}; + + dbconnect_vars($form, $form->{dbdefault}); + + my $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) || $form->dberror(); + my $query = qq|SELECT pg_encoding_to_char(encoding) FROM pg_database WHERE datname = 'template0'|; + my ($cluster_encoding) = $dbh->selectrow_array($query); + $dbh->disconnect(); + + $main::lxdebug->leave_sub(); + + return $cluster_encoding; +} + sub dbcreate { $main::lxdebug->enter_sub(); @@ -379,7 +335,7 @@ sub dbcreate { $form->{sid} = $form->{dbdefault}; &dbconnect_vars($form, $form->{dbdefault}); my $dbh = - DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) + SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) or $form->dberror; $form->{db} =~ s/\"//g; my %dbcreate = ( @@ -404,7 +360,8 @@ sub dbcreate { my $query = $dbcreate{$form->{dbdriver}}; $query .= " WITH " . join(" ", @{$dboptions{"Pg"}}) if (@{$dboptions{"Pg"}}); - do_query($form, $dbh, $query); + # Ignore errors if the database exists. + $dbh->do($query); if ($form->{dbdriver} eq 'Oracle') { $query = qq|GRANT CONNECT, RESOURCE TO "$form->{db}"|; @@ -420,188 +377,33 @@ sub dbcreate { &dbconnect_vars($form, $form->{db}); - $dbh = DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) + $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) or $form->dberror; my $db_charset = $Common::db_encoding_to_charset{$form->{encoding}}; $db_charset ||= Common::DEFAULT_CHARSET; + my $dbupdater = SL::DBUpgrade2->new(form => $form, dbdriver => $form->{dbdriver}); # create the tables - $self->process_query($form, $dbh, "sql/lx-office.sql", undef, $db_charset); + $dbupdater->process_query($dbh, "sql/lx-office.sql", undef, $db_charset); # load chart of accounts - $self->process_query($form, $dbh, "sql/$form->{chart}-chart.sql", undef, $db_charset); + $dbupdater->process_query($dbh, "sql/$form->{chart}-chart.sql", undef, $db_charset); $query = "UPDATE defaults SET coa = ?"; do_query($form, $dbh, $query, $form->{chart}); + $query = "UPDATE defaults SET accounting_method = ?"; + do_query($form, $dbh, $query, $form->{accounting_method}); + $query = "UPDATE defaults SET profit_determination = ?"; + do_query($form, $dbh, $query, $form->{profit_determination}); + $query = "UPDATE defaults SET inventory_system = ?"; + do_query($form, $dbh, $query, $form->{inventory_system}); $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_or_control, $db_charset) = @_; - - my $fh = IO::File->new($filename, "r") or $form->error("$filename : $!\n"); - - my $file_charset = Common::DEFAULT_CHARSET; - - if (ref($version_or_control) eq "HASH") { - $file_charset = $version_or_control->{charset}; - - } else { - while (<$fh>) { - last if !/^--/; - next if !/^--\s*\@charset:\s*(.+)/; - $file_charset = $1; - last; - } - $fh->seek(0, SEEK_SET); - } - - my $contents = join "", <$fh>; - $fh->close(); - - $db_charset ||= Common::DEFAULT_CHARSET; - - my $iconv = SL::Iconv::get_converter($file_charset, $db_charset); - - $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_template2("dbupgrade/error", - { "file" => $filename, - "error" => $@ })); - exit(0); - } elsif (1 != $result) { - unlink("users/nologin") if (2 == $result); - exit(0); - } - - if (ref($version_or_control) eq "HASH") { - $dbh->do("INSERT INTO schema_info (tag, login) VALUES (" . - $dbh->quote($version_or_control->{"tag"}) . ", " . - $dbh->quote($form->{"login"}) . ")"); - } elsif ($version_or_control) { - $dbh->do("UPDATE defaults SET version = " . - $dbh->quote($version_or_control)); - } - $dbh->commit(); - - $main::lxdebug->leave_sub(); -} - -sub process_query { - $main::lxdebug->enter_sub(); - - my ($self, $form, $dbh, $filename, $version_or_control, $db_charset) = @_; - - my $fh = IO::File->new($filename, "r") or $form->error("$filename : $!\n"); - my $query = ""; - my $sth; - my @quote_chars; - - my $file_charset = Common::DEFAULT_CHARSET; - while (<$fh>) { - last if !/^--/; - next if !/^--\s*\@charset:\s*(.+)/; - $file_charset = $1; - last; - } - $fh->seek(0, SEEK_SET); - - $db_charset ||= Common::DEFAULT_CHARSET; - - $dbh->begin_work(); - - while (<$fh>) { - $_ = SL::Iconv::convert($file_charset, $db_charset, $_); - - # Remove DOS and Unix style line endings. - chomp; - - # remove comments - s/--.*$//; - - for (my $i = 0; $i < length($_); $i++) { - my $char = substr($_, $i, 1); - - # Are we inside a string? - if (@quote_chars) { - if ($char eq $quote_chars[-1]) { - pop(@quote_chars); - } - $query .= $char; - - } else { - if (($char eq "'") || ($char eq "\"")) { - push(@quote_chars, $char); - - } elsif ($char eq ";") { - - # Query is complete. Send it. - - $sth = $dbh->prepare($query); - if (!$sth->execute()) { - my $errstr = $dbh->errstr; - $sth->finish(); - $dbh->rollback(); - $form->dberror("The database update/creation did not succeed. " . - "The file ${filename} containing the following " . - "query failed:
${query}
" . - "The error message was: ${errstr}
" . - "All changes in that file have been reverted."); - } - $sth->finish(); - - $char = ""; - $query = ""; - } - - $query .= $char; - } - } - } - - if (ref($version_or_control) eq "HASH") { - $dbh->do("INSERT INTO schema_info (tag, login) VALUES (" . - $dbh->quote($version_or_control->{"tag"}) . ", " . - $dbh->quote($form->{"login"}) . ")"); - } elsif ($version_or_control) { - $dbh->do("UPDATE defaults SET version = " . - $dbh->quote($version_or_control)); - } - $dbh->commit(); - - $fh->close(); - - $main::lxdebug->leave_sub(); -} - sub dbdelete { $main::lxdebug->enter_sub(); @@ -612,8 +414,7 @@ sub dbdelete { $form->{sid} = $form->{dbdefault}; &dbconnect_vars($form, $form->{dbdefault}); - my $dbh = - DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) + my $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) or $form->dberror; my $query = $dbdelete{$form->{dbdriver}}; do_query($form, $dbh, $query); @@ -626,41 +427,21 @@ sub dbdelete { sub dbsources_unused { $main::lxdebug->enter_sub(); - my ($self, $form, $memfile) = @_; - - local *FH; - - my @dbexcl = (); - my @dbsources = (); - - $form->error('File locked!') if (-f "${memfile}.LCK"); - - # open members file - open(FH, "$memfile") or $form->error("$memfile : $!"); - - while () { - if (/^dbname=/) { - my ($null, $item) = split(/=/); - push @dbexcl, $item; - } - } - - close FH; + my ($self, $form) = @_; $form->{only_acc_db} = 1; - my @db = &dbsources("", $form); - push @dbexcl, $form->{dbdefault}; + my %members = $main::auth->read_all_users(); + my %dbexcl = map { $_ => 1 } grep { $_ } map { $_->{dbname} } values %members; - foreach $item (@db) { - unless (grep /$item$/, @dbexcl) { - push @dbsources, $item; - } - } + $dbexcl{$form->{dbdefault}} = 1; + $dbexcl{$main::auth->{DB_config}->{db}} = 1; + + my @dbunused = grep { !$dbexcl{$_} } dbsources("", $form); $main::lxdebug->leave_sub(); - return @dbsources; + return @dbunused; } sub dbneedsupdate { @@ -668,18 +449,18 @@ sub dbneedsupdate { my ($self, $form) = @_; - my $members = Inifile->new($main::memberfile); - my $controls = parse_dbupdate_controls($form, $form->{dbdriver}); + my %members = $main::auth->read_all_users(); + my $dbupdater = SL::DBUpgrade2->new(form => $form, dbdriver => $form->{dbdriver})->parse_dbupdate_controls; my ($query, $sth, %dbs_needing_updates); - foreach my $login (grep /[a-z]/, keys %{ $members }) { - my $member = $members->{$login}; + foreach my $login (grep /[a-z]/, keys %members) { + my $member = $members{$login}; 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}); + + my $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}); next unless $dbh; @@ -691,11 +472,13 @@ sub dbneedsupdate { ($version) = $sth->fetchrow_array(); } $sth->finish(); - $dbh->disconnect(); - next unless $version; + $dbh->disconnect and next unless $version; + + my $update_available = $dbupdater->update_available($version) || $dbupdater->update2_available($dbh); + $dbh->disconnect; - if (update_available($form->{dbdriver}, $version) || update2_available($form, $controls)) { + if ($update_available) { my $dbinfo = {}; map { $dbinfo->{$_} = $member->{$_} } grep /^db/, keys %{ $member }; $dbs_needing_updates{$member->{dbhost} . "::" . $member->{dbname}} = $dbinfo; @@ -735,8 +518,8 @@ sub cmp_script_version { $my_a =~ s/.sql$//; $my_b =~ s/.*-upgrade-//; $my_b =~ s/.sql$//; - ($my_a_from, $my_a_to) = split(/-/, $my_a); - ($my_b_from, $my_b_to) = split(/-/, $my_b); + my ($my_a_from, $my_a_to) = split(/-/, $my_a); + my ($my_b_from, $my_b_to) = split(/-/, $my_b); $res_a = calc_version($my_a_from); $res_b = calc_version($my_b_from); @@ -749,18 +532,6 @@ sub cmp_script_version { return $res_a <=> $res_b; } -sub update_available { - my ($dbdriver, $cur_version) = @_; - - 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); -} - sub create_schema_info_table { $main::lxdebug->enter_sub(); @@ -806,9 +577,11 @@ sub dbupdate { closedir(SQLDIR); } - my $db_charset = $main::dbcharset; + my $db_charset = $::lx_office_conf{system}->{dbcharset}; $db_charset ||= Common::DEFAULT_CHARSET; + my $dbupdater = SL::DBUpgrade2->new(form => $form, dbdriver => $form->{dbdriver}); + foreach my $db (split(/ /, $form->{dbupdate})) { next unless $form->{$db}; @@ -817,10 +590,11 @@ sub dbupdate { $db =~ s/^db//; &dbconnect_vars($form, $db); - my $dbh = - DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) + my $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) or $form->dberror; + $dbh->do($form->{dboptions}) if ($form->{dboptions}); + # check version $query = qq|SELECT version FROM defaults|; my ($version) = selectrow_query($form, $dbh, $query); @@ -832,7 +606,6 @@ sub dbupdate { foreach my $upgradescript (@upgradescripts) { my $a = $upgradescript; $a =~ s/^\Q$form->{dbdriver}\E-upgrade-|\.(sql|pl)$//g; - my $file_type = $1; my ($mindb, $maxdb) = split /-/, $a; my $str_maxdb = $maxdb; @@ -845,14 +618,8 @@ sub dbupdate { last if ($version < $mindb); # apply upgrade - $main::lxdebug->message(DEBUG2, "Applying Update $upgradescript"); - if ($file_type eq "sql") { - $self->process_query($form, $dbh, "sql/" . $form->{"dbdriver"} . - "-upgrade/$upgradescript", $str_maxdb, $db_charset); - } else { - $self->process_perl_script($form, $dbh, "sql/" . $form->{"dbdriver"} . - "-upgrade/$upgradescript", $str_maxdb, $db_charset); - } + $main::lxdebug->message(LXDebug->DEBUG2(), "Applying Update $upgradescript"); + $dbupdater->process_file($dbh, "sql/" . $form->{"dbdriver"} . "-upgrade/$upgradescript", $str_maxdb, $db_charset); $version = $maxdb; @@ -871,73 +638,38 @@ sub dbupdate { sub dbupdate2 { $main::lxdebug->enter_sub(); - my ($self, $form, $controls) = @_; + my ($self, $form, $dbupdater) = @_; $form->{sid} = $form->{dbdefault}; - my @upgradescripts = (); - my ($query, $sth, $tag); - my $rc = -2; - - @upgradescripts = sort_dbupdate_controls($controls); + my $rc = -2; + my $db_charset = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET; - my $db_charset = $main::dbcharset; - $db_charset ||= Common::DEFAULT_CHARSET; + map { $_->{description} = SL::Iconv::convert($_->{charset}, $db_charset, $_->{description}) } values %{ $dbupdater->{all_controls} }; foreach my $db (split / /, $form->{dbupdate}) { - next unless $form->{$db}; # strip db from dataset $db =~ s/^db//; &dbconnect_vars($form, $db); - my $dbh = - DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) - or $form->dberror; + my $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) or $form->dberror; - map({ $_->{"applied"} = 0; } @upgradescripts); + $dbh->do($form->{dboptions}) if ($form->{dboptions}); $self->create_schema_info_table($form, $dbh); - $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})); - } - $sth->finish(); - - my $all_applied = 1; - foreach (@upgradescripts) { - if (!$_->{"applied"}) { - $all_applied = 0; - last; - } - } + my @upgradescripts = $dbupdater->unapplied_upgrade_scripts($dbh); - next if ($all_applied); + $dbh->disconnect and next if !@upgradescripts; foreach my $control (@upgradescripts) { - next if ($control->{"applied"}); - - $control->{description} = SL::Iconv::convert($control->{charset}, $db_charset, $control->{description}); - - $control->{"file"} =~ /\.(sql|pl)$/; - my $file_type = $1; - # apply upgrade - $main::lxdebug->message(DEBUG2, "Applying Update $control->{file}"); - print($form->parse_html_template2("dbupgrade/upgrade_message2", - $control)); - - if ($file_type eq "sql") { - $self->process_query($form, $dbh, "sql/" . $form->{"dbdriver"} . - "-upgrade2/$control->{file}", $control, $db_charset); - } else { - $self->process_perl_script($form, $dbh, "sql/" . $form->{"dbdriver"} . - "-upgrade2/$control->{file}", $control, $db_charset); - } + $main::lxdebug->message(LXDebug->DEBUG2(), "Applying Update $control->{file}"); + print $form->parse_html_template("dbupgrade/upgrade_message2", $control); + + $dbupdater->process_file($dbh, "sql/" . $form->{"dbdriver"} . "-upgrade2/$control->{file}", $control, $db_charset); } $rc = 0; @@ -950,164 +682,72 @@ sub dbupdate2 { return $rc; } -sub update2_available { - $main::lxdebug->enter_sub(); - - my ($form, $controls) = @_; - - map({ $_->{"applied"} = 0; } values(%{$controls})); - - dbconnect_vars($form, $form->{"dbname"}); - - my $dbh = - DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) || - $form->dberror; - - my ($query, $tag, $sth); - - $query = qq|SELECT tag FROM schema_info|; - $sth = $dbh->prepare($query); - if ($sth->execute()) { - while (($tag) = $sth->fetchrow_array()) { - $controls->{$tag}->{"applied"} = 1 if (defined($controls->{$tag})); - } - } - $sth->finish(); - $dbh->disconnect(); - - map({ $main::lxdebug->leave_sub() and return 1 if (!$_->{"applied"}) } - values(%{$controls})); - - $main::lxdebug->leave_sub(); - return 0; -} - -sub create_config { +sub save_member { $main::lxdebug->enter_sub(); my ($self) = @_; - local *CONF; - - @config = config_vars(); - - my $userspath = $main::userspath; - - open(CONF, ">", "$userspath/$self->{login}.conf") || $self->error("$userspath/$self->{login}.conf : $!"); + # format dbconnect and dboptions string + dbconnect_vars($self, $self->{dbname}); - # create the config file - print CONF qq|# configuration file for $self->{login} + map { $self->{$_} =~ s/\r//g; } qw(address signature); -\%myconfig = ( -|; + $main::auth->save_user($self->{login}, map { $_, $self->{$_} } config_vars()); - foreach my $key (sort @config) { - $self->{$key} =~ s/\'/\\\'/g; - print CONF qq| $key => '$self->{$key}',\n|; + my $dbh = SL::DBConnect->connect($self->{dbconnect}, $self->{dbuser}, $self->{dbpasswd}); + if ($dbh) { + $self->create_employee_entry($::form, $dbh, $self, 1); + $dbh->disconnect(); } - print CONF qq|);\n\n|; - - close CONF; - $main::lxdebug->leave_sub(); } -sub save_member { +sub create_employee_entry { $main::lxdebug->enter_sub(); - my ($self, $memberfile, $userspath) = @_; + my $self = shift; + my $form = shift; + my $dbh = shift; + my $myconfig = shift; + my $update_existing = shift; - local (*FH, *CONF); - - my $newmember = 1; - - # format dbconnect and dboptions string - &dbconnect_vars($self, $self->{dbname}); - - $self->error('File locked!') if (-f "${memberfile}.LCK"); - open(FH, ">${memberfile}.LCK") or $self->error("${memberfile}.LCK : $!"); - close(FH); - - open(CONF, "+<$memberfile") or $self->error("$memberfile : $!"); - - @config = ; - - seek(CONF, 0, 0); - truncate(CONF, 0); - - while ($line = shift @config) { - if ($line =~ /^\[\Q$self->{login}\E\]/) { - $newmember = 0; - last; - } - print CONF $line; + if (!does_table_exist($dbh, 'employee')) { + $main::lxdebug->leave_sub(); + return; } - # remove everything up to next login or EOF - while ($line = shift @config) { - last if ($line =~ /^\[/); - } + # add login to employee table if it does not exist + # no error check for employee table, ignore if it does not exist + my ($id) = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $self->{login}); + my ($good_db) = selectrow_query($form, $dbh, qq|select * from pg_tables where tablename = ? and schemaname = ?|, 'schema_info', 'public'); + my $can_delete; + ($can_delete) = selectrow_query($form, $dbh, qq|SELECT tag FROM schema_info WHERE tag = ?|, 'employee_deleted') if $good_db; - # this one is either the next login or EOF - print CONF $line; + if (!$id) { + my $query = qq|INSERT INTO employee (login, name, workphone, role) VALUES (?, ?, ?, ?)|; + do_query($form, $dbh, $query, ($self->{login}, $myconfig->{name}, $myconfig->{tel}, "user")); - while ($line = shift @config) { - print CONF $line; + } elsif ($update_existing && $can_delete) { + my $query = qq|UPDATE employee SET name = ?, workphone = ?, role = 'user', deleted = 'f' WHERE id = ?|; + do_query($form, $dbh, $query, $myconfig->{name}, $myconfig->{tel}, $id); } - print CONF qq|[$self->{login}]\n|; - - if ((($self->{dbpasswd} ne $self->{old_dbpasswd}) || $newmember) - && $self->{root}) { - $self->{dbpasswd} = pack 'u', $self->{dbpasswd}; - chop $self->{dbpasswd}; - } - if (defined($self->{new_password})) { - if ($self->{new_password} ne $self->{old_password}) { - $self->{password} = crypt $self->{new_password}, - substr($self->{login}, 0, 2) - if $self->{new_password}; - } - } else { - if ($self->{password} ne $self->{old_password}) { - $self->{password} = crypt $self->{password}, substr($self->{login}, 0, 2) - if $self->{password}; - } - } - - if ($self->{'root login'}) { - @config = ("password"); - } else { - @config = &config_vars; - } - - # replace \r\n with \n - map { $self->{$_} =~ s/\r\n/\\n/g } qw(address signature); - foreach $key (sort @config) { - print CONF qq|$key=$self->{$key}\n|; - } - - print CONF "\n"; - close CONF; - unlink "${memberfile}.LCK"; - - # create conf file - $self->create_config() unless $self->{'root login'}; - $main::lxdebug->leave_sub(); } sub config_vars { $main::lxdebug->enter_sub(); - my @conf = qw(acs address admin businessnumber company countrycode + my @conf = qw(address admin businessnumber company countrycode currency dateformat dbconnect dbdriver dbhost dbport dboptions dbname dbuser dbpasswd email fax name numberformat password - printer role sid signature stylesheet tel templates vclimit angebote + printer sid signature stylesheet tel templates vclimit angebote bestellungen rechnungen anfragen lieferantenbestellungen einkaufsrechnungen taxnumber co_ustid duns menustyle template_format default_media - default_printer_id copies show_form_details favorites); + default_printer_id copies show_form_details favorites + pdonumber sdonumber hide_cvar_search_options mandatory_departments + sepa_creditor_id taxincluded_checked); $main::lxdebug->leave_sub(); @@ -1138,5 +778,8 @@ sub error { $main::lxdebug->leave_sub(); } -1; +sub data { + +{ %{ $_[0] } } +} +1;