1 #=====================================================================
 
   4 # Based on SQL-Ledger Version 2.1.9
 
   5 # Web http://www.lx-office.org
 
   7 #=====================================================================
 
   8 # SQL-Ledger Accounting
 
  11 #  Author: Dieter Simader
 
  12 #   Email: dsimader@sql-ledger.org
 
  13 #     Web: http://www.sql-ledger.org
 
  16 # This program is free software; you can redistribute it and/or modify
 
  17 # it under the terms of the GNU General Public License as published by
 
  18 # the Free Software Foundation; either version 2 of the License, or
 
  19 # (at your option) any later version.
 
  21 # This program is distributed in the hope that it will be useful,
 
  22 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  23 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  24 # GNU General Public License for more details.
 
  25 # You should have received a copy of the GNU General Public License
 
  26 # along with this program; if not, write to the Free Software
 
  27 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
  28 #======================================================================
 
  31 # add/edit/delete users
 
  33 #======================================================================
 
  35 $menufile = "menu.ini";
 
  41 $form->{"root"} = "root login";
 
  43 $locale = new Locale $language, "admin";
 
  45 eval { require DBI; };
 
  46 $form->error($locale->text('DBI not installed!')) if ($@);
 
  49 if (-f "$form->{path}/custom_$form->{script}") {
 
  50   eval { require "$form->{path}/custom_$form->{script}"; };
 
  51   $form->error($@) if ($@);
 
  54 $form->{stylesheet} = "lx-office-erp.css";
 
  55 $form->{favicon}    = "favicon.ico";
 
  57 if ($form->{action}) {
 
  60   $subroutine = $locale->findsub($form->{action});
 
  62   if ($subroutine eq 'login') {
 
  64       $form->{rpw} = crypt $form->{rpw}, "ro";
 
  74   # if there are no drivers bail out
 
  75   $form->error($locale->text('No Database Drivers available!'))
 
  76     unless (User->dbdrivers);
 
  79   if (!-f $memberfile) {
 
  80     open(FH, ">$memberfile") or $form->error("$memberfile : $!");
 
  81     print FH qq|# SQL-Ledger Accounting members
 
 101     qq|Lx-Office ERP $form->{version} | . $locale->text('Administration');
 
 111 <a href="http://www.lx-office.org"><img src="image/lx-office-erp.png" border=0></a>
 
 113     . $locale->text('Version')
 
 114     . qq| $form->{version}<p>|
 
 115     . $locale->text('Administration')
 
 118 <form method=post action="$form->{script}">
 
 122     <th>| . $locale->text('Password') . qq|</th>
 
 123     <td><input type=password name=rpw></td>
 
 124     <td><input type=submit class=submit name=action value="|
 
 125     . $locale->text('Login') . qq|"></td>
 
 127 <input type=hidden name=action value=login>
 
 128 <input type=hidden name=path value=$form->{path}>
 
 134 <a href=http://www.lx-office.org>Lx-Office |
 
 135     . $locale->text('website') . qq|</a>
 
 155     . $locale->text('Administration') . " / "
 
 156     . $locale->text('Add User');
 
 158   $form->{Oracle_sid}    = $sid;
 
 159   $form->{Oracle_dbport} = '1521';
 
 160   $form->{Oracle_dbhost} = `hostname`;
 
 162   if (-f "css/lx-office-erp.css") {
 
 163     $myconfig->{stylesheet} = "lx-office-erp.css";
 
 165   $myconfig->{vclimit} = 200;
 
 167   $myconfig->{"countrycode"} = "de";
 
 168   $myconfig->{"numberformat"} = "1000,00";
 
 169   $myconfig->{"dateformat"} = "dd.mm.yy";
 
 180     . $locale->text('Administration') . " / "
 
 181     . $locale->text('Edit User');
 
 193       qq|<input type=submit class=submit name=action value="|
 
 194       . $locale->text('Delete') . qq|">
 
 195 <input type=hidden name=edit value=1>|;
 
 200 <input name=callback type=hidden value="$form->{script}?action=list_users&path=$form->{path}&rpw=$form->{rpw}">
 
 201 <input type=hidden name=path value=$form->{path}>
 
 202 <input type=hidden name=rpw value=$form->{rpw}>
 
 204 <input type=submit class=submit name=action value="|
 
 205     . $locale->text('Save') . qq|">
 
 218   $form->error($locale->text('File locked!')) if (-f "${memberfile}.LCK");
 
 220   open(FH, "$memberfile") or $form->error("$memberfile : $!");
 
 223 <input type=submit class=submit name=action value="|
 
 224     . $locale->text('Lock System') . qq|">|;
 
 226   if (-e "$userspath/nologin") {
 
 228 <input type=submit class=submit name=action value="|
 
 229       . $locale->text('Unlock System') . qq|">|;
 
 237       $login =~ s/(\[|\])//g;
 
 240     if (/^(name=|company=|templates=|dbuser=|dbdriver=|dbname=|dbhost=)/) {
 
 242       ($null, $member{$login}{$var}) = split(/=/, $_, 2);
 
 248   # type=submit $locale->text('Pg Database Administration')
 
 249   # type=submit $locale->text('Oracle Database Administration')
 
 251   foreach $item (User->dbdrivers) {
 
 253       qq|<input name=action type=submit class=submit value="|
 
 254       . $locale->text("$item Database Administration") . qq|">|;
 
 257   $column_header{login}     = qq|<th>| . $locale->text('Login') . qq|</th>|;
 
 258   $column_header{name}      = qq|<th>| . $locale->text('Name') . qq|</th>|;
 
 259   $column_header{company}   = qq|<th>| . $locale->text('Company') . qq|</th>|;
 
 260   $column_header{dbdriver}  = qq|<th>| . $locale->text('Driver') . qq|</th>|;
 
 261   $column_header{dbhost}    = qq|<th>| . $locale->text('Host') . qq|</th>|;
 
 262   $column_header{dataset}   = qq|<th>| . $locale->text('Dataset') . qq|</th>|;
 
 263   $column_header{templates} =
 
 264     qq|<th>| . $locale->text('Templates') . qq|</th>|;
 
 266   @column_index = qw(login name company dbdriver dbhost dataset templates);
 
 268   $form->{title} = "Lx-Office ERP " . $locale->text('Administration');
 
 275 <form method=post action=$form->{script}>
 
 279   <tr class=listheading>
 
 280     <th>$form->{title}</th>
 
 286         <tr class=listheading>|;
 
 288   map { print "$column_header{$_}\n" } @column_index;
 
 294   foreach $key (sort keys %member) {
 
 296       "$script?action=edit&login=$key&path=$form->{path}&rpw=$form->{rpw}";
 
 299     $member{$key}{templates} =~ s/^$templates\///;
 
 300     $member{$key}{dbhost} = $locale->text('localhost')
 
 301       unless $member{$key}{dbhost};
 
 302     $member{$key}{dbname} = $member{$key}{dbuser}
 
 303       if ($member{$key}{dbdriver} eq 'Oracle');
 
 305     $column_data{login}     = qq|<td><a id="$key" href="$href">$key</a></td>|;
 
 306     $column_data{name}      = qq|<td>$member{$key}{name}</td>|;
 
 307     $column_data{company}   = qq|<td>$member{$key}{company}</td>|;
 
 308     $column_data{dbdriver}  = qq|<td>$member{$key}{dbdriver}</td>|;
 
 309     $column_data{dbhost}    = qq|<td>$member{$key}{dbhost}</td>|;
 
 310     $column_data{dataset}   = qq|<td>$member{$key}{dbname}</td>|;
 
 311     $column_data{templates} = qq|<td>$member{$key}{templates}</td>|;
 
 316         <tr class="listrow$i">|;
 
 318     map { print "$column_data{$_}\n" } @column_index;
 
 329     <td><hr size=3 noshade></td>
 
 333 <input type=hidden name=path value=$form->{path}>
 
 334 <input type=hidden name=rpw value=$form->{rpw}>
 
 336 <br><input type=submit class=submit name=action value="|
 
 337     . $locale->text('Add User') . qq|">
 
 338 <input type=submit class=submit name=action value="|
 
 339     . $locale->text('Change Admin Password') . qq|">
 
 346 | . $locale->text('Click on login name to edit!') . qq|
 
 350     'To add a user to a group edit a name, change the login name and save.  A new user with the same variables will then be saved under the new login name.'
 
 356 <form method=post action=login.pl>
 
 358 <table border=0 width=100%>
 
 359   <tr class=listheading>
 
 360     <th>Lx-Office ERP | . $locale->text('Login') . qq|</th>
 
 366           <th align=right>| . $locale->text('Name') . qq|</th>
 
 367           <td><input class=login name=login></td>
 
 371           <th align=right>| . $locale->text('Password') . qq|</th>
 
 372           <td><input class=login type=password name=password></td>
 
 373           <td><input type=submit name=action value="|
 
 374     . $locale->text('Login') . qq|"></td>
 
 376 <input type=hidden name=path value=$form->{path}>
 
 394   # if there is a login, get user
 
 395   if ($form->{login}) {
 
 398     $myconfig = new User "$memberfile", "$form->{login}";
 
 400     $myconfig->{signature} =~ s/\\n/\r\n/g;
 
 401     $myconfig->{address}   =~ s/\\n/\r\n/g;
 
 403     # strip basedir from templates directory
 
 404     $myconfig->{templates} =~ s/^$templates\///;
 
 406     # $myconfig->{dbpasswd} = unpack 'u', $myconfig->{dbpasswd};
 
 409   foreach $item (qw(mm-dd-yy mm/dd/yy dd-mm-yy dd/mm/yy dd.mm.yy yyyy-mm-dd)) {
 
 411       ($item eq $myconfig->{dateformat})
 
 412       ? "<option selected>$item\n"
 
 416   foreach $item (qw(1,000.00 1000.00 1.000,00 1000,00)) {
 
 418       ($item eq $myconfig->{numberformat})
 
 419       ? "<option selected>$item\n"
 
 423   %countrycodes = User->country_codes;
 
 425   foreach $key (sort { $countrycodes{$a} cmp $countrycodes{$b} }
 
 429       ($myconfig->{countrycode} eq $key)
 
 430       ? "<option selected value=$key>$countrycodes{$key}"
 
 431       : "<option value=$key>$countrycodes{$key}";
 
 433   $countrycodes = qq|<option value="">American English\n$countrycodes|;
 
 435   # is there a templates basedir
 
 436   if (!-d "$templates") {
 
 437     $form->error(  $locale->text('Directory')
 
 439                  . $locale->text('does not exist'));
 
 442   opendir TEMPLATEDIR, "$templates/." or $form->error("$templates : $!");
 
 443   my @all = readdir(TEMPLATEDIR);
 
 444   my @alldir = sort(grep({ -d "$templates/$_" && !/^\.\.?$/ } @all));
 
 445   my @allhtml = sort(grep({ -f "$templates/$_" && /\.html$/ } @all));
 
 446   closedir TEMPLATEDIR;
 
 448   @alldir = grep !/\.(html|tex|sty|odt|xml|txb)$/, @alldir;
 
 449   @alldir = grep !/^(webpages|\.svn)$/, @alldir;
 
 451   @allhtml = reverse grep !/Default/, @allhtml;
 
 452   push @allhtml, 'Default';
 
 453   @allhtml = reverse @allhtml;
 
 455   foreach $item (@alldir) {
 
 456     if ($item eq $myconfig->{templates}) {
 
 457       $usetemplates .= qq|<option selected>$item\n|;
 
 459       $usetemplates .= qq|<option>$item\n|;
 
 463   $lastitem = $allhtml[0];
 
 464   $lastitem =~ s/-.*//g;
 
 465   $mastertemplates = qq|<option>$lastitem\n|;
 
 466   foreach $item (@allhtml) {
 
 469     if ($item ne $lastitem) {
 
 470       my $selected = $item eq "German" ? " selected" : "";
 
 471       $mastertemplates .= qq|<option$selected>$item\n|;
 
 476 #  opendir CSS, "css/.";
 
 477 #  @all = grep /.*\.css$/, readdir CSS;
 
 480 # css dir has styles that are not intended as general layouts.
 
 481 # reverting to hardcoded list
 
 482   @all = qw(lx-office-erp.css Win2000.css);
 
 484   foreach $item (@all) {
 
 485     if ($item eq $myconfig->{stylesheet}) {
 
 486       $selectstylesheet .= qq|<option selected>$item\n|;
 
 488       $selectstylesheet .= qq|<option>$item\n|;
 
 494   if ($myconfig->{menustyle} eq "v3") {
 
 495     $menustyle_v3 = "checked";
 
 496   } elsif ($myconfig->{menustyle} eq "neu") {
 
 497     $menustyle_neu = "checked";
 
 499     $menustyle_old = "checked";
 
 505 <form method=post action=$form->{script}>
 
 508   <tr class=listheading><th colspan=2>$form->{title}</th></tr>
 
 514           <th align=right>| . $locale->text('Login') . qq|</th>
 
 515           <td><input name="login" value="$myconfig->{login}"></td>
 
 518           <th align=right>| . $locale->text('Password') . qq|</th>
 
 519           <td><input type="password" name="password" size="8" value="$myconfig->{password}"></td>
 
 520           <input type="hidden" name="old_password" value="$myconfig->{password}">
 
 523           <th align=right>| . $locale->text('Name') . qq|</th>
 
 524           <td><input name="name" size="15" value="$myconfig->{name}"></td>
 
 527           <th align=right>| . $locale->text('E-mail') . qq|</th>
 
 528           <td><input name=email size=30 value="$myconfig->{email}"></td>
 
 531           <th align=right>| . $locale->text('Signature') . qq|</th>
 
 532           <td><textarea name=signature rows=3 cols=35>$myconfig->{signature}</textarea></td>
 
 535           <th align=right>| . $locale->text('Phone') . qq|</th>
 
 536           <td><input name=tel size=14 value="$myconfig->{tel}"></td>
 
 539           <th align=right>| . $locale->text('Fax') . qq|</th>
 
 540           <td><input name=fax size=14 value="$myconfig->{fax}"></td>
 
 543           <th align=right>| . $locale->text('Company') . qq|</th>
 
 544           <td><input name=company size=35 value="$myconfig->{company}"></td>
 
 547           <th align=right>| . $locale->text('Address') . qq|</th>
 
 548           <td><textarea name=address rows=4 cols=35>$myconfig->{address}</textarea></td>
 
 551           <th align=right>| . $locale->text('Tax number') . qq|</th>
 
 552           <td><input name=taxnumber size=14 value="$myconfig->{taxnumber}"></td>
 
 555           <th align=right>| . $locale->text('Ust-IDNr') . qq|</th>
 
 556           <td><input name=co_ustid size=14 value="$myconfig->{co_ustid}"></td>
 
 559           <th align=right>| . $locale->text('DUNS-Nr') . qq|</th>
 
 560           <td><input name=duns size=14 value="$myconfig->{duns}"></td>
 
 567           <th align=right>| . $locale->text('Date Format') . qq|</th>
 
 568           <td><select name=dateformat>$dateformat</select></td>
 
 571           <th align=right>| . $locale->text('Number Format') . qq|</th>
 
 572           <td><select name=numberformat>$numberformat</select></td>
 
 575           <th align=right>| . $locale->text('Dropdown Limit') . qq|</th>
 
 576           <td><input name=vclimit value="$myconfig->{vclimit}"></td>
 
 579           <th align=right>| . $locale->text('Language') . qq|</th>
 
 580           <td><select name=countrycode>$countrycodes</select></td>
 
 583           <th align=right>| . $locale->text('Character Set') . qq|</th>
 
 584           <td><input name=charset value="$myconfig->{charset}"></td>
 
 587           <th align=right>| . $locale->text('Stylesheet') . qq|</th>
 
 588           <td><select name=userstylesheet>$selectstylesheet</select></td>
 
 591           <th align=right>| . $locale->text('Printer') . qq|</th>
 
 592           <td><input name=printer size=20 value="$myconfig->{printer}"></td>
 
 595           <th align=right>| . $locale->text('Use Templates') . qq|</th>
 
 596           <td><select name=usetemplates>$usetemplates</select></td>
 
 599           <th align=right>| . $locale->text('New Templates') . qq|</th>
 
 600           <td><input name=newtemplates></td>
 
 603           <th align=right>| . $locale->text('Setup Templates') . qq|</th>
 
 604           <td><select name=mastertemplates>$mastertemplates</select></td>
 
 607            <th align=right>| . $locale->text('Setup Menu') . qq|</th>
 
 608            <td><input name=menustyle type=radio class=radio value=v3 $menustyle_v3> | .
 
 609            $locale->text("Top (CSS)") . qq|
 
 610            <input name=menustyle type=radio class=radio value=neu $menustyle_neu> | .
 
 611            $locale->text("Top (Javascript)") . qq|
 
 612            <input name=menustyle type=radio class=radio value=old $menustyle_old> | .
 
 613            $locale->text("Old (on the side)") . qq|
 
 616         <input type=hidden name=templates value=$myconfig->{templates}>
 
 620   <tr class=listheading>
 
 621     <th colspan=2>| . $locale->text('Database') . qq|</th>
 
 624   # list section for database drivers
 
 625   foreach $item (User->dbdrivers) {
 
 634     if ($myconfig->{dbdriver} eq $item) {
 
 635       map { $form->{"${item}_$_"} = $myconfig->{$_} }
 
 636         qw(dbhost dbport dbuser dbpasswd dbname sid);
 
 637       $checked = "checked";
 
 641           <th align=right>| . $locale->text('Driver') . qq|</th>
 
 642           <td><input name="dbdriver" type="radio" class="radio" value="$item" $checked> $item</td>
 
 643           <th align=right>| . $locale->text('Host') . qq|</th>
 
 644           <td><input name="${item}_dbhost" size=30 value="$form->{"${item}_dbhost"}"></td>
 
 651           <th align=right>| . $locale->text('Dataset') . qq|</th>
 
 652           <td><input name="Pg_dbname" size="15" value="$form->{Pg_dbname}"></td>
 
 653           <th align=right>| . $locale->text('Port') . qq|</th>
 
 654           <td><input name="Pg_dbport" size="4" value="$form->{Pg_dbport}"></td>
 
 657           <th align=right>| . $locale->text('User') . qq|</th>
 
 658           <td><input name="${item}_dbuser" size=15 value="$form->{"${item}_dbuser"}"></td>
 
 659           <th align=right>| . $locale->text('Password') . qq|</th>
 
 660           <td><input name="${item}_dbpasswd" type=password size=10 value="$form->{"${item}_dbpasswd"}"></td>
 
 665     if ($item eq 'Oracle') {
 
 667           <th align=right>SID</th>
 
 668           <td><input name=Oracle_sid value=$form->{Oracle_sid}></td>
 
 669           <th align=right>| . $locale->text('Port') . qq|</th>
 
 670           <td><input name=Oracle_dbport size=4 value=$form->{Oracle_dbport}></td>
 
 673           <th align=right>| . $locale->text('Dataset') . qq|</th>
 
 674           <td><input name="${item}_dbuser" size=15 value=$form->{"${item}_dbuser"}></td>
 
 675           <th align=right>| . $locale->text('Password') . qq|</th>
 
 676           <td><input name="${item}_dbpasswd" type=password size=10 value="$form->{"${item}_dbpasswd"}"></td>
 
 682         <input type="hidden" name="old_dbpasswd" value="$myconfig->{dbpasswd}">
 
 687     <td colspan=2><hr size=2 noshade></td>
 
 694   open(FH, $menufile) or $form->error("$menufile : $!");
 
 696   # scan for first menu level
 
 700   if (open(FH, "custom_$menufile")) {
 
 706     next unless $item =~ /\[/;
 
 707     next if $item =~ /\#/;
 
 709     $item =~ s/(\[|\])//g;
 
 713       ($level, $menuitem) = split /--/, $item, 2;
 
 717       push @acsorder, $item;
 
 720     push @{ $acs{$level} }, $menuitem;
 
 724   %role = ('admin'      => $locale->text('Administrator'),
 
 725            'user'       => $locale->text('User'),
 
 726            'manager'    => $locale->text('Manager'),
 
 727            'supervisor' => $locale->text('Supervisor'));
 
 730   foreach $item (qw(user supervisor manager admin)) {
 
 732       ($myconfig->{role} eq $item)
 
 733       ? "<option selected value=$item>$role{$item}\n"
 
 734       : "<option value=$item>$role{$item}\n";
 
 738   <tr class=listheading>
 
 739     <th colspan=2>| . $locale->text('Access Control') . qq|</th>
 
 742     <td><select name=role>$selectrole</select></td>
 
 746   foreach $item (split(/;/, $myconfig->{acs})) {
 
 747     ($key, $value) = split /--/, $item, 2;
 
 748     $excl{$key}{$value} = 1;
 
 751   foreach $key (@acsorder) {
 
 753     $checked = "checked";
 
 754     if ($form->{login}) {
 
 755       $checked = ($excl{$key}{$key}) ? "" : "checked";
 
 758     # can't have variable names with spaces
 
 759     # the 1 is for apache 2
 
 760     $item = $form->escape("${key}--$key", 1);
 
 763     $acsheading =~ s/ / /g;
 
 766     <th align=left><input name="$item" class=checkbox type=checkbox value=1 $checked> $acsheading</th>\n|;
 
 767     $menuitems .= "$item;";
 
 771     foreach $item (@{ $acs{$key} }) {
 
 772       next if ($key eq $item);
 
 774       $checked = "checked";
 
 775       if ($form->{login}) {
 
 776         $checked = ($excl{$key}{$item}) ? "" : "checked";
 
 779       $acsitem = $form->escape("${key}--$item", 1);
 
 782     <br><input name="$acsitem" class=checkbox type=checkbox value=1 $checked> $item|;
 
 783       $menuitems .= "$acsitem;";
 
 790   <tr valign=top>$acsheading $acsdata
 
 795   print qq|<input type=hidden name=acs value="$menuitems">
 
 799       qw(angebote bestellungen rechnungen anfragen lieferantenbestellungen einkaufsrechnungen);
 
 800     foreach $directory (@webdavdirs) {
 
 801       if ($myconfig->{$directory}) {
 
 802         $webdav{"${directory}c"} = "checked";
 
 804         $webdav{"${directory}c"} = "";
 
 809     <td colspan=2><hr size=3 noshade></td>
 
 811   <tr class=listheading>
 
 812     <th colspan=2>| . $locale->text('WEBDAV-Zugriff') . qq|</th>
 
 816         <td><input name=angebote class=checkbox type=checkbox value=1 $webdav{angebotec}> Angebot</td>
 
 817         <td><input name=bestellungen class=checkbox type=checkbox value=1 $webdav{bestellungenc}> Bestellung</td>
 
 818         <td><input name=rechnungen class=checkbox type=checkbox value=1 $webdav{rechnungenc}> Rechnung</td>
 
 821         <td><input name=anfragen class=checkbox type=checkbox value=1 $webdav{anfragenc}> Angebot</td>
 
 822         <td><input name=lieferantenbestellungen class=checkbox type=checkbox value=1 $webdav{lieferantenbestellungenc}> Lieferantenbestellung</td>
 
 823         <td><input name=einkaufsrechnungen class=checkbox type=checkbox value=1 $webdav{einkaufsrechnungenc}> Einkaufsrechnung</td>
 
 827     <td colspan=2><hr size=3 noshade></td>
 
 841   $form->error($locale->text('Database Driver not checked!'))
 
 842     unless $form->{dbdriver};
 
 844   # no spaces allowed in login name
 
 845   ($form->{login}) = split / /, $form->{login};
 
 847   $form->isblank("login", $locale->text('Login name missing!'));
 
 849   # check for duplicates
 
 850   if (!$form->{edit}) {
 
 851     $temp = new User "$memberfile", "$form->{login}";
 
 853     if ($temp->{login}) {
 
 854       $form->error("$form->{login} " . $locale->text('is already a member!'));
 
 858   # no spaces allowed in directories
 
 859   ($form->{newtemplates}) = split / /, $form->{newtemplates};
 
 861   if ($form->{newtemplates}) {
 
 862     $form->{templates} = $form->{newtemplates};
 
 865       ($form->{usetemplates}) ? $form->{usetemplates} : $form->{login};
 
 869   if (!-d "$templates") {
 
 870     $form->error(  $locale->text('Directory')
 
 872                  . $locale->text('does not exist'));
 
 875   # add base directory to $form->{templates}
 
 876   $form->{templates} = "$templates/$form->{templates}";
 
 878   $myconfig = new User "$memberfile", "$form->{login}";
 
 880   # redo acs variable and delete all the acs codes
 
 881   @acs = split(/;/, $form->{acs});
 
 884   foreach $item (@acs) {
 
 885     $item = $form->escape($item, 1);
 
 887     if (!$form->{$item}) {
 
 888       $form->{acs} .= $form->unescape($form->unescape($item)) . ";";
 
 890     delete $form->{$item};
 
 893   # check which database was filled in
 
 894   if ($form->{dbdriver} eq 'Oracle') {
 
 895     $form->{sid}      = $form->{Oracle_sid},;
 
 896     $form->{dbhost}   = $form->{Oracle_dbhost},;
 
 897     $form->{dbport}   = $form->{Oracle_dbport};
 
 898     $form->{dbpasswd} = $form->{Oracle_dbpasswd};
 
 899     $form->{dbuser}   = $form->{Oracle_dbuser};
 
 900     $form->{dbname}   = $form->{Oracle_dbuser};
 
 902     $form->isblank("dbhost", $locale->text('Hostname missing!'));
 
 903     $form->isblank("dbport", $locale->text('Port missing!'));
 
 904     $form->isblank("dbuser", $locale->text('Dataset missing!'));
 
 906   if ($form->{dbdriver} eq 'Pg') {
 
 907     $form->{dbhost}   = $form->{Pg_dbhost};
 
 908     $form->{dbport}   = $form->{Pg_dbport};
 
 909     $form->{dbpasswd} = $form->{Pg_dbpasswd};
 
 910     $form->{dbuser}   = $form->{Pg_dbuser};
 
 911     $form->{dbname}   = $form->{Pg_dbname};
 
 913     $form->isblank("dbname", $locale->text('Dataset missing!'));
 
 914     $form->isblank("dbuser", $locale->text('Database User missing!'));
 
 919       qw(angebote bestellungen rechnungen anfragen lieferantenbestellungen einkaufsrechnungen);
 
 920     foreach $directory (@webdavdirs) {
 
 921       if ($form->{$directory}) {
 
 922         $form->{$directory} = $form->{$directory};
 
 924         $form->{$directory} = 0;
 
 929   foreach $item (keys %{$form}) {
 
 930     $myconfig->{$item} = $form->{$item};
 
 933   delete $myconfig->{stylesheet};
 
 934   if ($form->{userstylesheet}) {
 
 935     $myconfig->{stylesheet} = $form->{userstylesheet};
 
 938   $myconfig->save_member($memberfile, $userspath);
 
 942       qw(angebote bestellungen rechnungen anfragen lieferantenbestellungen einkaufsrechnungen);
 
 943     foreach $directory (@webdavdirs) {
 
 944       $file = "webdav/" . $directory . "/webdav-user";
 
 945       if ($form->{$directory}) {
 
 946         if (open(HTACCESS, "$file")) {
 
 948             ($login, $password) = split(/:/, $_);
 
 949             if ($login ne $form->{login}) {
 
 955         open(HTACCESS, "> $file") or die "cannot open $file $!\n";
 
 956         $newfile .= $myconfig->{login} . ":" . $myconfig->{password} . "\n";
 
 957         print(HTACCESS $newfile);
 
 960         $form->{$directory} = 0;
 
 961         if (open(HTACCESS, "$file")) {
 
 963             ($login, $password) = split(/:/, $_);
 
 964             if ($login ne $form->{login}) {
 
 970         open(HTACCESS, "> $file") or die "cannot open $file $!\n";
 
 971         print(HTACCESS $newfile);
 
 977   # create user template directory and copy master files
 
 978   if (!-d "$form->{templates}") {
 
 981     if (mkdir "$form->{templates}", oct("771")) {
 
 985       # copy templates to the directory
 
 986       opendir TEMPLATEDIR, "$templates/." or $form - error("$templates : $!");
 
 987       @templates = grep /$form->{mastertemplates}.*?\.(html|tex|sty|xml|txb)$/,
 
 989       closedir TEMPLATEDIR;
 
 991       foreach $file (@templates) {
 
 992         open(TEMP, "$templates/$file")
 
 993           or $form->error("$templates/$file : $!");
 
 995         $file =~ s/$form->{mastertemplates}-//;
 
 996         open(NEW, ">$form->{templates}/$file")
 
 997           or $form->error("$form->{templates}/$file : $!");
 
 999         while ($line = <TEMP>) {
 
1006       $form->error("$!: $form->{templates}");
 
1010   $form->redirect($locale->text('User saved!'));
 
1016   $form->{templates} =
 
1017     ($form->{templates})
 
1018     ? "$templates/$form->{templates}"
 
1019     : "$templates/$form->{login}";
 
1021   $form->error($locale->text('File locked!')) if (-f ${memberfile} . LCK);
 
1022   open(FH, ">${memberfile}.LCK") or $form->error("${memberfile}.LCK : $!");
 
1025   open(CONF, "+<$memberfile") or $form->error("$memberfile : $!");
 
1032   while ($line = shift @config) {
 
1034     if ($line =~ /^\[/) {
 
1035       last if ($line =~ /\[$form->{login}\]/);
 
1036       $login = &login_name($line);
 
1039     if ($line =~ /^templates=/) {
 
1040       $user{$login} = &get_value($line);
 
1046   # remove everything up to next login or EOF
 
1047   # and save template variable
 
1048   while ($line = shift @config) {
 
1049     if ($line =~ /^templates=/) {
 
1050       $templatedir = &get_value($line);
 
1052     last if ($line =~ /^\[/);
 
1055   # this one is either the next login or EOF
 
1058   $login = &login_name($line);
 
1060   while ($line = shift @config) {
 
1061     if ($line =~ /^\[/) {
 
1062       $login = &login_name($line);
 
1065     if ($line =~ /^templates=/) {
 
1066       $user{$login} = &get_value($line);
 
1073   unlink "${memberfile}.LCK";
 
1075   # scan %user for $templatedir
 
1076   foreach $login (keys %user) {
 
1077     last if ($found = ($templatedir eq $user{$login}));
 
1080   # if found keep directory otherwise delete
 
1083     # delete it if there is a template directory
 
1084     $dir = "$form->{templates}";
 
1086       unlink <$dir/*.html>;
 
1087       unlink <$dir/*.tex>;
 
1088       unlink <$dir/*.sty>;
 
1093   # delete config file for user
 
1094   unlink "$userspath/$form->{login}.conf";
 
1096   $form->redirect($locale->text('User deleted!'));
 
1103   $login =~ s/\[\]//g;
 
1104   return ($login) ? $login : undef;
 
1111   my ($null, $value) = split(/=/, $line, 2);
 
1114   $value =~ s/\s#.*//g;
 
1116   # remove any trailing whitespace
 
1117   $value =~ s/^\s*(.*?)\s*$/$1/;
 
1122 sub change_admin_password {
 
1126     . $locale->text('Administration') . " / "
 
1127     . $locale->text('Change Admin Password');
 
1135 <h2>| . $locale->text('Change Admin Password') . qq|</h2>
 
1137 <form method=post action=$form->{script}>
 
1141     <td><b>| . $locale->text('Password') . qq|</b></td>
 
1142     <td><input type=password name=password size=8></td>
 
1145     <td><b>| . $locale->text('Repeat the password') . qq|</b></td>
 
1146     <td><input type=password name=password_again size=8></b></td>
 
1150 <input type=hidden name=path value=$form->{path}>
 
1151 <input type=hidden name=rpw value=$form->{rpw}>
 
1154 <input type=submit class=submit name=action value="|
 
1155     . $locale->text('Change Password') . qq|">
 
1165 sub change_password {
 
1166   if ($form->{"password"} ne $form->{"password_again"}) {
 
1169       . $locale->text('Administration') . " / "
 
1170       . $locale->text('Change Admin Password');
 
1178 <h2>| . $locale->text('Change Admin Password') . qq|</h2>
 
1180 <p>| . $locale->text("The passwords do not match.") . qq|<br>
 
1181 <input type="button" onclick="history.back()" value="| . $locale->text("Back") . qq|">|;
 
1185   $root->{password} = $form->{password};
 
1187   $root->{'root login'} = 1;
 
1188   $root->save_member($memberfile);
 
1191     "$form->{script}?action=list_users&path=$form->{path}&rpw=$root->{password}";
 
1193   $form->redirect($locale->text('Password changed!'));
 
1197 sub check_password {
 
1198   $root = new User "$memberfile", $form->{root};
 
1200   if (!defined($root->{password}) || ($root->{password} ne $form->{rpw})) {
 
1201     $form->error($locale->text('Incorrect Password!'));
 
1206 sub pg_database_administration {
 
1208   $form->{dbdriver} = 'Pg';
 
1213 sub oracle_database_administration {
 
1215   $form->{dbdriver} = 'Oracle';
 
1220 sub dbdriver_defaults {
 
1222   # load some defaults for the selected driver
 
1224                      'Pg' => { dbport        => '5432',
 
1225                                dbuser        => 'postgres',
 
1226                                dbdefault     => 'template1',
 
1227                                dbhost        => 'localhost',
 
1228                                connectstring => $locale->text('Connect to')
 
1230                      'Oracle' => { dbport        => '1521',
 
1233                                    dbhost        => `hostname`,
 
1234                                    connectstring => 'SID'
 
1237   map { $form->{$_} = $driverdefaults{ $form->{dbdriver} }{$_} }
 
1238     keys %{ $driverdefaults{Pg} };
 
1242 sub dbselect_source {
 
1248     'Leave host and port field empty unless you want to make a remote connection.'
 
1252            'You must enter a host and port for local and remote connections!');
 
1255     "Lx-Office ERP / " . $locale->text('Database Administration');
 
1264 <h2>$form->{title}</h2>
 
1266 <form method=post action=$form->{script}>
 
1273   <tr class=listheading>
 
1274     <th colspan=4>| . $locale->text('Database') . qq|</th>
 
1277 <input type=hidden name=dbdriver value=$form->{dbdriver}>
 
1284     <th align=right>| . $locale->text('Host') . qq|</th>
 
1285     <td><input name=dbhost size=25 value=$form->{dbhost}></td>
 
1286     <th align=right>| . $locale->text('Port') . qq|</th>
 
1287     <td><input name=dbport size=5 value=$form->{dbport}></td>
 
1293     <th align=right>| . $locale->text('User') . qq|</th>
 
1294     <td><input name="dbuser" size="10" value="$form->{dbuser}"></td>
 
1295     <th align=right>| . $locale->text('Password') . qq|</th>
 
1296     <td><input type="password" name="dbpasswd" size="10"></td>
 
1302     <th align=right>$form->{connectstring}</th>
 
1303     <td colspan=3><input name=dbdefault size=10 value=$form->{dbdefault}></td>
 
1312 <input name=callback type=hidden value="$form->{script}?action=list_users&path=$form->{path}&rpw=$form->{rpw}">
 
1313 <input type=hidden name=path value=$form->{path}>
 
1314 <input type=hidden name=rpw value=$form->{rpw}>
 
1318 <input type=submit class=submit name=action value="|
 
1319     . $locale->text('Create Dataset') . qq|">|;
 
1320 # Vorübergehend Deaktiviert
 
1321 # <input type=submit class=submit name=action value="|
 
1322 #     . $locale->text('Update Dataset') . qq|">
 
1323 print qq| <input type=submit class=submit name=action value="|
 
1324     . $locale->text('Delete Dataset') . qq|">
 
1333     'This is a preliminary check for existing sources. Nothing will be created or deleted at this stage!'
 
1337 <br>$msg{$form->{dbdriver}}
 
1348   &{ $form->{nextsub} };
 
1352 sub update_dataset {
 
1354   %needsupdate = User->dbneedsupdate(\%$form);
 
1358     . $locale->text('Database Administration') . " / "
 
1359     . $locale->text('Update Dataset');
 
1368 <h2>$form->{title}</h2>
 
1371   foreach $key (sort keys %needsupdate) {
 
1372     if ($needsupdate{$key} ne $form->{dbversion}) {
 
1373       $upd .= qq|<input id="$field_id" name="db$key" type="checkbox" value="1" checked> $key\n|;
 
1374       $form->{dbupdate} .= "db$key ";
 
1379   chop $form->{dbupdate};
 
1381   if ($form->{dbupdate}) {
 
1385 <form method=post action=$form->{script}>
 
1387 <input type=hidden name="dbdriver"  value="$form->{dbdriver}">
 
1388 <input type=hidden name="dbhost"    value="$form->{dbhost}">
 
1389 <input type=hidden name="dbport"    value="$form->{dbport}">
 
1390 <input type=hidden name="dbuser"    value="$form->{dbuser}">
 
1391 <input type=hidden name="dbpasswd"  value="$form->{dbpasswd}">
 
1392 <input type=hidden name="dbdefault" value="$form->{dbdefault}">
 
1394 <tr class=listheading>
 
1395   <th>| . $locale->text('The following Datasets need to be updated') . qq|</th>
 
1407 <input name=dbupdate type=hidden value="$form->{dbupdate}">
 
1409 <input name=callback type=hidden value="$form->{script}?action=list_users&path=$form->{path}&rpw=$form->{rpw}">
 
1411 <input type=hidden name=path value=$form->{path}>
 
1412 <input type=hidden name=rpw value=$form->{rpw}>
 
1414 <input type=hidden name=nextsub value=dbupdate>
 
1419 <input type=submit class=submit name=action value="|
 
1420       . $locale->text('Continue') . qq|">
 
1429     print $locale->text('All Datasets up to date!');
 
1442   $form->{"stylesheet"} = "lx-office-erp.css";
 
1443   $form->{"title"} = $main::locale->text("Dataset upgrade");
 
1447          map({ s/\s//g; s/^db//; $_; }
 
1448              grep({ $form->{$_} }
 
1449                   split(/\s+/, $form->{"dbupdate"}))));
 
1450   print($form->parse_html_template("dbupgrade/header",
 
1451                                    { "dbname" => $dbname }));
 
1453   User->dbupdate(\%$form);
 
1458 | . $locale->text('Dataset updated!') . qq|
 
1462 <a id="enddatasetupdate" href="admin.pl?action=login&| .
 
1463 join("&", map({ "$_=" . $form->escape($form->{$_}); } qw(path rpw))) .
 
1464 qq|">| . $locale->text("Continue") . qq|</a>|;
 
1468 sub create_dataset {
 
1470   foreach $item (sort User->dbsources(\%$form)) {
 
1471     $dbsources .= "[$item] ";
 
1474   opendir SQLDIR, "sql/." or $form - error($!);
 
1475   foreach $item (sort grep /-chart\.sql\z/, readdir SQLDIR) {
 
1476     next if ($item eq 'Default-chart.sql');
 
1477     $item =~ s/-chart\.sql//;
 
1479       qq| <input name=chart class=radio type=radio value="$item"> $item|;
 
1483   $selectencoding = qq|<option>
 
1484   <option value="SQL_ASCII">ASCII
 
1485   <option value="EUC_JP">Japanese Extended UNIX Code
 
1486   <option value="EUC_CN">Chinese Extended UNIX Code
 
1487   <option value="EUC_KR">Korean Extended UNIX Code
 
1488   <option value="EUC_TW">Taiwan Extended UNIX Code
 
1489   <option value="UNICODE">UTF-8 Unicode
 
1490   <option value="MULE_INTERNAL">Mule internal type
 
1491   <option selected="selected"  value="LATIN1">ISO 8859-1 
 
1492   <option value="LATIN2">ISO 8859-2
 
1493   <option value="LATIN3">ISO 8859-3
 
1494   <option value="LATIN4">ISO 8859-4
 
1495   <option value="LATIN5">ISO 8859-5
 
1496   <option value="LATIN9">ISO 8859-15
 
1497   <option value="KOI8">KOI8-R
 
1498   <option value="WIN">Windows CP1251
 
1499   <option value="ALT">Windows CP866
 
1504     . $locale->text('Database Administration') . " / "
 
1505     . $locale->text('Create Dataset');
 
1514 <h2>$form->{title}</h2>
 
1516 <form method=post action=$form->{script}>
 
1519   <tr class=listheading>
 
1520     <th colspan=2> </th>
 
1525     <th align=right nowrap>| . $locale->text('Existing Datasets') . qq|</th>
 
1532     <th align=right nowrap>| . $locale->text('Create Dataset') . qq|</th>
 
1533     <td><input name=db></td>
 
1539     <th align=right nowrap>| . $locale->text('Multibyte Encoding') . qq|</th>
 
1540     <td><select name=encoding>$selectencoding</select></td>
 
1546     <th align=right nowrap>|
 
1547     . $locale->text('Create Chart of Accounts') . qq|</th>
 
1554 <input type=hidden name="dbdriver"  value="$form->{dbdriver}">
 
1555 <input type=hidden name="dbuser"    value="$form->{dbuser}">
 
1556 <input type=hidden name="dbhost"    value="$form->{dbhost}">
 
1557 <input type=hidden name="dbport"    value="$form->{dbport}">
 
1558 <input type=hidden name="dbpasswd"  value="$form->{dbpasswd}">
 
1559 <input type=hidden name="dbdefault" value="$form->{dbdefault}">
 
1561 <input name=callback type=hidden value="$form->{script}?action=list_users&path=$form->{path}&rpw=$form->{rpw}">
 
1563 <input type=hidden name=path value=$form->{path}>
 
1564 <input type=hidden name=rpw value=$form->{rpw}>
 
1566 <input type=hidden name=nextsub value=dbcreate>
 
1571 <input type=submit class=submit name=action value="|
 
1572     . $locale->text('Continue') . qq|">
 
1588   $form->isblank("db", $locale->text('Dataset missing!'));
 
1590   User->dbcreate(\%$form);
 
1594     . $locale->text('Database Administration') . " / "
 
1595     . $locale->text('Create Dataset');
 
1604 <h2>$form->{title}</h2>
 
1606 <form method=post action=$form->{script}>|
 
1608     . $locale->text('Dataset')
 
1610     . $locale->text('successfully created!')
 
1614 <input type=hidden name=path value="$form->{path}">
 
1615 <input type=hidden name=rpw value="$form->{rpw}">
 
1617 <input type=hidden name=nextsub value=list_users>
 
1619 <p><input type=submit class=submit name=action value="|
 
1620     . $locale->text('Continue') . qq|">
 
1630 sub delete_dataset {
 
1632   if (@dbsources = User->dbsources_unused(\%$form, $memberfile)) {
 
1633     foreach $item (sort @dbsources) {
 
1635         qq|<input name=db class=radio type=radio value=$item> $item |;
 
1638     $form->error($locale->text('Nothing to delete!'));
 
1643     . $locale->text('Database Administration') . " / "
 
1644     . $locale->text('Delete Dataset');
 
1651 <h2>$form->{title}</h2>
 
1653 <form method=post action=$form->{script}>
 
1656   <tr class=listheading>
 
1658     . $locale->text('The following Datasets are not in use and can be deleted')
 
1670 <input type=hidden name="dbdriver"  value="$form->{dbdriver}">
 
1671 <input type=hidden name="dbuser"    value="$form->{dbuser}">
 
1672 <input type=hidden name="dbhost"    value="$form->{dbhost}">
 
1673 <input type=hidden name="dbport"    value="$form->{dbport}">
 
1674 <input type=hidden name="dbpasswd"  value="$form->{dbpasswd}">
 
1675 <input type=hidden name="dbdefault" value="$form->{dbdefault}">
 
1677 <input name=callback type=hidden value="$form->{script}?action=list_users&path=$form->{path}&rpw=$form->{rpw}">
 
1679 <input type=hidden name=path value="$form->{path}">
 
1680 <input type=hidden name=rpw value="$form->{rpw}">
 
1682 <input type=hidden name=nextsub value=dbdelete>
 
1687 <input type=submit class=submit name=action value="|
 
1688     . $locale->text('Continue') . qq|">
 
1704     $form->error($locale->text('No Dataset selected!'));
 
1707   User->dbdelete(\%$form);
 
1711     . $locale->text('Database Administration') . " / "
 
1712     . $locale->text('Delete Dataset');
 
1721 <h2>$form->{title}</h2>
 
1723 <form method=post action=$form->{script}>
 
1725 $form->{db} | . $locale->text('successfully deleted!')
 
1729 <input type=hidden name=path value="$form->{path}">
 
1730 <input type=hidden name=rpw value="$form->{rpw}">
 
1732 <input type=hidden name=nextsub value=list_users>
 
1734 <p><input type=submit class=submit name=action value="|
 
1735     . $locale->text('Continue') . qq|">
 
1747   unlink "$userspath/nologin";
 
1750     "$form->{script}?action=list_users&path=$form->{path}&rpw=$root->{password}";
 
1752   $form->redirect($locale->text('Lockfile removed!'));
 
1758   open(FH, ">$userspath/nologin")
 
1759     or $form->error($locale->text('Cannot create Lock!'));
 
1763     "$form->{script}?action=list_users&path=$form->{path}&rpw=$root->{password}";
 
1765   $form->redirect($locale->text('Lockfile created!'));