[1]  #!/usr/bin/perl

     # Gstebuch fr das World Wide Web
     # Erstellt von Matt Wright           Version 2.2
     # Erstellt am: 21.4.95      Letzte nderung: 19.12.96

[2]  # Variablen setzen
     $guestbookurl = "http://ihr.host.com/~ihrname/guestbook.html";
     $guestbookreal = "/heim/ihrname/public_html/guestbook.html";
     $guestlog = "/heim/ihrname/public_html/guestlog.html";
     $cgiurl = "http://ihr.host.com/cgi-bin/guestbook.pl";
     $date_command = "/usr/bin/date";

[3]  # Setzen Sie Ihre Optionen:
     $mail = 0;              # 1 = Ja; 0 = Nein
     $uselog = 1;            # 1 = Ja; 0 = Nein
     $linkmail = 0;          # 1 = Ja; 0 = Nein
     $separator = 1;         # 1 = <hr>; 0 = <p>
     $redirection = 0;       # 1 = Ja; 0 = Nein
     $entry_order = 1;       # 1 = Neueste Eintrge zuerst;
                             # 0 = Neueste Eintrge zuletzt.
     $remote_mail = 0;       # 1 = Ja; 0 = Nein

[4]  ##############
     # Wenn Sie fr $mail oder $remote_mail 1 antworten, dann
     # mssen Sie die folgenden Variablen ausfllen:

     $mailprog = '/usr/lib/sendmail';
     $recipient = 'sie@ihr.com';

     # Das Datum fr die Eingabe holen
     $date = `$date_command +"%A, %B %d, %Y at %T (%Z)"`;
        chop($date);

     $shortdate = `$date_command +"%D %T %Z"`;
        chop($shortdate);

[5]  # Die Eingabe holen
     read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

     # Die Name/Werte-Paare splitten
     @pairs = split(/&/, $buffer);

     foreach $pair (@pairs)
     {
         ($name, $value) = split(/=/, $pair);

         # Entweben von Plus-Zeichen und %-Dekodierung
         $value =~ tr/+/ /;
         $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

         $FORM{$name} = $value;
     }

[6]  # Die Unterprogramme fr fehlende Antworten ausgeben
     &no_comments unless $FORM{'comments'};
     &no_name unless $FORM{'realname'};

[7]  # Anfang der Bearbeitung der Gstebuch-Datei
     open (FILE,"$guestbookreal");
     @LINES=<FILE>;
     close(FILE);
     $SIZE=@LINES;

     # ffnen der Link-Datei fr die Ausgabe
     open (GUEST,">$guestbookreal");

     for ($i=0;$i<=$SIZE;$i++) {
        $_=$LINES[$i];
        if (/<!--begin-->/) { 

           if ($entry_order eq '1') {
              print GUEST "<!--begin-->\n";
           }

           $FORM{'comments'} =~ s/\cM\n/<br>\n/g;

           print GUEST "<b>$FORM{'comments'}</b><br>\n";

           if ($FORM{'url'}) {
              print GUEST "<a href=\"$FORM{'url'}\">$FORM{'realname'}</a>";

           }
           else {
              print GUEST "$FORM{'realname'}";
           }

           if ( $FORM{'username'} ){
              if ($linkmail eq '1') {
                 print GUEST " \&lt;<a href=\"mailto:$FORM{'username'}\">";
                 print GUEST "$FORM{'username'}</a>\&gt;";
              }
              else {
                 print GUEST " &lt;$FORM{'username'}&gt;";
              }
           }

           print GUEST "<br>\n";

           if ( $FORM{'city'} ){
              print GUEST "$FORM{'city'},";
           }
     
           if ( $FORM{'state'} ){
              print GUEST " $FORM{'state'}";
           }

           if ( $FORM{'country'} ){
              print GUEST " $FORM{'country'}";
           }

           if ($separator eq '1') {
              print GUEST " - $date<hr>\n\n";
           }
           else {
              print GUEST " - $date<p>\n\n";
           }

           if ($entry_order eq '0') {
              print GUEST "<!--begin-->\n";
           }

        }
        else {
           print GUEST $_;
        }
     }

     close (GUEST);

     # Die Eingabe protokollieren
     if ($uselog eq '1') {
        &log(entry);
     }


     #########
     # Optionen

[8] # Mail Option
     if ($mail eq '1') {
        open (MAIL, "|$mailprog $recipient") || die "Kann nicht ffnen $mailprog!\n";

        print MAIL "Antwort an: $FORM{'username'} ($FORM{'realname'})\n";
        print MAIL "Von: $FORM{'username'} ($FORM{'realname'})\n";
        print MAIL "Betreff: Eintrag im Gstebuch\n\n";
        print MAIL "Sie haben einen neuen Eintrag in Ihrem Gstebuch:\n\n";
        print MAIL "------------------------------------------------------\n";
        print MAIL "$FORM{'comments'}\n";
        print MAIL "$FORM{'realname'}";

        if ( $FORM{'username'} ){
           print MAIL " <$FORM{'username'}>";
        }

        print MAIL "\n";

        if ( $FORM{'city'} ){
           print MAIL "$FORM{'city'},";
        }

        if ( $FORM{'state'} ){
           print MAIL " $FORM{'state'}";
        }

        if ( $FORM{'country'} ){
          print MAIL " $FORM{'country'}";
        }

        print MAIL " - $date\n";
        print MAIL "------------------------------------------------------\n";

        close (MAIL);
     }

[9] if ($remote_mail eq '1' && $FORM{'username'}) {
        open (MAIL, "|$mailprog -t") || die "Kann nicht ffnen $mailprog!\n";

        print MAIL "An: $FORM{'username'}\n";
        print MAIL "Von: $recipient\n";
        print MAIL "Betreff: Eintrag im Gstebuch\n\n";
        print MAIL "Danke fr den Eintrag in meinem Gstebuch.\n\n";
        print MAIL "------------------------------------------------------\n";
        print MAIL "$FORM{'comments'}\n";
        print MAIL "$FORM{'realname'}";

        if ( $FORM{'username'} ){
           print MAIL " <$FORM{'username'}>";
        }

        print MAIL "\n";

        if ( $FORM{'city'} ){
           print MAIL "$FORM{'city'},";
        }

        if ( $FORM{'state'} ){
           print MAIL " $FORM{'state'}";
        }

        if ( $FORM{'country'} ){
          print MAIL " $FORM{'country'}";
        }

        print MAIL " - $date\n";
        print MAIL "------------------------------------------------------\n";

        close (MAIL);
     }

[10] # Das Initial Output Location Heading ausgeben
     if ($redirection eq '1') {
        print "Location: $server$guestbookurl\n\n";
     }
     else { 
        &no_redirection;
     }

     #######################
     # Unterprogramme

[11] sub no_comments {
        print "Content-type: text/html\n\n";
        print "<html><head><title>Kein Kommentar</title></head>\n";

        print "<body><h1>Ihr Kommentar scheint leer zu sein</h1>\n";
        print "Der Kommentarteil zum Ausfllen im Gstebuch scheint\n";
        print "leer zu sein und daher war das Hinzufgen in das Gstebuch\n";
        print "nicht mglich. Bitte geben Sie Ihre Kommentare unten ein.<p>\n";
        print "<form method=POST action=\"$server$cgiurl\">\n";
        print "Ihr Name:<input type=text name=\"realname\" size=30 ";
        print "value=\"$FORM{'realname'}\"><br>\n";
        print "E-Mail: <input type=text name=\"username\""; 
          print "value=\"$FORM{'username'}\" size=40><br>\n";
        print "Plz: <input type=text name=\"city\" value=\"$FORM{'city'}\" ";
        print "size=15>, Stadt: <input type=text name=\"state\" "; 
          print "value=\"$FORM{'state'}\" size=15> Land: <input type=text "; 
        print "name=\"country\" value=\"$FORM{'country'}\" size=15><p>\n";
        print "Kommentare:<br>\n";
        print "<textarea name=\"comments\" COLS=60 ROWS=4></textarea><p>\n";
        print "<input type=submit> * <input type=reset></form><hr>\n";
        print "Zurck zum <a href=\"$server$guestbookurl\">Guestbook</a>.";
        print "\n</body></html>\n";

        # Die Fehler protokollieren
        if ($uselog eq '1') {
           &log(no_comments);
        }

        exit;
     }

[12] sub no_name {
        print "Content-type: text/html\n\n";
        print "<html><head><title>Kein Name</title></head>\n";
        print "<body><h1>Das Feld mit Ihrem Namen scheint leer zu sein</h1>\n";
        print "Das Feld mit Ihrem Namen in ausgefllten Gstebuch-Form scheint\n";
        print "leer zu sein und daher wurde Ihr Gstebucheintrag nicht hinzuge-\n";
        print "fgt. Bitte geben Sie Ihren Namen im leeren Feld unten ein.<p>\n";
        print "<form method=POST action=\"$server$cgiurl\">\n";
        print "Ihr Name:<input type=text name=\"realname\" size=30><br>\n";
        print "E-Mail: <input type=text name=\"username\"";
          print " value=\"$FORM{'username'}\" size=40><br>\n";
        print "Plz: <input type=text name=\"city\" value=\"$FORM{'city'}\" ";
          print "size=15>, Stadt: <input type=text name=\"state\" ";
        print "value=\"$FORM{'state'}\" size=2> Land: <input type=text ";
        print "value=Deutschland name=\"country\" value=\"$FORM{'country'}\" ";
        print "size=15><p>\n";
        print "Kommentare wurden beibehalten.<p>\n";
        print "<input type=hidden name=\"comments\" ";
          print "value=\"$FORM{'comments'}\">\n";
        print "<input type=submit> * <input type=reset><hr>\n";

        print "Zurck zum <a href=\"$server$guestbookurl\">Guestbook</a>.";
        print "\n</body></html>\n";

        # Die Fehler protokollieren
        if ($uselog eq '1') {
           &log(no_name);
        }

        exit;
     }

[13] # Die Eingabe oder Fehler protokollieren
     sub log {
        $log_type = $_[0];
        open (LOG, ">>$guestlog");
        if ($log_type eq 'entry') {
           print LOG "$ENV{'REMOTE_HOST'} - [$shortdate]\n";
        }
        elsif ($log_type eq 'no_name') {
           print LOG "$ENV{'REMOTE_HOST'} - [$shortdate] - ERR: Kein Name\n";
        }
        elsif ($log_type eq 'no_comments') {
           print LOG "$ENV{'REMOTE_HOST'} - [$shortdate] - ERR: Keine ";
           print LOG "Kommentare\n";
        }
     }

[14] # Umleitungs-Option
     sub no_redirection {

        # Den Anfang der HTML ausgeben
        print "Content-Type: text/html\n\n";
        print "<html><head><title>Vielen Dank</title></head>\n";
        print "<body><h1>Danke fr Ihren Eintrag in das Gstebuch</h1>\n";

        # Antwort ausgeben
        print "Danke fr das Ausfllen im Gstebuch. Ihr Eintrag wurde\n";
        print "dem Gstebuch hinzugefgt.<hr>\n";
        print "Hier ist, was Sie bermittelt haben:<p>\n";
        print "<b>$FORM{'comments'}</b><br>\n";

        if ($FORM{'url'}) {
           print "<a href=\"$FORM{'url'}\">$FORM{'realname'}</a>";
        }
        else {
           print "$FORM{'realname'}";
        }

        if ( $FORM{'username'} ){
           if ($linkmail eq '1') {
              print " &lt;<a href=\"mailto:$FORM{'username'}\">";
              print "$FORM{'username'}</a>&gt;";
           }
           else {
              print " &lt;$FORM{'username'}&gt;";
           }
        }

        print "<br>\n";

        if ( $FORM{'city'} ){
           print "$FORM{'city'},";
        }

        if ( $FORM{'state'} ){
           print " $FORM{'state'}";
        }

        if ( $FORM{'country'} ){
           print " $FORM{'country'}";
        }

        print " - $date<p>\n";

        # Das Ende des HTML ausgeben
        print "<hr>\n";
        print "<a href=\"$server$guestbookurl\">Zurck zum Gstebuch</a>\n";
        print "- Sie mssen es erneut laden, wenn Sie dort \n";
        print "Ihre Eingaben sehen.\n";
        print "</body></html>\n";
        exit;
     }

