Avoid sending article to remote server multiple times if crossposts use same server.

This commit is contained in:
Retro_Guy 2024-09-06 16:46:37 -07:00
parent 3262f16238
commit 2f87113359
2 changed files with 84 additions and 31 deletions

View File

@ -1,6 +1,6 @@
<?php
include "config.inc.php";
include ("$file_newsportal");
include("$file_newsportal");
// Check timer
$tmr = $spooldir . '/' . $config_name . '-expire-timer';
@ -112,7 +112,7 @@ foreach ($grouplist as $groupline) {
}
}
add_to_history($group, $row['number'], $row['msgid'], $status, $statusdate, $statusreason, $statusnotes);
$i ++;
$i++;
}
$stmt->execute([
':newsgroup' => $group,
@ -179,6 +179,9 @@ if (file_exists($rdns_file)) {
}
}
// Remove posted cache db
unlink($spooldir . '/posted_articles.dat');
unlink($lockfile);
touch($tmr);
@ -217,7 +220,7 @@ function convert_max_articles_to_days($group)
$i = 0;
$found = false;
while ($row = $overview_query->fetch()) {
$i ++;
$i++;
if ($i == $count) {
$found = $row;
}

View File

@ -62,7 +62,8 @@ function interact($msgsock, $use_crypto = false)
}
}
if (isset($command[1])) {}
if (isset($command[1])) {
}
if ($command[0] == 'date') {
$msg = '111 ' . date('YmdHis') . "\r\n";
fwrite($msgsock, $msg, strlen($msg));
@ -248,7 +249,7 @@ function become_daemon()
{
$pid = pcntl_fork();
if ($pid == - 1) {
if ($pid == -1) {
/* fork failed */
echo "fork failure!\n";
exit();
@ -281,26 +282,26 @@ function prepare_post($filename)
foreach ($message as $line) {
if (trim($line) == "" && $lines > 0) {
$is_header = 0;
$lines ++;
$lines++;
}
if ($lines > 0 && $is_header == 0) {
break;
}
if (stripos($line, "From: ") === 0) {
$lines ++;
$lines++;
$head_from = true;
continue;
}
if (stripos($line, "Newsgroups: ") === 0) {
$ngroups = explode(': ', $line);
$lines ++;
$lines++;
$head_newsgroups = true;
continue;
}
if (stripos($line, "Subject: ") === 0) {
$sub = explode(': ', $line);
$subject = $sub[1];
$lines ++;
$lines++;
$head_subject = true;
continue;
}
@ -343,7 +344,15 @@ function prepare_post($filename)
function process_post($message, $group)
{
global $logfile, $spooldir, $config_dir, $CONFIG, $nntp_group;
global $logfile, $spooldir, $config_dir, $logfile, $CONFIG, $nntp_group;
$posted_db = $spooldir . '/posted_articles.dat';
if (file_exists($posted_db)) {
$posted_articles = unserialize(file_get_contents($posted_db));
} else {
$posted_articles = array();
}
$no_mid = 1;
$no_date = 1;
$no_org = 1;
@ -360,9 +369,9 @@ function process_post($message, $group)
$bytes = $bytes + mb_strlen($line, '8bit');
if (trim($line) == "" && $lines > 0) {
$is_header = 0;
$lines ++;
$lines++;
} else {
$lines ++;
$lines++;
}
if ($is_header == 0) {
$body .= $line . "\n";
@ -438,6 +447,30 @@ function process_post($message, $group)
} else {
$msgid = $mid[1];
}
/* Find section for posting */
$section = get_section_by_group($group);
// Get server details for this section
if (file_exists($config_dir . $section . '.inc.php')) {
$config_file = $config_dir . $section . '.inc.php';
} else {
$config_file = $config_dir . 'rslight.inc.php';
}
$THIS_CONFIG = include($config_file);
$this_server = $THIS_CONFIG['remote_server'] . $THIS_CONFIG['remote_port'];
echo "DATA: " . $this_server . "\n";
echo "MSGID: " . $msgid . "\n";
if (isset($posted_articles[$msgid][$this_server])) {
$previously_posted = true;
} else {
$previously_posted = false;
$posted_articles[$msgid][$this_server] = true;
}
/*
* SPAM CHECK
*/
@ -455,11 +488,14 @@ function process_post($message, $group)
$response = "441 Posting failed (Exceeds Spam Score)\r\n";
return $response;
}
/* Find section for posting */
$section = get_section_by_group($group);
@mkdir($spooldir . "/" . $section . "/outgoing", 0755, 'recursive');
$postfilename = $spooldir . '/' . $section . '/outgoing/' . $msgid . '.msg';
if(file_exists($postfilename)) {
$postfilename_previous = true;
} else {
$postfilename_previous = false;
}
$postfilehandle = fopen($postfilename, 'w');
if ($no_date == 1) {
$article_date = time();
@ -485,9 +521,9 @@ function process_post($message, $group)
foreach ($message as $line) {
if (trim($line) == "" && $lines > 0) {
$is_header = 0;
$lines ++;
$lines++;
} else {
$lines ++;
$lines++;
}
if (stripos($line, "Newsgroups: ") === 0 && $is_header == 1) {
fputs($postfilehandle, "Newsgroups: " . $newsgroups . "\r\n");
@ -508,10 +544,25 @@ function process_post($message, $group)
fclose($postfilehandle);
chmod($postfilename, 0600);
unlink($filename);
if ($section == "") {
$response = "441 Posting failed (section not found)\r\n";
file_put_contents($logfile, "\n" . format_log_date() . " " . trim($response) . " for " . $group, FILE_APPEND);
} else {
$response = insert_article($section, $group, $postfilename, $subject, $from[1], $article_date, $date_rep, $msgid, $references, $bytes, $lines, $xref, $body);
// Only add to another section if a different remote server is used
// else only add to local database for next group
if ($previously_posted) {
file_put_contents($logfile, "\n" . format_log_date() . " NOT adding article to: " . $section . "/outgoing - Already Posted", FILE_APPEND);
if(!$postfilename_previous) {
unlink($postfilename);
} else {
file_put_contents($logfile, "\n" . format_log_date() . " NOT DELETING: " . $section . "/outgoing - Already Exists", FILE_APPEND);
}
} else {
file_put_contents($posted_db, serialize($posted_articles));
file_put_contents($logfile, "\n" . format_log_date() . " Adding article to: " . $section . "/outgoing", FILE_APPEND);
}
}
return $response;
}
@ -525,11 +576,11 @@ function get_next($nntp_group)
}
$ok_article = get_article_list($nntp_group);
sort($ok_article);
$last = $ok_article[key(array_slice($ok_article, - 1, 1, true))];
$last = $ok_article[key(array_slice($ok_article, -1, 1, true))];
if (($nntp_article + 1) > $last) {
$response = "421 No next article to retrieve\r\n";
} else {
$nntp_article ++;
$nntp_article++;
$database = $spooldir . '/articles-overview.db3';
$table = 'overview';
$dbh = overview_db_open($database, $table);
@ -556,11 +607,11 @@ function get_last($nntp_group)
}
$ok_article = get_article_list($nntp_group);
rsort($ok_article);
$first = $ok_article[key(array_slice($ok_article, - 1, 1, true))];
$first = $ok_article[key(array_slice($ok_article, -1, 1, true))];
if (($nntp_article - 1) < $first || ! isset($nntp_article)) {
$response = "422 No previous article to retrieve\r\n";
} else {
$nntp_article --;
$nntp_article--;
$database = $spooldir . '/articles-overview.db3';
$table = 'overview';
$dbh = overview_db_open($database, $table);
@ -617,7 +668,7 @@ function get_xhdr($header, $articles)
$ok_article = get_article_list($nntp_group);
// fclose($group_overviewfp);
sort($ok_article);
$last = $ok_article[key(array_slice($ok_article, - 1, 1, true))];
$last = $ok_article[key(array_slice($ok_article, -1, 1, true))];
if (! is_numeric($last))
$last = 0;
} else {
@ -625,7 +676,7 @@ function get_xhdr($header, $articles)
}
}
$msg = "221 Header information for " . $header . " follows (from articles)\r\n";
for ($i = $first; $i <= $last; $i ++) {
for ($i = $first; $i <= $last; $i++) {
$article_full_path = $thisgroup . '/' . strval($i);
$data = extract_header_line($article_full_path, $header, $tmpgroup, $i);
if ($data !== false) {
@ -719,7 +770,7 @@ function get_xover($articles, $msgsock)
if (strpos($articles, "-")) {
$ok_article = get_article_list($nntp_group);
sort($ok_article);
$last = $ok_article[key(array_slice($ok_article, - 1, 1, true))];
$last = $ok_article[key(array_slice($ok_article, -1, 1, true))];
if (! is_numeric($last)) {
$last = 0;
}
@ -737,7 +788,7 @@ function get_xover($articles, $msgsock)
$dbh = overview_db_open($database, $table);
$stmt = $dbh->prepare("SELECT * FROM $table WHERE newsgroup=:thisgroup AND number=:number"); // Why doesn't BETWEEN work properly here?
for ($i = $first; $i <= $last; $i ++) {
for ($i = $first; $i <= $last; $i++) {
$stmt->execute([
'thisgroup' => $nntp_group,
':number' => $i
@ -972,7 +1023,7 @@ function get_listgroup($nntp_group, $msgsock)
// fclose($group_overviewfp);
$count = count($ok_article);
sort($ok_article);
$last = $ok_article[key(array_slice($ok_article, - 1, 1, true))];
$last = $ok_article[key(array_slice($ok_article, -1, 1, true))];
$first = $ok_article[0];
if (! is_numeric($last))
$last = 0;
@ -1009,7 +1060,7 @@ function get_group($change_group)
$ok_article = get_article_list($nntp_group);
$count = count($ok_article);
sort($ok_article);
$last = $ok_article[key(array_slice($ok_article, - 1, 1, true))];
$last = $ok_article[key(array_slice($ok_article, -1, 1, true))];
$first = $ok_article[0];
if (! is_numeric($last))
$last = 0;
@ -1033,7 +1084,7 @@ function get_newgroups($mode)
continue;
$ok_article = get_article_list($nntp_group);
sort($ok_article);
$last = $ok_article[key(array_slice($ok_article, - 1, 1, true))];
$last = $ok_article[key(array_slice($ok_article, -1, 1, true))];
$first = $ok_article[0];
if (! is_numeric($last))
$last = 0;
@ -1092,7 +1143,7 @@ function get_list($mode, $ngroup, $msgsock)
continue;
$ok_article = get_article_list($findgroup);
sort($ok_article);
$last = $ok_article[key(array_slice($ok_article, - 1, 1, true))];
$last = $ok_article[key(array_slice($ok_article, -1, 1, true))];
$first = $ok_article[0];
if (! is_numeric($last)) {
$last = 0;
@ -1279,7 +1330,7 @@ function insert_article($section, $nntp_group, $filename, $subject_i, $from_i, $
// End Overview
$grouplist = file($local_groupfile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$saveconfig = fopen($local_groupfile, 'w+');
$local ++;
$local++;
foreach ($grouplist as $savegroup) {
$name = explode(':', $savegroup);
if (strcmp($name[0], $nntp_group) == 0) {
@ -1291,7 +1342,7 @@ function insert_article($section, $nntp_group, $filename, $subject_i, $from_i, $
fclose($saveconfig);
unlink($sn_lockfile);
$return_val = "240 Article received OK (posted)\r\n";
file_put_contents($logfile, "\n" . format_log_date() . " " . $nntp_group . ":" . -- $local . " " . $return_val, FILE_APPEND);
file_put_contents($logfile, "\n" . format_log_date() . " " . $nntp_group . ":" . --$local . " " . trim($return_val), FILE_APPEND);
return ($return_val);
}
@ -1407,4 +1458,3 @@ function create_node_ssl_cert($pemfile)
chmod($pubkeyfile, 0660);
chmod($pubkeytxtfile, 0660);
}
?>