summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG2
-rw-r--r--config/main.inc.php.dist5
-rw-r--r--program/include/rcube_ldap.php29
3 files changed, 35 insertions, 1 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 02fe0e2ce..27f653a8f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,8 @@
CHANGELOG Roundcube Webmail
===========================
+- Upgraded to jQuery 1.8.2 and jQuery UI 1.9.1
+- Add config option to automatically generate LDAP attributes for new entries
- Fix AREA links handling (#1488792)
- Better client-side timezone detection using the jsTimezoneDetect library (#1488725)
- Fix possible HTTP DoS on error in keep-alive requests (#1488782)
diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist
index dafee72f1..35fe0e8f6 100644
--- a/config/main.inc.php.dist
+++ b/config/main.inc.php.dist
@@ -636,6 +636,11 @@ $rcmail_config['ldap_public']['Verisign'] = array(
),
// Map of contact sub-objects (attribute name => objectClass(es)), e.g. 'c' => 'country'
'sub_fields' => array(),
+ // Generate values for the following LDAP attributes automatically when creating a new record
+ 'autovalues' => array(
+ // 'uid' => 'md5(microtime())', // You may specify PHP code snippets which are then eval'ed
+ // 'mail' => '{givenname}.{sn}@mydomain.com', // or composite strings with placeholders for existing attributes
+ ),
'sort' => 'cn', // The field to sort the listing by.
'scope' => 'sub', // search mode: sub|base|list
'filter' => '(objectClass=inetOrgPerson)', // used for basic listing (if not empty) and will be &'d with search queries. example: status=act
diff --git a/program/include/rcube_ldap.php b/program/include/rcube_ldap.php
index 61a073fa3..90ce73ae2 100644
--- a/program/include/rcube_ldap.php
+++ b/program/include/rcube_ldap.php
@@ -160,7 +160,7 @@ class rcube_ldap extends rcube_addressbook
}
// 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($this->prop['autovalues']))) {
$this->prop['required_fields'][] = $this->prop['LDAP_rdn'];
}
@@ -1086,6 +1086,9 @@ class rcube_ldap extends rcube_addressbook
$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;
foreach ($this->prop['required_fields'] as $fld) {
@@ -1389,6 +1392,30 @@ class rcube_ldap extends rcube_addressbook
}
}
+ /**
+ * 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