Mercurial > hg > pnewss
annotate fetchnews.php @ 2:40e545510a57
Added support for POSTing to the server, added readme and todo, added support for upstream synchronization using POST
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Tue, 12 Apr 2011 00:29:41 +0200 |
parents | 61fac319ca3e |
children | 0dcdb73cbcbf |
rev | line source |
---|---|
0 | 1 <?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:
1
diff
changeset
|
2 chdir(__DIR__); |
0 | 3 require_once './pdo.php'; |
4 require_once './config.php'; | |
5 | |
6 foreach ($db->evalAllAssoc('SELECT * FROM `peers`') as $peer) { | |
7 $socket = stream_socket_client($peer['address']); | |
8 if ($socket === FALSE) die("Could not connect to peer $peer[address]\n"); | |
9 $line = nntp_readline($socket); | |
10 $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
|
11 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
|
12 } 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
|
13 $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
|
14 } else die("Error code $code from $peer[address]\n"); |
0 | 15 foreach ($db->evalAllAssoc('SELECT * FROM `peergroups` WHERE `peer` = ?', $peer['id']) as $peergroup) { |
16 $group = $db->evalRowAssoc('SELECT * FROM `groups` WHERE `id` = ?', $peergroup['group']); | |
17 nntp_writeline($socket, 'GROUP '.$group['name']); | |
18 $line = nntp_readline($socket); | |
19 $code = strtok($line, " \t"); | |
20 if ($code != 211) die("Error code $code from $peer[address]\n"); | |
21 strtok(" \t"); //number of articles | |
22 $low = strtok(" \t"); | |
23 $high = strtok(" \t"); | |
24 strtok(" \t"); //group name | |
25 if ($low != $peergroup['low'] || $high != $peergroup['high'] || $peergroup['low'] === NULL || $peergroup['high'] === NULL) { | |
26 for ($i = $low; $i <= $high; $i++) { | |
27 if ($i >= $peergroup['low'] && $i <= $peergroup['high'] && $peergroup['low'] !== NULL && $peergroup['high'] !== NULL) continue; | |
28 nntp_writeline($socket, 'STAT '.$i); | |
29 $line = nntp_readline($socket); | |
30 $code = strtok($line, " \t"); | |
31 if ($code == 423) { | |
32 print("Gap in article numbering at $i\n"); | |
33 continue; | |
34 } | |
35 if ($code != 223) die("Error code $code from $peer[address]\n"); | |
36 strtok(" \t"); //article number | |
37 $messageid = strtok(" \t"); | |
38 if ($messageid[0] != '<' || $messageid[strlen($messageid)-1] != '>') die("Malformed message ID $messageid\n"); | |
39 $messageid = substr($messageid, 1, -1); | |
40 $message = $db->evalRowAssoc('SELECT * FROM `messages` WHERE `messageid` = ?', $messageid); | |
41 if ($message) { | |
42 $groupmessage = $db->evalRowAssoc('SELECT * FROM `groupmessages` WHERE `group` = ? AND `message` = ?', array($group['id'], $message['id'])); | |
43 if (!$groupmessage) { | |
44 $db->insert('INSERT INTO `groupmessages` (`group`, `message`) VALUES (?, ?)', array($group['id'], $message['id'])); | |
45 } | |
46 } else { | |
47 nntp_writeline($socket, 'HEAD '.$i); | |
48 $line = nntp_readline($socket); | |
49 $code = strtok($line, " \t"); | |
50 if ($code != 221) die("Error code $code from $peer[address]\n"); | |
51 strtok(" \t"); //article number | |
52 $lines = nntp_readlines($socket); | |
1
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
53 nntp_removeheader(&$lines, 'Xref'); |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
54 nntp_updatepath(&$lines, 'pNewss.Core.UCIS.nl'); |
0 | 55 $header = implode("\r\n", $lines); |
56 | |
57 nntp_writeline($socket, 'BODY '.$i); | |
58 $line = nntp_readline($socket); | |
59 $code = strtok($line, " \t"); | |
60 if ($code != 222) die("Error code $code from $peer[address]\n"); | |
61 strtok(" \t"); //article number | |
62 $lines = nntp_readlines($socket); | |
63 $body = implode("\r\n", $lines); | |
64 | |
65 $id = $db->insert('INSERT INTO `messages` (`messageid`, `header`, `body`) VALUES (?, ?, ?)', array($messageid, $header, $body)); | |
66 $db->insert('INSERT INTO `groupmessages` (`group`, `message`) VALUES (?, ?)', array($group['id'], $id)); | |
67 } | |
68 } | |
69 $db->update('UPDATE `peergroups` SET `low` = ?, `high` = ? WHERE `peer` = ? AND `group` = ?', array($low, $high, $peergroup['peer'], $peergroup['group'])); | |
70 } | |
71 } | |
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
|
72 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
|
73 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
|
74 $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
|
75 } 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
|
76 $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
|
77 } |
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
|
78 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
|
79 foreach ($articles as $article) { |
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
|
80 nntp_writeline($socket, '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
|
81 $line = nntp_readline($socket); |
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
|
82 $code = strtok($line, " \t"); |
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
|
83 if ($code != 340) die("Error code $code from $peer[address]\n"); |
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
|
84 foreach (explode("\r\n", $article['header']) as $line) { |
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
|
85 $parts = explode(': ', $line, 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
|
86 switch (strtoupper($parts[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
|
87 case 'PATH': case 'FROM': case 'NEWSGROUPS': case 'SUBJECT': case 'DATE': case 'ORGANIZATION': |
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 case 'LINES': case 'MESSAGE-ID': case 'MIME-VERSION': case 'CONTENT-TYPE': case 'CONTENT-TRANSFER-ENCODING': |
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 case 'USER-AGENT': case 'REFERENCES': case 'REPLY-TO': case 'SENDER': case 'FOLLOWUP-TO': |
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 case 'EXPIRES': case 'CONTROL': case 'DISTRIBUTION': case 'KEYWORDS': case 'SUMMARY': |
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 case 'IN-REPLY-TO': |
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 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
|
93 case 'NNTP-POSTING-HOST': case 'X-TRACE': case 'XREF': case 'X-COMPLAINTS-TO': |
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 case 'NNTP-POSTING-DATE': |
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 $line = 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
|
96 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
|
97 default: |
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
|
98 print("Sending unknown header $parts[0]\n"); |
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
|
99 } |
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
|
100 if ($line !== NULL) nntp_writeline($socket, $line); |
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
|
101 } |
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
|
102 nntp_writeline($socket, ''); |
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
|
103 foreach (explode("\r\n", $article['body']) as $line) nntp_writeline($socket, $line); |
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
|
104 nntp_writeline($socket, '.'); |
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
|
105 $line = nntp_readline($socket); |
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
|
106 $code = strtok($line, " \t"); |
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
|
107 if ($code != 240) print("Article $article[messageid] was not accepted ($code)\n"); |
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
|
108 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
|
109 } |
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
|
110 $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
|
111 } |
0 | 112 nntp_writeline($socket, 'QUIT'); |
113 fclose($socket); | |
114 } | |
115 | |
1
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
116 function nntp_removeheader(&$lines, $header) { |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
117 $header = strtoupper($header).':'; |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
118 $hlen = strlen($header); |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
119 foreach ($lines as $key => $line) if (strtoupper(substr($line, 0, $hlen)) == $header) unset($lines[$key]); |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
120 } |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
121 function nntp_updatepath(&$lines, $value) { |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
122 $header = strtoupper('Path').':'; |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
123 $hlen = strlen($header); |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
124 $found = FALSE; |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
125 foreach ($lines as &$line) if (strtoupper(substr($line, 0, $hlen)) == $header) { |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
126 $parts = explode(': ', $line, 2); |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
127 $parts[1] = $value.'!'.$parts[1]; |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
128 $line = implode(': ', $parts); |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
129 $found = TRUE; |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
130 break; |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
131 } |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
132 if (!$found) $lines[] = 'Path: '.$value; |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
133 } |
61fac319ca3e
Update Path and Xref header fields while fetching messages, added database schema export
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
134 |
0 | 135 function nntp_readline($socket) { |
136 $line = rtrim(fgets($socket, 512), "\r\n"); | |
137 print('R: '.$line."\n"); | |
138 return $line; | |
139 } | |
140 function nntp_writeline($socket, $line) { | |
141 print('W: '.$line."\n"); | |
142 fwrite($socket, $line."\r\n"); | |
143 } | |
144 function nntp_readlines($socket) { | |
145 $line = nntp_readline($socket); | |
146 $lines = array(); | |
147 while ($line != '.' && $line !== FALSE && $line !== FALSE) { | |
148 $lines[] = $line; | |
149 $line = nntp_readline($socket); | |
150 } | |
151 if ($line != '.') die("Unexpected end of message header\n"); | |
152 return $lines; | |
153 } |