Mercurial > hg > pnewss
annotate common.php @ 13:cccd73f72bf6 draft
Added filtering support and several bugfixes
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Thu, 10 Jul 2014 22:26:45 +0200 |
parents | 7917bd536187 |
children | 372f4e195986 |
rev | line source |
---|---|
11
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
1 <?php |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
2 /* Copyright 2010 Ivo Smits <Ivo@UCIS.nl>. All rights reserved. |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
3 Redistribution and use in source and binary forms, with or without modification, are |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
4 permitted provided that the following conditions are met: |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
5 |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
6 1. Redistributions of source code must retain the above copyright notice, this list of |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
7 conditions and the following disclaimer. |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
8 |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
9 2. Redistributions in binary form must reproduce the above copyright notice, this list |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
10 of conditions and the following disclaimer in the documentation and/or other materials |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
11 provided with the distribution. |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
12 |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
13 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
14 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
15 FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
16 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
17 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
18 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
19 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
20 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
21 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
22 |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
23 The views and conclusions contained in the software and documentation are those of the |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
24 authors and should not be interpreted as representing official policies, either expressed |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
25 or implied, of Ivo Smits.*/ |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
26 |
13
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
27 $pnewss_hooks = array('article_stored' => array(), 'article_filter' => array()); |
12
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
28 |
11
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
29 require_once './pdo.php'; |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
30 require_once './config.php'; |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
31 |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
32 function nntp_readline($socket) { |
13
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
33 $line = fgets($socket); |
11
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
34 if ($line === FALSE || $line === NULL) return $line; |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
35 $line = rtrim($line, "\r\n"); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
36 writelog('R: '.$line); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
37 return $line; |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
38 } |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
39 function nntp_writeline_data($socket, $line) { |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
40 if (strlen($line) && $line[0] == '.') $line = '.'.$line; |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
41 nntp_writeline($socket, $line); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
42 } |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
43 function nntp_writeline($socket, $line) { |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
44 writelog('W: '.$line); |
12
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
45 $line .= "\r\n"; |
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
46 while (strlen($line)) { |
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
47 $written = fwrite($socket, $line); |
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
48 if ($written === FALSE || $written <= 0) throw new Exception('Write operation failed'); |
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
49 $line = substr($line, $written); |
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
50 } |
11
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
51 } |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
52 function nntp_readlines($socket) { |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
53 $line = nntp_readline($socket); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
54 $lines = array(); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
55 while ($line != '.' && $line !== FALSE && $line !== FALSE) { |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
56 if (strlen($line) && $line[0] == '.') $line = substr($line, 1); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
57 $lines[] = $line; |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
58 $line = nntp_readline($socket); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
59 } |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
60 if ($line != '.') throw new Exception('Unexpected end of message'); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
61 return $lines; |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
62 } |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
63 |
12
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
64 function pnewss_call_hooks($hooks, $args) { |
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
65 foreach ($hooks as $hook) call_user_func_array($hook, $args); |
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
66 } |
13
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
67 function pnewss_call_filter_hooks($hooks, $args) { |
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
68 foreach ($hooks as $hook) if (!call_user_func_array($hook, $args)) return FALSE; |
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
69 return TRUE; |
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
70 } |
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
71 |
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
72 function nntp_article_wanted($messageid) { |
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
73 global $db, $pnewss_hooks; |
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
74 if ($db->evalRow('SELECT `id` FROM `messages` WHERE `messageid` = ?', $messageid) !== FALSE) return FALSE; |
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
75 if (!pnewss_call_filter_hooks($pnewss_hooks['article_filter'], array(array('messageid' => $messageid)))) return FALSE; |
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
76 return TRUE; |
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
77 } |
12
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
78 |
11
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
79 function nntp_article_store($lines, $header = array()) { |
12
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
80 global $db, $pnewss_hooks; |
11
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
81 $headers = array(); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
82 if (!count($header)) { |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
83 while (count($lines)) { |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
84 $line = array_shift($lines); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
85 if (!strlen($line)) break; |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
86 $header[] = $line; |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
87 } |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
88 } |
12
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
89 $headername = NULL; |
11
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
90 foreach ($header as $headerid => $line) { |
13
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
91 if (!strlen($line)) throw new Exception('Empty header line'); |
11
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
92 if (strpos($line, "\r") !== FALSE || strpos($line, "\n") !== FALSE || strpos($line, "\0")) throw new Exception('Invalid newline or NUL character in header line'); |
12
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
93 if (strlen($line) && strlen($headername) && ($line[0] == ' ' || $line[0] == "\t") && isset($headers[$headername])) { |
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
94 $headers[$headername] .= ' '.trim($line, " \t"); |
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
95 unset($header[$headerid]); |
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
96 continue; |
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
97 } |
11
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
98 $parts = explode(': ', $line, 2); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
99 $headername = strtoupper($parts[0]); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
100 switch ($headername) { |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
101 case 'PATH': case 'FROM': case 'NEWSGROUPS': case 'SUBJECT': case 'DATE': case 'MESSAGE-ID': case 'SENDER': |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
102 if (isset($headers[$headername])) throw new Exception('Duplicate header: '.$headername); |
13
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
103 $headers[$headername] = $parts[1]; |
11
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
104 unset($header[$headerid]); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
105 break; |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
106 case 'ORGANIZATION': case 'LINES': |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
107 case 'MIME-VERSION': case 'CONTENT-TYPE': case 'CONTENT-TRANSFER-ENCODING': case 'USER-AGENT': |
13
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
108 case 'REFERENCES': case 'REPLY-TO': case 'FOLLOWUP-TO': case 'IN-REPLY-TO': |
11
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
109 case 'EXPIRES': case 'CONTROL': case 'DISTRIBUTION': case 'KEYWORDS': case 'SUMMARY': |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
110 break; |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
111 case 'NNTP-POSTING-HOST': case 'X-TRACE': case 'XREF': case 'X-COMPLAINTS-TO': |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
112 case 'NNTP-POSTING-DATE': |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
113 unset($header[$headerid]); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
114 $line = NULL; |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
115 break; |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
116 default: |
12
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
117 if ($headername[0] == 'X' && $headername[1] == '-') break; |
11
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
118 writelog("Received unknown header $headername"); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
119 } |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
120 } |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
121 foreach ($lines as $line) { |
13
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
122 if (strpos($line, "\r") !== FALSE || strpos($line, "\n") !== FALSE || strpos($line, "\0")) throw new Exception('Invalid newline or NUL character in body line'); |
11
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
123 } |
13
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
124 if (!isset($headers['NEWSGROUPS'])) throw new Exception('Missing required Newsgroups header'); |
11
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
125 $newsgroups = array(); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
126 foreach (explode(',', $headers['NEWSGROUPS']) as $groupname) { |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
127 $group = $db->evalRowAssoc('SELECT * FROM `groups` WHERE `name` = ?', $groupname); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
128 if ($group === FALSE) continue; |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
129 $newsgroups[] = $group['id']; |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
130 } |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
131 if (!count($newsgroups)) throw new Exception('No known newsgroups listed'); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
132 if (!isset($headers['MESSAGE-ID'])) $headers['MESSAGE-ID'] = '<'.md5(time().rand()).'@pNewss.Core.UCIS.nl>'; |
12
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
133 if (!isset($headers['DATE'])) $headers['DATE'] = gmdate('r'); |
11
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
134 $messageid = $headers['MESSAGE-ID']; |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
135 if (strlen($messageid) < 3 || strlen($messageid) > 250 || $messageid[0] != '<' || strpos($messageid, '>') !== strlen($messageid) - 1) throw new Exception('Bad Message-ID'); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
136 $messageid = substr($messageid, 1, -1); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
137 $article = $db->evalRowAssoc('SELECT * FROM `messages` WHERE `messageid` = ?', $messageid); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
138 if ($article !== FALSE) throw new Exception('Duplicate'); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
139 $headers['PATH'] = 'pNewss.Core.UCIS.nl'.(isset($headers['PATH'])?'!'.$headers['PATH']:''); |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
140 foreach (array('Path', 'From', 'Newsgroups', 'Subject', 'Date', 'Message-ID', 'Sender') as $headername) { |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
141 if (isset($headers[strtoupper($headername)])) $header[] = $headername.': '.$headers[strtoupper($headername)]; |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
142 } |
13
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
143 if (!pnewss_call_filter_hooks($pnewss_hooks['article_filter'], array(array('messageid' => $messageid, 'headers' => $headers, 'body' => $lines)))) throw new Exception('Filtered'); |
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
144 $headertext = implode("\r\n", $header); |
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
145 $bodytext = implode("\r\n", $lines); |
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
146 if (strlen($headertext) > 65535 || strlen($bodytext) > 16777215) throw new Exception('Message too big'); |
cccd73f72bf6
Added filtering support and several bugfixes
Ivo Smits <Ivo@UCIS.nl>
parents:
12
diff
changeset
|
147 $id = $db->insert('INSERT INTO `messages` (`messageid`, `header`, `body`) VALUES (?, ?, ?)', array($messageid, $headertext, $bodytext)); |
11
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
148 foreach ($newsgroups as $groupid) $db->insert('INSERT INTO `groupmessages` (`group`, `message`) VALUES (?, ?)', array($groupid, $id)); |
12
7917bd536187
Added hook for new articles, detect send/write failures, fixed handling of multiline headers, add Date header if it doesn't exist, add option to disable peers, fixes for synchronization with INN, added streaming mode support, small fixes
Ivo Smits <Ivo@UCIS.nl>
parents:
11
diff
changeset
|
149 pnewss_call_hooks($pnewss_hooks['article_stored'], array(array('messageid' => $messageid, 'headers' => $headers, 'body' => $lines, 'dbid' => $id))); |
11
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
150 return $messageid; |
e0807e0b1a67
Added common.php, updated server synchronization to continue after a connection failure
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
151 } |