From 46f7b7096450939fe03c95aa81ce06ae4bfca89d Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Mon, 28 Mar 2016 06:51:43 -0400 Subject: [PATCH] Enable reply/reply-all/forward buttons also in preview frame of message/rfc822 --- program/lib/Roundcube/rcube_ldap.php | 74 +++++++++++++++++++++++++----------- 1 files changed, 51 insertions(+), 23 deletions(-) diff --git a/program/lib/Roundcube/rcube_ldap.php b/program/lib/Roundcube/rcube_ldap.php index f1ebea0..b08ee7b 100644 --- a/program/lib/Roundcube/rcube_ldap.php +++ b/program/lib/Roundcube/rcube_ldap.php @@ -38,6 +38,7 @@ // private properties protected $ldap; + protected $formats = array(); protected $prop = array(); protected $fieldmap = array(); protected $filter = ''; @@ -45,7 +46,7 @@ protected $result; protected $ldap_result; protected $mail_domain = ''; - protected $debug = false; + protected $debug = false; /** * Group objectclass (lowercase) to member attribute mapping @@ -119,22 +120,38 @@ if (is_array($p['fieldmap'])) { $p['fieldmap'] = array_filter($p['fieldmap']); foreach ($p['fieldmap'] as $rf => $lf) - $this->fieldmap[$rf] = $this->_attr_name(strtolower($lf)); + $this->fieldmap[$rf] = $this->_attr_name($lf); } else if (!empty($p)) { // read deprecated *_field properties to remain backwards compatible foreach ($p as $prop => $value) if (!empty($value) && preg_match('/^(.+)_field$/', $prop, $matches)) - $this->fieldmap[$matches[1]] = $this->_attr_name(strtolower($value)); + $this->fieldmap[$matches[1]] = $this->_attr_name($value); } // use fieldmap to advertise supported coltypes to the application foreach ($this->fieldmap as $colv => $lfv) { list($col, $type) = explode(':', $colv); - list($lf, $limit, $delim) = explode(':', $lfv); + $params = explode(':', $lfv); - if ($limit == '*') $limit = null; - else $limit = max(1, intval($limit)); + $lf = array_shift($params); + $limit = 1; + + foreach ($params as $idx => $param) { + // field format specification + if (preg_match('/^(date)\[(.+)\]$/i', $param, $m)) { + $this->formats[$lf] = array('type' => strtolower($m[1]), 'format' => $m[2]); + } + // first argument is a limit + else if ($idx === 0) { + if ($param == '*') $limit = null; + else $limit = max(1, intval($param)); + } + // second is a composite field separator + else if ($idx === 1 && $param) { + $this->coltypes[$col]['serialized'][$type] = $param; + } + } if (!is_array($this->coltypes[$col])) { $subtypes = $type ? array($type) : null; @@ -146,10 +163,7 @@ $this->coltypes[$col]['limit'] += $limit; } - if ($delim) - $this->coltypes[$col]['serialized'][$type] = $delim; - - $this->fieldmap[$colv] = $lf; + $this->fieldmap[$colv] = $lf; } // support for composite address @@ -195,7 +209,7 @@ } foreach ($this->prop['required_fields'] as $key => $val) { - $this->prop['required_fields'][$key] = $this->_attr_name(strtolower($val)); + $this->prop['required_fields'][$key] = $this->_attr_name($val); } // Build sub_fields filter @@ -271,8 +285,7 @@ $bind_dn = $this->prop['bind_dn']; $this->base_dn = $this->prop['base_dn']; - $this->groups_base_dn = ($this->prop['groups']['base_dn']) ? - $this->prop['groups']['base_dn'] : $this->base_dn; + $this->groups_base_dn = $this->prop['groups']['base_dn'] ?: $this->base_dn; // User specific access, generate the proper values to use. if ($this->prop['user_specific']) { @@ -663,7 +676,7 @@ $attrib = array_merge($attrib, array_values($this->group_types)); $attrib[] = 'memberURL'; - $filter = $this->prop['groups']['member_filter'] ? $this->prop['groups']['member_filter'] : '(objectclass=*)'; + $filter = $this->prop['groups']['member_filter'] ?: '(objectclass=*)'; for ($i=0; $i < $entry[$attr]['count']; $i++) { if (empty($entry[$attr][$i])) @@ -1298,7 +1311,7 @@ } } - return $newdn ? $newdn : true; + return $newdn ?: true; } /** @@ -1358,7 +1371,7 @@ function delete_all($with_groups = false) { // searching for contact entries - $dn_list = $this->ldap->list_entries($this->base_dn, $this->prop['filter'] ? $this->prop['filter'] : '(objectclass=*)'); + $dn_list = $this->ldap->list_entries($this->base_dn, $this->prop['filter'] ?: '(objectclass=*)'); if (!empty($dn_list)) { foreach ($dn_list as $idx => $entry) { @@ -1433,7 +1446,7 @@ if ($this->is_group_entry($rec)) { $out['_type'] = 'group'; $out['readonly'] = true; - $fieldmap['name'] = $this->group_data['name_attr'] ? $this->group_data['name_attr'] : $this->prop['groups']['name_attr']; + $fieldmap['name'] = $this->group_data['name_attr'] ?: $this->prop['groups']['name_attr']; } // assign object type from object class mapping @@ -1458,7 +1471,7 @@ 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; + $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) @@ -1536,6 +1549,20 @@ } } + foreach ($this->formats as $fld => $format) { + if (empty($ldap_data[$fld])) { + continue; + } + + switch ($format['type']) { + case 'date': + if ($dt = rcube_utils::anytodatetime($ldap_data[$fld])) { + $ldap_data[$fld] = $dt->format($format['format']); + } + break; + } + } + return $ldap_data; } @@ -1555,6 +1582,7 @@ list($name, $limit) = explode(':', $namev, 2); $suffix = $limit ? ':'.$limit : ''; + $name = strtolower($name); return (isset($aliases[$name]) ? $aliases[$name] : $name) . $suffix; } @@ -1672,7 +1700,7 @@ $filter = $this->prop['groups']['filter']; $scope = $this->prop['groups']['scope']; $name_attr = $this->prop['groups']['name_attr']; - $email_attr = $this->prop['groups']['email_attr'] ? $this->prop['groups']['email_attr'] : 'mail'; + $email_attr = $this->prop['groups']['email_attr'] ?: 'mail'; $sort_attrs = $this->prop['groups']['sort'] ? (array)$this->prop['groups']['sort'] : array($name_attr); $sort_attr = $sort_attrs[0]; @@ -1820,11 +1848,11 @@ $new_dn = 'cn=' . rcube_ldap_generic::quote_string($group_name, true) . ',' . $this->groups_base_dn; $new_gid = self::dn_encode($new_dn); $member_attr = $this->get_group_member_attr(); - $name_attr = $this->prop['groups']['name_attr'] ? $this->prop['groups']['name_attr'] : 'cn'; + $name_attr = $this->prop['groups']['name_attr'] ?: 'cn'; $new_entry = array( 'objectClass' => $this->prop['groups']['object_classes'], - $name_attr => $group_name, - $member_attr => '', + $name_attr => $group_name, + $member_attr => '', ); if (!$this->ldap->add_entry($new_dn, $new_entry)) { @@ -1976,7 +2004,7 @@ $base_dn = $this->groups_base_dn; $contact_dn = self::dn_decode($contact_id); - $name_attr = $this->prop['groups']['name_attr'] ? $this->prop['groups']['name_attr'] : 'cn'; + $name_attr = $this->prop['groups']['name_attr'] ?: 'cn'; $member_attr = $this->get_group_member_attr(); $add_filter = ''; -- Gitblit v1.9.1