From bd0551b22076b82a6d49e9f7a2b2e0c90a1b2326 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Fri, 05 Feb 2016 07:25:27 -0500
Subject: [PATCH] Secure also downloads of addressbook exports, managesieve script exports and Enigma keys exports

---
 plugins/managesieve/lib/Roundcube/rcube_sieve.php |  188 +++++++++++++++++++++++++++++------------------
 1 files changed, 116 insertions(+), 72 deletions(-)

diff --git a/plugins/managesieve/lib/Roundcube/rcube_sieve.php b/plugins/managesieve/lib/Roundcube/rcube_sieve.php
index 736f731..2d000fe 100644
--- a/plugins/managesieve/lib/Roundcube/rcube_sieve.php
+++ b/plugins/managesieve/lib/Roundcube/rcube_sieve.php
@@ -6,32 +6,21 @@
  * Copyright (C) 2008-2011, The Roundcube Dev Team
  * Copyright (C) 2011, Kolab Systems AG
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation.
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see http://www.gnu.org/licenses/.
  */
 
 // Managesieve Protocol: RFC5804
-
-define('SIEVE_ERROR_CONNECTION', 1);
-define('SIEVE_ERROR_LOGIN', 2);
-define('SIEVE_ERROR_NOT_EXISTS', 3);    // script not exists
-define('SIEVE_ERROR_INSTALL', 4);       // script installation
-define('SIEVE_ERROR_ACTIVATE', 5);      // script activation
-define('SIEVE_ERROR_DELETE', 6);        // script deletion
-define('SIEVE_ERROR_INTERNAL', 7);      // internal error
-define('SIEVE_ERROR_DEACTIVATE', 8);    // script activation
-define('SIEVE_ERROR_OTHER', 255);       // other/unknown error
-
 
 class rcube_sieve
 {
@@ -42,6 +31,16 @@
     public $script;                 // rcube_sieve_script object
     public $current;                // name of currently loaded script
     private $exts;                  // array of supported extensions
+
+    const ERROR_CONNECTION = 1;
+    const ERROR_LOGIN      = 2;
+    const ERROR_NOT_EXISTS = 3;    // script not exists
+    const ERROR_INSTALL    = 4;    // script installation
+    const ERROR_ACTIVATE   = 5;    // script activation
+    const ERROR_DELETE     = 6;    // script deletion
+    const ERROR_INTERNAL   = 7;    // internal error
+    const ERROR_DEACTIVATE = 8;    // script activation
+    const ERROR_OTHER      = 255;  // other/unknown error
 
 
     /**
@@ -57,10 +56,11 @@
      * @param boolean Enable/disable debugging
      * @param string  Proxy authentication identifier
      * @param string  Proxy authentication password
+     * @param array   List of options to pass to stream_context_create().
      */
     public function __construct($username, $password='', $host='localhost', $port=2000,
         $auth_type=null, $usetls=true, $disabled=array(), $debug=false,
-        $auth_cid=null, $auth_pw=null)
+        $auth_cid=null, $auth_pw=null, $options=array())
     {
         $this->sieve = new Net_Sieve();
 
@@ -68,23 +68,27 @@
             $this->sieve->setDebug(true, array($this, 'debug_handler'));
         }
 
-        if (PEAR::isError($this->sieve->connect($host, $port, null, $usetls))) {
-            return $this->_set_error(SIEVE_ERROR_CONNECTION);
+        $result = $this->sieve->connect($host, $port, $options, $usetls);
+
+        if (is_a($result, 'PEAR_Error')) {
+            return $this->_set_error(self::ERROR_CONNECTION);
         }
 
         if (!empty($auth_cid)) {
             $authz    = $username;
             $username = $auth_cid;
+        }
+        if (!empty($auth_pw)) {
             $password = $auth_pw;
         }
 
-        if (PEAR::isError($this->sieve->login($username, $password,
-            $auth_type ? strtoupper($auth_type) : null, $authz))
-        ) {
-            return $this->_set_error(SIEVE_ERROR_LOGIN);
+        $result = $this->sieve->login($username, $password, $auth_type ? strtoupper($auth_type) : null, $authz);
+
+        if (is_a($result, 'PEAR_Error')) {
+            return $this->_set_error(self::ERROR_LOGIN);
         }
 
-        $this->exts     = $this->get_extensions();
+        $this->exts = $this->get_extensions();
 
         // disable features by config
         if (!empty($disabled)) {
@@ -107,7 +111,7 @@
      */
     public function error()
     {
-        return $this->error ? $this->error : false;
+        return $this->error ?: false;
     }
 
     /**
@@ -115,22 +119,28 @@
      */
     public function save($name = null)
     {
-        if (!$this->sieve)
-            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+        if (!$this->sieve) {
+            return $this->_set_error(self::ERROR_INTERNAL);
+        }
 
-        if (!$this->script)
-            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+        if (!$this->script) {
+            return $this->_set_error(self::ERROR_INTERNAL);
+        }
 
-        if (!$name)
+        if (!$name) {
             $name = $this->current;
+        }
 
         $script = $this->script->as_text();
 
-        if (!$script)
+        if (!$script) {
             $script = '/* empty script */';
+        }
 
-        if (PEAR::isError($this->sieve->installScript($name, $script)))
-            return $this->_set_error(SIEVE_ERROR_INSTALL);
+        $result = $this->sieve->installScript($name, $script);
+        if (is_a($result, 'PEAR_Error')) {
+            return $this->_set_error(self::ERROR_INSTALL);
+        }
 
         return true;
     }
@@ -140,14 +150,19 @@
      */
     public function save_script($name, $content = null)
     {
-        if (!$this->sieve)
-            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+        if (!$this->sieve) {
+            return $this->_set_error(self::ERROR_INTERNAL);
+        }
 
-        if (!$content)
+        if (!$content) {
             $content = '/* empty script */';
+        }
 
-        if (PEAR::isError($this->sieve->installScript($name, $content)))
-            return $this->_set_error(SIEVE_ERROR_INSTALL);
+        $result = $this->sieve->installScript($name, $content);
+
+        if (is_a($result, 'PEAR_Error')) {
+            return $this->_set_error(self::ERROR_INSTALL);
+        }
 
         return true;
     }
@@ -157,14 +172,19 @@
      */
     public function activate($name = null)
     {
-        if (!$this->sieve)
-            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+        if (!$this->sieve) {
+            return $this->_set_error(self::ERROR_INTERNAL);
+        }
 
-        if (!$name)
+        if (!$name) {
             $name = $this->current;
+        }
 
-        if (PEAR::isError($this->sieve->setActive($name)))
-            return $this->_set_error(SIEVE_ERROR_ACTIVATE);
+        $result = $this->sieve->setActive($name);
+
+        if (is_a($result, 'PEAR_Error')) {
+            return $this->_set_error(self::ERROR_ACTIVATE);
+        }
 
         return true;
     }
@@ -174,11 +194,15 @@
      */
     public function deactivate()
     {
-        if (!$this->sieve)
-            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+        if (!$this->sieve) {
+            return $this->_set_error(self::ERROR_INTERNAL);
+        }
 
-        if (PEAR::isError($this->sieve->setActive('')))
-            return $this->_set_error(SIEVE_ERROR_DEACTIVATE);
+        $result = $this->sieve->setActive('');
+
+        if (is_a($result, 'PEAR_Error')) {
+            return $this->_set_error(self::ERROR_DEACTIVATE);
+        }
 
         return true;
     }
@@ -188,22 +212,32 @@
      */
     public function remove($name = null)
     {
-        if (!$this->sieve)
-            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+        if (!$this->sieve) {
+            return $this->_set_error(self::ERROR_INTERNAL);
+        }
 
-        if (!$name)
+        if (!$name) {
             $name = $this->current;
+        }
 
         // script must be deactivated first
-        if ($name == $this->sieve->getActive())
-            if (PEAR::isError($this->sieve->setActive('')))
-                return $this->_set_error(SIEVE_ERROR_DELETE);
+        if ($name == $this->sieve->getActive()) {
+            $result = $this->sieve->setActive('');
 
-        if (PEAR::isError($this->sieve->removeScript($name)))
-            return $this->_set_error(SIEVE_ERROR_DELETE);
+            if (is_a($result, 'PEAR_Error')) {
+                return $this->_set_error(self::ERROR_DELETE);
+            }
+        }
 
-        if ($name == $this->current)
+        $result = $this->sieve->removeScript($name);
+
+        if (is_a($result, 'PEAR_Error')) {
+            return $this->_set_error(self::ERROR_DELETE);
+        }
+
+        if ($name == $this->current) {
             $this->current = null;
+        }
 
         return true;
     }
@@ -217,9 +251,14 @@
             return $this->exts;
 
         if (!$this->sieve)
-            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+            return $this->_set_error(self::ERROR_INTERNAL);
 
         $ext = $this->sieve->getExtensions();
+
+        if (is_a($ext, 'PEAR_Error')) {
+            return array();
+        }
+
         // we're working on lower-cased names
         $ext = array_map('strtolower', (array) $ext);
 
@@ -241,12 +280,13 @@
         if (!$this->list) {
 
             if (!$this->sieve)
-                return $this->_set_error(SIEVE_ERROR_INTERNAL);
+                return $this->_set_error(self::ERROR_INTERNAL);
 
             $list = $this->sieve->listScripts();
 
-            if (PEAR::isError($list))
-                return $this->_set_error(SIEVE_ERROR_OTHER);
+            if (is_a($list, 'PEAR_Error')) {
+                return $this->_set_error(self::ERROR_OTHER);
+            }
 
             $this->list = $list;
         }
@@ -260,7 +300,7 @@
     public function get_active()
     {
         if (!$this->sieve)
-            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+            return $this->_set_error(self::ERROR_INTERNAL);
 
         return $this->sieve->getActive();
     }
@@ -271,15 +311,16 @@
     public function load($name)
     {
         if (!$this->sieve)
-            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+            return $this->_set_error(self::ERROR_INTERNAL);
 
         if ($this->current == $name)
             return true;
 
         $script = $this->sieve->getScript($name);
 
-        if (PEAR::isError($script))
-            return $this->_set_error(SIEVE_ERROR_OTHER);
+        if (is_a($script, 'PEAR_Error')) {
+            return $this->_set_error(self::ERROR_OTHER);
+        }
 
         // try to parse from Roundcube format
         $this->script = $this->_parse($script);
@@ -295,7 +336,7 @@
     public function load_script($script)
     {
         if (!$this->sieve)
-            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+            return $this->_set_error(self::ERROR_INTERNAL);
 
         // try to parse from Roundcube format
         $this->script = $this->_parse($script);
@@ -340,12 +381,13 @@
     public function get_script($name)
     {
         if (!$this->sieve)
-            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+            return $this->_set_error(self::ERROR_INTERNAL);
 
         $content = $this->sieve->getScript($name);
 
-        if (PEAR::isError($content))
-            return $this->_set_error(SIEVE_ERROR_OTHER);
+        if (is_a($content, 'PEAR_Error')) {
+            return $this->_set_error(self::ERROR_OTHER);
+        }
 
         return $content;
     }
@@ -356,15 +398,17 @@
     public function copy($name, $copy)
     {
         if (!$this->sieve)
-            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+            return $this->_set_error(self::ERROR_INTERNAL);
 
         if ($copy) {
             $content = $this->sieve->getScript($copy);
 
-            if (PEAR::isError($content))
-                return $this->_set_error(SIEVE_ERROR_OTHER);
+            if (is_a($content, 'PEAR_Error')) {
+                return $this->_set_error(self::ERROR_OTHER);
+            }
         }
 
+
         return $this->save_script($name, $content);
     }
 

--
Gitblit v1.9.1