plugins/calendar plugins/libkolab
Thomas Brüderli
bruederli at kolabsys.com
Thu Jun 21 09:42:18 CEST 2012
plugins/calendar/drivers/kolab/kolab_calendar.php | 7 -
plugins/calendar/drivers/kolab/kolab_driver.php | 103 +---------------------
plugins/libkolab/lib/kolab_storage.php | 98 ++++++++++++++++++++
3 files changed, 105 insertions(+), 103 deletions(-)
New commits:
commit dce4ed076b1f0b36e068a995a37e60e488cdbaf6
Author: Thomas Bruederli <thomas at roundcube.net>
Date: Thu Jun 21 09:42:24 2012 +0200
Move folder create/rename logic to libkolab for common use in different Kolab plugins
diff --git a/plugins/calendar/drivers/kolab/kolab_calendar.php b/plugins/calendar/drivers/kolab/kolab_calendar.php
index a8a2755..9e9825e 100644
--- a/plugins/calendar/drivers/kolab/kolab_calendar.php
+++ b/plugins/calendar/drivers/kolab/kolab_calendar.php
@@ -26,9 +26,6 @@
class kolab_calendar
{
- const COLOR_KEY_SHARED = '/shared/vendor/kolab/color';
- const COLOR_KEY_PRIVATE = '/shared/vendor/kolab/color';
-
public $id;
public $ready = false;
public $readonly = true;
@@ -146,8 +143,8 @@ class kolab_calendar
public function get_color()
{
// color is defined in folder METADATA
- $metadata = $this->storage->get_metadata(array(self::COLOR_KEY_PRIVATE, self::COLOR_KEY_SHARED));
- if (($color = $metadata[self::COLOR_KEY_PRIVATE]) || ($color = $metadata[self::COLOR_KEY_SHARED])) {
+ $metadata = $this->storage->get_metadata(array(kolab_storage::COLOR_KEY_PRIVATE, kolab_storage::COLOR_KEY_SHARED));
+ if (($color = $metadata[kolab_storage::COLOR_KEY_PRIVATE]) || ($color = $metadata[kolab_storage::COLOR_KEY_SHARED])) {
return $color;
}
diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php
index 41dc337..089909d 100644
--- a/plugins/calendar/drivers/kolab/kolab_driver.php
+++ b/plugins/calendar/drivers/kolab/kolab_driver.php
@@ -154,15 +154,13 @@ class kolab_driver extends calendar_driver
*/
public function create_calendar($prop)
{
- $folder = $this->folder_update($prop);
+ $prop['type'] = 'event';
+ $prop['subscribed'] = $prop['active'] ? kolab_storage::SERVERSIDE_SUBSCRIPTION : null;
+ $folder = kolab_storage::folder_update($prop);
if ($folder === false) {
return false;
}
-
- // subscribe to new calendar by default
- $storage = kolab_storage::get_folder($folder);
- $storage->subscribe($prop['active'], kolab_storage::SERVERSIDE_SUBSCRIPTION);
// create ID
$id = kolab_storage::folder_id($folder);
@@ -190,8 +188,8 @@ class kolab_driver extends calendar_driver
public function edit_calendar($prop)
{
if ($prop['id'] && ($cal = $this->calendars[$prop['id']])) {
- $oldfolder = $cal->get_realname();
- $newfolder = $this->folder_update($prop);
+ $prop['oldname'] = $cal->get_realname();
+ $newfolder = kolab_storage::folder_update($prop);
if ($newfolder === false) {
return false;
@@ -235,97 +233,6 @@ class kolab_driver extends calendar_driver
/**
- * Rename or Create a new IMAP folder
- *
- * @param array Hash array with calendar properties
- *
- * @return mixed New folder name or False on failure
- */
- private function folder_update(&$prop)
- {
- $folder = rcube_charset::convert($prop['name'], RCMAIL_CHARSET, 'UTF7-IMAP');
- $oldfolder = $prop['oldname']; // UTF7
- $parent = $prop['parent']; // UTF7
- $storage = $this->rc->get_storage();
- $delimiter = $storage->get_hierarchy_delimiter();
-
- if (strlen($oldfolder)) {
- $options = $storage->folder_info($oldfolder);
- }
-
- if (!empty($options) && ($options['norename'] || $options['protected'])) {
- }
- // sanity checks (from steps/settings/save_folder.inc)
- else if (!strlen($folder)) {
- $this->last_error = 'Invalid folder name';
- return false;
- }
- else if (strlen($folder) > 128) {
- $this->last_error = 'Folder name too long';
- return false;
- }
- else {
- // these characters are problematic e.g. when used in LIST/LSUB
- foreach (array($delimiter, '%', '*') as $char) {
- if (strpos($folder, $delimiter) !== false) {
- $this->last_error = 'Invalid folder name';
- return false;
- }
- }
- }
-
- if (!empty($options) && ($options['protected'] || $options['norename'])) {
- $folder = $oldfolder;
- }
- else if (strlen($parent)) {
- $folder = $parent . $delimiter . $folder;
- }
- else {
- // add namespace prefix (when needed)
- $folder = $storage->mod_folder($folder, 'in');
- }
-
- // Check access rights to the parent folder
- if (strlen($parent) && (!strlen($oldfolder) || $oldfolder != $folder)) {
- $parent_opts = $storage->folder_info($parent);
- if ($parent_opts['namespace'] != 'personal'
- && (empty($parent_opts['rights']) || !preg_match('/[ck]/', implode($parent_opts['rights'])))
- ) {
- $this->last_error = 'No permission to create folder';
- return false;
- }
- }
-
- // update the folder name
- if (strlen($oldfolder)) {
- if ($oldfolder != $folder) {
- if (!($result = kolab_storage::folder_rename($oldfolder, $folder)))
- $this->last_error = kolab_storage::$last_error;
- }
- else
- $result = true;
- }
- // create new folder
- else {
- if (!($result = kolab_storage::folder_create($folder, 'event')))
- $this->last_error = kolab_storage::$last_error;
- }
-
- // save color in METADATA
- // TODO: also save 'showalarams' and other properties here
-
- if ($result && $prop['color']) {
- if (!($meta_saved = $storage->set_metadata(array(kolab_calendar::COLOR_KEY_SHARED => $prop['color'])))) // try in shared namespace
- $meta_saved = $storage->set_metadata(array(kolab_calendar::COLOR_KEY_PRIVATE => $prop['color'])); // try in private namespace
- if ($meta_saved)
- unset($prop['color']); // unsetting will prevent fallback to local user prefs
- }
-
- return $result ? $folder : false;
- }
-
-
- /**
* Delete the given calendar with all its contents
*
* @see calendar_driver::remove_calendar()
diff --git a/plugins/libkolab/lib/kolab_storage.php b/plugins/libkolab/lib/kolab_storage.php
index 5924530..a19c71b 100644
--- a/plugins/libkolab/lib/kolab_storage.php
+++ b/plugins/libkolab/lib/kolab_storage.php
@@ -25,6 +25,8 @@
class kolab_storage
{
const CTYPE_KEY = '/shared/vendor/kolab/folder-type';
+ const COLOR_KEY_SHARED = '/shared/vendor/kolab/color';
+ const COLOR_KEY_PRIVATE = '/shared/vendor/kolab/color';
const SERVERSIDE_SUBSCRIPTION = 0;
const CLIENTSIDE_SUBSCRIPTION = 1;
@@ -223,6 +225,102 @@ class kolab_storage
/**
+ * Rename or Create a new IMAP folder.
+ *
+ * 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
+ * @return mixed New folder name or False on failure
+ */
+ public static function folder_update(&$prop)
+ {
+ self::setup();
+
+ $folder = rcube_charset::convert($prop['name'], RCMAIL_CHARSET, 'UTF7-IMAP');
+ $oldfolder = $prop['oldname']; // UTF7
+ $parent = $prop['parent']; // UTF7
+ $delimiter = self::$imap->get_hierarchy_delimiter();
+
+ if (strlen($oldfolder)) {
+ $options = self::$imap->folder_info($oldfolder);
+ }
+
+ if (!empty($options) && ($options['norename'] || $options['protected'])) {
+ }
+ // sanity checks (from steps/settings/save_folder.inc)
+ else if (!strlen($folder)) {
+ self::$last_error = 'Invalid folder name';
+ return false;
+ }
+ else if (strlen($folder) > 128) {
+ self::$last_error = 'Folder name too long';
+ return false;
+ }
+ else {
+ // these characters are problematic e.g. when used in LIST/LSUB
+ foreach (array($delimiter, '%', '*') as $char) {
+ if (strpos($folder, $delimiter) !== false) {
+ self::$last_error = 'Invalid folder name';
+ return false;
+ }
+ }
+ }
+
+ if (!empty($options) && ($options['protected'] || $options['norename'])) {
+ $folder = $oldfolder;
+ }
+ else if (strlen($parent)) {
+ $folder = $parent . $delimiter . $folder;
+ }
+ else {
+ // add namespace prefix (when needed)
+ $folder = self::$imap->mod_folder($folder, 'in');
+ }
+
+ // Check access rights to the parent folder
+ if (strlen($parent) && (!strlen($oldfolder) || $oldfolder != $folder)) {
+ $parent_opts = self::$imap->folder_info($parent);
+ if ($parent_opts['namespace'] != 'personal'
+ && (empty($parent_opts['rights']) || !preg_match('/[ck]/', implode($parent_opts['rights'])))
+ ) {
+ self::$last_error = 'No permission to create folder';
+ return false;
+ }
+ }
+
+ // update the folder name
+ if (strlen($oldfolder)) {
+ if ($oldfolder != $folder) {
+ $result = self::folder_rename($oldfolder, $folder);
+ }
+ else
+ $result = true;
+ }
+ // create new folder
+ else {
+ $result = self::folder_create($folder, $prop['type'], $prop['subscribed'] === self::SERVERSIDE_SUBSCRIPTION);
+ }
+
+ // save color in METADATA
+ // TODO: also save 'showalarams' and other properties here
+ // TODO: change private/shared precedence depending on private or shared folder
+
+ if ($result && $prop['color']) {
+ if (!($meta_saved = self::$imap->set_metadata($folder, array(self::COLOR_KEY_SHARED => $prop['color'])))) // try in shared namespace
+ $meta_saved = self::$imap->set_metadata($folder, array(self::COLOR_KEY_PRIVATE => $prop['color'])); // try in private namespace
+ if ($meta_saved)
+ unset($prop['color']); // unsetting will prevent fallback to local user prefs
+ }
+
+ return $result ? $folder : false;
+ }
+
+
+ /**
* Getter for human-readable name of Kolab object (folder)
* See http://wiki.kolab.org/UI-Concepts/Folder-Listing for reference
*
More information about the commits
mailing list