GetValue('search','display')); $entry['form'] = get_request('form','GET',false,get_request('form','SESSION')); $entry['orderby']['raw'] = get_request('orderby','GET'); $entry['orderby']['string'] = rawurldecode($entry['orderby']['raw']); $entry['orderby']['array'] = $entry['orderby']['raw'] ? explode(',',preg_replace('/\s+/','',$entry['orderby']['string'])) : true; $entry['display']['raw'] = get_request('display_attrs','GET'); $entry['display']['string'] = rawurldecode($entry['display']['raw']); $entry['display']['array'] = $entry['display']['raw'] ? explode(',',preg_replace('/\s+/','',$entry['display']['string'])) : array(); $entry['filter']['string'] = get_request('filter','GET'); $entry['filter']['clean'] = $entry['filter']['string'] ? clean_search_vals($entry['filter']['string']) : null; $entry['attr'] = get_request('attribute','GET'); $entry['base_dn']['string'] = get_request('base_dn','GET'); $entry['criterion'] = get_request('criterion','GET'); $entry['scope'] = get_request('scope','GET','false','sub'); $entry['search'] = get_request('search','GET'); $entry['predefined'] = get_request('predefined','GET'); $entry['page'] = get_request('page','GET',false,0); if (! in_array($entry['format'],$result_formats)) $entry['format'] = 'list'; $_SESSION['form'] = $entry['form']; # build the server drop-down html and JavaScript array (for base_dns) $js_on_change_string = ''; if ($entry['form'] == 'advanced') $js_on_change_string = 'onChange="document.forms[0].base_dn.value=servers[document.forms[0].server_id.value].base_dn"'; if (isset($ldapserver)) { $server_menu_html = server_select_list($ldapserver->server_id,true,'server_id',$js_on_change_string); $server_info_list = server_info_list(); } # grab the base dn for the search if ($entry['base_dn']['string']) { $entry['base_dn']['invalid'] = false; $entry['base_dn']['exist'] = false; if (! is_dn_string($entry['base_dn']['string'])) $entry['base_dn']['invalid'] = true; elseif (! $ldapserver->dnExists($entry['base_dn']['string'])) $entry['base_dn']['exist'] = true; $base_dns = array($entry['base_dn']['string']); } else if (isset($ldapserver)) $base_dns = $ldapserver->getBaseDN(); printf('',JSDIR); echo '
'; $entry['command']['as'] = $_SESSION[APPCONFIG]->isCommandAvailable('search','advanced_search'); $entry['command']['ps'] = $_SESSION[APPCONFIG]->isCommandAvailable('search','predefined_search'); $entry['command']['ss'] = $_SESSION[APPCONFIG]->isCommandAvailable('search','simple_search'); if ($entry['form'] == 'advanced') { if ($entry['command']['as']) require LIBDIR.'search_form_advanced.php'; } elseif ($entry['form'] == 'predefined') { if ($entry['command']['ps']) require LIBDIR.'search_form_predefined.php'; } elseif ($entry['form'] == 'simple') { # Draw simple search form if ($entry['command']['ss']) require LIBDIR.'search_form_simple.php'; } elseif ($entry['command']['as']) { require LIBDIR.'search_form_advanced.php'; } elseif ($entry['command']['ss']) { require LIBDIR.'search_form_simple.php'; } elseif ($entry['command']['ps']) { require LIBDIR.'search_form_predefined.php'; } else { echo _('Searching is not permitted'); } echo '
'; echo '
'; if ($entry['search']) { if ($entry['form'] == 'advanced') { if (! $_SESSION[APPCONFIG]->isCommandAvailable('search','advanced_search')) error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('advanced search')),'error','index.php'); } elseif ($entry['form'] == 'predefined') { if (! $_SESSION[APPCONFIG]->isCommandAvailable('search','predefined_search')) error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('predefined search')),'error','index.php'); } elseif ($entry['form'] == 'simple') { if (! $_SESSION[APPCONFIG]->isCommandAvailable('search','simple_search')) error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('simple search')),'error','index.php'); } if ($entry['form'] == 'advanced') { if ($entry['display']) $search_result_attributes = $entry['display']['array']; else $search_result_attributes = $_SESSION[APPCONFIG]->GetValue('search','result_attributes'); } else { $search_result_attributes = $_SESSION[APPCONFIG]->GetValue('search','result_attributes'); } # do we have enough authentication information for the specified server_id # @todo: redirect isnt working if (! $ldapserver->haveAuthInfo()) { $login_url = sprintf('cmd.php?cmd=login_form&server_id=%s&redirect=%s', $ldapserver->server_id,rawurlencode($_SERVER['REQUEST_URI'])); system_message(array( 'title'=>_('Search'), 'body'=>_('You have not logged into the selected server yet, so you cannot perform searches on it.'), 'type'=>'warn'), $login_url); } if (is_numeric($entry['predefined'])) { $query = get_cleaned_up_predefined_search($entry['predefined']); $search_result_attributes = explode(', ',$query['attributes']); $search_attributes_display = $search_result_attributes; $search_attributes = $search_result_attributes; $entry['filter']['clean'] = $query['filter']; $entry['scope'] = $query['scope']; if (! trim($query['base'])) $query['base'] = $ldapserver->getBaseDN(); elseif (is_array($query['base'])) $base_dns = $query['base']; else $base_dns = array($query['base']); } else { $entry['predefined'] = ''; } if ($entry['filter']['clean']) { # if they are using the simple search form, build an LDAP search filter from their input if ($entry['form'] == 'simple' & ! is_numeric($entry['predefined'])) { switch ($entry['criterion']) { case 'starts with': if ($entry['filter']['clean'] == '*') $entry['filter']['clean'] = ''; $entry['filter']['clean'] = sprintf('(%s=%s*)',$entry['attr'],$entry['filter']['clean']); break; case 'contains': if ($entry['filter']['clean'] == '*') $entry['filter']['clean'] = sprintf('(%s=*)',$entry['attr']); else $entry['filter']['clean'] = sprintf('(%s=*%s*)',$entry['attr'],$entry['filter']['clean']); break; case 'ends with': if ($entry['filter']['clean'] == '*') $entry['filter']['clean'] = ''; $entry['filter']['clean'] = sprintf('(%s=*%s)',$entry['attr'],$entry['filter']['clean']); break; case 'equals': $entry['filter']['clean'] = sprintf('(%s=%s)',$entry['attr'],$entry['filter']['clean']); break; case 'sounds like': $entry['filter']['clean'] = sprintf('(%s~=%s)',$entry['attr'],$entry['filter']['clean']); break; default: system_message(array( 'title'=>_('Unrecognized criteria option: ').htmlspecialchars($entry['criterion']), 'body'=>_('If you want to add your own criteria to the list. Be sure to edit search.php to handle them. Quitting.'), 'type'=>'warn'), sprintf('cmd.php?cmd=search&server_id=%s',$ldapserver->server_id)); } } # prevent script from bailing early on a long delete @set_time_limit(0); $size_limit = $_SESSION[APPCONFIG]->GetValue('search','size_limit'); # Sanity check if ($size_limit < 1) $size_limit = 1; $time_start = utime(); $time_elapsed = 0; foreach ($base_dns as $base_dn) { if (! $ldapserver->dnExists($base_dn)) { if (DEBUG_ENABLED) debug_log('BaseDN [%s] skipped as it doesnt exist in [%s].',64,__FILE__,__LINE__,__METHOD__, $base_dn,$ldapserver->server_id); continue; } else { if (DEBUG_ENABLED) debug_log('Search with base DN [%s]',64,__FILE__,__LINE__,__METHOD__,$base_dn); } $results = $ldapserver->search(null,dn_escape($base_dn),$entry['filter']['clean'],$search_result_attributes, $entry['scope'],$entry['orderby']['array'],$_SESSION[APPCONFIG]->GetValue('deref','search')); if ((! $results) && $ldapserver->errno()) system_message(array( 'title'=>_('Encountered an error while performing search.'), 'body'=>ldap_error_msg($ldapserver->error(),$ldapserver->errno()), 'type'=>'error')); $errno = $ldapserver->errno(); $time_end = utime(); $time_elapsed += round($time_end-$time_start,2); $count = count($results); $start_entry = $entry['page'] * $size_limit; $end_entry = min($start_entry+$size_limit+1,$count+1); # Search Results Table echo ''; echo ''; printf('',_('Entries found'),_(':'), number_format($count),$time_elapsed,_('seconds')); if ($_SESSION[APPCONFIG]->isCommandAvailable('export')) { $href = htmlspecialchars(sprintf('cmd.php?cmd=export_form&server_id=%s&scope=%s&dn=%s&filter=%s&attributes=%s', $ldapserver->server_id,$entry['scope'],$base_dn,rawurlencode($entry['filter']['clean']),rawurlencode(join(', ',$search_result_attributes)))); printf(''; echo ''; echo '
%s%s %s
(%s %s)
[ Save %s ]', $href,IMGDIR,_('export results')); } printf('[ rename %s%s',IMGDIR,_('Format'),_(':')); foreach ($result_formats as $f) { echo ' '; if ($entry['format'] == $f) { printf('%s',_($f)); } else { $query_string = array_to_query_string($_GET,array('format','cmd')); $query_string .= sprintf('&format=%s',$f); printf('%s',$query_string,_($f)); } } echo ' ]'; if ($_SESSION[APPCONFIG]->isCommandAvailable('schema')) { echo '
'; printf('%s%s %s',_('Base DN'),_(':'),htmlspecialchars($base_dn)); if ($entry['form'] == 'simple' || $entry['form'] == 'predefined') { echo '
'; printf('%s%s %s',_('Filter performed'),_(':'),htmlspecialchars($entry['filter']['clean'])); } } echo '
'; # The LDAP error code for the size limit exceeded error. # @todo: test this with system_message if ($errno && $errno == SIZE_LIMIT_EXCEEDED) printf('
%s

',_('Notice, search size limit exceeded.')); # Draw the paging links $pager_html = ''; $total_pages = $count / $size_limit; $results_per_page = $size_limit; if ($count > $size_limit) { printf(_('Showing results %s through %s.').'
', ''.number_format($start_entry+1).'',''.number_format($end_entry-1).''); if ($entry['page'] != 0) { $query_string = array_to_query_string($_GET,array('page','cmd')); $query_string .= '&page=' . ($entry['page']-1); $pager_html .= sprintf('‹‹',$entry['page'],$query_string); } else { $pager_html .= '‹‹'; } $pager_html .= '  '; /* For large search results where we page beyond the first 20 pages, * print elipsis instead of making the pager be super wide. */ $elipsis_printed = false; for ($i=0;$i<$count;$i+=$size_limit) { $page_num = $i/$size_limit; if ($count > $size_limit * 20 && abs($page_num-$entry['page']) > 10) { if (! $elipsis_printed) { $pager_html .= '...  '; $elipsis_printed = true; } } elseif ($entry['page'] == $page_num) { $pager_html .= '' . ($page_num + 1) . ''; $pager_html .= '  '; $elipsis_printed = false; } else { $query_string = array_to_query_string($_GET,array('page','cmd')); $query_string .= '&page=' . $page_num; $pager_html .= "" . ($page_num+1) . ""; $pager_html .= '  '; $elipsis_printed = false; } } if ($entry['page']+1 < $total_pages) { $query_string = array_to_query_string($_GET,array('page','cmd')); $query_string .= '&page=' . ($entry['page']+1); $pager_html .= "››"; } else { $pager_html .= "››"; } } if (0 == $count) printf('

%s

',_('The search found no results.')); else { if (trim($pager_html)) printf('
%s
',$pager_html); echo '
'; if ($entry['format'] == 'list') require LIBDIR.'search_results_list.php'; elseif ($entry['format'] == 'table') require LIBDIR.'search_results_table.php'; else error(sprintf(_('Unrecognized search result format: %s'),htmlspecialchars($entry['format'])),'error','index.php'); echo '
'; if (trim($pager_html)) printf('
%s
',$pager_html); } } } } ?>