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

417 lines
12 KiB
PHP

<?php
/**
* Copyright 2014-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 2014-2017 Horde LLC
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*/
/**
* This object manages IMP_Mailbox cache data that is stored in the session.
*
* @author Michael Slusarz <slusarz@horde.org>
* @category Horde
* @copyright 2014-2017 Horde LLC
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*
* @property-read boolean $changed Has the internal object storage changed?
*/
class IMP_Mailbox_SessionCache implements Serializable
{
/** Changed constants. */
const CHANGED_NO = 0;
const CHANGED_YES = 1;
/** Cache identifiers. */
const CACHE_ACL = 'a'; // (array) ACL rights
const CACHE_DISPLAY = 'd'; // (string) Display string
const CACHE_ICONS = 'i'; // (array) Icons array
const CACHE_LABEL = 'l'; // (string) Label string
const CACHE_UIDVALIDITY = 'v'; // (integer) UIDVALIDITY
/** Cache identifiers - temporary data. */
const CACHE_EXISTS = 'e';
const CACHE_ICONHOOK = 'ic';
const CACHE_PREFTO = 'pt';
const CACHE_SPECIALMBOXES = 's';
/**
* Cached data.
*
* @var array
*/
protected $_cache = array();
/**
* Has this object changed?
*
* @var integer
*/
protected $_changed = self::CHANGED_NO;
/**
* Temporary (access-only) cached data.
*
* @var array
*/
protected $_temp = array();
/**
*/
public function __get($name)
{
switch ($name) {
case 'changed':
return $this->_changed;
}
}
/**
* Get ACL data.
*
* @param string $mbox Mailbox.
*
* @return mixed A Horde_Imap_Client_Data_Acl object, null if no ACL
* data, or false if not set.
*/
public function getAcl($mbox)
{
if (!isset($this->_cache[$mbox]) ||
!array_key_exists(self::CACHE_ACL, $this->_cache[$mbox])) {
return false;
}
return is_null($this->_cache[$mbox][self::CACHE_ACL])
? null
: new Horde_Imap_Client_Data_Acl($this->_cache[$mbox][self::CACHE_ACL]);
}
/**
* Set ACL data.
*
* @param string $mbox Mailbox.
* @param mixed $acl Horde_Imap_Client_Data_Acl object, or null.
*/
public function setAcl($mbox, $acl)
{
/* Store string representation of ACL for a more compact
* serialized format. */
$this->_cache[$mbox][self::CACHE_ACL] = is_null($acl)
? $acl
: strval($acl);
$this->_changed = self::CHANGED_YES;
}
/**
* Get the mailbox label.
*
* @param string $mbox Mailbox.
*
* @return mixed Mailbox label, or false if not set.
*/
public function getLabel($mbox)
{
if (!isset($this->_cache[$mbox][self::CACHE_LABEL])) {
return false;
}
return ($this->_cache[$mbox][self::CACHE_LABEL] === true)
? $this->_cache[$mbox][self::CACHE_DISPLAY]
: $this->_cache[$mbox][self::CACHE_LABEL];
}
/**
* Set the mailbox label.
*
* @param string $mbox Mailbox.
* @param string $label Label.
*/
public function setLabel($mbox, $label)
{
$this->_cache[$mbox][self::CACHE_LABEL] = (isset($this->_cache[$mbox][self::CACHE_DISPLAY]) && ($this->_cache[$mbox][self::CACHE_DISPLAY] == $label))
? true
: $label;
$this->_changed = self::CHANGED_YES;
}
/**
* Preference storage name.
*
* @param string $mbox Mailbox.
*
* @return mixed Preference string, or false if not set.
*/
public function getPrefTo($mbox)
{
return isset($this->_temp[$mbox][self::CACHE_PREFTO])
? $this->_temp[$mbox][self::CACHE_PREFTO]
: false;
}
/**
* Set the preference storage name.
*
* @param string $mbox Mailbox.
* @param string $pref_to Preference storage name.
*/
public function setPrefTo($mbox, $pref_to)
{
$this->_temp[$mbox][self::CACHE_PREFTO] = $pref_to;
$this->_changed = self::CHANGED_YES;
}
/**
* Get the UIDVALIDITY of the mailbox.
*
* @param string $mbox Mailbox.
*
* @return mixed UIDVALIDITY, or false if not set.
*/
public function getUidvalidity($mbox)
{
return isset($this->_cache[$mbox][self::CACHE_UIDVALIDITY])
? $this->_cache[$mbox][self::CACHE_UIDVALIDITY]
: false;
}
/**
* Set the UIDVALIDITY of the mailbox.
*
* @param string $mbox Mailbox.
* @param integer $uidvalid UIDVALIDITY.
*/
public function setUidvalidity($mbox, $uidvalid)
{
$this->_cache[$mbox][self::CACHE_UIDVALIDITY] = $uidvalid;
$this->_changed = self::CHANGED_YES;
}
/**
* Get mailbox display label.
*
* @param string $mbox Mailbox.
*
* @return mixed Mailbox display label, or false if not set.
*/
public function getDisplay($mbox)
{
return isset($this->_cache[$mbox][self::CACHE_DISPLAY])
? $this->_cache[$mbox][self::CACHE_DISPLAY]
: false;
}
/**
* Set mailbox display label.
*
* @param string $mbox Mailbox.
* @param string $display Display label.
*/
public function setDisplay($mbox, $display)
{
$this->_cache[$mbox][self::CACHE_DISPLAY] = $display;
$this->_changed = self::CHANGED_YES;
}
/**
* Get icon information.
*
* @param string $mbox Mailbox.
*
* @return mixed Icon information (array), or false if not set.
*/
public function getIcons($mbox)
{
global $injector;
if (isset($this->_cache[$mbox][self::CACHE_ICONS])) {
return $this->_cache[$mbox][self::CACHE_ICONS];
}
if (!isset($this->_temp[self::CACHE_ICONHOOK])) {
try {
$this->_temp[self::CACHE_ICONHOOK] = $injector->getInstance('Horde_Core_Hooks')->callHook('mbox_icons', 'imp');
} catch (Horde_Exception_HookNotSet $e) {
$this->_temp[self::CACHE_ICONHOOK] = array();
}
}
$icons = isset($this->_temp[self::CACHE_ICONHOOK][$mbox])
? $this->_temp[self::CACHE_ICONHOOK][$mbox]
: false;
$this->_cache[$mbox][self::CACHE_ICONS] = $icons;
$this->_changed = self::CHANGED_YES;
return $icons;
}
/**
* Return the list of special mailboxes.
*
* @return array A list of mailboxes, with the SPECIAL_* constants
* as keys and values containing the IMP_Mailbox objects or
* null if the mailbox doesn't exist (SPECIAL_SENT
* contains an array of objects).
*/
public function getSpecialMailboxes()
{
global $injector, $prefs;
if (!isset($this->_temp[self::CACHE_SPECIALMBOXES])) {
$sm = array(
IMP_Mailbox::SPECIAL_COMPOSETEMPLATES => IMP_Mailbox::getPref(IMP_Mailbox::MBOX_TEMPLATES),
IMP_Mailbox::SPECIAL_DRAFTS => IMP_Mailbox::getPref(IMP_Mailbox::MBOX_DRAFTS),
IMP_Mailbox::SPECIAL_SENT => $injector->getInstance('IMP_Identity')->getAllSentmail(),
IMP_Mailbox::SPECIAL_SPAM => IMP_Mailbox::getPref(IMP_Mailbox::MBOX_SPAM),
IMP_Mailbox::SPECIAL_TRASH => $prefs->getValue('use_trash') ? IMP_Mailbox::getPref(IMP_Mailbox::MBOX_TRASH) : null,
IMP_Mailbox::SPECIAL_USER => array()
);
foreach ($injector->getInstance('IMP_Factory_Imap')->create()->config->user_special_mboxes as $key => $val) {
$ob = IMP_Mailbox::get($key);
$ob->display = $val;
$sm[IMP_Mailbox::SPECIAL_USER][strval($key)] = $ob;
}
$this->_temp[self::CACHE_SPECIALMBOXES] = $sm;
}
return $this->_temp[self::CACHE_SPECIALMBOXES];
}
/**
* Return whether the mailbox exists.
*
* @param string $mbox Mailbox.
*
* @return boolean True if mailbox exists.
*/
public function exists($mbox)
{
$s_mbox = strval($mbox);
if (!isset($this->_temp[$s_mbox][self::CACHE_EXISTS])) {
$mbox = IMP_Mailbox::get($mbox);
if ($mbox->search) {
$exists = (($ob = $mbox->getSearchOb()) && $ob->enabled);
} elseif ($elt = $mbox->tree_elt) {
$exists = !$elt->container;
} else {
try {
$mbox_list = $mbox->imp_imap->listMailboxes(
$mbox->imap_mbox_ob,
null,
array('attributes' => true)
);
$exists = (isset($mbox_list[strval($mbox)]) &&
!in_array('\\noselect', $mbox_list[strval($mbox)]['attributes']));
} catch (IMP_Imap_Exception $e) {
$exists = false;
}
}
$this->_temp[$s_mbox][self::CACHE_EXISTS] = $exists;
}
return $this->_temp[$s_mbox][self::CACHE_EXISTS];
}
/**
* Expire cache entries.
*
* @param mixed $entries A CACHE_* constant (or array of constants).
* If null, expires all mailbox-level cache
* entries.
* @param IMP_Mailbox $mbox If set, only clear this mailbox's cache.
*/
public function expire($entries, $mbox = null)
{
if (is_null($entries)) {
$entries = array(
self::CACHE_ACL,
self::CACHE_DISPLAY,
self::CACHE_EXISTS,
self::CACHE_ICONS,
self::CACHE_LABEL,
self::CACHE_PREFTO,
self::CACHE_UIDVALIDITY
);
} elseif (!is_array($entries)) {
$entries = array($entries);
}
if (in_array(self::CACHE_DISPLAY, $entries)) {
$entries[] = self::CACHE_LABEL;
}
foreach ($entries as $val) {
switch ($val) {
case self::CACHE_ACL:
case self::CACHE_DISPLAY:
case self::CACHE_EXISTS:
case self::CACHE_ICONS:
case self::CACHE_LABEL:
case self::CACHE_PREFTO:
case self::CACHE_UIDVALIDITY:
if (!isset($mbox_list)) {
$mbox_list = $mbox
? array(strval($mbox))
: array_merge(array_keys($this->_cache), array_keys($this->_temp));
}
foreach ($mbox_list as $val2) {
if (isset($this->_cache[$val2][$val])) {
$this->_changed = self::CHANGED_YES;
}
unset(
$this->_cache[$val2][$val],
$this->_temp[$val2][$val]
);
}
break;
case self::CACHE_ICONHOOK:
case self::CACHE_SPECIALMBOXES:
if (($c = isset($this->_cache[$val])) ||
isset($this->_temp[$val])) {
if ($c) {
$this->_changed = self::CHANGED_YES;
}
unset($this->_cache[$val], $this->_temp[$val]);
}
break;
}
}
}
/* Serializable methods. */
/**
*/
public function serialize()
{
return $GLOBALS['injector']->getInstance('Horde_Pack')->pack(
$this->_cache,
array(
'compression' => false,
'phpob' => false
)
);
}
/**
*/
public function unserialize($data)
{
$this->_cache = $GLOBALS['injector']->getInstance('Horde_Pack')->unpack($data);
}
}