Mercurial > hg > pnewss
annotate fetchnews.php @ 10:ca88deec5352
Add Xref header when sending messages to client (seems to fix message corruption issues in Thunderbird)
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Thu, 21 Apr 2011 00:01:32 +0200 |
parents | ae0c67d72670 |
children | e0807e0b1a67 |
rev | line source |
---|---|
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
|
1 #!/usr/bin/php |
0 | 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:
1
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 foreach ($db->evalAllAssoc('SELECT * FROM `peers`') as $peer) { | |
32 $socket = stream_socket_client($peer['address']); | |
33 if ($socket === FALSE) die("Could not connect to peer $peer[address]\n"); | |
34 $line = nntp_readline($socket); | |
35 $code = strtok($line, " \t"); | |
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:
1
diff
changeset
|
36 if ($code == 200) { |
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:
1
diff
changeset
|
37 } else if ($code == 201) { |
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:
1
diff
changeset
|
38 $peer['post'] = 0; |
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:
1
diff
changeset
|
39 } else die("Error code $code from $peer[address]\n"); |
0 | 40 foreach ($db->evalAllAssoc('SELECT * FROM `peergroups` WHERE `peer` = ?', $peer['id']) as $peergroup) { |
41 $group = $db->evalRowAssoc('SELECT * FROM `groups` WHERE `id` = ?', $peergroup['group']); | |
42 nntp_writeline($socket, 'GROUP '.$group['name']); | |
43 $line = nntp_readline($socket); | |
44 $code = strtok($line, " \t"); | |
45 if ($code != 211) die("Error code $code from $peer[address]\n"); | |
46 strtok(" \t"); //number of articles | |
47 $low = strtok(" \t"); | |
48 $high = strtok(" \t"); | |
49 strtok(" \t"); //group name | |
50 if ($low != $peergroup['low'] || $high != $peergroup['high'] || $peergroup['low'] === NULL || $peergroup['high'] === NULL) { | |
51 for ($i = $low; $i <= $high; $i++) { | |
52 if ($i >= $peergroup['low'] && $i <= $peergroup['high'] && $peergroup['low'] !== NULL && $peergroup['high'] !== NULL) continue; | |
53 nntp_writeline($socket, 'STAT '.$i); | |
54 $line = nntp_readline($socket); | |
55 $code = strtok($line, " \t"); | |
56 if ($code == 423) { | |
57 print("Gap in article numbering at $i\n"); | |
58 continue; | |
59 } | |
60 if ($code != 223) die("Error code $code from $peer[address]\n"); | |
61 strtok(" \t"); //article number | |
62 $messageid = strtok(" \t"); | |
63 if ($messageid[0] != '<' || $messageid[strlen($messageid)-1] != '>') die("Malformed message ID $messageid\n"); | |
64 $messageid = substr($messageid, 1, -1); | |
65 $message = $db->evalRowAssoc('SELECT * FROM `messages` WHERE `messageid` = ?', $messageid); | |
66 if ($message) { | |
67 $groupmessage = $db->evalRowAssoc('SELECT * FROM `groupmessages` WHERE `group` = ? AND `message` = ?', array($group['id'], $message['id'])); | |
68 if (!$groupmessage) { | |
69 $db->insert('INSERT INTO `groupmessages` (`group`, `message`) VALUES (?, ?)', array($group['id'], $message['id'])); | |
70 } | |
71 } else { | |
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
|
72 nntp_writeline($socket, 'ARTICLE '.$i); |
0 | 73 $line = nntp_readline($socket); |
74 $code = strtok($line, " \t"); | |
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
|
75 if ($code != 220) die("Error code $code from $peer[address]\n"); |
0 | 76 strtok(" \t"); //article number |
77 $lines = nntp_readlines($socket); | |
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
|
78 try { |
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
|
79 nntp_article_store($lines); |
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
|
80 } 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
|
81 writelog($ex->getMessage()); |
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
|
82 } |
0 | 83 } |
84 } | |
85 $db->update('UPDATE `peergroups` SET `low` = ?, `high` = ? WHERE `peer` = ? AND `group` = ?', array($low, $high, $peergroup['peer'], $peergroup['group'])); | |
86 } | |
87 } | |
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:
1
diff
changeset
|
88 while ($peer['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:
1
diff
changeset
|
89 if ($peer['lastposted'] === NULL) { |
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:
1
diff
changeset
|
90 $articles = $db->evalAllAssoc('SELECT * FROM `messages` LIMIT 10'); |
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:
1
diff
changeset
|
91 } else { |
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:
1
diff
changeset
|
92 $articles = $db->evalAllAssoc('SELECT * FROM `messages` WHERE `id` > ? LIMIT 10', $peer['lastposted']); |
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:
1
diff
changeset
|
93 } |
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:
1
diff
changeset
|
94 if (!count($articles)) break; |
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:
1
diff
changeset
|
95 foreach ($articles as $article) { |
9
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
96 $dopost = FALSE; |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
97 if ($peer['post'] == 2) { |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
98 nntp_writeline($socket, 'IHAVE <'.$article['messageid'].'>'); |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
99 $line = nntp_readline($socket); |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
100 $code = strtok($line, " \t"); |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
101 if ($code == 335) $dopost = TRUE; |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
102 elseif ($code != 435) $peer['post'] = 1; |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
103 } |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
104 if ($peer['post'] != 2) { |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
105 nntp_writeline($socket, 'STAT <'.$article['messageid'].'>'); |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
106 $line = nntp_readline($socket); |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
107 $code = strtok($line, " \t"); |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
108 if ($code == 430) $dopost = TRUE; |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
109 elseif ($code != 223) die("Error code $code from $peer[address]\n"); |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
110 if ($dopost) { |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
111 nntp_writeline($socket, 'POST'); |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
112 $line = nntp_readline($socket); |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
113 $code = strtok($line, " \t"); |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
114 if ($code != 340) die("Error code $code from $peer[address]\n"); |
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:
1
diff
changeset
|
115 } |
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:
1
diff
changeset
|
116 } |
9
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
117 if ($dopost) { |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
118 foreach (explode("\r\n", $article['header']) as $line) nntp_writeline_data($socket, $line); |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
119 nntp_writeline($socket, ''); |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
120 foreach (explode("\r\n", $article['body']) as $line) nntp_writeline_data($socket, $line); |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
121 nntp_writeline($socket, '.'); |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
122 $line = nntp_readline($socket); |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
123 $code = strtok($line, " \t"); |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
124 if ($code != 240 && $code != 235) print("Article $article[messageid] was not accepted ($code)\n"); |
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
125 } |
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:
1
diff
changeset
|
126 if ($article['id'] > $peer['lastposted']) $peer['lastposted'] = $article['id']; |
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:
1
diff
changeset
|
127 } |
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:
1
diff
changeset
|
128 $db->update('UPDATE `peers` SET `lastposted` = ? WHERE `id` = ?', array($peer['lastposted'], $peer['id'])); |
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:
1
diff
changeset
|
129 } |
0 | 130 nntp_writeline($socket, 'QUIT'); |
9
ae0c67d72670
Bugfix in server POST code, add support for client side IHAVE and fall back to STAT-before-POST
Ivo Smits <Ivo@UCIS.nl>
parents:
8
diff
changeset
|
131 nntp_readline($socket); |
0 | 132 fclose($socket); |
133 } | |
134 | |
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
|
135 function writelog($line) { |
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
|
136 print($line."\n"); |
1
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
137 } |