From 8764b6ecf0c8d1b0646915a8139cdf6bbac2ca14 Mon Sep 17 00:00:00 2001 From: alecpl <alec@alec.pl> Date: Mon, 16 Jan 2012 06:17:35 -0500 Subject: [PATCH] - Add addressbook name to debug output (#1488304) --- program/include/rcube_ldap.php | 93 ++++++++++++++++++++++++++-------------------- 1 files changed, 53 insertions(+), 40 deletions(-) diff --git a/program/include/rcube_ldap.php b/program/include/rcube_ldap.php index 6a8ddb9..7b33655 100644 --- a/program/include/rcube_ldap.php +++ b/program/include/rcube_ldap.php @@ -176,7 +176,7 @@ $host = idn_to_ascii(rcube_parse_host($host)); $hostname = $host.($this->prop['port'] ? ':'.$this->prop['port'] : ''); - $this->_debug("C: Connect [$hostname]"); + $this->_debug("C: Connect [$hostname] [{$this->prop['name']}]"); if ($lc = @ldap_connect($host, $this->prop['port'])) { @@ -236,6 +236,10 @@ $replaces = array('%dn' => '', '%dc' => $dc, '%d' => $d, '%fu' => $fu, '%u' => $u); if ($this->prop['search_base_dn'] && $this->prop['search_filter']) { + if (!empty($this->prop['search_bind_dn']) && !empty($this->prop['search_bind_pw'])) { + $this->bind($this->prop['search_bind_dn'], $this->prop['search_bind_pw']); + } + // Search for the dn to use to authenticate $this->prop['search_base_dn'] = strtr($this->prop['search_base_dn'], $replaces); $this->prop['search_filter'] = strtr($this->prop['search_filter'], $replaces); @@ -659,14 +663,11 @@ $attrib = $count ? array('dn') : array_values($this->fieldmap); if ($result = @$func($this->conn, $m[1], $filter, - $attrib, 0, (int)$this->prop['sizelimit'], (int)$this->prop['timelimit'])) - { + $attrib, 0, (int)$this->prop['sizelimit'], (int)$this->prop['timelimit']) + ) { $this->_debug("S: ".ldap_count_entries($this->conn, $result)." record(s) for ".$m[1]); - if ($err = ldap_errno($this->conn)) - $this->_debug("S: Error: " .ldap_err2str($err)); } - else - { + else { $this->_debug("S: ".ldap_error($this->conn)); return $group_members; } @@ -740,16 +741,16 @@ $function = $this->_scope2func($this->prop['scope']); $this->ldap_result = @$function($this->conn, $this->base_dn, $this->filter ? $this->filter : '(objectclass=*)', - array_values($this->fieldmap), 0, (int)$this->prop['sizelimit'], (int)$this->prop['timelimit']); + array_values($this->fieldmap), 0, $this->page_size, (int)$this->prop['timelimit']); $this->result = new rcube_result_set(0); - if (!$this->ldap_result) { + if (!$this->ldap_result) { $this->_debug("S: ".ldap_error($this->conn)); - return $this->result; - } + return $this->result; + } - $this->_debug("S: ".ldap_count_entries($this->conn, $this->ldap_result)." record(s)"); + $this->_debug("S: ".ldap_count_entries($this->conn, $this->ldap_result)." record(s)"); // get all entries of this page and post-filter those that really match the query $search = mb_strtolower($value); @@ -869,10 +870,8 @@ // The filter is not set, set it. $this->filter = $this->prop['filter']; } - $this->_exec_search(true); - if ($this->ldap_result) { - $count = ldap_count_entries($this->conn, $this->ldap_result); - } + + $count = (int) $this->_exec_search(true); } return new rcube_result_set($count, ($this->list_page-1) * $this->page_size); @@ -1026,7 +1025,7 @@ $dn = self::dn_encode($dn); // add new contact to the selected group - if ($this->groups) + if ($this->group_id) $this->add_to_group($this->group_id, $dn); return $dn; @@ -1052,6 +1051,8 @@ $deletedata = array(); $ldap_data = $this->_map_data($save_cols); + $old_data = $record['_raw_attrib']; + foreach ($this->fieldmap as $col => $fld) { $val = $ldap_data[$fld]; if ($fld) { @@ -1059,23 +1060,23 @@ if (is_array($val)) $val = array_filter($val); // The field does exist compare it to the ldap record. - if ($record[$col] != $val) { + if ($old_data[$fld] != $val) { // Changed, but find out how. - if (!isset($record[$col])) { + if (!isset($old_data[$fld])) { // Field was not set prior, need to add it. $newdata[$fld] = $val; - } // end if - elseif ($val == '') { + } + else if ($val == '') { // Field supplied is empty, verify that it is not required. if (!in_array($fld, $this->prop['required_fields'])) { // It is not, safe to clear. - $deletedata[$fld] = $record[$col]; - } // end if + $deletedata[$fld] = $old_data[$fld]; + } } // end elseif else { // The data was modified, save it out. $replacedata[$fld] = $val; - } // end else + } } // end if } // end if } // end foreach @@ -1229,23 +1230,28 @@ // only fetch dn for count (should keep the payload low) $attrs = $count ? array('dn') : array_values($this->fieldmap); if ($this->ldap_result = @$function($this->conn, $this->base_dn, $filter, - $attrs, 0, (int)$this->prop['sizelimit'], (int)$this->prop['timelimit'])) - { + $attrs, 0, (int)$this->prop['sizelimit'], (int)$this->prop['timelimit']) + ) { // when running on a patched PHP we can use the extended functions to retrieve the total count from the LDAP search result - if ($this->vlv_active && function_exists('ldap_parse_virtuallist_control') && - ldap_parse_result($this->conn, $this->ldap_result, $errcode, $matcheddn, $errmsg, $referrals, $serverctrls)) { - ldap_parse_virtuallist_control($this->conn, $serverctrls, $last_offset, $this->vlv_count, $vresult); - $this->_debug("S: VLV result: last_offset=$last_offset; content_count=$this->vlv_count"); + if ($this->vlv_active && function_exists('ldap_parse_virtuallist_control')) { + if (ldap_parse_result($this->conn, $this->ldap_result, + $errcode, $matcheddn, $errmsg, $referrals, $serverctrls) + ) { + ldap_parse_virtuallist_control($this->conn, $serverctrls, + $last_offset, $this->vlv_count, $vresult); + $this->_debug("S: VLV result: last_offset=$last_offset; content_count=$this->vlv_count"); + } + else { + $this->_debug("S: ".($errmsg ? $errmsg : ldap_error($this->conn))); + } } - $this->_debug("S: ".ldap_count_entries($this->conn, $this->ldap_result)." record(s)"); - if ($err = ldap_errno($this->conn)) - $this->_debug("S: Error: " .ldap_err2str($err)); + $entries_count = ldap_count_entries($this->conn, $this->ldap_result); + $this->_debug("S: $entries_count record(s)"); - return $count ? ldap_count_entries($this->conn, $this->ldap_result) : true; + return $count ? $entries_count : true; } - else - { + else { $this->_debug("S: ".ldap_error($this->conn)); } } @@ -1311,10 +1317,14 @@ for ($i=0; $i < $rec[$lf]['count']; $i++) { if (!($value = $rec[$lf][$i])) continue; + + list($col, $subtype) = explode(':', $rf); + $out['_raw_attrib'][$lf][$i] = $value; + if ($rf == 'email' && $this->mail_domain && !strpos($value, '@')) $out[$rf][] = sprintf('%s@%s', $value, $this->mail_domain); - else if (in_array($rf, array('street','zipcode','locality','country','region'))) - $out['address'][$i][$rf] = $value; + else if (in_array($col, array('street','zipcode','locality','country','region'))) + $out['address'.($subtype?':':'').$subtype][$i][$col] = $value; else if ($rec[$lf]['count'] > 1) $out[$rf][] = $value; else @@ -1323,7 +1333,7 @@ // Make sure name fields aren't arrays (#1488108) if (is_array($out[$rf]) && in_array($rf, array('name', 'surname', 'firstname', 'middlename', 'nickname'))) { - $out[$rf] = $out[$rf][0]; + $out[$rf] = $out['_raw_attrib'][$lf] = $out[$rf][0]; } } @@ -1711,13 +1721,16 @@ if (($group_cache = $this->cache->get('groups')) === null) $group_cache = $this->_fetch_groups(); + if (!is_array($contact_ids)) + $contact_ids = explode(',', $contact_ids); + $base_dn = $this->groups_base_dn; $group_name = $group_cache[$group_id]['name']; $member_attr = $group_cache[$group_id]['member_attr']; $group_dn = "cn=$group_name,$base_dn"; $new_attrs = array(); - foreach (explode(",", $contact_ids) as $id) + foreach ($contact_ids as $id) $new_attrs[$member_attr][] = self::dn_decode($id); $this->_debug("C: Add [dn: $group_dn]: ".print_r($new_attrs, true)); -- Gitblit v1.9.1