From 041c93ce0bc00cb6417ce2e4bdce2ed84d37f50a Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Tue, 22 May 2012 06:31:37 -0400
Subject: [PATCH] Removed $Id$
---
program/include/rcube_ldap.php | 132 ++++++++++++++++++++++++++++---------------
1 files changed, 86 insertions(+), 46 deletions(-)
diff --git a/program/include/rcube_ldap.php b/program/include/rcube_ldap.php
index 130eada..f799df2 100644
--- a/program/include/rcube_ldap.php
+++ b/program/include/rcube_ldap.php
@@ -1,4 +1,5 @@
<?php
+
/*
+-----------------------------------------------------------------------+
| program/include/rcube_ldap.php |
@@ -19,9 +20,6 @@
| Andreas Dick <andudi (at) gmx (dot) ch> |
| Aleksander Machniak <machniak@kolabsys.com> |
+-----------------------------------------------------------------------+
-
- $Id$
-
*/
@@ -63,12 +61,11 @@
/**
* Object constructor
*
- * @param array LDAP connection properties
- * @param boolean Enables debug mode
- * @param string Current user mail domain name
- * @param integer User-ID
+ * @param array $p LDAP connection properties
+ * @param boolean $debug Enables debug mode
+ * @param string $mail_domain Current user mail domain name
*/
- function __construct($p, $debug=false, $mail_domain=NULL)
+ function __construct($p, $debug = false, $mail_domain = null)
{
$this->prop = $p;
@@ -103,23 +100,39 @@
}
// use fieldmap to advertise supported coltypes to the application
- foreach ($this->fieldmap as $col => $lf) {
- list($col, $type) = explode(':', $col);
+ foreach ($this->fieldmap as $colv => $lfv) {
+ list($col, $type) = explode(':', $colv);
+ list($lf, $limit, $delim) = explode(':', $lfv);
+
+ if ($limit == '*') $limit = null;
+ else $limit = max(1, intval($limit));
+
if (!is_array($this->coltypes[$col])) {
$subtypes = $type ? array($type) : null;
- $this->coltypes[$col] = array('limit' => 1, 'subtypes' => $subtypes);
+ $this->coltypes[$col] = array('limit' => $limit, 'subtypes' => $subtypes);
}
elseif ($type) {
$this->coltypes[$col]['subtypes'][] = $type;
- $this->coltypes[$col]['limit']++;
+ $this->coltypes[$col]['limit'] += $limit;
}
+
+ if ($delim)
+ $this->coltypes[$col]['serialized'][$type] = $delim;
+
if ($type && !$this->fieldmap[$col])
- $this->fieldmap[$col] = $lf;
+ $this->fieldmap[$col] = $lf;
+
+ $this->fieldmap[$colv] = $lf;
}
// support for composite address
if ($this->fieldmap['street'] && $this->fieldmap['locality']) {
- $this->coltypes['address'] = array('limit' => max(1, $this->coltypes['locality']['limit']), 'subtypes' => $this->coltypes['locality']['subtypes'], 'childs' => array());
+ $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']),
+ 'childs' => array(),
+ ) + (array)$this->coltypes['address'];
+
foreach (array('street','locality','zipcode','region','country') as $childcol) {
if ($this->fieldmap[$childcol]) {
$this->coltypes['address']['childs'][$childcol] = array('type' => 'text');
@@ -128,7 +141,14 @@
}
}
else if ($this->coltypes['address']) {
- $this->coltypes['address'] = array('type' => 'textarea', 'childs' => null, 'limit' => 1, 'size' => 40);
+ $this->coltypes['address'] += array('type' => 'textarea', 'childs' => null, 'size' => 40);
+
+ // 'serialized' means the UI has to present a composite address field
+ if ($this->coltypes['address']['serialized']) {
+ $childprop = array('type' => 'text');
+ $this->coltypes['address']['type'] = 'composite';
+ $this->coltypes['address']['childs'] = array('street' => $childprop, 'locality' => $childprop, 'zipcode' => $childprop, 'country' => $childprop);
+ }
}
// make sure 'required_fields' is an array
@@ -164,8 +184,8 @@
$this->mail_domain = $mail_domain;
// initialize cache
- $rcmail = rcmail::get_instance();
- $this->cache = $rcmail->get_cache('LDAP.' . asciiwords($this->prop['name']), 'db', 600);
+ $rcube = rcube::get_instance();
+ $this->cache = $rcube->get_cache('LDAP.' . asciiwords($this->prop['name']), 'db', 600);
$this->_connect();
}
@@ -176,10 +196,10 @@
*/
private function _connect()
{
- global $RCMAIL;
+ $rcube = rcube::get_instance();
if (!function_exists('ldap_connect'))
- raise_error(array('code' => 100, 'type' => 'ldap',
+ rcube::raise_error(array('code' => 100, 'type' => 'ldap',
'file' => __FILE__, 'line' => __LINE__,
'message' => "No ldap support in this installation of PHP"),
true, true);
@@ -195,7 +215,7 @@
foreach ($this->prop['hosts'] as $host)
{
- $host = idn_to_ascii(rcube_parse_host($host));
+ $host = rcube_utils::idn_to_ascii(rcube_utils::parse_host($host));
$hostname = $host.($this->prop['port'] ? ':'.$this->prop['port'] : '');
$this->_debug("C: Connect [$hostname] [{$this->prop['name']}]");
@@ -225,7 +245,7 @@
}
if (!is_resource($this->conn)) {
- raise_error(array('code' => 100, 'type' => 'ldap',
+ rcube::raise_error(array('code' => 100, 'type' => 'ldap',
'file' => __FILE__, 'line' => __LINE__,
'message' => "Could not connect to any LDAP server, last tried $hostname"), true);
@@ -244,11 +264,11 @@
if ($this->prop['user_specific']) {
// No password set, use the session password
if (empty($bind_pass)) {
- $bind_pass = $RCMAIL->decrypt($_SESSION['password']);
+ $bind_pass = $rcube->decrypt($_SESSION['password']);
}
// Get the pieces needed for variable replacement.
- if ($fu = $RCMAIL->user->get_username())
+ if ($fu = $rcube->get_user_name())
list($u, $d) = explode('@', $fu);
else
$d = $this->mail_domain;
@@ -287,7 +307,7 @@
if (!empty($this->prop['search_dn_default']))
$replaces['%dn'] = $this->prop['search_dn_default'];
else {
- raise_error(array(
+ rcube::raise_error(array(
'code' => 100, 'type' => 'ldap',
'file' => __FILE__, 'line' => __LINE__,
'message' => "DN not found using LDAP search."), true);
@@ -341,7 +361,7 @@
}
if (!function_exists('ldap_sasl_bind')) {
- raise_error(array('code' => 100, 'type' => 'ldap',
+ rcube::raise_error(array('code' => 100, 'type' => 'ldap',
'file' => __FILE__, 'line' => __LINE__,
'message' => "Unable to bind: ldap_sasl_bind() not exists"),
true, true);
@@ -367,7 +387,7 @@
$this->_debug("S: ".ldap_error($this->conn));
- raise_error(array(
+ rcube::raise_error(array(
'code' => ldap_errno($this->conn), 'type' => 'ldap',
'file' => __FILE__, 'line' => __LINE__,
'message' => "Bind failed for authcid=$authc ".ldap_error($this->conn)),
@@ -400,7 +420,7 @@
$this->_debug("S: ".ldap_error($this->conn));
- raise_error(array(
+ rcube::raise_error(array(
'code' => ldap_errno($this->conn), 'type' => 'ldap',
'file' => __FILE__, 'line' => __LINE__,
'message' => "Bind failed for dn=$dn: ".ldap_error($this->conn)),
@@ -993,10 +1013,13 @@
if ($missing) {
// try to complete record automatically
if ($autofix) {
- $reverse_map = array_flip($this->fieldmap);
- $name_parts = preg_split('/[\s,.]+/', $save_data['name']);
$sn_field = $this->fieldmap['surname'];
$fn_field = $this->fieldmap['firstname'];
+ $mail_field = $this->fieldmap['email'];
+
+ // try to extract surname and firstname from displayname
+ $reverse_map = array_flip($this->fieldmap);
+ $name_parts = preg_split('/[\s,.]+/', $save_data['name']);
if ($sn_field && $missing[$sn_field]) {
$save_data['surname'] = array_pop($name_parts);
@@ -1006,6 +1029,16 @@
if ($fn_field && $missing[$fn_field]) {
$save_data['firstname'] = array_shift($name_parts);
unset($missing[$fn_field]);
+ }
+
+ // try to fix missing e-mail, very often on import
+ // from vCard we have email:other only defined
+ if ($mail_field && $missing[$mail_field]) {
+ $emails = $this->get_col_values('email', $save_data, true);
+ if (!empty($emails) && ($email = array_shift($emails))) {
+ $save_data['email'] = $email;
+ unset($missing[$mail_field]);
+ }
}
}
@@ -1169,18 +1202,9 @@
} // end if
} // end if
} // end foreach
-/*
- console($old_data);
- console($ldap_data);
- console('----');
- console($newdata);
- console($replacedata);
- console($deletedata);
- console('----');
- console($subdata);
- console($subnewdata);
- console($subdeldata);
-*/
+
+ // console($old_data, $ldap_data, '----', $newdata, $replacedata, $deletedata, '----', $subdata, $subnewdata, $subdeldata);
+
$dn = self::dn_decode($id);
// Update the entry as required.
@@ -1468,6 +1492,8 @@
$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;
+ else if ($col == 'address' && strpos($value, '$') !== false) // address data is represented as string separated with $
+ list($out[$rf][$i]['street'], $out[$rf][$i]['locality'], $out[$rf][$i]['zipcode'], $out[$rf][$i]['country']) = explode('$', $value);
else if ($rec[$lf]['count'] > 1)
$out[$rf][] = $value;
else
@@ -1510,6 +1536,15 @@
}
}
}
+
+ // if addresses are to be saved as serialized string, do so
+ if (is_array($colprop['serialized'])) {
+ foreach ($colprop['serialized'] as $subtype => $delim) {
+ $key = $col.':'.$subtype;
+ foreach ((array)$save_cols[$key] as $i => $val)
+ $save_cols[$key][$i] = join($delim, array($val['street'], $val['locality'], $val['zipcode'], $val['country']));
+ }
+ }
}
$ldap_data = array();
@@ -1530,17 +1565,21 @@
/**
* Returns unified attribute name (resolving aliases)
*/
- private static function _attr_name($name)
+ private static function _attr_name($namev)
{
// list of known attribute aliases
- $aliases = array(
+ static $aliases = array(
'gn' => 'givenname',
'rfc822mailbox' => 'email',
'userid' => 'uid',
'emailaddress' => 'email',
'pkcs9email' => 'email',
);
- return isset($aliases[$name]) ? $aliases[$name] : $name;
+
+ list($name, $limit) = explode(':', $namev, 2);
+ $suffix = $limit ? ':'.$limit : '';
+
+ return (isset($aliases[$name]) ? $aliases[$name] : $name) . $suffix;
}
@@ -1549,8 +1588,9 @@
*/
private function _debug($str)
{
- if ($this->debug)
- write_log('ldap', $str);
+ if ($this->debug) {
+ rcube::write_log('ldap', $str);
+ }
}
--
Gitblit v1.9.1