#!/usr/bin/perl package RSVP; use strict; use warnings; use base 'CGI::Application::Mailform'; use Authen::Captcha; use HTML::Template; use CGI::Application::Plugin::FillInForm (qw/fill_form/); my %captcha_errors = ( "0" => 'there was an internal error. Please ask the site owner to check their configuration, and try again later.', -1 => 'your distorted text has expired. Please try again.', -2 => 'you did not match the distorted text. Please try again.', # not in database -3 => 'you did not match the distorted text. Please try again.', # simple mismatch ); sub setup { my $self = shift; $self->SUPER::setup($self, @_); $self->run_modes( 'show_captcha' => \&show_captcha, 'showform' => \&redirect_to_mailform, 'submitform' => \&submitform_and_sendmail, ); } sub load_tmpl { my $self = shift; my $tmpl_name = shift; my $tmpl = $self->SUPER::load_tmpl($tmpl_name, die_on_bad_params => 0, @_); return $tmpl; } sub redirect_to_mailform { my $self = shift; my $q = $self->query(); my $tmpl = $self->load_tmpl('rsvp.tmpl'); $self->generate_captcha(); $tmpl->param('capimg', $self->param('cof') . "/" . $self->param('capmd5') . ".png"); $tmpl->param('capmd5', $self->param('capmd5')); my $output = $tmpl->output(); return $output; } sub submitform_and_sendmail { my $self = shift; # Actually send out the email message, if the captcha matches. my $tmpl; my $r = $self->check_captcha(); if ($r > 0) { $self->sendmail(); $tmpl = $self->load_tmpl('success.tmpl'); return $tmpl->output(); } $tmpl = $self->load_tmpl('rsvp.tmpl'); $tmpl->param('failmsg', $captcha_errors{$r}); $self->generate_captcha(); $tmpl->param('capimg', $self->param('cof') . "/" . $self->param('capmd5') . ".png"); $tmpl->param('capmd5', $self->param('capmd5')); my $output = $tmpl->output(); return $self->fill_form(\$output); } sub generate_captcha { my $self = shift; my $captcha = Authen::Captcha->new(); $captcha->data_folder($self->param('cdf')); $captcha->output_folder($self->param('cof')); $captcha->expire($self->param('cx')); my ($md5sum) = $captcha->generate_code(7); $self->param('capmd5', $md5sum); } sub check_captcha { my $self = shift; my $q = $self->query(); my $captcha = Authen::Captcha->new(); $captcha->data_folder($self->param('cdf')); $captcha->output_folder($self->param('cof')); $captcha->expire($self->param('cx')); my $guess = $q->param('captcha'); my $md5 = $q->param('md5'); my $results = $captcha->check_code($guess, $md5); } sub build_msgbody { my $self = shift; my $q = $self->query(); my $tmpl = $self->load_tmpl('msgbody.tmpl'); for my $i (qw(guestname unable wedding dinner)) { $tmpl->param($i, $q->param($i)); } return $tmpl->output(); } package main; my $mf = RSVP->new(); $mf->param('MAIL_FROM', 'wedding-rsvp@nog.net'); $mf->param('MAIL_TO', 'the-lucky-couple@nog.net'); $mf->param('HTMLFORM_REDIRECT_URL', 'rsvp.html'); $mf->param('SUCCESS_REDIRECT_URL', 'replied.html'); $mf->param('FAILURE_REDIRECT_URL', 'tryagain.html'); $mf->param('FORM_FIELDS', [qw(name wedding dinner unable captcha md5)]); $mf->param('SMTP_HOST', 'localhost'); $mf->param('SUBJECT', 'Wedding RSVP'); $mf->param('cdf', "captcha/data"); $mf->param('cof', "captcha/images"); $mf->param('cx', "300"); $mf->run(); exit(0);