gunnar: server/horde/horde-framework HK-GW-Share_caching.patch, NONE, 1.1 horde-framework-kolab.spec, 1.23, 1.24
cvs at kolab.org
cvs at kolab.org
Wed Oct 10 11:46:39 CEST 2007
Author: gunnar
Update of /kolabrepository/server/horde/horde-framework
In directory doto:/tmp/cvs-serv22012/horde/horde-framework
Modified Files:
horde-framework-kolab.spec
Added Files:
HK-GW-Share_caching.patch
Log Message:
The final Horde patch before the beta release. This intends to fix Horde Share caching for Kolab which is the second level of IMAP caching in Horde/Kolab.
--- NEW FILE: HK-GW-Share_caching.patch ---
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';
}
Index: horde-framework-kolab.spec
===================================================================
RCS file: /kolabrepository/server/horde/horde-framework/horde-framework-kolab.spec,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- horde-framework-kolab.spec 4 Oct 2007 09:47:55 -0000 1.23
+++ horde-framework-kolab.spec 10 Oct 2007 09:46:37 -0000 1.24
@@ -29,6 +29,7 @@
Patch0: HK-GW-Fix_Prefs_for_Ingo.patch
Patch1: HK-GW-Fix_the_share_params.patch
Patch2: HK-GW-Fix_annotation_use.patch
+Patch3: HK-GW-Share_caching.patch
# Build Info
Prefix: %{l_prefix}
@@ -52,6 +53,7 @@
%patch -p2 -P 0
%patch -p2 -P 1
%patch -p2 -P 2
+ %patch -p2 -P 3
%build
More information about the commits
mailing list