#!/usr/bin/perl
use strict;
use warnings;
use CGI qw(:all);
use MD5;
use Captcha;

# ------------------- Konfiguration --------------------------
# Das geheime Passwort
use constant PASSWD => 'TopSecret';

# Lebensdauer des Codes in Sekunden
use constant EXPIRE => 600;
# ------------------- Konfiguration --------------------------

# Die Skript-URL
my $self_url = self_url();

# Das Bilderverzeichnis, der Webserver-User
# (www-data) muss schreiben koennen
my $path = $ENV{'DOCUMENT_ROOT'} . 'captcha/';

# akt. Zeit holen
my $timestamp = time();

# HTTP_ und HTML-Vorspann
print header,
      start_html('Captcha-Demo'),
      h2('Captcha-Demo');

# Gibt's einen Parameter?
my $code = param('code');
if (defined($code))
  {
  # Parameter vorhanden, Formulardaten bearbeiten
  my $cp_epoc = param('cp_epoc');
  my $cp_hash = param('cp_hash');

  if (($timestamp - $cp_epoc) > EXPIRE)
    {
    # Lebensdauer des Captcha ueberschritten
    print h3('Error: Zeit abgelaufen');
    print "Bitte versuchen Sie es noch einmal.\n";
    Delete('code'); # Parameter loeschen
    print '<a href="javascript: history.back();">Zur&uuml;ck</a>';
    }
  elsif ($cp_hash ne MD5->hexhash($code . PASSWD . $cp_epoc))
    {
    # Falscher Code eingegeben
    print h3('Error: Code falsch');
    print "Bitte versuchen Sie es noch einmal.\n";
    Delete('code'); # Parameter loeschen
    print '<a href="javascript: history.back();">Zur&uuml;ck</a>';
    }
  else
    {
    # Alles O.K., die Daten des Formulars werden verarbeitet
    
    # Anschliessend wird ein Bestaetigungstext ausgegeben
    print h3('O. K.');
    print "Ihre Eingaben werden verarbeitet.\n";
    # dann noch die Bilddatei geloescht
    unlink($path . $cp_hash . '.gif')or print "$!";
    }
  }
else
  {
  # Kein Parameter, Captcha generieren
  my $cap = new Captcha;
  $cap->gencode();
  my $secret_code = $cap->code();
  my $image = $cap->image();

  # akt. MD5-Hash erzeugen
  my $md5_hash = MD5->hexhash($secret_code . PASSWD . $timestamp);

  # Bild abspeichern
  open DAT, '>', $path . $md5_hash . '.gif' or die "Captcha-Oops: $!\n";
  binmode DAT;
  print DAT $image;
  close DAT;

  # Senden Formular mit Captcha-Link und Hidden-Parametern
  print qq~
  <form method="POST" action="$self_url">
  <table border="0" cellpadding="3" cellspacing="0">
   <tr><td valign="top" align="center" colspan="2">
    Mensch oder Maschine?
   </td></tr>
   <tr><td valign="middle" align="left">
     Code: <img src="/captcha/$md5_hash.gif">
    </td><td valign="middle" align="right">
     <input type="text" name="code" value ="" size="10">
     <input type="hidden" name="cp_epoc" value="$timestamp">
     <input type="hidden" name="cp_hash" value="$md5_hash">
    </td></tr>
    <tr><td valign="top" align="left" colspan="2">
     Hier stehen weitere Felder des Formulars
    </td></tr>
    <tr><td valign="top" align="left" colspan="2">
     <input type="submit" value="Absenden">
    </td></tr>
   </table>
   </form>
   ~;
  }

print end_html;

