Files
server/usr/share/psa-horde/imp/lib/Ftree/Account/Imap.php
2026-01-07 20:52:11 +01:00

191 lines
5.8 KiB
PHP

<?php
/**
* Copyright 2013-2017 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (GPL). If you
* did not receive this file, see http://www.horde.org/licenses/gpl.
*
* @category Horde
* @copyright 2013-2017 Horde LLC
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*/
/**
* Implementation of the account object for an IMAP server.
*
* @author Michael Slusarz <slusarz@horde.org>
* @category Horde
* @copyright 2013-2017 Horde LLC
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*
* @property-read IMP_Imap $imp_imap IMP IMAP object.
*/
class IMP_Ftree_Account_Imap extends IMP_Ftree_Account
{
/* Defines used with namespace display. */
const OTHER_KEY = "other\0";
const SHARED_KEY = "shared\0";
/**
*/
public function __get($name)
{
switch ($name) {
case 'imp_imap':
return $GLOBALS['injector']->getInstance('IMP_Factory_Imap')->create($this->_id == IMP_Ftree::BASE_ELT ? null : $this->_id);
}
}
/**
*/
public function getList($query = array(), $mask = 0)
{
global $prefs;
$imp_imap = $this->imp_imap;
$ns = $imp_imap->getNamespaces();
$out = array();
if ($mask & self::INIT) {
/* Add namespace elements. */
if ($prefs->getValue('tree_view')) {
foreach ($ns as $val) {
$type = null;
switch ($val->type) {
case $val::NS_OTHER:
$attr = IMP_Ftree::ELT_NAMESPACE_OTHER;
$type = self::OTHER_KEY;
break;
case $val::NS_SHARED:
$attr = IMP_Ftree::ELT_NAMESPACE_SHARED;
$type = self::SHARED_KEY;
break;
}
if (!is_null($type)) {
$out[$type] = array(
'a' => $attr | IMP_Ftree::ELT_NOSELECT | IMP_Ftree::ELT_NONIMAP,
'v' => $type
);
}
}
}
$query = array('INBOX');
foreach ($ns as $val) {
$query[] = $val . '*';
}
$lmquery = ($mask & self::UNSUB)
? Horde_Imap_Client::MBOX_ALL_SUBSCRIBED
: Horde_Imap_Client::MBOX_SUBSCRIBED_EXISTS;
} elseif ($mask & self::UNSUB) {
$lmquery = Horde_Imap_Client::MBOX_UNSUBSCRIBED;
$query = array();
foreach ($ns as $val) {
$query[] = $val . '*';
}
} elseif (empty($query)) {
return $out;
} else {
$lmquery = Horde_Imap_Client::MBOX_ALL_SUBSCRIBED;
}
$res = $imp_imap->listMailboxes($query, $lmquery, array(
'attributes' => true,
'delimiter' => true,
'sort' => true
));
foreach ($res as $val) {
if (in_array('\nonexistent', $val['attributes'])) {
continue;
}
$mbox = strval($val['mailbox']);
$ns_info = $imp_imap->getNamespace($mbox);
$parent = null;
/* Break apart the name via the delimiter and go step by
* step through the name to make sure all subfolders exist
* in the tree. */
if ($ns_info && strlen($ns_info->delimiter)) {
/* Strip personal namespace (if non-empty). */
if ($ns_info->type === $ns_info::NS_PERSONAL) {
$stripped = $ns_info->stripNamespace($mbox);
$parts = explode($ns_info->delimiter, $stripped);
if ($stripped != $mbox) {
$parts[0] = $ns_info->name . $parts[0];
}
} else {
$parts = explode($ns_info->delimiter, $mbox);
}
if ($prefs->getValue('tree_view')) {
switch ($ns_info->type) {
case $ns_info::NS_OTHER:
$parent = self::OTHER_KEY;
break;
case $ns_info::NS_SHARED:
$parent = self::SHARED_KEY;
break;
}
}
} else {
$parts = array($mbox);
}
for ($i = 1, $p_count = count($parts); $i <= $p_count; ++$i) {
$part = implode($val['delimiter'], array_slice($parts, 0, $i));
if (!isset($out[$part])) {
if ($p_count == $i) {
$attr = 0;
if (in_array('\subscribed', $val['attributes'])) {
$attr |= IMP_Ftree::ELT_IS_SUBSCRIBED;
}
if (in_array('\noselect', $val['attributes'])) {
$attr |= IMP_Ftree::ELT_NOSELECT;
}
if (in_array('\noinferiors', $val['attributes'])) {
$attr |= IMP_Ftree::ELT_NOINFERIORS;
}
} else {
$attr = IMP_Ftree::ELT_NOSELECT;
}
$out[$part] = array(
'a' => $attr,
'v' => $part
);
if (!is_null($parent)) {
$out[$part]['p'] = $parent;
}
}
$parent = $part;
}
}
return $out;
}
/**
*/
public function delete(IMP_Ftree_Element $elt)
{
return ($elt->inbox || $elt->namespace)
? 0
: self::DELETE_ELEMENT;
}
}