--- a/db.schema Tue Jul 05 00:52:20 2011 +0200
+++ b/db.schema Wed Jul 06 00:20:32 2011 +0200
@@ -3,6 +3,6 @@
id INTEGER PRIMARY KEY,
givenname TEXT, surname TEXT, mail TEXT, tel TEXT,
uuid TEXT UNIQUE,
- timestamp BIGINT,
- ack bool DEFAULT NULL,
+ created INT,
+ confirmed INT DEFAULT NULL,
payed INT DEFAULT NULL);
--- a/index.cgi Tue Jul 05 00:52:20 2011 +0200
+++ b/index.cgi Wed Jul 06 00:20:32 2011 +0200
@@ -20,6 +20,9 @@
sub confirm($$);
sub read_conf($);
+sub do_invite($);
+sub do_show($$);
+
delete @ENV{grep /PATH$/ => keys %ENV};
$ENV{PATH} = "/usr/bin:/usr/sbin:/bin:/sbin";
@@ -63,64 +66,22 @@
# encrypted current timestamp. Accessing the form is only possible
# using this link. Note: These links may not be unique!
if (!path_info()) {
- my %warn;
- my $sent;
-
- if (param("mail")) {
- if (not valid param("mail")) {
- $warn{mail} = "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";
-
- $tt->process("mail.invitation.tpl", {
- to => scalar(param("mail")),
- url => "$SELF/$xxx.tmp"}, $sendmail)
- or die $tt->error();
- close($sendmail)
- or die "problem sending mail to "
- . param("mail");
-
- $sent = param("mail");
- }
- }
- $tt->process("html.invitation.tpl", {
- sent => $sent,
- warn => %warn ? \%warn : undef,
- expires => $EXPIRATION,
- value => { mail => scalar param("mail") },
- });
+ do_invite($tt);
exit 0;
}
- # /<uuid>.tmp
- # /<uuid>.user
-
- # No access without correct 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 < (60 * $EXPIRATION) or die "EXPIRED";
- };
- if ($@) {
- $tt->process("html.denied.tpl", {
- url => $SELF,
- }) or die $tt->error();
+ # /show/(…)
+ if (path_info() =~ /^\/?show\/(.*)$/) {
+ if ($1 ~~ [qw(info)]) {
+ do_show($tt, $1);
exit 0;
}
+ $tt->process("html.denied.tpl");
+ exit 0;
}
- if (path_info() =~ /^\/?(.*)\.user$/) {
+ # /user.<uuid>
+ if (path_info() =~ /^\/?user\.(.*)$/) {
my $uuid = $1;
my $confirmed = param("confirm") eq "yes";
my %data = confirm($uuid => $confirmed);
@@ -141,83 +102,98 @@
exit 0;
}
- ### all went fine, we start processing
- ### the form
-
- my %warn;
- my %value;
-
- ## Input
- if (param("clear")) {
- Delete_all();
- }
-
- # Submission
- if (param("submit")) {
- foreach my $param (@{$FIELDS{MAN}}, @{$FIELDS{OPT}}) {
+ # /tmp.<uuid>
+ if (path_info() =~ /^\/?tmp\.(.*)$/) {
+ my $_ = $1;
+ s/_/\//g;
+ s/-/+/g;
- # strip away spaces to "untaint" the variables, additionally
- # limit the length
- my $_ = param($param);
- /^\s*(.*)\s*$/;
-
- if (!length $1 and $param ~~ @{$FIELDS{MAN}}) {
- push @{$warn{$param}}, "Leer!?";
- }
-
- if (length $1 > 200) {
- push @{$warn{$param}}, "Zu lang (bitte weniger als 200 Zeichen).";
- }
-
- param(-name => $param, value => $1);
- $value{$param} = $1;
+ eval {
+ 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");
+ exit 0;
}
- # Mail needs extra check
- if ($value{mail} and not valid($value{mail})) {
- push @{$warn{mail}}, "Keine gültig erscheinende Mail-Adresse.";
+ my %warn;
+ my %value;
+
+ if (param("clear")) {
+ Delete_all();
}
- foreach (keys %warn) {
- $warn{$_} = join " ", @{$warn{$_}};
+ # Submission
+ if (param("submit")) {
+ foreach my $param (@{$FIELDS{MAN}}, @{$FIELDS{OPT}}) {
+
+ # strip away spaces to "untaint" the variables, additionally
+ # limit the length
+ my $_ = param($param);
+ /^\s*(.*)\s*$/;
+
+ if (!length $1 and $param ~~ @{$FIELDS{MAN}}) {
+ push @{$warn{$param}}, "Leer!?";
+ }
+
+ if (length $1 > 200) {
+ push @{$warn{$param}}, "Zu lang (bitte weniger als 200 Zeichen).";
+ }
+
+ param(-name => $param, value => $1);
+ $value{$param} = $1;
+ }
+
+ # Mail needs extra check
+ if ($value{mail} and not valid($value{mail})) {
+ push @{$warn{mail}}, "Keine gültig erscheinende Mail-Adresse.";
+ }
+
+ foreach (keys %warn) {
+ $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{mail},
+ url => {
+ yes => "$SELF/user.$r{uuid}?confirm=yes",
+ no => "$SELF/user.$r{uuid}?confirm=no",
+ }
+ }, $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;
+ }
}
- 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{mail},
- url => {
- yes => "$SELF/$r{uuid}.user?confirm=yes",
- no => "$SELF/$r{uuid}.user?confirm=no",
- }
- }, $sendmail)
- or die $tt->error();
-
- close($sendmail);
-
- $tt->process("html.form-ack.tpl", {
- value => \%value,
- timestamp => $r{timestamp},
- uuid => $r{uuid},
- }) or die $tt->error();
- exit 0;
- }
+ $tt->process("html.form.tpl", {
+ warn => %warn ? \%warn : undef,
+ value => {
+ givenname => scalar param("givenname"),
+ surname => scalar param("surname"),
+ mail => scalar param("mail"),
+ },
+ } ) or die $tt->error();
+ exit 0;
}
-
- ## Formular
- $tt->process("html.form.tpl", {
- warn => %warn ? \%warn : undef,
- value => {
- givenname => scalar param("givenname"),
- surname => scalar param("surname"),
- mail => scalar param("mail"),
- },
- } ) or die $tt->error();
+ $tt->process("html.denied.tpl", {
+ url => $SELF,
+ }) or die $tt->error();
exit 0;
}
@@ -228,24 +204,23 @@
$DBH->begin_work;
my $sth;
- $sth = $DBH->prepare("SELECT timestamp FROM db WHERE uuid = ?");
+ $sth = $DBH->prepare("SELECT created FROM db WHERE uuid = ?");
$sth->execute($uuid);
if (my $r = $sth->fetchrow_hashref) {
- my $timestamp = $r->{timestamp};
+ my $created = $r->{created};
$DBH->rollback;
return (uuid => $uuid,
- timestamp => $r->{timestamp});
+ created => $r->{created});
}
local $" = ", ";
- $sth = $DBH->prepare("INSERT INTO db (@{$FIELDS{MAN}}, @{$FIELDS{OPT}}, uuid, timestamp)
- VALUES(?, ?, ?, ?, ?, ?)");
- $sth->execute(@value{@{$FIELDS{MAN}}, @{$FIELDS{OPT}}}, $uuid, time);
+ $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);
-
}
sub confirm($$) {
@@ -254,7 +229,7 @@
$DBH->begin_work;
local $" = ", ";
- my $sth = $DBH->prepare("SELECT @{$FIELDS{MAN}}, @{$FIELDS{OPT}} FROM db WHERE uuid = ?");
+ my $sth = $DBH->prepare("SELECT @{$FIELDS{MAN}}, @{$FIELDS{OPT}}, confirmed FROM db WHERE uuid = ?");
$sth->execute($uuid);
my $r = $sth->fetchrow_hashref;
if (!$r) {
@@ -266,7 +241,7 @@
if ($confirmed) {
- $sth = $DBH->prepare("UPDATE db SET ack = 1 WHERE uuid = ?");
+ $sth = $DBH->prepare("UPDATE db SET confirmed = datetime('now') WHERE uuid = ?");
}
else {
$sth = $DBH->prepare("DELETE FROM db WHERE uuid = ?");
@@ -286,3 +261,45 @@
/^\s*(.*?)\s*$/s;
return $1;
}
+
+sub do_invite() {
+ my ($tt) = @_;
+ my %warn;
+ my $sent;
+
+ if (param("mail")) {
+ if (not valid param("mail")) {
+ $warn{mail} = "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";
+
+ $tt->process("mail.invitation.tpl", {
+ to => scalar(param("mail")),
+ url => "$SELF/tmp.$xxx"}, $sendmail)
+ or die $tt->error();
+ close($sendmail)
+ or die "problem sending mail to "
+ . param("mail");
+
+ $sent = param("mail");
+ }
+ }
+ $tt->process("html.invitation.tpl", {
+ sent => $sent,
+ warn => %warn ? \%warn : undef,
+ expires => $EXPIRATION,
+ value => { mail => scalar param("mail") },
+ });
+}
+
+sub do_show($$) {
+ my ($tt, $object) = @_;
+ $tt->process("$object.tpl");
+}
--- a/templates/html.confirmed.tpl Tue Jul 05 00:52:20 2011 +0200
+++ b/templates/html.confirmed.tpl Wed Jul 06 00:20:32 2011 +0200
@@ -13,6 +13,7 @@
Danke, Deine Anmeldung ist jetzt bestätigt. Folgende Daten haben wir von
Dir gespeichert:
+ <p>
<table>
<tr><td>Vorname:</td><td>[%value.givenname%]</td></tr>
<tr><td>Name:</td> <td>[%value.surname%]</td></tr>
@@ -22,6 +23,9 @@
[%END%]
</table>
+ <p>
+ Hier nochmal die <a href="[%SELF%]/show/info">Veranstaltungsinfo</a>.
+
[%ELSE%]
Danke, Deine Daten wurden wieder gelöscht.
--- a/templates/html.denied.tpl Tue Jul 05 00:52:20 2011 +0200
+++ b/templates/html.denied.tpl Wed Jul 06 00:20:32 2011 +0200
@@ -3,7 +3,7 @@
<p>
Tut uns leid, die angegebene URL oder Session existiert nicht oder nicht
mehr. Bitte versuche es über
-<a href="[%url%]">[%url%]</a> noch einmal.
+<a href="[%SELF%]">[%SELF%]</a> noch einmal.
<p>
Danke für Dein Verständnis.
--- a/templates/html.foot Tue Jul 05 00:52:20 2011 +0200
+++ b/templates/html.foot Wed Jul 06 00:20:32 2011 +0200
@@ -1,5 +1,9 @@
+[%USE date%]
<hr/>
<div align="right">
+ [%template.name%] -- [%date.format(template.modtime)%].
+</div>
+<div align="right">
<a href="https://ssl.schlittermann.de/hg/oa">Scripting</a>
© 2011
<a href="mailto:hs@schlittermann.de">Heiko Schlittermann</a>
--- a/templates/html.head Tue Jul 05 00:52:20 2011 +0200
+++ b/templates/html.head Wed Jul 06 00:20:32 2011 +0200
@@ -1,3 +1,4 @@
+[%USE date%]
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF8">
--- a/templates/html.invitation.tpl Tue Jul 05 00:52:20 2011 +0200
+++ b/templates/html.invitation.tpl Wed Jul 06 00:20:32 2011 +0200
@@ -3,7 +3,10 @@
[%IF !sent%]
- Schön, daß Du Dich anmelden möchtest. Um Mißbrauch zu erschweren,
+ <h1>Anmeldung</h1>
+
+ Schön, daß Du Dich zum <a
+ href="[%SELF%]/show/info">Retter-Packkurs</a> anmelden möchtest. Um Mißbrauch zu erschweren,
werden wir Dir jetzt einen Link zusenden, den Du für die Anmeldung verwenden
kannst.
@@ -27,13 +30,6 @@
<input type="submit" name="submit" value="Los">
</form>
- <hr>
-
- Hier sind schon mal Details zur Veranstaltung:
- <pre>
-[%INCLUDE "info.txt"%]
- </pre>
-
[%ELSE%]
<p>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/info.tpl Wed Jul 06 00:20:32 2011 +0200
@@ -0,0 +1,55 @@
+[%PROCESS "defaults"-%]
+[%INCLUDE "html.head"%]
+<h2>Retterpackkurs</h2>
+
+<p>
+Im Oktober findet ein Kurs zum Selbstpacken statt. Es können maximal 25
+Teilnehmer mitmachen. Für DHV-Mitglieder erstattet der DHV etwa 11€ der
+unten angegebenen Kursgebühr (das muß aber jeder selbst mit dem DHV klären).
+
+<p>
+Es werden <em>keine</em> steuerbaren Rettungen gepackt.
+
+<p>
+<dl>
+
+<dt>Termin</dt>
+<dd>15. Oktober 2011, 9 bis 15 Uhr</dd>
+
+<dt>Ort</dt>
+<dd>wird noch bekannt gegeben, voraussichtlich in Dresden, Nähe Straßburger Platz</dd>
+
+<dt>Kosten</dt>
+<dd><ul>
+ <li>50€ bei Zahlung vor dem 1.8.2011
+ <li>60€ bei Zahlung vor dem 1.9.2011
+ </ul>
+
+ <p>
+ In der Gebühr ist die Hallenmiete und das Honorar für den Leiter
+ der Veranstalung enthalten. Mehr nicht.
+
+ <p>
+ Die Kosten werden nur zurückerstattet, wenn der Kurs ausfällt.
+ Persönliches Nichterscheinen ist kein Grund für eine Rückerstattung,
+ aber es kann natürlich eine Ersatzperson geschickt werden.
+
+ <p>
+ Die Anmeldung über <a href="[%SELF%]">[%SELF%]</a>
+ ist nur wirksam, wenn innerhalb von 2 Wochen nach der Online-Anmeldung
+ auch die entsprechende Zahlung eingegangen ist.
+
+ <p>
+ Bankverbindung: …
+</dd>
+
+<dt>Mitbringen</dt>
+<dd><ul>
+ <li>Turnschuhe
+ <li>Retter und Innencontainer
+ <li>Packanleitung
+ </ul>
+</dd>
+</dl>
+
+[%INCLUDE "html.foot"%]
--- a/templates/info.txt Tue Jul 05 00:52:20 2011 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-Retterpackkurs
-
-Im Oktober findet ein Kurs zum Selbstpacken statt. Es können maximal 25
-Teilnehmer mitmachen. Für DHV-Mitglieder erstattet der DHV etwa 11€ der
-unten angegebenen Kursgebühr (das muß aber jeder selbst mit dem DHV klären).
-
-Termin: 15. Oktober 2011, 9 bis 15 Uhr
-Ort: wird noch bekannt gegeben, voraussichtlich in Dresden,
- Nähe Straßburger Platz
-
-Kosten: 50€ bei Zahlung vor dem 1.8.2011
- 60€ bei Zahlung vor dem 1.9.2011
-
- In der Gebühr ist die Hallenmiete und das Honorar für den Leiter
- der Veranstalung enthalten. Mehr nicht.
-
- Die Kosten werden nur zurückerstattet, wenn der Kurs ausfällt.
- Persönliches Erscheinen ist kein Grund für eine Rückerstattung,
- aber es kann natürlich eine Ersatzperson geschickt werden.
-
- Die Anmeldung über [%SELF%]
- ist nur wirksam, wenn innerhalb von 2 Wochen nach der Online-Anmeldung
- auch die entsprechende Zahlung eingegangen ist.
-
- Bankverbindung: …
-
-Mitbringen:
- Turnschuhe
- Retter und Innencontainer
- Packanleitung
-
--- a/templates/mail.confirmed.tpl Tue Jul 05 00:52:20 2011 +0200
+++ b/templates/mail.confirmed.tpl Wed Jul 06 00:20:32 2011 +0200
@@ -13,9 +13,9 @@
Wochen zu überweisen, andernfalls werden wir einfach davon ausgehen, daß Du
doch nicht angemeldet bist.
-Hier noch einmal die Veranstaltungsdetails:
+Die Details zur Veranstaltung findest Du hier:
-[%INCLUDE "info.txt"%]
+[%SELF%]/show/info
[%ELSE-%]
Du bist *nicht* zum Retterpackkurs angemeldet. Alle Deine uns bekannten