2020-11-29 01:55:31 +01:00
< ? php
2023-08-20 00:33:05 +02:00
/*
* spoolnews NNTP news spool creator
* Download : https :// news . novabbs . com / getrslight
2020-11-29 01:55:31 +01:00
*
2023-08-20 00:33:05 +02:00
* E - Mail : retroguy @ novabbs . com
* Web : https :// news . novabbs . com
2020-11-29 01:55:31 +01:00
*
2023-08-20 00:33:05 +02:00
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
2020-11-29 01:55:31 +01:00
*
2023-08-20 00:33:05 +02:00
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
2020-11-29 01:55:31 +01:00
*
2023-08-20 00:33:05 +02:00
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
2020-11-29 01:55:31 +01:00
*/
include " config.inc.php " ;
include ( " $file_newsportal " );
2023-08-20 00:33:05 +02:00
include $config_dir . '/gpg.conf' ;
2020-11-29 01:55:31 +01:00
2023-07-23 21:36:52 +02:00
if ( $CONFIG [ 'remote_server' ] != '' ) {
2023-08-20 00:33:05 +02:00
$remote_groupfile = $spooldir . " / " . $config_name . " / " . $CONFIG [ 'remote_server' ] . " : " . $CONFIG [ 'remote_port' ] . " .txt " ;
2023-07-23 21:36:52 +02:00
}
2023-11-02 11:47:45 +01:00
2023-11-13 13:14:28 +01:00
if ( isset ( $OVERRIDES [ 'save_nocem_messages' ]) && $OVERRIDES [ 'save_nocem_messages' ] == true ) {
2023-11-02 11:47:45 +01:00
$save_nocem_messages = true ;
2023-11-13 13:14:28 +01:00
$nocem_dir = $spooldir . " /saved_nocem " ;
@ mkdir ( $nocem_dir . '/done' , 0755 , true );
2023-11-02 11:47:45 +01:00
} else {
$save_nocem_messages = false ;
}
2023-08-20 00:33:05 +02:00
$file_groups = $config_path . " groups.txt " ;
$local_groupfile = $spooldir . " / " . $config_name . " /local_groups.txt " ;
$logfile = $logdir . '/spoolnews.log' ;
2023-12-31 17:51:53 +01:00
$spamlog = $logdir . '/spam.log' ;
2020-11-29 01:55:31 +01:00
# END MAIN CONFIGURATION
2023-08-20 00:33:05 +02:00
@ mkdir ( $spooldir . " / " . $config_name , 0755 , 'recursive' );
2020-11-29 01:55:31 +01:00
2023-08-27 16:05:53 +02:00
// Defaults
$maxarticles_per_run = 100 ;
$maxfirstrequest = 100 ;
// Overrides
if ( $OVERRIDES [ 'maxarticles_per_run' ] > 0 ) {
$maxarticles_per_run = $OVERRIDES [ 'maxarticles_per_run' ];
2020-11-29 01:55:31 +01:00
}
2023-08-27 16:05:53 +02:00
if ( $OVERRIDES [ 'maxfirstrequest' ] > 0 ) {
$maxfirstrequest = $OVERRIDES [ 'maxfirstrequest' ];
2020-11-29 01:55:31 +01:00
}
2023-08-20 00:33:05 +02:00
if ( ! isset ( $CONFIG [ 'enable_nntp' ]) || $CONFIG [ 'enable_nntp' ] != true ) {
$maxfirstrequest = $maxarticles ;
$maxarticles_per_run = $maxfetch ;
2020-11-29 01:55:31 +01:00
}
2023-08-20 00:33:05 +02:00
$workpath = $spooldir . " / " ;
$path = $workpath . " articles/ " ;
2020-11-29 01:55:31 +01:00
2023-12-24 20:03:32 +01:00
if ( $low_spool_disk_space ) {
print " Low Disk Space (less than " . $min_spool_disk_space . " available) \n " ;
file_put_contents ( $logfile , " \n " . format_log_date () . " " . $config_name . " Low Disk Space (less than " . $min_spool_disk_space . " Gb available for spool). Pausing spoolnews " , FILE_APPEND );
2023-12-24 12:12:25 +01:00
exit ();
}
2023-08-20 00:33:05 +02:00
$lockfile = $lockdir . '/' . $config_name . '-spoolnews.lock' ;
2020-11-29 01:55:31 +01:00
$pid = file_get_contents ( $lockfile );
2023-08-20 00:33:05 +02:00
if ( posix_getsid ( $pid ) === false || ! is_file ( $lockfile )) {
print " Starting Spoolnews... \n " ;
file_put_contents ( $lockfile , getmypid ()); // create lockfile
2020-11-29 01:55:31 +01:00
} else {
2023-08-20 00:33:05 +02:00
print " Spoolnews currently running \n " ;
2023-11-13 13:14:28 +01:00
file_put_contents ( $logfile , " \n " . format_log_date () . " " . $config_name . " Spoolnews currently running... " , FILE_APPEND );
2023-08-20 00:33:05 +02:00
exit ();
2020-11-29 01:55:31 +01:00
}
2023-04-28 05:34:51 +02:00
2023-08-20 00:33:05 +02:00
$sem = $spooldir . " / " . $config_name . " .reload " ;
if ( is_file ( $sem )) {
unlink ( $remote_groupfile );
unlink ( $sem );
2024-03-01 21:08:21 +01:00
$maxfirstrequest = 200 ;
2020-11-29 01:55:31 +01:00
}
2024-01-02 13:07:22 +01:00
2020-11-29 01:55:31 +01:00
# Check for groups file, create if necessary
2023-07-23 21:36:52 +02:00
// only do remote server groups if necessary
if ( $CONFIG [ 'remote_server' ] != '' ) {
create_spool_groups ( $file_groups , $remote_groupfile );
}
2020-11-29 01:55:31 +01:00
create_spool_groups ( $file_groups , $local_groupfile );
2023-07-03 06:14:28 +02:00
2023-08-20 00:33:05 +02:00
# Iterate through groups
$enable_rslight = 0 ;
2020-11-29 01:55:31 +01:00
# Refresh group list
2023-08-20 00:33:05 +02:00
$menulist = file ( $config_dir . " menu.conf " , FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
foreach ( $menulist as $menu ) {
if (( $menu [ 0 ] == '#' ) || ( trim ( $menu ) == " " )) {
continue ;
2020-11-29 01:55:31 +01:00
}
$menuitem = explode ( ':' , $menu );
2023-08-20 00:33:05 +02:00
if (( $menuitem [ 0 ] == $config_name ) && ( $menuitem [ 1 ] == '1' )) {
groups_read ( $server , $port , 1 , true ); // 'true' forces a refresh of the group list
$enable_rslight = 1 ;
echo " \n Loaded groups " ;
2020-11-29 01:55:31 +01:00
}
2023-08-20 00:33:05 +02:00
}
2023-05-17 00:40:04 +02:00
# Clean outgoing directory for LOCAL sections
2023-08-20 00:33:05 +02:00
if ( $CONFIG [ 'remote_server' ] == '' ) {
$outgoing_dir = $spooldir . " / " . $config_name . " /outgoing/ " ;
$files = scandir ( $outgoing_dir );
foreach ( $files as $file ) {
$file_name = $outgoing_dir . $file ;
if ( is_file ( $file_name ) && ( filemtime ( $file_name ) < ( time () - 3600 ))) {
2023-05-17 00:40:04 +02:00
unlink ( $file_name );
}
2023-07-03 06:14:28 +02:00
}
2023-08-20 00:33:05 +02:00
}
if ( $CONFIG [ 'remote_server' ] != '' ) {
file_put_contents ( $logfile , " \n " . format_log_date () . " " . $config_name . " remote_server: " . $CONFIG [ 'remote_server' ], FILE_APPEND );
$ns = nntp2_open ( $CONFIG [ 'remote_server' ], $CONFIG [ 'remote_port' ]);
if ( ! $ns ) {
file_put_contents ( $logfile , " \n " . format_log_date () . " " . $config_name . " Failed to connect to " . $CONFIG [ 'remote_server' ] . " : " . $CONFIG [ 'remote_port' ], FILE_APPEND );
exit ();
}
$grouplist = file ( $config_dir . '/' . $config_name . '/groups.txt' , FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
foreach ( $grouplist as $findgroup ) {
if ( $findgroup [ 0 ] == " : " ) {
continue ;
}
$name = preg_split ( " /( | \t )/ " , $findgroup , 2 );
file_put_contents ( $logfile , " \n " . format_log_date () . " " . $config_name . " Retrieving articles for: " . $name [ 0 ] . " ... " , FILE_APPEND );
echo " \n Retrieving articles for: " . $name [ 0 ] . " ... " ;
get_articles ( $ns , $name [ 0 ]);
2024-01-02 13:07:22 +01:00
if ( $enable_rslight == 1 ) {
2024-01-02 15:54:56 +01:00
$timer_file = $spooldir . '/tmp/' . $name [ 0 ] . '-thread-timer' ;
if ( filemtime ( $timer_file ) + 600 < time ()) {
touch ( $timer_file );
2024-01-02 13:07:22 +01:00
if ( ! $ns2 ) {
$ns2 = nntp_open ();
2024-01-02 15:54:56 +01:00
echo " \n OPENING $ns2 : " . $ns2 . " \n " ;
2024-01-02 13:07:22 +01:00
}
if ( ! $ns2 ) {
file_put_contents ( $logfile , " \n " . format_log_date () . " " . $config_name . " Failed to connect to " . $CONFIG [ 'remote_server' ] . " : " . $CONFIG [ 'remote_port' ], FILE_APPEND );
// exit();
} else {
file_put_contents ( $logfile , " \n " . format_log_date () . " " . $config_name . " Updating threads for: " . $name [ 0 ] . " ... " , FILE_APPEND );
2024-01-02 15:54:56 +01:00
try {
thread_load_newsserver ( $ns2 , $name [ 0 ], 0 );
} catch ( Exception $exc ) {
echo " \n Fatal exception caught: " . $exc -> getMessage ();
} catch ( Error $err ) {
echo " \n Fatal error caught: " . $err -> getMessage ();
}
2024-01-02 13:07:22 +01:00
file_put_contents ( $logfile , " \n " . format_log_date () . " " . $config_name . " Threads updated for: " . $name [ 0 ], FILE_APPEND );
}
2024-01-02 15:54:56 +01:00
}
2024-01-02 13:07:22 +01:00
}
}
if ( $ns2 ) {
nntp_close ( $ns2 );
2021-01-09 02:41:29 +01:00
}
2023-08-20 00:33:05 +02:00
nntp_close ( $ns );
2020-11-29 01:55:31 +01:00
}
unlink ( $lockfile );
2023-05-13 19:10:09 +02:00
echo " \n Spoolnews Done \n " ;
2020-11-29 01:55:31 +01:00
2023-08-20 00:33:05 +02:00
function get_articles ( $ns , $group )
{
2023-12-31 17:51:53 +01:00
global $enable_rslight , $rslight_gpg , $spooldir , $nocem_dir , $save_nocem_messages , $CONFIG , $OVERRIDES , $user_ban_file , $maxarticles_per_run , $maxfirstrequest , $workpath , $path , $remote_groupfile , $local_groupfile , $local , $logdir , $config_name , $spamlog , $logfile ;
2020-11-29 01:55:31 +01:00
2023-08-20 00:33:05 +02:00
if ( $ns == false ) {
file_put_contents ( $logfile , " \n " . format_log_date () . " " . $config_name . " Lost connection to " . $CONFIG [ 'remote_server' ] . " : " . $CONFIG [ 'remote_port' ], FILE_APPEND );
exit ();
}
2023-07-18 18:15:24 +02:00
2023-08-20 00:33:05 +02:00
$grouppath = $path . preg_replace ( '/\./' , '/' , $group );
2024-01-02 13:07:22 +01:00
// $banned_names = file($user_ban_file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
2023-09-16 18:36:02 +02:00
$msgid_filter = get_config_value ( 'header_filters.conf' , 'Message-ID' );
$subject_filter = get_config_value ( 'header_filters.conf' , 'Subject' );
$from_filter = get_config_value ( 'header_filters.conf' , 'From' );
$path_filter = get_config_value ( 'header_filters.conf' , 'Path' );
2021-02-06 12:22:45 +01:00
2023-08-20 00:33:05 +02:00
$nocem_check = " @@NCM " ;
$bbsmail_check = " @@RSL " ;
2021-01-05 08:04:05 +01:00
2023-08-20 00:33:05 +02:00
# Check if group exists. Open it if it does
fputs ( $ns , " group " . $group . " \r \n " );
$response = line_read ( $ns );
if ( strcmp ( substr ( $response , 0 , 3 ), " 211 " ) != 0 ) {
echo " \n " . $response ;
return ( 1 );
}
# Get config
$grouplist = file ( $remote_groupfile , FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
foreach ( $grouplist as $findgroup ) {
$name = explode ( ':' , $findgroup );
if ( strcmp ( $name [ 0 ], $group ) == 0 ) {
if ( is_numeric ( trim ( $name [ 1 ]))) {
$article = $name [ 1 ] + 1 ;
} else {
$article = 1 ;
}
break ;
}
}
2023-12-27 11:18:48 +01:00
2023-08-20 00:33:05 +02:00
if ( isset ( $CONFIG [ 'enable_nntp' ]) && $CONFIG [ 'enable_nntp' ] == true ) {
2023-10-24 04:01:30 +02:00
// Get next available article number for group
$local = get_next_article_number ( $group );
2023-08-20 00:33:05 +02:00
}
# Split group response line to get last article number
$detail = explode ( " " , $response );
if ( ! isset ( $article )) {
$article = $detail [ 2 ];
}
if ( $article < $detail [ 3 ] - $maxfirstrequest ) {
$article = $detail [ 3 ] - $maxfirstrequest ;
}
if ( $article < $detail [ 2 ]) {
$article = $detail [ 2 ];
}
// Get overview from server
$server_overview = array ();
$re = false ;
if (( $detail [ 3 ] - $article ) > $maxarticles_per_run ) {
$getlast = $article + $maxarticles_per_run ;
} else {
$getlast = $detail [ 3 ];
}
2023-12-27 11:18:48 +01:00
2023-08-20 00:33:05 +02:00
fputs ( $ns , " xover " . $article . " - " . $getlast . " \r \n " );
$response = line_read ( $ns ); // and once more
if (( substr ( $response , 0 , 3 ) != " 224 " )) {
file_put_contents ( $logfile , " \n " . format_log_date () . " " . $config_name . " Cannot get overview from " . $CONFIG [ 'remote_server' ] . " for " . $group , FILE_APPEND );
return false ;
}
while ( trim ( $response = line_read ( $ns )) !== '.' ) {
$ov = preg_split ( " / \t / " , $response );
2023-08-25 13:21:06 +02:00
$overview_msgid [ $ov [ 0 ]] = $ov [ 4 ];
2023-08-20 00:33:05 +02:00
}
# Pull articles and save them in our spool
2024-01-02 15:54:56 +01:00
if ( ! is_dir ( $grouppath )) {
mkdir ( $grouppath , 0755 , 'recursive' );
}
2023-08-20 00:33:05 +02:00
$i = 0 ;
2023-10-24 04:01:30 +02:00
// GET INDIVIDUAL ARTICLE
2023-08-20 00:33:05 +02:00
while ( $article <= $detail [ 3 ]) {
if ( ! is_numeric ( $article )) {
file_put_contents ( $logfile , " \n " . format_log_date () . " " . $config_name . " DEBUG This should show server group:article number: " . $CONFIG [ 'remote_server' ] . " " . $group . " : " . $article , FILE_APPEND );
break ;
}
2023-10-24 04:01:30 +02:00
// Create array for article, then send to insert_article_from_array()
if ( isset ( $current_article )) {
unset ( $current_article );
$current_article = array ();
}
2023-08-20 00:33:05 +02:00
if ( $CONFIG [ 'enable_nntp' ] != true ) {
$local = $article ;
2020-11-29 01:55:31 +01:00
}
2023-12-26 17:05:40 +01:00
if ( check_duplicate_msgid ( $overview_msgid [ $article ], $group )) {
echo " \n (spoolnews)Duplicate Message-ID for: " . $group . " : " . $overview_msgid [ $article ];
file_put_contents ( $logfile , " \n " . format_log_date () . " " . $config_name . " Duplicate Message-ID for: " . $group . " : " . $overview_msgid [ $article ], FILE_APPEND );
2023-08-20 00:33:05 +02:00
$article ++ ;
continue ;
2020-11-29 01:55:31 +01:00
}
2023-08-20 00:33:05 +02:00
fputs ( $ns , " article " . $article . " \r \n " );
$response = line_read ( $ns );
if ( strcmp ( substr ( $response , 0 , 3 ), " 220 " ) != 0 ) {
echo " \n " . $response ;
2023-10-24 04:01:30 +02:00
file_put_contents ( $logfile , " \n " . format_log_date () . " " . $config_name . " " . $group . " " . $response , FILE_APPEND );
2023-08-20 00:33:05 +02:00
$article ++ ;
continue ;
2020-11-29 01:55:31 +01:00
}
2023-08-20 00:33:05 +02:00
$articleHandle = $grouppath . " / " . $local ;
2023-11-13 13:14:28 +01:00
unlink ( $articleHandle );
unset ( $references );
2023-08-20 00:33:05 +02:00
$response = line_read ( $ns );
$lines = 0 ;
$bytes = 0 ;
$ref = 0 ;
2023-12-28 21:31:43 +01:00
$sub = 0 ;
2023-09-16 18:36:02 +02:00
$banned = false ;
2024-03-01 21:08:21 +01:00
$integrity = false ;
2023-08-20 00:33:05 +02:00
$is_header = 1 ;
$body = " " ;
2024-04-14 14:17:33 +02:00
$content_transfer_encoding = null ;
2023-08-20 00:33:05 +02:00
while ( strcmp ( $response , " . " ) != 0 ) {
2023-10-24 04:01:30 +02:00
$is_xref = false ;
2023-08-20 00:33:05 +02:00
$bytes = $bytes + mb_strlen ( $response , '8bit' );
2023-11-13 13:14:28 +01:00
if ( trim ( $response ) == " " && $lines > 0 ) {
if ( $is_header == 1 ) {
2023-10-24 04:01:30 +02:00
file_put_contents ( $articleHandle , $current_article [ 'xref' ] . " \n " , FILE_APPEND );
}
2023-08-20 00:33:05 +02:00
$is_header = 0 ;
}
if ( $is_header == 1 ) {
$response = str_replace ( " \t " , " " , $response );
2023-12-26 17:05:40 +01:00
if ( strpos ( $response , ': ' ) !== false ) {
$ref = 0 ;
2023-12-28 21:31:43 +01:00
$sub = 0 ;
2023-12-26 17:05:40 +01:00
}
2023-08-20 00:33:05 +02:00
// Find article date
if ( stripos ( $response , " Date: " ) === 0 ) {
$finddate = explode ( ': ' , $response , 2 );
$article_date = strtotime ( $finddate [ 1 ]);
}
// Get overview data
if ( stripos ( $response , " Message-ID: " ) === 0 ) {
$mid = explode ( ': ' , $response , 2 );
2023-09-16 18:36:02 +02:00
if ( preg_match ( $msgid_filter , $mid [ 1 ])) {
$banned = " msgid_filter " ;
}
2023-08-20 00:33:05 +02:00
}
if ( stripos ( $response , " From: " ) === 0 ) {
$from = explode ( ': ' , $response , 2 );
2023-09-16 18:36:02 +02:00
if ( preg_match ( $from_filter , $from [ 1 ])) {
$banned = " from_filter " ;
}
}
if ( stripos ( $response , " Path: " ) === 0 ) {
$msgpath = explode ( ': ' , $response , 2 );
if ( preg_match ( $path_filter , $msgpath [ 1 ])) {
$banned = " path_filter " ;
2023-08-20 00:33:05 +02:00
}
}
if ( stripos ( $response , " Subject: " ) === 0 ) {
2023-12-28 21:31:43 +01:00
$this_subject = explode ( 'Subject: ' , $response , 2 );
$subject = $this_subject [ 1 ];
$sub = 1 ;
if ( preg_match ( $subject_filter , $subject )) {
2023-09-16 18:36:02 +02:00
$banned = " subject_filter " ;
}
2023-08-20 00:33:05 +02:00
}
2024-04-14 14:17:33 +02:00
// Transfer encoding
if ( stripos ( $response , " Content-Transfer-Encoding: " ) === 0 ) {
$enco = explode ( ': ' , $response , 2 );
$content_transfer_encoding = $enco [ 1 ];
}
2023-08-20 00:33:05 +02:00
if ( stripos ( $response , " Newsgroups: " ) === 0 ) {
$response = str_ireplace ( $group , $group , $response );
2023-10-24 04:01:30 +02:00
// Identify each group name for xref
$groupnames = explode ( " Newsgroups: " , $response );
$allgroups = preg_split ( " / \ | \ ,/ " , $groupnames [ 1 ]);
2023-11-13 13:14:28 +01:00
// Create Xref: header
$current_article [ 'xref' ] = " Xref: " . $CONFIG [ 'pathhost' ];
foreach ( $allgroups as $agroup ) {
$agroup = trim ( $agroup );
if (( ! testGroup ( $agroup )) || $agroup == '' ) {
continue ;
}
if ( $group == $agroup ) {
$artnum = $local ;
} else {
$artnum = get_next_article_number ( $agroup );
}
if ( $artnum > 0 ) {
$current_article [ 'xref' ] .= ' ' . $agroup . ':' . $artnum ;
}
}
2023-08-20 00:33:05 +02:00
}
if ( stripos ( $response , " Xref: " ) === 0 ) {
if ( isset ( $CONFIG [ 'enable_nntp' ]) && $CONFIG [ 'enable_nntp' ] == true ) {
2023-10-24 04:01:30 +02:00
$is_xref = true ;
2023-08-20 00:33:05 +02:00
}
$xref = $response ;
}
if ( stripos ( $response , " Content-Type: " ) === 0 ) {
preg_match ( '/.*charset=.*/' , $response , $te );
$content_type = explode ( " Content-Type: text/plain; charset= " , $te [ 0 ]);
}
if ( stripos ( $response , " References: " ) === 0 ) {
$this_references = explode ( 'References: ' , $response );
$references = $this_references [ 1 ];
$ref = 1 ;
}
2023-12-26 17:05:40 +01:00
if ( preg_match ( '/^\s/' , $response ) && $ref == 1 ) {
$references = $references . $response ;
2023-08-20 00:33:05 +02:00
}
2023-12-28 21:31:43 +01:00
if ( preg_match ( '/^\s/' , $response ) && $sub == 1 ) {
$subject = $subject . $response ;
}
2023-08-20 00:33:05 +02:00
} else {
$body .= $response . " \n " ;
}
2023-10-24 04:01:30 +02:00
if ( ! $is_xref ) {
file_put_contents ( $articleHandle , $response . " \n " , FILE_APPEND );
}
2023-08-20 00:33:05 +02:00
// Check here for broken $ns connection before continuing
$response = fgets ( $ns , 1200 );
if ( $response == false ) {
2023-10-24 04:01:30 +02:00
file_put_contents ( $logfile , " \n " . format_log_date () . " " . $config_name . " Lost connection to " . $CONFIG [ 'remote_server' ] . " : " . $CONFIG [ 'remote_port' ] . " retrieving article " . $article , FILE_APPEND );
2023-12-26 17:05:40 +01:00
unlink ( $articleHandle );
2023-08-20 00:33:05 +02:00
break ;
// continue;
}
$response = str_replace ( " \n " , " " , str_replace ( " \r " , " " , $response ));
2023-11-13 13:14:28 +01:00
$lines ++ ;
2023-08-20 00:33:05 +02:00
}
file_put_contents ( $articleHandle , $response . " \n " , FILE_APPEND );
$lines = $lines - 1 ;
$bytes = $bytes + ( $lines * 2 );
2024-03-01 21:08:21 +01:00
// Don't spool article if $banned or fails integrity test
$integrity = check_article_integrity ( file ( $articleHandle ));
if (( $banned !== false ) || ( $integrity !== false )) {
2023-12-26 17:05:40 +01:00
unlink ( $articleHandle );
2024-03-01 21:08:21 +01:00
if ( $integrity ) {
file_put_contents ( $logfile , " \n " . format_log_date () . $integrity , FILE_APPEND );
} elseif ( $banned ) {
file_put_contents ( $spamlog , " \n " . format_log_date () . " " . $banned . " : \t SPAM \t " . $mid [ 1 ] . " \t " . $groupnames [ 1 ] . " \t " . $from [ 1 ], FILE_APPEND );
}
2023-08-20 00:33:05 +02:00
$article ++ ;
2021-01-20 23:54:47 +01:00
} else {
2023-08-20 00:33:05 +02:00
if (( strpos ( $CONFIG [ 'nocem_groups' ], $group ) !== false ) && ( $CONFIG [ 'enable_nocem' ] == true )) {
2023-12-28 21:31:43 +01:00
if ( strpos ( $subject , $nocem_check ) !== false ) {
2023-10-29 11:09:49 +01:00
$is_from = address_decode ( $from [ 1 ], 'nowhere' );
2023-11-13 13:14:28 +01:00
$nocem_file = tempnam ( $spooldir . " /nocem " , $is_from [ 0 ][ 'mailbox' ] . " @ " . $is_from [ 0 ][ 'host' ] . " [ " . date ( " Y.m.d.H.i.s " ) . " ] " );
2023-12-26 17:05:40 +01:00
copy ( $articleHandle , $nocem_file );
2023-10-30 15:05:25 +01:00
chmod ( $nocem_file , 0644 );
2023-11-13 13:14:28 +01:00
if ( $save_nocem_messages == true ) {
$saved_nocem_file = tempnam ( $nocem_dir , $is_from [ 0 ][ 'mailbox' ] . " @ " . $is_from [ 0 ][ 'host' ] . " [ " . date ( " Y.m.d.H.i.s " ) . " ]- " );
2023-12-28 01:42:11 +01:00
copy ( $articleHandle , $saved_nocem_file );
2023-11-02 11:47:45 +01:00
}
2023-08-20 00:33:05 +02:00
}
}
if (( strpos ( $rslight_gpg [ 'nntp_group' ], $group ) !== false ) && ( $rslight_gpg [ 'enable' ] == '1' )) {
2023-12-28 21:31:43 +01:00
if ( strpos ( $subject , $bbsmail_check ) !== false ) {
$bbsmail_file = preg_replace ( '/@@RSL /' , '' , $subject );
2023-08-20 00:33:05 +02:00
$bbsmail_filename = $spooldir . " /bbsmail/in/bbsmail- " . $bbsmail_file ;
2023-12-26 17:05:40 +01:00
copy ( $articleHandle , $bbsmail_filename );
2023-08-20 00:33:05 +02:00
}
}
2023-12-26 17:05:40 +01:00
$this_article = file_get_contents ( $articleHandle );
2023-08-20 00:33:05 +02:00
if ( $CONFIG [ 'article_database' ] == '1' ) {
2023-12-26 17:05:40 +01:00
unlink ( $articleHandle );
2023-08-20 00:33:05 +02:00
// CREATE SEARCH SNIPPET
2024-04-14 14:17:33 +02:00
$this_snippet = get_search_snippet ( $body , $content_type [ 1 ], $content_transfer_encoding );
2023-08-20 00:33:05 +02:00
} else {
2023-10-24 04:01:30 +02:00
if ( $article_date > time ()) {
2023-08-20 00:33:05 +02:00
$article_date = time ();
2023-10-24 04:01:30 +02:00
}
2023-12-26 17:05:40 +01:00
touch ( $articleHandle , $article_date );
2023-08-20 00:33:05 +02:00
}
2023-10-24 04:01:30 +02:00
$current_article [ 'mid' ] = $mid [ 1 ];
$current_article [ 'epochdate' ] = $article_date ;
$current_article [ 'stringdate' ] = $finddate [ 1 ];
$current_article [ 'from' ] = $from [ 1 ];
2023-12-28 21:31:43 +01:00
$current_article [ 'subject' ] = $subject ;
2023-10-24 04:01:30 +02:00
$current_article [ 'references' ] = $references ;
$current_article [ 'bytes' ] = $bytes ;
$current_article [ 'lines' ] = $lines ;
$current_article [ 'article' ] = $this_article ;
$current_article [ 'snippet' ] = $this_snippet ;
2023-12-23 14:44:03 +01:00
// Check Spam
2023-12-24 20:03:32 +01:00
$res = 0 ;
if ( isset ( $CONFIG [ 'spamassassin' ]) && ( $CONFIG [ 'spamassassin' ] == true ) && ( $OVERRIDES [ 'disable_spamassassin_spooling' ] !== true )) {
2023-12-28 21:31:43 +01:00
$spam_result_array = check_spam ( $subject , $from [ 1 ], $groupnames [ 1 ], $references , $this_article , $mid [ 1 ]);
2023-12-23 14:44:03 +01:00
$res = $spam_result_array [ 'res' ];
$spamresult = $spam_result_array [ 'spamresult' ];
$spamcheckerversion = $spam_result_array [ 'spamcheckerversion' ];
$spamlevel = $spam_result_array [ 'spamlevel' ];
}
if ( $res === 1 ) {
2023-12-26 17:05:40 +01:00
unlink ( $articleHandle );
2023-12-23 14:44:03 +01:00
file_put_contents ( $logfile , " \n " . format_log_date () . " " . $config_name . " Skipping: " . $CONFIG [ 'remote_server' ] . " " . $group . " : " . $article . " Exceeds Spam Score " , FILE_APPEND );
// $orig_newsgroups = $newsgroups;
// $newsgroups = $CONFIG['spamgroup'];
// $group = $newsgroups;
$i -- ;
$local -- ;
} else {
2023-12-26 17:05:40 +01:00
$pass = false ;
2023-12-23 14:44:03 +01:00
foreach ( $allgroups as $agroup ) {
$agroup = trim ( $agroup );
if (( ! testGroup ( $agroup )) || $agroup == '' ) {
continue ;
}
$current_article [ 'group' ] = $agroup ;
if ( $group == $agroup ) {
$current_article [ 'local' ] = $local ;
} else {
$current_article [ 'local' ] = get_next_article_number ( $agroup );
}
2023-12-27 13:07:31 +01:00
$tmp = insert_article_from_array ( $current_article , false );
2023-12-26 17:05:40 +01:00
if ( $tmp [ 0 ] != " 4 " ) {
$pass = true ;
}
}
if ( ! $pass ) {
$i -- ;
2023-10-24 04:01:30 +02:00
}
}
2023-08-20 00:33:05 +02:00
$i ++ ;
$article ++ ;
$local ++ ;
if ( $i > $maxarticles_per_run ) {
break ;
}
2021-01-20 23:54:47 +01:00
}
2020-11-29 01:55:31 +01:00
}
2023-10-24 04:01:30 +02:00
// END GET INDIVIDUAL ARTICLE
2023-08-20 00:33:05 +02:00
$article -- ;
// $local--;
// Update title
if ( ! is_file ( $workpath . $group . " -title " )) {
fputs ( $ns , " XGTITLE " . $group . " \r \n " );
2020-11-29 01:55:31 +01:00
$response = line_read ( $ns );
2023-08-20 00:33:05 +02:00
if ( strcmp ( substr ( $response , 0 , 3 ), " 282 " ) == 0 ) {
$titlefile = $workpath . $group . " -title " ;
$response = line_read ( $ns );
while ( strcmp ( $response , " . " ) != 0 ) {
file_put_contents ( $titlefile , $response );
$response = line_read ( $ns );
}
2020-11-29 01:55:31 +01:00
}
}
2023-08-20 00:33:05 +02:00
# Save config
$grouplist = file ( $remote_groupfile , FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
$saveconfig = fopen ( $remote_groupfile , 'w+' );
foreach ( $grouplist as $savegroup ) {
$name = explode ( ':' , $savegroup );
if ( strcmp ( $name [ 0 ], $group ) == 0 ) {
fputs ( $saveconfig , $group . " : " . $article . " \n " );
} else {
fputs ( $saveconfig , $savegroup . " \n " );
}
2020-11-29 01:55:31 +01:00
}
2023-08-20 00:33:05 +02:00
fclose ( $saveconfig );
$grouplist = file ( $local_groupfile , FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
$saveconfig = fopen ( $local_groupfile , 'w+' );
foreach ( $grouplist as $savegroup ) {
$name = explode ( ':' , $savegroup );
if ( strcmp ( $name [ 0 ], $group ) == 0 ) {
fputs ( $saveconfig , $group . " : " . $local . " \n " );
} else {
fputs ( $saveconfig , $savegroup . " \n " );
}
2020-11-29 01:55:31 +01:00
}
2023-08-20 00:33:05 +02:00
fclose ( $saveconfig );
if ( $CONFIG [ 'article_database' ] == '1' ) {
$article_dbh = null ;
2020-11-29 01:55:31 +01:00
}
2023-08-20 00:33:05 +02:00
$dbh = null ;
}
function create_spool_groups ( $in_groups , $out_groups )
{
2023-08-25 13:21:06 +02:00
global $spooldir ;
2023-08-20 00:33:05 +02:00
$grouplist = file ( $in_groups , FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
2023-08-25 13:21:06 +02:00
$temp_file = tempnam ( $spooldir . " /tmp/ " , 'groupfile-' );
2023-08-20 00:33:05 +02:00
foreach ( $grouplist as $group ) {
if ( $group [ 0 ] == " : " ) {
continue ;
}
$thisgroup = preg_split ( " /( | \t )/ " , $group , 2 );
2023-12-27 13:07:31 +01:00
if ( $val = get_config_file_value ( $out_groups , $thisgroup [ 0 ])) {
file_put_contents ( $temp_file , $thisgroup [ 0 ] . " : " . $val . " \n " , FILE_APPEND );
2023-12-27 11:18:48 +01:00
} else {
2023-12-27 13:07:31 +01:00
file_put_contents ( $temp_file , $thisgroup [ 0 ] . " \n " , FILE_APPEND );
2023-08-20 00:33:05 +02:00
}
2020-11-29 01:55:31 +01:00
}
2023-08-25 13:21:06 +02:00
rename ( $temp_file , $out_groups );
2023-08-20 00:33:05 +02:00
return ;
2020-11-29 01:55:31 +01:00
}
2023-08-20 00:33:05 +02:00
function get_article_list ( $thisgroup )
{
2023-07-26 21:00:14 +02:00
global $spooldir ;
2023-08-20 00:33:05 +02:00
$database = $spooldir . " /articles-overview.db3 " ;
2023-07-26 21:00:14 +02:00
$table = 'overview' ;
2023-08-13 19:00:48 +02:00
$dbh = overview_db_open ( $database , $table );
2023-07-26 21:00:14 +02:00
$stmt = $dbh -> prepare ( " SELECT * FROM $table WHERE newsgroup=:thisgroup ORDER BY number " );
2023-08-20 00:33:05 +02:00
$stmt -> execute ([
'thisgroup' => $thisgroup
]);
$ok_article = array ();
while ( $found = $stmt -> fetch ()) {
2023-07-26 21:00:14 +02:00
$ok_article [] = $found [ 'number' ];
}
$dbh = null ;
2023-08-20 00:33:05 +02:00
return ( array_unique ( $ok_article ));
2021-01-20 23:54:47 +01:00
}
2020-11-29 01:55:31 +01:00
?>