time()) || ($user_time < $oldest)) { unset($user_time); } } } if (isset($_GET['thisgroup'])) { $grouplist = array(); $grouplist[0] = _rawurldecode(_rawurldecode($_GET['thisgroup'])); $cachefile=$spooldir."/".$grouplist[0]."-overboard.dat"; if($userdata) { $userdata[$grouplist[0]] = time(); file_put_contents($userfile, serialize($userdata)); } } else { $grouplist = file($groupconfig, FILE_IGNORE_NEW_LINES); } show_overboard_header($grouplist); $results=0; /* If cache is less than ? seconds old, use it */ if(is_file($cachefile)) { $stats = stat($cachefile); $oldest = $stats[9]; $cached_overboard = unserialize(file_get_contents($cachefile)); if(!isset($user_time)) { if($stats[9] > (time() - $cachetime)) { echo ''; foreach($cached_overboard as $result) { if(($results % 2) != 0){ echo '
'; } else { echo '
'; } echo $result; $results++; } show_overboard_footer($stats, $results, true); exit(0); } } } //ob_start(); # Iterate through groups $database = $spooldir.'/articles-overview.db3'; $table = 'overview'; $dbh = rslight_db_open($database, $table); $query = $dbh->prepare('SELECT * FROM '.$table.' WHERE newsgroup=:findgroup AND date >= '.$oldest.' ORDER BY date DESC LIMIT '.$maxdisplay); $articles = array(); $db_articles = array(); foreach($grouplist as $findgroup) { $groups = preg_split("/(\ |\t)/", $findgroup, 2); $findgroup = $groups[0]; $overboard_noshow = explode(' ', $CONFIG['overboard_noshow']); foreach($overboard_noshow as $noshow) { if ((strpos($findgroup, $noshow) !== false) && !isset($_GET['thisgroup'])) { continue 2; } } $thisgroup = preg_replace('/\./', '/', $findgroup); if($dbh) { $query->execute(['findgroup' => $findgroup]); $i=0; while (($overviewline = $query->fetch()) !== false) { $articles[] = $spoolpath.$thisgroup.'/'.$overviewline['number']; $db_articles[] = $findgroup.':'.$overviewline['number'].':'.$overviewline['date'].':'.$overviewline['name']; $i++; if($i > $maxdisplay) { break; } } } } $dbh = null; $files = array(); if($CONFIG['article_database'] == '1') { foreach($db_articles as $article) { $order=explode(':', $article); $files[$order[2]] = $article; } } else { foreach($articles as $article) { if(is_dir($article)) { continue; } $files[filemtime($article)] = $article; } } krsort($files); echo ''; foreach($files as $article) { if(!isset($cachedate)) { $cachedate = time(); } if($CONFIG['article_database'] == '1') { $data = explode(':', $article); $articledata = np_get_db_article($data[1], $data[0], 0); } else { $articledata = file_get_contents($article); } $bodystart = strpos($articledata, $localeol); $header = substr($articledata, 0, $bodystart); $body = substr($articledata, $bodystart+1); $body = substr($body, strpos($body, PHP_EOL)); if(($multi = strpos($body, 'Content-Type: text/plain')) != false) { $bodystart = strpos($body, $localeol); $body = substr($body, $bodystart+1); $body = substr($body, strpos($body, PHP_EOL)); } # Find group name and article number if($CONFIG['article_database'] == '1') { $group = $data[0]; $articlenumber = $data[1]; $groupname = $group; } else { $group = preg_replace($spoolpath_regexp, '', $article); $group = preg_replace('/\//', '.', $group); $findme = strrpos($group, '.'); $groupname = substr($group, 0, $findme); $articlenumber = substr($group, $findme+1); } # Generate link $url = $thissite."/article-flat.php?id=".$articlenumber."&group="._rawurlencode($groupname)."#".$articlenumber; $groupurl = $thissite."/thread.php?group="._rawurlencode($groupname); preg_match('/Subject:.*/', $header, $subject); $output = explode("Subject: ",$subject[0], 2); preg_match('/Date:.*/', $header, $articledate); $dateoutput = explode("Date: ",$articledate[0]); $thisdate = strtotime($dateoutput[1]); if(($thisdate > time()) || ($thisdate < $oldest)) { continue; } $local_poster=false; if(preg_match('/X-Rslight-Site:.*/', $header, $site)) { $site_match = explode("X-Rslight-Site: ", $site[0]); preg_match('/Message-ID:.*/', $header, $mid); $mid_match = explode("Message-ID: ",$mid[0]); $rslight_site = $site_match[1]; $rslight_mid = $mid_match[1]; if(password_verify($CONFIG['thissitekey'].$rslight_mid, $rslight_site)) { $local_poster=true; } } preg_match('/Message-ID:.*/i', $header, $articleid); $getid = explode(": ", $articleid[0]); $thismsgid = hash('crc32', serialize($getid[1])); preg_match('/References:.*/i', $header, $ref); $getrefs = explode(': ', $ref[0]); $ref = preg_split("/[\s]+/", $getrefs[1]); if($getrefs[1] && $refid = get_data_from_msgid($ref[0])) { // Check that article to link is new enough for newsportal to display $groupinfo = file($spooldir.'/'.$refid[newsgroup].'-info.txt'); $range = explode(' ', $groupinfo[1]); if($refid[number] > ($range[0] - 1)) { $threadref = $ref[0]; } else { $threadref = false; } } else { $threadref = false; } preg_match('/Content-Transfer-Encoding:.*/', $header, $te); $content_transfer_encoding = explode("Content-Transfer-Encoding: ", $te[0]); preg_match('/.*charset=.*/', $header, $te); $content_type = explode("Content-Type: text/plain; charset=", $te[0]); $date_interval = $dateoutput[1]; preg_match('/Content-Transfer-Encoding:.*/', $header, $encoding); $this_encoding = explode("Content-Transfer-Encoding: ", $encoding[0]); if(trim($this_encoding[1]) == "base64") { $body=base64_decode($body); } if($CONFIG['article_database'] == '1') { $articlefrom[0] = $data[3]; } else { preg_match('/From:.*/', htmlspecialchars($header), $articlefrom); $isfrom = explode("From: ", $articlefrom[0]); $articlefrom[0] = $isfrom[1]; } $fromoutput = explode("<", html_entity_decode($articlefrom[0])); // Just an email address? if(strlen($fromoutput[0]) < 2) { preg_match("/\<([^\)]*)\@/", html_entity_decode($articlefrom[0]), $fromaddress); $fromoutput[0] = $fromaddress[1]; } if(strpos($fromoutput[0], "(")) { preg_match("/\(([^\)]*)\)/", html_entity_decode($articlefrom[0]), $fromaddress); $fromoutput[0] = $fromaddress[1]; } if(($results % 2) != 0){ $this_output = ''; $this_overboard[$thismsgid] = $this_output; if($results++ > ($maxdisplay - 2)) break; } if(isset($cached_overboard) && isset($this_overboard)) { $new_overboard = array_merge($this_overboard, $cached_overboard); $new_overboard = array_slice($new_overboard, 0, $maxdisplay); if (!isset($user_time)) { file_put_contents($cachefile, serialize($new_overboard)); } } elseif(isset($this_overboard)) { $new_overboard = $this_overboard; if (!isset($user_time)) { file_put_contents($cachefile, serialize($new_overboard)); } } else { $new_overboard = $cached_overboard; } if(isset($cachedate)) { if (!isset($user_time)) { touch($cachefile, $cachedate); } } $results = 1; foreach($new_overboard as $result) { if(($results % 2) != 0){ echo '
'; } else { $this_output = '
'; } $this_output = '

'; if($threadref) { $this_output.= ''.mb_decode_mimeheader($output[1]).' (thread)'."\r\n"; } else { $this_output.= ''.mb_decode_mimeheader($output[1])."\r\n"; } $this_output.= '

'; $this_output.= ''.$groupname.''; $this_output.= '

'; if((isset($CONFIG['hide_email']) && $CONFIG['hide_email'] == true) && (strpos($fromoutput[0], '@') !== false)) { $poster_name = truncate_email($fromoutput[0]); } else { $poster_name = $fromoutput[0]; } if($local_poster) { $this_output.= '

Posted: '.$date_interval.' by: '.create_name_link(mb_decode_mimeheader($poster_name)).'

'; } else { $this_output.= '

Posted: '.$date_interval.' by: '.create_name_link(mb_decode_mimeheader($poster_name)).'

'; } # Try to display useful snippet if($stop=strpos($body, "begin 644 ")) $body=substr($body, 0, $stop); $body = quoted_printable_decode($body); $mysnippet = recode_charset($body, $content_type[1], "utf8"); if($bodyend=strrpos($mysnippet, "\n---\n")) { $mysnippet = substr($mysnippet, 0, $bodyend); } else { if($bodyend=strrpos($mysnippet, "\n-- ")) { $mysnippet = substr($mysnippet, 0, $bodyend); } else { if($bodyend=strrpos($mysnippet, "\n.")) { $mysnippet = substr($mysnippet, 0, $bodyend); } } } $mysnippet = preg_replace('/\n.{0,5}>(.*)/', '', $mysnippet); $snipstart = strpos($mysnippet, ":\n"); if(substr_count(trim(substr($mysnippet, 0, $snipstart)), "\n") < 2) { $mysnippet = substr($mysnippet, $snipstart + 1, $snippetlength); } else { $mysnippet = substr($mysnippet, 0, $snippetlength); } $this_output.= "

".htmlspecialchars($mysnippet, ENT_QUOTES)."

\r\n"; $this_output.= '
'; } else { echo '
'; } echo $result; if (isset($user_time)) { preg_match('/Posted:.*/i', $result, $posted_date); $get_date = explode(': ', $posted_date[0]); $showme = strtotime(trim(substr($get_date[1], 0, -2))); if(($showme > time()) || ($showme < $user_time)) { break; } } if($results++ > ($maxdisplay - 2)) break; } show_overboard_footer(null, $results, null); echo ''; function show_overboard_header($grouplist) { global $text_thread, $text_article, $file_index, $file_thread; if (isset($_GET['thisgroup'])) { echo '

'; echo ''.basename(getcwd()).' / '; echo ''.htmlspecialchars(group_displaY_name($grouplist[0])).' / '; echo ' latest

'; echo ''; // Refresh button echo ''; // Article List button echo ''; // Newsgroups button (hidden) if(isset($frames_on) && $frames_on === true) { echo ''; } echo '
'; echo '
'; echo ''; echo ''; echo '
'; echo '
'; echo '
'; echo ''; echo ''; echo '
'; echo '
'; echo '
'; echo ''; echo '
'; echo '
'; } else { echo '

'; echo ''.basename(getcwd()).' / '; echo 'latest messages

'; echo ''; // Refresh button echo ''; // Newsgroups button (hidden) if(isset($frames_on) && $frames_on === true) { echo ''; } echo '
'; echo '
'; echo ''; echo '
'; echo '
'; echo '
'; echo ''; echo '
'; echo '
'; } } function show_overboard_footer($stats, $results, $iscached) { global $user_time; if(isset($user_time)) { $recent = 'new'; } else { $recent = 'recent'; } echo '
'; echo "

".$results." ".$recent." articles found.

\r\n"; #echo "
Rocksolid Overboard version ".$version; include "tail.inc"; if($iscached) { echo "

cached copy: ".date("D M j G:i:s T Y", $stats[9])."

\r\n"; } } ?>