From b4e41f006b26fbb0d372eca5b0636a886dbc571f Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Tue, 24 Jan 2012 02:35:33 -0500
Subject: [PATCH] Show hidden compose header fileds if non-empty (#1488320)

---
 program/include/rcube_ldap.php |   67 +++++++++++++++++++--------------
 1 files changed, 39 insertions(+), 28 deletions(-)

diff --git a/program/include/rcube_ldap.php b/program/include/rcube_ldap.php
index 58e2ca9..0d7b7d5 100644
--- a/program/include/rcube_ldap.php
+++ b/program/include/rcube_ldap.php
@@ -6,7 +6,10 @@
  | This file is part of the Roundcube Webmail client                     |
  | Copyright (C) 2006-2011, The Roundcube Dev Team                       |
  | Copyright (C) 2011, Kolab Systems AG                                  |
- | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | Licensed under the GNU General Public License version 3 or            |
+ | any later version with exceptions for skins & plugins.                |
+ | See the README file for a full license statement.                     |
  |                                                                       |
  | PURPOSE:                                                              |
  |   Interface to an LDAP address directory                              |
@@ -176,7 +179,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 +239,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 +666,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;
             }
@@ -869,10 +873,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 +1028,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;
@@ -1231,23 +1233,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));
             }
         }
@@ -1314,12 +1321,13 @@
                 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
@@ -1716,13 +1724,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