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 = sort(grep({ /\.css$/ && ($_ ne "tabcontent.css") } readdir(CSS)));
 
 480   foreach $item (@all) {
 
 481     if ($item eq $myconfig->{stylesheet}) {
 
 482       $selectstylesheet .= qq|<option selected>$item\n|;
 
 484       $selectstylesheet .= qq|<option>$item\n|;
 
 490   if ($myconfig->{menustyle} eq "v3") {
 
 491     $menustyle_v3 = "checked";
 
 492   } elsif ($myconfig->{menustyle} eq "neu") {
 
 493     $menustyle_neu = "checked";
 
 495     $menustyle_old = "checked";
 
 501 <form method=post action=$form->{script}>
 
 504   <tr class=listheading><th colspan=2>$form->{title}</th></tr>
 
 510           <th align=right>| . $locale->text('Login') . qq|</th>
 
 511           <td><input name=login value="$myconfig->{login}"></td>
 
 514           <th align=right>| . $locale->text('Password') . qq|</th>
 
 515           <td><input type=password name=password size=8 value=$myconfig->{password}></td>
 
 516           <input type=hidden name=old_password value=$myconfig->{password}>
 
 519           <th align=right>| . $locale->text('Name') . qq|</th>
 
 520           <td><input name=name size=15 value="$myconfig->{name}"></td>
 
 523           <th align=right>| . $locale->text('E-mail') . qq|</th>
 
 524           <td><input name=email size=30 value="$myconfig->{email}"></td>
 
 527           <th align=right>| . $locale->text('Signature') . qq|</th>
 
 528           <td><textarea name=signature rows=3 cols=35>$myconfig->{signature}</textarea></td>
 
 531           <th align=right>| . $locale->text('Phone') . qq|</th>
 
 532           <td><input name=tel size=14 value="$myconfig->{tel}"></td>
 
 535           <th align=right>| . $locale->text('Fax') . qq|</th>
 
 536           <td><input name=fax size=14 value="$myconfig->{fax}"></td>
 
 539           <th align=right>| . $locale->text('Company') . qq|</th>
 
 540           <td><input name=company size=35 value="$myconfig->{company}"></td>
 
 543           <th align=right>| . $locale->text('Address') . qq|</th>
 
 544           <td><textarea name=address rows=4 cols=35>$myconfig->{address}</textarea></td>
 
 547           <th align=right>| . $locale->text('Tax number') . qq|</th>
 
 548           <td><input name=taxnumber size=14 value="$myconfig->{taxnumber}"></td>
 
 551           <th align=right>| . $locale->text('Ust-IDNr') . qq|</th>
 
 552           <td><input name=co_ustid size=14 value="$myconfig->{co_ustid}"></td>
 
 555           <th align=right>| . $locale->text('DUNS-Nr') . qq|</th>
 
 556           <td><input name=duns size=14 value="$myconfig->{duns}"></td>
 
 563           <th align=right>| . $locale->text('Date Format') . qq|</th>
 
 564           <td><select name=dateformat>$dateformat</select></td>
 
 567           <th align=right>| . $locale->text('Number Format') . qq|</th>
 
 568           <td><select name=numberformat>$numberformat</select></td>
 
 571           <th align=right>| . $locale->text('Dropdown Limit') . qq|</th>
 
 572           <td><input name=vclimit value="$myconfig->{vclimit}"></td>
 
 575           <th align=right>| . $locale->text('Language') . qq|</th>
 
 576           <td><select name=countrycode>$countrycodes</select></td>
 
 579           <th align=right>| . $locale->text('Character Set') . qq|</th>
 
 580           <td><input name=charset value="$myconfig->{charset}"></td>
 
 583           <th align=right>| . $locale->text('Stylesheet') . qq|</th>
 
 584           <td><select name=userstylesheet>$selectstylesheet</select></td>
 
 587           <th align=right>| . $locale->text('Printer') . qq|</th>
 
 588           <td><input name=printer size=20 value="$myconfig->{printer}"></td>
 
 591           <th align=right>| . $locale->text('Use Templates') . qq|</th>
 
 592           <td><select name=usetemplates>$usetemplates</select></td>
 
 595           <th align=right>| . $locale->text('New Templates') . qq|</th>
 
 596           <td><input name=newtemplates></td>
 
 599           <th align=right>| . $locale->text('Setup Templates') . qq|</th>
 
 600           <td><select name=mastertemplates>$mastertemplates</select></td>
 
 603            <th align=right>| . $locale->text('Setup Menu') . qq|</th>
 
 604            <td><input name=menustyle type=radio class=radio value=v3 $menustyle_v3> | .
 
 605            $locale->text("Top (CSS)") . qq|
 
 606            <input name=menustyle type=radio class=radio value=neu $menustyle_neu> | .
 
 607            $locale->text("Top (Javascript)") . qq|
 
 608            <input name=menustyle type=radio class=radio value=old $menustyle_old> | .
 
 609            $locale->text("Old (on the side)") . qq|
 
 612         <input type=hidden name=templates value=$myconfig->{templates}>
 
 616   <tr class=listheading>
 
 617     <th colspan=2>| . $locale->text('Database') . qq|</th>
 
 620   # list section for database drivers
 
 621   foreach $item (User->dbdrivers) {
 
 630     if ($myconfig->{dbdriver} eq $item) {
 
 631       map { $form->{"${item}_$_"} = $myconfig->{$_} }
 
 632         qw(dbhost dbport dbuser dbpasswd dbname sid);
 
 633       $checked = "checked";
 
 637           <th align=right>| . $locale->text('Driver') . qq|</th>
 
 638           <td><input name=dbdriver type=radio class=radio value=$item $checked> $item</td>
 
 639           <th align=right>| . $locale->text('Host') . qq|</th>
 
 640           <td><input name="${item}_dbhost" size=30 value=$form->{"${item}_dbhost"}></td>
 
 646           <th align=right>| . $locale->text('Dataset') . qq|</th>
 
 647           <td><input name=Pg_dbname size=15 value=$form->{Pg_dbname}></td>
 
 648           <th align=right>| . $locale->text('Port') . qq|</th>
 
 649           <td><input name=Pg_dbport size=4 value=$form->{Pg_dbport}></td>
 
 652           <th align=right>| . $locale->text('User') . qq|</th>
 
 653           <td><input name="${item}_dbuser" size=15 value=$form->{"${item}_dbuser"}></td>
 
 654           <th align=right>| . $locale->text('Password') . qq|</th>
 
 655           <td><input name="${item}_dbpasswd" type=password size=10 value=$form->{"${item}_dbpasswd"}></td>
 
 660     if ($item eq 'Oracle') {
 
 662           <th align=right>SID</th>
 
 663           <td><input name=Oracle_sid value=$form->{Oracle_sid}></td>
 
 664           <th align=right>| . $locale->text('Port') . qq|</th>
 
 665           <td><input name=Oracle_dbport size=4 value=$form->{Oracle_dbport}></td>
 
 668           <th align=right>| . $locale->text('Dataset') . qq|</th>
 
 669           <td><input name="${item}_dbuser" size=15 value=$form->{"${item}_dbuser"}></td>
 
 670           <th align=right>| . $locale->text('Password') . qq|</th>
 
 671           <td><input name="${item}_dbpasswd" type=password size=10 value=$form->{"${item}_dbpasswd"}></td>
 
 677         <input type=hidden name=old_dbpasswd value=$myconfig->{dbpasswd}>
 
 682     <td colspan=2><hr size=2 noshade></td>
 
 689   open(FH, $menufile) or $form->error("$menufile : $!");
 
 691   # scan for first menu level
 
 695   if (open(FH, "custom_$menufile")) {
 
 701     next unless $item =~ /\[/;
 
 702     next if $item =~ /\#/;
 
 704     $item =~ s/(\[|\])//g;
 
 708       ($level, $menuitem) = split /--/, $item, 2;
 
 712       push @acsorder, $item;
 
 715     push @{ $acs{$level} }, $menuitem;
 
 719   %role = ('admin'      => $locale->text('Administrator'),
 
 720            'user'       => $locale->text('User'),
 
 721            'manager'    => $locale->text('Manager'),
 
 722            'supervisor' => $locale->text('Supervisor'));
 
 725   foreach $item (qw(user supervisor manager admin)) {
 
 727       ($myconfig->{role} eq $item)
 
 728       ? "<option selected value=$item>$role{$item}\n"
 
 729       : "<option value=$item>$role{$item}\n";
 
 733   <tr class=listheading>
 
 734     <th colspan=2>| . $locale->text('Access Control') . qq|</th>
 
 737     <td><select name=role>$selectrole</select></td>
 
 741   foreach $item (split(/;/, $myconfig->{acs})) {
 
 742     ($key, $value) = split /--/, $item, 2;
 
 743     $excl{$key}{$value} = 1;
 
 746   foreach $key (@acsorder) {
 
 748     $checked = "checked";
 
 749     if ($form->{login}) {
 
 750       $checked = ($excl{$key}{$key}) ? "" : "checked";
 
 753     # can't have variable names with spaces
 
 754     # the 1 is for apache 2
 
 755     $item = $form->escape("${key}--$key", 1);
 
 758     $acsheading =~ s/ / /g;
 
 761     <th align=left><input name="$item" class=checkbox type=checkbox value=1 $checked> $acsheading</th>\n|;
 
 762     $menuitems .= "$item;";
 
 766     foreach $item (@{ $acs{$key} }) {
 
 767       next if ($key eq $item);
 
 769       $checked = "checked";
 
 770       if ($form->{login}) {
 
 771         $checked = ($excl{$key}{$item}) ? "" : "checked";
 
 774       $acsitem = $form->escape("${key}--$item", 1);
 
 777     <br><input name="$acsitem" class=checkbox type=checkbox value=1 $checked> $item|;
 
 778       $menuitems .= "$acsitem;";
 
 785   <tr valign=top>$acsheading $acsdata
 
 790   print qq|<input type=hidden name=acs value="$menuitems">
 
 794       qw(angebote bestellungen rechnungen anfragen lieferantenbestellungen einkaufsrechnungen);
 
 795     foreach $directory (@webdavdirs) {
 
 796       if ($myconfig->{$directory}) {
 
 797         $webdav{"${directory}c"} = "checked";
 
 799         $webdav{"${directory}c"} = "";
 
 804     <td colspan=2><hr size=3 noshade></td>
 
 806   <tr class=listheading>
 
 807     <th colspan=2>| . $locale->text('WEBDAV-Zugriff') . qq|</th>
 
 811         <td><input name=angebote class=checkbox type=checkbox value=1 $webdav{angebotec}> Angebot</td>
 
 812         <td><input name=bestellungen class=checkbox type=checkbox value=1 $webdav{bestellungenc}> Bestellung</td>
 
 813         <td><input name=rechnungen class=checkbox type=checkbox value=1 $webdav{rechnungenc}> Rechnung</td>
 
 816         <td><input name=anfragen class=checkbox type=checkbox value=1 $webdav{anfragenc}> Angebot</td>
 
 817         <td><input name=lieferantenbestellungen class=checkbox type=checkbox value=1 $webdav{lieferantenbestellungenc}> Lieferantenbestellung</td>
 
 818         <td><input name=einkaufsrechnungen class=checkbox type=checkbox value=1 $webdav{einkaufsrechnungenc}> Einkaufsrechnung</td>
 
 822     <td colspan=2><hr size=3 noshade></td>
 
 836   $form->error($locale->text('Database Driver not checked!'))
 
 837     unless $form->{dbdriver};
 
 839   # no spaces allowed in login name
 
 840   ($form->{login}) = split / /, $form->{login};
 
 842   $form->isblank("login", $locale->text('Login name missing!'));
 
 844   # check for duplicates
 
 845   if (!$form->{edit}) {
 
 846     $temp = new User "$memberfile", "$form->{login}";
 
 848     if ($temp->{login}) {
 
 849       $form->error("$form->{login} " . $locale->text('is already a member!'));
 
 853   # no spaces allowed in directories
 
 854   ($form->{newtemplates}) = split / /, $form->{newtemplates};
 
 856   if ($form->{newtemplates}) {
 
 857     $form->{templates} = $form->{newtemplates};
 
 860       ($form->{usetemplates}) ? $form->{usetemplates} : $form->{login};
 
 864   if (!-d "$templates") {
 
 865     $form->error(  $locale->text('Directory')
 
 867                  . $locale->text('does not exist'));
 
 870   # add base directory to $form->{templates}
 
 871   $form->{templates} = "$templates/$form->{templates}";
 
 873   $myconfig = new User "$memberfile", "$form->{login}";
 
 875   # redo acs variable and delete all the acs codes
 
 876   @acs = split(/;/, $form->{acs});
 
 879   foreach $item (@acs) {
 
 880     $item = $form->escape($item, 1);
 
 882     if (!$form->{$item}) {
 
 883       $form->{acs} .= $form->unescape($form->unescape($item)) . ";";
 
 885     delete $form->{$item};
 
 888   # check which database was filled in
 
 889   if ($form->{dbdriver} eq 'Oracle') {
 
 890     $form->{sid}      = $form->{Oracle_sid},;
 
 891     $form->{dbhost}   = $form->{Oracle_dbhost},;
 
 892     $form->{dbport}   = $form->{Oracle_dbport};
 
 893     $form->{dbpasswd} = $form->{Oracle_dbpasswd};
 
 894     $form->{dbuser}   = $form->{Oracle_dbuser};
 
 895     $form->{dbname}   = $form->{Oracle_dbuser};
 
 897     $form->isblank("dbhost", $locale->text('Hostname missing!'));
 
 898     $form->isblank("dbport", $locale->text('Port missing!'));
 
 899     $form->isblank("dbuser", $locale->text('Dataset missing!'));
 
 901   if ($form->{dbdriver} eq 'Pg') {
 
 902     $form->{dbhost}   = $form->{Pg_dbhost};
 
 903     $form->{dbport}   = $form->{Pg_dbport};
 
 904     $form->{dbpasswd} = $form->{Pg_dbpasswd};
 
 905     $form->{dbuser}   = $form->{Pg_dbuser};
 
 906     $form->{dbname}   = $form->{Pg_dbname};
 
 908     $form->isblank("dbname", $locale->text('Dataset missing!'));
 
 909     $form->isblank("dbuser", $locale->text('Database User missing!'));
 
 914       qw(angebote bestellungen rechnungen anfragen lieferantenbestellungen einkaufsrechnungen);
 
 915     foreach $directory (@webdavdirs) {
 
 916       if ($form->{$directory}) {
 
 917         $form->{$directory} = $form->{$directory};
 
 919         $form->{$directory} = 0;
 
 924   foreach $item (keys %{$form}) {
 
 925     $myconfig->{$item} = $form->{$item};
 
 928   delete $myconfig->{stylesheet};
 
 929   if ($form->{userstylesheet}) {
 
 930     $myconfig->{stylesheet} = $form->{userstylesheet};
 
 933   $myconfig->save_member($memberfile, $userspath);
 
 937       qw(angebote bestellungen rechnungen anfragen lieferantenbestellungen einkaufsrechnungen);
 
 938     foreach $directory (@webdavdirs) {
 
 939       $file = "webdav/" . $directory . "/webdav-user";
 
 940       if ($form->{$directory}) {
 
 941         if (open(HTACCESS, "$file")) {
 
 943             ($login, $password) = split(/:/, $_);
 
 944             if ($login ne $form->{login}) {
 
 950         open(HTACCESS, "> $file") or die "cannot open $file $!\n";
 
 951         $newfile .= $myconfig->{login} . ":" . $myconfig->{password} . "\n";
 
 952         print(HTACCESS $newfile);
 
 955         $form->{$directory} = 0;
 
 956         if (open(HTACCESS, "$file")) {
 
 958             ($login, $password) = split(/:/, $_);
 
 959             if ($login ne $form->{login}) {
 
 965         open(HTACCESS, "> $file") or die "cannot open $file $!\n";
 
 966         print(HTACCESS $newfile);
 
 972   # create user template directory and copy master files
 
 973   if (!-d "$form->{templates}") {
 
 976     if (mkdir "$form->{templates}", oct("771")) {
 
 980       # copy templates to the directory
 
 981       opendir TEMPLATEDIR, "$templates/." or $form - error("$templates : $!");
 
 982       @templates = grep /$form->{mastertemplates}.*?\.(html|tex|sty|xml|txb)$/,
 
 984       closedir TEMPLATEDIR;
 
 986       foreach $file (@templates) {
 
 987         open(TEMP, "$templates/$file")
 
 988           or $form->error("$templates/$file : $!");
 
 990         $file =~ s/$form->{mastertemplates}-//;
 
 991         open(NEW, ">$form->{templates}/$file")
 
 992           or $form->error("$form->{templates}/$file : $!");
 
 994         while ($line = <TEMP>) {
 
1001       $form->error("$!: $form->{templates}");
 
1005   $form->redirect($locale->text('User saved!'));
 
1011   $form->{templates} =
 
1012     ($form->{templates})
 
1013     ? "$templates/$form->{templates}"
 
1014     : "$templates/$form->{login}";
 
1016   $form->error($locale->text('File locked!')) if (-f ${memberfile} . LCK);
 
1017   open(FH, ">${memberfile}.LCK") or $form->error("${memberfile}.LCK : $!");
 
1020   open(CONF, "+<$memberfile") or $form->error("$memberfile : $!");
 
1027   while ($line = shift @config) {
 
1029     if ($line =~ /^\[/) {
 
1030       last if ($line =~ /\[$form->{login}\]/);
 
1031       $login = &login_name($line);
 
1034     if ($line =~ /^templates=/) {
 
1035       $user{$login} = &get_value($line);
 
1041   # remove everything up to next login or EOF
 
1042   # and save template variable
 
1043   while ($line = shift @config) {
 
1044     if ($line =~ /^templates=/) {
 
1045       $templatedir = &get_value($line);
 
1047     last if ($line =~ /^\[/);
 
1050   # this one is either the next login or EOF
 
1053   $login = &login_name($line);
 
1055   while ($line = shift @config) {
 
1056     if ($line =~ /^\[/) {
 
1057       $login = &login_name($line);
 
1060     if ($line =~ /^templates=/) {
 
1061       $user{$login} = &get_value($line);
 
1068   unlink "${memberfile}.LCK";
 
1070   # scan %user for $templatedir
 
1071   foreach $login (keys %user) {
 
1072     last if ($found = ($templatedir eq $user{$login}));
 
1075   # if found keep directory otherwise delete
 
1078     # delete it if there is a template directory
 
1079     $dir = "$form->{templates}";
 
1081       unlink <$dir/*.html>;
 
1082       unlink <$dir/*.tex>;
 
1083       unlink <$dir/*.sty>;
 
1088   # delete config file for user
 
1089   unlink "$userspath/$form->{login}.conf";
 
1091   $form->redirect($locale->text('User deleted!'));
 
1098   $login =~ s/\[\]//g;
 
1099   return ($login) ? $login : undef;
 
1106   my ($null, $value) = split(/=/, $line, 2);
 
1109   $value =~ s/\s#.*//g;
 
1111   # remove any trailing whitespace
 
1112   $value =~ s/^\s*(.*?)\s*$/$1/;
 
1117 sub change_admin_password {
 
1121     . $locale->text('Administration') . " / "
 
1122     . $locale->text('Change Admin Password');
 
1130 <h2>| . $locale->text('Change Admin Password') . qq|</h2>
 
1132 <form method=post action=$form->{script}>
 
1136     <td><b>| . $locale->text('Password') . qq|</b></td>
 
1137     <td><input type=password name=password size=8></td>
 
1140     <td><b>| . $locale->text('Repeat the password') . qq|</b></td>
 
1141     <td><input type=password name=password_again size=8></b></td>
 
1145 <input type=hidden name=path value=$form->{path}>
 
1146 <input type=hidden name=rpw value=$form->{rpw}>
 
1149 <input type=submit class=submit name=action value="|
 
1150     . $locale->text('Change Password') . qq|">
 
1160 sub change_password {
 
1161   if ($form->{"password"} ne $form->{"password_again"}) {
 
1164       . $locale->text('Administration') . " / "
 
1165       . $locale->text('Change Admin Password');
 
1173 <h2>| . $locale->text('Change Admin Password') . qq|</h2>
 
1175 <p>| . $locale->text("The passwords do not match.") . qq|<br>
 
1176 <input type="button" onclick="history.back()" value="| . $locale->text("Back") . qq|">|;
 
1180   $root->{password} = $form->{password};
 
1182   $root->{'root login'} = 1;
 
1183   $root->save_member($memberfile);
 
1186     "$form->{script}?action=list_users&path=$form->{path}&rpw=$root->{password}";
 
1188   $form->redirect($locale->text('Password changed!'));
 
1192 sub check_password {
 
1193   $root = new User "$memberfile", $form->{root};
 
1195   if (!defined($root->{password}) || ($root->{password} ne $form->{rpw})) {
 
1196     $form->error($locale->text('Incorrect Password!'));
 
1201 sub pg_database_administration {
 
1203   $form->{dbdriver} = 'Pg';
 
1208 sub oracle_database_administration {
 
1210   $form->{dbdriver} = 'Oracle';
 
1215 sub dbdriver_defaults {
 
1217   # load some defaults for the selected driver
 
1219                      'Pg' => { dbport        => '5432',
 
1220                                dbuser        => 'postgres',
 
1221                                dbdefault     => 'template1',
 
1222                                dbhost        => 'localhost',
 
1223                                connectstring => $locale->text('Connect to')
 
1225                      'Oracle' => { dbport        => '1521',
 
1228                                    dbhost        => `hostname`,
 
1229                                    connectstring => 'SID'
 
1232   map { $form->{$_} = $driverdefaults{ $form->{dbdriver} }{$_} }
 
1233     keys %{ $driverdefaults{Pg} };
 
1237 sub dbselect_source {
 
1243     'Leave host and port field empty unless you want to make a remote connection.'
 
1247            'You must enter a host and port for local and remote connections!');
 
1250     "Lx-Office ERP / " . $locale->text('Database Administration');
 
1259 <h2>$form->{title}</h2>
 
1261 <form method=post action=$form->{script}>
 
1268   <tr class=listheading>
 
1269     <th colspan=4>| . $locale->text('Database') . qq|</th>
 
1272 <input type=hidden name=dbdriver value=$form->{dbdriver}>
 
1279     <th align=right>| . $locale->text('Host') . qq|</th>
 
1280     <td><input name=dbhost size=25 value=$form->{dbhost}></td>
 
1281     <th align=right>| . $locale->text('Port') . qq|</th>
 
1282     <td><input name=dbport size=5 value=$form->{dbport}></td>
 
1288     <th align=right>| . $locale->text('User') . qq|</th>
 
1289     <td><input name=dbuser size=10 value=$form->{dbuser}></td>
 
1290     <th align=right>| . $locale->text('Password') . qq|</th>
 
1291     <td><input type=password name=dbpasswd size=10></td>
 
1297     <th align=right>$form->{connectstring}</th>
 
1298     <td colspan=3><input name=dbdefault size=10 value=$form->{dbdefault}></td>
 
1307 <input name=callback type=hidden value="$form->{script}?action=list_users&path=$form->{path}&rpw=$form->{rpw}">
 
1308 <input type=hidden name=path value=$form->{path}>
 
1309 <input type=hidden name=rpw value=$form->{rpw}>
 
1313 <input type=submit class=submit name=action value="|
 
1314     . $locale->text('Create Dataset') . qq|">|;
 
1315 # Vorübergehend Deaktiviert
 
1316 # <input type=submit class=submit name=action value="|
 
1317 #     . $locale->text('Update Dataset') . qq|">
 
1318 print qq| <input type=submit class=submit name=action value="|
 
1319     . $locale->text('Delete Dataset') . qq|">
 
1328     'This is a preliminary check for existing sources. Nothing will be created or deleted at this stage!'
 
1332 <br>$msg{$form->{dbdriver}}
 
1343   &{ $form->{nextsub} };
 
1347 sub update_dataset {
 
1349   %needsupdate = User->dbneedsupdate(\%$form);
 
1353     . $locale->text('Database Administration') . " / "
 
1354     . $locale->text('Update Dataset');
 
1363 <h2>$form->{title}</h2>
 
1366   foreach $key (sort keys %needsupdate) {
 
1367     if ($needsupdate{$key} ne $form->{dbversion}) {
 
1368       $upd .= qq|<input id="$field_id" name="db$key" type="checkbox" value="1" checked> $key\n|;
 
1369       $form->{dbupdate} .= "db$key ";
 
1374   chop $form->{dbupdate};
 
1376   if ($form->{dbupdate}) {
 
1380 <form method=post action=$form->{script}>
 
1382 <input type=hidden name=dbdriver value=$form->{dbdriver}>
 
1383 <input type=hidden name=dbhost value=$form->{dbhost}>
 
1384 <input type=hidden name=dbport value=$form->{dbport}>
 
1385 <input type=hidden name=dbuser value=$form->{dbuser}>
 
1386 <input type=hidden name=dbpasswd value=$form->{dbpasswd}>
 
1387 <input type=hidden name=dbdefault value=$form->{dbdefault}>
 
1389 <tr class=listheading>
 
1390   <th>| . $locale->text('The following Datasets need to be updated') . qq|</th>
 
1402 <input name=dbupdate type=hidden value="$form->{dbupdate}">
 
1404 <input name=callback type=hidden value="$form->{script}?action=list_users&path=$form->{path}&rpw=$form->{rpw}">
 
1406 <input type=hidden name=path value=$form->{path}>
 
1407 <input type=hidden name=rpw value=$form->{rpw}>
 
1409 <input type=hidden name=nextsub value=dbupdate>
 
1414 <input type=submit class=submit name=action value="|
 
1415       . $locale->text('Continue') . qq|">
 
1424     print $locale->text('All Datasets up to date!');
 
1437   $form->{"stylesheet"} = "lx-office-erp.css";
 
1438   $form->{"title"} = $main::locale->text("Dataset upgrade");
 
1442          map({ s/\s//g; s/^db//; $_; }
 
1443              grep({ $form->{$_} }
 
1444                   split(/\s+/, $form->{"dbupdate"}))));
 
1445   print($form->parse_html_template("dbupgrade/header",
 
1446                                    { "dbname" => $dbname }));
 
1448   User->dbupdate(\%$form);
 
1453 | . $locale->text('Dataset updated!') . qq|
 
1457 <a id="enddatasetupdate" href="admin.pl?action=login&| .
 
1458 join("&", map({ "$_=" . $form->escape($form->{$_}); } qw(path rpw))) .
 
1459 qq|">| . $locale->text("Continue") . qq|</a>|;
 
1463 sub create_dataset {
 
1465   foreach $item (sort User->dbsources(\%$form)) {
 
1466     $dbsources .= "[$item] ";
 
1469   opendir SQLDIR, "sql/." or $form - error($!);
 
1470   foreach $item (sort grep /-chart\.sql/, readdir SQLDIR) {
 
1471     next if ($item eq 'Default-chart.sql');
 
1472     $item =~ s/-chart\.sql//;
 
1474       qq| <input name=chart class=radio type=radio value="$item"> $item|;
 
1478   $selectencoding = qq|<option>
 
1479   <option value=SQL_ASCII>ASCII
 
1480   <option value=EUC_JP>Japanese Extended UNIX Code
 
1481   <option value=EUC_CN>Chinese Extended UNIX Code
 
1482   <option value=EUC_KR>Korean Extended UNIX Code
 
1483   <option value=EUC_TW>Taiwan Extended UNIX Code
 
1484   <option value=UNICODE>UTF-8 Unicode
 
1485   <option value=MULE_INTERNAL>Mule internal type
 
1486   <option value=LATIN1>ISO 8859-1
 
1487   <option value=LATIN2>ISO 8859-2
 
1488   <option value=LATIN3>ISO 8859-3
 
1489   <option value=LATIN4>ISO 8859-4
 
1490   <option value=LATIN5>ISO 8859-5
 
1491   <option value=KOI8>KOI8-R
 
1492   <option value=WIN>Windows CP1251
 
1493   <option value=ALT>Windows CP866
 
1498     . $locale->text('Database Administration') . " / "
 
1499     . $locale->text('Create Dataset');
 
1508 <h2>$form->{title}</h2>
 
1510 <form method=post action=$form->{script}>
 
1513   <tr class=listheading>
 
1514     <th colspan=2> </th>
 
1519     <th align=right nowrap>| . $locale->text('Existing Datasets') . qq|</th>
 
1526     <th align=right nowrap>| . $locale->text('Create Dataset') . qq|</th>
 
1527     <td><input name=db></td>
 
1533     <th align=right nowrap>| . $locale->text('Multibyte Encoding') . qq|</th>
 
1534     <td><select name=encoding>$selectencoding</select></td>
 
1540     <th align=right nowrap>|
 
1541     . $locale->text('Create Chart of Accounts') . qq|</th>
 
1548 <input type=hidden name=dbdriver value=$form->{dbdriver}>
 
1549 <input type=hidden name=dbuser value=$form->{dbuser}>
 
1550 <input type=hidden name=dbhost value=$form->{dbhost}>
 
1551 <input type=hidden name=dbport value=$form->{dbport}>
 
1552 <input type=hidden name=dbpasswd value=$form->{dbpasswd}>
 
1553 <input type=hidden name=dbdefault value=$form->{dbdefault}>
 
1555 <input name=callback type=hidden value="$form->{script}?action=list_users&path=$form->{path}&rpw=$form->{rpw}">
 
1557 <input type=hidden name=path value=$form->{path}>
 
1558 <input type=hidden name=rpw value=$form->{rpw}>
 
1560 <input type=hidden name=nextsub value=dbcreate>
 
1565 <input type=submit class=submit name=action value="|
 
1566     . $locale->text('Continue') . qq|">
 
1582   $form->isblank("db", $locale->text('Dataset missing!'));
 
1584   User->dbcreate(\%$form);
 
1588     . $locale->text('Database Administration') . " / "
 
1589     . $locale->text('Create Dataset');
 
1598 <h2>$form->{title}</h2>
 
1600 <form method=post action=$form->{script}>|
 
1602     . $locale->text('Dataset')
 
1604     . $locale->text('successfully created!')
 
1608 <input type=hidden name=path value="$form->{path}">
 
1609 <input type=hidden name=rpw value="$form->{rpw}">
 
1611 <input type=hidden name=nextsub value=list_users>
 
1613 <p><input type=submit class=submit name=action value="|
 
1614     . $locale->text('Continue') . qq|">
 
1624 sub delete_dataset {
 
1626   if (@dbsources = User->dbsources_unused(\%$form, $memberfile)) {
 
1627     foreach $item (sort @dbsources) {
 
1629         qq|<input name=db class=radio type=radio value=$item> $item |;
 
1632     $form->error($locale->text('Nothing to delete!'));
 
1637     . $locale->text('Database Administration') . " / "
 
1638     . $locale->text('Delete Dataset');
 
1645 <h2>$form->{title}</h2>
 
1647 <form method=post action=$form->{script}>
 
1650   <tr class=listheading>
 
1652     . $locale->text('The following Datasets are not in use and can be deleted')
 
1664 <input type=hidden name=dbdriver value=$form->{dbdriver}>
 
1665 <input type=hidden name=dbuser value=$form->{dbuser}>
 
1666 <input type=hidden name=dbhost value=$form->{dbhost}>
 
1667 <input type=hidden name=dbport value=$form->{dbport}>
 
1668 <input type=hidden name=dbpasswd value=$form->{dbpasswd}>
 
1669 <input type=hidden name=dbdefault value=$form->{dbdefault}>
 
1671 <input name=callback type=hidden value="$form->{script}?action=list_users&path=$form->{path}&rpw=$form->{rpw}">
 
1673 <input type=hidden name=path value="$form->{path}">
 
1674 <input type=hidden name=rpw value="$form->{rpw}">
 
1676 <input type=hidden name=nextsub value=dbdelete>
 
1681 <input type=submit class=submit name=action value="|
 
1682     . $locale->text('Continue') . qq|">
 
1698     $form->error($locale->text('No Dataset selected!'));
 
1701   User->dbdelete(\%$form);
 
1705     . $locale->text('Database Administration') . " / "
 
1706     . $locale->text('Delete Dataset');
 
1715 <h2>$form->{title}</h2>
 
1717 <form method=post action=$form->{script}>
 
1719 $form->{db} | . $locale->text('successfully deleted!')
 
1723 <input type=hidden name=path value="$form->{path}">
 
1724 <input type=hidden name=rpw value="$form->{rpw}">
 
1726 <input type=hidden name=nextsub value=list_users>
 
1728 <p><input type=submit class=submit name=action value="|
 
1729     . $locale->text('Continue') . qq|">
 
1741   unlink "$userspath/nologin";
 
1744     "$form->{script}?action=list_users&path=$form->{path}&rpw=$root->{password}";
 
1746   $form->redirect($locale->text('Lockfile removed!'));
 
1752   open(FH, ">$userspath/nologin")
 
1753     or $form->error($locale->text('Cannot create Lock!'));
 
1757     "$form->{script}?action=list_users&path=$form->{path}&rpw=$root->{password}";
 
1759   $form->redirect($locale->text('Lockfile created!'));