prepare($sql); 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(); } $grouppath = $path.preg_replace('/\./', '/', $group); $banned_names = file("/etc/rslight/banned_names.conf", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $nocem_check="@@NCM"; # 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),"411") == 0) { echo "\n".$response."\n"; 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 (isset($name[1])) $article = $name[1] + 1; break; } } if(isset($CONFIG['enable_nntp']) && $CONFIG['enable_nntp'] == true) { // Try to find last article number in local_groupfile $local = get_high_watermark($group); if(!is_numeric($local)) { $thisgroup = $path."/".preg_replace('/\./', '/', $group); $articles = scandir($thisgroup); $ok_article=array(); foreach($articles as $this_article) { if(!is_numeric($this_article)) { continue; } $ok_article[]=$this_article; } sort($ok_article); $local = $ok_article[key(array_slice($ok_article, -1, 1, true))]; if(!is_numeric($local)) { $local = 0; } } if($local < 1) $local = 1; } # 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]; } // Broken message on last run? Let's try again. if($article > ($detail[3] + 1)) { $article = $detail[3]; } # Pull articles and save them in our spool @mkdir($grouppath,0755,'recursive'); $i=0; 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;; } if($CONFIG['enable_nntp'] != true){ $local = $article; } // Check for duplicate msgid $duplicate=0; fputs($ns, "stat ".$article."\r\n"); $response = line_read($ns); $this_msgid = explode(' ', $response); $group_overviewfp=fopen($spooldir."/".$group."-overview", 'r'); while($group_overview=fgets($group_overviewfp, 2048)) { $overview_msgid = explode("\t", $group_overview); if(strpos($overview_msgid[4], $this_msgid[2]) !== false) { echo "\nDuplicate Message-ID for: ".$CONFIG['remote_server']." ".$group.":".$article."\n"; file_put_contents($logfile, "\n".format_log_date()." ".$config_name." Duplicate Message-ID for: ".$CONFIG['remote_server']." ".$group.":".$article, FILE_APPEND); $article++; $duplicate = 1; break; } } fclose($group_overviewfp); if($duplicate == 1) { continue; } fputs($ns, "article ".$article."\r\n"); $response = line_read($ns); if (strcmp(substr($response,0,3),"220") != 0) { echo "\n".$response."\n"; file_put_contents($logfile, "\n".format_log_date()." ".$config_name." Unexpected response to ARTICLE command: ".$response, FILE_APPEND); $article++; continue; } if(isset($CONFIG['enable_nntp']) && $CONFIG['enable_nntp'] == true){ while(is_file($grouppath."/".$local)) { $local++; } } $articleHandle = fopen($grouppath."/".$local, 'w+'); $response = line_read($ns); $lines=0; $bytes=0; $ref=0; $banned=0; $is_header=1; while(strcmp($response,".") != 0) { $bytes = $bytes + mb_strlen($response, '8bit'); if(trim($response) == "" || $lines > 0) { $is_header=0; $lines++; } if($is_header == 1) { // Find article date if(stripos($response, "Date: ") === 0) { $finddate=explode(': ', $response); $article_date = strtotime($finddate[1]); } // Get overview data if(stripos($response, "Message-ID: ") === 0) { $mid=explode(': ', $response); $ref=0; } if(stripos($response, "From: ") === 0) { $from=explode(': ', $response); if(isset($CONFIG['enable_nntp']) && $CONFIG['enable_nntp'] == true) { foreach($banned_names as $banned_name) { if(stripos($from[1], $banned_name) !== false) { $banned = 1; } } } $ref=0; } if(stripos($response, "Subject: ") === 0) { $subject=explode('Subject: ', $response, 2); $ref=0; } if(stripos($response, "Newsgroups: ") === 0) { $response=str_ireplace($group,$group,$response); $ref=0; } if(stripos($response, "Xref: ") === 0) { if(isset($CONFIG['enable_nntp']) && $CONFIG['enable_nntp'] == true) { $response="Xref: ".$CONFIG['pathhost']." ".$group.":".$local; } $xref=$response; $ref=0; } if(stripos($response, "References: ") === 0) { $this_references=explode('References: ', $response); $references = $this_references[1]; $ref=1; } if((stripos($response, ':') === false) && (strpos($response, '>'))) { if($ref == 1) { $references=$references.$response; } } } fputs($articleHandle, $response."\n"); // Check here for broken $ns connection before continuing $response=fgets($ns,1200); if($response == false) { file_put_contents($logfile, "\n".format_log_date()." ".$config_name." Lost connection to ".$CONFIG['remote_server'].":".$CONFIG['remote_port']." retrieving article ".$article, FILE_APPEND); @fclose($articleHandle); unlink($grouppath."/".$local); continue; } $response=str_replace("\n","",str_replace("\r","",$response)); } fputs($articleHandle, $response."\n"); @fclose($articleHandle); $lines=$lines-1; $bytes = $bytes + ($lines * 2); // Don't spool article if $banned=1 if($banned == 1) { @fclose($articleHandle); unlink($grouppath."/".$local); file_put_contents($logfile, "\n".format_log_date()." ".$config_name." Skipping: ".$CONFIG['remote_server']." ".$group.":".$article." user: ".$from[1]." is banned", FILE_APPEND); $article++; } else { if((strpos($CONFIG['nocem_groups'], $group) !== false) && ($CONFIG['enable_nocem'] == true)) { if(strpos($subject[1], $nocem_check) !== false) { $nocem_file = tempnam($spooldir."/nocem", "nocem-".$group."-"); copy($grouppath."/".$local, $nocem_file); } } // Overview $overviewHandle = fopen($workpath.$group."-overview", 'a'); fputs($overviewHandle, $local."\t".$subject[1]."\t".$from[1]."\t".$finddate[1]."\t".$mid[1]."\t".$references."\t".$bytes."\t".$lines."\t".$xref."\n"); fclose($overviewHandle); $references=""; // add to search database $stmt->execute([$group, $local, $mid[1], $article_date, $from[1], $subject[1]]); // End Overview if($article_date > time()) $article_date = time(); touch($grouppath."/".$local, $article_date); echo "\nRetrieved: ".$group." ".$article."\n"; file_put_contents($logfile, "\n".format_log_date()." ".$config_name." Wrote to spool: ".$CONFIG['remote_server']." ".$group.":".$article, FILE_APPEND); $i++; if($i > $maxarticles_per_run) break; $article++; $local++; } } $article--; // $local--; // Update title if(!is_file($workpath.$group."-title")) { fputs($ns, "XGTITLE ".$group."\r\n"); $response = line_read($ns); if (strcmp(substr($response,0,3),"282") == 0) { $overviewHandle = fopen($workpath.$group."-title", 'w'); $response = line_read($ns); while(strcmp($response,".") != 0) { fputs($overviewHandle, $response."\r\n"); $response = line_read($ns); } @fclose($overviewHandle); } } # 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"); } } 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"); } } fclose($saveconfig); $dbh = null; } function create_spool_groups($in_groups, $out_groups) { $grouplist = file($in_groups, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $groupout = fopen($out_groups, "a+"); foreach($grouplist as $group) { if($group[0] == ":") { continue; } $thisgroup = preg_split("/( |\t)/", $group, 2); fseek($groupout, 0); $found=0; while (($buffer = fgets($groupout)) !== false) { if (stripos($buffer, $thisgroup[0]) !== false) { $found = 1; break; } } if($found == 0) { fwrite($groupout, $thisgroup[0]."\r\n"); continue; } } fclose($groupout); return; } function nntp2_open($nserver=0,$nport=0) { global $text_error,$CONFIG; // echo "
NNTP OPEN
"; $authorize=((isset($CONFIG['remote_auth_user'])) && (isset($CONFIG['remote_auth_pass'])) && ($CONFIG['remote_auth_user'] != "")); if ($nserver==0) $nserver=$CONFIG['remote_server']; if ($nport==0) $nport=$CONFIG['remote_port']; if($CONFIG['remote_ssl']) { $ns=@fsockopen('ssl://'.$nserver.":".$nport); } else { $ns=@fsockopen('tcp://'.$nserver.":".$nport); } // $ns=@fsockopen($nserver,$nport); $weg=line_read($ns); // kill the first line if (substr($weg,0,2) != "20") { echo "

".$text_error["error:"].$weg."

"; fclose($ns); $ns=false; } else { if ($ns != false) { fputs($ns,"MODE reader\r\n"); $weg=line_read($ns); // and once more if ((substr($weg,0,2) != "20") && ((!$authorize) || ((substr($weg,0,3) != "480") && ($authorize)))) { echo "

".$text_error["error:"].$weg."

"; fclose($ns); $ns=false; } } if ((isset($CONFIG['remote_auth_user'])) && (isset($CONFIG['remote_auth_pass'])) && ($CONFIG['remote_auth_user'] != "")) { fputs($ns,"AUTHINFO USER ".$CONFIG['remote_auth_user']."\r\n"); $weg=line_read($ns); fputs($ns,"AUTHINFO PASS ".$CONFIG['remote_auth_pass']."\r\n"); $weg=line_read($ns); /* Only check auth if reading and posting same server */ if (substr($weg,0,3) != "281" && !(isset($post_server)) && ($post_server!="")) { echo "

".$text_error["error:"]."

"; echo "

".$text_error["auth_error"]."

"; } } } if ($ns==false) echo "

".$text_error["connection_failed"]."

"; return $ns; } function get_high_watermark($group) { global $local_groupfile; if ($configFileHandle = @fopen($local_groupfile, 'r')) { while (!feof($configFileHandle)) { $buffer = fgets($configFileHandle); if(strpos($buffer, $group.':') !== FALSE) { $dataline=$buffer; fclose($configFileHandle); $datafound = explode(':',$dataline); return trim($datafound[1]); } } fclose($configFileHandle); return FALSE; } else { return FALSE; } } ?>