summaryrefslogtreecommitdiff
path: root/web
diff options
context:
space:
mode:
authorPeter Palfrader <peter@palfrader.org>2004-11-15 09:20:11 +0000
committerPeter Palfrader <peter@palfrader.org>2004-11-15 09:20:11 +0000
commit5e95090defff64bc8cd7a318a73aa930948fb66d (patch)
treed977ded4207e51914d539b0ecd20b8583d37c8ea /web
parent6c3e0ba0a82307abf825bf1cde85638464ab1713 (diff)
Initial import
Diffstat (limited to 'web')
-rw-r--r--web/Makefile.am12
-rw-r--r--web/account-create.php106
-rw-r--r--web/account-edit.php174
-rw-r--r--web/allpingers/Makefile.am42
-rw-r--r--web/allpingers/index.wml114
-rw-r--r--web/allpingers/pingers/aarg13
-rw-r--r--web/allpingers/pingers/amessage13
-rw-r--r--web/allpingers/pingers/amigo13
-rw-r--r--web/allpingers/pingers/ath11
-rw-r--r--web/allpingers/pingers/austria13
-rw-r--r--web/allpingers/pingers/banana13
-rw-r--r--web/allpingers/pingers/bigapple9
-rw-r--r--web/allpingers/pingers/bikikii15
-rw-r--r--web/allpingers/pingers/chicago13
-rw-r--r--web/allpingers/pingers/citrus13
-rw-r--r--web/allpingers/pingers/cmeclax13
-rw-r--r--web/allpingers/pingers/cside13
-rw-r--r--web/allpingers/pingers/dingo11
-rw-r--r--web/allpingers/pingers/equars13
-rw-r--r--web/allpingers/pingers/freedom13
-rw-r--r--web/allpingers/pingers/frell13
-rw-r--r--web/allpingers/pingers/george13
-rw-r--r--web/allpingers/pingers/gurski13
-rw-r--r--web/allpingers/pingers/hermes13
-rw-r--r--web/allpingers/pingers/metacolo13
-rw-r--r--web/allpingers/pingers/noreply13
-rw-r--r--web/allpingers/pingers/nowwhat13
-rw-r--r--web/allpingers/pingers/panta11
-rw-r--r--web/allpingers/pingers/paranoia13
-rw-r--r--web/allpingers/pingers/randseed13
-rw-r--r--web/allpingers/pingers/rufus13
-rw-r--r--web/allpingers/pingers/senshi8
-rw-r--r--web/allpingers/pingers/void13
-rw-r--r--web/allpingers/pingers/zerofree13
-rw-r--r--web/images/Makefile.am19
-rw-r--r--web/include/Config.inc41
-rw-r--r--web/include/DB.inc330
-rw-r--r--web/include/Makefile.am15
-rw-r--r--web/include/Messages.inc24
-rw-r--r--web/include/Namespace.inc63
-rw-r--r--web/include/Session.inc180
-rw-r--r--web/include/Template.inc238
-rw-r--r--web/include/Tools.inc152
-rw-r--r--web/include/User.inc150
-rw-r--r--web/index.php27
-rw-r--r--web/login.php56
-rw-r--r--web/logout.php25
-rw-r--r--web/remsaint-subscription.php126
-rw-r--r--web/remsaint.php76
-rw-r--r--web/resources.html62
-rw-r--r--web/rot26/Makefile.am6
-rw-r--r--web/rot26/index.html65
-rw-r--r--web/rot26/keys/292faf0ee7c93743c76df482c0fa550a15
-rw-r--r--web/rot26/keys/30b16a30c2b3af1ec5d5625fcb5059ef15
-rw-r--r--web/rot26/keys/4B8AC6A8.asc41
-rw-r--r--web/rot26/keys/66DC9EA2.asc32
-rw-r--r--web/rot26/keys/7f6d997678b19ccac110f6e66914312615
-rw-r--r--web/rot26/keys/A91FB036.asc37
-rw-r--r--web/rot26/keys/Makefile.am15
-rw-r--r--web/rot26/keys/c4818fe61b42c8d27e87a476fcd76b6f15
-rw-r--r--web/rot26/keys/d4285164186b2fdda3af791e1571e3cc15
-rw-r--r--web/template/Makefile.am15
-rw-r--r--web/template/account-create.html100
-rw-r--r--web/template/account-edit.html145
-rw-r--r--web/template/index.html130
-rw-r--r--web/template/login.html95
-rw-r--r--web/template/logout.html56
-rw-r--r--web/template/meta-chain.html54
-rw-r--r--web/template/metastats.html67
-rw-r--r--web/template/remsaint-status.html262
-rw-r--r--web/template/remsaint-subscription.html27
-rw-r--r--web/tls/Makefile.am35
-rw-r--r--web/tls/template.tmpl118
73 files changed, 3771 insertions, 0 deletions
diff --git a/web/Makefile.am b/web/Makefile.am
new file mode 100644
index 0000000..a40c4c0
--- /dev/null
+++ b/web/Makefile.am
@@ -0,0 +1,12 @@
+SUBDIRS = \
+ allpingers \
+ images \
+ include \
+ rot26 \
+ template \
+ tls
+
+based_in = htdocs
+include $(top_srcdir)/Makefile.common
+
+doc_DATA = account-create.php account-edit.php index.php login.php logout.php remsaint-subscription.php remsaint.php resources.html
diff --git a/web/account-create.php b/web/account-create.php
new file mode 100644
index 0000000..f56273f
--- /dev/null
+++ b/web/account-create.php
@@ -0,0 +1,106 @@
+<?
+require_once("../include/Namespace.inc");
+require_once("../include/Tools.inc");
+require_once("../include/Template.inc");
+
+$namespace = new Namespace(
+ array( have_database => 1,
+ have_session => 1,
+ have_user => 1 )
+) or
+ die("Nobody loves me. I don't even have space for a name.");
+
+$rules = Array();
+$rules['commit']['username'] = array(type => 'string');
+$rules['commit']['name'] = array(type => 'string', optional => 1);
+$rules['commit']['address'] = array(type => 'string');
+$rules['commit']['goto'] = array(type => 'string', optional => 1);
+$rules['ask']['goto'] = array(type => 'string', optional => 1);
+$rules['ask']['username'] = array(type => 'string', optional => 1);
+$rules['ask']['name'] = array(type => 'string', optional => 1);
+$rules['ask']['address'] = array(type => 'string', optional => 1);
+$arguments = param_check($GLOBALS, $rules, array(params_required=>false));
+
+$message = '';
+$created = 0;
+
+if ( $arguments['form_id']=='commit' ) {
+ $namespace->session->set_id();
+ $username = $arguments['username'];
+ $address = $arguments['address'];
+ $name = $arguments['name'];
+
+ if (! preg_match('/^[a-zA-Z][a-zA-Z0-9]+$/', $username) )
+ error("Username '$username' does not match ^[a-zA-Z][a-zA-Z0-9]+");
+ if (! preg_match('/^[a-zA-Z0-9+=_.-]+@[a-zA-Z0-9+=_.-]+$/', $address) )
+ error("Address '$address' does not match ^[a-zA-Z0-9+=_.-]+@[a-zA-Z0-9+=_.-]+$");
+
+ $password = md5($_SERVER["UNIQUE_ID"].time.rand(0,1000000));
+ $password = substr($password, 0, 8);
+
+ $account = array();
+ $account['username'] = $username;
+ $account['name'] = $name;
+ $account['password'] = $password;
+
+ $result = $namespace->database->insert('account', $account);
+ if ($result) {
+ $account = $namespace->database->query_row('SELECT account.ref FROM account WHERE account.username=?', array($username));
+ assert($account);
+ assert(isset($account['ref']));
+ $addr = array();
+ $addr['address'] = $address;
+ $addr['verified'] = 'T';
+ $addr['enabled'] = 'T';
+ $addr['account_ref'] = $account['ref'];
+ $result = $namespace->database->insert('address', $addr);
+ assert($result);
+
+ $created = 1;
+ $message = "Someone, probably you, has requested the following Account on www.noreply.org:\n".
+ "\n".
+ "Username: $username\n".
+ "Name: $name\n".
+ "Address: $address\n".
+ "\n".
+ "Your Password is »".$password."«\n".
+ "\n".
+ "You can log in at\n".
+ "http://www.noreply.org/login.php?form_id=login&username=$username\n\n".
+ "\n".
+ "Should you have problems please contact ".$namespace->config->mail_operator.".\n";
+ mail($address, "Your Noreply Account", $message,
+ "From: ".$namespace->config->mail_from."\n".
+ "Sender: ".$namespace->config->mail_sender."\n".
+ "Reply-To: ".$namespace->config->mail_replyto."\n".
+ "Mime-Version: 1.0\n".
+ "Content-Type: text/plain; charset=iso-8859-1\n".
+ "Content-Disposition: inline"
+ );
+ } else
+ $message = 'Error (perhaps the username already exists).';
+}
+
+if (! $created ) {
+ $data = array();
+ $data['goto'] = $arguments['goto'];
+ $data['message'] = $message;
+ $data['username'] = $namespace->session->data['user']['username'];
+ $data['username_field'] = $arguments['username'];
+ $data['name_field'] = $arguments['name'];
+ $data['username_field'] = $arguments['username'];
+ $data['address_field'] = $arguments['address'];
+
+ $template = new Template('account-create.html', $namespace->config->template_path);
+ $template->parse($data);
+ print $template->output();
+} else {
+ redirect($namespace, './login.php?form_id=login&goto='.$arguments['goto'].'&username='.$username.'&message=Account+Created.+Password+will+be+sent+via+email.');
+}
+
+$namespace->stop();
+
+
+# vim:set ts=4:
+# vim:set shiftwidth=4:
+?>
diff --git a/web/account-edit.php b/web/account-edit.php
new file mode 100644
index 0000000..5702a23
--- /dev/null
+++ b/web/account-edit.php
@@ -0,0 +1,174 @@
+<?
+require_once("../include/Namespace.inc");
+require_once("../include/Tools.inc");
+require_once("../include/Template.inc");
+
+$namespace = new Namespace(
+ array( have_database => 1,
+ have_session => 1,
+ have_user => 1 )
+) or
+ die("Nobody loves me. I don't even have space for a name.");
+
+if (! $namespace->user->check_login()) {
+ redirect($namespace, 'login.php?form_id=login&goto=account-edit.php');
+ $namespace->stop();
+ exit;
+};
+
+$rules = Array();
+$rules['commit']['name'] = array(type => 'string', optional => 1);
+$rules['commit']['password1'] = array(type => 'string', optional => 1);
+$rules['commit']['password2'] = array(type => 'string', optional => 1);
+
+$rules['addr_enable']['address_ref'] = array(type => 'integer');
+$rules['addr_enable']['enable'] = array(type => 'string', length=>200, discard=>1);
+
+$rules['addr_disable']['address_ref'] = array(type => 'integer');
+$rules['addr_disable']['disable'] = array(type => 'string', length=>200, discard=>1);
+
+$rules['addr_verify']['address_ref'] = array(type => 'integer');
+$rules['addr_verify']['code'] = array(type => 'string', length=>200);
+$rules['addr_verify']['verify'] = array(type => 'string', length=>200, discard=>1);
+
+$rules['addr_delete']['address_ref'] = array(type => 'integer');
+$rules['addr_delete']['delete'] = array(type => 'string', length=>200, discard=>1);
+
+$rules['addr_new']['address'] = array(type => 'string', length=>512);
+$rules['addr_new']['addr_new'] = array(type => 'string', length=>200, discard=>1);
+
+$arguments = param_check($GLOBALS, $rules, array(params_required=>false));
+
+$message = '';
+$created = 0;
+
+unset($selected_address);
+if (isset($arguments['address_ref'])) {
+ $selected_address = $namespace->database->query_row('SELECT address.ref, address.address FROM address WHERE address.account_ref=? AND address.ref=?', array($namespace->session->data['user']['ref'], $arguments['address_ref']));
+ if (! $selected_address)
+ error('Insufficient priviliges');
+};
+
+switch($arguments['form_id']) {
+ case 'commit':
+ $namespace->session->set_id();
+ $name = $arguments['name'];
+ $password1 = $arguments['password1'];
+ $password2 = $arguments['password2'];
+
+ if ($password1 != $password2) {
+ $message .= 'Pasword mismatch.';
+ } else {
+ $account = array();
+ $account['name'] = $name;
+ if ($password1 != '') {
+ $account['password'] = $password1;
+ };
+
+ $result = $namespace->database->update('account', $namespace->session->data['user']['ref'], $account);
+ if ($result)
+ $message = 'Update successfull.';
+ else
+ $message = 'Error (do not ask me what happened. I would be the last to know.)';
+ }
+ break;
+
+ case 'addr_enable':
+ $result = $namespace->database->update('address', $arguments['address_ref'], array(enabled => 'T'));
+ if ($result) $message = 'Update successfull.';
+ else $message = 'Error (do not ask me what happened. I would be the last to know.)';
+ break;
+
+ case 'addr_disable':
+ $result = $namespace->database->update('address', $arguments['address_ref'], array(enabled => 'F'));
+ if ($result) $message = 'Update successfull.';
+ else $message = 'Error (do not ask me what happened. I would be the last to know.)';
+ break;
+
+ case 'addr_verify':
+ assert(isset($selected_address));
+ assert(isset($selected_address['address']));
+ $address = $selected_address['address'];
+ $code = md5($address . $namespace->config->secret);
+ $code = substr($code, 0, 8);
+ if ($code == $arguments['code']) {
+ $update = array();
+ $update['verified'] = 'T';
+ $result = $namespace->database->update('address', $arguments['address_ref'], $update);
+ if ($result) $message = 'Update successfull.';
+ else $message = 'Error (do not ask me what happened. I would be the last to know.)';
+ } else
+ $message = 'Mismatch - Address not enabled';
+ break;
+
+ case 'addr_delete':
+ $result = $namespace->database->delete_row('address', $arguments['address_ref']);
+ if ($result) $message = 'Update successfull.';
+ else $message = 'Error (do not ask me what happened. I would be the last to know.)';
+ break;
+
+ case 'addr_new':
+ $address = $arguments['address'];
+ if (! preg_match('/^[a-zA-Z0-9+=_.-]+@[a-zA-Z0-9+=_.-]+$/', $address) )
+ error("Address '$address' does not match ^[a-zA-Z0-9+=_.-]+@[a-zA-Z0-9+=_.-]+$");
+
+ $code = md5($address.$namespace->config->secret);
+ $code = substr($code, 0, 8);
+
+ $addr = array();
+ $addr['address'] = $address;
+ $addr['account_ref'] = $namespace->session->data['user']['ref'];
+ $addr['verified'] = 'F';
+ $addr['enabled'] = 'T';
+
+ $username = $namespace->session->data['user']['username'];
+ $result = $namespace->database->insert('address', $addr);
+ if ($result) {
+ $message = "Someone, probably you, has requested the following address be added to the $username\r\n".
+ "account on www.noreply.org:\r\n".
+ "\r\n".
+ "Address: $address\r\n".
+ "\r\n".
+ "Your Code to activate that address is »".$code."«\r\n".
+ "\r\n".
+ "You can log in at\r\n".
+ "http://www.noreply.org/login.php?form_id=login&username=$username\n\r\n".
+ "\r\n".
+ "Should you have problems please contact ".$namespace->config->mail_operator.".\r\n";
+ mail($address, "Your Noreply Account", $message,
+ "From: ".$namespace->config->mail_from."\r\n".
+ "Sender: ".$namespace->config->mail_sender."\r\n".
+ "Reply-To: ".$namespace->config->mail_replyto
+ );
+ $message = 'Update successfull. An email with the authorization code has been sent.';
+ } else
+ $message = 'Error (perhaps the username already exists).';
+ break;
+
+ case '':
+ break;
+
+ default:
+ error('unknown form '.$form_id.' in switch statement');
+}
+
+$row = $namespace->database->query_row('SELECT ref, username, name FROM account WHERE ref=?', array($namespace->session->data['user']['ref']));
+
+$data = array();
+$data['message'] = $message;
+$data['user'] = $namespace->session->data['user']['username'];
+$data['username_field'] = $row['username'];
+$data['name_field'] = $row['name'];
+$data['addresses'] = $namespace->database->query_all('SELECT address.*, true as t, false as f FROM address WHERE account_ref=?', array($row['ref']));
+$data['PHP_SELF'] = $PHP_SELF;
+
+$template = new Template('account-edit.html', $namespace->config->template_path);
+$template->parse($data);
+print $template->output();
+
+$namespace->stop();
+
+
+# vim:set ts=4:
+# vim:set shiftwidth=4:
+?>
diff --git a/web/allpingers/Makefile.am b/web/allpingers/Makefile.am
new file mode 100644
index 0000000..d76f5e4
--- /dev/null
+++ b/web/allpingers/Makefile.am
@@ -0,0 +1,42 @@
+SUBDIRS =
+
+based_in = htdocs
+include $(top_srcdir)/Makefile.common
+
+doc_DATA = allpingers.txt allpingers.xml index.html
+
+
+
+index.html: index.wml allpingers.txt
+ wml -n -o $@ $<
+
+#SRCS = $(wildcard pingers/*)
+#all: allpingers.txt allpingers.xml $(HTMLFILES)
+
+SRCS = pingers/*
+allpingers.txt: $(SRCS) pingers/
+ ( \
+ echo "# A L L P I N G E R S' I N D E X"; \
+ echo "#"; \
+ echo -n "# Generated: "; \
+ date --rfc-822; \
+ echo "#"; \
+ echo "# This list can be found on the web on http://www.noreply.org/"; \
+ echo "#"; \
+ echo "# If anything is wrong/broken/missing please mail the maintainer at"; \
+ echo "# pingers@palfrader.org"; \
+ echo; \
+ for i in `cd pingers && ls -1`; do \
+ if (echo -n "$$i" | grep -vq '[^a-z0-9]') ; then \
+ echo "[$$i]"; \
+ cat pingers/$$i; \
+ echo ; \
+ fi; \
+ done \
+ ) > $@
+
+allpingers.xml: allpingers.txt
+ $(top_srcdir)/bin/allpingers-ini2xml < $< > $@
+
+clean:
+ rm -f $(doc_DATA)
diff --git a/web/allpingers/index.wml b/web/allpingers/index.wml
new file mode 100644
index 0000000..66aa35b
--- /dev/null
+++ b/web/allpingers/index.wml
@@ -0,0 +1,114 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<HTML>
+ <HEAD>
+ <TITLE>Canonical List of All Pingers</TITLE>
+ <META name="Description" content="Canonical List of All Pingers">
+ <META name="Keywords" content="pinger, stats, statistics, remailer, reliability, anonymous, nym, mixmaster">
+ </HEAD>
+ <BODY bgcolor="#aaaaaa" text="#000000" LINK="#0000ff" ALINK="#ff0000" VLINK="#ff0000">
+ <TABLE cellpadding=0 cellspacing=0 width="100%">
+ <TR><TD colspan=2 bgcolor="#444444"><FONT color="#ffffff"><A href="/"><FONT color="#bbbbff">www.noreply.org</FONT></A> :: All Pingers</FONT></TD></TR>
+ <TR><TD colspan=2 bgcolor="#ffffff">&nbsp;</TD></TR>
+ <TR><TD bgcolor="#ffffff">&nbsp;</TD>
+ <TD bgcolor="#ffffff">
+
+ <h1>Canonical List of All Pingers</h1>
+ <p>
+ <table border=1>
+ <tr>
+ <th>Pinger</th>
+ <th>CPunk V1</th>
+ <th>CPunk V2</th>
+ <th>Mix V1</th>
+ <th>Mix V2</th>
+ <th>rchain</th>
+ <th>PGP Keyring</th>
+ <th>Mix Keyring</th>
+ <th>Comment</th>
+ </tr>
+ <:
+ use warnings;
+ use strict;
+ sub join_links($$) {
+ my ($a, $b) = @_;
+ if (defined $a) {
+ if (defined $b) {
+ return $a.' '.$b;
+ } else {
+ return $a;
+ };
+ } else {
+ if (defined $b) {
+ return $b;
+ } else {
+ return '&nbsp';
+ };
+ };
+ };
+ open(F,"allpingers.txt") or die("Could not open allpingers.txt: $!");
+ my $source;
+ my %pinger;
+ while(<F>) {
+ s/\s*(.*)\s*/$1/;
+ next if (/^\s*#/);
+ $source = $1, next if (/^\[(.*)\]$/);
+ if (/(.+?)\s*=\s*(.+)/) {
+ $pinger{$source}->{$1} = $2 if defined $source;
+ };
+ }
+ close(F);
+ for $source (sort keys %pinger) {
+ print("<TR>\n");
+ printf('<td><a href="%s">%s</a></td>', $pinger{$source}->{base}, $source);
+ my $r1_t = sprintf('<a href="%s">T</a>', $pinger{$source}->{rlist} ) if defined $pinger{$source}->{rlist};
+ my $r1_h = sprintf('<a href="%s">H</a>', $pinger{$source}->{rlist_html} ) if defined $pinger{$source}->{rlist_html};
+ my $r2_t = sprintf('<a href="%s">T</a>', $pinger{$source}->{rlist2} ) if defined $pinger{$source}->{rlist2};
+ my $r2_h = sprintf('<a href="%s">H</a>', $pinger{$source}->{rlist2_html}) if defined $pinger{$source}->{rlist2_html};
+ my $m1_t = sprintf('<a href="%s">T</a>', $pinger{$source}->{mlist} ) if defined $pinger{$source}->{mlist};
+ my $m1_h = sprintf('<a href="%s">H</a>', $pinger{$source}->{mlist_html} ) if defined $pinger{$source}->{mlist_html};
+ my $m2_t = sprintf('<a href="%s">T</a>', $pinger{$source}->{mlist2} ) if defined $pinger{$source}->{mlist2};
+ my $m2_h = sprintf('<a href="%s">H</a>', $pinger{$source}->{mlist2_html}) if defined $pinger{$source}->{mlist2_html};
+ my $rchain_t = sprintf('<a href="%s">T</a>', $pinger{$source}->{rchain} ) if defined $pinger{$source}->{rchain};
+ my $rchain_h = sprintf('<a href="%s">H</a>', $pinger{$source}->{rchain_html}) if defined $pinger{$source}->{rchain_html};
+ my $pgp = sprintf('<a href="%s">ALL</a>', $pinger{$source}->{pgpring} ) if defined $pinger{$source}->{pgpring};
+ my $pgp_rsa = sprintf('<a href="%s">RSA</a>', $pinger{$source}->{pgpring_rsa}) if defined $pinger{$source}->{pgpring_rsa};
+ my $mixring = sprintf('<a href="%s"><code>pubring.mix</code></a>', $pinger{$source}->{mixring} ) if defined $pinger{$source}->{mixring};
+ my $typelist = sprintf('<a href="%s"><code>type2.list</code></a>', $pinger{$source}->{type2list} ) if defined $pinger{$source}->{type2list};
+ my $comment = $pinger{$source}->{comment};
+
+ printf('<td align="center">%s</td>', join_links($r1_t, $r1_h));
+ printf('<td align="center">%s</td>', join_links($r2_t, $r2_h));
+ printf('<td align="center">%s</td>', join_links($m1_t, $m1_h));
+ printf('<td align="center">%s</td>', join_links($m2_t, $m2_h));
+ printf('<td align="center">%s</td>', join_links($rchain_t, $rchain_h));
+ printf('<td align="center">%s</td>', join_links($pgp, $pgp_rsa));
+ printf('<td align="center">%s</td>', join_links($mixring, $typelist));
+ printf('<td align="left">%s</td>', (defined $comment && $comment ne '') ? $comment : '&nbsp');
+
+ print("</TR>\n");
+ }
+ :>
+ </table>
+
+ <p>
+ If anything is wrong/broken/needs to be added/removed please mail the maintainer at <a href="mailto:web@palfrader.org">web@palfrader.org</a>.
+ <p>
+ The canonical list of all pingers in a machine readable format can be
+ found here: <a href="allpingers.txt"><code>allpingers.txt</code></a>.
+ It was last updated <: print scalar gmtime() :>.
+ <p>
+ For testing purposes I've also generated an <a href="allpingers.xml">XML
+ document</a> with all pingers. Feedback especially on the DTD is very
+ much apprechiated.
+
+ #<hr>
+ #<p>
+ #A similar list can be found at Frog's: <a href="http://www.privacyresources.org/frogadmin/Pingers.html">http://www.privacyresources.org/frogadmin/Pingers.html</a>.
+
+ </TD></TR>
+ <TR><TD colspan=2 bgcolor="#ffffff">&nbsp;</TD></TR>
+ <TR><TD colspan=2 bgcolor="#444444"><FONT color="#ffffff"><EM><a href="mailto:web@palfrader.org"><font color="#bbbbff">web@palfrader.org</font></a></EM> -
+ <a href="http://validator.w3.org/check/referer"><font color="#bbbbff">Valid HTML 4.01!</font></a></FONT></TD></TR>
+ </TABLE>
+ </BODY>
+</HTML>
diff --git a/web/allpingers/pingers/aarg b/web/allpingers/pingers/aarg
new file mode 100644
index 0000000..81a6b72
--- /dev/null
+++ b/web/allpingers/pingers/aarg
@@ -0,0 +1,13 @@
+base = http://www.aarg.net/remailer/
+rlist = http://www.aarg.net/remailer/rlist.txt
+mlist = http://www.aarg.net/remailer/mlist.txt
+rlist2 = http://www.aarg.net/remailer/rlist2.txt
+mlist2 = http://www.aarg.net/remailer/mlist2.txt
+rlist_html = http://www.aarg.net/remailer/rlist.html
+mlist_html = http://www.aarg.net/remailer/mlist.html
+rlist2_html = http://www.aarg.net/remailer/rlist2.html
+mlist2_html = http://www.aarg.net/remailer/mlist2.html
+pgpring = http://www.aarg.net/remailer/pgp-all.asc
+pgpring_rsa = http://www.aarg.net/remailer/pgp-rsa.asc
+mixring = http://www.aarg.net/remailer/pubring.mix
+type2list = http://www.aarg.net/remailer/type2.list
diff --git a/web/allpingers/pingers/amessage b/web/allpingers/pingers/amessage
new file mode 100644
index 0000000..9c42495
--- /dev/null
+++ b/web/allpingers/pingers/amessage
@@ -0,0 +1,13 @@
+base = http://remail.amessage.info/results/
+rlist = http://remail.amessage.info/results/rlist.txt
+mlist = http://remail.amessage.info/results/mlist.txt
+rlist2 = http://remail.amessage.info/results/rlist2.txt
+mlist2 = http://remail.amessage.info/results/mlist2.txt
+rlist_html = http://remail.amessage.info/results/rlist.html
+mlist_html = http://remail.amessage.info/results/mlist.html
+rlist2_html = http://remail.amessage.info/results/rlist2.html
+mlist2_html = http://remail.amessage.info/results/mlist2.html
+pgpring = http://remail.amessage.info/results/pgp-all.asc
+pgpring_rsa = http://remail.amessage.info/results/pgp-rsa.asc
+mixring = http://remail.amessage.info/results/pubring.mix
+type2list = http://remail.amessage.info/results/type2.list
diff --git a/web/allpingers/pingers/amigo b/web/allpingers/pingers/amigo
new file mode 100644
index 0000000..b527283
--- /dev/null
+++ b/web/allpingers/pingers/amigo
@@ -0,0 +1,13 @@
+base = http://www.remailer.org.uk/stats/
+rlist = http://www.remailer.org.uk/stats/rlist.txt
+mlist = http://www.remailer.org.uk/stats/mlist.txt
+rlist2 = http://www.remailer.org.uk/stats/rlist2.txt
+mlist2 = http://www.remailer.org.uk/stats/mlist2.txt
+rlist_html = http://www.remailer.org.uk/stats/rlist.html
+mlist_html = http://www.remailer.org.uk/stats/mlist.html
+rlist2_html = http://www.remailer.org.uk/stats/rlist2.html
+mlist2_html = http://www.remailer.org.uk/stats/mlist2.html
+pgpring = http://www.remailer.org.uk/stats/pgp-all.asc
+pgpring_rsa = http://www.remailer.org.uk/stats/pgp-rsa.asc
+mixring = http://www.remailer.org.uk/stats/pubring.mix
+type2list = http://www.remailer.org.uk/stats/type2.list
diff --git a/web/allpingers/pingers/ath b/web/allpingers/pingers/ath
new file mode 100644
index 0000000..c838287
--- /dev/null
+++ b/web/allpingers/pingers/ath
@@ -0,0 +1,11 @@
+base = http://rlist.ath.cx/
+rlist = http://rlist.ath.cx/rlist.txt
+mlist = http://rlist.ath.cx/mlist.txt
+rlist2 = http://rlist.ath.cx/rlist2.txt
+mlist2 = http://rlist.ath.cx/mlist2.txt
+rlist_html = http://rlist.ath.cx/rlist.html
+mlist_html = http://rlist.ath.cx/mlist.html
+rlist2_html = http://rlist.ath.cx/rlist2.html
+mlist2_html = http://rlist.ath.cx/mlist2.html
+mixring = http://rlist.ath.cx/pubring.mix
+type2list = http://rlist.ath.cx/type2.list
diff --git a/web/allpingers/pingers/austria b/web/allpingers/pingers/austria
new file mode 100644
index 0000000..c9e3201
--- /dev/null
+++ b/web/allpingers/pingers/austria
@@ -0,0 +1,13 @@
+base = http://www.tahina.priv.at/~cm/stats/
+rlist = http://www.tahina.priv.at/~cm/stats/rlist.txt
+mlist = http://www.tahina.priv.at/~cm/stats/mlist.txt
+rlist2 = http://www.tahina.priv.at/~cm/stats/rlist2.txt
+mlist2 = http://www.tahina.priv.at/~cm/stats/mlist2.txt
+rlist_html = http://www.tahina.priv.at/~cm/stats/rlist.html
+mlist_html = http://www.tahina.priv.at/~cm/stats/mlist.html
+rlist2_html = http://www.tahina.priv.at/~cm/stats/rlist2.html
+mlist2_html = http://www.tahina.priv.at/~cm/stats/mlist2.html
+pgpring = http://www.tahina.priv.at/~cm/stats/pgp-all.asc
+pgpring_rsa = http://www.tahina.priv.at/~cm/stats/pgp-rsa.asc
+mixring = http://www.tahina.priv.at/~cm/stats/pubring.mix
+type2list = http://www.tahina.priv.at/~cm/stats/type2.list
diff --git a/web/allpingers/pingers/banana b/web/allpingers/pingers/banana
new file mode 100644
index 0000000..f70571c
--- /dev/null
+++ b/web/allpingers/pingers/banana
@@ -0,0 +1,13 @@
+base = http://www.bananasplit.info/echolot/
+rlist = http://www.bananasplit.info/echolot/rlist.txt
+mlist = http://www.bananasplit.info/echolot/mlist.txt
+rlist2 = http://www.bananasplit.info/echolot/rlist2.txt
+mlist2 = http://www.bananasplit.info/echolot/mlist2.txt
+rlist_html = http://www.bananasplit.info/echolot/rlist.html
+mlist_html = http://www.bananasplit.info/echolot/mlist.html
+rlist2_html = http://www.bananasplit.info/echolot/rlist2.html
+mlist2_html = http://www.bananasplit.info/echolot/mlist2.html
+pgpring = http://www.bananasplit.info/echolot/pgp-all.asc
+pgpring_rsa = http://www.bananasplit.info/echolot/pgp-rsa.asc
+mixring = http://www.bananasplit.info/echolot/pubring.mix
+type2list = http://www.bananasplit.info/echolot/type2.list
diff --git a/web/allpingers/pingers/bigapple b/web/allpingers/pingers/bigapple
new file mode 100644
index 0000000..ad400c5
--- /dev/null
+++ b/web/allpingers/pingers/bigapple
@@ -0,0 +1,9 @@
+base = http://bigapple.dynalias.net:88/bigapple/
+rlist = http://bigapple.dynalias.net:88/bigapple/rlist
+mlist = http://bigapple.dynalias.net:88/bigapple/mlist
+rlist2 = http://bigapple.dynalias.net:88/bigapple/rlist2
+mlist2 = http://bigapple.dynalias.net:88/bigapple/mlist2
+rlist_html = http://bigapple.dynalias.net:88/bigapple/rlist.html
+mlist_html = http://bigapple.dynalias.net:88/bigapple/mlist.html
+rlist2_html = http://bigapple.dynalias.net:88/bigapple/rlist2.html
+mlist2_html = http://bigapple.dynalias.net:88/bigapple/mlist2.html
diff --git a/web/allpingers/pingers/bikikii b/web/allpingers/pingers/bikikii
new file mode 100644
index 0000000..e1646bc
--- /dev/null
+++ b/web/allpingers/pingers/bikikii
@@ -0,0 +1,15 @@
+base = http://bikikii-remailer.noneto.com/stats/
+rlist = http://bikikii-remailer.noneto.com/stats/rlist
+mlist = http://bikikii-remailer.noneto.com/stats/mlist
+rlist2 = http://bikikii-remailer.noneto.com/stats/rlist2
+mlist2 = http://bikikii-remailer.noneto.com/stats/mlist2
+rlist_html = http://bikikii-remailer.noneto.com/stats/rlist.html
+mlist_html = http://bikikii-remailer.noneto.com/stats/mlist.html
+rlist2_html = http://bikikii-remailer.noneto.com/stats/rlist2.html
+mlist2_html = http://bikikii-remailer.noneto.com/stats/mlist2.html
+rchain = http://bikikii-remailer.noneto.com/stats/rchain
+rchain_html = http://bikikii-remailer.noneto.com/stats/rchain.html
+pgpring = http://bikikii-remailer.noneto.com/stats/pubring-all.asc
+pgpring_rsa = http://bikikii-remailer.noneto.com/stats/pubring-rsa.asc
+mixring = http://bikikii-remailer.noneto.com/stats/pubring_mix.txt
+type2list = http://bikikii-remailer.noneto.com/stats/type2_lis.txt
diff --git a/web/allpingers/pingers/chicago b/web/allpingers/pingers/chicago
new file mode 100644
index 0000000..7c23c19
--- /dev/null
+++ b/web/allpingers/pingers/chicago
@@ -0,0 +1,13 @@
+base = http://xenophon.homeip.net/echolot/
+rlist = http://xenophon.homeip.net/echolot/rlist.txt
+mlist = http://xenophon.homeip.net/echolot/mlist.txt
+rlist2 = http://xenophon.homeip.net/echolot/rlist2.txt
+mlist2 = http://xenophon.homeip.net/echolot/mlist2.txt
+rlist_html = http://xenophon.homeip.net/echolot/rlist.html
+mlist_html = http://xenophon.homeip.net/echolot/mlist.html
+rlist2_html = http://xenophon.homeip.net/echolot/rlist2.html
+mlist2_html = http://xenophon.homeip.net/echolot/mlist2.html
+pgpring = http://xenophon.homeip.net/echolot/pgp-all.asc
+pgpring_rsa = http://xenophon.homeip.net/echolot/pgp-rsa.asc
+mixring = http://xenophon.homeip.net/echolot/pubring.mix
+type2list = http://xenophon.homeip.net/echolot/type2.list
diff --git a/web/allpingers/pingers/citrus b/web/allpingers/pingers/citrus
new file mode 100644
index 0000000..27982c0
--- /dev/null
+++ b/web/allpingers/pingers/citrus
@@ -0,0 +1,13 @@
+base = http://privacy.outel.org/
+rlist = http://privacy.outel.org/rlist.txt
+mlist = http://privacy.outel.org/mlist.txt
+rlist2 = http://privacy.outel.org/rlist2.txt
+mlist2 = http://privacy.outel.org/mlist2.txt
+rlist_html = http://privacy.outel.org/rlist.html
+mlist_html = http://privacy.outel.org/mlist.html
+rlist2_html = http://privacy.outel.org/rlist2.html
+mlist2_html = http://privacy.outel.org/mlist2.html
+pgpring = http://privacy.outel.org/pubring.asc
+pgpring_rsa = http://privacy.outel.org/pubringrsa.asc
+mixring = http://privacy.outel.org/pubring.mix
+type2list = http://privacy.outel.org/type2.list
diff --git a/web/allpingers/pingers/cmeclax b/web/allpingers/pingers/cmeclax
new file mode 100644
index 0000000..b5b6d78
--- /dev/null
+++ b/web/allpingers/pingers/cmeclax
@@ -0,0 +1,13 @@
+base = http://freedom.gmsociety.org/cmeclax/gumdatni.html
+rlist = http://freedom.gmsociety.org/cmeclax/rlist.txt
+mlist = http://freedom.gmsociety.org/cmeclax/mlist.txt
+rlist2 = http://freedom.gmsociety.org/cmeclax/rlist2.txt
+mlist2 = http://freedom.gmsociety.org/cmeclax/mlist2.txt
+rlist_html = http://freedom.gmsociety.org/cmeclax/rlist.html
+mlist_html = http://freedom.gmsociety.org/cmeclax/mlist.html
+rlist2_html = http://freedom.gmsociety.org/cmeclax/rlist2.html
+mlist2_html = http://freedom.gmsociety.org/cmeclax/mlist2.html
+pgpring = http://freedom.gmsociety.org/cmeclax/pubring.asc
+pgpring_rsa = http://freedom.gmsociety.org/cmeclax/pubringrsa.asc
+mixring = http://freedom.gmsociety.org/cmeclax/pubring.mix
+type2list = http://freedom.gmsociety.org/cmeclax/type2.list
diff --git a/web/allpingers/pingers/cside b/web/allpingers/pingers/cside
new file mode 100644
index 0000000..ae360a4
--- /dev/null
+++ b/web/allpingers/pingers/cside
@@ -0,0 +1,13 @@
+base = http://www.cside.dyndns.org/stats/
+rlist = http://www.cside.dyndns.org/stats/rlist.txt
+mlist = http://www.cside.dyndns.org/stats/mlist.txt
+rlist2 = http://www.cside.dyndns.org/stats/rlist2.txt
+mlist2 = http://www.cside.dyndns.org/stats/mlist2.txt
+rlist_html = http://www.cside.dyndns.org/stats/rlist.html
+mlist_html = http://www.cside.dyndns.org/stats/mlist.html
+rlist2_html = http://www.cside.dyndns.org/stats/rlist2.html
+mlist2_html = http://www.cside.dyndns.org/stats/mlist2.html
+pgpring = http://www.cside.dyndns.org/stats/pgp-all.asc
+pgpring_rsa = http://www.cside.dyndns.org/stats/pgp-rsa.asc
+mixring = http://www.cside.dyndns.org/stats/pubring.mix
+type2list = http://www.cside.dyndns.org/stats/type2.list
diff --git a/web/allpingers/pingers/dingo b/web/allpingers/pingers/dingo
new file mode 100644
index 0000000..6b37c5c
--- /dev/null
+++ b/web/allpingers/pingers/dingo
@@ -0,0 +1,11 @@
+base = http://dingo.1hwy.com/
+rlist = http://dingo.1hwy.com/Dingorlist.txt
+mlist = http://dingo.1hwy.com/Dingomlist.txt
+rlist2 = http://dingo.1hwy.com/Dingorlist2.txt
+mlist2 = http://dingo.1hwy.com/Dingomlist2.txt
+rlist_html = http://dingo.1hwy.com/Dingorlist.html
+mlist_html = http://dingo.1hwy.com/Dingomlist.html
+rlist2_html = http://dingo.1hwy.com/Dingorlist2.html
+mlist2_html = http://dingo.1hwy.com/Dingomlist2.html
+rchain = http://dingo.1hwy.com/dingorchain.txt
+rchain_html = http://dingo.1hwy.com/DingorChain.html
diff --git a/web/allpingers/pingers/equars b/web/allpingers/pingers/equars
new file mode 100644
index 0000000..ced4188
--- /dev/null
+++ b/web/allpingers/pingers/equars
@@ -0,0 +1,13 @@
+base = http://equars.com/echolot/
+rlist = http://equars.com/echolot/rlist.txt
+mlist = http://equars.com/echolot/mlist.txt
+rlist2 = http://equars.com/echolot/rlist2.txt
+mlist2 = http://equars.com/echolot/mlist2.txt
+rlist_html = http://equars.com/echolot/rlist.html
+mlist_html = http://equars.com/echolot/mlist.html
+rlist2_html = http://equars.com/echolot/rlist2.html
+mlist2_html = http://equars.com/echolot/mlist2.html
+pgpring = http://equars.com/echolot/pgp-all.asc
+pgpring_rsa = http://equars.com/echolot/pgp-rsa.asc
+mixring = http://equars.com/echolot/pubring.mix
+type2list = http://equars.com/echolot/type2.list
diff --git a/web/allpingers/pingers/freedom b/web/allpingers/pingers/freedom
new file mode 100644
index 0000000..c5f9a57
--- /dev/null
+++ b/web/allpingers/pingers/freedom
@@ -0,0 +1,13 @@
+base = http://freedom.gmsociety.org/stats/
+rlist = http://freedom.gmsociety.org/stats/rlist
+mlist = http://freedom.gmsociety.org/stats/mlist
+rlist2 = http://freedom.gmsociety.org/stats/rlist2.txt
+mlist2 = http://freedom.gmsociety.org/stats/mlist2.txt
+rlist_html = http://freedom.gmsociety.org/stats/remailer-list.html
+mlist_html = http://freedom.gmsociety.org/stats/mixmaster-list.html
+rlist2_html = http://freedom.gmsociety.org/stats/rlist2.html
+mlist2_html = http://freedom.gmsociety.org/stats/mlist2.html
+rchain_html = http://freedom.gmsociety.org/stats/mlist2.html
+pgpring = http://freedom.gmsociety.org/stats/rsa-pubring.asc
+mixring = http://freedom.gmsociety.org/stats/pubring.mix
+type2list = http://freedom.gmsociety.org/stats/type2.list
diff --git a/web/allpingers/pingers/frell b/web/allpingers/pingers/frell
new file mode 100644
index 0000000..089b1d8
--- /dev/null
+++ b/web/allpingers/pingers/frell
@@ -0,0 +1,13 @@
+base = http://echolot.theremailer.net/
+rlist = http://echolot.theremailer.net/rlist.txt
+mlist = http://echolot.theremailer.net/mlist.txt
+rlist2 = http://echolot.theremailer.net/rlist2.txt
+mlist2 = http://echolot.theremailer.net/mlist2.txt
+rlist_html = http://echolot.theremailer.net/rlist.html
+mlist_html = http://echolot.theremailer.net/mlist.html
+rlist2_html = http://echolot.theremailer.net/rlist2.html
+mlist2_html = http://echolot.theremailer.net/mlist2.html
+pgpring = http://echolot.theremailer.net/pgp-all.asc
+pgpring_rsa = http://echolot.theremailer.net/pgp-rsa.asc
+mixring = http://echolot.theremailer.net/pubring.mix
+type2list = http://echolot.theremailer.net/type2.list
diff --git a/web/allpingers/pingers/george b/web/allpingers/pingers/george
new file mode 100644
index 0000000..82bc3e7
--- /dev/null
+++ b/web/allpingers/pingers/george
@@ -0,0 +1,13 @@
+base = http://stats.mixmaster.it/
+rlist = http://stats.mixmaster.it/rlist.txt
+mlist = http://stats.mixmaster.it/mlist.txt
+rlist2 = http://stats.mixmaster.it/rlist2.txt
+mlist2 = http://stats.mixmaster.it/mlist2.txt
+rlist_html = http://stats.mixmaster.it/rlist.html
+mlist_html = http://stats.mixmaster.it/mlist.html
+rlist2_html = http://stats.mixmaster.it/rlist2.html
+mlist2_html = http://stats.mixmaster.it/mlist2.html
+pgpring = http://stats.mixmaster.it/pgp-all.asc
+pgpring_rsa = http://stats.mixmaster.it/pgp-rsa.asc
+mixring = http://stats.mixmaster.it/pubring.mix
+type2list = http://stats.mixmaster.it/type2.list
diff --git a/web/allpingers/pingers/gurski b/web/allpingers/pingers/gurski
new file mode 100644
index 0000000..6f929fe
--- /dev/null
+++ b/web/allpingers/pingers/gurski
@@ -0,0 +1,13 @@
+base = http://www.gurski.org/remstats/
+rlist = http://www.gurski.org/remstats/rlist.txt
+mlist = http://www.gurski.org/remstats/mlist.txt
+rlist2 = http://www.gurski.org/remstats/rlist2.txt
+mlist2 = http://www.gurski.org/remstats/mlist2.txt
+rlist_html = http://www.gurski.org/remstats/rlist.html
+mlist_html = http://www.gurski.org/remstats/mlist.html
+rlist2_html = http://www.gurski.org/remstats/rlist2.html
+mlist2_html = http://www.gurski.org/remstats/mlist2.html
+pgpring = http://www.gurski.org/remstats/pgp-all.asc
+pgpring_rsa = http://www.gurski.org/remstats/pgp-rsa.asc
+mixring = http://www.gurski.org/remstats/pubring.mix
+type2list = http://www.gurski.org/remstats/type2.list
diff --git a/web/allpingers/pingers/hermes b/web/allpingers/pingers/hermes
new file mode 100644
index 0000000..f628b80
--- /dev/null
+++ b/web/allpingers/pingers/hermes
@@ -0,0 +1,13 @@
+base = http://hermes.eocto.net/~pinger/
+rlist = http://hermes.eocto.net/~pinger/rlist.txt
+mlist = http://hermes.eocto.net/~pinger/mlist.txt
+rlist2 = http://hermes.eocto.net/~pinger/rlist2.txt
+mlist2 = http://hermes.eocto.net/~pinger/mlist2.txt
+rlist_html = http://hermes.eocto.net/~pinger/rlist.html
+mlist_html = http://hermes.eocto.net/~pinger/mlist.html
+rlist2_html = http://hermes.eocto.net/~pinger/rlist2.html
+mlist2_html = http://hermes.eocto.net/~pinger/mlist2.html
+pgpring = http://hermes.eocto.net/~pinger/pgp-all.asc
+pgpring_rsa = http://hermes.eocto.net/~pinger/pgp-rsa.asc
+mixring = http://hermes.eocto.net/~pinger/pubring.mix
+type2list = http://hermes.eocto.net/~pinger/type2.list
diff --git a/web/allpingers/pingers/metacolo b/web/allpingers/pingers/metacolo
new file mode 100644
index 0000000..f75e899
--- /dev/null
+++ b/web/allpingers/pingers/metacolo
@@ -0,0 +1,13 @@
+base = http://remailer.metacolo.com/stats/
+rlist = http://remailer.metacolo.com/stats/rlist.txt
+mlist = http://remailer.metacolo.com/stats/mlist.txt
+rlist2 = http://remailer.metacolo.com/stats/rlist2.txt
+mlist2 = http://remailer.metacolo.com/stats/mlist2.txt
+rlist_html = http://remailer.metacolo.com/stats/rlist.html
+mlist_html = http://remailer.metacolo.com/stats/mlist.html
+rlist2_html = http://remailer.metacolo.com/stats/rlist2.html
+mlist2_html = http://remailer.metacolo.com/stats/mlist2.html
+pgpring = http://remailer.metacolo.com/stats/pgp-all.asc
+pgpring_rsa = http://remailer.metacolo.com/stats/pgp-rsa.asc
+mixring = http://remailer.metacolo.com/stats/pubring.mix
+type2list = http://remailer.metacolo.com/stats/type2.list
diff --git a/web/allpingers/pingers/noreply b/web/allpingers/pingers/noreply
new file mode 100644
index 0000000..ee5f342
--- /dev/null
+++ b/web/allpingers/pingers/noreply
@@ -0,0 +1,13 @@
+base = http://www.noreply.org/echolot/
+rlist = http://www.noreply.org/echolot/rlist.txt
+mlist = http://www.noreply.org/echolot/mlist.txt
+rlist2 = http://www.noreply.org/echolot/rlist2.txt
+mlist2 = http://www.noreply.org/echolot/mlist2.txt
+rlist_html = http://www.noreply.org/echolot/rlist.html
+mlist_html = http://www.noreply.org/echolot/mlist.html
+rlist2_html = http://www.noreply.org/echolot/rlist2.html
+mlist2_html = http://www.noreply.org/echolot/mlist2.html
+pgpring = http://www.noreply.org/echolot/pgp-all.asc
+pgpring_rsa = http://www.noreply.org/echolot/pgp-rsa.asc
+mixring = http://www.noreply.org/echolot/pubring.mix
+type2list = http://www.noreply.org/echolot/type2.list
diff --git a/web/allpingers/pingers/nowwhat b/web/allpingers/pingers/nowwhat
new file mode 100644
index 0000000..3da1a7e
--- /dev/null
+++ b/web/allpingers/pingers/nowwhat
@@ -0,0 +1,13 @@
+base = http://nym.komite.net/echolot/
+rlist = http://nym.komite.net/echolot/rlist.txt
+mlist = http://nym.komite.net/echolot/mlist.txt
+rlist2 = http://nym.komite.net/echolot/rlist2.txt
+mlist2 = http://nym.komite.net/echolot/mlist2.txt
+rlist_html = http://nym.komite.net/echolot/rlist.html
+mlist_html = http://nym.komite.net/echolot/mlist.html
+rlist2_html = http://nym.komite.net/echolot/rlist2.html
+mlist2_html = http://nym.komite.net/echolot/mlist2.html
+pgpring = http://nym.komite.net/echolot/pgp-all.asc
+pgpring_rsa = http://nym.komite.net/echolot/pgp-rsa.asc
+mixring = http://nym.komite.net/echolot/pubring.mix
+type2list = http://nym.komite.net/echolot/type2.list
diff --git a/web/allpingers/pingers/panta b/web/allpingers/pingers/panta
new file mode 100644
index 0000000..f2920f1
--- /dev/null
+++ b/web/allpingers/pingers/panta
@@ -0,0 +1,11 @@
+base = http://www.panta-rhei.dyndns.org/stats/
+rlist = http://www.panta-rhei.dyndns.org/stats/stats/rlist.txt
+mlist = http://www.panta-rhei.dyndns.org/stats/stats/mlist.txt
+rlist2 = http://www.panta-rhei.dyndns.org/stats/stats/rlist2.txt
+mlist2 = http://www.panta-rhei.dyndns.org/stats/stats/mlist2.txt
+rlist_html = http://www.panta-rhei.dyndns.org/stats/stats/rlist.html
+mlist_html = http://www.panta-rhei.dyndns.org/stats/stats/mlist.html
+rlist2_html = http://www.panta-rhei.dyndns.org/stats/stats/rlist2.html
+mlist2_html = http://www.panta-rhei.dyndns.org/stats/stats/mlist2.html
+rchain = http://www.panta-rhei.dyndns.org/stats/stats/rchain.txt
+rchain_html = http://www.panta-rhei.dyndns.org/stats/stats/rchain.html
diff --git a/web/allpingers/pingers/paranoia b/web/allpingers/pingers/paranoia
new file mode 100644
index 0000000..5031696
--- /dev/null
+++ b/web/allpingers/pingers/paranoia
@@ -0,0 +1,13 @@
+base = http://remailer.autistici.org/stats/
+rlist = http://remailer.autistici.org/stats/rlist.txt
+mlist = http://remailer.autistici.org/stats/mlist.txt
+rlist2 = http://remailer.autistici.org/stats/rlist2.txt
+mlist2 = http://remailer.autistici.org/stats/mlist2.txt
+rlist_html = http://remailer.autistici.org/stats/rlist.html
+mlist_html = http://remailer.autistici.org/stats/mlist.html
+rlist2_html = http://remailer.autistici.org/stats/rlist2.html
+mlist2_html = http://remailer.autistici.org/stats/mlist2.html
+pgpring = http://remailer.autistici.org/stats/pgp-all.asc
+pgpring_rsa = http://remailer.autistici.org/stats/pgp-rsa.asc
+mixring = http://remailer.autistici.org/stats/pubring.mix
+type2list = http://remailer.autistici.org/stats/type2.list
diff --git a/web/allpingers/pingers/randseed b/web/allpingers/pingers/randseed
new file mode 100644
index 0000000..a52299b
--- /dev/null
+++ b/web/allpingers/pingers/randseed
@@ -0,0 +1,13 @@
+base = http://stats.melontraffickers.com/
+rlist = http://stats.melontraffickers.com/rlist.txt
+mlist = http://stats.melontraffickers.com/mlist.txt
+rlist2 = http://stats.melontraffickers.com/rlist2.txt
+mlist2 = http://stats.melontraffickers.com/mlist2.txt
+rlist_html = http://stats.melontraffickers.com/rlist.html
+mlist_html = http://stats.melontraffickers.com/mlist.html
+rlist2_html = http://stats.melontraffickers.com/rlist2.html
+mlist2_html = http://stats.melontraffickers.com/mlist2.html
+pgpring = http://stats.melontraffickers.com/pgp-all.asc
+pgpring_rsa = http://stats.melontraffickers.com/pgp-rsa.asc
+mixring = http://stats.melontraffickers.com/pubring.mix
+type2list = http://stats.melontraffickers.com/type2.list
diff --git a/web/allpingers/pingers/rufus b/web/allpingers/pingers/rufus
new file mode 100644
index 0000000..fb776ee
--- /dev/null
+++ b/web/allpingers/pingers/rufus
@@ -0,0 +1,13 @@
+base = http://rufus.neuropool.org/
+rlist = http://rufus.neuropool.org/rlist.txt
+mlist = http://rufus.neuropool.org/mlist.txt
+rlist2 = http://rufus.neuropool.org/rlist2.txt
+mlist2 = http://rufus.neuropool.org/mlist2.txt
+rlist_html = http://rufus.neuropool.org/rlist.html
+mlist_html = http://rufus.neuropool.org/mlist.html
+rlist2_html = http://rufus.neuropool.org/rlist2.html
+mlist2_html = http://rufus.neuropool.org/mlist2.html
+pgpring = http://rufus.neuropool.org/pgp-all.asc
+pgpring_rsa = http://rufus.neuropool.org/pgp-rsa.asc
+mixring = http://rufus.neuropool.org/pubring.mix
+type2list = http://rufus.neuropool.org/type2.list
diff --git a/web/allpingers/pingers/senshi b/web/allpingers/pingers/senshi
new file mode 100644
index 0000000..52876a6
--- /dev/null
+++ b/web/allpingers/pingers/senshi
@@ -0,0 +1,8 @@
+base = http://private.addcom.de/senshiremailer/
+rlist2 = http://private.addcom.de/senshiremailer/rlist2.txt
+mlist2 = http://private.addcom.de/senshiremailer/mlist2.txt
+rlist_html = http://private.addcom.de/senshiremailer/rlist.html
+mlist_html = http://private.addcom.de/senshiremailer/mlist.html
+pgpring = http://private.addcom.de/senshiremailer/pgpkeys.asc
+mixring = http://private.addcom.de/senshiremailer/pubring.mix
+type2list = http://private.addcom.de/senshiremailer/type2.lis
diff --git a/web/allpingers/pingers/void b/web/allpingers/pingers/void
new file mode 100644
index 0000000..211ba5f
--- /dev/null
+++ b/web/allpingers/pingers/void
@@ -0,0 +1,13 @@
+base = http://void.hn.org/results/
+rlist = http://void.hn.org/results/rlist.txt
+mlist = http://void.hn.org/results/mlist.txt
+rlist2 = http://void.hn.org/results/rlist2.txt
+mlist2 = http://void.hn.org/results/mlist2.txt
+rlist_html = http://void.hn.org/results/rlist.html
+mlist_html = http://void.hn.org/results/mlist.html
+rlist2_html = http://void.hn.org/results/rlist2.html
+mlist2_html = http://void.hn.org/results/mlist2.html
+pgpring = http://void.hn.org/results/pgp-all.asc
+pgpring_rsa = http://void.hn.org/results/pgp-rsa.asc
+mixring = http://void.hn.org/results/pubring.mix
+type2list = http://void.hn.org/results/type2.list
diff --git a/web/allpingers/pingers/zerofree b/web/allpingers/pingers/zerofree
new file mode 100644
index 0000000..e97d31f
--- /dev/null
+++ b/web/allpingers/pingers/zerofree
@@ -0,0 +1,13 @@
+base = http://zerofreedom.homeip.net/echolot/
+rlist = http://zerofreedom.homeip.net/echolot/rlist.txt
+mlist = http://zerofreedom.homeip.net/echolot/mlist.txt
+rlist2 = http://zerofreedom.homeip.net/echolot/rlist2.txt
+mlist2 = http://zerofreedom.homeip.net/echolot/mlist2.txt
+rlist_html = http://zerofreedom.homeip.net/echolot/rlist.html
+mlist_html = http://zerofreedom.homeip.net/echolot/mlist.html
+rlist2_html = http://zerofreedom.homeip.net/echolot/rlist2.html
+mlist2_html = http://zerofreedom.homeip.net/echolot/mlist2.html
+pgpring = http://zerofreedom.homeip.net/echolot/pgp-all.asc
+pgpring_rsa = http://zerofreedom.homeip.net/echolot/pgp-rsa.asc
+mixring = http://zerofreedom.homeip.net/echolot/pubring.mix
+type2list = http://zerofreedom.homeip.net/echolot/type2.list
diff --git a/web/images/Makefile.am b/web/images/Makefile.am
new file mode 100644
index 0000000..066d950
--- /dev/null
+++ b/web/images/Makefile.am
@@ -0,0 +1,19 @@
+SUBDIRS =
+
+based_in = htdocs
+include $(top_srcdir)/Makefile.common
+
+doc_DATA = remailer-states-long-2.png remailer-states-long.png remailer-states.png
+
+
+remailer-states.png: $(top_srcdir)/data/remailer-states.rrd
+ $(top_srcdir)/bin/remailer-states-make-image $(top_srcdir)/data .
+
+remailer-states-long.png: $(top_srcdir)/data/remailer-states.rrd
+ $(top_srcdir)/bin/remailer-states-make-image-long $(top_srcdir)/data .
+
+remailer-states-long-2.png: $(top_srcdir)/data/remailer-states.rrd
+ $(top_srcdir)/bin/remailer-states-make-image-long-2 $(top_srcdir)/data .
+
+clean:
+ rm -f $(doc_DATA)
diff --git a/web/include/Config.inc b/web/include/Config.inc
new file mode 100644
index 0000000..fb3ed29
--- /dev/null
+++ b/web/include/Config.inc
@@ -0,0 +1,41 @@
+<?
+/*
+ * RemSaint
+ * (c) 2002
+ * Peter Palfrader
+ *
+ * $Id:$
+ */
+
+class Config {
+ # where are the templates
+ var $template_path='../template';
+
+ # Database
+ var $db_type='postgres';
+ var $db_host='localhost';
+ var $db_name='weasel';
+ var $db_user='weasel_remsaint';
+ var $db_password='Rgr3wB7kwqo';
+
+ var $session_cookie_name='NOREPLY_SESSION_ID';
+
+ var $auth_timeout = 3600;
+
+ # misc
+ var $baseurl='http://www.noreply.org';
+
+ var $mail_from='Noreply Account System <noreply-accounts@palfrader.org>';
+ var $mail_sender='Peter Palfrader <peter@palfrader.org>';
+ var $mail_replyto='Peter Palfrader <peter@palfrader.org>';
+ var $mail_operator='Peter Palfrader <peter@palfrader.org>';
+
+ var $secret = '3c329081876d2b3be2227432b2648319';
+
+ function Config() {
+ }
+}
+
+# vim:set ts=4:
+# vim:set shiftwidth=4:
+?>
diff --git a/web/include/DB.inc b/web/include/DB.inc
new file mode 100644
index 0000000..4aaadbf
--- /dev/null
+++ b/web/include/DB.inc
@@ -0,0 +1,330 @@
+<?
+/* Database Abstraction Class
+ *
+ * (c) 2002 Peter Palfrader <pp@3node.com>
+ * Florian Reitmeir <fr@3node.com>
+ */
+
+/**
+ * Database Abstraction Class
+ *
+ * This is a small database abstraction class based on ADODB
+ *
+ * It provides only a very small set of functions but has
+ * proven to be sufficient for most projects.
+ *
+ * @author Peter Palfrader/3node
+ * @author Florian Reitmeir/3node
+ * @version $Id$
+ */
+
+include('/usr/share/adodb/adodb.inc.php');
+
+class Database {
+ var $connection;
+ var $errorMsg;
+ var $errorNo;
+
+ /**
+ * create a new database object
+ *
+ * The constructor creates a database connection to the database
+ * specified with <code>host</code>, <code>user</code>,
+ * <code>password</code>, and <code>name</code>.
+ *
+ * <code>type</code> specifies the kind of database you want to use
+ * (postgres, mysql, etc.)
+ *
+ * @param string type of DBMS
+ * @param string host where the DBMS runs
+ * @param string the username to connect as
+ * @param string the password to authenticate with
+ * @param string the name of the database to connect to
+ * @returns boolean true on success, false on error
+ */
+ function Database($type, $host, $user, $password, $name) {
+ $this->connection = &ADONewConnection($type);
+ #if (!$this->connection->PConnect($host, $user, $password, $name))
+ if (!$this->connection->Connect($host, $user, $password, $name))
+ return false;
+
+ assert( $this->connection );
+ $this->database['ErrorMsg'] = '';
+ $this->database['ErrorNo'] = 0;
+
+ return true;
+ }
+
+
+ /**
+ * remove/quote evil characters
+ *
+ * This function calls the database backend's quote string
+ * function which is supposed to quote evil charaters
+ * like semicolons, single and double quotes etc so that they
+ * can be used in SQL queries.
+ *
+ * @param string the string which should be cleaned
+ * @returns string the cleaned string
+ */
+ function clean_string(&$string)
+ {
+ assert( $this->connection );
+ $result = preg_replace ('/[^A-Za-z0-9_-]+/', '', $string);
+ return $result;
+ }
+
+
+ /**
+ * execute an SQL query with parameters
+ *
+ * This function executes the SQL query passed in <code>query</code>.
+ * The query is first prepared and then executed with the values
+ * passed in <code>params</code>.
+ *
+ * The ADODB backend emulates binding of parameters if the database
+ * does not support it natively. Only <code>params</code>' values
+ * are passed to the binding, not its keys.
+ *
+ * You probably do not want to call this function from your code.
+ * Use the <code>query_row</code>, <code>query_all</code>,
+ * <code>insert</code>, or <code>update</code> function depending
+ * on what you want to do.
+ *
+ * This function returns a recordset which is an ADODB result type.
+ * Please * refer to the ADODB documentation for details. On error
+ * false is * returned and <code>errorMsg</code> and <code>errorNo</code>
+ * are set appropriatly.
+ *
+ * @param string the SQL query to execute
+ * @param array the values to bind to the execute
+ * @returns recordset A recordset on success, false otherwhise
+ */
+ function execute_query($query, &$params)
+ {
+ assert( $this->connection );
+ $this->errormsg = '';
+ $this->errorno = 0;
+
+ $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
+ $values = array_values($params);
+ $stmt = $this->connection->Prepare($query);
+ $recordset = $this->connection->Execute($stmt, $values);
+
+ if ($recordset === false)
+ {
+ $this->errorMsg = $this->connection->ErrorMsg();
+ $this->errorNo = $this->connection->ErrorNo();
+ }
+ return $recordset;
+ }
+
+ /**
+ * execute an SQL query and return the first row
+ *
+ * This function executes the SQL query passed in <code>query</code>.
+ * It takes an optional array of parameters and returns the fields of
+ * the first result row as an assoziative array.
+ *
+ * <code>execute_query</code> is called to do the real work.
+ *
+ * @param string the SQL query to execute
+ * @param array the values to bind to the execute
+ * @returns array An assiziative array on success, false otherwhise
+ */
+ function query_row($query, $params=array())
+ {
+ assert( $this->connection );
+ $recordset = $this->execute_query($query, $params);
+ if ($recordset === False)
+ return False;
+ else
+ return $recordset->fields;
+ }
+
+ /**
+ * execute an SQL query and return all results
+ *
+ * This function executes the SQL query passed in <code>query</code>.
+ * It takes an optional array of parameters and returns an array of
+ * assoziative arrays (one per result row).
+ *
+ * <code>execute_query</code> is called to do the real work.
+ *
+ * @param string the SQL query to execute
+ * @param array the values to bind to the execute
+ * @returns array An array of assiziative arrays on success, false otherwhise
+ */
+ function query_all($query, $params=array())
+ {
+ assert( $this->connection );
+ $recordset = $this->execute_query($query, $params);
+
+ if ($recordset === False)
+ return False;
+
+ $output = array();
+ while (! $recordset->EOF)
+ {
+ $output[] = $recordset->fields;
+ $recordset->MoveNext();
+ }
+
+ return $output;
+ }
+
+ /**
+ * Insert values into a table
+ *
+ * <code>insert</code> inserts a new row into the table <code>table</code>.
+ * The values to insert are taken from the assoziative array
+ * <code>params</code>.
+ *
+ * This function handles selection of the primary key automatically if
+ * no <code>ref</code> value is set in the <code>params</code>.
+ *
+ * The SQL query is built using tablename and the params passed as
+ * arguments. <code>execute_query</code> is called to do the real work.
+ *
+ * @param string the table to insert the new data into
+ * @param array assoziative array of values to insert
+ * @params string name of the tables primary key (defaults to <code>ref</code>)
+ * @returns boolean True on success, false otherwhise
+ */
+ function insert($table, $params=array(), $refname = "ref")
+ {
+ assert( $this->connection );
+ $this->errorMsg = '';
+ $this->errorNo = 0;
+
+ $keys = array_map($this->clean_string, array_keys($params));
+ $qmarks = array();
+ $values = array_values($params);
+ foreach ($params as $key=>$value)
+ {
+ $qmarks[] = "?";
+ }
+
+ if ($params[$refname])
+ $sqlinsert='insert into "'.$this->clean_string($table).'" ('.implode(',', $keys).') values ('.implode(',',$qmarks).')';
+ else
+ $sqlinsert='insert into "'.$this->clean_string($table).
+ '" ('.$this->clean_string($refname).', '.implode(',', $keys).')
+ values ( (select coalesce( max('.$this->clean_string($refname).')+1, 1 ) from "'.$this->clean_string($table).'"), ' . implode(',',$qmarks).')';
+
+ $stmt = $this->connection->Prepare($sqlinsert);
+ $recordset = $this->connection->Execute($stmt, $values);
+
+ if ($recordset === False)
+ {
+ $this->errorMsg = $this->connection->ErrorMsg();
+ $this->errorNo = $this->connection->ErrorNo();
+ return False;
+ }
+ else
+ return True;
+ }
+
+ /**
+ * Update a row in a table
+ *
+ * This function updates the table row given by the primary key
+ * <code>ref</code>. The new values are to be passed via the assoziative
+ * array <code>params</code>. An optional list of columns which should
+ * be set to NULL may be given too.
+ *
+ * The SQL query is built using tablename and the params passed as
+ * arguments. <code>execute_query</code> is called to do the real work.
+ *
+ * @param string the table to update the row data in
+ * @param integer the primary key of the row to update
+ * @param array assoziative array of values to insert
+ * @param array array of columns to set to NULL
+ * @params string name of the tables primary key (defaults to <code>ref</code>)
+ * @returns boolean True on success, false otherwhise
+ */
+ function update($table, $ref, $params=array(), $nullify = array(), $refname="ref")
+ {
+ assert( $this->connection );
+ $this->errorMsg = '';
+ $this->errorNo = 0;
+
+ $sqlparams = array();
+ foreach ( $params as $key=>$value )
+ {
+ $sqlparams[]=$this->clean_string($key).'=?';
+ }
+ foreach ( $nullify as $key )
+ {
+ $sqlparams[]=$this->clean_string($key).'= null';
+ }
+
+ $values = array_values($params);
+ $values[] = $ref;
+
+ $sqlupdate='update "'.$this->clean_string($table).'" set '.implode(',', $sqlparams).' where '.$this->clean_string($refname).'=?';
+ $stmt = $this->connection->Prepare($sqlupdate);
+ $recordset = $this->connection->Execute($stmt, $values);
+
+ if ($recordset === False)
+ {
+ $this->errorMsg = $this->connection->ErrorMsg();
+ $this->errorNo = $this->connection->ErrorNo();
+ return False;
+ }
+ else
+ return True;
+ }
+
+ /**
+ * Delete a row in a table
+ *
+ * This function delete the table row given by the primary key
+ * <code>ref</code>.
+ *
+ * @param string the table to update the row data in
+ * @param integer the primary key of the row to update
+ * @params string name of the tables primary key (defaults to <code>ref</code>)
+ * @returns boolean True on success, false otherwhise
+ */
+ function delete_row($table, $ref, $refname="ref")
+ {
+ assert( $this->connection );
+ $this->errorMsg = '';
+ $this->errorNo = 0;
+
+ $values = array( $ref );
+ $sqldelete='delete from "'.$this->clean_string($table).'" where '.$this->clean_string($refname).'=?';
+ $stmt = $this->connection->Prepare($sqldelete);
+ $recordset = $this->connection->Execute($stmt, $values);
+
+ if ($recordset === False)
+ {
+ $this->errorMsg = $this->connection->ErrorMsg();
+ $this->errorNo = $this->connection->ErrorNo();
+ return False;
+ }
+ else
+ return True;
+ }
+
+ /**
+ * error function
+ *
+ * This function returns a string specifying the Error Code and Message
+ * from the last statement, or the empty string if no error was raised.
+
+ * @returns string ErrorCode and Message if there was an error, an empty string otherwhise
+ */
+ function error()
+ {
+ if ($this->errorNo)
+ return "ErrorNo: ".$this->errorNo."; ErrorMsg: ".$this->errorMsg.";";
+ else
+ return "";
+ }
+};
+
+# vim:set ts=4:
+# vim:set shiftwidth=4:
+?>
diff --git a/web/include/Makefile.am b/web/include/Makefile.am
new file mode 100644
index 0000000..1c8e13d
--- /dev/null
+++ b/web/include/Makefile.am
@@ -0,0 +1,15 @@
+SUBDIRS =
+
+based_in = .
+include $(top_srcdir)/Makefile.common
+
+doc_DATA = \
+ Config.inc \
+ DB.inc \
+ Messages.inc \
+ Namespace.inc \
+ Session.inc \
+ Template.inc \
+ Tools.inc \
+ User.inc
+
diff --git a/web/include/Messages.inc b/web/include/Messages.inc
new file mode 100644
index 0000000..5de5497
--- /dev/null
+++ b/web/include/Messages.inc
@@ -0,0 +1,24 @@
+<?
+/* Messages for RemSaint
+ *
+ * (c) 2002 Peter Palfrader <pp@3node.com>
+ */
+
+/**
+ * Messages for RemSaint
+ *
+ * @author Peter Palfrader/3node
+ * @version $Id$
+ */
+
+class Messages {
+ var $creating_session_failed = 'Creating Session Failed!';
+
+ function Messages() {
+ }
+
+}
+
+# vim:set ts=4:
+# vim:set shiftwidth=4:
+?>
diff --git a/web/include/Namespace.inc b/web/include/Namespace.inc
new file mode 100644
index 0000000..4cfeccc
--- /dev/null
+++ b/web/include/Namespace.inc
@@ -0,0 +1,63 @@
+<?
+/* Global Variables and Stuff for remsaint
+ *
+ * (c) 2002 Peter Palfrader <pp@3node.com>
+ */
+
+require_once("../include/Config.inc");
+require_once("../include/DB.inc");
+require_once("../include/Messages.inc");
+require_once("../include/Session.inc");
+require_once("../include/User.inc");
+
+class Namespace {
+ var $have_database = false;
+ var $have_session = false;
+ var $have_user = false;
+
+ var $config = false;
+ var $database = false;
+ var $messages = false;
+ var $session = false;
+ var $user = false;
+
+ function Namespace($options = array()) {
+ if ($options['have_database'])
+ $this->have_database = $options['have_database'];
+ if ($options['have_session'])
+ $this->have_session = $options['have_session'];
+ if ($options['have_user'])
+ $this->have_user = $options['have_user'];
+
+ $this->config = new Config() or
+ die("Count not create config object");
+ $this->messages = new Messages or
+ die("Could not create messages object");
+
+ if ($this->have_database)
+ $this->database = new Database (
+ $this->config->db_type,
+ $this->config->db_host,
+ $this->config->db_user,
+ $this->config->db_password,
+ $this->config->db_name) or
+ die("Could not create database object");
+ if ($this->have_session)
+ $this->session = new Session( $this->database, $this->config->session_cookie_name, $this->messages ) or
+ die("Could not create session object");
+ if ($this->have_user)
+ $this->user = new User( $this->database, $this->session, $this->config->auth_timeout ) or
+ die("Could not create user object");
+ }
+
+ function stop() {
+ if ($this->have_session) {
+ assert($this->session);
+ $this->session->close();
+ }
+ }
+}
+
+# vim:set ts=4:
+# vim:set shiftwidth=4:
+?>
diff --git a/web/include/Session.inc b/web/include/Session.inc
new file mode 100644
index 0000000..d6c926a
--- /dev/null
+++ b/web/include/Session.inc
@@ -0,0 +1,180 @@
+<?
+#
+# vim:set ts=4:
+# vim:set shiftwidth=4;
+#
+
+require_once "../include/Tools.inc";
+
+
+class Session
+{
+ var $id = false;
+ var $ref = false;
+ var $db = false;
+ var $messages = false;
+ var $cookie_name = false;
+
+ /**
+ * create a new Session
+ *
+ * creates a new session by calling <code>get_id()</code> and
+ * throwing an error on failure.
+ *
+ * @params object a Database object
+ * @params string Name of the cookie holding session id
+ * @params object a Messages object
+ */
+ function Session(&$database, $cookie_name, &$messages) {
+ assert($cookie_name);
+ assert($database);
+ assert($messages);
+
+ $this->cookie_name = $cookie_name;
+ $this->db = &$database;
+ $this->messages = &$messages;
+
+ $this->get_id();
+ }
+
+ /**
+ * stores current session to database
+ *
+ * This function stores the current session to the database by
+ * calling <code>store_data</code> and sets <code>id</code> and
+ * <code>ref</code> to false.
+ *
+ * @returns boolean true on success, false otherwhise
+ */
+ function close() {
+ if (! $this->id)
+ return true;
+
+ assert($this->id != '');
+ assert($this->db);
+
+ if ($this->store_data() === false)
+ return false;
+ $this->id = false;
+ $this->ref = false;
+ $this->data = false;
+ return true;
+ }
+
+ /**
+ * Get data from database
+ *
+ * Fetches data for the current id from the database
+ * and sets <code>session_data_ref</code>.
+ *
+ * @returns boolean true on success, false otherwhise
+ */
+ function get_data()
+ {
+ assert($this->id != '');
+ assert($this->db);
+ $row=$this->db->query_row('select ref, data from session where id=?', array($this->id));
+ if ( $row === false )
+ return false;
+
+ $this->ref = $row['ref'];
+ $this->data = ($row['data']) ? unserialize($row['data']) : false;
+ assert($this->ref);
+ return true;
+ }
+
+ /**
+ * Store data in database
+ *
+ * Dumps data for the current id into the database.
+ *
+ * @returns boolean true on success, false otherwhise
+ */
+ function store_data()
+ {
+ assert($this->ref);
+ assert($this->id != '');
+ assert($this->db);
+ return $this->db->update('session', $this->ref, array(data => serialize($this->data), last_seen => 'now'));
+ }
+
+ /**
+ * Create a session in the database with the current id
+ *
+ * Creates a session in the database and fills local variables by
+ * calling <code>get_data()</code>.
+ *
+ * @returns boolean true if success
+ */
+ function create_session()
+ {
+ assert($this->id != '');
+ assert($this->db);
+ $result = $this->db->insert('session',array(id => $this->id));
+ if ( $result === false )
+ return false;
+ return $this->get_data();
+ }
+
+ /**
+ * Create a unique string useable as session ID
+ *
+ * @returns string a unique session ID
+ */
+ function create_id() {
+ $id = $_SERVER["UNIQUE_ID"];
+ $id .= md5(time.rand(0,1000000));
+ return $id;
+ }
+
+ /**
+ * Set session ID for current session
+ *
+ * Should there be no session ID a new session ID is created, inserted into
+ * the database (creating a new session), sent as a cookie to the luser,
+ * and returned.
+ *
+ * Also makes sure ref is set and persistent session data is loaded.
+ *
+ * @returns string session ID, boolean false on error
+ */
+ function set_id() {
+ if ( ! $this->id ) {
+ $this->id = $this->create_id();
+ if ($this->create_session() === false) {
+ $this->id = false;
+ return false;
+ }
+ setcookie($this->cookie_name, $this->id);
+ } else {
+ if ($this->get_data() === false) {
+ $this->id = false;
+ return false;
+ }
+ }
+
+ return $this->id;
+ }
+
+ /**
+ * Get session ID for current session
+ *
+ * This function takes the session ID of a cookie, checks wheter it is
+ * database and if yes, returns it.
+ *
+ * Also makes sure ref is set and persistent session data is loaded.
+ *
+ * @returns string session ID, boolean false on error
+ */
+ function get_id() {
+ $this->id=$_COOKIE[$this->cookie_name];
+ if ($this->id)
+ if ($this->get_data() === false)
+ $this->id = false;
+
+ return $this->id;
+ }
+}
+
+
+?>
diff --git a/web/include/Template.inc b/web/include/Template.inc
new file mode 100644
index 0000000..144bcdb
--- /dev/null
+++ b/web/include/Template.inc
@@ -0,0 +1,238 @@
+<?
+ # vim:set ts=4:
+ # vim:set shiftwidth=4:
+
+ /*
+ * Beat - 3node BTS
+ * (c) 2002
+ * Guenther Harrasser/3node
+ * Peter Palfrader/3node
+ * Florian Reitmeir/3node
+ * Bernhard Weitzhofer/3node
+ *
+ * $Id:$
+ */
+
+#
+# Todo:
+# * cachen von Positionen
+# * Dokumentation
+# * Aufräumen
+# * bei IF / UNLESS mit mehreren Values AND/OR auswahl ermöglichen
+#
+class Template
+{
+ var $raw_content;
+ var $parsed_content;
+ var $path;
+
+ var $begin_parse_time;
+ var $end_parse_time;
+
+
+ #
+ # new Class, read file..
+ function Template($filename,$path='.')
+ {
+ $this->path=$path;
+ $content_array = file($this->path.'/'.$filename);
+ $this->raw_content = implode("", $content_array);
+ $this->global_data=array();
+ }
+
+ function parse(&$data)
+ {
+ if ( ! $this->begin_parse_time )
+ $this->begin_parse_time = microtime();
+ if ( $GLOBALS['global_template_params'] )
+ $data = array_merge($data, $GLOBALS['global_template_params']);
+ $this->parsed_content=$this->parse_rek($data, $this->raw_content);
+ $this->end_parse_time = microtime();
+ }
+
+ function evaluate(&$data, &$name, &$values, $and)
+ {
+ if ($and === true)
+ $return_value = true;
+ else
+ $return_value = false;
+
+ foreach ($values as $value)
+ {
+ if ($and === true)
+ $return_value &= ($data[$name]==$value);
+ else
+ $return_value |= ($data[$name]==$value);
+ }
+ return $return_value;
+ }
+
+ function parse_rek(&$data, &$raw)
+ {
+ $position = 0;
+ $out = '';
+ # JA, dieses komische !== brauchts wirklich so.
+ # GENAU SO
+ # GLAUBS MIR EINFACH
+ # $a !== $b Not identical TRUE if $a is not equal to $b, or they are not of the same type. (PHP 4 only)
+ while ( ($command_position=strpos($raw, '<TMPL', $position) ) !== false )
+ {
+ # get text before command
+ $out.=substr($raw, $position, $command_position-$position);
+
+ # get command
+ preg_match("/_(.+?)\s+NAME=\"(.+?)\"(?:\s+VALUE=\"(.+?)\")?.*?>/", substr($raw,$command_position), $matches);
+ $command = array();
+ $command['command']=$matches[1];
+ $command['name']=$matches[2];
+ if (isset($matches[3])) {
+ $command['value']=$matches[3];
+ preg_match("/(VALUE=.*)\s*>/", substr($raw,$command_position), $matches);
+ if ( isset($matches) )
+ {
+ $command['values'] = explode('VALUE=', $matches[1]);
+ unset($command['values'][0]);
+ foreach ( $command['values'] as $key=>$value)
+ {
+ $command['values'][$key] = substr(trim($value),1,-1);
+ }
+ }
+ }
+
+ # get new position
+ $position=strpos($raw, '>', $command_position)+1;
+
+ switch($command['command'])
+ {
+ case 'INCLUDE':
+ $template = new Template($command['name'],$this->path);
+ $template->parse($data);
+ $out.=$template->output();
+ break;
+ case 'VAR_NOESC':
+ $out.=$data[$command['name']];
+ break;
+ case 'VAR':
+ $out.=htmlspecialchars($data[$command['name']]);
+ break;
+ case 'UNLESS':
+ $endif_command_position=strpos($raw, '</TMPL_UNLESS NAME="'.$command['name'].'">', $position);
+ $if_text=substr($raw, $position,$endif_command_position-$position);
+ $position=strpos($raw, '>', $endif_command_position)+1;
+
+ if (isset($command['value']))
+ {
+ if ( ! $this->evaluate($data, $command['name'], $command['values'], false) )
+ #if ( $data[$command['name']]!=$command['value'] )
+ $out.=$this->parse_rek($data, $if_text);
+ }
+ else
+ {
+ if ( ! $data[$command['name']] )
+ $out.=$this->parse_rek($data, $if_text);
+ }
+ break;
+ case 'IF':
+ $endif_command_position=strpos($raw, '</TMPL_IF NAME="'.$command['name'].'">', $position);
+ $if_text=substr($raw, $position,$endif_command_position-$position);
+ $position=strpos($raw, '>', $endif_command_position)+1;
+
+ if (isset($command['value']))
+ {
+ if ( $this->evaluate($data, $command['name'], $command['values'], false) )
+ # if ( $data[$command['name']]==$command['value'] )
+ $out.=$this->parse_rek($data, $if_text);
+ }
+ else
+ {
+ if ( $data[$command['name']] )
+ $out.=$this->parse_rek($data, $if_text);
+ }
+ break;
+ case 'CMP':
+ $endif_command_position=strpos($raw, '</TMPL_CMP NAME="'.$command['name'].'">', $position);
+ $if_text=substr($raw, $position,$endif_command_position-$position);
+ $position=strpos($raw, '>', $endif_command_position)+1;
+
+ if ( $data[$command['name']]==$data[$command['value']] )
+ $out.=$this->parse_rek($data, $if_text);
+ break;
+ case 'LOOP':
+ $endloop_command_position=strpos($raw, '</TMPL_LOOP NAME="'.$command['name'].'">', $position);
+ $loop_text=substr($raw, $position,$endloop_command_position-$position);
+ $position=strpos($raw, '>', $endloop_command_position)+1;
+
+ if ( isset($data[$command['name']]) )
+ {
+ foreach ( $data[$command['name']] as $row )
+ {
+ # test if row is set...
+ if ( isset( $row ) )
+ {
+ # set global variable scope
+ $local=array_merge($data, $row);
+ $out.=$this->parse_rek($local, $loop_text);
+ }
+ }
+ }
+ break;
+# (TMPL_ACCESS - wie TPL_LOOP, nur, dass nicht auf alle array-elemente zugegriffen wird,
+# sondern nur auf das in VALUE angegebene. wird VALUE nicht angegeben, wird das 1. element verwendet.)
+ case 'ACCESS':
+ $endaccess_command_position=strpos($raw, '</TMPL_ACCESS NAME="'.$command['name'].'">', $position);
+ $access_text=substr($raw, $position,$endaccess_command_position-$position);
+ $position=strpos($raw, '>', $endaccess_command_position)+1;
+ if ( isset($data[$command['name']]) ) {
+ if ( isset( $command['value'] ) ) {
+ $row = $data[$command['name']][$command['value']];
+ }
+ else {
+ reset( $data[$command['name']] );
+ $row = current( $data[$command['name']] );
+ }
+ if ( isset( $row ) )
+ {
+ # set global variable scope
+ $local=array_merge($data, $row);
+ $out.=$this->parse_rek($local, $access_text);
+ }
+ }
+ break;
+ case 'NAMESPACE':
+ $endloop_command_position=strpos($raw, '</TMPL_NAMESPACE NAME="'.$command['name'].'">', $position);
+ $loop_text=substr($raw, $position,$endloop_command_position-$position);
+ $position=strpos($raw, '>', $endloop_command_position)+1;
+
+ if ( isset($data[$command['name']]) )
+ {
+ $row = $data[$command['name']];
+ # set global variable scope
+ $local=array_merge($data, $row);
+ $out.=$this->parse_rek($local, $loop_text);
+ }
+ break;
+ case 'RANDOM':
+ $endloop_command_position = strpos($raw, '</TMPL_RANDOM NAME="'.$command['name'].'">', $next_pos);
+ $loop_text=substr($raw, $position,$endloop_command_position-$position);
+
+ $hits = split( '<TMPL_RANDOM NAME="'.$command['name'].'">', $loop_text );
+ $chosen = rand(0, sizeof($hits) - 1);
+ $position=strpos($raw, '>', $endloop_command_position)+1;
+
+ $out.=$this->parse_rek($data, $hits[$chosen]);
+ break;
+ }
+ }
+ $out.=substr($raw, $position);
+ return $out;
+ }
+
+ function output()
+ {
+ header('Cache-Control: no-cache, must-revalidate');
+ header('Pragma: no-cache');
+ $time = $this->end_parse_time-$this->begin_parse_time;
+ return $this->parsed_content."\n<!-- time: ".$time." secs -->\n";
+ }
+}
+?>
diff --git a/web/include/Tools.inc b/web/include/Tools.inc
new file mode 100644
index 0000000..430fe54
--- /dev/null
+++ b/web/include/Tools.inc
@@ -0,0 +1,152 @@
+<?
+ # vim:set ts=4:
+ # vim:set shiftwidth=4:
+
+ /*
+ * Backslide - 3node BTS
+ * (c) 2002 Florian Reitmeir/3node
+ * Peter Palfrader/3node
+ *
+ * $Id: Tools.inc,v 1.2 2002/05/28 14:31:24 weasel Exp $
+ */
+#
+# Todo:
+# * Dokumemtation
+#
+function error($msg)
+{
+
+ print "Error: $msg\n";
+ exit;
+}
+
+function redirect($ns, $name='', $vars = array())
+{
+ if (sizeof($vars)>0) {
+ foreach ($vars as $key=>$value) {
+ $param[] = $key.'='.urlencode($value);
+ }
+ $pars = '?' . implode('&', $param);
+ } else {
+ $pars = '';
+ }
+
+ if ($name != '') {
+ Header('Location: '.$ns->config->baseurl.'/'.$name . $pars);
+ } elseif (isset ($GLOBALS['followup_to'])) {
+ Header('Location: '.$GLOBALS['followup_to'] . $pars);
+ } elseif (isset ($GLOBALS['HTTP_REFERER'])) {
+ Header('Location: '.$GLOBALS['HTTP_REFERER'] . $pars);
+ } else {
+ error('Fehler: Weiss nicht mehr wohin jetzt.');
+ };
+}
+
+function param_check(&$parameters, &$new_check_fields, $optionals=array())
+{
+ $check_parameters = array();
+
+ $params_required = isset($optionals['params_required']) ? $optionals['params_required']: true;
+ $form_id = isset($optionals['form_id']) ? $optionals['form_id'] : $parameters['form_id'];
+
+ if ( ! isset($form_id) )
+ if ( $params_required )
+ error('Formular ID: not set');
+ else {
+ $form_id='default';
+ }
+
+ if ( $form_id == 'default' && ! isset($new_check_fields[$form_id]) )
+ return $check_parameters;
+
+ if ( ! isset($new_check_fields[$form_id]) )
+ error("Formular ID: is set ('$form_id') but no ruleset defined");
+
+ assert($form_id !== false );
+ assert($new_check_fields[$form_id] !== false);
+
+ $check_fields = $new_check_fields[$form_id];
+ foreach( $check_fields as $field_name => $field ) {
+
+ if ( !isset($parameters[$field_name]) && $field['type'] != 'boolean' ) {
+ if (!$field['optional'] )
+ error('Parameter '.$field_name.' not found');
+ } else {
+ if ( isset($field['length']) && strlen($parameters[$field_name])>$field['length'] )
+ error('Parameter '.$field_name.' to long');
+
+ unset($result);
+ switch ($field['type']) {
+ case 'integer':
+ if (!(is_numeric($parameters[$field_name]) && is_int($parameters[$field_name] + 0)))
+ error($field_name . ' is not an Integer');
+ $result=$parameters[$field_name] + 0;
+ break;
+ case 'decimal':
+ if (! isset($field['scale']) )
+ $field['scale'] = 0;
+ assert(isset($field['precision']));
+ assert(isset($field['scale']));
+ $vorkomma = '[0-9]{0,'.($field['precision'] - $field['scale']).'}';
+ $nachkomma = '[0-9]{0,'.($field['scale']).'}';
+ $regex = $vorkomma . '(\.'.$nachkomma.')?';
+ $matches = preg_match('/^'.$regex.'$/', $parameters[$field_name]);
+ if (! $matches)
+ error($field_name . " is not Decimal (matching $regex)");
+ $result=$parameters[$field_name];
+ if ($result === '')
+ $result = 0;
+ break;
+ case 'string':
+ if (!is_string($parameters[$field_name]))
+ error($field_name . ' is not a String');
+ $result=trim($parameters[$field_name]);
+ break;
+ case 'boolean':
+ if ($parameters[$field_name])
+ $result=true;
+ else
+ $result=false;
+ break;
+ case 'anything':
+ $result=$parameters[$field_name];
+ break;
+ default:
+ error('unkown Type '.$field['type'].' in Ruleset '.$form_id.' for field '.$field_name);
+ }
+
+ assert(isset($result));
+ if ( isset( $field['modifier'] ) )
+ if ( is_array($field['modifier']) )
+ foreach ($field['modifier'] as $modifier) {
+ assert(is_callable($modifier));
+ $result = $modifier($result);
+ }
+ else {
+ assert(is_callable($field['modifier']));
+ $result = $field['modifier']($result);
+ }
+
+ if (! $field['discard'])
+ $check_parameters[$field_name] = $result;
+ }
+ }
+ $check_parameters['form_id']=$form_id;
+ return $check_parameters;
+}
+
+function print_array(&$fields, $die = 0)
+{
+ echo "<pre>";
+ print_r($fields);
+ echo "XXXXXXXXXXXX</pre>";
+
+ if ($die)
+ exit;
+}
+
+# vim:set ts=4:
+# vim:set syntax=php:
+# vim:set shiftwidth=4:
+
+?>
diff --git a/web/include/User.inc b/web/include/User.inc
new file mode 100644
index 0000000..84d36b3
--- /dev/null
+++ b/web/include/User.inc
@@ -0,0 +1,150 @@
+<?
+#
+# vim:set ts=4:
+# vim:set shiftwidth=4;
+#
+
+class User
+{
+ var $ref;
+ var $session = false;
+ var $auth_timeout = false;
+
+ var $db;
+
+ /**
+ * create a new User object
+ *
+ * creates a new user by looking into the <code>session</code>
+ *
+ * @param object Database Object
+ * @param object Session Object
+ * @param integer Login timout in seconds
+ */
+ function User(&$database, &$session, $auth_timeout) {
+ assert($session);
+ assert($database);
+ assert($auth_timeout);
+ $this->session = &$session;
+ $this->auth_timeout = $auth_timeout;
+ $this->db = &$database;
+
+ $last_seen = $this->session->data['user']['last_seen'];
+ $ref = $this->session->data['user']['ref'];
+ $authenticated = false;
+
+ if ( $last_seen &&
+ ( $last_seen + $this->auth_timeout >= time()) &&
+ ( $time_seen <= time() ) &&
+ $this->session->data['user']['authenticated'] &&
+ $this->check_ref_session($ref) )
+ $authenticated = true;
+ else {
+ $ref = false;
+ $authenticated = false;
+ $last_seen = false;
+ }
+
+ $this->session->data['user']['authenticated'] = $authenticated;
+ $this->session->data['user']['last_seen'] = $authenticated ? time() : false;
+ $this->session->data['user']['ref'] = $ref;
+ }
+
+ /**
+ * Check if given Ref is a valid user ref
+ *
+ * checks if the ref and current session are from the same user.
+ *
+ * @param integer user ref
+ * @returns boolean true if success
+ */
+ function check_ref_session($ref) {
+ assert($this->session);
+ assert($this->session->ref);
+ assert($this->db);
+ assert($ref);
+
+ $row=$this->db->query_row('SELECT ref FROM account WHERE session_ref=? AND ref=?', array($this->session->ref, $ref));
+
+ if ( $row === false )
+ return false;
+ else
+ return true;
+ }
+
+ /**
+ * Do the login of a user
+ *
+ * Check if username and password are a valid pair, and update session_ref
+ * in database, set timestamp.
+ *
+ * @param string supplied username from user
+ * @param string supplied password from user
+ * @returns boolean true if success
+ */
+ function do_login($username, $password)
+ {
+ assert($this->session);
+ assert($this->session->ref);
+ assert($this->db);
+# assert($username);
+# assert($password);
+ if ( ! $username )
+ return false;
+ if ( ! $password )
+ return false;
+
+ $row=$this->db->query_row('SELECT ref FROM account WHERE username=? AND password=?', array($username,$password));
+
+ if ( $row === false )
+ return false;
+
+ $update = $this->db->update('account', $row['ref'], array(session_ref=>$this->session->ref));
+ if ( ! $update )
+ return false;
+
+ $this->session->data['user']['authenticated'] = true;
+ $this->session->data['user']['last_seen'] = time();
+ $this->session->data['user']['ref'] = $row['ref'];
+ $this->session->data['user']['username'] = $username;
+
+ # FIXME: old session is destroyed
+ return true;
+ }
+
+ /**
+ * Logout the User
+ *
+ * logout the user, do not check if has logged in.
+ *
+ * @returns boolean true on success, false otherwhise
+ */
+ function do_logout()
+ {
+ assert($this->session);
+ assert($this->session->ref);
+ $this->session->data['user']['authenticated'] = false;
+ $this->session->data['user']['last_seen'] = false;
+ $this->session->data['user']['ref'] = false;
+ $this->session->data['user']['username'] = false;
+ return true;
+ }
+
+ /**
+ * Check for login status
+ *
+ * Checks if user has logged in correctly.
+ *
+ * @returns boolean true on authenticated, false otherwhise
+ */
+ function check_login()
+ {
+ assert($this->session);
+ if (! $this->session->get_id())
+ return false;
+ assert($this->session->ref);
+ return $this->session->data['user']['authenticated'];
+ }
+}
+
+?>
diff --git a/web/index.php b/web/index.php
new file mode 100644
index 0000000..6c37e0b
--- /dev/null
+++ b/web/index.php
@@ -0,0 +1,27 @@
+<?
+
+require_once( "../include/Namespace.inc" );
+require_once( "../include/Template.inc" );
+require_once("../include/Tools.inc");
+
+$namespace = new Namespace(
+ array( have_database => 1,
+ have_session => 1,
+ have_user => 1 )
+) or
+ die("Nobody loves me. I don't even have space for a name.");
+
+$data = array();
+$data['remotehostname'] = gethostbyaddr($_SERVER['REMOTE_ADDR']);
+$data['remoteip'] = $_SERVER['REMOTE_ADDR'];
+$data['user'] = $namespace->session->data['user']['username'];
+$data['have_ssl'] = $_SERVER['SSL_PROTOCOL'] ? 1 : 0;
+$template = new Template('index.html', $namespace->config->template_path);
+$template->parse($data);
+print $template->output();
+
+$namespace->stop();
+
+# vim:ts=4:
+# vim:shiftwidth=4:
+?>
diff --git a/web/login.php b/web/login.php
new file mode 100644
index 0000000..691e26e
--- /dev/null
+++ b/web/login.php
@@ -0,0 +1,56 @@
+<?
+require_once("../include/Namespace.inc");
+require_once("../include/Tools.inc");
+require_once("../include/Template.inc");
+
+$namespace = new Namespace(
+ array( have_database => 1,
+ have_session => 1,
+ have_user => 1 )
+) or
+ die("Nobody loves me. I don't even have space for a name.");
+
+$rules = Array();
+$rules['auth']['password'] = array(type => 'string');
+$rules['auth']['username'] = array(type => 'string');
+$rules['auth']['goto'] = array(type => 'string', optional => 1);
+$rules['login']['goto'] = array(type => 'string', optional => 1);
+$rules['login']['username'] = array(type => 'string', optional => 1);
+$rules['login']['message'] = array(type => 'string', optional => 1);
+$arguments = param_check($GLOBALS, $rules, array(params_required=>false));
+
+$message = $arguments['message'];
+$logged_in = 0;
+
+if ( $arguments['form_id']=='auth' ) {
+ $namespace->session->set_id();
+ $result = $namespace->user->do_login( $arguments['username'], $arguments['password']);
+ if ($result)
+ $logged_in = 1;
+ else
+ $message = 'Invalid username/password pair.';
+}
+
+if (! $logged_in ) {
+ $data = array();
+ $data['goto'] = $arguments['goto'];
+ $data['message'] = $message;
+ $data['username'] = $namespace->session->data['user']['username'];
+ $data['username_field'] = $arguments['username'];
+
+ $template = new Template('login.html', $namespace->config->template_path);
+ $template->parse($data);
+ print $template->output();
+} else {
+ if ($arguments['goto'])
+ redirect($namespace, $arguments['goto']);
+ else
+ redirect($namespace, './');
+}
+
+$namespace->stop();
+
+
+# vim:set ts=4:
+# vim:set shiftwidth=4:
+?>
diff --git a/web/logout.php b/web/logout.php
new file mode 100644
index 0000000..8069a39
--- /dev/null
+++ b/web/logout.php
@@ -0,0 +1,25 @@
+<?
+require_once("../include/Namespace.inc");
+require_once("../include/Tools.inc");
+require_once("../include/Template.inc");
+
+$namespace = new Namespace(
+ array( have_database => 1,
+ have_session => 1,
+ have_user => 1 )
+) or
+ die("Nobody loves me. I don't even have space for a name.");
+
+$namespace->user->do_logout();
+
+$data = array();
+
+$template = new Template('logout.html', $namespace->config->template_path);
+$template->parse($data);
+print $template->output();
+
+$namespace->stop();
+
+# vim:set ts=4:
+# vim:set shiftwidth=4:
+?>
diff --git a/web/remsaint-subscription.php b/web/remsaint-subscription.php
new file mode 100644
index 0000000..0c7bfb5
--- /dev/null
+++ b/web/remsaint-subscription.php
@@ -0,0 +1,126 @@
+<?
+/* RemSaint
+ *
+ * (c) 2002 Peter Palfrader <pp@3node.com>
+ */
+
+/**
+ * RemSaint
+ *
+ * @author Peter Palfrader/3node
+ * @version $Id$
+ */
+
+require_once("../include/Namespace.inc");
+require_once("../include/Tools.inc");
+require_once("../include/Template.inc");
+
+$namespace = new Namespace(
+ array( have_database => 1,
+ have_session => 1,
+ have_user => 1 )
+) or
+ die("Nobody loves me. I don't even have space for a name.");
+
+$message = '';
+$username = '';
+
+if (! $namespace->user->check_login()) {
+ $message = 'Not logged in. Nothing done.';
+} else {
+ $username = $namespace->session->data['user']['username'];
+ $rules = Array();
+ $rules['subscription']['ref'] = array(type => 'anything');
+ $refs = param_check($GLOBALS, $rules);
+
+ $rules = Array();
+ foreach ($refs['ref'] as $ref) {
+ if (! is_int($ref + 0) ) {
+ $message = 'Wrong refs';
+ break;
+ } else {
+ $rules['subscription']['warning_'.$ref] = array(type => 'boolean');
+ $rules['subscription']['critical_'.$ref] = array(type => 'boolean');
+ $rules['subscription']['recovery_'.$ref] = array(type => 'boolean');
+ };
+ };
+ if ($message == '') {
+ $arguments = param_check($GLOBALS, $rules);
+ $user_ref = $namespace->session->data['user']['ref'];
+
+ foreach ($refs['ref'] as $ref) {
+ if ($arguments['warning_'.$ref] ||
+ $arguments['critical_'.$ref] ||
+ $arguments['recovery_'.$ref])
+ $user_subs[$ref] = array (
+ notify_warning => $arguments['warning_'.$ref],
+ notify_critical => $arguments['critical_'.$ref],
+ notify_recovery => $arguments['recovery_'.$ref],
+ );
+ }
+ $db_subs = $namespace->database->query_all("SELECT remailer.nick, subscription.ref, subscription.remailer_ref, subscription.notify_warning, subscription.notify_critical, subscription.notify_recovery FROM remailer JOIN subscription ON remailer.ref=subscription.remailer_ref WHERE subscription.account_ref=?", array($user_ref));
+ foreach ($db_subs as $sub) {
+ if (isset ($user_subs[$sub['remailer_ref']])) {
+ $user_sub = $user_subs[$sub['remailer_ref']];
+ $sub['notify_warning'] = $sub['notify_warning'] == 't' ? 1 : false;
+ $sub['notify_critical'] = $sub['notify_critical'] == 't' ? 1 : false;
+ $sub['notify_recovery'] = $sub['notify_recovery'] == 't' ? 1 : false;
+ if (($sub['notify_warning'] == $user_sub['notify_warning']) &&
+ ($sub['notify_critical'] == $user_sub['notify_critical']) &&
+ ($sub['notify_recovery'] == $user_sub['notify_recovery'])) {
+ $message .= 'Not changing subscription to remailer '.$sub['nick'].".<BR>\n";
+ } else {
+ $user = ($user_sub['notify_warning'] ? 'W' : '_') .
+ ($user_sub['notify_critical'] ? 'C' : '_') .
+ ($user_sub['notify_recovery'] ? 'R' : '_');
+ $db = ($sub['notify_warning'] ? 'W' : '_') .
+ ($sub['notify_critical'] ? 'C' : '_') .
+ ($sub['notify_recovery'] ? 'R' : '_');
+ $message .= 'Changing subscription to remailer '.$sub['nick']." from $db to $user: ";
+ $s = array();
+ $s['notify_warning'] = $user_sub['notify_warning'] ? 'T' : 'F';
+ $s['notify_critical'] = $user_sub['notify_critical'] ? 'T' : 'F';
+ $s['notify_recovery'] = $user_sub['notify_recovery'] ? 'T' : 'F';
+ $res = $namespace->database->update('subscription', $sub['ref'], $s);
+ $message .= ($res ? 'OK' : 'FAILED')."<BR>\n";
+ }
+ } else {
+ $message .= 'Deleting subscription to remailer '.$sub['nick'].': ';
+ $res = $namespace->database->delete_row('subscription', $sub['ref']);
+ $message .= ($res ? 'OK' : 'FAILED')."<BR>\n";
+ };
+ unset($user_subs[$sub['remailer_ref']]);
+ }
+ foreach ($user_subs as $ref => $sub) {
+ $rem = $namespace->database->query_row("SELECT remailer.nick FROM remailer WHERE ref=?", array($ref));
+ if ($rem) {
+ $s = array();
+ $s['remailer_ref'] = $ref;
+ $s['account_ref'] = $user_ref;
+ $s['notify_warning'] = $sub['notify_warning'] ? 'T' : 'F';
+ $s['notify_critical'] = $sub['notify_critical'] ? 'T' : 'F';
+ $s['notify_recovery'] = $sub['notify_recovery'] ? 'T' : 'F';
+ $message .= 'Adding subscription to remailer '.$rem['nick'].': ';
+ $res = $namespace->database->insert('subscription', $s);
+ $message .= ($res ? 'OK' : 'FAILED')."<BR>\n";
+ } else {
+ $message .= 'Remailer '.$rem."does not exist.<BR>\n";
+ }
+ }
+ $message .= 'done.<BR>';
+ }
+}
+
+$data = array();
+$data['message'] = $message;
+$data['user'] = $username;
+
+$template = new Template('remsaint-subscription.html', $namespace->config->template_path);
+$template->parse($data);
+print $template->output();
+
+$namespace->stop();
+
+# vim:set ts=4:
+# vim:set shiftwidth=4:
+?>
diff --git a/web/remsaint.php b/web/remsaint.php
new file mode 100644
index 0000000..91f3468
--- /dev/null
+++ b/web/remsaint.php
@@ -0,0 +1,76 @@
+<?
+/* RemSaint
+ *
+ * (c) 2002 Peter Palfrader <pp@3node.com>
+ */
+
+/**
+ * RemSaint
+ *
+ * @author Peter Palfrader/3node
+ * @version $Id$
+ */
+
+require_once("../include/Namespace.inc");
+require_once("../include/Tools.inc");
+require_once("../include/Template.inc");
+
+$namespace = new Namespace(
+ array( have_database => 1,
+ have_session => 1,
+ have_user => 1 )
+) or
+ die("Nobody loves me. I don't even have space for a name.");
+
+$rules = Array();
+$rules['list']['manage'] = array(type => 'integer', optional => 1);
+$rules['list']['sort'] = array(type => 'string', optional => 1);
+$arguments = param_check($GLOBALS, $rules, array(params_required=>false));
+
+$user = false;
+$userref = false;
+$manage = $arguments['manage'] ? 1 : 0;
+
+if (! $namespace->user->check_login())
+ $manage = 0;
+else {
+ $user = $namespace->session->data['user']['username'];
+ $userref = $namespace->session->data['user']['ref'];
+}
+
+$orderby='nick';
+$sort='nick';
+if ($arguments['sort'] == 'type1') {
+ $orderby='-reliability_type1';
+ $sort='reliability_type1';
+};
+if ($arguments['sort'] == 'type2') {
+ $orderby='-reliability_type2';
+ $sort='reliability_type2';
+};
+if ($arguments['sort'] == 'status') {
+ $orderby='in_critical, in_warning';
+ $sort = 'status';
+};
+
+
+$data = array();
+# YYYY-MM-DD HH24:MI TZ
+if ($manage)
+ $data['remailers'] = $namespace->database->query_all("SELECT subscription.ref, remailer.ref, remailer.in_warning, remailer.in_critical, remailer.nick, remailer.reliability_type1, remailer.reliability_type2, to_char(remailer.last_update, 'YYYY-MM-DD') AS last_update, listed1, listed2, subscription.notify_warning, subscription.notify_critical, subscription.notify_recovery, true AS t, false AS f FROM remailer LEFT OUTER JOIN (SELECT * FROM subscription WHERE subscription.account_ref=?) as subscription ON remailer.ref=subscription.remailer_ref ORDER BY $orderby", array($userref));
+else
+ $data['remailers'] = $namespace->database->query_all("SELECT ref, in_warning, in_critical, nick, reliability_type1, reliability_type2, to_char(last_update, 'YYYY-MM-DD') AS last_update, listed1, listed2, true AS t, false AS f FROM remailer ORDER BY $orderby");
+$data['manage'] = $manage;
+$data['sort'] = $sort;
+$data['user'] = $user;
+$data['this'] = $PHP_SELF;
+
+$template = new Template('remsaint-status.html', $namespace->config->template_path);
+$template->parse($data);
+print $template->output();
+
+$namespace->stop();
+
+# vim:set ts=4:
+# vim:set shiftwidth=4:
+?>
diff --git a/web/resources.html b/web/resources.html
new file mode 100644
index 0000000..62d31a4
--- /dev/null
+++ b/web/resources.html
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<HTML>
+ <HEAD>
+ <TITLE>Anonymous Remailers Meta Stats and other Information</TITLE>
+ <META name="Description" content="Anonymous Remailers Meta Stats and other Information">
+ <META name="Keywords" content="stats, statistics, remailer, reliability, anonymous, nym, mixmaster">
+ </HEAD>
+ <BODY bgcolor="#aaaaaa" text="#000000" LINK="#0000ff" ALINK="#ff0000" VLINK="#ff0000">
+ <TABLE cellpadding=0 cellspacing=0 width="100%">
+ <TR><TD colspan=2 bgcolor="#444444"><FONT color="#ffffff"><A href="/"><FONT color="#bbbbff">www.noreply.org</FONT></A> :: Resources</FONT></TD></TR>
+ <TR><TD colspan=2 bgcolor="#ffffff">&nbsp;</TD></TR>
+ <TR><TD bgcolor="#ffffff">&nbsp;</TD>
+ <TD bgcolor="#ffffff">
+
+ <H1>remailer-xxx Sites</H1>
+ <P>
+ The following sites query each remailer in regular intervalls and store the replies
+ to remailer-conf, remailer-key, remailer-stats and remailer-help.
+ <UL>
+ <li><a href="http://www.aarg.net/remailer/thesaurus/">AARG! Pinger</a></li>
+ <li><a href="http://www.tahina.priv.at/~cm/stats/thesaurus/">austria</a></li>
+ <li><a href="http://www.bananasplit.info/echolot/thesaurus/">banana</a></li>
+ <li><a href="http://remailer.cryptofortress.com/thesaurus/">cf</a></li>
+ <li><a href="http://xenophon.homeip.net/echolot/thesaurus/">chicago remailer</a></li>
+ <li><a href="http://privacy.outel.org/thesaurus/">citrus</a></li>
+ <li><a href="http://www.cside.dyndns.org/stats/thesaurus/">cside</a></li>
+ <li><a href="http://remailer.hyperreal.info/thesaurus/">dot (hyperreal.info)</a></li>
+ <li><a href="http://frell.ambush.de/remailer/echolot/thesaurus/">frell.eu.org</a></li>
+ <li><a href="http://stats.mixmaster.it/thesaurus/">george</a></li>
+ <li><a href="http://www.gurski.org/remstats/thesaurus/">gurski.org</a></li>
+ <li><a href="http://hermes.eocto.net/~pinger/thesaurus/">hermes</a></li>
+ <li><a href="http://remailer.metacolo.com/stats/thesaurus/">metacolo</a></li>
+ <li><a href="http://www.noreply.org/echolot/thesaurus/">Noreply</a></li>
+ <li><a href="http://remailer.autistici.org/stats/thesaurus/">paranoia</a></li>
+ <li><a href="http://stats.melontraffickers.com/thesaurus/">Randseed Pinger</a></li>
+ </UL>
+ <P> &lt;conspiracy theory&gt;Since all those services are run by the same entity anyway, it
+ makes no sense to simply fetch the -keys from all of them and be happy with it if they match.
+ &lt;/conspiracy theory&gt; <EM>Get them yourself from each remailer!</EM> I mean it!
+
+
+ <H1>Other Sites of Interest</H1>
+ <UL>
+ <LI><A href="http://riot.eu.org/anon/remap.html">The Remailer Geographical Mapping Project</A> (@ RIOT)</LI>
+ <!--<LI><A href="http://www.arancio.net/">Orange Project</A></LI>-->
+ <!--<LI><A href="http://www.nuther-planet.net/farout/misc/default.htm">Farout</A></LI>-->
+ </UL>
+
+ <H1>random links</H1>
+ <UL>
+ <LI><a href="http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/">rrdtool</a> - the tool used to make some of those nice graphs</LI>
+ <LI><a href="http://ploticus.sourceforge.net/">ploticus</a> - the tool used to make another part of the graphs</LI>
+ </UL>
+
+
+ </TD></TR>
+ <TR><TD colspan=2 bgcolor="#ffffff">&nbsp;</TD></TR>
+ <TR><TD colspan=2 bgcolor="#444444"><FONT color="#ffffff"><EM><a href="mailto:web@palfrader.org"><font color="#bbbbff">web@palfrader.org</font></a></EM> -
+ <a href="http://validator.w3.org/check/referer"><font color="#bbbbff">Valid HTML 4.01!</font></a></FONT></TD></TR>
+ </TABLE>
+ </BODY>
+</HTML>
diff --git a/web/rot26/Makefile.am b/web/rot26/Makefile.am
new file mode 100644
index 0000000..e1d4e43
--- /dev/null
+++ b/web/rot26/Makefile.am
@@ -0,0 +1,6 @@
+SUBDIRS = keys
+
+based_in = htdocs
+include $(top_srcdir)/Makefile.common
+
+doc_DATA = index.html
diff --git a/web/rot26/index.html b/web/rot26/index.html
new file mode 100644
index 0000000..cceb6c1
--- /dev/null
+++ b/web/rot26/index.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<HTML>
+ <HEAD>
+ <TITLE>ROT26 Anonymous Remailer</TITLE>
+ <META name="Description" content="ROT26 Anonymous Remailer">
+ <META name="Keywords" content="stats, statistics, remailer, reliability, anonymous, nym, mixmaster">
+ </HEAD>
+ <BODY bgcolor="#aaaaaa" text="#000000" LINK="#0000ff" ALINK="#ff0000" VLINK="#ff0000">
+ <TABLE cellpadding=0 cellspacing=0 width="100%">
+ <TR><TD colspan=2 bgcolor="#444444"><FONT color="#ffffff"><A href="/"><FONT color="#bbbbff">www.noreply.org</FONT></A> :: Rot26</FONT></TD></TR>
+ <TR><TD colspan=2 bgcolor="#ffffff">&nbsp;</TD></TR>
+ <TR><TD bgcolor="#ffffff">&nbsp;</TD>
+ <TD bgcolor="#ffffff">
+
+ <h1>ROT26 Anonymous Remailer</h1>
+ <p>
+ The rot26 remailer can be reached at <a href="mailto:rot26@mix.uucico.de">rot26@mix.uucico.de</a>.
+ <p>
+ Its operator reads mail sent to <a href="mailto:remop@mix.uucico.de">remop@mix.uucico.de</a>.
+ <p>
+ To get the help file, remailer and admin keys, stats, or configuration send mail to
+ <a href="mailto:rot26@mix.uucico.de">rot26@mix.uucico.de</a> with a subject of
+ <em><a href="mailto:rot26@mix.uucico.de?subject=remailer-help">remailer-help</a></em>,
+ <em><a href="mailto:rot26@mix.uucico.de?subject=remailer-key">remailer-key</a></em>,
+ <em><a href="mailto:rot26@mix.uucico.de?subject=remailer-adminkey">remailer-adminkey</a></em>,
+ <em><a href="mailto:rot26@mix.uucico.de?subject=remailer-stats">remailer-stats</a></em>, or
+ <em><a href="mailto:rot26@mix.uucico.de?subject=remailer-conf">remailer-conf</a></em>.
+
+ <h1>History</h1>
+ <ul>
+ <li><em>2004-05-02</em>: Revoked old admin key <a href="keys/4B8AC6A8.asc"><code>4B8AC6A8</code></a>. No known compromises.</li>
+ <li><em>2004-04-10</em>: New key <a href="keys/c4818fe61b42c8d27e87a476fcd76b6f"><code>c4818fe61b42c8d27e87a476fcd76b6f</code></a> (Expires: 2005-05-05).</li>
+ <li><em>2004-01-18</em>: New admin key <a href="keys/66DC9EA2.asc"><code>66DC9EA2</code></a> (<code>FABE 1727 8E0C 4598 5C6F 9513 F1F8 9A53 66DC 9EA2</code>).</li>
+ <li><em>2003-05-24</em>: Rot26 moves back to its own host with a new hard disk. Hope this one lasts a bit longer.</li>
+ <li><em>2003-05-22</em>: All known copies of <a href="keys/292faf0ee7c93743c76df482c0fa550a"><code>292faf0ee7c93743c76df482c0fa550a</code></a>'s secret key have been destroyed. No known compromises.</li>
+ <li><em>2003-05-22</em>: Old key <a href="keys/292faf0ee7c93743c76df482c0fa550a"><code>292faf0ee7c93743c76df482c0fa550a</code></a> decommissioned.</li>
+ <li><em>2003-04-16</em>: New key <a href="keys/d4285164186b2fdda3af791e1571e3cc"><code>d4285164186b2fdda3af791e1571e3cc</code></a> (Expires: 2004-05-10).</li>
+ <li><em>2003-02-23</em>: hard disk fails. Able to backup data immediatly before. rot26 moves to another host for the time being.</li>
+ <li><em>2002-11-07</em>: Revoked old admin key <a href="keys/A91FB036.asc"><code>A91FB036</code></a>. No known compromises.</li>
+ <li><em>2002-11-02</em>: All known copies of <a href="keys/7f6d997678b19ccac110f6e669143126"><code>7f6d997678b19ccac110f6e669143126</code></a>'s secret key have been destroyed. No known compromises.</li>
+ <li><em>2002-10-28</em>: Old key <a href="keys/7f6d997678b19ccac110f6e669143126"><code>7f6d997678b19ccac110f6e669143126</code></a> decommissioned.</li>
+ <li><em>2002-09-18</em>: New key <a href="keys/292faf0ee7c93743c76df482c0fa550a"><code>292faf0ee7c93743c76df482c0fa550a</code></a> (Expires: 2003-05-16).</li>
+ <li><em>2002-08-16</em>: New admin key <a href="keys/4B8AC6A8.asc"><code>4B8AC6A8</code></a> (<code>933F DC66 6DC5 DC14 88F1 1D2C C168 1A43 4B8A C6A8</code>).</li>
+ <li><em>2002-02-02</em>: All known copies of <a href="keys/30b16a30c2b3af1ec5d5625fcb5059ef"><code>30b16a30c2b3af1ec5d5625fcb5059ef</code></a>'s secret key have been destroyed. No known compromises.</li>
+ <li><em>2002-01-10</em>: New key <a href="keys/7f6d997678b19ccac110f6e669143126"><code>7f6d997678b19ccac110f6e669143126</code></a></li>
+ <li><em>2001-08-26</em>: rot26 entered production state</li>
+ <li><em>2001-08-18</em>: rot26 open for public testing - mixkey: <a href="keys/30b16a30c2b3af1ec5d5625fcb5059ef"><code>30b16a30c2b3af1ec5d5625fcb5059ef</code></a>; admin key: <a href="keys/A91FB036.asc"><code>A91FB036</code></a> (<code>F85B ACB2 1E32 F5EC EF7D 305F F0F9 3894 A91F B036</code>)</li>
+ </ul>
+
+ <!--
+ <h1>Queue Sizes</h1>
+
+ <img src="MTA-monthly.png" width="497" height="181" alt="Queue Sizes"><br>
+ <img src="Mix-monthly.png" width="497" height="181" alt="Mix Pool Size"><br>
+ <img src="Traffic-monthly.png" width="497" height="181" alt="Remailed Messages"><br>
+ -->
+
+
+ </TD></TR>
+ <TR><TD colspan=2 bgcolor="#ffffff">&nbsp;</TD></TR>
+ <TR><TD colspan=2 bgcolor="#444444"><FONT color="#ffffff"><EM><a href="mailto:web@palfrader.org"><font color="#bbbbff">web@palfrader.org</font></a></EM> -
+ <a href="http://validator.w3.org/check/referer"><font color="#bbbbff">Valid HTML 4.01!</font></a></FONT></TD></TR>
+ </TABLE>
+ </BODY>
+</HTML>
diff --git a/web/rot26/keys/292faf0ee7c93743c76df482c0fa550a b/web/rot26/keys/292faf0ee7c93743c76df482c0fa550a
new file mode 100644
index 0000000..4adf332
--- /dev/null
+++ b/web/rot26/keys/292faf0ee7c93743c76df482c0fa550a
@@ -0,0 +1,15 @@
+rot26 rot26@mix.uucico.de 292faf0ee7c93743c76df482c0fa550a 2:3.0a2-cvs-200212181400 MC 2002-09-18 2003-05-16
+
+-----Begin Mix Key-----
+292faf0ee7c93743c76df482c0fa550a
+258
+AATGjZaLgmatQSsqu8BlbtBH7gDsldoltiCkbDYR
+Hde6AjB3QstuOLXmAgRaZSdHgeCCb2EZOAHwyoYL
+62HZ/orQQVSOGGfObKy1JnfKNkeNpMDYTgGmsPUF
+OfAwmV8I4zhutVGYEjGC4TcW+iPOrcl3DC2SwWQr
+3Ol5chdkFRPWLQAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAQAB
+-----End Mix Key-----
diff --git a/web/rot26/keys/30b16a30c2b3af1ec5d5625fcb5059ef b/web/rot26/keys/30b16a30c2b3af1ec5d5625fcb5059ef
new file mode 100644
index 0000000..71e92eb
--- /dev/null
+++ b/web/rot26/keys/30b16a30c2b3af1ec5d5625fcb5059ef
@@ -0,0 +1,15 @@
+rot26 rot26@mix.uucico.de 30b16a30c2b3af1ec5d5625fcb5059ef 2.9beta23pp2 MC
+
+-----Begin Mix Key-----
+30b16a30c2b3af1ec5d5625fcb5059ef
+258
+AATh8/BnFVoHQDTYoEouVDI6YBz0hFsrgTsu3w4h
+/0t0xeWjaCPhJr4H+BERqSKV/D4+neWdDH1p2xOI
+GCjVHcl2SyviJ4o2bXtPaZhsHUDFHIFpjipnyNsg
+FEXrkkG3hnu1zo7XK0B3pz+aDQLFkhNhD+kZ8aJG
+1bjS02uMPkM5SQAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAQAB
+-----End Mix Key-----
diff --git a/web/rot26/keys/4B8AC6A8.asc b/web/rot26/keys/4B8AC6A8.asc
new file mode 100644
index 0000000..f819867
--- /dev/null
+++ b/web/rot26/keys/4B8AC6A8.asc
@@ -0,0 +1,41 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.2.4 (GNU/Linux)
+
+mQGiBD1cbd8RBACLAG5nl/L+Tv6yhOKfDEqOlUXb/Jao5HSHJfm1zSBlO9SQ5aus
++ZU/Wnbo47GjRnMxWuk7UEcWAmTZMz2Hfu57Cngnq33PsXo53/w++P6js5XA/Gqk
+5QH9ZkQf2QahHOQgUMIK6IYJ3DgkCmWGPb9RZ1TfHLZeNhl4Aab9ySXTuwCgvDgE
+FtfL6v6Ph/touK8gArUeHlUD/2ElVT5hVONdaByJJ/8FoRDo1P5vQrY7S9WJ1v+n
+x3KGD7Ndx50s7Dhf0yRooEptbc4vDvBScJaUUsxiSbcM823pWg5NfpHmwZIFO3YM
+ptzHOmQIh7AlIxc3yufVitfSAAOEf7ZqByVSKdHySjygsXwTeRvwpFzyggV2pkLf
+O8OeA/9eMjDFD3mWg9Yzgn8urp9E/1ldoF7azvn3jDTWQPzXDHtj3/ezjywyCHmx
+RtAaFAp8PFPhy+nxh1uxMplzmhHN53d7m98VjKykjsRj7/GAWXsgSmaPvdRXjz+y
+NK66NrbSSHId/xRK9C+pMKXODIBm6c6TJrhsEJMd1dohhYtov4iiBCARAgBiBQJA
+lEw3Wx0BU3VwZXJzZWRlZCBieSBuZXcgYWRtaW4ga2V5IDY2REM5RUEyIChGQUJF
+IDE3MjcgOEUwQyA0NTk4IDVDNkYgOTUxMyBGMUY4IDlBNTMgNjZEQyA5RUEyKS4A
+CgkQwWgaQ0uKxqiP3gCgrd/UBxFTGojCW739ShasjX01SXgAnjQ8LNd9glCqblIa
+2Pegxc4jDyp/tgAAADZST1QtMjYgUmVtYWlsZXIgT3BlcmF0b3IgKERTQSAyKSA8
+cmVtb3BAbWl4LnV1Y2ljby5kZT6IXwQTEQIAHwUCPVxt3wUJAsfqAAQLBwMCAxUC
+AwMWAgECHgECF4AACgkQwWgaQ0uKxqgMfwCglq0HzF9kTAeIYTR2Uzcizzxr2HsA
+oKKIK44N55A9KHVgFbkuwci9+dFpiEYEExECAAYFAj1ce2oACgkQ8Pk4lKkfsDYD
+EwCdFEjOrvaLZN9fDW/Tn9ZG6s/qbWoAnAxh75Ajzs7cBeu+nbPc0+sscuaRiMIE
+ERECAIIFAj7bYZ0FgwFI9kIxFIAAAAAACAAgQGNvbW1lbnRUaGlzIHNpZ25hdHVy
+ZSBjZXJ0aWZpZXMgYSByb2xlLkMUgAAAAAAFADVAcm9sZU9wZXJhdG9yIG9mIHRo
+ZSByb3QyNiA8cm90MjZAbWl4LnV1Y2ljby5kZT4gcmVtYWlsZXIuAAoJEJWaMx06
+6QoUnLYAnjtNyeGXXnQYIoEZACvvxuXtY1dsAKDHiV3/5P1WCJQ6iR0IK2B2I91J
+gYhMBBIRAgAMBQI+YSKJBYMBwzVWAAoJEBRZh+voyzqxV3QAn1+UOje9nMtX8i88
+axlklrjdCUEqAKCtzGKaWt67nkwTz0u4HyNGI5V3PLkCDQQ9XG5vEAgAmHwKrRP0
+qKK6JTKLicJ8WTnndBjltTII9mgTGG6+zmmC7NZ2CyvYr2VM4R6ZAO7rnKiMXK6E
+8lMN2c419s/Ds5xtw/eS9olfkU5UC8ZER/qLPigQTLwi9VXKkqfwNmU9ab7/uP+j
+9VyIGb0cDS+I8H3kETXlJhSNfHCCcYhy1DuzySBkZV5FxN5jdUq/Nkbb9DCvqkhp
+f4ZkqS8q6P6tlJpHWpOI9OM5+rKedu6+Wl9Knq6ft5tXJ8naALyuLg13vC8M8HkC
+drtzx3Zqty0ajx32AwRUpLDwhQIiEk6qtJ+Oc/Vq6PBr2Ws6GQzoaxsNrMr4BwIM
+tCyM7pyl2pCYqwADBQf9HyrNjh3ztN3krnDhQmdqSa2y+GWhd5jUUE+q0KjO6Qkr
+5Ute8gQ6ZiCZcBP771FTjiOb7+cXSCJ0KZfc6wTIOIID+IVFeEejkgIn+KS7GR2O
+nUtZWR6E1tqrmlyT/0pbyRUAC1/LbKqczmDxN8HfFEPtlzbfMpbn18KYra28NZh7
+KtlQhNe9g+ZlX4lqsYw1vCY3c3ZEY7xuVuEUQVtTPX26nl0/f4vcYos1UwG4EJFE
+X2M8IHh+aG/xVnY/V7KnvMHIuiJiATWKBbLHnKzU5GS3tXxc1f9wWfqtXbsF3/9U
+RIvyvT7LMFd8MSa0hX1MZHA8jOStIAQxTT9GWb7mCohMBBgRAgAMBQI9XG5vBQkC
+x+oAAAoJEMFoGkNLisaoxjoAnjrqzoKH79qzdOivZllH6nDiQsPwAKCbkL9tBrl3
+kIN3gDccsOVE2TECJw==
+=ReZn
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/web/rot26/keys/66DC9EA2.asc b/web/rot26/keys/66DC9EA2.asc
new file mode 100644
index 0000000..e0aa9a1
--- /dev/null
+++ b/web/rot26/keys/66DC9EA2.asc
@@ -0,0 +1,32 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.2.2 (GNU/Linux)
+
+mQGiBEAK1vYRBACpWSyWD9Gx8I25In7Prs8RbLkK3r8fY9/hmCXk6qYYIp+8D1Gn
+Qqp1gj4T9ZFgjqfHf7FhmvHLtdruCIj9vPLpTl1IiUOkbVYlYbbWxk96w5pJWriR
+9qy5jTBAxQSHu59SKgK0CoEBJ3i0QHW+gs/tn4Kfnw298/3fF0cCmD+UYwCggOBA
+evixIlc2nPA1PKJNommJAbkD/2oICHU451awotljwGfEtIFkp5xrKS7Q7VKpCeZw
+kV1vvhdDAopVhmoFXqw1whqgbz0J6umOZw+9SQH8tALCwvPfIvhHFjrBdOSI8n1+
+rDRb4h5eYukHPCTIimSFmmycYKNi2xMnYcyBlZclYpMy5hYatr5ezNMMBMK1JDiv
+PBU8A/4650cNJFva8zmSRV8aMPBjnqdDo8GtONzOVE6uHUE1/SlENbIgb+lFqrS1
+bXIHxmLdSOerr1W1IXsKUHhzRCRLLAJyJwpcJRj2LncVrEYZW+iod7m2oz3dAkRg
+/4+D+DMdgVOdW/CjuwGGGU2Dw8NFNGkNB9908VkYXCgmHTDdjbQ2Uk9ULTI2IFJl
+bWFpbGVyIE9wZXJhdG9yIChEU0EgMykgPHJlbW9wQG1peC51dWNpY28uZGU+iGQE
+ExECACQFAkAK1vYCGwMFCQPCZwAGCwkIBwMCAxUCAwMWAgECHgECF4AACgkQ8fia
+U2bcnqLdBgCfXCla0Op1o6O1WmeZHCE7ZiFpXtsAn2/H0OxDGqP2u8GTaH06vbTF
+b4qPiEYEExECAAYFAkAK16AACgkQwWgaQ0uKxqhcxQCdHynVm7FdKqrr/EI/Tg/Z
+g+TtZWcAn2i80CMKnjjxbwAYjPhuF1wDU13JuQINBEAK1yQQCAC2cZCd4rEl1Yrk
+BRzQiDPN5Ns/Wz61YXswPjLLf8qiW7rZ2ng4oPaSYitbAZHbK5VH3eBgF1eY4RPL
+UvenoJUM+vbEoEm3naMrmnKGU0Hs60K4O4aJdpAgWbdWCe3FQo0xCYxQx7xE2cu1
+Esxrs0luY7qFWarKzHnVNKxbo9FcWas9ZqavhvHafkGORw22xmA39vT9UfIdjjoN
+abfPHvJgXp3Fcc25TisiJTTwcj1MRGcUFrmkFJTQVoI+LysPesGpYWJY4vd90xFG
+JPUNQfGYfxuEfHMd0dl9qIAcMZsoTRT3n+X4YdrP8AnlSKzUmR7SryKw3K0GS/Nw
+Ou8e1S4fAAQNCACCTusIjP4Agv/XQAHtEqJmyVp81c60IzjQqcK1MoFHNPETBDOU
+iDXZsVj0dRHUltOu9b3VsD83Tu3Ea6yRRnY9iuCItJZVRD0ECuQjzDVr+3nRReTr
+PB0jMlcb6WFUZHA7jUnk6YYx5Ix9O0RycCj+fNxb88exD9AtsHogO6ITvwxu109H
+SlgLxuc1N6S9kCgXyyp8zAxAAbi6vEKBeZL3R5ZLH+YAlG+5X/SMFS3Be0igXHel
+uWQh2E3vGbNlb1NEepNkwjmYHgP28HMDuuK3d1e7KYFZ9O7kM/hCMKpxMwCbfppQ
+kZGvkNxvogiiJx++QIiu79fs2t6TlCw0+hBxiE8EGBECAA8FAkAK1yQCGwwFCQPC
+ZwAACgkQ8fiaU2bcnqKD7wCfXfd4cnWUZAOBX6g/xaZUF71Ab74AnA+IMh+rhuXK
+HPN47wxx3daTvdf/
+=oWAO
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/web/rot26/keys/7f6d997678b19ccac110f6e669143126 b/web/rot26/keys/7f6d997678b19ccac110f6e669143126
new file mode 100644
index 0000000..6e3163d
--- /dev/null
+++ b/web/rot26/keys/7f6d997678b19ccac110f6e669143126
@@ -0,0 +1,15 @@
+rot26 rot26@mix.uucico.de 7f6d997678b19ccac110f6e669143126 2.9b33 MC
+
+-----Begin Mix Key-----
+7f6d997678b19ccac110f6e669143126
+258
+AASyedeKiP1/UKyfrBz2K6gIhv4jfXIaHo8dGmwD
+KqkG3DwytgSySSY3wYm0foT7KvEnkG2aTi/uJva/
+gymE+tsuM8l8iY1FOiXwHWLDdyUBPbrLjRkgm7GD
+Y7ogSjPhVLeMpzkSyO/ryeUfLZskBUBL0LxjLInB
+YBR3o6p/RiT0EQAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAQAB
+-----End Mix Key-----
diff --git a/web/rot26/keys/A91FB036.asc b/web/rot26/keys/A91FB036.asc
new file mode 100644
index 0000000..aaf5a4f
--- /dev/null
+++ b/web/rot26/keys/A91FB036.asc
@@ -0,0 +1,37 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.2.1 (GNU/Linux)
+
+mQGiBDt9icURBADRl3Su/X/EneAQs22LHpQZRmjXkhAYApF7ZffeF04gKS0oZ+UT
+j0gUdLia+vF8JDSq/HjIdKTeBy10Lbt95Da+jxMIgLjH/zSG5O/GJsxGz2KG2End
+MI1FOGBh29GcWkBGoWMb2Ala+c16vJeluvg8ANhwsEj8FwkU8ka3GH89GwCgnsoS
+R8+Xqo5rebmkJjLvNcPFHEMD/3WRZaDmgW3kT2LQqbNwtVUMNzkxwGMssHxgs3OD
+lmxO4N/GH3gqpM2BclFwYi3Xe/bOgWrhD/Mn7CbuEYHiTsuotlycr0AXrjQ88msQ
+012fSVZ00vrXAWJnsauJAz+D7ZtK28xO4afo6xz3Ka8V4LWqxn5/mpQB69AS/qg0
+NZFXBADPA4jgNO3sUNNuAuZSnuWnQG4XFF/+0+64kHgu/8t2nxbdaEbFU14bm866
+3oUAATzJXB+0k6M/ABbAqUWPU4OheQgOdJf/uJbe7lKrPlF/8vsfnufKA3yeNpZk
+lAXmf16nRfzDBJFtM194QETgmCcXi2WMo1M2QUE4KhgOi28ZxokBAwQgEQIAwwUC
+Pch007wdAUtleSBoYXMgYmVlbiBzdXBlcnNlZGVkIGJ5IDRCOEFDNkE4OgoxMDI0
+RC80QjhBQzZBOCAyMDAyLTA4LTE2IFJPVC0yNiBSZW1haWxlciBPcGVyYXRvciAo
+RFNBIDIpIDxyZW1vcEBtaXgudXVjaWNvLmRlPgpLZXkgZmluZ2VycHJpbnQgPSA5
+MzNGIERDNjYgNkRDNSBEQzE0IDg4RjEgIDFEMkMgQzE2OCAxQTQzIDRCOEEgQzZB
+OAAKCRDw+TiUqR+wNqdHAJ9OjfjjpjyEuXqmp7e2/oP2g33dHACfc0x2HkuBDbrU
+vlc/vnfGBazi9QO0LlJPVC0yNiBSZW1haWxlciBPcGVyYXRvciA8cmVtb3BAbWl4
+LnV1Y2ljby5kZT6IRgQQEQIABgUCO32NFgAKCRAh1DwgbkQCYTrlAJ4lf3v0u3+O
+YIx/xRVY6gXR/yWppwCeIEu83vGbkmX5xnTDEwFZKeRl2UuIXQQTEQIAHQUCO32J
+xgUJAsfqAAULBwoDBAMVAwIDFgIBAheAAAoJEPD5OJSpH7A28YcAoIH9GpQXC2JB
+PK38NvmouihEJ+NFAJ9EAPqui8wnjvgn4yJzXLQQsyoizLkCDQQ7fYoAEAgAnR0D
+pXxmxDeU2h08XTSG8FxcYhvGg4Oqz8l2zO3PLbDzYCNV+WpiXPUDapQYBiwxAjrO
+ixmt5kUM/FjGaFwW3NrrWG4+f8o6wkyMBowQ24ZkXOfkrNUS5MF+/735KHxAkCYt
+Bx0Xfrs3lSy6t5/2F++CX6Z8i8RQ53yDAinACddVe8xm123ASAf1JfK5+tXhQMMa
+o/HOwpOhbE9yhumQXZDqewJ97ndDHA74KfgAEDxg1G/djHzxstSibv5tQttSanOp
+mHdmj4nzl/vfzKNq4xfOIb1tIBqyi5ivtRlJu+MEeHTIWTeo5AWL4AiJAXoYKyDr
+4q36qxU/ElO2FYPplwADBwf/T9znpHVWXd09v7b4y84V0deO8i0Ls453Fgww0wJM
+LnkQ9cCRHnoGpRgI44C0nfNk5IGnTHVpgoHwooRq3EbYsgof4uVNnZp6PaOcHVdM
+r3rwroGpdgxeq+ZyXCSNNoZGt1hIqFtzeDRlrF5PqgEtva51WmlcWAR5w0A0bD8Z
+GbcvIJVAbSi9CThmdkFYxGM7XWKBNIMy4Z4E556s6UgGVKzRgL8Uw45B0AKSbmVa
+Q3LfUJvHKKDhTwDOIEU5S39JfTAJZjc0/gk5mJRDHx1K2EbHz7fssxfW4HloOf7m
+AojOKxVV4wZU/WgdJibQL2+3y/Tw4tlFRK6ER8Rfxs3qrYhMBBgRAgAMBQI7fYoA
+BQkCx+oAAAoJEPD5OJSpH7A25hwAn3JxeY+c4hYq+Ur7hMhTXPniZZetAKCOFyRR
+xaTu7ODKLRw5XzzIRQfD9w==
+=m1uN
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/web/rot26/keys/Makefile.am b/web/rot26/keys/Makefile.am
new file mode 100644
index 0000000..7aae232
--- /dev/null
+++ b/web/rot26/keys/Makefile.am
@@ -0,0 +1,15 @@
+SUBDIRS =
+
+based_in = htdocs
+include $(top_srcdir)/Makefile.common
+
+doc_DATA = \
+ 4B8AC6A8.asc \
+ 66DC9EA2.asc \
+ A91FB036.asc \
+ 292faf0ee7c93743c76df482c0fa550a \
+ 30b16a30c2b3af1ec5d5625fcb5059ef \
+ 7f6d997678b19ccac110f6e669143126 \
+ c4818fe61b42c8d27e87a476fcd76b6f \
+ d4285164186b2fdda3af791e1571e3cc
+
diff --git a/web/rot26/keys/c4818fe61b42c8d27e87a476fcd76b6f b/web/rot26/keys/c4818fe61b42c8d27e87a476fcd76b6f
new file mode 100644
index 0000000..dbbedfc
--- /dev/null
+++ b/web/rot26/keys/c4818fe61b42c8d27e87a476fcd76b6f
@@ -0,0 +1,15 @@
+rot26 rot26@mix.uucico.de c4818fe61b42c8d27e87a476fcd76b6f 2:3.0b1+ MC 2004-04-10 2005-05-05
+
+-----Begin Mix Key-----
+c4818fe61b42c8d27e87a476fcd76b6f
+258
+AATPwlANI+BmtZRqBANCHU+KKkwQR5MQS8WGIudl
+eo/1xKvHOgzkN/vuMuW6swO0syjtx7AThgTVhLe9
+ZPATBvpg1Wz9A6ERJJlQ67Q7NtFY8Slzhxo4eByG
+8/p89BpAW3ETMQm/E3SQouQ1Rx2nghgwDURH0ak3
+8ppjHmvUYa3bpQAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAQAB
+-----End Mix Key-----
diff --git a/web/rot26/keys/d4285164186b2fdda3af791e1571e3cc b/web/rot26/keys/d4285164186b2fdda3af791e1571e3cc
new file mode 100644
index 0000000..ae33e9b
--- /dev/null
+++ b/web/rot26/keys/d4285164186b2fdda3af791e1571e3cc
@@ -0,0 +1,15 @@
+rot26 rot26@mix.uucico.de d4285164186b2fdda3af791e1571e3cc 2:3.0a2-cvs-200212181400 MC 2003-04-16 2004-05-10
+
+-----Begin Mix Key-----
+d4285164186b2fdda3af791e1571e3cc
+258
+AATt3jrbs7pRR3ElOVb+DuTXacLM+2HMFsAPdzhT
+ohevpWDV4VW4uDUl52J6Dyn9WW2AkjR0fVFlMoat
+lIIsjZ9BCwERdzSe5wM+yHvO/RwGkufA+HpbG0AI
+0C515VFR2dRcHwy9mNuE0dSbB0Bk+yPzoc9hGjcc
+v/kfqFhJrFxihwAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAQAB
+-----End Mix Key-----
diff --git a/web/template/Makefile.am b/web/template/Makefile.am
new file mode 100644
index 0000000..eafd19f
--- /dev/null
+++ b/web/template/Makefile.am
@@ -0,0 +1,15 @@
+SUBDIRS =
+
+based_in = .
+include $(top_srcdir)/Makefile.common
+
+doc_DATA = \
+ account-create.html \
+ account-edit.html \
+ index.html \
+ login.html \
+ logout.html \
+ meta-chain.html \
+ metastats.html \
+ remsaint-status.html \
+ remsaint-subscription.html
diff --git a/web/template/account-create.html b/web/template/account-create.html
new file mode 100644
index 0000000..2a01a18
--- /dev/null
+++ b/web/template/account-create.html
@@ -0,0 +1,100 @@
+<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <title>Create Account</title>
+ </head>
+ <body bgcolor="#aaaaaa" text="#000000" LINK="#0000ff" ALINK="#ff0000" VLINK="#ff0000">
+ <table cellpadding=0 cellspacing=0 width="100%">
+ <tr>
+ <td colspan=2 bgcolor="#444444">
+ <font color="#ffffff">
+ <a href="/"><font color="#bbbbff">www.noreply.org</font></a> ::
+ Create Account</font>
+ </td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#444444">
+ <font color="#ffffff">
+ <TMPL_IF NAME="user">
+ Logged in as <a href="account-edit.php"><font color="#bbbbff"><TMPL_VAR NAME="user"></font></a>
+ -
+ <a href="logout.php"><font color="#bbbbff">Logout</font></a>
+ </TMPL_IF NAME="user">
+ <TMPL_UNLESS NAME="user">
+ Not logged in.
+ </TMPL_UNLESS NAME="user">
+ </td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#ffffff">
+ &nbsp;</td>
+ </tr>
+ <tr>
+ <td bgcolor="#ffffff">
+ &nbsp;</td>
+ <td bgcolor="#ffffff">
+ <p>
+ Creating a new user:
+ <p>
+ <TMPL_IF NAME="message">
+ <p>
+ <font color="red">
+ <strong>
+ <TMPL_VAR NAME="message">
+ </strong>
+ </font>
+ </TMPL_IF NAME="message">
+ <form method="post">
+ <input TYPE="hidden" NAME="goto" VALUE="<TMPL_VAR NAME="goto">">
+ <input TYPE="hidden" NAME="form_id" VALUE="commit">
+ <table>
+ <tr>
+ <th align="left">
+ Username:</th>
+ <td>
+ <input type="text" name="username" value="<TMPL_VAR NAME="username_field">">
+ </td>
+ </tr>
+ <tr>
+ <th align="left">
+ Your Name:</th>
+ <td>
+ <input type="text" name="name" value="<TMPL_VAR NAME="name_field">"> (optional)
+ </td>
+ </tr>
+ <tr>
+ <th align="left">
+ Email Address:</th>
+ <td>
+ <input type="text" name="address" value="<TMPL_VAR NAME="address_field">">
+ </td>
+ </tr>
+ <tr>
+ <th align="left">
+ &nbsp;</th>
+ <td>
+ <input type="submit">
+ <input type="reset">
+ </td>
+ </tr>
+ </table>
+ </form>
+ </td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#ffffff">
+ &nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#444444">
+ <font color="#ffffff">
+ <em><a href="mailto:web@palfrader.org"><font color="#bbbbff">web@palfrader.org</font></a></em> -
+ <a href="http://validator.w3.org/check/referer"><font color="#bbbbff">Valid HTML 4.01!</font></a>
+ </font>
+ </td>
+ </tr>
+ </table>
+ </body>
+ <!-- vim:set ts=2: -->
+ <!-- vim:set shiftwidth=2: -->
+</html>
diff --git a/web/template/account-edit.html b/web/template/account-edit.html
new file mode 100644
index 0000000..3e629c0
--- /dev/null
+++ b/web/template/account-edit.html
@@ -0,0 +1,145 @@
+<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <title>Update Account</title>
+ </head>
+ <body bgcolor="#aaaaaa" text="#000000" LINK="#0000ff" ALINK="#ff0000" VLINK="#ff0000">
+ <table cellpadding=0 cellspacing=0 width="100%">
+ <tr>
+ <td colspan=2 bgcolor="#444444">
+ <font color="#ffffff">
+ <a href="/"><font color="#bbbbff">www.noreply.org</font></a> ::
+ Update Account</font>
+ </td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#444444">
+ <font color="#ffffff">
+ <TMPL_IF NAME="user">
+ Logged in as <a href="account-edit.php"><font color="#bbbbff"><TMPL_VAR NAME="user"></font></a>
+ -
+ <a href="logout.php"><font color="#bbbbff">Logout</font></a>
+ </TMPL_IF NAME="user">
+ <TMPL_UNLESS NAME="user">
+ Not logged in.
+ </TMPL_UNLESS NAME="user">
+ </td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#ffffff">
+ &nbsp;</td>
+ </tr>
+ <tr>
+ <td bgcolor="#ffffff">
+ &nbsp;</td>
+ <td bgcolor="#ffffff">
+ <p>
+ Update account:
+ <p>
+ <TMPL_IF NAME="message">
+ <p>
+ <font color="red">
+ <strong>
+ <TMPL_VAR NAME="message">
+ </strong>
+ </font>
+ </TMPL_IF NAME="message">
+ <form method="post" action="<TMPL_VAR NAME="PHP_SELF">">
+ <input TYPE="hidden" NAME="form_id" VALUE="commit">
+ <table>
+ <tr>
+ <th align="left">
+ Username:</th>
+ <td>
+ <TMPL_VAR NAME="username_field">
+ </td>
+ </tr>
+ <tr>
+ <th align="left">
+ Your Name:</th>
+ <td>
+ <input type="text" name="name" value="<TMPL_VAR NAME="name_field">"> (optional)
+ </td>
+ </tr>
+ <tr>
+ <th align="left">
+ Password:</th>
+ <td>
+ <input type="password" name="password1">
+ </td>
+ </tr>
+ <tr>
+ <th align="left">
+ again:</th>
+ <td>
+ <input type="password" name="password2">
+ </td>
+ </tr>
+ <tr>
+ <th align="left">
+ &nbsp;</th>
+ <td>
+ <input type="submit" name="commt" value="Update">
+ <input type="reset">
+ </td>
+ </tr>
+ </table>
+ </form>
+
+ <p>
+ <strong>Email Addresses</strong>
+ <table>
+ <tr>
+ <th>Address</th>
+ <th>Status</th>
+ <th>Action</th>
+ <th>&nbsp;</th>
+ </tr>
+ <TMPL_LOOP NAME="addresses">
+ <tr>
+ <td><TMPL_VAR NAME="address"></td>
+ <TMPL_CMP NAME="verified" VALUE="t">
+ <TMPL_CMP NAME="enabled" VALUE="t">
+ <td>active, mail will be sent</td>
+ <td><form action="<TMPL_VAR NAME="PHP_SELF">" method="post"><input type="hidden" name="form_id" value="addr_disable"><input type="hidden" name="address_ref" value="<TMPL_VAR NAME="ref">"><input type="submit" name="disable" value="Set Disabled"></form></td>
+ </TMPL_CMP NAME="enabled">
+ <TMPL_CMP NAME="enabled" VALUE="f">
+ <td>disabled, mail will not be sent</td>
+ <td><form action="<TMPL_VAR NAME="PHP_SELF">" method="post"><input type="hidden" name="form_id" value="addr_enable"><input type="hidden" name="address_ref" value="<TMPL_VAR NAME="ref">"><input type="submit" name="enable" value="Set Active"></form></td>
+ </TMPL_CMP NAME="enabled">
+ </TMPL_CMP NAME="verified">
+ <TMPL_CMP NAME="verified" VALUE="f">
+ <td>not yet verified</td>
+ <td><form action="<TMPL_VAR NAME="PHP_SELF">" method="post"><input type="hidden" name="form_id" value="addr_verify"><input type="hidden" name="address_ref" value="<TMPL_VAR NAME="ref">"><input type="text" name="code" value=""><input type="submit" name="verify" value="Verify"></form></td>
+ </TMPL_CMP NAME="verified">
+ <td><form action="<TMPL_VAR NAME="PHP_SELF">" method="post"><input type="hidden" name="form_id" value="addr_delete"><input type="hidden" name="address_ref" value="<TMPL_VAR NAME="ref">"><input type="submit" value="delete" name="delete"></form></td>
+ </tr>
+ </TMPL_LOOP NAME="addresses">
+ <form action="<TMPL_VAR NAME="PHP_SELF">" method="post">
+ <input type="hidden" name="form_id" value="addr_new">
+ <tr>
+ <td><input type="text" name="address" value=""></td>
+ <td>new</td>
+ <td><input type="submit" value="Create" name="addr_new"></td>
+ </td>
+ </form>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#ffffff">
+ &nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#444444">
+ <font color="#ffffff">
+ <em><a href="mailto:web@palfrader.org"><font color="#bbbbff">web@palfrader.org</font></a></em> -
+ <a href="http://validator.w3.org/check/referer"><font color="#bbbbff">Valid HTML 4.01!</font></a>
+ </font>
+ </td>
+ </tr>
+ </table>
+ </body>
+ <!-- vim:set ts=2: -->
+ <!-- vim:set shiftwidth=2: -->
+</html>
diff --git a/web/template/index.html b/web/template/index.html
new file mode 100644
index 0000000..33d7d6e
--- /dev/null
+++ b/web/template/index.html
@@ -0,0 +1,130 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<HTML>
+ <HEAD>
+ <TITLE>Anonymous Remailer Stats, Meta-Stats and other Information</TITLE>
+ <META name="Description" content="Anonymous Remailer Stats, Meta-Stats and other Information">
+ <META name="Keywords" content="stats, statistics, remailer, reliability, anonymous, nym, mixmaster">
+ </HEAD>
+ <BODY bgcolor="#aaaaaa" text="#000000" LINK="#0000ff" ALINK="#ff0000" VLINK="#ff0000">
+ <TABLE cellpadding=0 cellspacing=0 width="100%">
+ <TR><TD bgcolor="#444444"><FONT color="#ffffff">www.noreply.org</FONT></TD></TR>
+ <tr>
+ <td colspan=2 bgcolor="#444444">
+ <font color="#ffffff">
+ <TMPL_IF NAME="user">
+ Logged in as <a href="account-edit.php"><font color="#bbbbff"><TMPL_VAR NAME="user"></font></a>
+ -
+ <a href="logout.php"><font color="#bbbbff">Logout</font></a>
+ </TMPL_IF NAME="user">
+ <TMPL_UNLESS NAME="user">
+ Not logged in: <a href="login.php?goto=remsaint.php"><font color="#bbbbff">Login</font></a>
+ </TMPL_UNLESS NAME="user">
+ </font>
+ </td>
+ </tr>
+ <TR><TD bgcolor="#ffffff">&nbsp;</TD></TR>
+ <TR><TD bgcolor="#ffffff">
+
+
+ <PRE>
+ &lt;&lt;&lt; EHLO <TMPL_VAR NAME="remotehostname">
+ &gt;&gt;&gt; 250-www.noreply.org Hello <TMPL_VAR NAME="remotehostname"> [<TMPL_VAR NAME="remoteip">], pleased to meet you.
+<!--<TMPL_UNLESS NAME="have_ssl"> &gt;&gt;&gt; 250-<A href="https://www.noreply.org/">STARTTLS</A>
+</TMPL_UNLESS NAME="have_ssl"><TMPL_IF NAME="have_ssl"> &gt;&gt;&gt; 250-STARTTLS
+</TMPL_IF NAME="have_ssl">--> &gt;&gt;&gt; 250-<A href="allpingers/">ALLPINGERS</A>
+ <!--&gt;&gt;&gt; 250-<A href="pinger/">PINGER</A>
+ -->&gt;&gt;&gt; 250-<A href="echolot/">PINGER</A>
+ &gt;&gt;&gt; 250-<A href="echolot/thesaurus/">THESAURUS</A>
+ &gt;&gt;&gt; 250-<A href="latency/">LATENCY</A>
+ &gt;&gt;&gt; 250-<A href="load/">LOAD</A>
+ &gt;&gt;&gt; 250-<A href="remsaint.php">REMSAINT</A>
+ &gt;&gt;&gt; 250-<A href="meta/">METASTATS</A>
+ &gt;&gt;&gt; 250-<A href="tls/">TLS-INFO</A>
+ &gt;&gt;&gt; 250-<A href="rot26/">ROT26</A>
+ &gt;&gt;&gt; 250-<A href="mixminion-nodes">MIXMINION-NODES</A>
+ &gt;&gt;&gt; 250-<A href="tor-running-routers">TOR-ROUTERS</A>
+ &gt;&gt;&gt; 250-<A href="resources.html">RESOURCES</A>
+ &gt;&gt;&gt; 250 HELP
+
+<!--<TMPL_IF NAME="have_ssl"> &lt;&lt;&lt; STARTTLS
+ &gt;&gt;&gt; 200-TLS enabled
+</TMPL_IF NAME="have_ssl">
+<TMPL_UNLESS NAME="have_ssl"> &lt;&lt;&lt; HELP STARTTLS
+ &gt;&gt;&gt; 214-<A href="https://www.noreply.org/">STARTTLS</A>
+ &gt;&gt;&gt; 214 Access this site via HTTPS (ssl encrypted).
+
+</TMPL_UNLESS NAME="have_ssl">--> &lt;&lt;&lt; HELP ALLPINGERS
+ &gt;&gt;&gt; 214-<A href="allpingers/">ALLPINGERS</A>
+ &gt;&gt;&gt; 214- The canonical list of all pingers. In both a nice HTML
+ &gt;&gt;&gt; 214 table and a machine readable format.
+
+ <!--&lt;&lt;&lt; HELP PINGER
+ &gt;&gt;&gt; 214-<A href="pinger/">PINGER</A>
+ &gt;&gt;&gt; 214- Mixmaster reliability stats as seen from the rot26
+ &gt;&gt;&gt; 214 remailer.
+
+ -->&lt;&lt;&lt; HELP PINGER
+ &gt;&gt;&gt; 214-<A href="echolot/">PINGER</A>
+ &gt;&gt;&gt; 214- Mixmaster and Cypherpunk reliability stats and
+ &gt;&gt;&gt; 214 keyrings produced by Echolot.
+
+ &lt;&lt;&lt; HELP THESAURUS
+ &gt;&gt;&gt; 214-<A href="echolot/thesaurus/">THESAURUS</A>
+ &gt;&gt;&gt; 214 remailer-xxx of all remailers by Echolot.
+
+ &lt;&lt;&lt; HELP LATENCY
+ &gt;&gt;&gt; 214-<A href="latency/">LATENCY</A>
+ &gt;&gt;&gt; 214 graphing of remailer latency stats.
+
+ &lt;&lt;&lt; HELP LOAD
+ &gt;&gt;&gt; 214-<A href="load/">LOAD</A>
+ &gt;&gt;&gt; 214- graphing of remailer load (i.e. messages processed) and
+ &gt;&gt;&gt; 214 their pool sizes if available.
+
+ &lt;&lt;&lt; HELP ROT26
+ &gt;&gt;&gt; 214-<A href="rot26/">ROT26</A>
+ &gt;&gt;&gt; 214 info on the rot26 remailer
+
+ &lt;&lt;&lt; HELP REMSAINT
+ &gt;&gt;&gt; 214-<A href="remsaint.php">REMSAINT</A>
+ &gt;&gt;&gt; 214- An overview of all remailers' reliability averaged over
+ &gt;&gt;&gt; 214- all stats sources. Allows you to subscribe to remailers
+ &gt;&gt;&gt; 214- so you get warning emails should they fall below a
+ &gt;&gt;&gt; 214- certain reliability. I recommend operators subscribe
+ &gt;&gt;&gt; 214 to their remailer.
+
+ &lt;&lt;&lt; HELP METASTATS
+ &gt;&gt;&gt; 214-<A href="meta/">METASTATS</A>
+ &gt;&gt;&gt; 214- Show stats for all remailers from all pingers in a
+ &gt;&gt;&gt; 214 single table.
+
+ &lt;&lt;&lt; HELP TLS-INFO
+ &gt;&gt;&gt; 214-<A href="tls/">TLS-INFO</A>
+ &gt;&gt;&gt; 214- List mail exchanges for each remailer and whether or not
+ &gt;&gt;&gt; 214- it supports TLS (SSL). For TLS capable hosts the certificate
+ &gt;&gt;&gt; 214 as gathered by OpenSSL is given too.
+
+ &lt;&lt;&lt; HELP MIXMINION-NODES
+ &gt;&gt;&gt; 214-<A href="mixminion-nodes/">MIXMINION-NODES</A>
+ &gt;&gt;&gt; 214 Number of recommended <a href="http://mixminion.net/">mixminion</a> nodes over time.
+
+ &lt;&lt;&lt; HELP TOR-ROUTERS
+ &gt;&gt;&gt; 214-<A href="tor-running-routers/">TOR-ROUTERS</A>
+ &gt;&gt;&gt; 214 Number of <a href="http://freehaven.net/tor/">tor</a> routers running over time.
+
+ &lt;&lt;&lt; HELP RESOURCES
+ &gt;&gt;&gt; 214-<A href="resources.html">RESOURCES</A>
+ &gt;&gt;&gt; 214 links and pointers
+
+ <!--&lt;&lt;&lt; HELP STARTLS
+ &gt;&gt;&gt; 214-<A href="https://www.noreply.org/">STARTLS</A>
+ &gt;&gt;&gt; 214 This site via https.-->
+ </PRE>
+
+ </TD></TR>
+ <TR><TD bgcolor="#ffffff">&nbsp;</TD></TR>
+ <TR><TD bgcolor="#444444"><FONT color="#ffffff"><EM><a href="mailto:web@palfrader.org"><font color="#bbbbff">web@palfrader.org</font></a></EM> -
+ <a href="http://validator.w3.org/check/referer"><font color="#bbbbff">Valid HTML 4.01!</font></a></FONT></TD></TR>
+ </TABLE>
+ </BODY>
+</HTML>
diff --git a/web/template/login.html b/web/template/login.html
new file mode 100644
index 0000000..867fe9d
--- /dev/null
+++ b/web/template/login.html
@@ -0,0 +1,95 @@
+<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <title>Login</title>
+ </head>
+ <body bgcolor="#aaaaaa" text="#000000" LINK="#0000ff" ALINK="#ff0000" VLINK="#ff0000">
+ <table cellpadding=0 cellspacing=0 width="100%">
+ <tr>
+ <td colspan=2 bgcolor="#444444">
+ <font color="#ffffff">
+ <a href="/"><font color="#bbbbff">www.noreply.org</font></a> ::
+ Login</font>
+ </td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#444444">
+ <font color="#ffffff">
+ <TMPL_IF NAME="user">
+ Logged in as <a href="account-edit.php"><font color="#bbbbff"><TMPL_VAR NAME="user"></font></a>
+ -
+ <a href="logout.php"><font color="#bbbbff">Logout</font></a>
+ </TMPL_IF NAME="user">
+ <TMPL_UNLESS NAME="user">
+ Not logged in.
+ </TMPL_UNLESS NAME="user">
+ </td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#ffffff">
+ &nbsp;</td>
+ </tr>
+ <tr>
+ <td bgcolor="#ffffff">
+ &nbsp;</td>
+ <td bgcolor="#ffffff">
+ <p>
+ Log on as user to noreply. If you do not have an account yet, <a href="account-create.php?form_id=ask&amp;goto=<TMPL_VAR NAME="goto">">create one</a>.
+ <p>
+ <strong>
+ Cookies must be enabled beyond this point.</strong>
+ <TMPL_IF NAME="message">
+ <p>
+ <font color="red">
+ <strong>
+ <TMPL_VAR NAME="message">
+ </strong>
+ </font>
+ </TMPL_IF NAME="message">
+ <form method="post">
+ <input TYPE="hidden" NAME="goto" VALUE="<TMPL_VAR NAME="goto">">
+ <input TYPE="hidden" NAME="form_id" VALUE="auth">
+ <table>
+ <tr>
+ <th align="left">
+ Username:</th>
+ <td>
+ <input type="text" name="username" value="<TMPL_VAR NAME="username_field">">
+ </td>
+ </tr>
+ <tr>
+ <th align="left">
+ Password:</th>
+ <td>
+ <input type="password" name="password">
+ </td>
+ </tr>
+ <tr>
+ <th align="left">
+ &nbsp;</th>
+ <td>
+ <input type="submit">
+ <input type="reset">
+ </td>
+ </tr>
+ </table>
+ </form>
+ </td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#ffffff">
+ &nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#444444">
+ <font color="#ffffff">
+ <em><a href="mailto:web@palfrader.org"><font color="#bbbbff">web@palfrader.org</font></a></em> -
+ <a href="http://validator.w3.org/check/referer"><font color="#bbbbff">Valid HTML 4.01!</font></a>
+ </font>
+ </td>
+ </tr>
+ </table>
+ </body>
+ <!-- vim:set ts=2: -->
+ <!-- vim:set shiftwidth=2: -->
+</html>
diff --git a/web/template/logout.html b/web/template/logout.html
new file mode 100644
index 0000000..7544e86
--- /dev/null
+++ b/web/template/logout.html
@@ -0,0 +1,56 @@
+<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <title>Logout</title>
+ </head>
+ <body bgcolor="#aaaaaa" text="#000000" LINK="#0000ff" ALINK="#ff0000" VLINK="#ff0000">
+ <table cellpadding=0 cellspacing=0 width="100%">
+ <tr>
+ <td colspan=2 bgcolor="#444444">
+ <font color="#ffffff">
+ <a href="/"><font color="#bbbbff">www.noreply.org</font></a> ::
+ Logout</font>
+ </td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#444444">
+ <font color="#ffffff">
+ <TMPL_IF NAME="user">
+ Logged in as <a href="account-edit.php"><font color="#bbbbff"><TMPL_VAR NAME="user"></font></a>
+ -
+ <a href="logout.php"><font color="#bbbbff">Logout</font></a>
+ </TMPL_IF NAME="user">
+ <TMPL_UNLESS NAME="user">
+ Not logged in - <a href="login.php"><font color="#bbbbff">Login</font></a>.
+ </TMPL_UNLESS NAME="user">
+ </td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#ffffff">
+ &nbsp;</td>
+ </tr>
+ <tr>
+ <td bgcolor="#ffffff">
+ &nbsp;</td>
+ <td bgcolor="#ffffff">
+ <p>
+ Successfully logged out.
+ </td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#ffffff">
+ &nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#444444">
+ <font color="#ffffff">
+ <em><a href="mailto:web@palfrader.org"><font color="#bbbbff">web@palfrader.org</font></a></em> -
+ <a href="http://validator.w3.org/check/referer"><font color="#bbbbff">Valid HTML 4.01!</font></a>
+ </font>
+ </td>
+ </tr>
+ </table>
+ </body>
+ <!-- vim:set ts=2: -->
+ <!-- vim:set shiftwidth=2: -->
+</html>
diff --git a/web/template/meta-chain.html b/web/template/meta-chain.html
new file mode 100644
index 0000000..816f65d
--- /dev/null
+++ b/web/template/meta-chain.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head><title>Bad Type-<TMPL_VAR NAME="type"> Chains</title></head>
+<body bgcolor="#aaaaaa" text="#000000" LINK="#0000ff" ALINK="#ff0000" VLINK="#ff0000">
+<table cellpadding=0 cellspacing=0 width="100%">
+<tr><td colspan=2 bgcolor="#444444"><font color="#ffffff"><a href="/"><font color="#bbbbff">www.noreply.org</font></a> :: <a href="./"><font color="#bbbbff">metastats</font></a> :: Chain <TMPL_VAR NAME="type"></font></td></tr>
+<tr><td colspan=2 bgcolor="#ffffff">&nbsp;</td></tr>
+<tr><td bgcolor="#ffffff">&nbsp;</td>
+<td bgcolor="#ffffff">
+
+<h1>Bad Type-<TMPL_VAR NAME="type"> Chains</h1>
+ <small>(<a href="chain.1.html">Type I</a>
+ (<a href="chain.1.all.html">unfiltered</a>),
+ <a href="chain.2.html">Type II</a>
+ (<a href="chain.2.all.html">unfiltered</a>))</small>
+
+<TMPL_IF NAME="cutoff">
+<p>
+Remailers that have less than <TMPL_VAR NAME="cutoff">% reliability in <a href="../remsaint.php">remsaint</a> have been ignored. (<small><a href="<TMPL_VAR NAME="unfiltered">">unfiltered</a></small>).
+</TMPL_IF>
+<p>
+<table>
+<tr>
+ <th rowspan="2" bgcolor="#eeeeee"><TMPL_IF NAME="fromsortlink"><a href="<TMPL_VAR NAME="fromsortlink">">from</a><TMPL_ELSE>from</TMPL_IF></th><th rowspan="2" bgcolor="#eeeeee"><TMPL_IF NAME="tosortlink"><a href="<TMPL_VAR NAME="tosortlink">">to</a><TMPL_ELSE>to</TMPL_IF></th>
+ <th bgcolor="#eeeeee" align="center" colspan="<TMPL_VAR NAME="numberpingers">">pinger</th></tr>
+<tr>
+ <TMPL_LOOP NAME="pingers"><th bgcolor="#eeeeee" align="center"><TMPL_VAR NAME="name"></th></TMPL_LOOP>
+</tr>
+<TMPL_LOOP NAME="left">
+ <tr><td bgcolor="#ddddff" colspan="<TMPL_VAR NAME="cols">"><small>&nbsp;</small></td></tr>
+ <!--<td bgcolor="#ddddff" colspan="2"><small>&nbsp;</small></td><TMPL_LOOP NAME="pingers"><td bgcolor="ddddff" align="center"><small><TMPL_VAR NAME="name"></small></td></TMPL_LOOP>-->
+ <TMPL_LOOP NAME="right">
+ <tr>
+ <td bgcolor="#bbbbff"><TMPL_VAR NAME="leftname"></td>
+ <td bgcolor="#bbbbff"><TMPL_VAR NAME="rightname"></td>
+ <TMPL_LOOP NAME="bad"><TMPL_IF NAME="bad"><td bgcolor="#ffaaaa" align="center">bad<TMPL_ELSE><TMPL_IF NAME="implicitbad"><td bgcolor="#ffaaaa">&nbsp;<TMPL_ELSE><TMPL_IF NAME="known"><td bgcolor="#aaffaa">&nbsp;<TMPL_ELSE><td bgcolor="#cccccc" align="center"><small>N/A</small></TMPL_IF></TMPL_IF></TMPL_IF></td></TMPL_LOOP>
+ </tr>
+ </TMPL_LOOP>
+</TMPL_LOOP>
+
+</table>
+
+<p>
+N/A means that a pinger doesn't list a remailer and therefore probably isn't aware of any broken chains regarding the remailer.
+<p>
+Built at <TMPL_VAR NAME="now">.
+
+</td></tr>
+<tr><td colspan=2 bgcolor="#ffffff">&nbsp;</td></tr>
+<tr><td colspan=2 bgcolor="#444444"><font color="#ffffff"><em><a href="mailto:web@palfrader.org"><font color="#bbbbff">web@palfrader.org</font></a></em> -
+ <a href="http://validator.w3.org/check/referer"><font color="#bbbbff">Valid HTML 4.01!</font></a></font></td></tr>
+</table>
+</body>
+</html>
diff --git a/web/template/metastats.html b/web/template/metastats.html
new file mode 100644
index 0000000..ea6197f
--- /dev/null
+++ b/web/template/metastats.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head><title>Metastats @ noreply</title></head>
+<body bgcolor="#aaaaaa" text="#000000" LINK="#0000ff" ALINK="#ff0000" VLINK="#ff0000">
+<table cellpadding=0 cellspacing=0 width="100%">
+<tr><td colspan=2 bgcolor="#444444"><font color="#ffffff"><a href="/"><font color="#bbbbff">www.noreply.org</font></a> :: <a href="./"><font color="#bbbbff">metastats</font></a> :: Type <TMPL_VAR NAME="type"></font></td></tr>
+<tr><td colspan=2 bgcolor="#ffffff">&nbsp;</td></tr>
+<tr><td bgcolor="#ffffff">&nbsp;</td>
+<td bgcolor="#ffffff">
+
+
+<h1>Type <TMPL_VAR NAME="type"> Metastats</h1>
+ <small>(<a href="meta.1.html">Type 1</a>,
+ <a href="meta.2.html">Type 2</a>)</small>
+
+<table>
+<tr>
+ <th>Remailer\Pinger</th>
+ <TMPL_LOOP NAME="pingers">
+ <th><a href="<TMPL_VAR NAME="url">"><TMPL_VAR NAME="nick"><TMPL_IF NAME="cache"></a><BR><a href="<TMPL_VAR NAME="cache">"><SMALL>(cached)</SMALL></a></TMPL_IF></TH>
+ </TMPL_LOOP>
+ <th>Average</th>
+ <th>Deviation</th>
+</tr>
+ <tr>
+ <td><small>Remailers &gt; 97%</small></td>
+ <TMPL_LOOP NAME="pingers">
+ <td align="center"><small><TMPL_VAR NAME="not_in_warn"></small></td>
+ </TMPL_LOOP>
+ <td><small>&nbsp;</small></td>
+ <td><small>&nbsp;</small></td>
+ </tr>
+<TMPL_LOOP NAME="remailers">
+ <tr>
+ <td bgcolor="<TMPL_IF NAME="highlightline">#55FF55<TMPL_ELSE>#AAFFAA</TMPL_IF>"><a href="<TMPL_VAR NAME="status">"><TMPL_VAR NAME="nick"></a></td>
+ <TMPL_LOOP NAME="pingers">
+ <td align="right" bgcolor="<TMPL_IF NAME="has"><TMPL_IF NAME="used"><TMPL_IF NAME="highlightline">#BBBBBB<TMPL_ELSE>#FFFFFF</TMPL_IF><TMPL_ELSE><TMPL_IF NAME="highlightline">#66EEEE<TMPL_ELSE>#BBFFFF</TMPL_IF></TMPL_IF><TMPL_ELSE>#666666</TMPL_IF>"><TMPL_VAR NAME="rel"></td>
+ </TMPL_LOOP>
+ <td align="right" bgcolor="<TMPL_IF NAME="highlightline">#7777FF<TMPL_ELSE>#AAAAFF</TMPL_IF>"><TMPL_VAR NAME="rel_mu"></td>
+ <td align="right" bgcolor="<TMPL_IF NAME="highlightline">#7777FF<TMPL_ELSE>#AAAAFF</TMPL_IF>"><TMPL_VAR NAME="rel_sigma"></td>
+ </tr>
+</TMPL_LOOP>
+</table>
+
+<p>
+Data samples in cyan are ignored because they are too far away from the average or the pinger is too far away from the average too often.
+
+<TMPL_IF NAME="oldpingers">
+<p>
+The following pingers have been ignored:
+<ul>
+ <TMPL_LOOP NAME="oldpingers">
+ <li><TMPL_VAR NAME="pinger">: <TMPL_VAR NAME="reason"></li>
+ </TMPL_LOOP>
+</ul>
+</TMPL_IF>
+
+<p>
+Built at <TMPL_VAR NAME="now">.
+
+</td></tr>
+<tr><td colspan=2 bgcolor="#ffffff">&nbsp;</td></tr>
+<tr><td colspan=2 bgcolor="#444444"><font color="#ffffff"><em><a href="mailto:web@palfrader.org"><font color="#bbbbff">web@palfrader.org</font></a></em> -
+ <a href="http://validator.w3.org/check/referer"><font color="#bbbbff">Valid HTML 4.01!</font></a></font></td></tr>
+</table>
+</body>
+</html>
diff --git a/web/template/remsaint-status.html b/web/template/remsaint-status.html
new file mode 100644
index 0000000..4652dc9
--- /dev/null
+++ b/web/template/remsaint-status.html
@@ -0,0 +1,262 @@
+<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <title>RemSaint - Status</title>
+ </head>
+ <body bgcolor="#aaaaaa" text="#000000" LINK="#0000ff" ALINK="#ff0000" VLINK="#ff0000">
+ <table cellpadding=0 cellspacing=0 width="100%">
+ <tr>
+ <td colspan=2 bgcolor="#444444">
+ <font color="#ffffff"><a href="/"><font color="#bbbbff">www.noreply.org</font></a> ::
+ RemSaint</font>
+ </td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#444444">
+ <font color="#ffffff">
+ <TMPL_IF NAME="user">
+ Logged in as <a href="account-edit.php"><font color="#bbbbff"><TMPL_VAR NAME="user"></font></a>
+ -
+ <a href="logout.php"><font color="#bbbbff">Logout</font></a>
+ </TMPL_IF NAME="user">
+ <TMPL_UNLESS NAME="user">
+ Not logged in: <a href="login.php?form_id=login&amp;goto=remsaint.php"><font color="#bbbbff">Login</font></a>
+ </TMPL_UNLESS NAME="user">
+ </font>
+ </td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#ffffff">
+ &nbsp;</td>
+ </tr>
+ <tr>
+ <td bgcolor="#ffffff">
+ &nbsp;</td>
+ <td bgcolor="#ffffff">
+ <TMPL_IF NAME="manage">
+ <form action="remsaint-subscription.php" method="post">
+ <input type="hidden" name="form_id" value="subscription">
+ </TMPL_IF NAME="manage">
+ <p>
+ Remsaint is an overview of <a href="../meta/">all remailers' reliability</a> averaged over
+ <a href="../allpingers/">all stats sources</a>. Users and operators
+ can <em>subscribe</em> to remailers to get notified should a remailer
+ become unreliable.
+ <p>
+ It can be used by the operator of a remailer so she
+ gets some hint as soon as problems arise. Often remailers have
+ dropped out of stats without their operators even noticing it - with a
+ remsaint subscription this should not happen.
+ <p>
+ This also allows nym users to change their reply-blocks and so prevents
+ mail loss (Note that you need to subscribe to all nodes or the
+ list to not leak any information about your reply block).
+
+ <p>
+ Summary for the last few weeks and the last 12 months:<br>
+ <img src="../images/remailer-states.png" alt="[Number of Remailers in Ok, Warning, and Critical over the last few weeks.]" width="497" height="246">
+ <img src="../images/remailer-states-long.png" alt="[Number of Remailers in Ok, Warning, and Critical over the last 12 months.]" width="497" height="246">
+ <br><small>Even more history: <a href="../images/remailer-states-long-2.png">Number of Remailers in Ok, Warning, and Critical over the last 24 months.</a></small>
+ <p>
+ <hr>
+ <TMPL_IF NAME="user">
+ <p>
+ <TMPL_UNLESS NAME="manage"><a href="<TMPL_VAR NAME="this">?form_id=list&amp;manage=1&amp;sort=<TMPL_VAR NAME="sort">">Manage subscriptions</a></TMPL_UNLESS NAME="manage">
+ <TMPL_IF NAME="manage">
+ <a href="<TMPL_VAR NAME="this">?manage=0&amp;sort=<TMPL_VAR NAME="sort">">Back to simple overview</a>
+ </TMPL_IF NAME="manage">
+ </TMPL_IF NAME="user">
+ <TMPL_UNLESS NAME="user">
+ <p>
+ If you were <a href="login.php?form_id=login&amp;goto=remsaint.php">logged in</a> you could
+ subscribe to status changes of those remailers. If you
+ do not have an account yet, <a href="account-create.php?form_id=ask&amp;goto=remsaint.php">create one</a>.
+ </TMPL_UNLESS NAME="user">
+ <hr>
+ <p>
+ If you want to get all notifications you can subscribe to the
+ <a href="http://lists.noreply.org/mailman/listinfo/remsaint-report">remsaint-report</a>
+ mailinglist which gets a copy of each notification as well as
+ information about added and removed remailers.
+ Past notifications can be found in the
+ <a href="http://lists.noreply.org/pipermail/remsaint-report/">notification archive</a>.
+ <hr>
+ <p>
+ Details:
+ <table>
+ <TMPL_IF NAME="manage">
+ <tr>
+ <th rowspan=2><a href="<TMPL_VAR NAME="this">?form_id=list&amp;sort=nick&amp;manage=<TMPL_VAR NAME="manage">">Remailer</a></th>
+ <th rowspan=2><a href="<TMPL_VAR NAME="this">?form_id=list&amp;sort=status&amp;manage=<TMPL_VAR NAME="manage">">Status</a></th>
+ <th rowspan=2><a href="<TMPL_VAR NAME="this">?form_id=list&amp;sort=type1&amp;manage=<TMPL_VAR NAME="manage">">Type I</a></th>
+ <th rowspan=2><a href="<TMPL_VAR NAME="this">?form_id=list&amp;sort=type2&amp;manage=<TMPL_VAR NAME="manage">">Type II</a></th>
+ <th rowspan=2>Last Update</th>
+ <th rowspan=2 colspan=2>Listed in</th>
+ <th colspan=3>Notify on</th>
+ </tr>
+ <tr>
+ <th>Warning</th>
+ <th>Critical</th>
+ <th>Recovery</th>
+ </tr>
+ </TMPL_IF NAME="manage">
+ <TMPL_UNLESS NAME="manage">
+ <tr>
+ <th><a href="<TMPL_VAR NAME="this">?form_id=list&amp;sort=nick&amp;manage=<TMPL_VAR NAME="manage">">Remailer</a></th>
+ <th><a href="<TMPL_VAR NAME="this">?form_id=list&amp;sort=status&amp;manage=<TMPL_VAR NAME="manage">">Status</a></th>
+ <th><a href="<TMPL_VAR NAME="this">?form_id=list&amp;sort=type1&amp;manage=<TMPL_VAR NAME="manage">">Type I</a></th>
+ <th><a href="<TMPL_VAR NAME="this">?form_id=list&amp;sort=type2&amp;manage=<TMPL_VAR NAME="manage">">Type II</a></th>
+ <th>Last Update</th>
+ <th colspan=2>Listed in</th>
+ </tr>
+ </TMPL_UNLESS NAME="manage">
+ <TMPL_LOOP NAME="remailers">
+ <tr>
+ <td bgcolor="#EEEEEE"><small><code><a href="../meta/status.<TMPL_VAR NAME="nick">.txt"><TMPL_VAR NAME="nick"></a></code></small></td>
+ <TMPL_CMP NAME="in_critical" VALUE="t">
+ <td bgcolor="#FF0000" align="center"><small><strong>CRITICAL</strong></small></td>
+ </TMPL_CMP NAME="in_critical">
+ <TMPL_CMP NAME="in_critical" VALUE="f">
+ <TMPL_CMP NAME="in_warning" VALUE="t">
+ <td bgcolor="#FFFF00" align="center"><small><strong>WARNING</strong></small></td>
+ </TMPL_CMP NAME="in_warning">
+ <TMPL_CMP NAME="in_warning" VALUE="f">
+ <td bgcolor="#00FF00" align="center"><small><strong>OK</strong></small></td>
+ </TMPL_CMP NAME="in_warning">
+ </TMPL_CMP NAME="in_critical">
+ <td bgcolor="#EEEEEE" align="right">
+ <small>
+ <TMPL_IF NAME="reliability_type1">
+ <TMPL_VAR NAME="reliability_type1">%
+ </TMPL_IF NAME="reliability_type1">
+ <TMPL_UNLESS NAME="reliability_type1">
+ &nbsp;
+ </TMPL_UNLESS NAME="reliability_type1">
+ </small>
+ </td>
+ <td bgcolor="#EEEEEE" align="right">
+ <small>
+ <TMPL_IF NAME="reliability_type2">
+ <TMPL_VAR NAME="reliability_type2">%
+ </TMPL_IF NAME="reliability_type2">
+ <TMPL_UNLESS NAME="reliability_type2">
+ &nbsp;
+ </TMPL_UNLESS NAME="reliability_type2">
+ </small>
+ </td>
+ <td bgcolor="#EEEEEE" align="center">
+ <small>
+ <TMPL_VAR NAME="last_update">
+ </small>
+ </td>
+ <td bgcolor="#EEEEEE" align="center">
+ <small>
+ <TMPL_IF NAME="reliability_type1">
+ <TMPL_VAR NAME="listed1">
+ </TMPL_IF NAME="reliability_type1">
+ <TMPL_UNLESS NAME="reliability_type1">
+ &nbsp;
+ </TMPL_UNLESS NAME="reliability_type1">
+ </small>
+ </td>
+ <td bgcolor="#EEEEEE" align="center">
+ <small>
+ <TMPL_IF NAME="reliability_type2">
+ <TMPL_VAR NAME="listed2">
+ </TMPL_IF NAME="reliability_type2">
+ <TMPL_UNLESS NAME="reliability_type2">
+ &nbsp;
+ </TMPL_UNLESS NAME="reliability_type2">
+ </small>
+ </td>
+ <TMPL_IF NAME="manage">
+ <input TYPE="hidden" NAME="ref[]" VALUE="<TMPL_VAR NAME="ref">">
+ <td bgcolor="#EEEEEE" align="center">
+ <input TYPE="checkbox" NAME="warning_<TMPL_VAR NAME="ref">"<TMPL_CMP NAME="notify_warning" VALUE="t"> checked</TMPL_CMP NAME="notify_warning">>
+ </td>
+ <td bgcolor="#EEEEEE" align="center">
+ <input TYPE="checkbox" NAME="critical_<TMPL_VAR NAME="ref">"<TMPL_CMP NAME="notify_critical" VALUE="t">checked</TMPL_CMP NAME="notify_critical">>
+ </td>
+ <td bgcolor="#EEEEEE" align="center">
+ <input TYPE="checkbox" NAME="recovery_<TMPL_VAR NAME="ref">"<TMPL_CMP NAME="notify_recovery" VALUE="t"> checked</TMPL_CMP NAME="notify_recovery">>
+ </td>
+ </TMPL_IF NAME="manage">
+ </tr>
+ </TMPL_LOOP NAME="remailers">
+ </table>
+ <p>
+ <TMPL_IF NAME="manage">
+ <input type="submit">
+ <input type="reset">
+ </form>
+ </TMPL_IF NAME="manage">
+ <p>
+ <hr>
+ <TMPL_IF NAME="user">
+ <p>
+ <TMPL_UNLESS NAME="manage"><a href="<TMPL_VAR NAME="this">?form_id=list&amp;manage=1&amp;sort=<TMPL_VAR NAME="sort">">Manage subscriptions</a></TMPL_UNLESS NAME="manage">
+ <TMPL_IF NAME="manage">
+ <a href="<TMPL_VAR NAME="this">?manage=0&amp;sort=<TMPL_VAR NAME="sort">">Back to simple overview</a>
+ </TMPL_IF NAME="manage">
+ </TMPL_IF NAME="user">
+ <TMPL_UNLESS NAME="user">
+ <p>
+ If you were <a href="login.php?form_id=login&amp;goto=remsaint.php">logged in</a> you could
+ subscribe to status changes of those remailers. If you
+ do not have an account yet, <a href="account-create.php?form_id=ask&amp;goto=remsaint.php">create one</a>.
+ </TMPL_UNLESS NAME="user">
+ <hr>
+ <p>
+ <strong>States</strong>
+ <ul>
+ <li>Critical: Averaged reliability for Type 1 or Type 2 is below 92%.</li>
+ <li>Warning: Averaged reliability for Type 1 or Type 2 is below 97%.</li>
+ <li>OK: Averaged reliability for both Type 1 and Type 2 is greater or equal to 97%.</li>
+ </ul>
+ <TMPL_IF NAME="manage">
+ <p>
+ <strong>Notifications</strong>
+ <ul>
+ <li>On Warning: You will get an email if the remailer goes from OK to Warning state.</li>
+ <li>On Critical: You will get an email if the remailer goes from OK or Warning to Critical state.</li>
+ <li>On Recovery: You will get an email if the remailer goes from Warning or Critical to OK state.</li>
+ </ul>
+ You will also be notified if a remailer you are subscribed to
+ gets removed from remsaint. This happens if no pinger lists it
+ anymore.
+ </TMPL_IF NAME="manage">
+ <p>
+ Feedback appreciated.
+
+ <hr>
+ <p>
+ <strong>Links</strong>
+ <ul>
+ <li><a href="../meta/">Metastats</a></li>
+ <li><a href="../allpingers/">All Pingers</a></li>
+ <li><a href="http://lists.noreply.org/mailman/listinfo/remsaint-report">remsaint-report List</a></li>
+ <li><a href="http://lists.noreply.org/pipermail/remsaint-report/">remsaint-report Archives</a></li>
+ </ul>
+ <hr>
+ <p>
+ Images created using Tobi Oetiker's
+ <a href="http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/">rrdtool</a>.
+ </td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#ffffff">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan=2 bgcolor="#444444">
+ <font color="#ffffff">
+ <em><a href="mailto:web@palfrader.org"><font color="#bbbbff">web@palfrader.org</font></a></em>
+ -
+ <a href="http://validator.w3.org/check/referer"><font color="#bbbbff">Valid HTML 4.01!</font></a>
+ </font>
+ </td>
+ </tr>
+ </table>
+ </body>
+ <!-- vim:set ts=2: -->
+ <!-- vim:set shiftwidth=2: -->
+</html>
diff --git a/web/template/remsaint-subscription.html b/web/template/remsaint-subscription.html
new file mode 100644
index 0000000..08db57b
--- /dev/null
+++ b/web/template/remsaint-subscription.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head><title>RemSaint - Status</title></head>
+<body bgcolor="#aaaaaa" text="#000000" LINK="#0000ff" ALINK="#ff0000" VLINK="#ff0000">
+<table cellpadding=0 cellspacing=0 width="100%">
+<tr><td colspan=2 bgcolor="#444444"><font color="#ffffff"><a href="/"><font color="#bbbbff">www.noreply.org</font></a> :: <a href="./remsaint.php"><font color="#bbbbff">RemSaint</font></a> :: Subscriptions</font></td></tr>
+<tr><td colspan=2 bgcolor="#444444"><font color="#ffffff"><TMPL_IF NAME="user">Logged in as <TMPL_VAR NAME="user"> - <a href="logout.php"><font color="#bbbbff">Logout</font></a></TMPL_IF NAME="user"><TMPL_UNLESS NAME="user">Not logged in: <a href="auth.php?goto=remsaint.php"><font color="#bbbbff">login</font></a></TMPL_UNLESS NAME="user"></font></td></tr>
+<tr><td colspan=2 bgcolor="#ffffff">&nbsp;</td></tr>
+<tr><td bgcolor="#ffffff">&nbsp;</td>
+<td bgcolor="#ffffff">
+
+<h1>Subscription update:</h1>
+
+<TMPL_VAR_NOESC NAME="message">
+
+<p>
+<a href="remsaint.php?form_id=list&amp;manage=1">Manage subscriptions</a><br>
+<a href="remsaint.php?form_id=list&amp;manage=0">Back to simple overview</a><br>
+<a href="./">Back to root</a><br>
+
+</td></tr>
+<tr><td colspan=2 bgcolor="#ffffff">&nbsp;</td></tr>
+<tr><td colspan=2 bgcolor="#444444"><font color="#ffffff"><em><a href="mailto:web@palfrader.org"><font color="#bbbbff">web@palfrader.org</font></a></em> -
+ <a href="http://validator.w3.org/check/referer"><font color="#bbbbff">Valid HTML 4.01!</font></a></font></td></tr>
+</table>
+</body>
+</html>
diff --git a/web/tls/Makefile.am b/web/tls/Makefile.am
new file mode 100644
index 0000000..72b21e1
--- /dev/null
+++ b/web/tls/Makefile.am
@@ -0,0 +1,35 @@
+SUBDIRS =
+
+based_in = htdocs
+include $(top_srcdir)/Makefile.common
+
+doc_DATA = index.html
+
+
+addresses: $(ECHOLOT_BASE)/results/mlist2.txt $(ECHOLOT_BASE)/results/rlist2.txt
+ cat $(ECHOLOT_BASE)/results/mlist2.txt $(ECHOLOT_BASE)/results/rlist2.txt > addresses
+
+tls-result: addresses
+ if [ -e $@ ] ; then \
+ mod=`stat -c '%Y' $@`; \
+ else \
+ mod=0; \
+ fi; \
+ now=`date +'%s'`; \
+ if [ $$(( $$now - $$mod )) -gt $(TLS_AGE) ]; then \
+ $(top_srcdir)/bin/tls-check < $< > $@; \
+ fi
+
+index.html: tls-result
+ rm -f cert-*.txt;
+ $(top_srcdir)/bin/tls2html < $< > $@;
+
+clean:
+ rm -f tls-result index.html addresses cert-*.txt addresses
+
+install-data-local: index.html
+ [ -d $(docdir) ] || mkdir $(docdir)
+ cp cert-*.txt $(docdir)
+
+uninstall-local: index.html
+ rm -f $(docdir)/cert-*.txt
diff --git a/web/tls/template.tmpl b/web/tls/template.tmpl
new file mode 100644
index 0000000..99d8cfa
--- /dev/null
+++ b/web/tls/template.tmpl
@@ -0,0 +1,118 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head><title>TLS @ noreply</title></head>
+<body bgcolor="#aaaaaa" text="#000000" LINK="#0000ff" ALINK="#ff0000" VLINK="#ff0000">
+<table cellpadding=0 cellspacing=0 width="100%">
+<tr><td colspan=2 bgcolor="#444444"><font color="#ffffff"><a href="/"><font color="#bbbbff">www.noreply.org</font></a> :: TLS </font></td></tr>
+<tr><td colspan=2 bgcolor="#ffffff">&nbsp;</td></tr>
+<tr><td bgcolor="#ffffff">&nbsp;</td>
+<td bgcolor="#ffffff">
+
+<h1>SMTP - TLS</h1>
+
+<strong>T</strong>ransport
+<strong>L</strong>ayer
+<strong>S</strong>ecurity (similar to SSL)
+brings forward secrecy to Internet Email by encrypting SMTP traffic.
+<p>
+Even though usual remailer mail is already encrypted, TLS adds security
+because the key used in TLS sessions usually is ephemeral - i.e. it only
+exists for seconds and is destroyed immediatly after use. Whether or
+not short-lived keys are used depends on the cipher suite chosen.
+(The EDH (Ephemeral Diffie-Hellman) ciphers use ephemeral keys.)
+<p>
+Ephemeral keys make it impossible to decrypt data which was eavesdropped at one
+time by compromising a remailer's key later.
+<p>
+Since remailer keys are valid for weeks, sometimes years, this makes
+remailing more secure.
+
+<p>
+The submission column indicates that a mailserver acceps mails on port 587
+(submission). The smtps column that it accepts SSL connections on port 465
+(smtps) for use with stunnel and similar. Some hosts also accept normal
+connections on port 2525 - this is indicated in the column 2525. <!--The same
+holds true for port 25000.-->
+<em>Please note that some hosts may enforce the use of TLS on the submission port.</em>
+
+<p>
+<!--More recent stunnel versions can also do STARTTLS using <code>-starttls smtp</code>.-->
+Stunnel can do STARTTLS using <code>-n smtp</code> or with </code>protocol = smtp</code> in your config file, depending on your version.
+
+<p>
+See the <a href="http://www.bananasplit.info/mailtls.html">Encrypted Email
+- TLS/SSL</a> on <a href="http://www.bananasplit.info/">banasplit</a> for a
+ howto on using stunnel on Windows with Quicksilver and JBN2.
+
+<p>
+<table border=0 cellpadding=2 cellspacing=0>
+<tr> <th>remailer</th><th>mail exchanger</th><th>priority</th><th>TLS</th><th>submission</th><th>smtps</th><th>2525</th><!--<th>25000</th>--><th>error/warning</th> </tr>
+<TMPL_LOOP NAME="remailer">
+ <tr><td colspan="9" bgcolor="#77e7ef"><strong><TMPL_VAR NAME="nick"></strong> &lt;<TMPL_VAR NAME="address">&gt;</td></tr>
+ <TMPL_LOOP NAME="mx">
+ <tr><td>&nbsp;</td>
+ <td class="monowidth"><TMPL_VAR NAME="mx"></td>
+ <td align="right"><TMPL_VAR NAME="pri"></td>
+ <TMPL_IF NAME="result-defined">
+ <TMPL_IF NAME="result">
+ <TMPL_IF NAME="tls">
+ <td align="center" bgcolor="#baffcc"><!--YES -
+ --><a href="<TMPL_VAR NAME="cert_url">">YES</a><TMPL_IF NAME="tls-cipher"><br><small><TMPL_VAR NAME="tls-cipher"></small></TMPL_IF></td>
+ <TMPL_ELSE>
+ <td align="center" bgcolor="#ff7f7f">announced -
+ does not work</td>
+ </TMPL_IF>
+ <TMPL_ELSE>
+ <td align="center" bgcolor="#ffb7b7">no</td>
+ </TMPL_IF>
+ <TMPL_ELSE>
+ <td align="center">N/A</td>
+ </TMPL_IF>
+ <TMPL_IF NAME="submission">
+ <td align="center" bgcolor="#daffec">yes</td>
+ <TMPL_ELSE>
+ <td align="center">no</td>
+ </TMPL_IF>
+ <TMPL_IF NAME="smtps">
+ <td align="center" bgcolor="#daffec"><!--yes -
+ --><a href="<TMPL_VAR NAME="ssl_url">">yes</a><TMPL_IF NAME="ssl-cipher"><br><small><TMPL_VAR NAME="ssl-cipher"></small></TMPL_IF></td>
+ <TMPL_ELSE>
+ <td align="center">no</td>
+ </TMPL_IF>
+ <TMPL_IF NAME="2525">
+ <td align="center" bgcolor="#daffec">yes</td>
+ <TMPL_ELSE>
+ <td align="center">no</td>
+ </TMPL_IF>
+ <!--
+ <TMPL_IF NAME="25000">
+ <td align="center" bgcolor="#daffec">yes</td>
+ <TMPL_ELSE>
+ <td align="center">no</td>
+ </TMPL_IF>
+ -->
+ <TMPL_IF NAME="warning">
+ <td bgcolor="#faff7f"><TMPL_VAR NAME="warning"></td>
+ </TMPL_IF>
+ <TMPL_IF NAME="error">
+ <TMPL_IF NAME="warning">
+ </tr><tr><td colspan="8">&nbsp;</td>
+ </TMPL_IF>
+ <td bgcolor="#ff7f7f"><TMPL_VAR NAME="error"></td>
+ </TMPL_IF>
+ </tr>
+ </TMPL_LOOP>
+ <tr><td colspan="6"></td></tr>
+</TMPL_LOOP>
+</table>
+
+<p>
+Built at <TMPL_VAR NAME="now">.
+
+</td></tr>
+<tr><td colspan=2 bgcolor="#ffffff">&nbsp;</td></tr>
+<tr><td colspan=2 bgcolor="#444444"><font color="#ffffff"><em><a href="mailto:web@palfrader.org"><font color="#bbbbff">web@palfrader.org</font></a></em> -
+ <a href="http://validator.w3.org/check/referer"><font color="#bbbbff">Valid HTML 4.01!</font></a></font></td></tr>
+</table>
+</body>
+</html>