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");
 | |
| ?>
 |