Mercurial > hg > pnewss
view server.php @ 3:0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Tue, 12 Apr 2011 01:47:09 +0200 |
parents | 40e545510a57 |
children | 5d62af5270dd |
line wrap: on
line source
#!/usr/bin/php <?php chdir(__DIR__); require_once './common.php'; $logfile = fopen('./server.log', 'w'); $currentgroup = NULL; $currentarticle = NULL; function exception_handler($exception) { nntp_writeline(STDOUT, ''); nntp_writeline(STDOUT, '590 Exception: '.$exception->getMessage()); die(); } function error_handler($errno, $errstr, $errfile, $errline) { nntp_writeline(STDOUT, ''); nntp_writeline(STDOUT, '590 Error in file '.$errfile.' line '.$errline.' error '.$errno.' '.$errstr); die(); } set_exception_handler('exception_handler'); set_error_handler("error_handler"); nntp_writeline(STDOUT, '200 pNewss ready'); while (TRUE) { $line = nntp_readline(STDIN); if ($line === FALSE || $line === NULL) break; $cmd = strtoupper(strtok($line, " \t")); switch ($cmd) { case 'LIST': 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(STDOUT, $group['name'].' '.intval($groupmessages[1]).' '.intval($groupmessages[0]).' n'); } nntp_writeline(STDOUT, '.'); break; case 'GROUP': $groupname = strtok(" \t"); $group = $db->evalRowAssoc('SELECT * FROM `groups` WHERE `name` = ?', $groupname); if ($group === FALSE) { nntp_writeline(STDOUT, '411 No such group '.$groupname); } else { $currentgroup = $group; $groupmessages = $db->evalRow('SELECT MIN(`number`), MAX(`number`), COUNT(`number`) FROM `groupmessages` WHERE `group` = ?', $group['id']); nntp_writeline(STDOUT, '211 '.intval($groupmessages[2]).' '.intval($groupmessages[0]).' '.intval($groupmessages[1]).' '.$group['name']); if ($groupmessages[0] === NULL) { $currentarticle = NULL; } else { $currentarticle = $db->evalRowAssoc('SELECT * FROM `groupmessages` WHERE `group` = ? AND `number` = ?', array($group['id'], $groupmessages[0])); if ($currentarticle === FALSE) $currentarticle = NULL; } } break; case 'STAT': case 'HEAD': case 'BODY': case 'ARTICLE': $article = nntp_get_article(strtok(" \t")); if ($article === NULL) break; switch ($cmd) { case 'STAT': nntp_writeline(STDOUT, '223 '.$article['messagenumber'].' <'.$article['messageid'].'> stat'); break; case 'HEAD': nntp_writeline(STDOUT, '221 '.$article['messagenumber'].' <'.$article['messageid'].'> head'); break; case 'BODY': nntp_writeline(STDOUT, '222 '.$article['messagenumber'].' <'.$article['messageid'].'> body'); break; case 'ARTICLE': nntp_writeline(STDOUT, '220 '.$article['messagenumber'].' <'.$article['messageid'].'> article'); break; default: throw new Exception('Internal error'); } if ($cmd == 'HEAD' || $cmd == 'ARTICLE') foreach (explode("\r\n", $article['header']) as $line) nntp_writeline(STDOUT, $line); if ($cmd == 'ARTICLE') nntp_writeline(STDOUT, ''); if ($cmd == 'BODY' || $cmd == 'ARTICLE') foreach (explode("\r\n", $article['body']) as $line) nntp_writeline(STDOUT, $line); nntp_writeline(STDOUT, '.'); break; case 'LAST': case 'NEXT': if ($currentarticle === NULL) { nntp_writeline(STDOUT, '420 no current article has been selected'); break; } switch ($cmd) { case 'LAST': $query = 'SELECT * FROM `groupmessages` WHERE `group` = ? AND `number` < ? ORDER BY `number` DESC LIMIT 1'; break; case 'NEXT': $query = 'SELECT * FROM `groupmessages` WHERE `group` = ? AND `number` > ? ORDER BY `number` ASC LIMIT 1'; break; default: throw new Exception('Internal error'); } $article = $db->evalRowAssoc($query, array($currentarticle['group'], $currentarticle['number'])); if ($article === FALSE) { nntp_writeline(STDOUT, '422 no previous article in this group'); } else { $articlea = $db->evalRowAssoc('SELECT * FROM `messages` WHERE `id` = ?', $article['message']); if ($articlea === FALSE) { nntp_writeline(STDOUT, '430 no such article found'); return NULL; } $currentarticle = $article; nntp_writeline(STDOUT, '223 '.$article['number'].' <'.$articlea['messageid'].'> ok'); } break; case 'POST': nntp_writeline(STDOUT, '340 Ok, recommended message-ID <'.md5(time().rand()).'@pNews.Core.UCIS.nl>'); $lines = nntp_readlines(STDIN); try { $msgid = nntp_article_store($lines); nntp_writeline(STDOUT, '240 Article received <'.$msgid.'>'); } catch (Exception $ex) { nntp_writeline(STDOUT, '441 '.$ex->getMessage()); } break; case 'QUIT': nntp_writeline(STDOUT, '205 .'); return; default: nntp_writeline(STDOUT, '500 Command not understood'); break; } } function nntp_get_article($article) { global $currentgroup, $currentarticle, $db; if ($article === FALSE) { if ($currentarticle === NULL) { nntp_writeline(STDOUT, '420 no current article has been selected'); return NULL; } $messagenumber = $currentarticle['number']; $article = $db->evalRowAssoc('SELECT * FROM `messages` WHERE `id` = ?', $currentarticle['message']); if ($article === FALSE) { nntp_writeline(STDOUT, '430 no such article found'); return NULL; } } elseif (strlen($article) > 2 && $article[0] == '<' && $article[strlen($article)-1] == '>') { $messagenumber = 0; $article = substr($article, 1, -1); $article = $db->evalRowAssoc('SELECT * FROM `messages` WHERE `messageid` = ?', $article); if ($article === FALSE) { nntp_writeline(STDOUT, '430 no such article found'); return NULL; } } elseif (is_numeric($article)) { if ($currentgroup === NULL) { nntp_writeline(STDOUT, '412 no newsgroup has been selected'); return NULL; } $article = $db->evalRowAssoc('SELECT * FROM `groupmessages` WHERE `group` = ? AND `number` = ?', array($currentgroup['id'], $article)); if ($article === FALSE) { nntp_writeline(STDOUT, '423 no such article number in this group'); return NULL; } $currentarticle = $article; $messagenumber = $article['number']; $article = $db->evalRowAssoc('SELECT * FROM `messages` WHERE `id` = ?', $article['message']); if ($article === FALSE) { nntp_writeline(STDOUT, '430 no such article found'); return NULL; } } else { nntp_writeline(STDOUT, '500 Error in arguments'); } $article['messagenumber'] = $messagenumber; return $article; } function writelog($line) { global $logfile; fwrite($logfile, $line."\n"); }