| +-----------------------------------------------------------------------+ $Id$ */ require_once 'include/rcube_ldap.inc'; /** * draw the ldap public search form */ function rcmail_ldap_public_search_form($attrib) { global $CONFIG, $JS_OBJECT_NAME, $OUTPUT; if (!isset($CONFIG['ldap_public'])) { // no ldap servers to search show_message('noldapserver', 'warning'); rcmail_overwrite_action('add'); return false; } else { // store some information in the session $_SESSION['ldap_public']['server_count'] = $server_count = count($CONFIG['ldap_public']); $_SESSION['ldap_public']['server_names'] = $server_names = array_keys($CONFIG['ldap_public']); } list($form_start, $form_end) = get_form_tags($attrib); $out = "$form_start\n\n"; // search name field $search_name = new textfield(array('name' => '_ldap_public_search_name', 'id' => 'rcmfd_ldap_public_search_name')); $out .= "\n"; // there's more than one server to search for, show a dropdown menu if ($server_count > 1) { $select_server = new select(array('name' => '_ldap_public_servers', 'id' => 'rcfmd_ldap_public_servers')); $select_server->add($server_names, $server_names); $out .= '\n"; } // foreach configured ldap server, set up the search fields for ($i = 0; $i < $server_count; $i++) { $server = $CONFIG['ldap_public'][$server_names[$i]]; // only display one search fields select - js takes care of the rest if (!$i) { $field_name = '_ldap_public_search_field'; $field_id = 'rcfmd_ldap_public_search_field'; $search_fields = new select(array('name' => $field_name, 'id' => $field_id)); $search_fields->add(array_keys($server['search_fields']), array_values($server['search_fields'])); $out .= '\n"; $attributes = array('name' => '_ldap_public_search_type', 'id' => 'rcmfd_ldap_public_search_type'); // if there's only one server, and it doesn't accept fuzzy searches, // then check and disable the check box - thanks pieter if ($server_count == 1 && !$server['fuzzy_search']) { $attributes['CHECKED'] = 'CHECKED'; $attributes['disabled'] = 'disabled'; } $search_type = new checkbox($attributes); $out .= '\n"; } if ($server_count > 1) { // store the search fields in a js array for each server $js = ''; foreach ($server['search_fields'] as $search_name => $search_value) $js .= "['$search_name', '$search_value'], "; // store whether this server accepts fuzzy search as last item in array $js .= $server['fuzzy_search'] ? "'fuzzy'" : "'exact'"; $OUTPUT->add_script("rcmail.set_env('{$server_names[$i]}_search_fields', new Array($js));"); } } // add contact button label text $OUTPUT->add_script("rcmail.set_env('addcontact', '" . rcube_label('addcontact') . "');"); $out .= "\n
" . $search_name->show() . "
" . $select_server->show() . "
" . $search_fields->show() . "
$form_end"; return $out; } /** * get search values and return ldap contacts */ function rcmail_ldap_public_list() { // just return if we are not being called from a search form if (!isset($_POST['_action'])) return null; global $CONFIG, $OUTPUT, $JS_OBJECT_NAME; // show no search name warning and exit if (empty($_POST['_ldap_public_search_name']) || trim($_POST['_ldap_public_search_name']) == '') { show_message('nosearchname', 'warning'); return false; } // set up ldap server(s) array or bail if ($_SESSION['ldap_public']['server_count'] > 1) // show no ldap server warning and exit if (empty($_POST['_ldap_public_servers'])) { show_message('noldappublicserver', 'warning'); return false; } else $server_name = $_POST['_ldap_public_servers']; else if ($_SESSION['ldap_public']['server_count'] == 1) $server_name = $_SESSION['ldap_public']['server_names'][0]; else return false; // get search parameters $search_value = $_POST['_ldap_public_search_name']; $search_field = $_POST['_ldap_public_search_field']; // only use the post var for search type if the ldap server allows 'like' $exact = true; if ($CONFIG['ldap_public'][$server_name]['fuzzy_search']) $exact = isset($_POST['_ldap_public_search_type']) ? true : false; // perform an ldap search $contacts = rcmail_ldap_contact_search($search_value, $search_field, $CONFIG['ldap_public'][$server_name], $exact); // if no results, show a warning and return if (!$contacts) { show_message('nocontactsreturned', 'warning'); return false; } // add id to message list table if not specified if (!strlen($attrib['id'])) $attrib['id'] = 'ldapAddressList'; // define table class $attrib['class'] = 'records-table'; $attrib['cellspacing'] = 0; // define list of cols to be displayed $a_show_cols = array('name', 'email'); // create XHTML table $out = rcube_table_output($attrib, $contacts, $a_show_cols, 'row_id'); // set client env $javascript = "$JS_OBJECT_NAME.gui_object('ldapcontactslist', '{$attrib['id']}');\n"; $OUTPUT->add_script($javascript); return $out; } /** * perform search for contacts from given public ldap server */ function rcmail_ldap_contact_search($search_value, $search_field, $server, $exact=true) { global $CONFIG; $attributes = array($server['name_field'], $server['mail_field']); $LDAP = new rcube_ldap(); if ($LDAP->connect($server['hosts'], $server['port'], $server['protocol'])) { $filter = "$search_field=" . ($exact ? $search_value : "*$search_value*"); $result = $LDAP->search($server['base_dn'], $filter, $attributes, $server['scope'], $sort=null); // add any results to contact array if ($result['count']) { for ($n = 0; $n < $result['count']; $n++) { $contacts[$n]['name'] = $result[$n][$server['name_field']][0]; $contacts[$n]['email'] = $result[$n][$server['mail_field']][0]; $contacts[$n]['row_id'] = $n + 1; } } } else return false; // cleanup $LDAP->close(); if (!$result['count']) return false; // weed out duplicate emails for ($n = 0; $n < $result['count']; $n++) for ($i = 0; $i < $result['count']; $i++) if ($contacts[$i]['email'] == $contacts[$n]['email'] && $i != $n) unset($contacts[$n]); return $contacts; } function get_form_tags($attrib) { global $OUTPUT, $JS_OBJECT_NAME, $EDIT_FORM, $SESS_HIDDEN_FIELD; $form_start = ''; if (!strlen($EDIT_FORM)) { $hiddenfields = new hiddenfield(array('name' => '_task', 'value' => $GLOBALS['_task'])); $hiddenfields->add(array('name' => '_action', 'value' => 'ldappublicsearch')); if ($_framed) $hiddenfields->add(array('name' => '_framed', 'value' => 1)); $form_start .= !strlen($attrib['form']) ? '
' : ''; $form_start .= "\n$SESS_HIDDEN_FIELD\n"; $form_start .= $hiddenfields->show(); } $form_end = (strlen($EDIT_FORM) && !strlen($attrib['form'])) ? '
' : ''; $form_name = strlen($attrib['form']) ? $attrib['form'] : 'form'; $OUTPUT->add_script("$JS_OBJECT_NAME.gui_object('ldappublicsearchform', '$form_name');"); $EDIT_FORM = $form_name; return array($form_start, $form_end); } parse_template('ldappublicsearch'); ?>