restructured a lot
authorHeiko Schlittermann (JUMPER) <hs@schlittermann.de>
Wed, 06 Jul 2011 00:20:32 +0200
changeset 13 deb39a02243b
parent 12 ff85a4e74db7
child 14 2de6e3df1dd2
restructured a lot
db.schema
index.cgi
templates/html.confirmed.tpl
templates/html.denied.tpl
templates/html.foot
templates/html.head
templates/html.invitation.tpl
templates/info.tpl
templates/info.txt
templates/mail.confirmed.tpl
--- 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>
     &copy; 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