Mercurial > hg > pnewss
annotate server.php @ 7:01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Tue, 12 Apr 2011 14:10:41 +0200 |
parents | 5d62af5270dd |
children | 005339a1b2ce |
rev | line source |
---|---|
0 | 1 #!/usr/bin/php |
2 <?php | |
2
40e545510a57
Added support for POSTing to the server, added readme and todo, added support for upstream synchronization using POST
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
3 chdir(__DIR__); |
3
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
4 require_once './common.php'; |
0 | 5 |
6 $logfile = fopen('./server.log', 'w'); | |
7 $currentgroup = NULL; | |
8 $currentarticle = NULL; | |
9 | |
10 function exception_handler($exception) { | |
11 nntp_writeline(STDOUT, ''); | |
12 nntp_writeline(STDOUT, '590 Exception: '.$exception->getMessage()); | |
13 die(); | |
14 } | |
15 function error_handler($errno, $errstr, $errfile, $errline) { | |
16 nntp_writeline(STDOUT, ''); | |
17 nntp_writeline(STDOUT, '590 Error in file '.$errfile.' line '.$errline.' error '.$errno.' '.$errstr); | |
18 die(); | |
19 } | |
20 set_exception_handler('exception_handler'); | |
21 set_error_handler("error_handler"); | |
22 | |
23 nntp_writeline(STDOUT, '200 pNewss ready'); | |
24 while (TRUE) { | |
25 $line = nntp_readline(STDIN); | |
2
40e545510a57
Added support for POSTing to the server, added readme and todo, added support for upstream synchronization using POST
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
26 if ($line === FALSE || $line === NULL) break; |
3
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
27 $cmd = strtoupper(strtok($line, " \t")); |
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
28 switch ($cmd) { |
7
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
29 case 'CAPABILITIES': |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
30 nntp_writeline(STDOUT, '101 Capability list:'); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
31 nntp_writeline_data(STDOUT, 'VERSION 2'); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
32 nntp_writeline_data(STDOUT, 'IMPLEMENTATION pNewss [http://wiki.ucis.nl/pNewss]'); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
33 nntp_writeline_data(STDOUT, 'POST'); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
34 nntp_writeline_data(STDOUT, 'READER'); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
35 nntp_writeline_data(STDOUT, 'IHAVE'); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
36 nntp_writeline_data(STDOUT, 'LIST ACTIVE'); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
37 nntp_writeline(STDOUT, '.'); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
38 //HDR, LIST, OVER, STARTTLS, STREAMING, |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
39 break; |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
40 case 'DATE': |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
41 nntp_writeline(STDOUT, '111 '.gmdate('YmdHis')); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
42 break; |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
43 case 'HELP': |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
44 nntp_writeline(STDOUT, '100 Help text follows:'); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
45 nntp_writeline_data(STDOUT, 'Supported commands: CAPABILITIES,DATE,HELP,LIST,GROUP,LISTGROUP,STAT,HEAD,BODY,ARTICLE,LAST,NEXT,POST,IHAVE,QUIT'); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
46 nntp_writeline(STDOUT, '.'); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
47 break; |
0 | 48 case 'LIST': |
3
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
49 nntp_writeline(STDOUT, '215 list of groups follows'); |
0 | 50 foreach ($db->evalAllAssoc('SELECT * FROM `groups`') as $group) { |
51 $groupmessages = $db->evalRow('SELECT MIN(`number`), MAX(`number`) FROM `groupmessages` WHERE `group` = ?', $group['id']); | |
7
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
52 nntp_writeline_data(STDOUT, $group['name'].' '.intval($groupmessages[1]).' '.intval($groupmessages[0]).' n'); |
0 | 53 } |
54 nntp_writeline(STDOUT, '.'); | |
55 break; | |
56 case 'GROUP': | |
7
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
57 case 'LISTGROUP': |
0 | 58 $groupname = strtok(" \t"); |
7
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
59 if ($groupname === FALSE) { |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
60 $group = $currentgroup; |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
61 } else { |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
62 $group = $db->evalRowAssoc('SELECT * FROM `groups` WHERE `name` = ?', $groupname); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
63 } |
0 | 64 if ($group === FALSE) { |
65 nntp_writeline(STDOUT, '411 No such group '.$groupname); | |
66 } else { | |
67 $currentgroup = $group; | |
68 $groupmessages = $db->evalRow('SELECT MIN(`number`), MAX(`number`), COUNT(`number`) FROM `groupmessages` WHERE `group` = ?', $group['id']); | |
69 nntp_writeline(STDOUT, '211 '.intval($groupmessages[2]).' '.intval($groupmessages[0]).' '.intval($groupmessages[1]).' '.$group['name']); | |
70 if ($groupmessages[0] === NULL) { | |
71 $currentarticle = NULL; | |
72 } else { | |
73 $currentarticle = $db->evalRowAssoc('SELECT * FROM `groupmessages` WHERE `group` = ? AND `number` = ?', array($group['id'], $groupmessages[0])); | |
74 if ($currentarticle === FALSE) $currentarticle = NULL; | |
75 } | |
7
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
76 if ($cmd == 'LISTGROUP') { |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
77 $range = strtok(" \t"); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
78 if ($range !== FALSE) { |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
79 $parts = explode('-', $range); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
80 if (count($parts) == 1 || !strlen($parts[1])) { |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
81 $query = 'SELECT `number` FROM `groupmessages` WHERE `group` = ? AND `number` >= ?'; |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
82 $queryargs = array($group['id'], $parts[0]); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
83 } else { |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
84 $query = 'SELECT `number` FROM `groupmessages` WHERE `group` = ? AND `number` BETWEEN ? AND ?'; |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
85 $queryargs = array($group['id'], $parts[0], $parts[1]); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
86 } |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
87 } else { |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
88 $query = 'SELECT `number` FROM `groupmessages` WHERE `group` = ?'; |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
89 $queryargs = array($group['id']); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
90 } |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
91 foreach ($db->evalColumn($query, $queryargs) as $number) nntp_writeline_data(STDOUT, $number); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
92 nntp_writeline(STDOUT, '.'); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
93 } |
0 | 94 } |
95 break; | |
96 case 'STAT': | |
97 case 'HEAD': | |
98 case 'BODY': | |
99 case 'ARTICLE': | |
100 $article = nntp_get_article(strtok(" \t")); | |
101 if ($article === NULL) break; | |
3
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
102 switch ($cmd) { |
5
5d62af5270dd
Small bugfix in server STAT command (no data follows, so don't send a dot)
Ivo Smits <Ivo@UCIS.nl>
parents:
3
diff
changeset
|
103 case 'ARTICLE': nntp_writeline(STDOUT, '220 '.$article['messagenumber'].' <'.$article['messageid'].'> article'); break; |
3
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
104 case 'HEAD': nntp_writeline(STDOUT, '221 '.$article['messagenumber'].' <'.$article['messageid'].'> head'); break; |
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
105 case 'BODY': nntp_writeline(STDOUT, '222 '.$article['messagenumber'].' <'.$article['messageid'].'> body'); break; |
5
5d62af5270dd
Small bugfix in server STAT command (no data follows, so don't send a dot)
Ivo Smits <Ivo@UCIS.nl>
parents:
3
diff
changeset
|
106 case 'STAT': nntp_writeline(STDOUT, '223 '.$article['messagenumber'].' <'.$article['messageid'].'> stat'); break; |
3
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
107 default: throw new Exception('Internal error'); |
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
108 } |
7
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
109 if ($cmd == 'HEAD' || $cmd == 'ARTICLE') foreach (explode("\r\n", $article['header']) as $line) nntp_writeline_data(STDOUT, $line); |
3
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
110 if ($cmd == 'ARTICLE') nntp_writeline(STDOUT, ''); |
7
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
111 if ($cmd == 'BODY' || $cmd == 'ARTICLE') foreach (explode("\r\n", $article['body']) as $line) nntp_writeline_data(STDOUT, $line); |
5
5d62af5270dd
Small bugfix in server STAT command (no data follows, so don't send a dot)
Ivo Smits <Ivo@UCIS.nl>
parents:
3
diff
changeset
|
112 if ($cmd != 'STAT') nntp_writeline(STDOUT, '.'); |
0 | 113 break; |
114 case 'LAST': | |
115 case 'NEXT': | |
116 if ($currentarticle === NULL) { | |
117 nntp_writeline(STDOUT, '420 no current article has been selected'); | |
118 break; | |
119 } | |
3
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
120 switch ($cmd) { |
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
121 case 'LAST': $query = 'SELECT * FROM `groupmessages` WHERE `group` = ? AND `number` < ? ORDER BY `number` DESC LIMIT 1'; break; |
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
122 case 'NEXT': $query = 'SELECT * FROM `groupmessages` WHERE `group` = ? AND `number` > ? ORDER BY `number` ASC LIMIT 1'; break; |
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
123 default: throw new Exception('Internal error'); |
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
124 } |
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
125 $article = $db->evalRowAssoc($query, array($currentarticle['group'], $currentarticle['number'])); |
0 | 126 if ($article === FALSE) { |
127 nntp_writeline(STDOUT, '422 no previous article in this group'); | |
128 } else { | |
129 $articlea = $db->evalRowAssoc('SELECT * FROM `messages` WHERE `id` = ?', $article['message']); | |
130 if ($articlea === FALSE) { | |
131 nntp_writeline(STDOUT, '430 no such article found'); | |
132 return NULL; | |
133 } | |
134 $currentarticle = $article; | |
135 nntp_writeline(STDOUT, '223 '.$article['number'].' <'.$articlea['messageid'].'> ok'); | |
136 } | |
137 break; | |
2
40e545510a57
Added support for POSTing to the server, added readme and todo, added support for upstream synchronization using POST
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
138 case 'POST': |
40e545510a57
Added support for POSTing to the server, added readme and todo, added support for upstream synchronization using POST
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
139 nntp_writeline(STDOUT, '340 Ok, recommended message-ID <'.md5(time().rand()).'@pNews.Core.UCIS.nl>'); |
40e545510a57
Added support for POSTing to the server, added readme and todo, added support for upstream synchronization using POST
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
140 $lines = nntp_readlines(STDIN); |
3
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
141 try { |
7
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
142 $messageid = nntp_article_store($lines); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
143 nntp_writeline(STDOUT, '240 Article received <'.$messageid.'>'); |
3
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
144 } catch (Exception $ex) { |
0dcdb73cbcbf
Increased article body length to 16MB in database scheme, cleaned up the code, added a script to forcefully reload an individual article
Ivo Smits <Ivo@UCIS.nl>
parents:
2
diff
changeset
|
145 nntp_writeline(STDOUT, '441 '.$ex->getMessage()); |
2
40e545510a57
Added support for POSTing to the server, added readme and todo, added support for upstream synchronization using POST
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
146 } |
40e545510a57
Added support for POSTing to the server, added readme and todo, added support for upstream synchronization using POST
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
147 break; |
7
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
148 case 'IHAVE': |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
149 $messageid = strtok(" \t"); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
150 if ($messageid === FALSE || strlen($messageid) <= 2 || $messageid[0] != '<' || $messageid[strlen($messageid)-1] == '>') { |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
151 nntp_writeline(STDOUT, '435 Argument error'); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
152 break; |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
153 } |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
154 $messageid = substr($messageid, 1, -1); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
155 if ($db->evalRow('SELECT `id` FROM `messages` WHERE `messageid` = ?', $messageid) !== FALSE) { |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
156 nntp_writeline(STDOUT, '435 Duplicate'); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
157 break; |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
158 } |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
159 nntp_writeline(STDOUT, '335 Send article to be transferred'); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
160 $lines = nntp_readlines(STDIN); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
161 try { |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
162 $messageid = nntp_article_store($lines); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
163 nntp_writeline(STDOUT, '235 Article received <'.$messageid.'>'); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
164 } catch (Exception $ex) { |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
165 nntp_writeline(STDOUT, '437 '.$ex->getMessage()); |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
166 } |
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
167 break; |
0 | 168 case 'QUIT': |
7
01dc7eeaf5df
Added some more checks to article data, added some commands, added 'dot stuffing' for block transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
5
diff
changeset
|
169 nntp_writeline(STDOUT, '205 Bye.'); |
0 | 170 return; |
171 default: | |
172 nntp_writeline(STDOUT, '500 Command not understood'); | |
173 break; | |
174 } | |
175 } | |
176 | |
177 function nntp_get_article($article) { | |
178 global $currentgroup, $currentarticle, $db; | |
179 if ($article === FALSE) { | |
180 if ($currentarticle === NULL) { | |
181 nntp_writeline(STDOUT, '420 no current article has been selected'); | |
182 return NULL; | |
183 } | |
184 $messagenumber = $currentarticle['number']; | |
185 $article = $db->evalRowAssoc('SELECT * FROM `messages` WHERE `id` = ?', $currentarticle['message']); | |
186 if ($article === FALSE) { | |
187 nntp_writeline(STDOUT, '430 no such article found'); | |
188 return NULL; | |
189 } | |
190 } elseif (strlen($article) > 2 && $article[0] == '<' && $article[strlen($article)-1] == '>') { | |
191 $messagenumber = 0; | |
192 $article = substr($article, 1, -1); | |
193 $article = $db->evalRowAssoc('SELECT * FROM `messages` WHERE `messageid` = ?', $article); | |
194 if ($article === FALSE) { | |
195 nntp_writeline(STDOUT, '430 no such article found'); | |
196 return NULL; | |
197 } | |
198 } elseif (is_numeric($article)) { | |
199 if ($currentgroup === NULL) { | |
200 nntp_writeline(STDOUT, '412 no newsgroup has been selected'); | |
201 return NULL; | |
202 } | |
203 $article = $db->evalRowAssoc('SELECT * FROM `groupmessages` WHERE `group` = ? AND `number` = ?', array($currentgroup['id'], $article)); | |
204 if ($article === FALSE) { | |
205 nntp_writeline(STDOUT, '423 no such article number in this group'); | |
206 return NULL; | |
207 } | |
208 $currentarticle = $article; | |
209 $messagenumber = $article['number']; | |
210 $article = $db->evalRowAssoc('SELECT * FROM `messages` WHERE `id` = ?', $article['message']); | |
211 if ($article === FALSE) { | |
212 nntp_writeline(STDOUT, '430 no such article found'); | |
213 return NULL; | |
214 } | |
215 } else { | |
216 nntp_writeline(STDOUT, '500 Error in arguments'); | |
217 } | |
218 $article['messagenumber'] = $messagenumber; | |
219 return $article; | |
220 } | |
221 | |
222 function writelog($line) { | |
223 global $logfile; | |
224 fwrite($logfile, $line."\n"); | |
225 } |