Aleksander Machniak
2015-11-22 9f1f754daf4b57a0d0d3aea95d2321716d218cf5
plugins/managesieve/lib/Roundcube/rcube_sieve.php
@@ -22,17 +22,6 @@
// 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
{
    private $sieve;                 // Net_Sieve object
@@ -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
    /**
@@ -69,20 +68,24 @@
            $this->sieve->setDebug(true, array($this, 'debug_handler'));
        }
        if (PEAR::isError($this->sieve->connect($host, $port, $options, $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();
@@ -108,7 +111,7 @@
     */
    public function error()
    {
        return $this->error ? $this->error : false;
        return $this->error ?: false;
    }
    /**
@@ -116,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;
    }
@@ -141,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;
    }
@@ -158,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;
    }
@@ -175,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;
    }
@@ -189,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;
    }
@@ -218,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);
@@ -242,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;
        }
@@ -261,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();
    }
@@ -272,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);
@@ -296,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);
@@ -341,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;
    }
@@ -357,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);
    }