From 785d74ad5bcb34b76e127e153f1333cdb7014065 Mon Sep 17 00:00:00 2001
From: Justin Mitchell <arthur@sucs.org>
Date: Mon, 22 Sep 2008 15:19:49 +0000
Subject: [PATCH] handler for card registration codes

---
 htdocs/doorknock.php | 132 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 132 insertions(+)
 create mode 100644 htdocs/doorknock.php

diff --git a/htdocs/doorknock.php b/htdocs/doorknock.php
new file mode 100644
index 0000000..8a24bec
--- /dev/null
+++ b/htdocs/doorknock.php
@@ -0,0 +1,132 @@
+<?
+
+function msg_tx($text, $time, $fg, $bg)
+{
+	$f = fopen("http://door.sucs.org/sendstatus.py?text=".urlencode($text)."&amp;timeout=$time&amp;fg=$fg&amp;bg=$bg", "r");
+	fclose($f);
+}
+
+function msg_good($text, $time=5)
+{
+	msg_tx($text, $time, "0,0,0", "128,255,128");
+}
+
+function msg_bad($text, $time=3)
+{
+	msg_tx($text, $time, "0,0,0", "255,64,64");
+}
+
+header("Content-type: text/plain");
+
+// Initialise the database
+require("/usr/share/adodb/adodb.inc.php");
+$DB = NewADOConnection('postgres8');
+if ($DB->Connect('dbname=sucs') === FALSE) {
+	echo "DB fail\n";
+	exit;
+}
+$DB->SetFetchMode(ADODB_FETCH_ASSOC);
+
+
+	$f = fopen("/tmp/doorlog", "a");
+
+if (isset($_REQUEST['code'])) {
+
+	// Expire old requests
+	$DB->Execute("delete from doorknock where start < NOW() - 30 seconds:reltime"); 
+
+	// Parse out the string
+	$code = $_REQUEST['code'];
+
+	$codes = split(' ',$code);
+	if ($codes[0] != "SUCS") {
+		echo "Unrecognised codeword '{$codes[0]}'\n";
+		msg_bad("Invalid slip");
+		exit;
+	}
+
+	// look up the user
+	$user = $DB->GetAll("select * from signup where id=?",array($codes[1]));
+	if (!is_array($user) || count($user) < 1) {
+		echo "Unrecognised signup id\n";
+		msg_bad("Invalid slip");
+		exit;
+	}
+
+	if ($codes[2] != $user[0]['password']) {
+		echo "Password mismatch\n";
+		msg_bad("Invalid slip");
+		exit;
+	}
+
+	if ($user[0]['card'] != "") {
+		echo "User already has a card\n";
+		msg_bad("Slip already used");
+		exit;
+	}
+
+	// all looks valid so far
+	// check we arent bouncing ourselves out
+
+	$exist = $DB->GetAll("select * from doorknock");
+	if (is_array($exist) && count($exist) > 0) {
+		print_r($exist);
+		if ($exist[0]['suid'] == $user[0]['id']) {
+			echo "Already in progress, no action\n";
+			exit;
+		}
+
+		$DB->Execute("delete from doorknock");
+		echo "Bouncing out signup id={$exist[0]['suid']}\n";
+	}
+	$DB->Execute("insert into doorknock (suid,start) values(?,NOW())", array($user[0]['id']));
+	echo "Start waiting for id={$user[0]['id']}\n";
+	msg_good("Please swipe ID Card to complete registration", 10);
+	exit;
+
+
+
+} else
+// a card was swiped at the door, try to match it
+if (isset($_REQUEST['id'])) {
+	$card = $_REQUEST['id'];
+
+	$exist = $DB->GetAll("select * from doorknock");
+	if (!is_array($exist) || count($exist) < 1) {
+		echo "No registration in progress, ignoring.\n";
+		exit;
+	}
+	
+	$signup = $DB->GetAll("select * from signup where id=?",array($exist[0]['suid']));
+	if (!is_array($signup) || count($signup) < 1) {
+		echo "Unrecognised signup id\n";
+		msg_bad("Invalid slip");
+		$DB->Execute("delete from doorknock");
+		exit;
+	}
+
+	// should really check the card isnt already registered first
+	$DB->Execute("update signup set card=? where id=?", array($card, $signup[0]['id']));
+	echo "Registering card '$card' to signup id {$signup[0]['id']}\n";
+	$DB->Execute("delete from doorknock");
+
+	// User is registered, stick it in the real doorcards list too
+	if ($signup[0]['username'] != "") {
+		$user = $DB->GetAll("select * from members where username=?", array($signup[0]['username']));
+		if (!is_array($user) || count($user) < 1) {
+			echo "Cant find username '{$signup[0]['username']}' to full reg the card\n";
+		} else {
+			$DB->Execute("insert into doorcards (uid, cardnumber) values (?,?)", array($user[0]['uid'], $card));
+			echo "Registering card to uid={$user[0]['uid']} username {$user[0]['username']}\n";
+		}
+	}
+	unlink("/tmp/cards");
+	system("/usr/local/bin/db-to-cards.php");
+	system("sudo /usr/local/bin/putcardsfile");
+	unlink("/tmp/cards");
+	msg_good("Card now registered, swipe again for access");
+
+	exit;
+}
+
+?>
-- 
GitLab