From be9aacaa5296dfca63fb3a01c2dc52538d1546aa Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Sat, 17 Nov 2012 12:31:31 -0500
Subject: [PATCH] Bring back lost localization for the about page

---
 program/include/rcube_ldap.php |  133 +++++++++++++++++++++++++++++++-------------
 1 files changed, 93 insertions(+), 40 deletions(-)

diff --git a/program/include/rcube_ldap.php b/program/include/rcube_ldap.php
index ad2ccdd..34e37e3 100644
--- a/program/include/rcube_ldap.php
+++ b/program/include/rcube_ldap.php
@@ -6,7 +6,7 @@
  |                                                                       |
  | This file is part of the Roundcube Webmail client                     |
  | Copyright (C) 2006-2012, The Roundcube Dev Team                       |
- | Copyright (C) 2011, Kolab Systems AG                                  |
+ | Copyright (C) 2011-2012, Kolab Systems AG                             |
  |                                                                       |
  | Licensed under the GNU General Public License version 3 or            |
  | any later version with exceptions for skins & plugins.                |
@@ -26,7 +26,8 @@
 /**
  * Model class to access an LDAP address directory
  *
- * @package Addressbook
+ * @package    Framework
+ * @subpackage Addressbook
  */
 class rcube_ldap extends rcube_addressbook
 {
@@ -109,24 +110,22 @@
 
             if (!is_array($this->coltypes[$col])) {
                 $subtypes = $type ? array($type) : null;
-                $this->coltypes[$col] = array('limit' => $limit, 'subtypes' => $subtypes);
+                $this->coltypes[$col] = array('limit' => $limit, 'subtypes' => $subtypes, 'attributes' => array($lf));
             }
             elseif ($type) {
                 $this->coltypes[$col]['subtypes'][] = $type;
+                $this->coltypes[$col]['attributes'][] = $lf;
                 $this->coltypes[$col]['limit'] += $limit;
             }
 
             if ($delim)
                $this->coltypes[$col]['serialized'][$type] = $delim;
 
-            if ($type && !$this->fieldmap[$col])
-               $this->fieldmap[$col] = $lf;
-
-            $this->fieldmap[$colv] = $lf;
+           $this->fieldmap[$colv] = $lf;
         }
 
         // support for composite address
-        if ($this->fieldmap['street'] && $this->fieldmap['locality']) {
+        if ($this->coltypes['street'] && $this->coltypes['locality']) {
             $this->coltypes['address'] = array(
                'limit'    => max(1, $this->coltypes['locality']['limit'] + $this->coltypes['address']['limit']),
                'subtypes' => array_merge((array)$this->coltypes['address']['subtypes'], (array)$this->coltypes['locality']['subtypes']),
@@ -134,7 +133,7 @@
                ) + (array)$this->coltypes['address'];
 
             foreach (array('street','locality','zipcode','region','country') as $childcol) {
-                if ($this->fieldmap[$childcol]) {
+                if ($this->coltypes[$childcol]) {
                     $this->coltypes['address']['childs'][$childcol] = array('type' => 'text');
                     unset($this->coltypes[$childcol]);  // remove address child col from global coltypes list
                 }
@@ -162,7 +161,8 @@
         }
 
         // make sure LDAP_rdn field is required
-        if (!empty($this->prop['LDAP_rdn']) && !in_array($this->prop['LDAP_rdn'], $this->prop['required_fields'])) {
+        if (!empty($this->prop['LDAP_rdn']) && !in_array($this->prop['LDAP_rdn'], $this->prop['required_fields'])
+            && !in_array($this->prop['LDAP_rdn'], array_keys((array)$this->prop['autovalues']))) {
             $this->prop['required_fields'][] = $this->prop['LDAP_rdn'];
         }
 
@@ -468,8 +468,8 @@
      */
     function set_sort_order($sort_col, $sort_order = null)
     {
-        if ($this->fieldmap[$sort_col])
-            $this->sort_col = $this->fieldmap[$sort_col];
+        if ($this->coltypes[$sort_col]['attributes'])
+            $this->sort_col = $this->coltypes[$sort_col]['attributes'][0];
     }
 
 
@@ -773,8 +773,9 @@
 
         // use VLV pseudo-search for autocompletion
         $rcube = rcube::get_instance();
+        $list_fields = $rcube->config->get('contactlist_fields');
 
-        if ($this->prop['vlv_search'] && $this->conn && join(',', (array)$fields) == join(',', $rcube->config->get('contactlist_fields')))
+        if ($this->prop['vlv_search'] && $this->conn && join(',', (array)$fields) == join(',', $list_fields))
         {
             // add general filter to query
             if (!empty($this->prop['filter']) && empty($this->filter))
@@ -802,24 +803,26 @@
 
             for ($i = 0; $i < $entries['count']; $i++) {
                 $rec = $this->_ldap2result($entries[$i]);
-                foreach (array('email', 'name') as $f) {
-                    $val = mb_strtolower($rec[$f]);
-                    switch ($mode) {
-                    case 1:
-                        $got = ($val == $search);
-                        break;
-                    case 2:
-                        $got = ($search == substr($val, 0, strlen($search)));
-                        break;
-                    default:
-                        $got = (strpos($val, $search) !== false);
-                        break;
-                    }
+                foreach ($fields as $f) {
+                    foreach ((array)$rec[$f] as $val) {
+                        $val = mb_strtolower($val);
+                        switch ($mode) {
+                        case 1:
+                            $got = ($val == $search);
+                            break;
+                        case 2:
+                            $got = ($search == substr($val, 0, strlen($search)));
+                            break;
+                        default:
+                            $got = (strpos($val, $search) !== false);
+                            break;
+                        }
 
-                    if ($got) {
-                        $this->result->add($rec);
-                        $this->result->count++;
-                        break;
+                        if ($got) {
+                            $this->result->add($rec);
+                            $this->result->count++;
+                            break 2;
+                        }
                     }
                 }
             }
@@ -858,8 +861,13 @@
         {
             foreach ((array)$fields as $idx => $field) {
                 $val = is_array($value) ? $value[$idx] : $value;
-                if ($f = $this->_map_field($field)) {
-                    $filter .= "($f=$wp" . $this->_quote_string($val) . "$ws)";
+                if ($attrs = $this->_map_field($field)) {
+                    if (count($attrs) > 1)
+                        $filter .= '(|';
+                    foreach ($attrs as $f)
+                        $filter .= "($f=$wp" . $this->_quote_string($val) . "$ws)";
+                    if (count($attrs) > 1)
+                        $filter .= ')';
                 }
             }
         }
@@ -867,9 +875,16 @@
 
         // add required (non empty) fields filter
         $req_filter = '';
-        foreach ((array)$required as $field)
-            if ($f = $this->_map_field($field))
-                $req_filter .= "($f=*)";
+        foreach ((array)$required as $field) {
+            if ($attrs = $this->_map_field($field)) {
+                if (count($attrs) > 1)
+                    $req_filter .= '(|';
+                foreach ($attrs as $f)
+                    $req_filter .= "($f=*)";
+                if (count($attrs) > 1)
+                    $req_filter .= ')';
+            }
+        }
 
         if (!empty($req_filter))
             $filter = '(&' . $req_filter . $filter . ')';
@@ -1072,6 +1087,9 @@
         // Map out the column names to their LDAP ones to build the new entry.
         $newentry = $this->_map_data($save_cols);
         $newentry['objectClass'] = $this->prop['LDAP_Object_Classes'];
+
+        // add automatically generated attributes
+        $this->add_autovalues($newentry);
 
         // Verify that the required fields are set.
         $missing = null;
@@ -1376,6 +1394,30 @@
         }
     }
 
+    /**
+     * Generate missing attributes as configured
+     *
+     * @param array LDAP record attributes
+     */
+    protected function add_autovalues(&$attrs)
+    {
+        $attrvals = array();
+        foreach ($attrs as $k => $v) {
+            $attrvals['{'.$k.'}'] = is_array($v) ? $v[0] : $v;
+        }
+
+        foreach ((array)$this->prop['autovalues'] as $lf => $templ) {
+            if (empty($attrs[$lf])) {
+                // replace {attr} placeholders with concrete attribute values
+                $templ = preg_replace('/\{\w+\}/', '', strtr($templ, $attrvals));
+
+                if (strpos($templ, '(') !== false)
+                    $attrs[$lf] = eval("return ($templ);");
+                else
+                    $attrs[$lf] = $templ;
+            }
+        }
+    }
 
     /**
      * Execute the LDAP search based on the stored credentials
@@ -1498,7 +1540,7 @@
                 list($col, $subtype) = explode(':', $rf);
                 $out['_raw_attrib'][$lf][$i] = $value;
 
-                if ($rf == 'email' && $this->mail_domain && !strpos($value, '@'))
+                if ($col == 'email' && $this->mail_domain && !strpos($value, '@'))
                     $out[$rf][] = sprintf('%s@%s', $value, $this->mail_domain);
                 else if (in_array($col, array('street','zipcode','locality','country','region')))
                     $out['address'.($subtype?':':'').$subtype][$i][$col] = $value;
@@ -1521,11 +1563,11 @@
 
 
     /**
-     * Return real field name (from fields map)
+     * Return LDAP attribute(s) for the given field
      */
     private function _map_field($field)
     {
-        return $this->fieldmap[$field];
+        return (array)$this->coltypes[$field]['attributes'];
     }
 
 
@@ -1558,8 +1600,19 @@
         }
 
         $ldap_data = array();
-        foreach ($this->fieldmap as $col => $fld) {
-            $val = $save_cols[$col];
+        foreach ($this->fieldmap as $rf => $fld) {
+            $val = $save_cols[$rf];
+
+            // check for value in base field (eg.g email instead of email:foo)
+            list($col, $subtype) = explode(':', $rf);
+            if (!$val && !empty($save_cols[$col])) {
+                $val = $save_cols[$col];
+                unset($save_cols[$col]);  // only use this value once
+            }
+            else if (!$val && !$subtype) { // extract values from subtype cols
+                $val = $this->get_col_values($col, $save_cols, true);
+            }
+
             if (is_array($val))
                 $val = array_filter($val);  // remove empty entries
             if ($fld && $val) {

--
Gitblit v1.9.1