diff server.php @ 12:7917bd536187 draft

Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
author Ivo Smits <Ivo@UCIS.nl>
date Wed, 12 Jun 2013 22:22:07 +0200
parents ca88deec5352
children cccd73f72bf6
line wrap: on
line diff
--- a/server.php	Sat Jun 18 15:59:11 2011 +0200
+++ b/server.php	Wed Jun 12 22:22:07 2013 +0200
@@ -51,6 +51,16 @@
 	if ($line === FALSE || $line === NULL) break;
 	$cmd = strtoupper(strtok($line, " \t"));
 	switch ($cmd) {
+		case '':
+			break;
+		case 'MODE':
+			$mode = strtok(" \t");
+			switch (strtoupper($mode)) {
+				case 'READER': nntp_writeline(STDOUT, '200 Hello, you can post'); break;
+				case 'STREAM': nntp_writeline(STDOUT, '203 Streaming permitted'); break;
+				default: nntp_writeline(STDOUT, '501 Unknown MODE variant'); break;
+			}
+			break;
 		case 'CAPABILITIES':
 			nntp_writeline(STDOUT, '101 Capability list:');
 			nntp_writeline_data(STDOUT, 'VERSION 2');
@@ -59,6 +69,8 @@
 			nntp_writeline_data(STDOUT, 'READER');
 			nntp_writeline_data(STDOUT, 'IHAVE');
 			nntp_writeline_data(STDOUT, 'LIST ACTIVE');
+			nntp_writeline_data(STDOUT, 'MODE-READER');
+			nntp_writeline_data(STDOUT, 'STREAMING');
 			nntp_writeline(STDOUT, '.');
 			break;
 		case 'DATE':
@@ -73,7 +85,7 @@
 			nntp_writeline(STDOUT, '215 list of groups follows');
 			foreach ($db->evalAllAssoc('SELECT * FROM `groups`') as $group) {
 				$groupmessages = $db->evalRow('SELECT MIN(`number`), MAX(`number`) FROM `groupmessages` WHERE `group` = ?', $group['id']);
-				nntp_writeline_data(STDOUT, $group['name'].' '.intval($groupmessages[1]).' '.intval($groupmessages[0]).' n');
+				nntp_writeline_data(STDOUT, $group['name'].' '.intval($groupmessages[1]).' '.intval($groupmessages[0]).' y');
 			}
 			nntp_writeline(STDOUT, '.');
 			break;
@@ -179,7 +191,7 @@
 			break;
 		case 'IHAVE':
 			$messageid = strtok(" \t");
-			if ($messageid === FALSE || strlen($messageid) <= 2 || $messageid[0] != '<' || $messageid[strlen($messageid)-1] == '>') {
+			if ($messageid === FALSE || strlen($messageid) <= 2 || $messageid[0] != '<' || $messageid[strlen($messageid)-1] != '>') {
 				nntp_writeline(STDOUT, '435 Argument error');
 				break;
 			}
@@ -197,6 +209,38 @@
 				nntp_writeline(STDOUT, '437 '.$ex->getMessage());
 			}
 			break;
+		case 'CHECK':
+			$messageid = strtok(" \t");
+			if ($messageid === FALSE || strlen($messageid) <= 2 || $messageid[0] != '<' || $messageid[strlen($messageid)-1] != '>') {
+				nntp_writeline(STDOUT, '435 Argument error');
+				break;
+			}
+			$messageid = substr($messageid, 1, -1);
+			if ($db->evalRow('SELECT `id` FROM `messages` WHERE `messageid` = ?', $messageid) !== FALSE) {
+				nntp_writeline(STDOUT, '438 <'.$messageid.'> Duplicate');
+				break;
+			}
+			nntp_writeline(STDOUT, '238 <'.$messageid.'> Send article to be transferred');
+			break;
+		case 'TAKETHIS':
+			$messageid = strtok(" \t");
+			$lines = nntp_readlines(STDIN);
+			if ($messageid === FALSE || strlen($messageid) <= 2 || $messageid[0] != '<' || $messageid[strlen($messageid)-1] != '>') {
+				nntp_writeline(STDOUT, '435 Argument error');
+				break;
+			}
+			$messageid = substr($messageid, 1, -1);
+			if ($db->evalRow('SELECT `id` FROM `messages` WHERE `messageid` = ?', $messageid) !== FALSE) {
+				nntp_writeline(STDOUT, '439 <'.$messageid.'> Duplicate');
+				break;
+			}
+			try {
+				$messageid = nntp_article_store($lines);
+				nntp_writeline(STDOUT, '239 <'.$messageid.'> Article stored');
+			} catch (Exception $ex) {
+				nntp_writeline(STDOUT, '437 '.$ex->getMessage());
+			}
+			break;
 		case 'QUIT':
 			nntp_writeline(STDOUT, '205 Bye.');
 			return;