gunnar: server/horde/horde-turba HK-GW-Changes_after_ALPHA.patch, NONE, 1.1 HK-GW-Fix_address_book_deletion_1.patch, NONE, 1.1 HK-GW-Fix_editing_contacts.patch, NONE, 1.1 HK-GW-Fix_notice_on_addressbook_creation.patch, NONE, 1.1 HK-GW-Fix_share_id_change.patch, NONE, 1.1 HK-GW-Ldap_read_only_fix.patch, NONE, 1.1 horde-turba-kolab.spec, 1.15, 1.16 sources.php, 1.2, 1.3

cvs at kolab.org cvs at kolab.org
Tue Oct 2 16:21:36 CEST 2007


Author: gunnar

Update of /kolabrepository/server/horde/horde-turba
In directory doto:/tmp/cvs-serv6110/horde/horde-turba

Modified Files:
	horde-turba-kolab.spec sources.php 
Added Files:
	HK-GW-Changes_after_ALPHA.patch 
	HK-GW-Fix_address_book_deletion_1.patch 
	HK-GW-Fix_editing_contacts.patch 
	HK-GW-Fix_notice_on_addressbook_creation.patch 
	HK-GW-Fix_share_id_change.patch HK-GW-Ldap_read_only_fix.patch 
Log Message:
Adding the necessary turba and mnemo fixes for the next beta release.

--- NEW FILE: HK-GW-Changes_after_ALPHA.patch ---
Some necessary fixes for Turba from CVS.

diff -r 0ca2d81b250b turba/addressbooks.php
--- a/turba/addressbooks.php	Tue Oct 02 15:05:12 2007 +0200
+++ b/turba/addressbooks.php	Tue Oct 02 15:12:26 2007 +0200
@@ -4,7 +4,7 @@
  *
  * Copyright 2005-2007 The Horde Project (http://www.horde.org/)
  *
- * $Horde: turba/addressbooks.php,v 1.32 2007/08/01 10:43:29 jan Exp $
+ * $Horde: turba/addressbooks.php,v 1.33 2007/08/16 17:35:26 mrubinsk Exp $
  *
  * See the enclosed file LICENSE for license information (ASL).  If you did
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
@@ -102,7 +102,6 @@ case 'add':
         $notification->push(sprintf(_("There was an error creating this address book: %s"), $share->getMessage()), 'horde.error');
     } else {
         $notification->push(sprintf(_("The address book \"%s\" was created successfully."), $share->get('name')), 'horde.success');
-        Turba::addSourceFromShare($share);
     }
 
     header('Location: ' . Horde::applicationUrl('addressbooks.php', true));
diff -r 0ca2d81b250b turba/lib/Driver/kolab.php
--- a/turba/lib/Driver/kolab.php	Tue Oct 02 15:05:12 2007 +0200
+++ b/turba/lib/Driver/kolab.php	Tue Oct 02 15:12:26 2007 +0200
@@ -2,7 +2,7 @@
 /**
  * @package Turba
  *
- * $Horde: turba/lib/Driver/kolab.php,v 1.27 2007/06/19 09:50:30 wrobel Exp $
+ * $Horde: turba/lib/Driver/kolab.php,v 1.28 2007/09/19 07:43:19 wrobel Exp $
  */
 
 /** Kolab support class. */
@@ -151,12 +151,36 @@ class Turba_Driver_kolab extends Turba_D
         }
     }
 
+    /**
+     * Creates a new Horde_Share
+     *
+     * @param array  The params for the share.
+     *
+     * @return mixed  The share object or PEAR_Error.
+     * @since Turba 2.2
+     */
+    function &createShare($share_id, $params)
+    {
+        if (isset($params['params']['default']) && $params['params']['default'] === true) {
+            $share_id = Auth::getAuth();
+        }
+        
+        $result = &Turba::createShare($share_id, $params);
+        return $result;
+    }
+
+    function checkDefaultShare(&$share, $srcConfig)
+    {
+        $params = @unserialize($share->get('params'));
+        return $params['default'];
+    }
+
 }
 
 /**
  * Horde Turba wrapper to distinguish between both Kolab driver implementations.
  *
- * $Horde: turba/lib/Driver/kolab.php,v 1.27 2007/06/19 09:50:30 wrobel Exp $
+ * $Horde: turba/lib/Driver/kolab.php,v 1.28 2007/09/19 07:43:19 wrobel Exp $
  *
  * Copyright 2004-2007 The Horde Project (http://www.horde.org/)
  *
diff -r 0ca2d81b250b turba/lib/Turba.php
--- a/turba/lib/Turba.php	Tue Oct 02 15:05:12 2007 +0200
+++ b/turba/lib/Turba.php	Tue Oct 02 15:12:26 2007 +0200
@@ -1,6 +1,6 @@
 <?php
 /**
- * $Horde: turba/lib/Turba.php,v 1.148 2007/08/02 21:19:27 mrubinsk Exp $
+ * $Horde: turba/lib/Turba.php,v 1.152 2007/08/24 19:37:54 mrubinsk Exp $
  *
  * @package Turba
  */
@@ -213,8 +213,6 @@ class Turba {
      */
     function guessLastname($name)
     {
-        global $prefs;
-
         $name = trim(preg_replace('|\s|', ' ', $name));
         if (!empty($name)) {
             /* Assume that last names are always before any commas. */
@@ -469,24 +467,27 @@ class Turba {
     }
 
     /**
-     * Add a new source entry based on a Turba share directly to $cfgSources,
-     * bypassing any permission checking.
-     *
-     * @param Horde_Share object  The share to add.
+     * Retrieve a new source config entry based on a Turba share.
+     *
+     * @param Horde_Share object  The share to base config on.
+     *
      * @since Turba 2.2
      */
-    function addSourceFromShare(&$share)
-    {
-        $name = $share->getName();
-        if (!isset($GLOBALS['cfgSources'][$name])) {
-            list($source, $user) = explode(':', $name, 2);
-            if ($user != Auth::getAuth()) {
-                $newSrc = $GLOBALS['cfgSources'][$source];
-                unset($newSrc['use_shares']);
-                $newSrc['title'] = $share->get('name');
-                $GLOBALS['cfgSources'][$name] = $newSrc;
-            }
-        }
+    function getSourceFromShare(&$share)
+    {
+        // Require a fresh config file.
+        require TURBA_BASE . '/config/sources.php';
+
+        $params = @unserialize($share->get('params'));
+        $newConfig = $cfgSources[$params['source']];
+        $newConfig['params']['config'] = $cfgSources[$params['source']];
+        $newConfig['params']['config']['params']['share'] = &$share;
+        $newConfig['params']['config']['params']['name'] = $params['name'];
+        $newConfig['title'] = $share->get('name');
+        $newConfig['type'] = 'share';
+        $newConfig['use_shares'] = false;
+
+        return $newConfig;
     }
 
     /**
@@ -616,10 +617,13 @@ class Turba {
 
         // Kinda hackish way of indicating what tasks need to run, until
         // a more general mechanism is available.
-        $needed_tasks = array('upgradeprefs');
+        $needed_tasks = array('upgradeprefs', 'upgradelists');
 
         $successful = array();
         $existing = @unserialize($GLOBALS['prefs']->getValue('turba_maintenance_tasks'));
+        if (empty($existing)) {
+            $existing = array();
+        }
         foreach ($needed_tasks as $taskname) {
             if (array_search($taskname, $existing) === false) {
                 include dirname(__file__) . '/Maintenance/Task/' . basename($taskname) . '.php';
diff -r 0ca2d81b250b turba/lib/api.php
--- a/turba/lib/api.php	Tue Oct 02 15:05:12 2007 +0200
+++ b/turba/lib/api.php	Tue Oct 02 15:12:26 2007 +0200
@@ -2,7 +2,7 @@
 /**
  * Turba external API interface.
  *
- * $Horde: turba/lib/api.php,v 1.214 2007/08/02 04:37:18 chuck Exp $
+ * $Horde: turba/lib/api.php,v 1.219 2007/08/29 12:13:30 jan Exp $
  *
  * This file defines Turba's external API interface. Other applications can
  * interact with Turba through this API.
@@ -180,18 +180,34 @@ function _turba_removeUserData($user)
 
     /* We need a clean copy of the $cfgSources array here.*/
     require TURBA_BASE . '/config/sources.php';
-
     $hasError = false;
-    $sourceKeys = array_keys($cfgSources);
-    foreach ($sourceKeys as $sourceKey) {
-        $driver = &Turba_Driver::singleton($sourceKey);
-        if (is_a($driver, 'PEAR_Error')) {
+    $shares = null;
+
+    foreach ($cfgSources as $source) {
+        if (empty($source['use_shares'])) {
+            // Shares not enabled for this source
+            $driver = &Turba_Driver::singleton($source);
+            if (is_a($driver, 'PEAR_Error')) {
+                $hasError = true;
+            } else {
+                $result = $driver->removeUserData($user);
+                if (is_a($result, 'PEAR_Error')) {
+                    $hasError = true;
+                }
+            }
+        }
+    }
+
+    $shares = &$GLOBALS['turba_shares']->listShares($user,
+                                                    PERMS_EDIT,
+                                                    $user);
+    foreach ($shares as $share) {
+        $params = @unserialize($share->get('params'));
+        $config = Turba::getSourceFromShare($share);
+        $driver = &Turba_Driver::singleton($config);
+        $result = $driver->removeUserData($user);
+        if (is_a($result, 'PEAR_Error')) {
             $hasError = true;
-        } else {
-            $result = $driver->removeUserData($user);
-            if (is_a($result, 'PEAR_Error')) {
-                $hasError = true;
-            }
         }
     }
 
@@ -918,6 +934,10 @@ function _turba_search($names = array(),
         return array();
     }
 
+    if (!is_array($names)) {
+        $names = is_null($names) ? array() : array($names);
+    }
+
     if (!count($sources)) {
         $sources = array(key($cfgSources));
     }
@@ -934,7 +954,8 @@ function _turba_search($names = array(),
         }
 
         // Skip sources that aren't browseable if the search is empty.
-        if (!count($names) && empty($cfgSources[$source]['browse'])) {
+        if (empty($cfgSources[$source]['browse'])
+            && (!count($names) || (count($names) == 1 && empty($names[0])))) {
             continue;
         }
 
@@ -1024,6 +1045,7 @@ function _turba_search($names = array(),
                     $listatt = $ob->getAttributes();
                     $seeninlist = array();
                     $members = $ob->listMembers();
+                    $listName = $ob->getValue('name');
                     if (is_a($members, 'Turba_List')) {
                         if ($members->count() > 0) {
                             if (!isset($results[$name])) {
@@ -1032,7 +1054,8 @@ function _turba_search($names = array(),
                             $emails = array();
                             while ($ob = $members->next()) {
                                 $att = $ob->getAttributes();
-                                foreach ($att as $key => $value) {
+                                foreach (array_keys($att) as $key) {
+                                    $value = $ob->getValue($key);
                                     if (!empty($value) && isset($attributes[$key]) &&
                                         $attributes[$key]['type'] == 'email' &&
                                         empty($seeninlist[trim(String::lower($att['name'])) . trim(String::lower($value))])) {
@@ -1042,7 +1065,7 @@ function _turba_search($names = array(),
                                     }
                                 }
                             }
-                            $results[$name][] = array('name' => $listatt['name'], 'email' => implode(', ', $emails), 'id' => $listatt['__key'], 'source' => $source);
+                            $results[$name][] = array('name' => $listName, 'email' => implode(', ', $emails), 'id' => $listatt['__key'], 'source' => $source);
                         }
                     }
                 }
diff -r 0ca2d81b250b turba/templates/addressbooks.inc
--- a/turba/templates/addressbooks.inc	Tue Oct 02 15:05:12 2007 +0200
+++ b/turba/templates/addressbooks.inc	Tue Oct 02 15:12:26 2007 +0200
@@ -120,7 +120,7 @@ function verifyDelete()
     <strong><?php echo _("Permissions") ?></strong>
    </td>
    <td>
-    <input type="button" name="perms" class="button" onclick="if (document.editshares.editshare.value) popup(editURL.replace(/%40ID%40/, document.editshares.editshare.value));" value="<?php echo _("Edit") ?>" />
+    <input type="button" name="perms" class="button" onclick="if (document.editshares.editshare.value) popup(editURL.replace(/%40ID%40/, encodeURIComponent(document.editshares.editshare.value)));" value="<?php echo _("Edit") ?>" />
    </td>
   </tr>
 <?php endif; ?>

--- NEW FILE: HK-GW-Fix_address_book_deletion_1.patch ---
Fixes address book deletion.

diff -r 8e461aedd317 turba/lib/Driver/kolab.php
--- a/turba/lib/Driver/kolab.php	Tue Oct 02 09:24:16 2007 +0200
+++ b/turba/lib/Driver/kolab.php	Tue Oct 02 09:30:45 2007 +0200
@@ -892,11 +892,6 @@ class Turba_Driver_kolab_wrapper_new ext
             return $result;
         }
 
-        if ($sourceName != null) {
-            Horde::logMessage('deleteAll only working for current share. Called for $sourceName', __FILE__, __LINE__, PEAR_LOG_ERR);
-            return PEAR::raiseError(sprintf(_("Cannot delete all address book entries for %s"), $sourceName));
-        }
-
         return $this->_store->deleteAll();
     }
 

--- NEW FILE: HK-GW-Fix_editing_contacts.patch ---
Fixes editing contacts.

diff -r de15e2f26408 turba/lib/Driver/share.php
--- a/turba/lib/Driver/share.php	Tue Oct 02 12:25:42 2007 +0200
+++ b/turba/lib/Driver/share.php	Tue Oct 02 12:38:50 2007 +0200
@@ -58,7 +58,7 @@ class Turba_Driver_share extends Turba_D
      */
     function getName()
     {
-        $share_parts = explode(':', $this->_share->getName());
+        $share_parts = explode(':', $this->_share->getId());
         return array_pop($share_parts);
     }
 

--- NEW FILE: HK-GW-Fix_notice_on_addressbook_creation.patch ---
Fixes a notice when creating a new share.

diff -r 6da2fcb4e060 turba/lib/Driver/kolab.php
--- a/turba/lib/Driver/kolab.php	Tue Oct 02 07:47:47 2007 +0200
+++ b/turba/lib/Driver/kolab.php	Tue Oct 02 08:18:26 2007 +0200
@@ -222,7 +222,7 @@ class Turba_Driver_kolab_wrapper {
      */
     function Turba_Driver_kolab_wrapper($addressbook, &$kolab)
     {
-        if ($addressbook[0] == '_') {
+        if ($addressbook && $addressbook[0] == '_') {
             $addressbook = substr($addressbook, 1);
         }
         $this->_addressbook = $addressbook;

--- NEW FILE: HK-GW-Fix_share_id_change.patch ---
This fixes a problem with the way the Kolab share driver handles ids.

diff -r dd05e667699d turba/lib/Turba.php
--- a/turba/lib/Turba.php	Tue Oct 02 06:47:29 2007 +0200
+++ b/turba/lib/Turba.php	Tue Oct 02 06:55:13 2007 +0200
@@ -439,7 +439,7 @@ class Turba {
 
                         $source_config = $sources[$source];
                         $source_config['params']['share'] = &$share;
-                        $sources[$sourceKey] = $source_config;
+                        $sources[$share->getId()] = $source_config;
                     } else {
                         $notification->push($driver, 'horde.error');
                     }
@@ -564,7 +564,7 @@ class Turba {
         /* Add the new addressbook to the user's list of visible
          * address books. */
         $prefs = explode("\n", $GLOBALS['prefs']->getValue('addressbooks'));
-        if (array_search($share_id, $prefs) === false) {
+        if (array_search($share->getId(), $prefs) === false) {
             $GLOBALS['prefs']->setValue('addressbooks', $GLOBALS['prefs']->getValue('addressbooks') . "\n" . $share_id);
         }
         return $share;

--- NEW FILE: HK-GW-Ldap_read_only_fix.patch ---
This is a temporary fix to mark the ldap addressbook as read-only. This should be solved with the Horde Perms package but this needs a new driver.

diff -r b7be146cb26a turba/lib/Driver/ldap.php
--- a/turba/lib/Driver/ldap.php	Tue Oct 02 07:18:36 2007 +0200
+++ b/turba/lib/Driver/ldap.php	Tue Oct 02 07:19:20 2007 +0200
@@ -53,6 +53,9 @@ class Turba_Driver_ldap extends Turba_Dr
         }
         if (empty($params['deref'])) {
             $params['deref'] = LDAP_DEREF_NEVER;
+        }
+        if (empty($params['read_only'])) {
+            $params['read_only'] = false;
         }
 
         parent::Turba_Driver($params);
@@ -749,4 +752,25 @@ class Turba_Driver_ldap extends Turba_Dr
         return $dn;
     }
 
+    /**
+     * Checks if the current user has the requested permission
+     * on this source.
+     *
+     * @param integer $perm  The permission to check for.
+     *
+     * @return boolean  true if user has permission, false otherwise.
+     */
+     function hasPermission($perm)
+    {
+        if ($this->_params['read_only'] === false) {
+            return parent::hasPermission($perm);
+        } else {
+            switch ($perm) {
+                case PERMS_EDIT: return false;
+                case PERMS_DELETE: return false;
+                default: return parent::hasPermission($perm);
+            }
+        }
+    }
+
 }

Index: horde-turba-kolab.spec
===================================================================
RCS file: /kolabrepository/server/horde/horde-turba/horde-turba-kolab.spec,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -d -r1.15 -r1.16
--- horde-turba-kolab.spec	1 Oct 2007 15:47:20 -0000	1.15
+++ horde-turba-kolab.spec	2 Oct 2007 14:21:34 -0000	1.16
@@ -3,7 +3,7 @@
 %define         V_package horde-%{V_horde_name}-kolab
 %define         V_year  2007
 %define         V_month 10
-%define         V_day   01
+%define         V_day   02
 %define         V_version 2.2_alpha
 %define         V_uver    2.2-alpha
 %define         V_date %{V_year}-%{V_month}-%{V_day}
@@ -26,24 +26,12 @@
 Source1:        conf.php
 Source2:        sources.php
 
-##################################################
-# PATCH COMMENT
-#
-#   Check if this can be integrated upstream
-#
-#   The second part of the patch allows to rename 
-#   shares
-#Patch0:         lib-Turba.php.patch
-# FIXME: Disabled for now.
-
-##################################################
-# PATCH COMMENT
-#
-#   This is required until the Horde::Perms package
-#   has been rewritten so that it does not use
-#   the Horde::DataTree module anymore
-Patch0:         config-sources.php.dist.patch
-Patch1:         lib-Driver-ldap.php.patch
+Patch0:         HK-GW-Fix_notice_on_addressbook_creation.patch
+Patch1:         HK-GW-Fix_address_book_deletion_1.patch
+Patch2:         HK-GW-Changes_after_ALPHA.patch
+Patch3:         HK-GW-Fix_share_id_change.patch
+Patch4:         HK-GW-Fix_editing_contacts.patch
+Patch5:         HK-GW-Ldap_read_only_fix.patch
 
 # Build Info
 Prefix:		%{l_prefix}
@@ -77,9 +65,12 @@
 	%setup -c -q -n %{V_horde_name}-h3-%{V_uver}
 
 	cd %{V_horde_name}-h3-%{V_uver}
-	%patch -p0 -P 0
-	%patch -p0 -P 1
-#	%patch -p0 -P 2
+	%patch -p2 -P 0
+	%patch -p2 -P 1
+	%patch -p2 -P 2
+	%patch -p2 -P 3
+	%patch -p2 -P 4
+	%patch -p2 -P 5
 	cd ..
 
 %build

Index: sources.php
===================================================================
RCS file: /kolabrepository/server/horde/horde-turba/sources.php,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- sources.php	25 May 2007 12:31:37 -0000	1.2
+++ sources.php	2 Oct 2007 14:21:34 -0000	1.3
@@ -137,83 +137,86 @@
 /* Begin Kolab sources. */
 if (!empty($GLOBALS['conf']['kolab']['enabled'])) {
 
-    require_once 'Horde/Kolab.php';
+    /* Only use LDAP if we have that extension in PHP */
+    if (function_exists('ldap_connect')) {
+        require_once 'Horde/Kolab.php';
 
-    if (!is_callable('Kolab', 'getServer')) {
-        $server = $GLOBALS['conf']['kolab']['ldap']['server'];
-    } else {
-        $server = Kolab::getServer('ldap');
-    }
+        if (!is_callable('Kolab', 'getServer')) {
+            $server = $GLOBALS['conf']['kolab']['ldap']['server'];
+        } else {
+            $server = Kolab::getServer('ldap');
+        }
 
-    /* A global address book for a Kolab Server. This is typically a
-     * read-only public directory, stored in the default Kolab LDAP server.
-     * The user accessing this should have read permissions to the shared
-     * directory in LDAP. */
-    $cfgSources['kolab_global'] = array(
-        'title' => _("Global Address Book"),
-        'type' => 'ldap',
-        'params' => array(
-            'server' => $server,
-            'port' => $GLOBALS['conf']['kolab']['ldap']['port'],
-            'tls' => false,
-            'root' => $GLOBALS['conf']['kolab']['ldap']['basedn'],
-            'sizelimit' => 200,
-            'dn' => array('cn'),
-            'objectclass' => array(
-                'inetOrgPerson'
+        /* A global address book for a Kolab Server. This is typically a
+         * read-only public directory, stored in the default Kolab LDAP server.
+         * The user accessing this should have read permissions to the shared
+         * directory in LDAP. */
+        $cfgSources['kolab_global'] = array(
+            'title' => _("Global Address Book"),
+            'type' => 'ldap',
+            'params' => array(
+                'server' => $server,
+                'port' => $GLOBALS['conf']['kolab']['ldap']['port'],
+                'tls' => false,
+                'root' => $GLOBALS['conf']['kolab']['ldap']['basedn'],
+                'sizelimit' => 200,
+                'dn' => array('cn'),
+                'objectclass' => array(
+                    'inetOrgPerson'
+                ),
+                'scope' => 'one',
+                'charset' => 'utf-8',
+                'version' => 3,
+                'bind_dn' => '',
+                'bind_password' => '',
+                'read_only' => true,
             ),
-            'scope' => 'one',
-            'charset' => 'utf-8',
-            'version' => 3,
-            'bind_dn' => '',
-            'bind_password' => '',
-            'read_only' => true,
-        ),
-        'map' => array(
-            '__key'             => 'dn',
-            'name'              => 'cn',
-            'firstname'         => 'givenName',
-            'lastname'          => 'sn',
-            'email'             => 'mail',
-            'alias'             => 'alias',
-            'title'             => 'title',
-            'company'           => 'o',
-            'workStreet'        => 'street',
-            'workCity'          => 'l',
-            'workProvince'      => 'st',
-            'workPostalCode'    => 'postalCode',
-            'workCountry'       => 'c',
-            'homePhone'         => 'homePhone',
-            'workPhone'         => 'telephoneNumber',
-            'cellPhone'         => 'mobile',
-            'fax'               => 'fax',
-            'notes'             => 'description',
-            'freebusyUrl'       => 'kolabHomeServer',
-        ),
-        'search' => array(
-            'name',
-            'firstname',
-            'lastname',
-            'email',
-            'title',
-            'company',
-            'workAddress',
-            'workCity',
-            'workProvince',
-            'workPostalCode',
-            'workCountry',
-            'homePhone',
-            'workPhone',
-            'cellPhone',
-            'fax',
-            'notes',
-        ),
-        'strict' => array(
-            'dn',
-        ),
-        'export' => true,
-        'browse' => true,
-    );
+            'map' => array(
+                '__key'             => 'dn',
+                'name'              => 'cn',
+                'firstname'         => 'givenName',
+                'lastname'          => 'sn',
+                'email'             => 'mail',
+                'alias'             => 'alias',
+                'title'             => 'title',
+                'company'           => 'o',
+                'workStreet'        => 'street',
+                'workCity'          => 'l',
+                'workProvince'      => 'st',
+                'workPostalCode'    => 'postalCode',
+                'workCountry'       => 'c',
+                'homePhone'         => 'homePhone',
+                'workPhone'         => 'telephoneNumber',
+                'cellPhone'         => 'mobile',
+                'fax'               => 'fax',
+                'notes'             => 'description',
+                'freebusyUrl'       => 'kolabHomeServer',
+            ),
+            'search' => array(
+                'name',
+                'firstname',
+                'lastname',
+                'email',
+                'title',
+                'company',
+                'workAddress',
+                'workCity',
+                'workProvince',
+                'workPostalCode',
+                'workCountry',
+                'homePhone',
+                'workPhone',
+                'cellPhone',
+                'fax',
+                'notes',
+            ),
+            'strict' => array(
+                'dn',
+            ),
+            'export' => true,
+            'browse' => true,
+        );
+    }
 
     /**
      * The local address books for a Kolab user. These are stored in specially





More information about the commits mailing list