Branch '2.3-stable' - pear/Kolab_Storage release-notes.txt

Gunnar Wrobel wrobel at kolabsys.com
Fri Jul 29 07:38:42 CEST 2011


 pear/Kolab_Storage/ChangeLog                                                                   |    4 
 pear/Kolab_Storage/package.info                                                                |    6 
 pear/Kolab_Storage/patches/Kolab_Storage-0.5.2/issue3416.patch                                 |  198 ++++++++++
 pear/Kolab_Storage/patches/Kolab_Storage-0.5.2/t_framework_HK_UV_NoDuplicationOnUidChange.diff |   28 +
 pear/Kolab_Storage/patches/Kolab_Storage-0.5.2/t_kronolith_HK_GW_ExportEventList.patch         |   13 
 release-notes.txt                                                                              |   13 
 6 files changed, 258 insertions(+), 4 deletions(-)

New commits:
commit 8ac71dd8ef3bc4e41699abf291e03175df200d3c
Author: Gunnar Wrobel <wrobel at pardus.de>
Date:   Fri Jul 29 05:37:00 2011 +0000

    Update to Kolab_Storage-0.5.2

diff --git a/pear/Kolab_Storage/ChangeLog b/pear/Kolab_Storage/ChangeLog
index 176d886..97bebb0 100644
--- a/pear/Kolab_Storage/ChangeLog
+++ b/pear/Kolab_Storage/ChangeLog
@@ -1,3 +1,7 @@
+2011-07-29  Gunnar Wrobel  <p at rdus.de>
+
+	* package.info: Update to 0.5.2.
+
 2011-05-30  Gunnar Wrobel  <p at rdus.de>
 
 	* package.info: Update to 0.5.1.
diff --git a/pear/Kolab_Storage/package.info b/pear/Kolab_Storage/package.info
index 21a841e..e66f281 100644
--- a/pear/Kolab_Storage/package.info
+++ b/pear/Kolab_Storage/package.info
@@ -13,13 +13,13 @@ package_url='http://pear.horde.org/index.php?package='
 package_origin='WGET'
 
 # Version number
-version='0.5.1'
+version='0.5.2'
 
 # Package release number
-release='20110530'
+release='20110729'
 
 # Source URL to download from
-sourceurl='http://files.kolab.org/server/development-2.3/externals'
+sourceurl='http://files.kolab.org/incoming/wrobel'
 
 # In which PHP library location should the library get installed
 php_lib_loc='php'
diff --git a/pear/Kolab_Storage/patches/Kolab_Storage-0.5.2/issue3416.patch b/pear/Kolab_Storage/patches/Kolab_Storage-0.5.2/issue3416.patch
new file mode 100644
index 0000000..0f71833
--- /dev/null
+++ b/pear/Kolab_Storage/patches/Kolab_Storage-0.5.2/issue3416.patch
@@ -0,0 +1,198 @@
+From: Gunnar Wrobel <wrobel at pardus.de>
+Subject: [PATCH] issue3416.patch
+
+Do not block when free/busy is not available.
+
+STATUS: UNMERGED
+
+REF: http://issues.kolab.org/issue3416
+
+Signed-off-by: Gunnar Wrobel <wrobel at pardus.de>
+
+--- a/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder.php	2010-04-28 17:18:16.000000000 +0200
++++ b/framework/Kolab_Storage/lib/Horde/Kolab/Storage/Folder.php	2010-04-28 18:05:34.684348740 +0200
+@@ -31,6 +31,8 @@
+ require_once 'Horde/String.php';
+ require_once 'Horde/NLS.php';
+ 
++require_once 'HTTP/Request.php';
++
+ /**
+  * The root of the Kolab annotation hierarchy, used on the various IMAP folder
+  * that are used by Kolab clients.
+@@ -1256,14 +1258,15 @@
+ 
+         $options['method'] = 'GET';
+         $options['timeout'] = 5;
++        $options['readTimeout'] = array(5, 1000);
++        $options['socketOptions']['http']['timeout'] = 5.0;
+         $options['allowRedirects'] = true;
+ 
+         if (isset($conf['http']['proxy']) && !empty($conf['http']['proxy']['proxy_host'])) {
+             $options = array_merge($options, $conf['http']['proxy']);
+         }
+ 
+-        require_once 'HTTP/Request.php';
+-        $http = new HTTP_Request($url, $options);
++        $http = new HTTP_Request_NonBlocking($url, $options);
+         $http->setBasicAuth(Auth::getAuth(), Auth::getCredential('password'));
+         @$http->sendRequest();
+         if ($http->getResponseCode() != 200) {
+@@ -1643,3 +1646,157 @@
+                                      $value);
+     }
+ }
++
++class HTTP_Request_NonBlocking extends HTTP_Request
++{
++    /**
++    * Sends the request
++    *
++    * @access public
++    * @param  bool   Whether to store response body in Response object property,
++    *                set this to false if downloading a LARGE file and using a Listener
++    * @return mixed  PEAR error on error, true otherwise
++    */
++    function sendRequest($saveBody = true)
++    {
++        if (!is_a($this->_url, 'Net_URL')) {
++            return PEAR::raiseError('No URL given', HTTP_REQUEST_ERROR_URL);
++        }
++
++        $host = isset($this->_proxy_host) ? $this->_proxy_host : $this->_url->host;
++        $port = isset($this->_proxy_port) ? $this->_proxy_port : $this->_url->port;
++
++        if (strcasecmp($this->_url->protocol, 'https') == 0) {
++            // Bug #14127, don't try connecting to HTTPS sites without OpenSSL
++            if (version_compare(PHP_VERSION, '4.3.0', '<') || !extension_loaded('openssl')) {
++                return PEAR::raiseError('Need PHP 4.3.0 or later with OpenSSL support for https:// requests',
++                                        HTTP_REQUEST_ERROR_URL);
++            } elseif (isset($this->_proxy_host)) {
++                return PEAR::raiseError('HTTPS proxies are not supported', HTTP_REQUEST_ERROR_PROXY);
++            }
++            $host = 'ssl://' . $host;
++        }
++
++        // magic quotes may fuck up file uploads and chunked response processing
++        $magicQuotes = ini_get('magic_quotes_runtime');
++        ini_set('magic_quotes_runtime', false);
++
++        // RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive
++        // connection token to a proxy server...
++        if (isset($this->_proxy_host) && !empty($this->_requestHeaders['connection']) &&
++            'Keep-Alive' == $this->_requestHeaders['connection'])
++        {
++            $this->removeHeader('connection');
++        }
++
++        $keepAlive = (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http && empty($this->_requestHeaders['connection'])) ||
++                     (!empty($this->_requestHeaders['connection']) && 'Keep-Alive' == $this->_requestHeaders['connection']);
++        $sockets   = &PEAR::getStaticProperty('HTTP_Request', 'sockets');
++        $sockKey   = $host . ':' . $port;
++        unset($this->_sock);
++
++        // There is a connected socket in the "static" property?
++        if ($keepAlive && !empty($sockets[$sockKey]) &&
++            !empty($sockets[$sockKey]->fp))
++        {
++            $this->_sock =& $sockets[$sockKey];
++            $err = null;
++        } else {
++            $this->_notify('connect');
++            $this->_sock =& new Net_Socket();
++            $err = $this->_sock->connect($host, $port, null, $this->_timeout, $this->_socketOptions);
++            $this->_sock->setBlocking(false);
++        }
++        PEAR::isError($err) or $err = $this->_sock->write($this->_buildRequest());
++
++if (!PEAR::isError($err)) {
++            if (!empty($this->_readTimeout)) {
++                $this->_sock->setTimeout($this->_readTimeout[0], $this->_readTimeout[1]);
++            }
++
++            $this->_notify('sentRequest');
++
++            // Read the response
++            $this->_response = &new HTTP_Response($this->_sock, $this->_listeners);
++            $err = $this->_response->process(
++                $this->_saveBody && $saveBody,
++                HTTP_REQUEST_METHOD_HEAD != $this->_method
++            );
++
++            if ($keepAlive) {
++                $keepAlive = (isset($this->_response->_headers['content-length'])
++                              || (isset($this->_response->_headers['transfer-encoding'])
++                                  && strtolower($this->_response->_headers['transfer-encoding']) == 'chunked'));
++                if ($keepAlive) {
++                    if (isset($this->_response->_headers['connection'])) {
++                        $keepAlive = strtolower($this->_response->_headers['connection']) == 'keep-alive';
++                    } else {
++                        $keepAlive = 'HTTP/'.HTTP_REQUEST_HTTP_VER_1_1 == $this->_response->_protocol;
++                    }
++                }
++            }
++        }
++
++        ini_set('magic_quotes_runtime', $magicQuotes);
++
++        if (PEAR::isError($err)) {
++            return $err;
++        }
++
++        if (!$keepAlive) {
++            $this->disconnect();
++        // Store the connected socket in "static" property
++        } elseif (empty($sockets[$sockKey]) || empty($sockets[$sockKey]->fp)) {
++            $sockets[$sockKey] =& $this->_sock;
++        }
++
++        // Check for redirection
++        if (    $this->_allowRedirects
++            AND $this->_redirects <= $this->_maxRedirects
++            AND $this->getResponseCode() > 300
++            AND $this->getResponseCode() < 399
++            AND !empty($this->_response->_headers['location'])) {
++
++
++            $redirect = $this->_response->_headers['location'];
++
++            // Absolute URL
++            if (preg_match('/^https?:\/\//i', $redirect)) {
++                $this->_url = &new Net_URL($redirect);
++                $this->addHeader('Host', $this->_generateHostHeader());
++            // Absolute path
++            } elseif ($redirect{0} == '/') {
++                $this->_url->path = $redirect;
++
++            // Relative path
++            } elseif (substr($redirect, 0, 3) == '../' OR substr($redirect, 0, 2) == './') {
++                if (substr($this->_url->path, -1) == '/') {
++                    $redirect = $this->_url->path . $redirect;
++                } else {
++                    $redirect = dirname($this->_url->path) . '/' . $redirect;
++                }
++                $redirect = Net_URL::resolvePath($redirect);
++                $this->_url->path = $redirect;
++
++            // Filename, no path
++            } else {
++                if (substr($this->_url->path, -1) == '/') {
++                    $redirect = $this->_url->path . $redirect;
++                } else {
++                    $redirect = dirname($this->_url->path) . '/' . $redirect;
++                }
++                $this->_url->path = $redirect;
++            }
++
++            $this->_redirects++;
++            return $this->sendRequest($saveBody);
++
++        // Too many redirects
++        } elseif ($this->_allowRedirects AND $this->_redirects > $this->_maxRedirects) {
++            return PEAR::raiseError('Too many redirects', HTTP_REQUEST_ERROR_REDIRECTS);
++        }
++
++        return true;
++    }
++
++}
diff --git a/pear/Kolab_Storage/patches/Kolab_Storage-0.5.2/t_framework_HK_UV_NoDuplicationOnUidChange.diff b/pear/Kolab_Storage/patches/Kolab_Storage-0.5.2/t_framework_HK_UV_NoDuplicationOnUidChange.diff
new file mode 100644
index 0000000..19bb6a7
--- /dev/null
+++ b/pear/Kolab_Storage/patches/Kolab_Storage-0.5.2/t_framework_HK_UV_NoDuplicationOnUidChange.diff
@@ -0,0 +1,28 @@
+From: root <Gunnar Wrobel wrobel at pardus.de>
+Subject: [PATCH] t/SyncML/HK/GW/DoubleSyncFix
+
+When the uid validity of an IMAP folder changes this confuses the Kolab storage
+driver and leads to double entries. The attached patch has been proposed by
+Univention and should be applied after some cleanup.
+
+REF: https://issues.kolab.org/issue3238
+
+Signed-off-by: root <Gunnar Wrobel wrobel at pardus.de>
+
+--- a/a/a/lib/Horde/Kolab/Storage/Data.php	2008-10-20 16:27:27.000000000 +0200
++++ a/a/a/lib/Horde/Kolab/Storage/Data.php	2008-10-20 16:38:34.000000000 +0200
+@@ -457,6 +457,14 @@ class Kolab_Data {
+         $history = &Horde_History::singleton();
+ 
+         $history_id = $app . ':' . $this->_folder->getShareId() . ':' . $object_uid;
++
++        // entries that should be added to the history MUST not
++        // have an existing entry in the history!! otherwise
++        // they are just marked as "modified"
++        if ($action == 'add' && $history->getActionTimestamp($history_id, 'add') == 0) {
++            $action = 'modify';
++        }
++
+         $history->log($history_id, array('action' => $action, 'ts' => $mod_ts), true);
+     }
+ 
diff --git a/pear/Kolab_Storage/patches/Kolab_Storage-0.5.2/t_kronolith_HK_GW_ExportEventList.patch b/pear/Kolab_Storage/patches/Kolab_Storage-0.5.2/t_kronolith_HK_GW_ExportEventList.patch
new file mode 100644
index 0000000..0ef70d6
--- /dev/null
+++ b/pear/Kolab_Storage/patches/Kolab_Storage-0.5.2/t_kronolith_HK_GW_ExportEventList.patch
@@ -0,0 +1,13 @@
+diff --git a/horde-webmail/lib/Horde/Kolab/Storage/List.php b/horde-webmail/lib/Horde/Kolab/Storage/List.php
+index a9bff36..a31ef82 100644
+--- a/a/a/lib/Horde/Kolab/Storage/List.php
++++ b/a/a/lib/Horde/Kolab/Storage/List.php
+@@ -136,7 +136,7 @@ class Kolab_List {
+      */
+     function &listFolders()
+     {
+-        if (!isset($this->_list)) {
++        if (!isset($this->_list) || is_a($this->_list, 'PEAR_Error')) {
+             $session = &Horde_Kolab_Session::singleton();
+             $imap = &$session->getImap();
+             if (is_a($imap, 'PEAR_Error')) {
diff --git a/release-notes.txt b/release-notes.txt
index 5c6b599..b0a287e 100644
--- a/release-notes.txt
+++ b/release-notes.txt
@@ -12,7 +12,18 @@ the 1st.README file in the package directory.
 
 	kolab/issue4690 (Umlaut problems in system folders)
 
-
+    - Kolab_Storage-0.5.2-20110729
+
+	bugzilla.kolabsys.com #117 (Groups appear as entries in contact folders)
+	bugzilla.kolabsys.com #135 (Add option to skip EXPUNGE command on object
+	delete)
+	bugzilla.kolabsys.com #137 (Folders caching issue (shutdown function))
+	kolab/issue4466 ((Horde warning "Invalid shutdown callback" in
+	                  Kolab/Storage/List.php) 
+	bugzilla.kolabsys.com #206 (Folder rename and caching issue)
+	bugzilla.kolabsys.com #138 (ACL/MYRIGHTS result is not cached)
+	bugzilla.kolabsys.com #205 (Horde_Kolab_Storage must use MYRIGHTS, not
+	GETACL)
 
 Changes between 2.3.1 and 2.3.2:
 





More information about the commits mailing list