summaryrefslogtreecommitdiff
path: root/program/include/rcube_imap.inc
diff options
context:
space:
mode:
Diffstat (limited to 'program/include/rcube_imap.inc')
-rw-r--r--program/include/rcube_imap.inc86
1 files changed, 53 insertions, 33 deletions
diff --git a/program/include/rcube_imap.inc b/program/include/rcube_imap.inc
index 21434167b..6985212a9 100644
--- a/program/include/rcube_imap.inc
+++ b/program/include/rcube_imap.inc
@@ -28,6 +28,7 @@ require_once('lib/mime.inc');
class rcube_imap
{
var $conn;
+ var $root_ns = '';
var $root_dir = '';
var $mailbox = 'INBOX';
var $list_page = 1;
@@ -54,24 +55,6 @@ class rcube_imap
}
- function iloha_imap($connection='')
- {
- if ($connection)
- {
- $a_url = parse_url($connection);
- $scheme = $a_url['scheme'] ? $a_url['scheme'] : 'imap';
- $port = $a_url['port'] ? $a_url['port'] : ($scheme=='imaps' ? 993 : 143);
- $host = $a_url['host'];
- $user = $a_url['user'];
- $pass = $a_url['pass'];
-
- //var_dump($a_url);
-
- $this->connect($host, $user, $pass, $port);
- }
- }
-
-
function connect($host, $user, $pass, $port=143, $use_ssl=FALSE)
{
global $ICL_PORT, $CONFIG;
@@ -79,16 +62,27 @@ class rcube_imap
// check for Open-SSL support in PHP build
if ($use_ssl && in_array('openssl', get_loaded_extensions()))
$ICL_SSL = TRUE;
+ else if ($use_ssl)
+ {
+ raise_error(array('code' => 403,
+ 'type' => 'imap',
+ 'message' => 'Open SSL not available;'), TRUE, FALSE);
+ $port = 143;
+ }
$ICL_PORT = $port;
$this->conn = iil_Connect($host, $user, $pass, array('imap' => 'check'));
$this->host = $host;
$this->user = $user;
$this->pass = $pass;
+ $this->port = $port;
+ $this->ssl = $use_ssl;
+ // print trace mesages
if ($this->conn && ($CONFIG['debug_level'] & 8))
- print $this->conn->message;
-
+ console($this->conn->message);
+
+ // write error log
else if (!$this->conn && $GLOBALS['iil_error'])
{
raise_error(array('code' => 403,
@@ -96,6 +90,17 @@ class rcube_imap
'message' => $GLOBALS['iil_error']), TRUE, FALSE);
}
+ // get account namespace
+ if ($this->conn)
+ {
+ iil_C_NameSpace($this->conn);
+
+ if (!empty($this->conn->delimiter))
+ $this->delimiter = $this->conn->delimiter;
+ if (!empty($this->conn->rootdir))
+ $this->root_ns = $this->conn->rootdir;
+ }
+
return $this->conn ? TRUE : FALSE;
}
@@ -107,12 +112,22 @@ class rcube_imap
}
+ function reconnect()
+ {
+ $this->close();
+ $this->connect($this->host, $this->user, $this->pass, $this->port, $this->ssl);
+ }
+
+
function set_rootdir($root)
{
- if (substr($root, -1, 1)==='/')
+ if (ereg('[\.\/]$', $root)) //(substr($root, -1, 1)==='/')
$root = substr($root, 0, -1);
$this->root_dir = $root;
+
+ if (empty($this->delimiter))
+ $this->get_hierarchy_delimiter();
}
@@ -368,10 +383,10 @@ class rcube_imap
// return cached header
if ($a_msg_headers[$uid])
return $a_msg_headers[$uid];
-
+
$msg_id = $this->_uid2id($uid);
$header = iil_C_FetchHeader($this->conn, $mailbox, $msg_id);
-
+
// write headers cache
$a_msg_headers[$uid] = $header;
$this->update_cache($mailbox.'.msg', $a_msg_headers);
@@ -427,11 +442,13 @@ class rcube_imap
else
$result = iil_C_Flag($this->conn, $this->mailbox, join(',', $msg_ids), $flag);
-
// reload message headers if cached
$cache_key = $this->mailbox.'.msg';
- if ($result && ($a_cached_headers = $this->get_cache($cache_key)))
+ if ($this->caching_enabled && $result && ($a_cached_headers = $this->get_cache($cache_key)))
{
+ // close and re-open connection
+ $this->reconnect();
+
foreach ($uids as $uid)
{
if (isset($a_cached_headers[$uid]))
@@ -492,12 +509,12 @@ class rcube_imap
// exit if no message uids are specified
if (!is_array($a_uids))
return false;
-
+
// convert uids to message ids
$a_mids = array();
foreach ($a_uids as $uid)
$a_mids[] = $this->_uid2id($uid, $from_mbox);
-
+
$moved = iil_C_Move($this->conn, join(',', $a_mids), $from_mbox, $to_mbox);
// send expunge command in order to have the moved message
@@ -646,15 +663,18 @@ class rcube_imap
$result = FALSE;
$abs_name = $this->_mod_mailbox($name);
$a_mailbox_cache = $this->get_cache('mailboxes');
+
+ if (strlen($this->root_ns))
+ $abs_name = $this->root_ns.$abs_name;
if (strlen($abs_name) && (!is_array($a_mailbox_cache) || !in_array($abs_name, $a_mailbox_cache)))
- $result = iil_C_CreateFolder($this->conn, $abs_name);
+ $result = iil_C_CreateFolder($this->conn, iil_utf7_encode($abs_name));
// update mailboxlist cache
if ($result && $subscribe)
- $this->subscribe($name);
+ $this->subscribe($this->root_ns.$name);
- return $result;
+ return $result ? $this->root_ns.$name : FALSE;
}
@@ -911,9 +931,9 @@ class rcube_imap
function _mod_mailbox($mbox, $mode='in')
{
- if ($this->root_dir && $mode=='in')
- $mbox = $this->root_dir.'/'.$mbox;
- else if ($this->root_dir && $mode=='out')
+ if (!empty($this->root_dir) && $mode=='in')
+ $mbox = $this->root_dir.$this->delimiter.$mbox;
+ else if (strlen($this->root_dir) && $mode=='out')
$mbox = substr($mbox, strlen($this->root_dir)+1);
return $mbox;