summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'dev-php/horde-framework-kolab/files/HK-GW-Share_caching-3.2_ALPHA.patch')
-rw-r--r--dev-php/horde-framework-kolab/files/HK-GW-Share_caching-3.2_ALPHA.patch325
1 files changed, 325 insertions, 0 deletions
diff --git a/dev-php/horde-framework-kolab/files/HK-GW-Share_caching-3.2_ALPHA.patch b/dev-php/horde-framework-kolab/files/HK-GW-Share_caching-3.2_ALPHA.patch
new file mode 100644
index 0000000..6710321
--- /dev/null
+++ b/dev-php/horde-framework-kolab/files/HK-GW-Share_caching-3.2_ALPHA.patch
@@ -0,0 +1,325 @@
+Fixes the share caching for the Share module.
+* * *
+Fixes the global share caching.
+
+diff -r 3d04200d5eec framework/Kolab/Kolab/IMAP.php
+--- a/framework/Kolab/Kolab/IMAP.php Wed Oct 10 11:19:54 2007 +0200
++++ b/framework/Kolab/Kolab/IMAP.php Wed Oct 10 11:20:13 2007 +0200
+@@ -371,7 +371,18 @@ class Kolab_IMAP {
+ */
+ function listFolders()
+ {
+- $folders = array();
++ require_once 'Horde/SessionObjects.php';
++
++ static $folders = array();
++
++ if (empty($folders)) {
++ $session = &Horde_SessionObjects::singleton();
++ $folders = &$session->query('horde_kolab_imaplist');
++ }
++
++ if (!empty($folders)) {
++ return $folders;
++ }
+
+ // Connect to the IMAP server
+ $imap = &Kolab_IMAP_Connection::singleton(Kolab::getServer('imap'),
+@@ -417,6 +428,9 @@ class Kolab_IMAP {
+
+ $folders[] = array($folder, $foldertype, $default);
+ }
++
++ $session = &Horde_SessionObjects::singleton();
++ $session->overwrite('horde_kolab_imaplist', $folders, false);
+
+ $imap->disconnect();
+
+diff -r 3d04200d5eec framework/Share/Share/kolab.php
+--- a/framework/Share/Share/kolab.php Wed Oct 10 11:19:54 2007 +0200
++++ b/framework/Share/Share/kolab.php Wed Oct 10 11:20:13 2007 +0200
+@@ -66,6 +66,38 @@ class Horde_Share_kolab extends Horde_Sh
+ }
+
+ /**
++ * Initializes the object.
++ */
++ function __wakeup()
++ {
++ global $conf;
++
++ if (empty($conf['kolab']['enabled'])) {
++ Horde::fatal('You must enable the kolab settings to use the Kolab Share driver.', __FILE__, __LINE__);
++ }
++
++ foreach (array_keys($this->_cache) as $name) {
++ $this->_cache[$name]->setShareOb($this);
++ $this->_cache[$name]->storageObject->setStorage($this->_storage);
++ }
++
++ parent::__wakeup();
++ }
++
++ /**
++ * Returns the properties that need to be serialized.
++ *
++ * @return array List of serializable properties.
++ */
++ function __sleep()
++ {
++ $properties = get_object_vars($this);
++ unset($properties['_sortList']);
++ $properties = array_keys($properties);
++ return $properties;
++ }
++
++ /**
+ * Returns an array of all shares that $userid has access to.
+ *
+ * @param string $userid The userid of the user to check access for.
+@@ -242,7 +274,14 @@ class Horde_Share_Storage_kolab {
+ function Horde_Share_Storage_kolab($app)
+ {
+ $this->_app = $app;
+-
++ return $this->__wakeup();
++ }
++
++ /**
++ * Initializes the object.
++ */
++ function __wakeup()
++ {
+ // Connect to the IMAP server
+ $this->_imap = &Kolab_IMAP_Connection::singleton(Kolab::getServer('imap'),
+ $GLOBALS['conf']['kolab']['imap']['port'],
+@@ -254,6 +293,19 @@ class Horde_Share_Storage_kolab {
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
++ }
++
++ /**
++ * Returns the properties that need to be serialized.
++ *
++ * @return array List of serializable properties.
++ */
++ function __sleep()
++ {
++ $properties = get_object_vars($this);
++ unset($properties['_imap']);
++ $properties = array_keys($properties);
++ return $properties;
+ }
+
+ /**
+@@ -363,10 +415,12 @@ class Horde_Share_Storage_kolab {
+ * @param string $object The share to fetch.
+ * @param string $class Subclass of Horde_Share_Object to use. Defaults
+ * to ImapObject_Share.
++ * @param array $perms The permissions of the share if known
++ *
+ * @return Horde_Share_Object_kolab The share object or a PEAR error if
+ * the share was not found.
+ */
+- function &getObject($object, $class = 'ImapObject_Share')
++ function &getObject($object, $class = 'ImapObject_Share', $perms = null)
+ {
+ if (empty($object)) {
+ $error = PEAR::raiseError('No object requested.');
+@@ -399,14 +453,17 @@ class Horde_Share_Storage_kolab {
+ $object = $this->getDefaultShare();
+ }
+
+- $share->setFolder($object);
+- $result = $share->accessible();
+- if (is_a($result, 'PEAR_Error')) {
+- return $result;
+- }
+- if (!$result) {
+- return PEAR::raiseError(sprintf(_("Share \"%s\" not accessible."), $object));
+- }
++ $share->setFolder($object, $perms);
++ /* FIXME: Is this call necessary at all? You should try to access a share that
++ * cannot be accessed and see what happens.
++ *$result = $share->accessible();
++ *if (is_a($result, 'PEAR_Error')) {
++ *return $result;
++ *}
++ *if (!$result) {
++ *return PEAR::raiseError(sprintf(_("Share \"%s\" not accessible."), $object));
++ *}
++ */
+ return $share;
+ }
+
+@@ -689,6 +746,19 @@ class Horde_Share_Object_kolab extends H
+ class Horde_Share_Object_kolab extends Horde_Share_Object {
+
+ /**
++ * Returns the properties that need to be serialized.
++ *
++ * @return array List of serializable properties.
++ */
++ function __sleep()
++ {
++ $properties = get_object_vars($this);
++ unset($properties['_shareOb']);
++ $properties = array_keys($properties);
++ return $properties;
++ }
++
++ /**
+ * Checks to see if a user has a given permission.
+ *
+ * @param string $userid The userid of the user.
+@@ -803,6 +873,19 @@ class ImapObject_Share {
+ }
+
+ /**
++ * Returns the properties that need to be serialized.
++ *
++ * @return array List of serializable properties.
++ */
++ function __sleep()
++ {
++ $properties = get_object_vars($this);
++ unset($properties['_storage']);
++ $properties = array_keys($properties);
++ return $properties;
++ }
++
++ /**
+ * Sets the storage driver for this storage object.
+ *
+ * @param Horde_Share_Storage_kolab $storage A {@link Horde_Share_storage_kolab} instance.
+@@ -810,6 +893,10 @@ class ImapObject_Share {
+ function setStorage(&$storage)
+ {
+ $this->_storage = &$storage;
++ if (isset($this->_perm)) {
++ $imap = &$storage->getImap();
++ $this->_perm->setImap($imap);
++ }
+ }
+
+ /**
+@@ -817,25 +904,29 @@ class ImapObject_Share {
+ *
+ * @param string $folder Name of the IMAP folder.
+ * @param boolean $force Enforce setting the folder.
+- */
+- function setFolder($folder, $force = false)
++ * @param array $perms The permissions of the folder if they are known
++ */
++ function setFolder($folder, $force = false, $perms = null)
+ {
+ if ($this->_folder == KOLAB_SHARE_INVALID || $force) {
+ $this->_folder = $folder;
+ if (isset($this->_perm)) {
+ $this->_perm->setFolder($folder);
+ } else {
+- if ($this->exists()) {
+- $perms = null;
+- } else {
+- $perms = array('users' => array(Auth::getAuth() => PERMS_SHOW
+- | PERMS_READ
+- | PERMS_EDIT
+- | PERMS_DELETE));
++ if (empty($perms)) {
++ if ($this->exists()) {
++ // The permissions are unknown but the folder exists -> discover permissions
++ $perms = null;
++ } else {
++ $perms = array('users' => array(Auth::getAuth() => PERMS_SHOW
++ | PERMS_READ
++ | PERMS_EDIT
++ | PERMS_DELETE));
++ }
+ }
+ $perm = &new ImapFolder_Permission($folder,
+ $this->_storage->getImap(),
+- $this, $perms);
++ $this->getOwner(), $perms);
+ $this->setPermission($perm);
+ }
+ }
+@@ -1265,11 +1356,11 @@ class ImapFolder_Permission extends Data
+ var $data;
+
+ /**
+- * The storage driver for this object.
+- *
+- * @var Horde_Share_Storage_kolab
+- */
+- var $_storage;
++ * Owner of the share.
++ *
++ * @var string
++ */
++ var $_owner;
+
+ /**
+ * The ImapFolder_Permission constructor.
+@@ -1280,11 +1371,11 @@ class ImapFolder_Permission extends Data
+ * @param Horde_Storage $storage A reference to the storage class
+ * @param array $perms A set of initial permissions.
+ */
+- function ImapFolder_Permission($folder, &$imap, &$storage, $perms = null)
++ function ImapFolder_Permission($folder, &$imap, $owner, $perms = null)
+ {
+ $this->_folder = $folder;
+ $this->_imap = &$imap;
+- $this->_storage = &$storage;
++ $this->_owner = $owner;
+
+ // Load the permission from the folder now
+ if (empty($perms)) {
+@@ -1296,6 +1387,29 @@ class ImapFolder_Permission extends Data
+ }
+
+ $this->data = $perms;
++ }
++
++ /**
++ * Returns the properties that need to be serialized.
++ *
++ * @return array List of serializable properties.
++ */
++ function __sleep()
++ {
++ $properties = get_object_vars($this);
++ unset($properties['_imap']);
++ $properties = array_keys($properties);
++ return $properties;
++ }
++
++ /**
++ * Sets the imap driver for this permission object.
++ *
++ * @param
++ */
++ function setImap(&$imap)
++ {
++ $this->_imap = &$imap;
+ }
+
+ /**
+@@ -1405,6 +1519,8 @@ class ImapFolder_Permission extends Data
+ */
+ function save()
+ {
++ // FIXME: If somebody else accessed the folder before us, we will overwrite
++ // the change here.
+ $current = $this->getPerm();
+
+ foreach ($this->data as $user => $user_perms) {
+@@ -1482,7 +1598,7 @@ class ImapFolder_Permission extends Data
+ function savePermission($user, $perms)
+ {
+ // Convert the horde permission style to IMAP permissions
+- $result = $user == $this->_storage->getOwner() ? 'a' : '';
++ $result = $user == $this->_owner ? 'a' : '';
+ if ($perms & PERMS_SHOW) {
+ $result .= 'l';
+ }