2 commits - plugins/calendar plugins/kolab_delegation plugins/libkolab plugins/tasklist
Aleksander Machniak
machniak at kolabsys.com
Mon Dec 10 12:20:03 CET 2012
plugins/calendar/drivers/kolab/kolab_driver.php | 7
plugins/kolab_delegation/kolab_delegation.php | 12
plugins/kolab_delegation/package.xml | 4
plugins/libkolab/README | 18 -
plugins/libkolab/config.inc.php.dist | 22 +
plugins/libkolab/lib/kolab_storage.php | 197 +++++++++++++--
plugins/libkolab/lib/kolab_storage_folder.php | 54 ++--
plugins/libkolab/libkolab.php | 2
plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php | 6
9 files changed, 250 insertions(+), 72 deletions(-)
New commits:
commit ae4b707a719061534d717c759aaf5097b3bfe0c4
Author: Aleksander Machniak <machniak at kolabsys.com>
Date: Mon Dec 10 12:19:42 2012 +0100
Update package files list
diff --git a/plugins/kolab_delegation/package.xml b/plugins/kolab_delegation/package.xml
index 10de30d..3901e47 100644
--- a/plugins/kolab_delegation/package.xml
+++ b/plugins/kolab_delegation/package.xml
@@ -46,12 +46,16 @@
<file name="localization/en_US.inc" role="data"></file>
<file name="skins/classic/deviceactions.png" role="data"></file>
<file name="skins/classic/foldertypes.png" role="data"></file>
+ <file name="skins/classic/read.png" role="data"></file>
<file name="skins/classic/style.css" role="data"></file>
+ <file name="skins/classic/write.png" role="data"></file>
<file name="skins/classic/templates/editform.html" role="data"></file>
<file name="skins/classic/templates/settings.html" role="data"></file>
<file name="skins/larry/delegation.png" role="data"></file>
<file name="skins/larry/foldertypes.png" role="data"></file>
+ <file name="skins/larry/read.png" role="data"></file>
<file name="skins/larry/style.css" role="data"></file>
+ <file name="skins/larry/write.png" role="data"></file>
<file name="skins/larry/templates/editform.html" role="data"></file>
<file name="skins/larry/templates/settings.html" role="data"></file>
</dir>
commit 56abf7e5f36f8092ec2cc8db0f14af9aa033bc08
Author: Aleksander Machniak <machniak at kolabsys.com>
Date: Mon Dec 10 12:17:41 2012 +0100
Use client-side subscriptions for folders activation state (calendar, tasklist)
Add kolab_use_subscriptions option to limit folders visibility in Kolab plugins (#1314)
diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php
index c9cc7e7..4787445 100644
--- a/plugins/calendar/drivers/kolab/kolab_driver.php
+++ b/plugins/calendar/drivers/kolab/kolab_driver.php
@@ -127,7 +127,7 @@ class kolab_driver extends calendar_driver
'showalarms' => $cal->alarms,
'class_name' => $cal->get_namespace(),
'default' => $cal->storage->default,
- 'active' => $cal->storage->is_subscribed(),
+ 'active' => $cal->storage->is_active(),
);
}
@@ -154,7 +154,7 @@ class kolab_driver extends calendar_driver
if ($writeable && $cal->readonly) {
continue;
}
- if ($active && !$cal->storage->is_subscribed()) {
+ if ($active && !$cal->storage->is_active()) {
continue;
}
if ($personal && $cal->get_namespace() != 'personal') {
@@ -177,7 +177,6 @@ class kolab_driver extends calendar_driver
public function create_calendar($prop)
{
$prop['type'] = 'event';
- $prop['subscribed'] = $prop['active'] ? kolab_storage::SERVERSIDE_SUBSCRIPTION : null;
$folder = kolab_storage::folder_update($prop);
if ($folder === false) {
@@ -249,7 +248,7 @@ class kolab_driver extends calendar_driver
public function subscribe_calendar($prop)
{
if ($prop['id'] && ($cal = $this->calendars[$prop['id']])) {
- return $cal->storage->subscribe($prop['active'], kolab_storage::SERVERSIDE_SUBSCRIPTION);
+ return $cal->storage->activate($prop['active']);
}
return false;
diff --git a/plugins/kolab_delegation/kolab_delegation.php b/plugins/kolab_delegation/kolab_delegation.php
index 2667167..f6709e3 100644
--- a/plugins/kolab_delegation/kolab_delegation.php
+++ b/plugins/kolab_delegation/kolab_delegation.php
@@ -92,6 +92,7 @@ class kolab_delegation extends rcube_plugin
$delegators = $engine->list_delegators();
$other_ns = $storage->get_namespace('other');
$folders = $storage->list_folders();
+ $use_subs = $this->rc->config->get('kolab_use_subscriptions');
$identities = $this->rc->user->list_identities();
$emails = array();
$uids = array();
@@ -139,7 +140,16 @@ class kolab_delegation extends rcube_plugin
$prefix = $ns[0] . $delegator['imap_uid'];
// subscribe delegator's folder
if ($folder === $prefix || strpos($folder, $prefix . substr($ns[0], -1)) === 0) {
- $storage->subscribe($folder);
+ // Event/Task folders need client-side activation
+ $type = kolab_storage::folder_type($folder);
+ if (preg_match('/^(event|task)/i', $type)) {
+ kolab_storage::folder_activate($folder);
+ }
+ // Subscribe to mail folders and (if system is configured
+ // to display only subscribed folders) to other
+ if ($use_subs || preg_match('/^mail/i', $type)) {
+ $storage->subscribe($folder);
+ }
}
}
}
diff --git a/plugins/libkolab/README b/plugins/libkolab/README
index 54bf4ae..7631220 100644
--- a/plugins/libkolab/README
+++ b/plugins/libkolab/README
@@ -28,19 +28,5 @@ To do so, execute the SQL commands in SQL/<yourdatabase>.sql
CONFIGURATION
-------------
-The following options can be configured in Roundcube's main config file
-or a local config file (config.inc.php) located in the plugin folder.
-
-// Enable caching of Kolab objects in local database
-$rcmail_config['kolab_cache'] = true;
-
-// Specify format version to write Kolab objects (must be a string value!)
-$rcmail_config['kolab_format_version'] = '3.0';
-
-// Optional override of the URL to read and trigger Free/Busy information of Kolab users
-// Defaults to https://<imap-server->/freebusy
-$rcmail_config['kolab_freebusy_server'] = 'https://<some-host>/<freebusy-path>';
-
-// Set this option to disable SSL certificate checks when triggering Free/Busy (enabled by default)
-$rcmail_config['kolab_ssl_verify_peer'] = false;
-
+Rename config.inc.php.dist to config.inc.php in the plugin folder.
+For available configuration options see config.inc.php.dist file.
diff --git a/plugins/libkolab/config.inc.php.dist b/plugins/libkolab/config.inc.php.dist
index 6c7d05a..01e1334 100644
--- a/plugins/libkolab/config.inc.php.dist
+++ b/plugins/libkolab/config.inc.php.dist
@@ -1,10 +1,22 @@
<?php
- /* Configuration for libkolab */
- $rcmail_config['kolab_cache'] = true;
- $rcmail_config['kolab_format_version'] = '3.0';
+/* Configuration for libkolab */
- $rcmail_config['kolab_freebusy_server'] = 'https://' . $_SESSION['imap_host'] . '/freebusy';
- $rcmail_config['kolab_ssl_verify_peer'] = true;
+// Enable caching of Kolab objects in local database
+$rcmail_config['kolab_cache'] = true;
+
+// Specify format version to write Kolab objects (must be a string value!)
+$rcmail_config['kolab_format_version'] = '3.0';
+
+// Optional override of the URL to read and trigger Free/Busy information of Kolab users
+// Defaults to https://<imap-server->/freebusy
+$rcmail_config['kolab_freebusy_server'] = 'https://<some-host>/<freebusy-path>';
+
+// Set this option to disable SSL certificate checks when triggering Free/Busy (enabled by default)
+$rcmail_config['kolab_ssl_verify_peer'] = false;
+
+// Enables listing of only subscribed folders. This e.g. will limit
+// folders in calendar view or available addressbooks
+$rcmail_config['kolab_use_subscriptions'] = false;
?>
diff --git a/plugins/libkolab/lib/kolab_storage.php b/plugins/libkolab/lib/kolab_storage.php
index 6151b9a..ebbadf2 100644
--- a/plugins/libkolab/lib/kolab_storage.php
+++ b/plugins/libkolab/lib/kolab_storage.php
@@ -5,6 +5,7 @@
*
* @version @package_version@
* @author Thomas Bruederli <bruederli at kolabsys.com>
+ * @author Aleksander Machniak <machniak at kolabsys.com>
*
* Copyright (C) 2012, Kolab Systems AG <contact at kolabsys.com>
*
@@ -28,13 +29,13 @@ class kolab_storage
const CTYPE_KEY_PRIVATE = '/private/vendor/kolab/folder-type';
const COLOR_KEY_SHARED = '/shared/vendor/kolab/color';
const COLOR_KEY_PRIVATE = '/private/vendor/kolab/color';
- const SERVERSIDE_SUBSCRIPTION = 0;
- const CLIENTSIDE_SUBSCRIPTION = 1;
public static $version = '3.0';
public static $last_error;
private static $ready = false;
+ private static $subscriptions;
+ private static $states;
private static $config;
private static $cache;
private static $imap;
@@ -92,7 +93,7 @@ class kolab_storage
$folders = $folderdata = array();
if (self::setup()) {
- foreach ((array)self::list_folders('', '*', $type, false, $folderdata) as $foldername) {
+ foreach ((array)self::list_folders('', '*', $type, null, $folderdata) as $foldername) {
$folders[$foldername] = new kolab_storage_folder($foldername, $folderdata[$foldername]);
}
}
@@ -192,13 +193,14 @@ class kolab_storage
/**
* Creates IMAP folder
*
- * @param string $name Folder name (UTF7-IMAP)
- * @param string $type Folder type
- * @param bool $subscribed Sets folder subscription
+ * @param string $name Folder name (UTF7-IMAP)
+ * @param string $type Folder type
+ * @param bool $subscribed Sets folder subscription
+ * @param bool $active Sets folder state (client-side subscription)
*
* @return bool True on success, false on failure
*/
- public static function folder_create($name, $type = null, $subscribed = false)
+ public static function folder_create($name, $type = null, $subscribed = false, $active = false)
{
self::setup();
@@ -211,6 +213,10 @@ class kolab_storage
if (!$saved) {
self::$imap->delete_folder($name);
}
+ // activate folder
+ else if ($active) {
+ self::set_state($name, true);
+ }
}
}
@@ -222,6 +228,7 @@ class kolab_storage
return false;
}
+
/**
* Renames IMAP folder
*
@@ -247,10 +254,12 @@ class kolab_storage
* Does additional checks for permissions and folder name restrictions
*
* @param array Hash array with folder properties and metadata
- * - name: Folder name
- * - oldname: Old folder name when changed
- * - parent: Parent folder to create the new one in
- * - type: Folder type to create
+ * - name: Folder name
+ * - oldname: Old folder name when changed
+ * - parent: Parent folder to create the new one in
+ * - type: Folder type to create
+ * - subscribed: Subscribed flag (IMAP subscription)
+ * - active: Activation flag (client-side subscription)
* @return mixed New folder name or False on failure
*/
public static function folder_update(&$prop)
@@ -319,7 +328,7 @@ class kolab_storage
}
// create new folder
else {
- $result = self::folder_create($folder, $prop['type'], $prop['subscribed'] === self::SERVERSIDE_SUBSCRIPTION);
+ $result = self::folder_create($folder, $prop['type'], $prop['subscribed'], $prop['active']);
}
// save color in METADATA
@@ -532,17 +541,22 @@ class kolab_storage
* @param string Optional root folder
* @param string Optional name pattern
* @param string Data type to list folders for (contact,distribution-list,event,task,note,mail)
- * @param string Enable to return subscribed folders only
+ * @param boolean Enable to return subscribed folders only (null to use configured subscription mode)
* @param array Will be filled with folder-types data
*
* @return array List of folders
*/
- public static function list_folders($root = '', $mbox = '*', $filter = null, $subscribed = false, &$folderdata = array())
+ public static function list_folders($root = '', $mbox = '*', $filter = null, $subscribed = null, &$folderdata = array())
{
if (!self::setup()) {
return null;
}
+ // use IMAP subscriptions
+ if ($subscribed === null && self::$config->get('kolab_use_subscriptions')) {
+ $subscribed = true;
+ }
+
if (!$filter) {
// Get ALL folders list, standard way
if ($subscribed) {
@@ -566,7 +580,7 @@ class kolab_storage
$regexp = '/^' . preg_quote($filter, '/') . '(\..+)?$/';
// In some conditions we can skip LIST command (?)
- if ($subscribed == false && $filter != 'mail' && $prefix == '*') {
+ if (!$subscribed && $filter != 'mail' && $prefix == '*') {
foreach ($folderdata as $folder => $type) {
if (!preg_match($regexp, $type)) {
unset($folderdata[$folder]);
@@ -644,6 +658,7 @@ class kolab_storage
return 'mail';
}
+
/**
* Sets folder content-type.
*
@@ -665,4 +680,156 @@ class kolab_storage
return $success;
}
+
+
+ /**
+ * Check subscription status of this folder
+ *
+ * @param string $folder Folder name
+ *
+ * @return boolean True if subscribed, false if not
+ */
+ public static function folder_is_subscribed($folder)
+ {
+ if (self::$subscriptions === null) {
+ self::setup();
+ self::$subscriptions = self::$imap->list_folders_subscribed();
+ }
+
+ return in_array($folder, self::$subscriptions);
+ }
+
+
+ /**
+ * Change subscription status of this folder
+ *
+ * @param string $folder Folder name
+ *
+ * @return True on success, false on error
+ */
+ public static function folder_subscribe($folder)
+ {
+ self::setup();
+
+ if (self::$imap->subscribe($folder)) {
+ self::$subscriptions === null;
+ return true;
+ }
+
+ return false;
+ }
+
+
+ /**
+ * Change subscription status of this folder
+ *
+ * @param string $folder Folder name
+ *
+ * @return True on success, false on error
+ */
+ public static function folder_unsubscribe($folder)
+ {
+ self::setup();
+
+ if (self::$imap->unsubscribe($folder)) {
+ self::$subscriptions === null;
+ return true;
+ }
+
+ return false;
+ }
+
+
+ /**
+ * Check activation status of this folder
+ *
+ * @param string $folder Folder name
+ *
+ * @return boolean True if active, false if not
+ */
+ public static function folder_is_active($folder)
+ {
+ $active_folders = self::get_states();
+
+ return in_array($folder, $active_folders);
+ }
+
+
+ /**
+ * Change activation status of this folder
+ *
+ * @param string $folder Folder name
+ *
+ * @return True on success, false on error
+ */
+ public static function folder_activate($folder)
+ {
+ return self::set_state($folder, true);
+ }
+
+
+ /**
+ * Change activation status of this folder
+ *
+ * @param string $folder Folder name
+ *
+ * @return True on success, false on error
+ */
+ public static function folder_deactivate($folder)
+ {
+ return self::set_state($folder, false);
+ }
+
+
+ /**
+ * Return list of active folders
+ */
+ private static function get_states()
+ {
+ if (self::$states !== null) {
+ return self::$states;
+ }
+
+ $rcube = rcube::get_instance();
+ $folders = $rcube->config->get('kolab_active_folders');
+
+ if ($folders !== null) {
+ self::$states = !empty($folders) ? explode('**', $folders) : array();
+ }
+ // for backward-compatibility copy server-side subscriptions to activation states
+ else {
+ self::setup();
+ if (self::$subscriptions === null) {
+ self::$subscriptions = self::$imap->list_folders_subscribed();
+ }
+ self::$states = self::$subscriptions;
+ $folders = implode(self::$states, '**');
+ $rcube->user->save_prefs(array('kolab_active_folders' => $folders));
+ }
+
+ return self::$states;
+ }
+
+
+ /**
+ * Update list of active folders
+ */
+ private static function set_state($folder, $state)
+ {
+ self::get_states();
+
+ // update in-memory list
+ $idx = array_search($folder, self::$states);
+ if ($state && $idx === false) {
+ self::$states[] = $folder;
+ }
+ else if (!$state && $idx !== false) {
+ unset(self::$states[$idx]);
+ }
+
+ // update user preferences
+ $folders = implode(self::$states, '**');
+ $rcube = rcube::get_instance();
+ return $rcube->user->save_prefs(array('kolab_active_folders' => $folders));
+ }
}
diff --git a/plugins/libkolab/lib/kolab_storage_folder.php b/plugins/libkolab/lib/kolab_storage_folder.php
index 363745e..27517cf 100644
--- a/plugins/libkolab/lib/kolab_storage_folder.php
+++ b/plugins/libkolab/lib/kolab_storage_folder.php
@@ -5,6 +5,7 @@
*
* @version @package_version@
* @author Thomas Bruederli <bruederli at kolabsys.com>
+ * @author Aleksander Machniak <machniak at kolabsys.com>
*
* Copyright (C) 2012, Kolab Systems AG <contact at kolabsys.com>
*
@@ -236,46 +237,47 @@ class kolab_storage_folder
}
/**
- * Check subscription status of this folder
+ * Check activation status of this folder
*
- * @param string Subscription type (kolab_storage::SERVERSIDE_SUBSCRIPTION or kolab_storage::CLIENTSIDE_SUBSCRIPTION)
- * @return boolean True if subscribed, false if not
+ * @return boolean True if enabled, false if not
*/
- public function is_subscribed($type = 0)
+ public function is_active()
{
- static $subscribed; // local cache
-
- if ($type == kolab_storage::SERVERSIDE_SUBSCRIPTION) {
- if (!$subscribed)
- $subscribed = $this->imap->list_folders_subscribed();
+ return kolab_storage::folder_is_active($this->name);
+ }
- return in_array($this->name, $subscribed);
- }
- else if (kolab_storage::CLIENTSIDE_SUBSCRIPTION) {
- // TODO: implement this
- return true;
- }
+ /**
+ * Change activation status of this folder
+ *
+ * @param boolean The desired subscription status: true = active, false = not active
+ *
+ * @return True on success, false on error
+ */
+ public function activate($active)
+ {
+ return $active ? kolab_storage::folder_activate($this->name) : kolab_storage::folder_deactivate($this->name);
+ }
- return false;
+ /**
+ * Check subscription status of this folder
+ *
+ * @return boolean True if subscribed, false if not
+ */
+ public function is_subscribed()
+ {
+ return kolab_storage::folder_is_subscribed($this->name);
}
/**
* Change subscription status of this folder
*
* @param boolean The desired subscription status: true = subscribed, false = not subscribed
- * @param string Subscription type (kolab_storage::SERVERSIDE_SUBSCRIPTION or kolab_storage::CLIENTSIDE_SUBSCRIPTION)
+ *
* @return True on success, false on error
*/
- public function subscribe($subscribed, $type = 0)
+ public function subscribe($subscribed)
{
- if ($type == kolab_storage::SERVERSIDE_SUBSCRIPTION) {
- return $subscribed ? $this->imap->subscribe($this->name) : $this->imap->unsubscribe($this->name);
- }
- else {
- // TODO: implement this
- }
-
- return false;
+ return $subscribed ? kolab_storage::folder_subscribe($this->name) : kolab_storage::folder_unsubscribe($this->name);
}
diff --git a/plugins/libkolab/libkolab.php b/plugins/libkolab/libkolab.php
index 2d03733..b5ff968 100644
--- a/plugins/libkolab/libkolab.php
+++ b/plugins/libkolab/libkolab.php
@@ -59,6 +59,4 @@ class libkolab extends rcube_plugin
$p['fetch_headers'] = trim($p['fetch_headers'] .' X-KOLAB-TYPE X-KOLAB-MIME-VERSION');
return $p;
}
-
-
}
diff --git a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php
index 3409e9c..a713311 100644
--- a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php
+++ b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php
@@ -119,7 +119,7 @@ class tasklist_kolab_driver extends tasklist_driver
'color' => $folder->get_color('0000CC'),
'showalarms' => isset($prefs[$list_id]['showalarms']) ? $prefs[$list_id]['showalarms'] : $alarms,
'editable' => !$readonly,
- 'active' => $folder->is_subscribed(kolab_storage::SERVERSIDE_SUBSCRIPTION),
+ 'active' => $folder->is_active(),
'parentfolder' => $path_imap,
'default' => $folder->default,
'class_name' => trim($folder->get_namespace() . ($folder->default ? ' default' : '')),
@@ -155,7 +155,7 @@ class tasklist_kolab_driver extends tasklist_driver
public function create_list($prop)
{
$prop['type'] = 'task' . ($prop['default'] ? '.default' : '');
- $prop['subscribed'] = kolab_storage::SERVERSIDE_SUBSCRIPTION; // subscribe to folder by default
+ $prop['active'] = true; // activate folder by default
$folder = kolab_storage::folder_update($prop);
if ($folder === false) {
@@ -229,7 +229,7 @@ class tasklist_kolab_driver extends tasklist_driver
public function subscribe_list($prop)
{
if ($prop['id'] && ($folder = $this->folders[$prop['id']])) {
- return $folder->subscribe($prop['active'], kolab_storage::SERVERSIDE_SUBSCRIPTION);
+ return $folder->activate($prop['active']);
}
return false;
}
More information about the commits
mailing list