Upgradescripte für auth.* nur ausführen, wenn Authentifizierungstabellen bereits...
[kivitendo-erp.git] / bin / mozilla / admin.pl
index 42efda8..3258a31 100755 (executable)
@@ -32,8 +32,6 @@
 #
 #======================================================================
 
-my $menufile = "menu.ini";
-
 use DBI;
 use CGI;
 use English qw(-no_match_vars);
@@ -45,6 +43,7 @@ use Sys::Hostname;
 
 use SL::Auth;
 use SL::Form;
+use SL::Iconv;
 use SL::Mailer;
 use SL::User;
 use SL::Common;
@@ -54,62 +53,55 @@ use SL::DBUtils;
 
 require "bin/mozilla/common.pl";
 require "bin/mozilla/admin_groups.pl";
+require "bin/mozilla/admin_printer.pl";
 
 use strict;
 
-our $cgi    = new CGI('');
-our $form   = new Form;
-our $locale = new Locale $main::language, "admin";
-our $auth = SL::Auth->new();
-
-if ($auth->session_tables_present()) {
-  $auth->expire_sessions();
-  $auth->restore_session();
-  $auth->set_session_value('rpw', $form->{rpw});
-}
-
-# customization
-if (-f "bin/mozilla/custom_$form->{script}") {
-  eval { require "bin/mozilla/custom_$form->{script}"; };
-  $form->error($@) if ($@);
-}
-
-$form->{stylesheet} = "lx-office-erp.css";
-$form->{favicon}    = "favicon.ico";
-
-if ($form->{action}) {
-  if ($auth->authenticate_root($form->{rpw}, 0) != $auth->OK()) {
-    $form->{error_message} = $locale->text('Incorrect Password!');
-    adminlogin();
-    exit;
-  }
-
-  $auth->create_or_refresh_session() if ($auth->session_tables_present());
+our $cgi;
+our $form;
+our $locale;
+our $auth;
 
-  call_sub($locale->findsub($form->{action}));
+sub run {
+  $::lxdebug->enter_sub;
+  my $session_result = shift;
 
-} elsif ($auth->authenticate_root($form->{rpw}, 0) == $auth->OK()) {
+  $cgi    = $::cgi;
+  $form   = $::form;
+  $locale = $::locale;
+  $auth   = $::auth;
 
-  $auth->create_or_refresh_session() if ($auth->session_tables_present());
+  $::auth->set_session_value('rpw', $::form->{rpw}) if $session_result == SL::Auth->SESSION_OK;
 
-  login();
+  $form->{stylesheet} = "lx-office-erp.css";
+  $form->{favicon}    = "favicon.ico";
 
-} else {
-  # if there are no drivers bail out
-  $form->error($locale->text('No Database Drivers available!'))
-    unless (User->dbdrivers);
+  if ($form->{action}) {
+    if ($auth->authenticate_root($form->{rpw}, 0) != $auth->OK()) {
+      $form->{error_message} = $locale->text('Incorrect Password!');
+      adminlogin();
+    } else {
+      if ($auth->session_tables_present()) {
+        $::auth->set_session_value('rpw', $::form->{rpw});
+        $::auth->create_or_refresh_session();
+        _apply_dbupgrade_scripts();
+      }
 
-  adminlogin();
+      call_sub($locale->findsub($form->{action}));
+    }
+  } else {
+    # if there are no drivers bail out
+    $form->error($locale->text('No Database Drivers available!'))
+      unless (User->dbdrivers);
 
+    adminlogin();
+  }
+  $::lxdebug->leave_sub;
 }
 
-1;
-
-# end
-
 sub adminlogin {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form   = $main::form;
+  my $locale = $main::locale;
 
   $form->{title} = qq|Lx-Office ERP $form->{version} | . $locale->text('Administration');
 
@@ -128,8 +120,8 @@ sub logout {
 }
 
 sub check_auth_db_and_tables {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form   = $main::form;
+  my $locale = $main::locale;
 
   my %params;
 
@@ -140,7 +132,7 @@ sub check_auth_db_and_tables {
     $form->header();
     print $form->parse_html_template('admin/check_auth_database', \%params);
 
-    exit 0;
+    ::end_of_request();
   }
 
   if (!$main::auth->check_tables()) {
@@ -148,7 +140,7 @@ sub check_auth_db_and_tables {
     $form->header();
     print $form->parse_html_template('admin/check_auth_tables', \%params);
 
-    exit 0;
+    ::end_of_request();
   }
 
   if (-f $main::memberfile) {
@@ -165,22 +157,22 @@ sub check_auth_db_and_tables {
     print $form->parse_html_template('admin/user_migration', { 'memberfile' => $main::memberfile,
                                                                'backupdir'  => $backupdir });
 
-    exit 0
+    ::end_of_request();
   }
 }
 
 sub create_auth_db {
-  my $form     = $main::form;
+  my $form = $main::form;
 
   $main::auth->create_database('superuser'          => $form->{db_superuser},
-                         'superuser_password' => $form->{db_superuser_password},
-                         'template'           => $form->{db_template});
+                               'superuser_password' => $form->{db_superuser_password},
+                               'template'           => $form->{db_template});
   login();
 }
 
 sub create_auth_tables {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form   = $main::form;
+  my $locale = $main::locale;
 
   $main::auth->create_tables();
   $main::auth->set_session_value('rpw', $form->{rpw});
@@ -205,8 +197,8 @@ sub create_auth_tables {
 sub migrate_users {
   $main::lxdebug->enter_sub();
 
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form      = $main::form;
+  my $locale    = $main::locale;
 
   my $memberdir = "";
 
@@ -285,8 +277,8 @@ sub migrate_users {
 }
 
 sub create_standard_group_ask {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form   = $main::form;
+  my $locale = $main::locale;
 
   $form->{title} = $locale->text('Create a standard group');
 
@@ -295,12 +287,12 @@ sub create_standard_group_ask {
 }
 
 sub create_standard_group {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form    = $main::form;
+  my $locale  = $main::locale;
 
   my %members = $main::auth->read_all_users();
 
-  my $groups = $main::auth->read_groups();
+  my $groups  = $main::auth->read_groups();
 
   foreach my $group (values %{$groups}) {
     if (($form->{group_id} != $group->{id})
@@ -328,8 +320,8 @@ sub dont_create_standard_group {
 sub user_migration_complete {
   my $standard_group_created = shift;
 
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form                   = $main::form;
+  my $locale                 = $main::locale;
 
   $form->{title} = $locale->text('User migration complete');
   $form->header();
@@ -338,8 +330,8 @@ sub user_migration_complete {
 }
 
 sub list_users {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form    = $main::form;
+  my $locale  = $main::locale;
 
   my %members = $main::auth->read_all_users();
 
@@ -356,37 +348,31 @@ sub list_users {
 }
 
 sub add_user {
+  my $form         = $main::form;
+  my $locale       = $main::locale;
 
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  $form->{title}   = "Lx-Office ERP " . $locale->text('Administration') . " / " . $locale->text('Add User');
 
-  $form->{title} =
-      "Lx-Office ERP "
-    . $locale->text('Administration') . " / "
-    . $locale->text('Add User');
-
-  my $myconfig = {
+# Note: Menu Style 'v3' is not compatible to all browsers!
+# "menustyle"    => "old" sets the HTML Menu to default.
+  my $myconfig     = {
     "vclimit"      => 200,
     "countrycode"  => "de",
     "numberformat" => "1.000,00",
     "dateformat"   => "dd.mm.yy",
     "stylesheet"   => "lx-office-erp.css",
-    "menustyle"    => "v3",
+    "menustyle"    => "old",
   };
 
   edit_user_form($myconfig);
 }
 
 sub edit_user {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form       = $main::form;
+  my $locale     = $main::locale;
 
-
-  $form->{title} =
-      "Lx-Office ERP "
-    . $locale->text('Administration') . " / "
-    . $locale->text('Edit User');
-  $form->{edit} = 1;
+  $form->{title} = "Lx-Office ERP " . $locale->text('Administration') . " / " . $locale->text('Edit User');
+  $form->{edit}  = 1;
 
   $form->isblank("login", $locale->text("The login is missing."));
 
@@ -402,8 +388,8 @@ sub edit_user {
 sub edit_user_form {
   my ($myconfig) = @_;
 
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form       = $main::form;
+  my $locale     = $main::locale;
 
   my @valid_dateformats = qw(mm-dd-yy mm/dd/yy dd-mm-yy dd/mm/yy dd.mm.yy yyyy-mm-dd);
   $form->{ALL_DATEFORMATS} = [ map { { "format" => $_, "selected" => $_ eq $myconfig->{dateformat} } } @valid_dateformats ];
@@ -478,8 +464,8 @@ sub edit_user_form {
 }
 
 sub save_user {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form          = $main::form;
+  my $locale        = $main::locale;
 
   $form->{dbdriver} = 'Pg';
 
@@ -593,7 +579,7 @@ sub save_user {
 }
 
 sub save_user_as_new {
-  my $form     = $main::form;
+  my $form       = $main::form;
 
   $form->{login} = $form->{new_user_login};
   delete @{$form}{qw(edit new_user_login)};
@@ -602,8 +588,8 @@ sub save_user_as_new {
 }
 
 sub delete_user {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form      = $main::form;
+  my $locale    = $main::locale;
 
   my %members   = $main::auth->read_all_users();
   my $templates = $members{$form->{login}}->{templates};
@@ -639,10 +625,7 @@ sub login_name {
 }
 
 sub get_value {
-  my $line = shift;
-
-  my $form     = $main::form;
-
+  my $line           = shift;
   my ($null, $value) = split(/=/, $line, 2);
 
   # remove comments
@@ -655,7 +638,7 @@ sub get_value {
 }
 
 sub pg_database_administration {
-  my $form     = $main::form;
+  my $form = $main::form;
 
   $form->{dbdriver} = 'Pg';
   dbselect_source();
@@ -663,13 +646,13 @@ sub pg_database_administration {
 }
 
 sub dbselect_source {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form           = $main::form;
+  my $locale         = $main::locale;
 
-  $form->{dbport}    = '5432';
-  $form->{dbuser}    = 'postgres';
+  $form->{dbport}    = $::auth->{DB_config}->{port} || 5432;
+  $form->{dbuser}    = $::auth->{DB_config}->{user} || 'lxoffice';
   $form->{dbdefault} = 'template1';
-  $form->{dbhost}    = 'localhost';
+  $form->{dbhost}    = $::auth->{DB_config}->{host} || 'localhost';
 
   $form->{title}     = "Lx-Office ERP / " . $locale->text('Database Administration');
 
@@ -681,8 +664,8 @@ sub dbselect_source {
 }
 
 sub test_db_connection {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form   = $main::form;
+  my $locale = $main::locale;
 
   $form->{dbdriver} = 'Pg';
   User::dbconnect_vars($form, $form->{dbname});
@@ -704,13 +687,10 @@ sub continue {
 }
 
 sub update_dataset {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form              = $main::form;
+  my $locale            = $main::locale;
 
-  $form->{title} =
-      "Lx-Office ERP "
-    . $locale->text('Database Administration') . " / "
-    . $locale->text('Update Dataset');
+  $form->{title}        = "Lx-Office ERP " . $locale->text('Database Administration') . " / " . $locale->text('Update Dataset');
 
   my @need_updates      = User->dbneedsupdate($form);
   $form->{NEED_UPDATES} = \@need_updates;
@@ -721,8 +701,8 @@ sub update_dataset {
 }
 
 sub dbupdate {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form            = $main::form;
+  my $locale          = $main::locale;
 
   $form->{stylesheet} = "lx-office-erp.css";
   $form->{title}      = $locale->text("Dataset upgrade");
@@ -742,15 +722,13 @@ sub dbupdate {
 
     map { $form->{$_} = $form->{"${_}_${i}"} } qw(dbname dbdriver dbhost dbport dbuser dbpasswd);
 
-    my $controls = parse_dbupdate_controls($form, $form->{dbdriver});
-
     print $form->parse_html_template("admin/dbupgrade_header");
 
     $form->{dbupdate}        = $form->{dbname};
     $form->{$form->{dbname}} = 1;
 
     User->dbupdate($form);
-    User->dbupdate2($form, $controls);
+    User->dbupdate2($form, SL::DBUpgrade2->new(form => $form, dbdriver => $form->{dbdriver})->parse_dbupdate_controls);
 
     print $form->parse_html_template("admin/dbupgrade_footer");
   }
@@ -759,12 +737,12 @@ sub dbupdate {
 }
 
 sub create_dataset {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form           = $main::form;
+  my $locale         = $main::locale;
 
   $form->{dbsources} = join " ", map { "[${_}]" } sort User->dbsources($form);
 
-  $form->{CHARTS} = [];
+  $form->{CHARTS}    = [];
 
   opendir SQLDIR, "sql/." or $form->error($ERRNO);
   foreach my $item (sort grep /-chart\.sql\z/, readdir SQLDIR) {
@@ -798,43 +776,34 @@ sub create_dataset {
     }
   }
 
-  $form->{title} =
-      "Lx-Office ERP "
-    . $locale->text('Database Administration') . " / "
-    . $locale->text('Create Dataset');
+  $form->{title} = "Lx-Office ERP " . $locale->text('Database Administration') . " / " . $locale->text('Create Dataset');
 
   $form->header();
   print $form->parse_html_template("admin/create_dataset");
 }
 
 sub dbcreate {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form   = $main::form;
+  my $locale = $main::locale;
 
   $form->isblank("db", $locale->text('Dataset missing!'));
 
   User->dbcreate(\%$form);
 
-  $form->{title} =
-      "Lx-Office ERP "
-    . $locale->text('Database Administration') . " / "
-    . $locale->text('Create Dataset');
+  $form->{title} = "Lx-Office ERP " . $locale->text('Database Administration') . " / " . $locale->text('Create Dataset');
 
   $form->header();
   print $form->parse_html_template("admin/dbcreate");
 }
 
 sub delete_dataset {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form      = $main::form;
+  my $locale    = $main::locale;
 
   my @dbsources = User->dbsources_unused($form);
   $form->error($locale->text('Nothing to delete!')) unless @dbsources;
 
-  $form->{title} =
-      "Lx-Office ERP "
-    . $locale->text('Database Administration') . " / "
-    . $locale->text('Delete Dataset');
+  $form->{title}     = "Lx-Office ERP " . $locale->text('Database Administration') . " / " . $locale->text('Delete Dataset');
   $form->{DBSOURCES} = [ map { { "name", $_ } } sort @dbsources ];
 
   $form->header();
@@ -842,8 +811,8 @@ sub delete_dataset {
 }
 
 sub dbdelete {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form   = $main::form;
+  my $locale = $main::locale;
 
   if (!$form->{db}) {
     $form->error($locale->text('No Dataset selected!'));
@@ -851,22 +820,16 @@ sub dbdelete {
 
   User->dbdelete(\%$form);
 
-  $form->{title} =
-      "Lx-Office ERP "
-    . $locale->text('Database Administration') . " / "
-    . $locale->text('Delete Dataset');
+  $form->{title} = "Lx-Office ERP " . $locale->text('Database Administration') . " / " . $locale->text('Delete Dataset');
   $form->header();
   print $form->parse_html_template("admin/dbdelete");
 }
 
 sub backup_dataset {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form       = $main::form;
+  my $locale     = $main::locale;
 
-  $form->{title} =
-      "Lx-Office ERP "
-    . $locale->text('Database Administration') . " / "
-    . $locale->text('Backup Dataset');
+  $form->{title} = "Lx-Office ERP " . $locale->text('Database Administration') . " / " . $locale->text('Backup Dataset');
 
   if ("$main::pg_dump_exe" eq "DISABLED") {
     $form->error($locale->text('Database backups and restorations are disabled in lx-erp.conf.'));
@@ -885,13 +848,10 @@ sub backup_dataset {
 }
 
 sub backup_dataset_start {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form       = $main::form;
+  my $locale     = $main::locale;
 
-  $form->{title} =
-      "Lx-Office ERP "
-    . $locale->text('Database Administration') . " / "
-    . $locale->text('Backup Dataset');
+  $form->{title} = "Lx-Office ERP " . $locale->text('Database Administration') . " / " . $locale->text('Backup Dataset');
 
   $main::pg_dump_exe ||= "pg_dump";
 
@@ -967,10 +927,7 @@ sub backup_dataset_start {
     unlink "${tmpdir}/.pgpass", $tmp;
     rmdir $tmpdir;
 
-    $form->{title} =
-        "Lx-Office ERP "
-      . $locale->text('Database Administration') . " / "
-      . $locale->text('Backup Dataset');
+    $form->{title} = "Lx-Office ERP " . $locale->text('Database Administration') . " / " . $locale->text('Backup Dataset');
 
     $form->header();
     print $form->parse_html_template("admin/backup_dataset_email_done");
@@ -978,13 +935,10 @@ sub backup_dataset_start {
 }
 
 sub restore_dataset {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form       = $main::form;
+  my $locale     = $main::locale;
 
-  $form->{title} =
-      "Lx-Office ERP "
-    . $locale->text('Database Administration') . " / "
-    . $locale->text('Restore Dataset');
+  $form->{title} = "Lx-Office ERP " . $locale->text('Database Administration') . " / " . $locale->text('Restore Dataset');
 
   if ("$main::pg_restore_exe" eq "DISABLED") {
     $form->error($locale->text('Database backups and restorations are disabled in lx-erp.conf.'));
@@ -1006,13 +960,10 @@ sub restore_dataset {
 }
 
 sub restore_dataset_start {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form       = $main::form;
+  my $locale     = $main::locale;
 
-  $form->{title} =
-      "Lx-Office ERP "
-    . $locale->text('Database Administration') . " / "
-    . $locale->text('Restore Dataset');
+  $form->{title} = "Lx-Office ERP " . $locale->text('Database Administration') . " / " . $locale->text('Restore Dataset');
 
   $main::pg_restore_exe ||= "pg_restore";
 
@@ -1132,8 +1083,8 @@ sub restore_dataset_start {
 }
 
 sub unlock_system {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form   = $main::form;
+  my $locale = $main::locale;
 
   unlink "$main::userspath/nologin";
 
@@ -1144,8 +1095,8 @@ sub unlock_system {
 }
 
 sub lock_system {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form   = $main::form;
+  my $locale = $main::locale;
 
   open(FH, ">$main::userspath/nologin")
     or $form->error($locale->text('Cannot create Lock!'));
@@ -1170,7 +1121,7 @@ sub add {
 }
 
 sub edit {
-  my $form     = $main::form;
+  my $form = $main::form;
 
   $form->{edit_nextsub} ||= 'edit_user';
 
@@ -1186,7 +1137,7 @@ sub delete {
 }
 
 sub save {
-  my $form     = $main::form;
+  my $form = $main::form;
 
   $form->{save_nextsub} ||= 'save_user';
 
@@ -1198,8 +1149,8 @@ sub back {
 }
 
 sub dispatcher {
-  my $form     = $main::form;
-  my $locale   = $main::locale;
+  my $form   = $main::form;
+  my $locale = $main::locale;
 
   foreach my $action (qw(create_standard_group dont_create_standard_group
                          save_user delete_user save_user_as_new)) {
@@ -1214,4 +1165,8 @@ sub dispatcher {
   $form->error($locale->text('No action defined.'));
 }
 
+sub _apply_dbupgrade_scripts {
+  ::end_of_request() if SL::DBUpgrade2->new(form => $::form, dbdriver => 'Pg', auth => 1)->apply_admin_dbupgrade_scripts(1);
+}
+
 1;