Mercurial > hg > pnewss
annotate server.php @ 11:e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Sat, 18 Jun 2011 15:59:11 +0200 |
parents | ca88deec5352 |
children | 7917bd536187 |
rev | line source |
---|---|
0 | 1 #!/usr/bin/php |
2 <?php | |
8 | 3 /* Copyright 2010 Ivo Smits <Ivo@UCIS.nl>. All rights reserved. |
4 Redistribution and use in source and binary forms, with or without modification, are | |
5 permitted provided that the following conditions are met: | |
6 | |
7 1. Redistributions of source code must retain the above copyright notice, this list of | |
8 conditions and the following disclaimer. | |
9 | |
10 2. Redistributions in binary form must reproduce the above copyright notice, this list | |
11 of conditions and the following disclaimer in the documentation and/or other materials | |
12 provided with the distribution. | |
13 | |
14 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | |
15 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | |
16 FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR | |
17 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
18 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
19 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
20 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
21 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | |
22 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
23 | |
24 The views and conclusions contained in the software and documentation are those of the | |
25 authors and should not be interpreted as representing official policies, either expressed | |
26 or implied, of Ivo Smits.*/ | |
27 | |
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
|
28 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
|
29 require_once './common.php'; |
0 | 30 |
31 $logfile = fopen('./server.log', 'w'); | |
32 $currentgroup = NULL; | |
33 $currentarticle = NULL; | |
34 | |
35 function exception_handler($exception) { | |
36 nntp_writeline(STDOUT, ''); | |
37 nntp_writeline(STDOUT, '590 Exception: '.$exception->getMessage()); | |
38 die(); | |
39 } | |
40 function error_handler($errno, $errstr, $errfile, $errline) { | |
41 nntp_writeline(STDOUT, ''); | |
42 nntp_writeline(STDOUT, '590 Error in file '.$errfile.' line '.$errline.' error '.$errno.' '.$errstr); | |
43 die(); | |
44 } | |
45 set_exception_handler('exception_handler'); | |
46 set_error_handler("error_handler"); | |
47 | |
48 nntp_writeline(STDOUT, '200 pNewss ready'); | |
49 while (TRUE) { | |
50 $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
|
51 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
|
52 $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
|
53 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
|
54 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
|
55 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
|
56 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
|
57 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
|
58 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
|
59 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
|
60 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
|
61 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
|
62 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
|
63 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
|
64 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
|
65 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
|
66 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
|
67 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
|
68 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
|
69 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
|
70 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
|
71 break; |
0 | 72 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
|
73 nntp_writeline(STDOUT, '215 list of groups follows'); |
0 | 74 foreach ($db->evalAllAssoc('SELECT * FROM `groups`') as $group) { |
75 $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
|
76 nntp_writeline_data(STDOUT, $group['name'].' '.intval($groupmessages[1]).' '.intval($groupmessages[0]).' n'); |
0 | 77 } |
78 nntp_writeline(STDOUT, '.'); | |
79 break; | |
80 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
|
81 case 'LISTGROUP': |
0 | 82 $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
|
83 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
|
84 $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
|
85 } 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
|
86 $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
|
87 } |
0 | 88 if ($group === FALSE) { |
89 nntp_writeline(STDOUT, '411 No such group '.$groupname); | |
90 } else { | |
91 $currentgroup = $group; | |
92 $groupmessages = $db->evalRow('SELECT MIN(`number`), MAX(`number`), COUNT(`number`) FROM `groupmessages` WHERE `group` = ?', $group['id']); | |
93 nntp_writeline(STDOUT, '211 '.intval($groupmessages[2]).' '.intval($groupmessages[0]).' '.intval($groupmessages[1]).' '.$group['name']); | |
94 if ($groupmessages[0] === NULL) { | |
95 $currentarticle = NULL; | |
96 } else { | |
97 $currentarticle = $db->evalRowAssoc('SELECT * FROM `groupmessages` WHERE `group` = ? AND `number` = ?', array($group['id'], $groupmessages[0])); | |
98 if ($currentarticle === FALSE) $currentarticle = NULL; | |
99 } | |
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
|
100 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
|
101 $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
|
102 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
|
103 $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
|
104 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
|
105 $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
|
106 $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
|
107 } 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
|
108 $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
|
109 $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
|
110 } |
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 } 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
|
112 $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
|
113 $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
|
114 } |
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
|
115 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
|
116 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
|
117 } |
0 | 118 } |
119 break; | |
120 case 'STAT': | |
121 case 'HEAD': | |
122 case 'BODY': | |
123 case 'ARTICLE': | |
124 $article = nntp_get_article(strtok(" \t")); | |
125 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
|
126 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
|
127 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
|
128 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
|
129 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
|
130 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
|
131 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
|
132 } |
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
|
133 if ($cmd == 'HEAD' || $cmd == 'ARTICLE') foreach (explode("\r\n", $article['header']) as $line) nntp_writeline_data(STDOUT, $line); |
10
ca88deec5352
Add Xref header when sending messages to client (seems to fix message corruption issues in Thunderbird)
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
134 if ($cmd == 'HEAD' || $cmd == 'ARTICLE') { |
ca88deec5352
Add Xref header when sending messages to client (seems to fix message corruption issues in Thunderbird)
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
135 $grouprefsh = array('localhost'); |
ca88deec5352
Add Xref header when sending messages to client (seems to fix message corruption issues in Thunderbird)
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
136 foreach ($db->evalAllAssoc('SELECT * FROM `groupmessages` WHERE `message` = ?', $article['id']) as $groupref) { |
ca88deec5352
Add Xref header when sending messages to client (seems to fix message corruption issues in Thunderbird)
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
137 $groupname = $db->eval('SELECT `name` FROM `groups` WHERE `id` = ?', $groupref['group']); |
ca88deec5352
Add Xref header when sending messages to client (seems to fix message corruption issues in Thunderbird)
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
138 $grouprefsh[] = $groupname.':'.$groupref['number']; |
ca88deec5352
Add Xref header when sending messages to client (seems to fix message corruption issues in Thunderbird)
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
139 } |
ca88deec5352
Add Xref header when sending messages to client (seems to fix message corruption issues in Thunderbird)
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
140 nntp_writeline_data(STDOUT, 'Xref: '.implode(' ', $grouprefsh)); |
ca88deec5352
Add Xref header when sending messages to client (seems to fix message corruption issues in Thunderbird)
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
141 } |
ca88deec5352
Add Xref header when sending messages to client (seems to fix message corruption issues in Thunderbird)
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
142 if ($cmd == 'ARTICLE') nntp_writeline_data(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
|
143 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
|
144 if ($cmd != 'STAT') nntp_writeline(STDOUT, '.'); |
0 | 145 break; |
146 case 'LAST': | |
147 case 'NEXT': | |
148 if ($currentarticle === NULL) { | |
149 nntp_writeline(STDOUT, '420 no current article has been selected'); | |
150 break; | |
151 } | |
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
|
152 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
|
153 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
|
154 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
|
155 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
|
156 } |
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
|
157 $article = $db->evalRowAssoc($query, array($currentarticle['group'], $currentarticle['number'])); |
0 | 158 if ($article === FALSE) { |
159 nntp_writeline(STDOUT, '422 no previous article in this group'); | |
160 } else { | |
161 $articlea = $db->evalRowAssoc('SELECT * FROM `messages` WHERE `id` = ?', $article['message']); | |
162 if ($articlea === FALSE) { | |
163 nntp_writeline(STDOUT, '430 no such article found'); | |
164 return NULL; | |
165 } | |
166 $currentarticle = $article; | |
167 nntp_writeline(STDOUT, '223 '.$article['number'].' <'.$articlea['messageid'].'> ok'); | |
168 } | |
169 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
|
170 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
|
171 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
|
172 $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
|
173 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
|
174 $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
|
175 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
|
176 } 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
|
177 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
|
178 } |
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
|
179 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
|
180 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
|
181 $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
|
182 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
|
183 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
|
184 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
|
185 } |
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
|
186 $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
|
187 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
|
188 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
|
189 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
|
190 } |
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
|
191 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
|
192 $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
|
193 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
|
194 $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
|
195 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
|
196 } 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
|
197 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
|
198 } |
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
|
199 break; |
0 | 200 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
|
201 nntp_writeline(STDOUT, '205 Bye.'); |
0 | 202 return; |
203 default: | |
204 nntp_writeline(STDOUT, '500 Command not understood'); | |
205 break; | |
206 } | |
207 } | |
208 | |
209 function nntp_get_article($article) { | |
210 global $currentgroup, $currentarticle, $db; | |
211 if ($article === FALSE) { | |
212 if ($currentarticle === NULL) { | |
213 nntp_writeline(STDOUT, '420 no current article has been selected'); | |
214 return NULL; | |
215 } | |
216 $messagenumber = $currentarticle['number']; | |
217 $article = $db->evalRowAssoc('SELECT * FROM `messages` WHERE `id` = ?', $currentarticle['message']); | |
218 if ($article === FALSE) { | |
219 nntp_writeline(STDOUT, '430 no such article found'); | |
220 return NULL; | |
221 } | |
222 } elseif (strlen($article) > 2 && $article[0] == '<' && $article[strlen($article)-1] == '>') { | |
223 $messagenumber = 0; | |
224 $article = substr($article, 1, -1); | |
225 $article = $db->evalRowAssoc('SELECT * FROM `messages` WHERE `messageid` = ?', $article); | |
226 if ($article === FALSE) { | |
227 nntp_writeline(STDOUT, '430 no such article found'); | |
228 return NULL; | |
229 } | |
230 } elseif (is_numeric($article)) { | |
231 if ($currentgroup === NULL) { | |
232 nntp_writeline(STDOUT, '412 no newsgroup has been selected'); | |
233 return NULL; | |
234 } | |
235 $article = $db->evalRowAssoc('SELECT * FROM `groupmessages` WHERE `group` = ? AND `number` = ?', array($currentgroup['id'], $article)); | |
236 if ($article === FALSE) { | |
237 nntp_writeline(STDOUT, '423 no such article number in this group'); | |
238 return NULL; | |
239 } | |
240 $currentarticle = $article; | |
241 $messagenumber = $article['number']; | |
242 $article = $db->evalRowAssoc('SELECT * FROM `messages` WHERE `id` = ?', $article['message']); | |
243 if ($article === FALSE) { | |
244 nntp_writeline(STDOUT, '430 no such article found'); | |
245 return NULL; | |
246 } | |
247 } else { | |
248 nntp_writeline(STDOUT, '500 Error in arguments'); | |
249 } | |
250 $article['messagenumber'] = $messagenumber; | |
251 return $article; | |
252 } | |
253 | |
254 function writelog($line) { | |
255 global $logfile; | |
256 fwrite($logfile, $line."\n"); | |
257 } |