|
|
|
|
@ -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
|
|
|
|
|
@ -43,6 +32,16 @@ class rcube_sieve
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Object constructor
|
|
|
|
|
@ -70,7 +69,7 @@ class rcube_sieve
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (PEAR::isError($this->sieve->connect($host, $port, $options, $usetls))) {
|
|
|
|
|
return $this->_set_error(SIEVE_ERROR_CONNECTION);
|
|
|
|
|
return $this->_set_error(self::ERROR_CONNECTION);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!empty($auth_cid)) {
|
|
|
|
|
@ -82,7 +81,7 @@ class rcube_sieve
|
|
|
|
|
if (PEAR::isError($this->sieve->login($username, $password,
|
|
|
|
|
$auth_type ? strtoupper($auth_type) : null, $authz))
|
|
|
|
|
) {
|
|
|
|
|
return $this->_set_error(SIEVE_ERROR_LOGIN);
|
|
|
|
|
return $this->_set_error(self::ERROR_LOGIN);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->exts = $this->get_extensions();
|
|
|
|
|
@ -117,10 +116,10 @@ class rcube_sieve
|
|
|
|
|
public function save($name = null)
|
|
|
|
|
{
|
|
|
|
|
if (!$this->sieve)
|
|
|
|
|
return $this->_set_error(SIEVE_ERROR_INTERNAL);
|
|
|
|
|
return $this->_set_error(self::ERROR_INTERNAL);
|
|
|
|
|
|
|
|
|
|
if (!$this->script)
|
|
|
|
|
return $this->_set_error(SIEVE_ERROR_INTERNAL);
|
|
|
|
|
return $this->_set_error(self::ERROR_INTERNAL);
|
|
|
|
|
|
|
|
|
|
if (!$name)
|
|
|
|
|
$name = $this->current;
|
|
|
|
|
@ -131,7 +130,7 @@ class rcube_sieve
|
|
|
|
|
$script = '/* empty script */';
|
|
|
|
|
|
|
|
|
|
if (PEAR::isError($this->sieve->installScript($name, $script)))
|
|
|
|
|
return $this->_set_error(SIEVE_ERROR_INSTALL);
|
|
|
|
|
return $this->_set_error(self::ERROR_INSTALL);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
@ -142,13 +141,13 @@ class rcube_sieve
|
|
|
|
|
public function save_script($name, $content = null)
|
|
|
|
|
{
|
|
|
|
|
if (!$this->sieve)
|
|
|
|
|
return $this->_set_error(SIEVE_ERROR_INTERNAL);
|
|
|
|
|
return $this->_set_error(self::ERROR_INTERNAL);
|
|
|
|
|
|
|
|
|
|
if (!$content)
|
|
|
|
|
$content = '/* empty script */';
|
|
|
|
|
|
|
|
|
|
if (PEAR::isError($this->sieve->installScript($name, $content)))
|
|
|
|
|
return $this->_set_error(SIEVE_ERROR_INSTALL);
|
|
|
|
|
return $this->_set_error(self::ERROR_INSTALL);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
@ -159,13 +158,13 @@ class rcube_sieve
|
|
|
|
|
public function activate($name = null)
|
|
|
|
|
{
|
|
|
|
|
if (!$this->sieve)
|
|
|
|
|
return $this->_set_error(SIEVE_ERROR_INTERNAL);
|
|
|
|
|
return $this->_set_error(self::ERROR_INTERNAL);
|
|
|
|
|
|
|
|
|
|
if (!$name)
|
|
|
|
|
$name = $this->current;
|
|
|
|
|
|
|
|
|
|
if (PEAR::isError($this->sieve->setActive($name)))
|
|
|
|
|
return $this->_set_error(SIEVE_ERROR_ACTIVATE);
|
|
|
|
|
return $this->_set_error(self::ERROR_ACTIVATE);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
@ -176,10 +175,10 @@ class rcube_sieve
|
|
|
|
|
public function deactivate()
|
|
|
|
|
{
|
|
|
|
|
if (!$this->sieve)
|
|
|
|
|
return $this->_set_error(SIEVE_ERROR_INTERNAL);
|
|
|
|
|
return $this->_set_error(self::ERROR_INTERNAL);
|
|
|
|
|
|
|
|
|
|
if (PEAR::isError($this->sieve->setActive('')))
|
|
|
|
|
return $this->_set_error(SIEVE_ERROR_DEACTIVATE);
|
|
|
|
|
return $this->_set_error(self::ERROR_DEACTIVATE);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
@ -190,7 +189,7 @@ class rcube_sieve
|
|
|
|
|
public function remove($name = null)
|
|
|
|
|
{
|
|
|
|
|
if (!$this->sieve)
|
|
|
|
|
return $this->_set_error(SIEVE_ERROR_INTERNAL);
|
|
|
|
|
return $this->_set_error(self::ERROR_INTERNAL);
|
|
|
|
|
|
|
|
|
|
if (!$name)
|
|
|
|
|
$name = $this->current;
|
|
|
|
|
@ -198,10 +197,10 @@ class rcube_sieve
|
|
|
|
|
// script must be deactivated first
|
|
|
|
|
if ($name == $this->sieve->getActive())
|
|
|
|
|
if (PEAR::isError($this->sieve->setActive('')))
|
|
|
|
|
return $this->_set_error(SIEVE_ERROR_DELETE);
|
|
|
|
|
return $this->_set_error(self::ERROR_DELETE);
|
|
|
|
|
|
|
|
|
|
if (PEAR::isError($this->sieve->removeScript($name)))
|
|
|
|
|
return $this->_set_error(SIEVE_ERROR_DELETE);
|
|
|
|
|
return $this->_set_error(self::ERROR_DELETE);
|
|
|
|
|
|
|
|
|
|
if ($name == $this->current)
|
|
|
|
|
$this->current = null;
|
|
|
|
|
@ -218,9 +217,14 @@ class rcube_sieve
|
|
|
|
|
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 (PEAR::isError($ext)) {
|
|
|
|
|
return array();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// we're working on lower-cased names
|
|
|
|
|
$ext = array_map('strtolower', (array) $ext);
|
|
|
|
|
|
|
|
|
|
@ -242,12 +246,12 @@ class rcube_sieve
|
|
|
|
|
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);
|
|
|
|
|
return $this->_set_error(self::ERROR_OTHER);
|
|
|
|
|
|
|
|
|
|
$this->list = $list;
|
|
|
|
|
}
|
|
|
|
|
@ -261,7 +265,7 @@ class rcube_sieve
|
|
|
|
|
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,7 +276,7 @@ class rcube_sieve
|
|
|
|
|
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;
|
|
|
|
|
@ -280,7 +284,7 @@ class rcube_sieve
|
|
|
|
|
$script = $this->sieve->getScript($name);
|
|
|
|
|
|
|
|
|
|
if (PEAR::isError($script))
|
|
|
|
|
return $this->_set_error(SIEVE_ERROR_OTHER);
|
|
|
|
|
return $this->_set_error(self::ERROR_OTHER);
|
|
|
|
|
|
|
|
|
|
// try to parse from Roundcube format
|
|
|
|
|
$this->script = $this->_parse($script);
|
|
|
|
|
@ -296,7 +300,7 @@ class rcube_sieve
|
|
|
|
|
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 +345,12 @@ class rcube_sieve
|
|
|
|
|
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);
|
|
|
|
|
return $this->_set_error(self::ERROR_OTHER);
|
|
|
|
|
|
|
|
|
|
return $content;
|
|
|
|
|
}
|
|
|
|
|
@ -357,13 +361,13 @@ class rcube_sieve
|
|
|
|
|
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);
|
|
|
|
|
return $this->_set_error(self::ERROR_OTHER);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $this->save_script($name, $content);
|
|
|
|
|
|