--- a/index.cgi Fri Jul 01 16:25:21 2011 +0200
+++ b/index.cgi Sun Jul 03 23:15:37 2011 +0200
@@ -17,7 +17,7 @@
use Mail::RFC822::Address qw(valid);
sub insert(\%);
-sub confirm($);
+sub confirm($$);
sub slurp($);
@@ -26,7 +26,7 @@
my $DSN = "DBI:SQLite:db.sqlite3";
my $SECRET = slurp "./secret"; chomp($SECRET);
-my $EXPIRATION = 3600; # the link is valid for 1 hour only
+my $EXPIRATION = 60; # the link is valid for XX minutes only
my $SUBJECT = "Retter packen"; # ASCII only! *used for mail subject*
my %FIELDS = (
MAN => [qw[givenname surname mail]],
@@ -79,7 +79,7 @@
Sender => "hs\@schlittermann.de",
Subject => "[$SUBJECT] Link zur Online-Anmeldung",
Message => "Bitte benutze den folgenden Link, um zum Anmeldeformular zu gelangen:\n"
- . url(-query => 0) . "/$xxx\n"
+ . url(-query => 0) . "/$xxx.tmp\n"
. "\n-- \nHeiko Schlittermann\n");
$sent = param("mail");
@@ -88,19 +88,24 @@
$tt->process("access.tpl", {
sent => $sent,
warn => %warn ? \%warn : undef,
+ expires => $EXPIRATION,
value => { mail => scalar param("mail") },
});
exit 0;
}
+ # /<uuid>.tmp
+ # /<uuid>.user
+
# No access without correct path_info
- if (my $_ = basename(path_info())) {
+ if (path_info() =~ /^\/?(.*)\.tmp$/) {
+ my $_ = $1;
s/_/\//g;
s/-/+/g;
eval {
my $time = decrypt($_) or die "DECRYPTION ERROR";
$time =~ /^\d+$/ or die "FORMAT ERROR";
- time() - $time < $EXPIRATION or die "EXPIRED";
+ time() - $time < (60 * $EXPIRATION) or die "EXPIRED";
};
if ($@) {
$tt->process("denied.tpl", {
@@ -110,6 +115,18 @@
}
}
+ if (path_info() =~ /^\/?(.*)\.user$/) {
+ my $uuid = $1;
+ my $confirmed = param("confirm") eq "yes";
+ my %data = confirm($uuid => $confirmed);
+
+ $tt->process("confirm.tpl", {
+ confirmed => $confirmed,
+ error => delete $data{error},
+ value => \%data}) or die $tt->error();
+ exit 0;
+ }
+
### all went fine, we start processing
### the form
@@ -156,10 +173,21 @@
sendmail(To => $value{mail},
From => "hs\@schlittermann.de",
"Content-Type" => "text/plain; charset=\"UTF-8\"",
- Subject => "Bitte die Anmeldung bestaetigen.",
- Message => "Bitte bestätige Deine Anmeldung, in dem Du folgende Webseite aufrufst:\n"
- . url(-path_info => 1, -query => 0) . "?confirm=$r{uuid}\n");
+ Subject => "[$SUBJECT] Bitte die Anmeldung bestaetigen.",
+ Message => <<_EOF);
+
+Bitte bestätige Deine Anmeldung. Dazu mußt Du folgenden Link in Deinem
+Browser öffnen:
+
+@{[url(-path_info => 0, -query => 0)]}/$r{uuid}.user?confirm=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(-path_info => 0, -query => 0)]}/$r{uuid}.user?confirm=no
+
+_EOF
$tt->process("ack.tpl", {
value => \%value,
timestamp => $r{timestamp},
@@ -169,15 +197,9 @@
}
}
- if (param("confirm") =~ /^\s*(.+)\s*/) {
- my %data = confirm($1);
- $tt->process("confirm.tpl", {
- value => \%data}) or die $tt->error();
- exit 0;
- }
## Formular
- $tt->process("entry.tpl", {
+ $tt->process("form.tpl", {
warn => %warn ? \%warn : undef,
value => {
givenname => scalar param("givenname"),
@@ -190,7 +212,8 @@
sub insert(\%) {
my %value = %{$_[0]};
- my $uuid = sha1_hex($SECRET . values %value);
+ my $uuid = sha1_hex($SECRET .
+ join "\0" => @value{@FIELDS{MAN}});
$DBH->begin_work;
my $sth;
@@ -203,10 +226,10 @@
return (uuid => $uuid,
timestamp => $r->{timestamp});
}
- $sth = $DBH->prepare("INSERT INTO db
- (givenname, surname, mail, uuid, timestamp)
- VALUES(?, ?, ?, ?, ?)");
- $sth->execute(@value{qw/givenname surname mail/}, $uuid, time);
+ local $" = ", ";
+ $sth = $DBH->prepare("INSERT INTO db (@{$FIELDS{MAN}}, @{$FIELDS{OPT}}, uuid, timestamp)
+ VALUES(?, ?, ?, ?, ?, ?)");
+ $sth->execute(@value{@{$FIELDS{MAN}}, @{$FIELDS{OPT}}}, $uuid, time);
$DBH->commit;
return (uuid => $uuid,
@@ -214,26 +237,53 @@
}
-sub confirm($) {
- my $uuid = shift;
+sub confirm($$) {
+ my ($uuid, $confirmed) = @_;
my %data;
$DBH->begin_work;
- my $sth = $DBH->prepare("SELECT givenname, surname, mail FROM db WHERE uuid = ?");
+
+ local $" = ", ";
+ my $sth = $DBH->prepare("SELECT @{$FIELDS{MAN}}, @{$FIELDS{OPT}} FROM db WHERE uuid = ?");
$sth->execute($uuid);
my $r = $sth->fetchrow_hashref;
if (!$r) {
$DBH->rollback;
return (error => "NOT FOUND");
}
- %data = (
- givenname => $r->{givenname},
- surname => $r->{surname},
- mail => $r->{mail}
- );
+ @data{@{$FIELDS{MAN}}} = @{$r}{@{$FIELDS{MAN}}};
+ @data{@{$FIELDS{OPT}}} = @{$r}{@{$FIELDS{OPT}}};
+
+
+ if ($confirmed) {
+ $sth = $DBH->prepare("UPDATE db SET ack = 1 WHERE uuid = ?");
+ }
+ else {
+ $sth = $DBH->prepare("DELETE FROM db WHERE uuid = ?");
+ }
+ $sth->execute($uuid);
+
+ $DBH->commit;
- $sth = $DBH->prepare("UPDATE db SET ack = ? WHERE uuid = ?");
- $sth->execute(1, $uuid);
- $DBH->commit;
+ if ($confirmed) {
+ sendmail(
+ To => $data{mail},
+ From => "hs+retter\@schlittermann.de",
+ Subject => "[$SUBJECT] Bestaetigung der Anmeldung",
+ Message => <<_EOF);
+Du bist erfolgreich angemeldet. Für weitere Fragen kontaktiere bitte
+hs+retter\@schlittermann.de.
+_EOF
+ }
+ else {
+ sendmail(
+ To => $data{mail},
+ From => "hs+retter\@schlittermann.de",
+ Subject => "[$SUBJECT] Bestaetigung der NICHT-Anmeldung",
+ Message => <<_EOF);
+Wir vergessen Deine Anmeldung. Fuer weitere Fragen kontaktiere bitte
+hs+retter\@schlittermann.de.
+_EOF
+ }
return %data;
}
--- a/templates/access.tpl Fri Jul 01 16:25:21 2011 +0200
+++ b/templates/access.tpl Sun Jul 03 23:15:37 2011 +0200
@@ -2,10 +2,17 @@
[%IF !sent%]
- Schön, daß Du Dich anmelden möchtest. Um Mißbrauch zu erschweren…
- Bitte gib eine Mailadresse an, an die wir einen Anmeldelink senden
- können. Diese Adresse wird nirgendwo gespeichert.
+ Schön, daß Du Dich anmelden möchtest. Um Mißbrauch zu werden wir Dir
+ jetzt einen Link zusenden, den Du für die Anmeldung verwenden
+ kannst.
+
+ <p>
+ Bitte gib dafür eine Mailadresse an, auf der Du
+ in den nächsten [%expires%] Minuten erreichbar bist.
+ Diese Adresse wird nirgendwo gespeichert.
+
<form>
+
[%IF warn.mail%]
<div class="warn">
Die Mailadresse sieht nicht gut aus.
@@ -22,8 +29,8 @@
[%ELSE%]
Vielen Dank. Eine Mail mit einem Anmeldelink wurde an Deine
- Mailadresse <u>[%sent%]</u> geschickt. Der Link ist 24 Stunden
- gültig. Deine Adresse wurde von uns nicht gespeichert.
+ Mailadresse <u>[%sent%]</u> geschickt. Der Link ist [%expires%]
+ Minuten gültig. Diese Adresse wurde von uns nicht gespeichert.
[%END%]
--- a/templates/ack.tpl Fri Jul 01 16:25:21 2011 +0200
+++ b/templates/ack.tpl Sun Jul 03 23:15:37 2011 +0200
@@ -15,10 +15,15 @@
Vielen Dank für Deine Anmeldung, [%value.givenname%].
Folgende Daten haben wir jetzt gespeichert:
- <p>
- Vorname: [%value.givenname%]<br/>
- Name: [%value.surname%]</br>
- Mail: [%value.mail%]</br>
+ <table>
+ <tr><td>Vorname:</td><td>[%value.givenname%]</td></tr>
+ <tr><td>Name:</td> <td>[%value.surname%]</td></tr>
+ <tr><td>Mail:</td> <td>[%value.mail%]</td></tr>
+ [%IF value.tel %]
+ <tr><td>Telefon:</td><td>[%value.tel%]</td></tr>
+ [%END%]
+ </table>
+
<p>
Du erhälst jetzt per Mail an [%value.mail%] einen
--- a/templates/confirm.tpl Fri Jul 01 16:25:21 2011 +0200
+++ b/templates/confirm.tpl Sun Jul 03 23:15:37 2011 +0200
@@ -3,24 +3,32 @@
[%IF error%]
<div class="warn">
- Leider konnte die Anmeldung nicht bestätigt werden. Bitte überprüfe den
- verwendeten Link oder kontaktiere bitte
- <a href="mailto:[%MAILTO%]">[%MAILTO%]</a>
+ Leider konnte die An- oder Abmeldung nicht bestätigt werden. Bitte überprüfe den
+ verwendeten Link.
</div>
+[%ELSIF confirmed%]
+
+ Danke, Deine Anmeldung ist jetzt bestätigt. Folgende Daten haben wir von
+ Dir gespeichert:
+
+ <table>
+ <tr><td>Vorname:</td><td>[%value.givenname%]</td></tr>
+ <tr><td>Name:</td> <td>[%value.surname%]</td></tr>
+ <tr><td>Mail:</td> <td>[%value.mail%]</td></tr>
+ [%IF value.tel%]
+ <tr><td>Telefon:</td><td>[%value.tel%]</td></tr>
+ [%END%]
+ </table>
+
[%ELSE%]
-
-Danke, Deine Anmeldung ist jetzt bestätigt. Folgende Daten haben wir von
-Dir gespeichert:
+
+Danke, Deine Daten wurden wieder gelöscht.
-<table>
-<tr><td>Vorname</td><td>[%value.givenname%]</td></tr>
-<tr><td>Name</td> <td>[%value.surname%]</td></tr>
-<tr><td>Mail</td> <td>[%value.mail%]</td></tr>
-</table>
+[%END%]
+<p>
Solltest Du weitere Fragen haben, kontaktiere bitte
<a href="mailto:[%MAILTO%]">[%MAILTO%]</a>.
-[%END%]
[%INCLUDE "foot"%]
--- a/templates/entry.tpl Fri Jul 01 16:25:21 2011 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-[%INCLUDE "head"%]
-<!-- hier eine Beschreibung des Events… -->
-
-Alle Felder sind Pflicht. Ohne diese Angaben wird die Anmeldung nicht
-bearbeitet.
-
-[%IF warn%]
-<div class="warn">
-Bitte überprüfen Sie die markierten Felder noch einmal.
-</div>
-[%END%]
-
-<form accept-charset="UTF-8">
-
- <label for="givenname">Vorname</label>
- <input id="givenname" name="givenname" type="text"
- value="[%value.givenname%]" class="[%warn.givenname ? "warn" :"" %]" />
- <font class="warn">[%warn.givenname%]</font>
- <br/>
-
- <label for="surname">Name</label>
- <input id="surname" name="surname" type="text"
- value="[%value.surname%]" class="[%warn.surname ? "warn" : ""%]"/>
- <font class="warn">[%warn.surname%]</font>
- <br/>
-
- <label for="mail">Mail-Adresse</label>
- <input id="mail" name="mail" type="text"
- value="[%value.mail%]" class="[%warn.mail ? "warn" : "" %]"/>
- <font class="warn">[%warn.mail%]</font>
- <br/>
-
- <label>[und los]</label>
- <input type="submit" name="submit" value="Anmelden"/>
- <input type="submit" name="clear" value="Löschen"/>
-
-</form>
-[%INCLUDE "foot"%]
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/form.tpl Sun Jul 03 23:15:37 2011 +0200
@@ -0,0 +1,56 @@
+[%INCLUDE "head"%]
+<p>
+Nach dem Ausfüllen des Formulars werden wir Dir noch per Mail an die im
+Formular angegebene Adresse einen Link schicken, mit dem Du bitte die
+Anmeldung vervollständigst.
+
+
+[%IF warn%]
+ <div class="warn">
+ Bitte überprüfe die markierten Felder noch einmal.
+ </div>
+[%END%]
+
+<form accept-charset="UTF-8">
+
+ <p>
+ Die folgenden Felder sind Pflicht. Ohne diese Angaben wird die Anmeldung nicht
+ bearbeitet.
+
+ <p>
+ <label for="givenname">Vorname</label>
+ <input id="givenname" name="givenname" type="text"
+ value="[%value.givenname%]" class="[%warn.givenname ? "warn" :"" %]" />
+ <font class="warn">[%warn.givenname%]</font>
+ <br/>
+
+ <label for="surname">Name</label>
+ <input id="surname" name="surname" type="text"
+ value="[%value.surname%]" class="[%warn.surname ? "warn" : ""%]"/>
+ <font class="warn">[%warn.surname%]</font>
+ <br/>
+
+ <label for="mail">Mail-Adresse</label>
+ <input id="mail" name="mail" type="text"
+ value="[%value.mail%]" class="[%warn.mail ? "warn" : "" %]"/>
+ <font class="warn">[%warn.mail%]</font>
+ <br/>
+
+ <p>
+ Die Telefonnummer benötigen wir, um Dich gegebenenfalls anrufen zu
+ können, sie ist nicht Pflicht, aber sehr hilfreich.
+
+ <p>
+ <label for="tel">Telefon</label>
+ <input id="tel" name="tel" type="text"
+ value="[%value.tel%]" class="[%warn.tel%] ? "warn" : "" %]"/>
+ <font class="warn">[%warn.tel%]</font>
+ <br/>
+
+ <p>
+ <label>[und los]</label>
+ <input type="submit" name="submit" value="Anmelden"/>
+ <input type="submit" name="clear" value="Löschen"/>
+
+</form>
+[%INCLUDE "foot"%]
--- a/templates/head Fri Jul 01 16:25:21 2011 +0200
+++ b/templates/head Sun Jul 03 23:15:37 2011 +0200
@@ -4,7 +4,7 @@
<style type="text/css">
<!--
.warn { color:red; border-color:red; }
- form > label { display:block; float:left; width:12ex; }
+ form * label { display:block; float:left; width:12ex; }
-->
</style>
</head>