Mercurial > hg > pnewss
comparison 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 |
comparison
equal
deleted
inserted
replaced
11:e0807e0b1a67 | 12:7917bd536187 |
---|---|
49 while (TRUE) { | 49 while (TRUE) { |
50 $line = nntp_readline(STDIN); | 50 $line = nntp_readline(STDIN); |
51 if ($line === FALSE || $line === NULL) break; | 51 if ($line === FALSE || $line === NULL) break; |
52 $cmd = strtoupper(strtok($line, " \t")); | 52 $cmd = strtoupper(strtok($line, " \t")); |
53 switch ($cmd) { | 53 switch ($cmd) { |
54 case '': | |
55 break; | |
56 case 'MODE': | |
57 $mode = strtok(" \t"); | |
58 switch (strtoupper($mode)) { | |
59 case 'READER': nntp_writeline(STDOUT, '200 Hello, you can post'); break; | |
60 case 'STREAM': nntp_writeline(STDOUT, '203 Streaming permitted'); break; | |
61 default: nntp_writeline(STDOUT, '501 Unknown MODE variant'); break; | |
62 } | |
63 break; | |
54 case 'CAPABILITIES': | 64 case 'CAPABILITIES': |
55 nntp_writeline(STDOUT, '101 Capability list:'); | 65 nntp_writeline(STDOUT, '101 Capability list:'); |
56 nntp_writeline_data(STDOUT, 'VERSION 2'); | 66 nntp_writeline_data(STDOUT, 'VERSION 2'); |
57 nntp_writeline_data(STDOUT, 'IMPLEMENTATION pNewss [http://wiki.ucis.nl/pNewss]'); | 67 nntp_writeline_data(STDOUT, 'IMPLEMENTATION pNewss [http://wiki.ucis.nl/pNewss]'); |
58 nntp_writeline_data(STDOUT, 'POST'); | 68 nntp_writeline_data(STDOUT, 'POST'); |
59 nntp_writeline_data(STDOUT, 'READER'); | 69 nntp_writeline_data(STDOUT, 'READER'); |
60 nntp_writeline_data(STDOUT, 'IHAVE'); | 70 nntp_writeline_data(STDOUT, 'IHAVE'); |
61 nntp_writeline_data(STDOUT, 'LIST ACTIVE'); | 71 nntp_writeline_data(STDOUT, 'LIST ACTIVE'); |
72 nntp_writeline_data(STDOUT, 'MODE-READER'); | |
73 nntp_writeline_data(STDOUT, 'STREAMING'); | |
62 nntp_writeline(STDOUT, '.'); | 74 nntp_writeline(STDOUT, '.'); |
63 break; | 75 break; |
64 case 'DATE': | 76 case 'DATE': |
65 nntp_writeline(STDOUT, '111 '.gmdate('YmdHis')); | 77 nntp_writeline(STDOUT, '111 '.gmdate('YmdHis')); |
66 break; | 78 break; |
71 break; | 83 break; |
72 case 'LIST': | 84 case 'LIST': |
73 nntp_writeline(STDOUT, '215 list of groups follows'); | 85 nntp_writeline(STDOUT, '215 list of groups follows'); |
74 foreach ($db->evalAllAssoc('SELECT * FROM `groups`') as $group) { | 86 foreach ($db->evalAllAssoc('SELECT * FROM `groups`') as $group) { |
75 $groupmessages = $db->evalRow('SELECT MIN(`number`), MAX(`number`) FROM `groupmessages` WHERE `group` = ?', $group['id']); | 87 $groupmessages = $db->evalRow('SELECT MIN(`number`), MAX(`number`) FROM `groupmessages` WHERE `group` = ?', $group['id']); |
76 nntp_writeline_data(STDOUT, $group['name'].' '.intval($groupmessages[1]).' '.intval($groupmessages[0]).' n'); | 88 nntp_writeline_data(STDOUT, $group['name'].' '.intval($groupmessages[1]).' '.intval($groupmessages[0]).' y'); |
77 } | 89 } |
78 nntp_writeline(STDOUT, '.'); | 90 nntp_writeline(STDOUT, '.'); |
79 break; | 91 break; |
80 case 'GROUP': | 92 case 'GROUP': |
81 case 'LISTGROUP': | 93 case 'LISTGROUP': |
177 nntp_writeline(STDOUT, '441 '.$ex->getMessage()); | 189 nntp_writeline(STDOUT, '441 '.$ex->getMessage()); |
178 } | 190 } |
179 break; | 191 break; |
180 case 'IHAVE': | 192 case 'IHAVE': |
181 $messageid = strtok(" \t"); | 193 $messageid = strtok(" \t"); |
182 if ($messageid === FALSE || strlen($messageid) <= 2 || $messageid[0] != '<' || $messageid[strlen($messageid)-1] == '>') { | 194 if ($messageid === FALSE || strlen($messageid) <= 2 || $messageid[0] != '<' || $messageid[strlen($messageid)-1] != '>') { |
183 nntp_writeline(STDOUT, '435 Argument error'); | 195 nntp_writeline(STDOUT, '435 Argument error'); |
184 break; | 196 break; |
185 } | 197 } |
186 $messageid = substr($messageid, 1, -1); | 198 $messageid = substr($messageid, 1, -1); |
187 if ($db->evalRow('SELECT `id` FROM `messages` WHERE `messageid` = ?', $messageid) !== FALSE) { | 199 if ($db->evalRow('SELECT `id` FROM `messages` WHERE `messageid` = ?', $messageid) !== FALSE) { |
195 nntp_writeline(STDOUT, '235 Article received <'.$messageid.'>'); | 207 nntp_writeline(STDOUT, '235 Article received <'.$messageid.'>'); |
196 } catch (Exception $ex) { | 208 } catch (Exception $ex) { |
197 nntp_writeline(STDOUT, '437 '.$ex->getMessage()); | 209 nntp_writeline(STDOUT, '437 '.$ex->getMessage()); |
198 } | 210 } |
199 break; | 211 break; |
212 case 'CHECK': | |
213 $messageid = strtok(" \t"); | |
214 if ($messageid === FALSE || strlen($messageid) <= 2 || $messageid[0] != '<' || $messageid[strlen($messageid)-1] != '>') { | |
215 nntp_writeline(STDOUT, '435 Argument error'); | |
216 break; | |
217 } | |
218 $messageid = substr($messageid, 1, -1); | |
219 if ($db->evalRow('SELECT `id` FROM `messages` WHERE `messageid` = ?', $messageid) !== FALSE) { | |
220 nntp_writeline(STDOUT, '438 <'.$messageid.'> Duplicate'); | |
221 break; | |
222 } | |
223 nntp_writeline(STDOUT, '238 <'.$messageid.'> Send article to be transferred'); | |
224 break; | |
225 case 'TAKETHIS': | |
226 $messageid = strtok(" \t"); | |
227 $lines = nntp_readlines(STDIN); | |
228 if ($messageid === FALSE || strlen($messageid) <= 2 || $messageid[0] != '<' || $messageid[strlen($messageid)-1] != '>') { | |
229 nntp_writeline(STDOUT, '435 Argument error'); | |
230 break; | |
231 } | |
232 $messageid = substr($messageid, 1, -1); | |
233 if ($db->evalRow('SELECT `id` FROM `messages` WHERE `messageid` = ?', $messageid) !== FALSE) { | |
234 nntp_writeline(STDOUT, '439 <'.$messageid.'> Duplicate'); | |
235 break; | |
236 } | |
237 try { | |
238 $messageid = nntp_article_store($lines); | |
239 nntp_writeline(STDOUT, '239 <'.$messageid.'> Article stored'); | |
240 } catch (Exception $ex) { | |
241 nntp_writeline(STDOUT, '437 '.$ex->getMessage()); | |
242 } | |
243 break; | |
200 case 'QUIT': | 244 case 'QUIT': |
201 nntp_writeline(STDOUT, '205 Bye.'); | 245 nntp_writeline(STDOUT, '205 Bye.'); |
202 return; | 246 return; |
203 default: | 247 default: |
204 nntp_writeline(STDOUT, '500 Command not understood'); | 248 nntp_writeline(STDOUT, '500 Command not understood'); |