# HG changeset patch # User Heiko Schlittermann (JUMPER) # Date 1310024573 -7200 # Node ID c250bcee58577ed43f41ad4214907099415468c8 # Parent bf0ff90e2cf5b727a42d311f20ae26af76c0cb7f# Parent 116d3f91248d2bf3090453b2615932a8a75ad43a prevent duplicate mails diff -r 116d3f91248d -r c250bcee5857 index.cgi --- a/index.cgi Wed Jul 06 09:47:22 2011 +0200 +++ b/index.cgi Thu Jul 07 09:42:53 2011 +0200 @@ -20,8 +20,23 @@ sub confirm($$); sub read_conf($); -sub do_invite($); -sub do_show($$); +sub do_invite(); +sub page; +sub mail; + +sub _encrypt { + my $_ = encrypt(shift); + s/\+/-/g; + s/\//_/g; + return $_; +} + +sub _decrypt { + my $_ = shift; + s/_/\//g; + s/-/+/g; + return decrypt($_); +} delete @ENV{grep /PATH$/ => keys %ENV}; @@ -39,6 +54,7 @@ OPT => [qw[tel]] ); + my %ttconfig = ( INCLUDE_PATH => "templates", VARIABLES => { @@ -57,68 +73,81 @@ print redirect(basename($ENV{SCRIPT_NAME})); } - # OK, let's start - print header(-charset => "UTF-8"); - my $tt = Template->new(\%ttconfig); + # ACCESS + if (!path_info()) { + do_invite(); + exit 0; + } - # ACCESS - # Here we generate a link URL (sent via Mail) containing the - # encrypted current timestamp. Accessing the form is only possible - # using this link. Note: These links may not be unique! - if (!path_info()) { - do_invite($tt); - exit 0; + # /done./ filled forms etc + # /done/ + if (path_info() =~ /^\/?done(?:\.(?.*?))?\/(?.*)$/) { + my %x = %+; + if ($x{step} ~~ [qw(invitation form confirmation)]) { + eval { + page("html.$x{step}.done.tpl", { + done => { + map({ ($_, _decrypt(param($_))) } param()), + }, + uuid => UUID->new($x{uuid}, map { @$_ } values %FIELDS), + }); + exit 0; + }; + die $@ if $@; + if ($@) { + page("html.denied.tpl"); + exit 0; + } + } } # /show/(…) if (path_info() =~ /^\/?show\/(.*)$/) { if ($1 ~~ [qw(info)]) { - do_show($tt, $1); + page("$1.tpl"); exit 0; } - $tt->process("html.denied.tpl"); + page("html.denied.tpl"); exit 0; } # /user. - if (path_info() =~ /^\/?user\.(.*)$/) { + if (path_info() =~ /^\/?user\.(.*)(?:\/(.*))?$/) { my $uuid = $1; - my $confirmed = param("confirm") eq "yes"; + + if (param("confirm")) { + + my $confirmed = param("confirm") eq "yes" ? 1 : 0; my %data = confirm($uuid => $confirmed); if ($data{error}) { - $tt->process("html.denied.tpl"); + page("html.denied.tpl"); exit 0; } - open(my $sendmail, "|$SENDMAIL") or die "Can't open $SENDMAIL: $!\n"; - $tt->process("mail.confirmed.tpl", { + mail("mail.confirmed.tpl", { to => $data{email}, confirmed => $confirmed, - }, $sendmail) - or die $tt->error(); - close($sendmail) or die "sendmail: $!\n"; - + }); - $tt->process("html.confirmed.tpl", { - confirmed => $confirmed, - error => delete $data{error}, - value => \%data}) or die $tt->error(); + print redirect("$SELF/done.$uuid/confirmation?" + . "confirmed=" . _encrypt($confirmed)); + exit 0; + } + } # /tmp. if (path_info() =~ /^\/?tmp\.(.*)$/) { my $_ = $1; - s/_/\//g; - s/-/+/g; eval { - my $time = decrypt($_) or die "DECRYPTION ERROR"; + my $time = _decrypt($_) or die "DECRYPTION ERROR"; $time =~ /^\d+$/ or die "FORMAT ERROR"; time() - $time < (60 * $EXPIRATION) or die "EXPIRED"; }; if ($@) { - $tt->process("html.denied.tpl"); + page("html.denied.tpl"); exit 0; } @@ -159,46 +188,39 @@ $warn{$_} = join " ", @{$warn{$_}}; } - if (!%warn) { - my %r = insert(%value); - - open(my $sendmail => "|$SENDMAIL") - or die "Can't open $SENDMAIL: $!\n"; - - $tt->process("mail.form-ack.tpl", { - to => $value{email}, - url => { - yes => "$SELF/user.$r{uuid}?confirm=yes", - no => "$SELF/user.$r{uuid}?confirm=no", + if (%warn) { + page("html.form.tpl", { + warn => %warn ? \%warn : undef, + value => { + givenname => scalar param("givenname"), + surname => scalar param("surname"), + email => scalar param("email"), } - }, $sendmail) - or die $tt->error(); - - close($sendmail); - - $tt->process("html.form-ack.tpl", { - value => \%value, - created => $r{created}, - uuid => $r{uuid}, - }) or die $tt->error(); + }); exit 0; } + + my %r = insert(%value); + + mail("mail.form.done.tpl", { + to => $value{email}, + url => { + yes => "$SELF/user.$r{uuid}?confirm=yes", + no => "$SELF/user.$r{uuid}?confirm=no", + } + }); + + print redirect("$SELF/done.$r{uuid}/form"); + exit 0; } - $tt->process("html.form.tpl", { - warn => %warn ? \%warn : undef, - value => { - givenname => scalar param("givenname"), - surname => scalar param("surname"), - email => scalar param("email"), - }, - } ) or die $tt->error(); + page("html.form.tpl"); exit 0; } - $tt->process("html.denied.tpl", { + page("html.denied.tpl", { url => $SELF, - }) or die $tt->error(); + }); exit 0; } @@ -216,21 +238,22 @@ my $created = $r->{created}; $DBH->rollback; return (uuid => $uuid, - created => $r->{created}); + exists => $created); } + local $" = ", "; $sth = $DBH->prepare("INSERT INTO db (@{$FIELDS{MAN}}, @{$FIELDS{OPT}}, uuid, created) VALUES(?, ?, ?, ?, ?, datetime('now'))"); $sth->execute(@value{@{$FIELDS{MAN}}, @{$FIELDS{OPT}}}, $uuid); $DBH->commit; - return (uuid => $uuid, - timestamp => undef); + return (uuid => $uuid); } sub confirm($$) { my ($uuid, $confirmed) = @_; my %data; + $DBH->begin_work; local $" = ", "; @@ -268,7 +291,6 @@ } sub do_invite() { - my ($tt) = @_; my %warn; my $sent; @@ -277,26 +299,19 @@ $warn{email} = "INVALID"; } else { - my $xxx = encrypt(time); - $xxx =~ s/\+/-/g; - $xxx =~ s/\//_/g; - - # send mail - open(my $sendmail => "|$SENDMAIL") - or die "Can't open sendmail: $!\n"; + my $xxx = _encrypt(time); - $tt->process("mail.invitation.tpl", { + mail("mail.invitation.tpl", { to => scalar(param("email")), - url => "$SELF/tmp.$xxx"}, $sendmail) - or die $tt->error(); - close($sendmail) - or die "problem sending mail to " - . param("email"); + url => "$SELF/tmp.$xxx"}); $sent = param("email"); } + print redirect("$SELF/done/invitation?email=" . _encrypt($sent)); + exit 0; } - $tt->process("html.invitation.tpl", { + + page("html.invitation.tpl", { sent => $sent, warn => %warn ? \%warn : undef, expires => $EXPIRATION, @@ -304,7 +319,45 @@ }); } -sub do_show($$) { - my ($tt, $object) = @_; - $tt->process("$object.tpl"); + +sub page { + state $tt = Template->new(\%ttconfig); + print header(-charset => "UTF-8"); + $tt->process(@_); +} + +sub mail { + state $tt = Template->new(\%ttconfig); + open(my $sendmail, "|$SENDMAIL") + or die "Can't open $SENDMAIL: $!\n"; + $tt->process(@_, $sendmail) + or die $tt->error(); + close($sendmail) + or die "SENDMAIL: $!\n"; } + +{ package UUID; + use strict; + use warnings; + + sub new { + my $self = bless {} => shift; + $self->{uuid} = shift; + $self->{fields} = [@_]; + my $sth = $DBH->prepare("SELECT " + . join(", " => @{$self->{fields}}) + . " FROM db WHERE uuid = ?"); + $sth->execute($self->{uuid}); + $self->{r} = $sth->fetchrow_hashref; + $sth->finish; + return undef if not $self->{r}; + return $self; + } + + sub AUTOLOAD { + my $self = shift; + my ($f) = ($UUID::AUTOLOAD =~ /.*::(.*)/); + return $self->{r}{$f}; + } +} + diff -r 116d3f91248d -r c250bcee5857 templates/html.confirmation.done.tpl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/templates/html.confirmation.done.tpl Thu Jul 07 09:42:53 2011 +0200 @@ -0,0 +1,35 @@ +[%PROCESS "defaults"%] +[%INCLUDE "html.head"%] + +[%IF done.confirmed%] + + Danke, jetzt ist die Anmeldung vollständig. Folgende Daten + haben wir von Dir gespeichert: + +

+ + + + + [%IF uuid.tel%] + + [%END%] +
Vorname:[%uuid.givenname%]
Name: [%uuid.surname%]
Mail: [%uuid.email%]
Telefon:[%uuid.tel%]
+ +

+ Hier nochmal die Veranstaltungsinfo, + die Bankdaten stehen auch dort. Vergiss bitte nicht die Bezahlung. + +[%ELSE%] + +Danke, Deine Daten wurden wieder gelöscht. + +[%END%] + +

+Solltest Du weitere Fragen haben, kontaktiere bitte +[%CONTACT.name%] per +Mail +oder telefonisch: [%CONTACT.tel%]. + +[%INCLUDE "html.foot"%] diff -r 116d3f91248d -r c250bcee5857 templates/html.confirmed.tpl --- a/templates/html.confirmed.tpl Wed Jul 06 09:47:22 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -[%PROCESS "defaults"%] -[%INCLUDE "html.head"%] - -[%IF error%] - -

- Leider konnte die An- oder Abmeldung nicht bestätigt werden. Bitte überprüfe den - verwendeten Link. -
- -[%ELSIF confirmed%] - - Danke, jetzt ist die Anmeldung vollständig. Folgende Daten - haben wir von Dir gespeichert: - -

- - - - - [%IF value.tel%] - - [%END%] -
Vorname:[%value.givenname%]
Name: [%value.surname%]
Mail: [%value.email%]
Telefon:[%value.tel%]
- -

- Hier nochmal die Veranstaltungsinfo, - die Bankdaten stehen auch dort. Vergiss bitte nicht die Bezahlung. - -[%ELSE%] - -Danke, Deine Daten wurden wieder gelöscht. - -[%END%] - -

-Solltest Du weitere Fragen haben, kontaktiere bitte -[%CONTACT.name%] per -Mail -oder telefonisch: [%CONTACT.tel%]. - -[%INCLUDE "html.foot"%] diff -r 116d3f91248d -r c250bcee5857 templates/html.form-ack.tpl --- a/templates/html.form-ack.tpl Wed Jul 06 09:47:22 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -[%INCLUDE "html.head"%] -[%USE date%] - -[%IF timestamp %] - - Deine Daten stehen bereits in unserer Datenbank. Wir haben Dir den - Link zur Bestätigung noch einmal an die hinterlegte - Mailadresse ([%value.email%]) geschickt. - - (Zeitstempel der Eintragung: [%date.format(timestamp, locale = "de_DE")%]) - -[%ELSE%] - -

- Vielen Dank für Deine Anmeldung. - Um die verwendete Mailadresse zu überprüfen, - erhälst Du jetzt per Mail an [%value.email%] einen - Link, mit dem Du Deine Anmeldung bitte bestätigst. Vorher - geht hier gar nichts. - -

- Folgende Daten haben wir jetzt gespeichert: - - - - - - [%IF value.tel %] - - [%END%] -
Vorname:[%value.givenname%]
Name: [%value.surname%]
Mail: [%value.email%]
Telefon:[%value.tel%]
- - Noch bist Du nicht vollständig angemeldet! - -[%END%] - -[%INCLUDE "html.foot"%] diff -r 116d3f91248d -r c250bcee5857 templates/html.form.done.tpl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/templates/html.form.done.tpl Thu Jul 07 09:42:53 2011 +0200 @@ -0,0 +1,35 @@ +[%INCLUDE "html.head"%] +[%USE date%] + +[%IF exists %] + + Deine Daten stehen bereits in unserer Datenbank. + (Zeitstempel der Eintragung: + [%date.format(done.exists, locale = "de_DE")%]) + +[%ELSE%] + +

+ Vielen Dank für Deine Anmeldung. + Um die verwendete Mailadresse zu überprüfen, + erhälst Du jetzt per Mail an [%done.email%] einen + Link, mit dem Du Deine Anmeldung bitte bestätigst. Vorher + geht hier gar nichts. + +

+ Folgende Daten haben wir jetzt gespeichert: + + + + + + [%IF uuid.tel %] + + [%END%] +
Vorname:[%uuid.givenname%]
Name: [%uuid.surname%]
Mail: [%uuid.email%]
Telefon:[%uuid.tel%]
+ + Noch bist Du nicht vollständig angemeldet! + +[%END%] + +[%INCLUDE "html.foot"%] diff -r 116d3f91248d -r c250bcee5857 templates/html.invitation.done.tpl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/templates/html.invitation.done.tpl Thu Jul 07 09:42:53 2011 +0200 @@ -0,0 +1,16 @@ +[%PROCESS "defaults" %] +[%INCLUDE "html.head"%] + +

+ Vielen Dank. + +

+ Eine Mail mit einem Anmeldelink wurde an Deine + Mailadresse [%done.email%] geschickt. Absender der Mail ist [%CONTACT.name%] und die Betreffzeile beginnt mit + [%SUBJECT%] Der Link ist für die nächsten [%expires%] Minuten + gültig. Deine Adresse wurde von uns nicht gespeichert. + + + +[%INCLUDE "html.foot"%] diff -r 116d3f91248d -r c250bcee5857 templates/html.invitation.tpl --- a/templates/html.invitation.tpl Wed Jul 06 09:47:22 2011 +0200 +++ b/templates/html.invitation.tpl Thu Jul 07 09:42:53 2011 +0200 @@ -1,8 +1,6 @@ [%PROCESS "defaults" %] [%INCLUDE "html.head"%] -[%IF !sent%] -

Anmeldung

Schön, daß Du Dich zum -[%ELSE%] - -

- Vielen Dank. - -

- Eine Mail mit einem Anmeldelink wurde an Deine - Mailadresse [%sent%] geschickt. Absender der Mail ist [%CONTACT.name%] und die Betreffzeile beginnt mit - [%SUBJECT%] Der Link ist für die nächsten [%expires%] Minuten - gültig. Deine Adresse wurde von uns nicht gespeichert. - -[%END%] [%INCLUDE "html.foot"%] diff -r 116d3f91248d -r c250bcee5857 templates/mail.form-ack.tpl --- a/templates/mail.form-ack.tpl Wed Jul 06 09:47:22 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -[%PROCESS "defaults"-%] -From: "[%CONTACT.name%]" <[%CONTACT.mail%]> -To: [%to%] -Subject: [%SUBJECT%] Bitte bestaetige Deine Anmeldung -[%INCLUDE "mail.head"-%] - -Bitte bestätige Deine Anmeldung. Dazu mußt Du folgenden Link in Deinem -Browser öffnen: - -[%url.yes%] - -Wenn alles nur ein Irrtum war, dann kannst Du Deine Daten wieder -AUSTRAGEN und wir vergessen Deine Anmeldung. Hier ist der Link zum -AUSTRAGEN: - -[%url.no%] - -[%INCLUDE "mail.foot"%] diff -r 116d3f91248d -r c250bcee5857 templates/mail.form.done.tpl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/templates/mail.form.done.tpl Thu Jul 07 09:42:53 2011 +0200 @@ -0,0 +1,18 @@ +[%PROCESS "defaults"-%] +From: "[%CONTACT.name%]" <[%CONTACT.mail%]> +To: [%to%] +Subject: [%SUBJECT%] Bitte best=?utf-8?Q?=C3=A4?=tige Deine Anmeldung +[%INCLUDE "mail.head"-%] + +Bitte bestätige Deine Anmeldung. Dazu mußt Du folgenden Link in Deinem +Browser öffnen: + +[%url.yes%] + +Wenn alles nur ein Irrtum war, dann kannst Du Deine Daten wieder +AUSTRAGEN und wir vergessen Deine Anmeldung. Hier ist der Link zum +AUSTRAGEN: + +[%url.no%] + +[%INCLUDE "mail.foot"%]