2020-11-29 01:55:31 +01:00
< ? php
2020-12-25 01:18:35 +01:00
session_cache_limiter ( 'public' );
session_start ();
2023-09-22 12:33:24 +02:00
header ( " Expires: " . gmdate ( " D, d M Y H:i:s " , time () + ( 120 )) . " GMT " );
header ( " Cache-Control: max-age=120 " );
2023-08-09 16:12:32 +02:00
header ( " Pragma: cache " );
2020-12-12 05:16:13 +01:00
include " config.inc.php " ;
include " newsportal.php " ;
2021-03-17 09:39:45 +01:00
$snippet_size = 100 ;
2022-02-24 06:58:21 +01:00
2024-01-07 23:52:50 +01:00
if ( isset ( $_REQUEST [ 'group' ])) {
$search_group = urldecode ( $_REQUEST [ 'group' ]);
} else {
$search_group = null ;
2023-12-29 01:39:02 +01:00
}
2023-08-20 00:33:05 +02:00
if ( isset ( $_REQUEST [ 'data' ]) && $_REQUEST [ 'data' ] == '' ) {
unset ( $_REQUEST [ 'data' ]);
2022-02-24 06:58:21 +01:00
}
2021-03-17 09:39:45 +01:00
2023-08-20 00:33:05 +02:00
if (( ! isset ( $_POST [ 'key' ]) || ! password_verify ( $CONFIG [ 'thissitekey' ], $_POST [ 'key' ])) || (( strlen ( trim ( $_REQUEST [ 'terms' ])) < 2 ) && ! $_REQUEST [ 'data' ])) {
include " head.inc " ;
2023-09-04 15:06:43 +02:00
if ( disable_page_by_user_agent ( $client_device , " bot " , " Search " )) {
echo " <center>Page Disabled</center> " ;
include " tail.inc " ;
exit ();
}
2023-08-20 00:33:05 +02:00
echo '<h1 class="np_thread_headline">' ;
echo '<a href="' . $file_index . '" target=' . $frame [ 'menu' ] . '>' . basename ( getcwd ()) . '</a> / ' ;
2024-01-07 23:52:50 +01:00
if ( $search_group ) {
echo '<a href="' . $file_thread . '?group=' . urlencode ( $search_group ) . '" target=' . $frame [ 'menu' ] . '>' . $search_group . '</a> / ' ;
}
2023-08-20 00:33:05 +02:00
echo 'search</h1>' ;
echo '<table cellpadding="0" cellspacing="0" class="np_buttonbar"><tr>' ;
2023-12-29 01:39:02 +01:00
if ( isset ( $search_group )) {
$searching = $search_group ;
2023-08-20 00:33:05 +02:00
} else {
$searching = $config_name ;
}
echo '<body>' ;
echo '<table width=100% border="0" align="center" cellpadding="0" cellspacing="1">' ;
echo '<tr>' ;
echo '<form name="form1" method="post" action="search.php">' ;
echo '<td>' ;
echo '<table width="100%" align="center" border="0" cellpadding="3" cellspacing="1">' ;
echo '<tr>' ;
echo '<td colspan="3">Searching <strong>' . $searching . '</strong></td>' ;
echo '</tr>' ;
echo '<tr></tr>' ;
echo '<tr>' ;
if ( ! isset ( $_REQUEST [ 'data' ])) {
echo '<td>Search Terms: ' ;
} else {
echo '<td>Search Poster: ' ;
}
if ( isset ( $_GET [ 'terms' ])) {
echo '<input name="terms" type="text" id="terms" value="' . $_GET [ 'terms' ] . '"></td>' ;
} else {
echo '<input name="terms" type="text" id="terms"></td>' ;
}
echo '</tr><tr></tr><tr><td>' ;
if ( isset ( $_GET [ 'searchpoint' ]) && $_GET [ 'searchpoint' ] == 'Poster' ) {
if ( $CONFIG [ 'article_database' ] == '1' ) {
echo '<input type="radio" name="searchpoint" value="body"/>Body ' ;
}
echo '<input type="radio" name="searchpoint" value="subject"/>Subject ' ;
echo '<input type="radio" name="searchpoint" value="name" checked="checked"/>Poster ' ;
echo '<input type="radio" name="searchpoint" value="msgid"/>Message-ID' ;
} else {
if ( $CONFIG [ 'article_database' ] == '1' ) {
echo ' <input type="radio" name="searchpoint" value="body" checked="checked"/>Body ' ;
}
echo '<input type="radio" name="searchpoint" value="subject"/>Subject ' ;
echo '<input type="radio" name="searchpoint" value="name"/>Poster ' ;
echo '<input type="radio" name="searchpoint" value="msgid"/>Message-ID' ;
}
echo '</td></tr>' ;
echo '<tr>' ;
echo '<td><input name="command" type="hidden" id="command" value="Search" readonly="readonly"></td>' ;
2023-12-29 01:39:02 +01:00
if ( isset ( $search_group )) {
2024-01-07 23:52:50 +01:00
echo '<input type="hidden" name="group" value="' . urlencode ( $search_group ) . '">' ;
2023-08-20 00:33:05 +02:00
}
echo '<input type="hidden" name="key" value="' . password_hash ( $CONFIG [ 'thissitekey' ], PASSWORD_DEFAULT ) . '">' ;
if ( isset ( $_GET [ 'data' ])) {
echo '<input type="hidden" name="data" value="' . $_GET [ 'data' ] . '">' ;
}
echo '</tr><tr></tr><tr>' ;
echo '<td><input type="submit" name="Submit" value="Search"></td>' ;
echo '</tr><tr><td><td></td><td></td></table></td></form></tr></table></body></html>' ;
exit ( 0 );
2021-03-12 05:34:53 +01:00
}
2023-08-20 00:33:05 +02:00
if ( isset ( $frames_on ) && $frames_on === true ) {
?>
2020-12-12 05:16:13 +01:00
< script >
var contentURL = window . location . pathname + window . location . search + window . location . hash ;
if ( window . self !== window . top ) {
/* Great! now we move along */
} else {
window . location . href = '../index.php?content=' + encodeURIComponent ( contentURL );
}
top . history . replaceState ({}, 'Title' , 'index.php?content=' + encodeURIComponent ( contentURL ));
</ script >
< ? php
}
# Maximum number of articles to show
$maxdisplay = 1000 ;
$thissite = '.' ;
2023-08-20 00:33:05 +02:00
$groupconfig = $config_path . " /groups.txt " ;
2020-12-12 05:16:13 +01:00
2023-08-20 00:33:05 +02:00
$title .= ' - search results for: ' . $_POST [ 'terms' ];
2020-12-12 05:16:13 +01:00
include " head.inc " ;
ob_start ();
2024-01-07 23:52:50 +01:00
if ( isset ( $search_group )) {
echo '<h1 class="np_thread_headline">' ;
echo '<a href="' . $file_index . '" target=' . $frame [ 'menu' ] . '>' . basename ( getcwd ()) . '</a> / ' ;
echo '<a href="' . $file_thread . '?group=' . urlencode ( $search_group ) . '" target=' . $frame [ 'menu' ] . '>' . $search_group . '</a> / ' ;
echo 'search results for: ' . $_POST [ 'terms' ] . '</h1>' ;
2023-08-20 00:33:05 +02:00
// Newsgroups button (hidden)
2020-12-12 05:16:13 +01:00
echo '<td>' ;
2023-08-20 00:33:05 +02:00
echo '<form action="' . $file_index . '">' ;
echo '<button class="np_button_hidden" type="submit">' . $text_thread [ " button_grouplist " ] . '</button>' ;
2020-12-12 05:16:13 +01:00
echo '</form>' ;
echo '</td>' ;
echo '</tr></table>' ;
2023-08-20 00:33:05 +02:00
} else {
2020-12-12 05:16:13 +01:00
echo '<h1 class="np_thread_headline">' ;
2023-08-20 00:33:05 +02:00
echo '<a href="' . $file_index . '" target=' . $frame [ 'menu' ] . '>' . basename ( getcwd ()) . '</a> / ' ;
echo 'search results for: ' . $_POST [ 'terms' ] . '</h1>' ;
2020-12-12 05:16:13 +01:00
echo '<table cellpadding="0" cellspacing="0" width="100%" class="np_buttonbar"><tr>' ;
2023-08-20 00:33:05 +02:00
// Newsgroups button (hidden)
2020-12-12 05:16:13 +01:00
echo '<td>' ;
2023-08-20 00:33:05 +02:00
echo '<form action="' . $file_index . '">' ;
echo '<button class="np_button_hidden" type="submit">' . $text_thread [ " button_grouplist " ] . '</button>' ;
2020-12-12 05:16:13 +01:00
echo '</form>' ;
echo '</td>' ;
echo '</tr></table>' ;
}
echo '<table cellspacing="0" width="100%" class="np_results_table">' ;
# Iterate through groups
2023-08-20 00:33:05 +02:00
$results = 0 ;
if ( isset ( $_COOKIE [ 'tzo' ])) {
$offset = $_COOKIE [ 'tzo' ];
} else {
$offset = $CONFIG [ 'timezone' ];
}
$overview = array ();
if ( $_POST [ 'searchpoint' ] == 'body' ) {
2023-12-29 01:39:02 +01:00
$overview = get_body_search ( $search_group , $_POST [ 'terms' ]);
2023-08-20 00:33:05 +02:00
} else {
if ( isset ( $_REQUEST [ 'data' ])) {
2023-12-29 01:39:02 +01:00
$overview = get_header_search ( $search_group , base64_decode ( urldecode ( $_REQUEST [ 'data' ])));
2022-02-21 05:15:38 +01:00
} else {
2023-12-29 01:39:02 +01:00
$overview = get_header_search ( $search_group , $_POST [ 'terms' ]);
2022-02-21 05:15:38 +01:00
}
2023-08-20 00:33:05 +02:00
}
foreach ( $overview as $overviewline ) {
/* Find section for links */
$menulist = file ( $config_dir . " menu.conf " , FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
foreach ( $menulist as $menu ) {
if ( $menu [ 0 ] == '#' ) {
continue ;
}
$menuitem = explode ( ':' , $menu );
$glfp = fopen ( $config_dir . $menuitem [ 0 ] . " /groups.txt " , 'r' );
$section = " " ;
while ( $gl = fgets ( $glfp )) {
$group_name = preg_split ( " /( | \t )/ " , $gl , 2 );
if ( stripos ( trim ( $overviewline [ 'newsgroup' ]), trim ( $group_name [ 0 ])) !== false ) {
$section = $menuitem [ 0 ];
break 2 ;
}
2020-12-24 10:36:17 +01:00
}
}
2021-03-11 07:55:01 +01:00
fclose ( $glfp );
2023-08-20 00:33:05 +02:00
# Generate link
2023-12-30 13:08:14 +01:00
$url = " ../ " . $section . " /article-flat.php?id= " . $overviewline [ 'number' ] . " &group= " . urlencode ( $overviewline [ 'newsgroup' ]) . " # " . $overviewline [ 'number' ];
$groupurl = " ../ " . $section . " /thread.php?group= " . urlencode ( $overviewline [ 'newsgroup' ]);
2023-08-20 00:33:05 +02:00
$fromoutput = explode ( " < " , html_entity_decode ( $overviewline [ 'name' ]));
// Use local timezone if possible
$ts = new DateTime ( date ( $text_header [ " date_format " ], $overviewline [ 'date' ]), new DateTimeZone ( 'UTC' ));
$ts -> add ( DateInterval :: createFromDateString ( $offset . ' minutes' ));
if ( $offset != 0 ) {
$newdate = $ts -> format ( 'D, j M Y H:i' );
} else {
$newdate = $ts -> format ( $text_header [ " date_format " ]);
}
unset ( $ts );
$fromline = address_decode ( headerDecode ( $overviewline [ 'name' ]), " nowhere " );
if ( ! isset ( $fromline [ 0 ][ " personal " ])) {
$lastname = $fromline [ 0 ][ " mailbox " ];
;
} else {
$lastname = $fromline [ 0 ][ " personal " ];
}
if (( $results % 2 ) != 0 ) {
echo '<tr class="np_result_line1"><td class="np_result_line1" style="word-wrap:break-word";>' ;
} else {
echo '<tr class="np_result_line2"><td class="np_result_line2" style="word-wrap:break-word";>' ;
}
echo '<p class=np_ob_subject>' ;
2024-01-17 17:53:36 +01:00
echo '<b><a href="' . $url . '">' . htmlspecialchars ( headerDecode ( $overviewline [ 'subject' ])) . " </a></b> \r \n " ;
2023-08-20 00:33:05 +02:00
echo '</p><p class=np_ob_group>' ;
echo '<a href="' . $groupurl . '">' . $overviewline [ 'newsgroup' ] . '</a>' ;
echo '</p>' ;
$fromline = address_decode ( $overviewline [ 'name' ], " nowhere " );
if ( ! isset ( $fromline [ 0 ][ " host " ]))
$fromline [ 0 ][ " host " ] = " " ;
$name_from = $fromline [ 0 ][ " mailbox " ] . " @ " . $fromline [ 0 ][ " host " ];
$name_username = $fromline [ 0 ][ " mailbox " ];
if ( ! isset ( $fromline [ 0 ][ " personal " ])) {
$poster_name = $fromline [ 0 ][ " mailbox " ];
} else {
$poster_name = $fromline [ 0 ][ " personal " ];
}
if ( trim ( $poster_name ) == '' ) {
$fromoutput = explode ( " < " , html_entity_decode ( $c -> name ));
if ( strlen ( $fromoutput [ 0 ]) < 1 ) {
$poster_name = $fromoutput [ 1 ];
} else {
$poster_name = $fromoutput [ 0 ];
}
}
$poster_name = trim ( mb_decode_mimeheader ( $poster_name ), " \n \r \t \ v \0 \" " );
echo '<p class=np_ob_posted_date>Posted: ' . $newdate . ' by: ' . create_name_link ( $poster_name , $name_from ) . '</p>' ;
if ( $_POST [ 'searchpoint' ] == 'body' ) {
$snip = strip_tags ( quoted_printable_decode ( $overviewline [ 'snippet' ]), '<strong><font><i>' );
} else {
$snip = strip_tags ( quoted_printable_decode ( $overviewline [ 'search_snippet' ]), '<strong><font><i>' );
$snip = substr ( $snip , 0 , $snippet_size );
}
echo $snip ;
echo '</td></tr>' ;
if ( $results ++ > ( $maxdisplay - 2 ))
break ;
2020-12-12 05:16:13 +01:00
}
echo '</table>' ;
2023-08-20 00:33:05 +02:00
echo " <p class=np_ob_tail><b> " . $results . " </b> matching articles found.</p> \r \n " ;
# echo "<center><i>Rocksolid Overboard</i> version ".$version;
2020-12-12 05:16:13 +01:00
include " tail.inc " ;
$thispage = ob_get_contents ();
ob_end_clean ();
echo $thispage ;
2023-08-20 00:33:05 +02:00
function get_body_search ( $group , $terms )
{
GLOBAL $CONFIG , $config_name , $spooldir , $snippet_size ;
$terms = preg_replace ( " /'/ " , ' ' , $terms );
$terms = trim ( $terms );
if ( $terms [ 0 ] !== '"' || substr ( $terms , - 1 ) !== '"' ) {
$terms = preg_replace ( '/"/' , '' , $terms );
$terms = preg_replace ( " / \ / " , '" "' , $terms );
$terms = preg_replace ( '/"NEAR"/' , 'NEAR' , $terms );
$terms = preg_replace ( '/"AND"/' , 'AND' , $terms );
$terms = preg_replace ( '/"OR"/' , 'OR' , $terms );
$terms = preg_replace ( '/"NOT"/' , 'NOT' , $terms );
$terms = '"' . $terms . '"' ;
}
2023-12-29 01:39:02 +01:00
if ( $group != '' ) {
$grouplist [ 0 ] = $group ;
2021-03-12 08:56:35 +01:00
} else {
2023-08-20 00:33:05 +02:00
$local_groupfile = $spooldir . " / " . $config_name . " /local_groups.txt " ;
$grouplist = file ( $local_groupfile , FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
2021-03-12 08:56:35 +01:00
}
2023-08-20 00:33:05 +02:00
foreach ( $grouplist as $thisgroup ) {
$name = explode ( ':' , $thisgroup );
$group = $name [ 0 ];
$database = $spooldir . '/' . $group . '-articles.db3' ;
if ( ! is_file ( $database )) {
continue ;
}
$dbh = article_db_open ( $database );
$stmt = $dbh -> prepare ( " SELECT snippet(search_fts, 6, '<strong><font class=search_result><i>', '</i></font></strong>', '...', $snippet_size ) as snippet, newsgroup, number, name, date, subject, rank FROM search_fts WHERE search_fts MATCH 'search_snippet: $terms ' ORDER BY rank " );
$stmt -> execute ();
while ( $row = $stmt -> fetch ()) {
$overview [] = $row ;
}
$dbh = null ;
2021-03-11 07:55:01 +01:00
}
2023-07-06 05:07:45 +02:00
// do not perform a usort of an empty search result
2023-08-20 00:33:05 +02:00
if ( $overview != null ) {
usort ( $overview , function ( $a , $b ) {
return $a [ 'rank' ] <=> $b [ 'rank' ];
});
2023-07-06 05:07:45 +02:00
}
2023-08-20 00:33:05 +02:00
return $overview ;
2021-03-11 07:55:01 +01:00
}
2023-08-20 00:33:05 +02:00
function get_header_search ( $group , $terms )
{
GLOBAL $CONFIG , $config_name , $spooldir , $snippet_size ;
$terms = preg_replace ( '/\%/' , '\%' , $terms );
$searchterms = " % " . $terms . " % " ;
2024-03-23 13:22:05 +01:00
if ( isset ( $group ) && $_POST [ 'searchpoint' ] != 'msgid' ) {
$grouplist [ 0 ] = $group ;
2023-08-20 00:33:05 +02:00
} elseif ( $_POST [ 'searchpoint' ] != 'msgid' ) {
$local_groupfile = $spooldir . " / " . $config_name . " /local_groups.txt " ;
2021-12-18 23:30:47 +01:00
$grouplist = file ( $local_groupfile , FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
2021-03-17 10:43:31 +01:00
} else {
2023-08-20 00:33:05 +02:00
$local_groupfile = $spooldir . " /spoolnews/groups.txt " ;
2021-12-18 23:30:47 +01:00
$grouplist = file ( $local_groupfile , FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
2021-03-17 10:43:31 +01:00
}
2021-03-23 11:16:50 +01:00
# Prepare search database
2023-08-20 00:33:05 +02:00
$database = $spooldir . '/articles-overview.db3' ;
2021-03-23 11:16:50 +01:00
$table = 'overview' ;
2023-08-13 19:00:48 +02:00
$dbh = overview_db_open ( $database , $table );
2021-03-23 11:16:50 +01:00
$overview = array ();
2023-08-20 00:33:05 +02:00
foreach ( $grouplist as $thisgroup ) {
$name = explode ( ':' , $thisgroup );
$group = $name [ 0 ];
$article_database = $spooldir . '/' . $group . '-articles.db3' ;
if ( ! is_file ( $article_database )) {
2021-11-17 07:34:52 +01:00
continue ;
2023-08-20 00:33:05 +02:00
}
$article_dbh = article_db_open ( $article_database );
$article_stmt = $article_dbh -> prepare ( " SELECT * FROM articles WHERE number=:number " );
if ( is_multibyte ( $_POST [ 'terms' ])) {
2021-03-25 03:10:49 +01:00
$stmt = $dbh -> prepare ( " SELECT * FROM $table WHERE newsgroup=:group " );
$stmt -> bindParam ( ':group' , $group );
$stmt -> execute ();
2023-08-20 00:33:05 +02:00
while ( $found = $stmt -> fetch ()) {
if ( stripos ( mb_decode_mimeheader ( $found [ $_POST [ 'searchpoint' ]]), $_POST [ 'terms' ]) !== false ) {
$article_stmt -> bindParam ( ':number' , $found [ 'number' ]);
$article_stmt -> execute ();
$found_snip = $article_stmt -> fetch ();
$found [ 'search_snippet' ] = $found_snip [ 'search_snippet' ];
$found [ 'sort_date' ] = $found_snip [ 'date' ];
$overview [] = $found ;
}
2021-03-11 07:55:01 +01:00
}
2023-08-20 00:33:05 +02:00
} else {
$stmt = $dbh -> prepare ( " SELECT * FROM $table WHERE newsgroup=:group AND " . $_POST [ 'searchpoint' ] . " like :terms ESCAPE ' \ ' ORDER BY date DESC " );
$stmt -> bindParam ( ':group' , $group );
2021-03-11 07:55:01 +01:00
$stmt -> bindParam ( ':terms' , $searchterms );
2023-08-20 00:33:05 +02:00
$check = " /([a-z]|[0-9]| \ !|#| \$ | \ %| \ &| \ '| \ *| \ +| \ -| \ /| \ =| \ ?| \ ^| \ _| \" | \ `| \ { | \ || \ }| \ ~| \ ;) " . trim ( $searchterms , '\%' ) . " /i " ;
2021-03-11 07:55:01 +01:00
$stmt -> execute ();
2023-08-20 00:33:05 +02:00
while ( $found = $stmt -> fetch ()) {
if ( isset ( $_REQUEST [ 'data' ]) && ( $_REQUEST [ 'searchpoint' ] == 'name' )) {
if ( preg_match ( $check , $found [ 'name' ])) {
continue ;
}
2022-03-04 10:22:20 +01:00
}
2023-08-20 00:33:05 +02:00
$article_stmt -> bindParam ( ':number' , $found [ 'number' ]);
$article_stmt -> execute ();
$found_snip = $article_stmt -> fetch ();
$found [ 'search_snippet' ] = $found_snip [ 'search_snippet' ];
$found [ 'sort_date' ] = $found_snip [ 'date' ];
$overview [] = $found ;
2021-03-11 07:55:01 +01:00
}
2023-08-20 00:33:05 +02:00
}
$article_dbh = null ;
2021-03-17 10:43:31 +01:00
}
2023-08-20 00:33:05 +02:00
$dbh = null ;
usort ( $overview , function ( $b , $a ) {
return $a [ 'sort_date' ] <=> $b [ 'sort_date' ];
});
return $overview ;
2021-03-11 07:55:01 +01:00
}
2023-08-20 00:33:05 +02:00
function highlightStr ( $haystack , $needle )
{
2020-12-12 05:16:13 +01:00
preg_match_all ( " / $needle +/i " , $haystack , $matches );
if ( is_array ( $matches [ 0 ]) && count ( $matches [ 0 ]) >= 1 ) {
2023-08-20 00:33:05 +02:00
foreach ( $matches [ 0 ] as $match ) {
$haystack = str_replace ( $match , '<b>' . $match . '</b>' , $haystack );
}
2020-12-12 05:16:13 +01:00
}
return $haystack ;
}
?>
</ body >
</ html >