Mercurial > hg > pnewss
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;