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

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

# ein Temporärverzeichnis, muss vom Webserver beschreibbar sein
# (meist ist die der User www-data)
use constant TMPDIR => '/tmp/captcha/';
# ------------------- Konfiguration --------------------------

my $self_url = self_url();   # Skript-URL
# Das Bilderverzeichnis, Webserver (www-data) muss Schreiben duerfen
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))
  {
  # Formulardaten bearbeiten
  my $cp_epoc = param('cp_epoc');
  my $cp_hash = param('cp_hash');
  my $expire  = 600; # Sekunden Lebensdauer

  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., hier kommt der Bestaetigungstext hin
    print h3('O. K.');
    print "Ihre Eingaben werden verarbeitet.\n";
    # dann noch die Bilddatei loeschen
    unlink($path . $cp_hash . '.gif')or print "$!";
    }
  }
else
  {
  # 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
  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;

