#!/usr/bin/perl

# Dieses Skript erzeugt die Datei .htaccess, die Userdatei .htpasswd und 
# eine Datei namens .adminpasswd mit dem Adminpasswort. 
# Des weiteren werden die Pfade im CGI-Skript htpasswd.cgi angepasst. 
# Danach koennen die User interaktiv per Formular und den CGI-Skript 
# htpasswd.cgi verwaltet werden.
# der Administrator wird als User "admin" mit dem unten anzugebenden
# AdminPasswort in die Datei .htpasswd eingetragen. Das Passwort
# muss bei jeder Aktion angegeben werden.
#
# Wichtig: Benutzer und Gruppe fuer die Dateien muessen anschliessend
# noch gesetzt werden:
#
# .htaccess:    beliebig, jedoch nicht die Userkennung des Webservers
# .htpasswd:    Userkennung des Webservers
#
# Alle unten angegebenen Verzeichnisse muessen existieren!

# Folgende Variablen muessen angepasst werden:
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# Der volle Systempfad zur Datei .htaccess einschliesslich dem Dateinamen selbst
# Sie liegt im zu schuetzenden Verzeichnis.
my $AuthAccessFile = "/opt/www/htdocs/privat/.htaccess";

# Der volle Systempfad zur Datei .htpasswd einschliesslich dem Dateinamen selbst
my $AuthUserFile = "/opt/www/etc/.htpasswd";

# Das Admin-Passwort
my $AdminPassword = "TopSecret";

# Ueberschrift der Passwortabfrage-Box fuer das geschuetzte Verzeichnis
my $AuthName = "Privatbereich";

# Der volle Systempfad zum Standard-Mailprogramm (meist sendmail)
my $mailprog = "/usr/lib/sendmail";

# Die E-Mail-Addresse des Webmasters
my $yourmail = "webmaster\@SOMEDOMAIN.XX";

# Das Skript schickt eine E-Mail wenn jemand ein falsches Admin-Passwort 
# eingegeben hat. (n=nein, y=ja)
my $alert = "y";

# CGI-Skript-Datei htpasswd.cgi
my $CGIFile = "./htpasswd.cgi";

# Nothing to be changed below
#######################################################################
my $password = '';
my $flag = 'n';
my $line = '';

print "Htpasswd Manager Setup\n";

# .htaccess erzeugen
open (HTACCESS, ">$AuthAccessFile") || &error($AuthAccessFile . " kann nicht angelegt werden!");
# Pfad zum AuthUserFile
print HTACCESS "AuthUserFile $AuthUserFile\n";
# Pfad zum AuthGroupFile - nicht benoetigt
print HTACCESS "AuthGroupFile /dev/null\n";
# Angezeigte Abfrage bei Aufruf
print HTACCESS "AuthName $AuthName\n";
print HTACCESS "AuthType Basic\n";
# Limitations - hier gueltiger User
print HTACCESS "<Limit GET>\n";
print HTACCESS "require valid-user\n";
print HTACCESS "</Limit>\n";
close (HTACCESS);
chmod 0644, $AuthAccessFile;
print "... Datei $AuthAccessFile wurde erzeugt.\n";

# .htpasswd erzeugen
open (HTACCESS, ">$AuthUserFile") || &error($AuthUserFile . " kann nicht angelegt werden!");
$password = crypt($AdminPassword, "JP");	
print HTACCESS "admin:$password\n";
close (HTACCESS);
chmod 0644, $AuthUserFile;
print "... Datei $AuthUserFile wurde erzeugt.\n";
print "... (User \"admin\" mit Addminpasswort eingetragen.)\n";

# htpasswd.cgi anpassen
open (TMP1, "<$CGIFile") || &error($CGIFile . " kann nicht gelesen werden!");
open (TMP2, ">/tmp/htaccess-setup.tmp") || &error("htaccess-setup.tmp kann nicht angelegt werden!");

print TMP2 "#!/usr/bin/perl\n\n";
print TMP2 "# Der volle Systempfad zur Datei .htaccess einschliesslich dem Dateinamen selbst\n";
print TMP2 "my $AuthUserFile = \"$AuthUserFile\";\n";
print TMP2 "\n";
print TMP2 "# Der volle Systempfad zur Datei .adminpasswd einschliesslich dem Dateinamen selbst\n";
print TMP2 "my \$AdminFile = \"$AdminFile\";\n";
print TMP2 "\n";
print TMP2 "# Ueberschrift der Passwortabfrage-Box fuer das geschuetzte Verzeichnis\n";
print TMP2 "my \$AuthName = \"$AuthName\";\n";
print TMP2 "\n";
print TMP2 "# Der volle Systempfad zum Standard-Mailprogramm (meist sendmail)\n";
print TMP2 "my \$mailprog = \"$mailprog\";\n";
print TMP2 "\n";
print TMP2 "# Die E-Mail-Addresse des Webmasters\n";
print TMP2 "my \$yourmail = \"$yourmail\";\n";
print TMP2 "\n";
print TMP2 "# Das Skript schickt eine E-Mail wenn jemand ein falsches Admin-Passwort \n";
print TMP2 "# eingegeben hat. (n=nein, y=ja)\n";
print TMP2 "my \$alert = \"$alert\";\n";
print TMP2 "\n";

while (<TMP1>)
  {
  $line = $_;
  if ($line =~ /# Nothing to be changed below/) { $flag = "y"; }
  if ($flag eq "y") { print TMP2 $line; }
  }
close(TMP1);
close(TMP2);

open (TMP1, "</tmp/htaccess-setup.tmp") || &error("htaccess-setup.tmp kann nicht gelesen werden!");
open (TMP2, ">$CGIFile") || &error($CGIFile . " kann nicht angelegt werden!");
while (<TMP1>)
  {
  print TMP2 $_;
  }
close(TMP1);
close(TMP2);
unlink ("/tmp/htaccess-setup.tmp");
chmod 755, $CGIFile;
print "... $CGIFile wurde angepasst!\n";
print "... Das waers!\n\n";
exit;

sub error
  {
  my $errors = $_[0];
  print "*** Fehler aufgetreten:\n$errors\n$!\n";
  exit;
  }

