From 3f250a0fe63725f3daca904d93fd63d5eb437c56 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Fri, 9 Nov 2012 11:50:33 +0100 Subject: [PATCH] Add config options to automatically generate LDAP attributes for new entries --- config/main.inc.php.dist | 5 +++++ program/include/rcube_ldap.php | 29 ++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) 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