2012-02-08 23:14:28 +01:00
< ? php
class ModelSearchSearch extends Model {
2012-09-06 15:27:20 +02:00
public function search_messages ( $data = array (), $page = 0 ) {
2012-02-08 23:14:28 +01:00
$one_page_of_ids = array ();
$total_hits = 0 ;
2013-12-23 12:12:18 +01:00
$total_found = 0 ;
2012-02-08 23:14:28 +01:00
$sort = " sent " ;
$order = " DESC " ;
$sortorder = " ORDER BY sent DESC " ;
$cache_key = " " ;
$q = " " ;
$s = " " ;
2012-03-10 14:52:50 +01:00
$all_ids_csv = " " ;
2012-02-08 23:14:28 +01:00
2013-09-30 16:40:01 +02:00
$session = Registry :: get ( 'session' );
2012-02-08 23:14:28 +01:00
while ( list ( $k , $v ) = each ( $data )) {
2013-10-05 11:34:06 +02:00
if ( $v ) { if ( is_array ( $v )) { $v = implode ( " " , $v ); } $s .= '&' . $k . '=' . $v ; }
2012-02-08 23:14:28 +01:00
}
if ( $s ) { $s = substr ( $s , 1 , strlen ( $s )); }
AUDIT ( ACTION_SEARCH , '' , '' , 0 , $s );
if ( $data [ 'sort' ] == " sent " ) { $sort = " sent " ; }
if ( $data [ 'sort' ] == " size " ) { $sort = " size " ; }
if ( $data [ 'sort' ] == " from " ) { $sort = " from " ; }
if ( $data [ 'sort' ] == " subj " ) { $sort = " subject " ; }
if ( $data [ 'order' ] == 1 ) { $order = " ASC " ; }
$sortorder = " ORDER BY ` $sort ` $order " ;
$m = array ();
if ( MEMCACHED_ENABLED ) {
$cache_key = $this -> make_cache_file_name ( $data , $sortorder );
$memcache = Registry :: get ( 'memcache' );
$m = $memcache -> get ( $cache_key );
}
if ( isset ( $m [ 'ids' ])) {
$all_ids = $m [ 'ids' ];
2013-12-23 12:12:18 +01:00
$total_found = $m [ 'total_found' ];
2012-02-08 23:14:28 +01:00
} else {
2012-06-21 10:53:42 +02:00
if ( isset ( $data [ 'ref' ]) && $data [ 'ref' ]){
2013-12-23 12:12:18 +01:00
list ( $total_found , $all_ids ) = $this -> query_all_possible_IDs_by_reference ( $data [ 'ref' ], $cache_key );
2012-02-08 23:14:28 +01:00
}
else {
2013-12-23 12:12:18 +01:00
list ( $total_found , $all_ids ) = $this -> query_all_possible_IDs ( $data , $sort , $order , $sortorder , $cache_key );
2012-02-10 14:06:00 +01:00
}
2012-02-08 23:14:28 +01:00
}
$total_hits = count ( $all_ids );
2012-09-06 15:27:20 +02:00
2012-02-08 23:14:28 +01:00
2013-09-30 16:40:01 +02:00
if ( $total_hits > 0 ) {
$session -> set ( 'last_search' , serialize ( $all_ids ));
} else {
$session -> set ( 'last_search' , '' );
}
2012-02-08 23:14:28 +01:00
$data [ 'page_len' ] = get_page_length ();
if ( $total_hits > 0 ) {
$i = 0 ;
foreach ( $all_ids as $id ) {
if ( $i >= $data [ 'page_len' ] * $page && $i < $data [ 'page_len' ] * ( $page + 1 ) ) {
array_push ( $one_page_of_ids , $id );
2012-03-10 14:52:50 +01:00
$all_ids_csv .= " , $id " ;
2012-02-08 23:14:28 +01:00
if ( $q ) { $q .= " ,? " ; } else { $q = " ? " ; }
}
$i ++ ;
}
}
2012-09-06 15:27:20 +02:00
$all_ids_csv = substr ( $all_ids_csv , 1 , strlen ( $all_ids_csv ));
2013-12-23 12:12:18 +01:00
return array ( $total_hits , $total_found , $all_ids_csv , $this -> get_meta_data ( $one_page_of_ids , $q , $sortorder ));
2012-02-08 23:14:28 +01:00
}
2013-10-05 11:34:06 +02:00
private function assemble_email_address_filter () {
$session = Registry :: get ( 'session' );
2012-02-08 23:14:28 +01:00
2013-10-05 11:34:06 +02:00
if ( Registry :: get ( 'auditor_user' ) == 1 ) {
2013-01-05 16:42:36 +01:00
2013-10-05 11:34:06 +02:00
if ( RESTRICTED_AUDITOR == 1 ) {
$session_domains = $this -> fix_email_address_for_sphinx ( $session -> get ( 'auditdomains' ));
2013-01-05 16:42:36 +01:00
2013-10-05 11:34:06 +02:00
$sd = $this -> fix_email_address_for_sphinx ( $session -> get ( 'domain' ));
2012-02-08 23:14:28 +01:00
2013-10-05 11:34:06 +02:00
foreach ( $session_domains as $d ) { $sd .= '|' . $d ; }
2012-11-26 21:12:28 +01:00
2013-10-05 11:34:06 +02:00
$sd = preg_replace ( " /^ \ |/ " , " " , $sd );
2012-11-26 21:12:28 +01:00
2013-11-15 11:46:29 +01:00
return " (@todomain $sd | @fromdomain $sd ) " ;
2012-11-26 21:12:28 +01:00
}
2013-10-05 11:34:06 +02:00
else { return " " ; }
2012-09-06 15:27:20 +02:00
}
2012-02-08 23:14:28 +01:00
2013-10-05 11:34:06 +02:00
if ( ENABLE_FOLDER_RESTRICTIONS == 1 ) { return " " ; }
2012-02-08 23:14:28 +01:00
2013-10-05 11:34:06 +02:00
$all_your_addresses = $this -> get_all_your_address ();
return " (@from $all_your_addresses | @to $all_your_addresses ) " ;
2012-09-06 15:27:20 +02:00
}
private function query_all_possible_IDs ( $data = array (), $sort = 'sent' , $order = 'DESC' , $sortorder = '' , $cache_key = '' ) {
$ids = array ();
$__folders = array ();
$match = '' ;
$direction = $attachment = $size = $folders = '' ;
$tag_id_list = '' ;
$a = " " ;
2013-09-09 15:06:44 +02:00
$id = " " ;
2013-10-05 11:34:06 +02:00
$fields = array ( " @(subject,body) " , " @from " , " @to " , " @subject " , " @body " , " @attachment_types " );
2012-02-08 23:14:28 +01:00
2013-10-05 11:34:06 +02:00
$emailfilter = $this -> assemble_email_address_filter ();
2012-02-08 23:14:28 +01:00
2013-11-18 19:24:33 +01:00
$session = Registry :: get ( 'session' );
2012-02-08 23:14:28 +01:00
2013-10-05 11:34:06 +02:00
$i = 0 ;
while ( list ( $k , $v ) = each ( $data [ 'match' ])) {
if ( $v == " @attachment_types " ) {
list ( $k , $v ) = each ( $data [ 'match' ]);
$i ++ ;
if ( $v == " any " ) {
$data [ 'match' ][ $i - 1 ] = " " ;
$data [ 'match' ][ $i ] = " " ;
$a = " attachments > 0 AND " ;
}
}
if ( substr ( $v , 0 , 7 ) == " http:// " ) { $v = preg_replace ( " / \ ./ " , " X " , $v ); $data [ 'match' ][ $i ] = preg_replace ( " /http \ : \ / \ // " , " __URL__ " , $v ); }
if ( ! in_array ( $v , $fields ) && $i > 0 && strchr ( $v , " @ " )) {
2012-02-08 23:14:28 +01:00
2013-10-05 11:34:06 +02:00
if ( substr ( $v , 0 , 1 ) == " @ " ) {
$v = substr ( $v , 1 , strlen ( $v ) - 1 );
if ( $data [ 'match' ][ $i - 1 ] == " @from " ) { $data [ 'match' ][ $i - 1 ] = " @fromdomain " ; }
if ( $data [ 'match' ][ $i - 1 ] == " @to " ) { $data [ 'match' ][ $i - 1 ] = " @todomain " ; }
}
$data [ 'match' ][ $i ] = $this -> fix_email_address_for_sphinx ( $v );
}
$i ++ ;
}
2012-02-08 23:14:28 +01:00
2013-10-05 11:34:06 +02:00
$match = implode ( " " , $data [ 'match' ]);
2012-02-08 23:14:28 +01:00
2013-10-05 11:34:06 +02:00
if ( $emailfilter ) {
if ( strlen ( $match ) > 2 ) { $match = " ( $match ) & $emailfilter " ; }
else { $match = $emailfilter ; }
2012-09-06 15:27:20 +02:00
}
2012-02-08 23:14:28 +01:00
2013-10-07 15:43:50 +02:00
if ( $match == " " ) { $match = " " ; }
2012-02-08 23:14:28 +01:00
if ( $data [ 'sort' ] == 'from' || $data [ 'sort' ] == 'subj' ) { $sortorder = '' ; }
$date = fixup_date_condition ( 'sent' , $data [ 'date1' ], $data [ 'date2' ]);
if ( $date ) { $date .= " AND " ; }
if ( isset ( $data [ 'direction' ]) && $data [ 'direction' ] != '' ) { $direction = " direction = " . $data [ 'direction' ] . " AND " ; }
if ( isset ( $data [ 'size' ]) && $data [ 'size' ]) {
$data [ 'size' ] = preg_replace ( " / \ s/ " , " " , $data [ 'size' ]);
if ( preg_match ( " /^( \ >| \ <) \ = { 0,} \ d { 1,} $ / " , $data [ 'size' ])) { $size = " size " . $data [ 'size' ] . " AND " ; }
}
2013-08-02 15:50:15 +02:00
if ( isset ( $data [ 'attachment_type' ]) && strstr ( $data [ 'attachment_type' ], 'any' )) { $a = " attachments > 0 AND " ; }
2012-09-06 15:27:20 +02:00
else if ( isset ( $data [ 'has_attachment' ]) && $data [ 'has_attachment' ] == 1 ) { $attachment = " attachments > 0 AND " ; }
2012-02-08 23:14:28 +01:00
2013-09-09 15:10:30 +02:00
if ( isset ( $data [ 'id' ]) && $data [ 'id' ]) {
2013-09-09 15:06:44 +02:00
$data [ 'id' ] = preg_replace ( " / / " , " , " , substr ( $data [ 'id' ], 1 , strlen ( $data [ 'id' ])));
$id = " id IN ( " . $data [ 'id' ] . " ) AND " ;
}
2012-09-06 15:27:20 +02:00
if ( ENABLE_FOLDER_RESTRICTIONS == 1 ) {
$s = explode ( " " , $data [ 'folders' ]);
while ( list ( $k , $v ) = each ( $s )) {
2013-11-18 19:24:33 +01:00
if ( in_array ( $v , $session -> get ( " folders " ))) {
2012-09-06 15:27:20 +02:00
array_push ( $__folders , $v );
}
2012-02-08 23:14:28 +01:00
}
2012-09-14 11:04:17 +02:00
if ( count ( $__folders ) > 0 ) {
$folders = " folder IN ( " . implode ( " , " , $__folders ) . " ) AND " ;
}
2013-03-31 14:50:21 +02:00
else {
2013-11-18 19:24:33 +01:00
$folders = " folder IN ( " . implode ( " , " , $session -> get ( " folders " )) . " ) AND " ;
2013-03-31 14:50:21 +02:00
}
2012-09-06 15:27:20 +02:00
}
if ( isset ( $data [ 'tag' ]) && $data [ 'tag' ]) {
$id_list = $this -> get_sphinx_id_list ( $data [ 'tag' ], SPHINX_TAG_INDEX , 'tag' );
2013-03-18 14:43:24 +01:00
$query = $this -> sphx -> query ( " SELECT id FROM " . SPHINX_MAIN_INDEX . " WHERE $folders id IN ( $id_list ) $sortorder LIMIT 0, " . MAX_SEARCH_HITS . " OPTION max_matches= " . MAX_SEARCH_HITS );
2012-09-06 15:27:20 +02:00
}
else if ( isset ( $data [ 'note' ]) && $data [ 'note' ]) {
$id_list = $this -> get_sphinx_id_list ( $data [ 'note' ], SPHINX_NOTE_INDEX , 'note' );
2013-03-18 14:43:24 +01:00
$query = $this -> sphx -> query ( " SELECT id FROM " . SPHINX_MAIN_INDEX . " WHERE $folders id IN ( $id_list ) $sortorder LIMIT 0, " . MAX_SEARCH_HITS . " OPTION max_matches= " . MAX_SEARCH_HITS );
2012-02-10 14:06:00 +01:00
}
2012-09-15 15:30:35 +02:00
else if ( ENABLE_FOLDER_RESTRICTIONS == 1 && isset ( $data [ 'extra_folders' ]) && $data [ 'extra_folders' ]) {
$ids_in_extra_folders = $this -> get_sphinx_id_list_by_extra_folders ( $data [ 'extra_folders' ]);
2013-09-09 15:06:44 +02:00
$query = $this -> sphx -> query ( " SELECT id FROM " . SPHINX_MAIN_INDEX . " WHERE $a $id $date $attachment $direction $size MATCH(' $match ') AND id IN ( $ids_in_extra_folders ) $sortorder LIMIT 0, " . MAX_SEARCH_HITS . " OPTION max_matches= " . MAX_SEARCH_HITS );
2012-09-15 15:30:35 +02:00
}
2012-02-10 14:06:00 +01:00
else {
2013-09-09 15:06:44 +02:00
$query = $this -> sphx -> query ( " SELECT id FROM " . SPHINX_MAIN_INDEX . " WHERE $a $id $date $attachment $direction $size $folders MATCH(' $match ') $sortorder LIMIT 0, " . MAX_SEARCH_HITS . " OPTION max_matches= " . MAX_SEARCH_HITS );
2012-02-08 23:14:28 +01:00
}
2013-12-23 12:12:18 +01:00
$total_found = $query -> total_found ;
if ( ENABLE_SYSLOG == 1 ) { syslog ( LOG_INFO , sprintf ( " sphinx query: '%s' in %.2f s, %d hits, %d total found " , $query -> query , $query -> exec_time , $query -> num_rows , $total_found )); }
2012-02-08 23:14:28 +01:00
/*
* build an id list
*/
$q = " " ;
2012-07-06 15:02:23 +02:00
if ( isset ( $query -> rows )) {
foreach ( $query -> rows as $a ) {
array_push ( $ids , $a [ 'id' ]);
2012-02-08 23:14:28 +01:00
2012-07-06 15:02:23 +02:00
if ( $q ) { $q .= " ,? " ; }
else { $q = " ? " ; }
}
2012-02-08 23:14:28 +01:00
}
/*
* if the query was requested to be sorted by sender or subject , then sphinx cannot do
* that , so we assemble the list of all sphinx IDs matching the query
*/
if ( $data [ 'sort' ] == 'from' || $data [ 'sort' ] == 'subj' ) {
2013-12-23 12:12:18 +01:00
$fs_query = $this -> db -> query ( " SELECT id FROM " . TABLE_META . " WHERE id IN ( $q ) ORDER BY ` $sort ` $order " , $ids );
2012-02-08 23:14:28 +01:00
$ids = array ();
2013-12-23 12:12:18 +01:00
foreach ( $fs_query -> rows as $q ) {
2012-02-08 23:14:28 +01:00
array_push ( $ids , $q [ 'id' ]);
}
}
if ( MEMCACHED_ENABLED && $cache_key ) {
$memcache = Registry :: get ( 'memcache' );
2013-12-23 12:12:18 +01:00
$memcache -> add ( $cache_key , array ( 'ts' => time (), 'total_hits' => count ( $ids ), 'ids' => $ids , 'total_found' => $total_found ), 0 , MEMCACHED_TTL );
2012-02-08 23:14:28 +01:00
}
2013-12-23 12:12:18 +01:00
return array ( $total_found , $ids );
2012-02-08 23:14:28 +01:00
}
2012-02-10 14:06:00 +01:00
private function query_all_possible_IDs_by_reference ( $reference = '' , $cache_key = '' ) {
$ids = array ();
if ( $reference == '' ) { return $ids ; }
2013-11-18 19:24:33 +01:00
$session = Registry :: get ( 'session' );
2012-02-10 14:06:00 +01:00
$query = $this -> db -> query ( " SELECT id FROM " . TABLE_META . " WHERE message_id=? OR reference=? ORDER BY id DESC " , array ( $reference , $reference ));
foreach ( $query -> rows as $q ) {
array_push ( $ids , $q [ 'id' ]);
}
2012-09-06 15:27:20 +02:00
if ( ENABLE_FOLDER_RESTRICTIONS == 1 ) {
$query = $this -> sphx -> query ( " SELECT id, folder FROM " . SPHINX_MAIN_INDEX . " WHERE id IN ( " . implode ( " , " , $ids ) . " ) " );
$ids = array ();
foreach ( $query -> rows as $q ) {
2013-11-18 19:24:33 +01:00
if ( isset ( $q [ 'folder' ]) && in_array ( $q [ 'folder' ], $session -> get ( " folders " ))) { array_push ( $ids , $q [ 'id' ]); }
2012-09-06 15:27:20 +02:00
}
}
2013-12-23 12:12:18 +01:00
$total_found = count ( $ids );
2012-09-06 15:27:20 +02:00
2012-02-10 14:06:00 +01:00
if ( MEMCACHED_ENABLED && $cache_key ) {
$memcache = Registry :: get ( 'memcache' );
2013-12-23 12:12:18 +01:00
$memcache -> add ( $cache_key , array ( 'ts' => time (), 'total_hits' => count ( $ids ), 'total_found' => $total_found , 'ids' => $ids ), 0 , MEMCACHED_TTL );
2012-02-10 14:06:00 +01:00
}
2013-12-23 12:12:18 +01:00
return array ( $total_found , $ids );
2012-02-10 14:06:00 +01:00
}
2014-01-23 21:39:47 +01:00
public function preprocess_post_expert_request ( $data = array ()) {
$token = 'match' ;
$ndate = 0 ;
$match = array ();
$a = array (
'date1' => '' ,
'date2' => '' ,
'direction' => '' ,
'size' => '' ,
'attachment_type' => '' ,
'tag' => '' ,
'note' => '' ,
'ref' => '' ,
'folders' => '' ,
'extra_folders' => '' ,
'id' => '' ,
'match' => array ()
);
if ( ! isset ( $data [ 'search' ])) { return $a ; }
$s = preg_replace ( " /:/ " , " : " , $data [ 'search' ]);
$s = preg_replace ( " /,/ " , " " , $s );
$s = preg_replace ( " / \ (/ " , " ( " , $s );
$s = preg_replace ( " / \ )/ " , " ) " , $s );
$s = preg_replace ( " /OR/ " , " | " , $s );
$s = preg_replace ( " /AND/ " , " " , $s );
$s = preg_replace ( " / \ s { 1,}/ " , " " , $s );
$b = explode ( " " , $s );
while ( list ( $k , $v ) = each ( $b )) {
if ( $v == '' ) { continue ; }
if ( $v == 'from:' ) { $token = 'match' ; $a [ 'match' ][] = '@from' ; continue ; }
else if ( $v == 'to:' ) { $token = 'match' ; $a [ 'match' ][] = '@to' ; continue ; }
else if ( $v == 'subject:' ) { $token = 'match' ; $a [ 'match' ][] = '@subject' ; continue ; }
else if ( $v == 'body:' ) { $token = 'match' ; $a [ 'match' ][] = '@body' ; continue ; }
else if ( $v == 'direction:' || $v == 'd:' ) { $token = 'direction' ; continue ; }
else if ( $v == 'size:' ) { $token = 'size' ; continue ; }
else if ( $v == 'date1:' ) { $token = 'date1' ; continue ; }
else if ( $v == 'date2:' ) { $token = 'date2' ; continue ; }
else if ( $v == 'attachment:' || $v == 'a:' ) { $token = 'match' ; $a [ 'match' ][] = '@attachment_types' ; continue ; }
else if ( $v == 'size' ) { $token = 'size' ; continue ; }
else if ( $v == 'tag:' ) { $token = 'tag' ; continue ; }
else if ( $v == 'note:' ) { $token = 'note' ; continue ; }
else if ( $v == 'ref:' ) { $token = 'ref' ; continue ; }
else if ( $v == 'id:' ) { $token = 'id' ; continue ; }
else {
if ( preg_match ( " / \ d { 4} \ - \ d { 1,2} \ - \ d { 1,2}/ " , $v ) || preg_match ( " / \ d { 1,2} \ / \ d { 1,2} \ / \ d { 4}/ " , $v )) {
$ndate ++ ;
$a [ " date $ndate " ] = $v ;
}
}
if ( $token == 'match' ) { $a [ 'match' ][] = $v ; }
else if ( $token == 'date1' ) { $a [ 'date1' ] = ' ' . $v ; }
else if ( $token == 'date2' ) { $a [ 'date2' ] = ' ' . $v ; }
else if ( $token == 'tag' ) { $a [ 'tag' ] .= ' ' . $v ; }
else if ( $token == 'note' ) { $a [ 'note' ] .= ' ' . $v ; }
else if ( $token == 'ref' ) { $a [ 'ref' ] = ' ' . $v ; }
else if ( $token == 'id' ) { $a [ 'id' ] .= ' ' . $v ; }
else if ( $token == 'direction' ) {
if ( $v == 'inbound' ) { $a [ 'direction' ] = " 0 " ; }
else if ( $v == 'outbound' ) { $a [ 'direction' ] = 2 ; }
else if ( $v == 'internal' ) { $a [ 'direction' ] = 1 ; }
}
else if ( $token == 'size' ) {
$o = substr ( $v , 0 , 1 );
if ( $o == '<' || $o == '>' ) {
$v = substr ( $v , 1 , strlen ( $v ));
$o1 = substr ( $v , 0 , 1 );
if ( $o1 == '=' ) {
$v = substr ( $v , 1 , strlen ( $v ));
$o .= $o1 ;
}
}
else { $o = '' ; }
$s = explode ( " k " , $v );
if ( $s [ 0 ] != $v ) { $v = $s [ 0 ] * 1000 ; }
$s = explode ( " M " , $v );
if ( $s [ 0 ] != $v ) { $v = $s [ 0 ] * 1000000 ; }
$a [ 'size' ] .= ' ' . $o . $v ;
}
}
$a [ 'sort' ] = $data [ 'sort' ];
$a [ 'order' ] = $data [ 'order' ];
return $a ;
}
2012-09-06 15:27:20 +02:00
private function get_sphinx_id_list ( $s = '' , $sphx_table = '' , $field = '' ) {
$id_list = '' ;
2013-11-18 19:24:33 +01:00
$session = Registry :: get ( 'session' );
2012-09-06 15:27:20 +02:00
$s = $this -> fixup_sphinx_operators ( $s );
2013-11-18 19:24:33 +01:00
$q = $this -> sphx -> query ( " SELECT id FROM $sphx_table WHERE uid= " . $session -> get ( " uid " ) . " AND MATCH('@ $field $s ') " );
2012-09-06 15:27:20 +02:00
foreach ( $q -> rows as $a ) {
$id_list .= " , " . $a [ 'id' ];
}
if ( $id_list ) { $id_list = substr ( $id_list , 1 , strlen ( $id_list )); }
return $id_list ;
}
2012-09-15 15:30:35 +02:00
private function get_sphinx_id_list_by_extra_folders ( $extra_folders = '' ) {
$id_list = '' ;
$q = '' ;
$__folders = array ();
2013-11-18 19:24:33 +01:00
$session = Registry :: get ( 'session' );
2012-09-15 15:30:35 +02:00
$s = explode ( " " , $extra_folders );
while ( list ( $k , $v ) = each ( $s )) {
2013-11-18 19:24:33 +01:00
if ( in_array ( $v , $session -> get ( " extra_folders " )) && is_numeric ( $v )) {
2012-09-15 15:30:35 +02:00
array_push ( $__folders , $v );
if ( $q ) { $q .= " ,? " ; }
else { $q = " ? " ; }
}
}
$q = $this -> db -> query ( " SELECT id FROM " . TABLE_FOLDER_MESSAGE . " WHERE folder_id IN ( $q ) " , $__folders );
foreach ( $q -> rows as $a ) {
$id_list .= " , " . $a [ 'id' ];
}
if ( $id_list ) { $id_list = substr ( $id_list , 1 , strlen ( $id_list )); }
return $id_list ;
}
2012-02-08 23:14:28 +01:00
private function get_meta_data ( $ids = array (), $q = '' , $sortorder = '' ) {
$messages = array ();
2013-01-14 14:46:34 +01:00
$rcpt = $srcpt = array ();
2012-02-08 23:14:28 +01:00
$tag = array ();
2012-09-06 15:27:20 +02:00
$note = array ();
2012-02-08 23:14:28 +01:00
if ( count ( $ids ) == 0 ) return $messages ;
2012-12-04 22:34:15 +01:00
if ( MEMCACHED_ENABLED ) {
$cache_key = $this -> make_cache_file_name ( $ids , 'meta' );
$memcache = Registry :: get ( 'memcache' );
$m = $memcache -> get ( $cache_key );
if ( isset ( $m [ 'meta' ])) { return unserialize ( $m [ 'meta' ]); }
}
2012-02-08 23:14:28 +01:00
2013-11-18 19:24:33 +01:00
$session = Registry :: get ( 'session' );
2013-01-14 14:46:34 +01:00
$query = $this -> db -> query ( " SELECT `id`, `to` FROM ` " . TABLE_RCPT . " ` WHERE `id` IN ( $q ) " , $ids );
if ( isset ( $query -> rows )) {
foreach ( $query -> rows as $r ) {
if ( ! isset ( $rcpt [ $r [ 'id' ]])) {
$srcpt [ $r [ 'id' ]] = $r [ 'to' ];
2013-01-31 22:20:50 +01:00
$rcpt [ $r [ 'id' ]] = $r [ 'to' ];
2013-01-14 14:46:34 +01:00
}
else {
$rcpt [ $r [ 'id' ]] .= " , \n " . $r [ 'to' ];
}
}
}
2012-12-04 22:34:15 +01:00
$query = $this -> db -> query ( " SELECT `id`, `from`, `subject`, `piler_id`, `reference`, `size`, `spam`, `sent`, `arrived`, `attachments` FROM ` " . TABLE_META . " ` WHERE `id` IN ( $q ) $sortorder " , $ids );
2012-02-08 23:14:28 +01:00
if ( isset ( $query -> rows )) {
2013-11-18 19:24:33 +01:00
array_unshift ( $ids , ( int ) $session -> get ( " uid " ));
2012-04-27 14:39:10 +02:00
$tags = $this -> db -> query ( " SELECT `id`, `tag` FROM ` " . TABLE_TAG . " ` WHERE `uid`=? AND `id` IN ( $q ) " , $ids );
2012-02-08 23:14:28 +01:00
foreach ( $tags -> rows as $t ) {
$tag [ $t [ 'id' ]] = $t [ 'tag' ];
}
2012-09-06 15:27:20 +02:00
$notes = $this -> db -> query ( " SELECT `id`, `note` FROM " . TABLE_NOTE . " WHERE `uid`=? AND `id` IN ( $q ) " , $ids );
foreach ( $notes -> rows as $n ) {
$note [ $n [ 'id' ]] = $n [ 'note' ];
}
2012-02-08 23:14:28 +01:00
$lang = Registry :: get ( 'language' );
2013-04-09 15:02:10 +02:00
$this -> model_search_message -> connect_to_pilergetd ();
2012-02-08 23:14:28 +01:00
foreach ( $query -> rows as $m ) {
$m [ 'shortfrom' ] = make_short_string ( $m [ 'from' ], MAX_CGI_FROM_SUBJ_LEN );
2013-02-11 20:24:19 +01:00
$m [ 'from' ] = escape_gt_lt_quote_symbols ( $m [ 'from' ]);
isset ( $srcpt [ $m [ 'id' ]]) ? $m [ 'shortto' ] = $srcpt [ $m [ 'id' ]] : $m [ 'shortto' ] = '' ;
isset ( $rcpt [ $m [ 'id' ]]) ? $m [ 'to' ] = $rcpt [ $m [ 'id' ]] : $m [ 'to' ] = '' ;
$m [ 'to' ] = escape_gt_lt_quote_symbols ( $m [ 'to' ]);
2012-02-08 23:14:28 +01:00
2013-01-14 14:46:34 +01:00
2012-02-08 23:14:28 +01:00
if ( $m [ 'subject' ] == " " ) { $m [ 'subject' ] = " < " . $lang -> data [ 'text_no_subject' ] . " > " ; }
$m [ 'subject' ] = escape_gt_lt_quote_symbols ( $m [ 'subject' ]);
$m [ 'shortsubject' ] = make_short_string ( $m [ 'subject' ], MAX_CGI_FROM_SUBJ_LEN );
2013-07-28 20:56:59 +02:00
$m [ 'date' ] = date ( DATE_TEMPLATE , $m [ 'sent' ]);
2012-02-08 23:14:28 +01:00
$m [ 'size' ] = nice_size ( $m [ 'size' ]);
2013-11-18 19:24:33 +01:00
in_array ( $m [ 'from' ], $session -> get ( " emails " )) ? $m [ 'yousent' ] = 1 : $m [ 'yousent' ] = 0 ;
2013-06-29 17:03:23 +02:00
2012-02-08 23:14:28 +01:00
/*
* verifying 20 messages takes some time , still it ' s useful
*/
if ( ENABLE_ON_THE_FLY_VERIFICATION == 1 ) {
2013-10-30 23:40:34 +01:00
$data = $this -> model_search_message -> get_raw_message ( $m [ 'piler_id' ]);
$m [ 'verification' ] = $this -> model_search_message -> verify_message ( $m [ 'piler_id' ], $data );
$data = '' ;
2012-02-08 23:14:28 +01:00
}
if ( isset ( $tag [ $m [ 'id' ]])) { $m [ 'tag' ] = $tag [ $m [ 'id' ]]; } else { $m [ 'tag' ] = '' ; }
2012-09-06 15:27:20 +02:00
if ( isset ( $note [ $m [ 'id' ]])) { $m [ 'note' ] = $note [ $m [ 'id' ]]; } else { $m [ 'note' ] = '' ; }
2012-02-08 23:14:28 +01:00
2013-04-06 11:32:17 +02:00
$m [ 'note' ] = preg_replace ( " / \" / " , " * " , strip_tags ( $m [ 'note' ]));
$m [ 'tag' ] = preg_replace ( " / \" / " , " * " , strip_tags ( $m [ 'tag' ]));
2013-02-11 20:24:19 +01:00
2012-02-08 23:14:28 +01:00
array_push ( $messages , $m );
}
2013-04-09 15:02:10 +02:00
$this -> model_search_message -> disconnect_from_pilergetd ();
2012-02-08 23:14:28 +01:00
}
2012-12-04 22:34:15 +01:00
if ( MEMCACHED_ENABLED ) {
$memcache -> add ( $cache_key , array ( 'meta' => serialize ( $messages )), 0 , MEMCACHED_TTL );
}
2012-02-08 23:14:28 +01:00
return $messages ;
}
public function get_message_recipients ( $id = '' ) {
$rcpt = array ();
2012-08-12 15:09:13 +02:00
$domains = array ();
2012-02-08 23:14:28 +01:00
2012-06-25 22:14:30 +02:00
if ( Registry :: get ( 'auditor_user' ) == 0 ) { return $rcpt ; }
2012-02-08 23:14:28 +01:00
2012-08-12 15:09:13 +02:00
$query = $this -> db -> query ( " SELECT `domain` FROM " . TABLE_DOMAIN );
foreach ( $query -> rows as $q ) {
array_push ( $domains , $q [ 'domain' ]);
}
2012-09-06 15:27:20 +02:00
$query = $this -> db -> query ( " SELECT `to` FROM " . VIEW_MESSAGES . " WHERE id=? " , array ( $id ));
2012-02-08 23:14:28 +01:00
foreach ( $query -> rows as $q ) {
2012-08-12 15:09:13 +02:00
$mydomain = 0 ;
foreach ( $domains as $domain ) {
if ( preg_match ( " / \ @ $domain $ / " , $q [ 'to' ])) { $mydomain = 1 ; break ; }
}
if ( $mydomain == 1 ) {
array_push ( $rcpt , $q [ 'to' ]);
}
2012-02-08 23:14:28 +01:00
}
return $rcpt ;
}
2012-12-20 14:11:17 +01:00
public function get_message_addresses_in_my_domain ( $id = '' ) {
$addr = array ();
$domains = array ();
if ( Registry :: get ( 'auditor_user' ) == 0 ) { return $addr ; }
$query = $this -> db -> query ( " SELECT `domain` FROM " . TABLE_DOMAIN );
foreach ( $query -> rows as $q ) {
array_push ( $domains , $q [ 'domain' ]);
}
$query = $this -> db -> query ( " SELECT `from`, `to` FROM " . VIEW_MESSAGES . " WHERE id=? " , array ( $id ));
2013-02-11 20:24:19 +01:00
if ( isset ( $query -> row [ 'from' ])) {
2012-12-20 14:11:17 +01:00
foreach ( $domains as $domain ) {
if ( preg_match ( " / \ @ $domain $ / " , $query -> row [ 'from' ])) { array_push ( $addr , $query -> row [ 'from' ]); }
}
}
foreach ( $query -> rows as $q ) {
$mydomain = 0 ;
foreach ( $domains as $domain ) {
if ( preg_match ( " / \ @ $domain $ / " , $q [ 'to' ])) { $mydomain = 1 ; break ; }
}
if ( $mydomain == 1 ) {
2012-12-22 20:47:42 +01:00
if ( ! in_array ( $q [ 'to' ], $addr )) { array_push ( $addr , $q [ 'to' ]); }
2012-12-20 14:11:17 +01:00
}
}
return $addr ;
}
2012-02-08 23:14:28 +01:00
private function get_all_your_address () {
$s = '' ;
2013-11-18 19:24:33 +01:00
$session = Registry :: get ( 'session' );
$emails = $session -> get ( " emails " );
while ( list ( $k , $v ) = each ( $emails )) {
2012-02-08 23:14:28 +01:00
if ( $s ) { $s .= '| ' . $this -> fix_email_address_for_sphinx ( $v ); }
else { $s = $this -> fix_email_address_for_sphinx ( $v ); }
}
return $s ;
}
2012-09-06 15:27:20 +02:00
public function check_your_permission_by_id ( $id = '' ) {
2012-02-08 23:14:28 +01:00
$q = '' ;
$arr = $a = array ();
if ( $id == '' ) { return 0 ; }
2012-11-26 21:12:28 +01:00
if ( Registry :: get ( 'auditor_user' ) == 1 && RESTRICTED_AUDITOR == 0 ) { return 1 ; }
2012-02-08 23:14:28 +01:00
2013-11-18 19:24:33 +01:00
$session = Registry :: get ( 'session' );
2012-02-08 23:14:28 +01:00
array_push ( $arr , $id );
2012-11-26 21:12:28 +01:00
if ( Registry :: get ( 'auditor_user' ) == 1 && RESTRICTED_AUDITOR == 1 ) {
2013-11-18 19:24:33 +01:00
if ( validdomain ( $session -> get ( " domain " )) == 1 ) {
2013-02-16 13:54:41 +01:00
$q .= " ,? " ;
2013-11-18 19:24:33 +01:00
array_push ( $a , $session -> get ( " domain " ));
2013-02-16 13:54:41 +01:00
}
2013-11-18 19:24:33 +01:00
$auditdomains = $session -> get ( " auditdomains " );
while ( list ( $k , $v ) = each ( $auditdomains )) {
2013-02-16 13:54:41 +01:00
if ( validdomain ( $v ) == 1 && ! in_array ( $v , $a )) {
2013-01-05 16:42:36 +01:00
$q .= " ,? " ;
array_push ( $a , $v );
}
}
2012-11-26 21:12:28 +01:00
}
else {
2013-11-18 19:24:33 +01:00
$emails = $session -> get ( " emails " );
while ( list ( $k , $v ) = each ( $emails )) {
2012-11-26 21:12:28 +01:00
if ( validemail ( $v ) == 1 ) {
$q .= " ,? " ;
array_push ( $a , $v );
}
2012-02-08 23:14:28 +01:00
}
}
2013-01-05 16:42:36 +01:00
$q = preg_replace ( " /^ \ ,/ " , " " , $q );
2012-02-08 23:14:28 +01:00
$arr = array_merge ( $arr , $a , $a );
2012-09-06 15:27:20 +02:00
if ( ENABLE_FOLDER_RESTRICTIONS == 1 ) {
$query = $this -> sphx -> query ( " SELECT folder FROM " . SPHINX_MAIN_INDEX . " WHERE id= " . ( int ) $id );
2013-11-18 19:24:33 +01:00
if ( isset ( $query -> row [ 'folder' ]) && in_array ( $query -> row [ 'folder' ], $session -> get ( " folders " ))) { return 1 ; }
2012-09-06 15:27:20 +02:00
}
else {
2012-11-26 21:12:28 +01:00
if ( Registry :: get ( 'auditor_user' ) == 1 && RESTRICTED_AUDITOR == 1 ) {
$query = $this -> db -> query ( " SELECT id FROM " . VIEW_MESSAGES . " WHERE id=? AND ( `fromdomain` IN ( $q ) OR `todomain` IN ( $q ) ) " , $arr );
} else {
$query = $this -> db -> query ( " SELECT id FROM " . VIEW_MESSAGES . " WHERE id=? AND ( `from` IN ( $q ) OR `to` IN ( $q ) ) " , $arr );
}
2012-09-06 15:27:20 +02:00
if ( isset ( $query -> row [ 'id' ])) { return 1 ; }
}
2012-02-08 23:14:28 +01:00
return 0 ;
}
2012-03-10 14:52:50 +01:00
public function check_your_permission_by_id_list ( $id = array ()) {
$q = $q2 = '' ;
2012-09-06 15:27:20 +02:00
$arr = $a = $result = array ();
2012-03-10 14:52:50 +01:00
2012-09-06 15:27:20 +02:00
if ( count ( $id ) < 1 ) { return $result ; }
2012-03-10 14:52:50 +01:00
2013-11-18 19:24:33 +01:00
$session = Registry :: get ( 'session' );
2012-03-10 14:52:50 +01:00
$arr = $id ;
for ( $i = 0 ; $i < count ( $id ); $i ++ ) {
$q2 .= " ,? " ;
}
2012-09-06 15:27:20 +02:00
2012-03-10 14:52:50 +01:00
$q2 = preg_replace ( " /^ \ ,/ " , " " , $q2 );
2012-11-26 21:12:28 +01:00
if ( Registry :: get ( 'auditor_user' ) == 1 && RESTRICTED_AUDITOR == 1 ) {
2013-11-18 19:24:33 +01:00
if ( validdomain ( $session -> get ( " domain " )) == 1 ) {
2013-02-16 13:54:41 +01:00
$q .= " ,? " ;
2013-11-18 19:24:33 +01:00
array_push ( $a , $session -> get ( " domain " ));
2013-02-16 13:54:41 +01:00
}
2013-11-18 19:24:33 +01:00
$auditdomains = $session -> get ( " auditdomains " );
while ( list ( $k , $v ) = each ( $auditdomains )) {
2013-02-16 13:54:41 +01:00
if ( validdomain ( $v ) == 1 && ! in_array ( $v , $a )) {
2013-01-05 16:42:36 +01:00
$q .= " ,? " ;
array_push ( $a , $v );
}
}
2012-11-26 21:12:28 +01:00
}
else {
if ( Registry :: get ( 'auditor_user' ) == 0 ) {
2013-11-18 19:24:33 +01:00
$emails = $session -> get ( " emails " );
while ( list ( $k , $v ) = each ( $emails )) {
2012-11-26 21:12:28 +01:00
if ( validemail ( $v ) == 1 ) {
$q .= " ,? " ;
array_push ( $a , $v );
}
2012-08-07 22:38:06 +02:00
}
2012-03-10 14:52:50 +01:00
}
2012-11-26 21:12:28 +01:00
}
2012-08-07 22:38:06 +02:00
2013-01-05 16:42:36 +01:00
$q = preg_replace ( " /^ \ ,/ " , " " , $q );
2012-03-10 14:52:50 +01:00
2012-11-26 21:12:28 +01:00
if ( Registry :: get ( 'auditor_user' ) == 1 && RESTRICTED_AUDITOR == 0 ) {
2012-09-06 15:27:20 +02:00
$query = $this -> db -> query ( " SELECT id FROM ` " . TABLE_META . " ` WHERE `id` IN ( $q2 ) " , $arr );
2012-11-26 21:12:28 +01:00
}
else {
2012-03-10 14:52:50 +01:00
2012-09-06 15:27:20 +02:00
if ( ENABLE_FOLDER_RESTRICTIONS == 1 ) {
2012-09-11 14:56:01 +02:00
$query = $this -> sphx -> query ( " SELECT id, folder FROM " . SPHINX_MAIN_INDEX . " WHERE id IN ( " . implode ( " , " , $id ) . " ) " );
2012-09-06 15:27:20 +02:00
}
else {
$arr = array_merge ( $arr , $a , $a );
2012-11-26 21:12:28 +01:00
if ( Registry :: get ( 'auditor_user' ) == 1 && RESTRICTED_AUDITOR == 1 ) {
$query = $this -> db -> query ( " SELECT id FROM ` " . VIEW_MESSAGES . " ` WHERE `id` IN ( $q2 ) AND ( `fromdomain` IN ( $q ) OR `todomain` IN ( $q ) ) " , $arr );
} else {
$query = $this -> db -> query ( " SELECT id FROM ` " . VIEW_MESSAGES . " ` WHERE `id` IN ( $q2 ) AND ( `from` IN ( $q ) OR `to` IN ( $q ) ) " , $arr );
}
2012-09-06 15:27:20 +02:00
}
}
2012-03-10 14:52:50 +01:00
if ( $query -> num_rows > 0 ) {
foreach ( $query -> rows as $q ) {
2012-09-06 15:27:20 +02:00
if ( ENABLE_FOLDER_RESTRICTIONS == 1 ) {
2013-11-18 19:24:33 +01:00
if ( in_array ( $q [ 'folder' ], $session -> get ( " folders " ))) { array_push ( $result , $q [ 'id' ]); }
2012-09-06 15:27:20 +02:00
}
else {
array_push ( $result , $q [ 'id' ]);
}
2012-03-10 14:52:50 +01:00
}
}
2012-09-06 15:27:20 +02:00
return $result ;
2012-03-10 14:52:50 +01:00
}
2012-02-08 23:14:28 +01:00
private function fix_email_address_for_sphinx ( $email = '' ) {
2012-04-27 14:39:10 +02:00
$email = preg_replace ( " / \ |@/ " , " | " , $email );
2012-11-28 23:54:55 +01:00
return preg_replace ( " /[ \ @ \ . \ + \ - \ _]/ " , " X " , $email );
2012-02-08 23:14:28 +01:00
}
public function get_search_terms () {
2013-11-18 19:24:33 +01:00
$session = Registry :: get ( 'session' );
2012-02-08 23:14:28 +01:00
2013-11-18 19:24:33 +01:00
$query = $this -> db -> query ( " SELECT term, ts FROM " . TABLE_SEARCH . " WHERE email=? ORDER BY ts DESC " , array ( $session -> get ( " email " )));
2012-02-08 23:14:28 +01:00
if ( isset ( $query -> rows )) { return $query -> rows ; }
return array ();
}
public function add_search_term ( $term = '' ) {
if ( $term == '' ) { return 0 ; }
2013-11-18 19:24:33 +01:00
$session = Registry :: get ( 'session' );
2013-03-24 10:02:34 +01:00
parse_str ( $term , $s );
if ( ! isset ( $s [ 'search' ]) || $s [ 'search' ] == '' ) { return 0 ; }
2012-02-08 23:14:28 +01:00
if ( $this -> update_search_term ( $term ) == 0 ) {
AUDIT ( ACTION_SAVE_SEARCH , '' , '' , '' , $term );
2013-11-18 19:24:33 +01:00
$query = $this -> db -> query ( " INSERT INTO " . TABLE_SEARCH . " (email, ts, term) VALUES(?,?,?) " , array ( $session -> get ( " email " ), time (), $term ));
2012-02-08 23:14:28 +01:00
}
return 1 ;
}
public function update_search_term ( $term = '' ) {
if ( $term == '' ) { return 0 ; }
AUDIT ( ACTION_SEARCH , '' , '' , '' , $term );
2013-11-18 19:24:33 +01:00
$session = Registry :: get ( 'session' );
$query = $this -> db -> query ( " UPDATE " . TABLE_SEARCH . " SET ts=? WHERE term=? AND email=? " , array ( time (), $term , $session -> get ( " email " )));
2012-02-08 23:14:28 +01:00
return $this -> db -> countAffected ();
2013-07-27 13:10:48 +02:00
}
2013-08-01 22:28:42 +02:00
public function remove_search_term ( $ts = 0 ) {
2013-11-18 19:24:33 +01:00
$session = Registry :: get ( 'session' );
$query = $this -> db -> query ( " DELETE FROM " . TABLE_SEARCH . " WHERE email=? AND ts=? " , array ( $session -> get ( " email " ), $ts ));
2012-02-08 23:14:28 +01:00
}
2012-09-18 17:11:40 +02:00
private function fixup_meta_characters ( $s = '' ) {
if ( $s == '' ) { return $s ; }
$s = preg_replace ( " / \ '/ " , ' ' , $s );
2013-04-25 21:39:02 +02:00
$s = preg_replace ( " / \ ./ " , ' ' , $s );
2012-09-18 17:11:40 +02:00
return $s ;
}
2012-02-08 23:14:28 +01:00
private function fixup_sphinx_operators ( $s = '' ) {
if ( $s == '' ) { return $s ; }
$s = preg_replace ( " / OR / " , " | " , $s );
2012-02-10 14:06:00 +01:00
$s = preg_replace ( " /( \ -)/ " , " " , $s );
2012-09-06 15:27:20 +02:00
$s = preg_replace ( " / \ '/ " , '"' , $s );
2012-02-08 23:14:28 +01:00
$a = explode ( " " , $s );
$s = '' ;
while ( list ( $k , $v ) = each ( $a )) {
if ( substr ( $v , 0 , 4 ) == 'http' ) {
$v = preg_replace ( " /http(s) { 0,1} \ : \ / \ // " , " __URL__ " , $v );
$b = explode ( " / " , $v );
$s .= ' ' . $this -> fix_email_address_for_sphinx ( $b [ 0 ]);
}
else {
$s .= ' ' . $v ;
}
}
return $s ;
}
private function make_cache_file_name ( $data = array (), $sortorder = '' ) {
2013-10-28 13:57:16 +01:00
$s = '' ;
2013-11-18 19:24:33 +01:00
$session = Registry :: get ( 'session' );
2013-10-28 13:57:16 +01:00
while ( list ( $k , $v ) = each ( $data )) {
if ( $v ) {
if ( is_array ( $v )) { $v = join ( " * " , $v ); }
$s .= " * $k = $v " ;
}
}
2013-11-18 19:24:33 +01:00
return sha1 ( $session -> get ( " email " ) . " / " . $s . " - " . ( NOW - NOW % 3600 ) . " - " . $sortorder );
2012-02-08 23:14:28 +01:00
}
}
?>