594 lines
14 KiB
PHP
594 lines
14 KiB
PHP
<?
|
|
/*
|
|
Jorge - frontend for mod_logdb - ejabberd server-side message archive module.
|
|
|
|
Copyright (C) 2009 Zbigniew Zolkiewski
|
|
|
|
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.
|
|
|
|
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.
|
|
|
|
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
require_once("headers.php");
|
|
|
|
$search_phase = $_POST['query'];
|
|
|
|
$next_link = $_GET['a']; // for pagination
|
|
$predefined = $_GET['b']; // for predefined
|
|
|
|
if ($predefined) {
|
|
|
|
if($enc->decrypt_url($predefined) === true) {
|
|
|
|
$search_phase = "from:".$enc->jid;
|
|
|
|
}
|
|
else {
|
|
|
|
unset($search_phase);
|
|
unset($predefined);
|
|
}
|
|
|
|
}
|
|
|
|
if ($next_link) {
|
|
|
|
if($enc->decrypt_url($next_link) === true) {
|
|
|
|
$tslice_next = $enc->tslice;
|
|
$search_phase = $enc->search_phase;
|
|
$offset_arch = $enc->offset_arch;
|
|
$offset_day = $enc->offset_day;
|
|
$tag_count = $enc->tag_count;
|
|
|
|
}
|
|
else {
|
|
|
|
unset ($next_link);
|
|
unset ($search_phase);
|
|
}
|
|
|
|
}
|
|
|
|
if ($tag_count=="t") {
|
|
|
|
$start_from = $offset_day;
|
|
|
|
}
|
|
else{
|
|
|
|
$start_from = null;
|
|
}
|
|
|
|
$plain_phase = $search_phase; // fix me
|
|
|
|
require_once("upper.php");
|
|
|
|
//need to initialize counter here
|
|
$r=0;
|
|
|
|
// Check if user have set up OwnName
|
|
$db->get_own_name();
|
|
if ($db->result->own_name) {
|
|
|
|
$own_name = $db->result->own_name;
|
|
|
|
}
|
|
else{
|
|
|
|
$own_name = false;
|
|
|
|
}
|
|
|
|
// we need to rewrite this part internaly...
|
|
if ($search_phase!="") {
|
|
|
|
// check if we are using parametrized search or not
|
|
$qquery = is_query_from($search_phase);
|
|
|
|
// parametric search
|
|
if ($qquery[from] == "t") {
|
|
|
|
$user_chat_search = "1"; // temp hack
|
|
unset($search_phase);
|
|
list($user_name, $server) = split("@", $qquery[talker]);
|
|
$db->get_user_id($user_name);
|
|
$user_name = $db->result->user_id;
|
|
$db->get_server_id($server);
|
|
$server = $db->result->server_id;
|
|
$search_phase=$qquery[query];
|
|
|
|
}
|
|
|
|
|
|
if ($search_phase) {
|
|
|
|
if ($db->create_search_results_table() === false) {
|
|
|
|
$html->alert_message($oper_fail[$lang]);
|
|
}
|
|
|
|
else {
|
|
|
|
$score="score";
|
|
}
|
|
}
|
|
|
|
|
|
//main table
|
|
if ($time2_start AND $time2_end) {
|
|
|
|
$html->status_message($search_warn[$lang].': '.$time2_start.' - '.$time2_end);
|
|
|
|
}
|
|
else {
|
|
|
|
$time2_start = null;
|
|
$time2_end = null;
|
|
}
|
|
|
|
$html->set_overview('<h2>'.$search_res[$lang].'</h2><table align="center" border="0" cellspacing="0" class="ff">
|
|
<tr class="header"><td width="150">'.$time_t[$lang].'</td><td>'.$talks[$lang].'</td><td>'.$thread[$lang].'</td><td>'.$score.'</td></tr>
|
|
<tr class="spacer"><td colspan="4"></td></tr>'
|
|
);
|
|
|
|
if ($offset_arch) {
|
|
|
|
$type_p="6";
|
|
|
|
}
|
|
else {
|
|
|
|
$type_p="1";
|
|
|
|
}
|
|
|
|
// run optimized query in specyfic conditions
|
|
if ($qquery[words]=="t" AND $qquery[from]=="t") {
|
|
|
|
$type_p="8";
|
|
|
|
}
|
|
|
|
if ($type_p==="1" OR $type_p==="8") {
|
|
|
|
$db->get_uniq_chat_dates($time2_start, $time2_end, false, $offset_arch, $user_name,$server);
|
|
|
|
}
|
|
elseif($type_p==="6") {
|
|
|
|
$db->get_uniq_chat_dates($time2_start, $time2_end, true, $offset_arch, $user_name,$server);
|
|
|
|
}
|
|
|
|
debug(DEBUG,"Selected search type: $type_p (first stage)");
|
|
|
|
$result = $db->result;
|
|
|
|
// query offsets init for calculations:
|
|
$arch_table = count($result);
|
|
$external=0;
|
|
$internal = $offset_day;
|
|
|
|
// set string for searching
|
|
if ($search_phase) {
|
|
|
|
$db->set_user_query($search_phase);
|
|
|
|
}
|
|
|
|
foreach($result as $entry) {
|
|
|
|
$external++;
|
|
$time_slice = $entry["at"];
|
|
|
|
// sub query
|
|
|
|
if ($search_phase) {
|
|
|
|
$type="4";
|
|
|
|
}
|
|
|
|
if ($user_chat_search) {
|
|
|
|
if ($qquery['words']=="t") {
|
|
|
|
$type="5";
|
|
|
|
}
|
|
|
|
elseif($qquery['words'] == "f") {
|
|
|
|
$type="7";
|
|
}
|
|
|
|
}
|
|
|
|
$a++;
|
|
|
|
if ($type==="4") {
|
|
|
|
$db->search_query($time_slice);
|
|
|
|
}
|
|
elseif($type==="5") {
|
|
|
|
$db->search_query_in_user_chat($user_name,$server,$time_slice,$start_from);
|
|
|
|
}
|
|
elseif($type==="7") {
|
|
|
|
$db-> search_query_chat_stream($user_name,$server,$time_slice,$start_from);
|
|
|
|
}
|
|
|
|
debug(DEBUG,"Selected search type: $type (second stage)");
|
|
|
|
$search_result = $db->result;
|
|
$num_rows = count($search_result);
|
|
|
|
$day_mark=0;
|
|
if ($num_rows!="0") {
|
|
|
|
foreach ($search_result as $results) {
|
|
|
|
// if there is no "from:" clausule perform normal search
|
|
if ($type!="7") {
|
|
|
|
$body = base64_encode($results[body]);
|
|
|
|
if ($db->insert_data_to_result_table (
|
|
$results[ts],
|
|
$time_slice,
|
|
$results[peer_name_id],
|
|
$results[peer_server_id],
|
|
$results[direction],
|
|
$body,
|
|
$results[score],
|
|
$results[ext]
|
|
) === false ) {
|
|
|
|
|
|
$html->alert_message($oper_fail[$lang]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$internal++;
|
|
$day_mark++;
|
|
|
|
// we like colors dont we?
|
|
if ($results["direction"] == "to") {
|
|
|
|
$col="e0e9f7";
|
|
}
|
|
|
|
else {
|
|
|
|
$col="e8eef7";
|
|
|
|
}
|
|
|
|
$to_user = $results["peer_name_id"];
|
|
$to_server=$results["peer_server_id"];
|
|
|
|
// let's make a link
|
|
$to_base = $enc->crypt_url("tslice=$time_slice&peer_name_id=$to_user&peer_server_id=$to_server");
|
|
|
|
// time calc
|
|
$pass_to_next = $results["ts"];
|
|
$new_d = $results["ts"];
|
|
$time_diff = abs((strtotime("$old_d") - strtotime(date("$new_d"))));
|
|
$old_d = $pass_to_next;
|
|
|
|
// split line
|
|
if ($time_diff>$split_line AND $day_mark>1 AND $type!="4") {
|
|
|
|
$in_minutes = round(($time_diff/60),0);
|
|
$html->set_body('<tr class="splitl">
|
|
<td colspan="5" style="font-size: 10px;">'.verbose_split_line($in_minutes,$verb_h[$lang],$in_min[$lang]).'<hr size="1" noshade="noshade" style="color: #cccccc;"></td></tr>');
|
|
}
|
|
|
|
// talker and server names
|
|
$db->get_user_name($results[peer_name_id]);
|
|
$talk = $db->result->username;
|
|
$db->get_server_name($results[peer_server_id]);
|
|
$sname = $db->result->server_name;
|
|
// cleaning username
|
|
$jid = htmlspecialchars($talk);
|
|
|
|
$html->set_body('<tr id="pretty" title="'.$jid.'@'.htmlspecialchars($sname).'"
|
|
style="cursor: pointer;" bgcolor="'.$col.'"
|
|
onclick="window.open(\''.$view_type.'?a='.$to_base.'\');"
|
|
onMouseOver="this.bgColor=\'c3d9ff\';"
|
|
onMouseOut="this.bgColor=\'#'.$col.'\';">
|
|
<td width="120" style="text-align: center;">'.$results["ts"].'</td>
|
|
');
|
|
|
|
// username from user roster
|
|
$talk = query_nick_name($ejabberd_roster,$talk,$sname);
|
|
|
|
// if there is no user in roster - advise that
|
|
if ($talk=="f") {
|
|
|
|
$talk=$not_in_r[$lang];
|
|
|
|
}
|
|
|
|
// threaded view
|
|
if ($results["direction"] == "from") {
|
|
|
|
$out=$talk;
|
|
$tt=$tt+1;
|
|
$aa=0;
|
|
}
|
|
else {
|
|
$out = TOKEN;
|
|
$aa=$aa+1;
|
|
$tt=0;
|
|
|
|
}
|
|
|
|
if ($aa<2 AND $tt<2) {
|
|
|
|
$html->set_body('<td style="text-align: left;"> ');
|
|
|
|
if ($out === TOKEN) {
|
|
|
|
if ($own_name !== false) {
|
|
|
|
$html->set_body(cut_nick(htmlspecialchars($own_name)));
|
|
|
|
}
|
|
else{
|
|
|
|
$html->set_body(cut_nick(htmlspecialchars($out)));
|
|
|
|
}
|
|
}
|
|
else {
|
|
|
|
$html->set_body(cut_nick(htmlspecialchars($out)));
|
|
|
|
}
|
|
|
|
$html->set_body(' </td>');
|
|
|
|
}
|
|
else {
|
|
|
|
$html->set_body('<td style="text-align: right;"> -</td>');
|
|
|
|
}
|
|
|
|
// end threaded view
|
|
|
|
// message body
|
|
$body_message=wordwrap(str_replace("\n","<br>",htmlspecialchars($results["body"])),107,"<br>",true);
|
|
$html->set_body('<td width="700">'.$body_message.'</td>');
|
|
|
|
// run pagination code only if search contains from: clausule
|
|
/*
|
|
The pagination code havent been changed after upgrade to search_engine_v2 - it work well so if one want to improve it
|
|
f.e. by adding "back" button be my guest...current code is nightmare :/
|
|
*/
|
|
$r=$r+1;
|
|
debug(DEBUG,"all: $r, num_r: $num_rows, internal: $internal");
|
|
if ($r==$num_search_results) {
|
|
|
|
if ($num_rows>$internal) {
|
|
|
|
debug(DEBUG,"-->more results in this day...$entry[at] offset: $internal");
|
|
$tag_count="t";
|
|
}
|
|
|
|
$next_r=$external+$offset_arch;
|
|
debug(DEBUG,"before cutdown: $next_r");
|
|
// back to one day and continue with offset
|
|
if ($tag_count=="t") {
|
|
|
|
$next_r=$next_r-1;
|
|
|
|
}
|
|
|
|
debug(DEBUG,"after cutdown: $next_r");
|
|
debug(DEBUG,"Internal: $internal, offset: $offset_day, is_tag: $s_variables[tag_count]");
|
|
// if the same day - we increase offset
|
|
if ($internal==$offset_day AND $s_variables[tag_count] == "t") {
|
|
|
|
$internal=$internal+$offset_day;
|
|
debug(DEBUG,"Increasing offset...");
|
|
|
|
}
|
|
|
|
// hack
|
|
if ($qquery[from] == "t") {
|
|
|
|
$plain_phase=str_replace("@","//",$plain_phase);
|
|
|
|
}
|
|
|
|
$trange = $enc->crypt_url("time_start=$time2_start&time_end=$time2_end");
|
|
$lnk_n = $enc->crypt_url("tslice=$entry[at]&offset_arch=$next_r&offset_day=$internal&search_phase=$plain_phase&tag_count=$tag_count");
|
|
|
|
$html->set_body('<tr class="spacer"><td colspan="4"></td></tr>
|
|
<tr class="maint" style="background-image: url(img/bar_new.png); background-repeat:repeat-x; font-weight: bold; color: #fff;">
|
|
<td colspan="2" style="text-align: left;">
|
|
<a href="search_v2.php?a='.$lnk_p.'"></a></td>
|
|
<td colspan="2" style="text-align: right;">
|
|
<a href="search_v2.php?a='.$lnk_n.'&c='.$trange.'">'.$search_next[$lang].'</a></td></tr>
|
|
');
|
|
break 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
// if we haven't found anything increase counter by one...
|
|
$b++;
|
|
}
|
|
|
|
$start_from = null; // reset...
|
|
$internal=0;
|
|
$day_mark=1;
|
|
if ($num_rows!=0 AND $type=="7") {
|
|
|
|
if ($arch_table == $external) {
|
|
|
|
$html->set_body('<tr height="6" class="spacerb"><td colspan="3" style="text-align: center;"><small>'.$no_more[$lang].'</small></td></tr>');
|
|
}
|
|
|
|
elseif($type=="7") {
|
|
|
|
$html->set_body('<tr height="6" class="spacer"><td colspan="3" style="text-align: center;"><small>'.$nx_dy[$lang].'</small></td></tr>');
|
|
|
|
// initialize thread
|
|
$aa="0";
|
|
$tt="0";
|
|
}
|
|
}
|
|
|
|
// end of main loop
|
|
}
|
|
|
|
// if normal search:
|
|
if ($type!="7" AND $type!==NULL) {
|
|
|
|
$db->get_search_results();
|
|
$result = $db->result;
|
|
$num_results = count($result);
|
|
$html->set_body('<tr class="maint"><td colspan="4" style="text-align: center; font-weight: normal;">'.$search_tip[$lang].' <b>'.$num_results.'</b>'.$search_why[$lang].'</td></tr>
|
|
<tr class="spacerb"><td colspan="5"></td></tr>');
|
|
|
|
foreach ($result as $dat) {
|
|
|
|
//building link:
|
|
$to_base = $enc->crypt_url("tslice=$dat[time_slice]&peer_name_id=$dat[peer_name_id]&peer_server_id=$dat[peer_server_id]");
|
|
|
|
// get the name of user that we was talking to
|
|
$db->get_user_name($dat[peer_name_id]);
|
|
$talk = $db->result->username;
|
|
|
|
// get it's server name
|
|
$db->get_server_name($dat[peer_server_id]);
|
|
$sname = $db->result->server_name;
|
|
|
|
// cleanup jid
|
|
$jid = htmlspecialchars($talk);
|
|
|
|
// color every second line...
|
|
if ($col=="e0e9f7") {
|
|
|
|
$col="e8eef7";
|
|
|
|
}
|
|
else {
|
|
|
|
$col="e0e9f7";
|
|
|
|
}
|
|
|
|
// get username from user roster:
|
|
$talk = query_nick_name($ejabberd_roster,$talk,$sname);
|
|
|
|
// if user is not in list, advise about that
|
|
if ($talk === "" ) {
|
|
|
|
$talk=$not_in_r[$lang];
|
|
|
|
}
|
|
|
|
// now we want to know who was talking to who...
|
|
if ($dat["direction"] == "to") {
|
|
|
|
$fr=$to_u[$lang];
|
|
|
|
}
|
|
else {
|
|
|
|
$fr=$from_u[$lang];
|
|
|
|
}
|
|
|
|
// ... and what was talking, and format that ...
|
|
$body_talk = wordwrap(str_replace("\n","<br>",htmlspecialchars(base64_decode($dat["body"]))),107,"<br>",true);
|
|
|
|
// advise user if chat is deleted. Extension=1 stands for "Chat temporary deleted" or "Chat awaiting deletion"
|
|
if ($dat[ext] == 1) {
|
|
|
|
$html->set_body('<tr bgcolor="b5b5b5"><td colspan="4" style="text-align: center; font-weight: bold;">'.$marked_as_d[$lang].'</td></tr>');
|
|
|
|
}
|
|
|
|
// opening line
|
|
if ($dat[ext]!=1) {
|
|
|
|
$html->set_body('<tr id="pretty" title="'.$jid.'@'.htmlspecialchars($sname).'"
|
|
style="cursor: pointer;" bgcolor="'.$col.'" onclick="window.location=\''.$view_type.'?a='.$to_base.'\'"
|
|
onMouseOver="this.bgColor=\'c3d9ff\';" onMouseOut="this.bgColor=\'#'.$col.'\';">');
|
|
|
|
}
|
|
else {
|
|
|
|
$html->set_body('<tr id="pretty" title="'.$jid.'@'.htmlspecialchars($sname).'" style="cursor: pointer;" bgcolor="b5b5b5" onclick="window.location=\'trash.php\'">');
|
|
|
|
}
|
|
|
|
// content
|
|
$html->set_body('<td width="120" style="text-align: center;">'.$dat["ts"].'</td>
|
|
<td style="text-align: left;">'.$fr.' '.cut_nick($talk).' </td>
|
|
<td width="700">'.$body_talk.'</td>
|
|
<td style="text-align: center;">'.round($dat[score],2).'</td>
|
|
</tr>'
|
|
);
|
|
|
|
}
|
|
|
|
$html->set_body('<tr class="spacer" height="1px"><td colspan="5"></td></tr><tr class="foot" height="15px"><td colspan="5"></td></tr>');
|
|
|
|
}
|
|
|
|
if($a==$b) {
|
|
|
|
$html->set_body('<tr><td colspan="4" style="text-align: center;"><b>'.$no_result[$lang].'</b></td></tr>');
|
|
|
|
}
|
|
|
|
$html->set_body('</table>');
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// if user input is empty:
|
|
$html->set_body('<br><br><center><b>'.$search1[$lang].'</b></center><br><br><br><br>');
|
|
|
|
}
|
|
|
|
require_once("footer.php");
|
|
?>
|