# HG changeset patch # User Heiko Schlittermann (JUMPER) # Date 1309904432 -7200 # Node ID deb39a02243b654e51f761fbe9fa75ed1e7e103a # Parent ff85a4e74db7fedad6e1af37fd44a4b40456b1d6 restructured a lot diff -r ff85a4e74db7 -r deb39a02243b db.schema --- 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); diff -r ff85a4e74db7 -r deb39a02243b index.cgi --- 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; } - # /.tmp - # /.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. + 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. + 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"); +} diff -r ff85a4e74db7 -r deb39a02243b templates/html.confirmed.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: +

@@ -22,6 +23,9 @@ [%END%]
Vorname:[%value.givenname%]
Name: [%value.surname%]
+

+ Hier nochmal die Veranstaltungsinfo. + [%ELSE%] Danke, Deine Daten wurden wieder gelöscht. diff -r ff85a4e74db7 -r deb39a02243b templates/html.denied.tpl --- 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 @@

Tut uns leid, die angegebene URL oder Session existiert nicht oder nicht mehr. Bitte versuche es über -[%url%] noch einmal. +[%SELF%] noch einmal.

Danke für Dein Verständnis. diff -r ff85a4e74db7 -r deb39a02243b templates/html.foot --- 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%]


+ [%template.name%] -- [%date.format(template.modtime)%]. +
+
Scripting © 2011 Heiko Schlittermann diff -r ff85a4e74db7 -r deb39a02243b templates/html.head --- 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%] diff -r ff85a4e74db7 -r deb39a02243b templates/html.invitation.tpl --- 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, +

Anmeldung

+ + Schön, daß Du Dich zum Retter-Packkurs 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 @@ -
- - Hier sind schon mal Details zur Veranstaltung: -
-[%INCLUDE "info.txt"%]
-    
- [%ELSE%]

diff -r ff85a4e74db7 -r deb39a02243b templates/info.tpl --- /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"%] +

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). + +

+Es werden keine steuerbaren Rettungen gepackt. + +

+

+ +
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 Nichterscheinen 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 +
+
+
+ +[%INCLUDE "html.foot"%] diff -r ff85a4e74db7 -r deb39a02243b templates/info.txt --- 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 - diff -r ff85a4e74db7 -r deb39a02243b templates/mail.confirmed.tpl --- 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