Files
server/usr/share/psa-horde/turba/lib/Driver/Favourites.php
2026-01-07 20:52:11 +01:00

196 lines
5.9 KiB
PHP

<?php
/**
* Read-only Turba directory driver implementation for favourite
* recipients. Relies on the contacts/favouriteRecipients API method.
*
* Copyright 2010-2017 Horde LLC (http://www.horde.org/)
*
* See the enclosed file LICENSE for license information (ASL). If you did
* did not receive this file, see http://www.horde.org/licenses/apache.
*
* @author Jan Schneider <jan@horde.org>
* @category Horde
* @license http://www.horde.org/licenses/apache ASL
* @package Turba
*/
class Turba_Driver_Favourites extends Turba_Driver
{
/**
* Checks if the current user has the requested permissions on this
* source.
*
* @param integer $perm The permission to check for.
*
* @return boolean True if the user has permission, otherwise false.
*/
public function hasPermission($perm)
{
switch ($perm) {
case Horde_Perms::DELETE:
case Horde_Perms::EDIT:
return false;
default:
return true;
}
}
/**
* Always returns true because the driver is read-only and there is
* nothing to remove.
*
* @param string $user The user's data to remove.
*
* @return boolean Always true.
*/
public function removeUserData($user)
{
return true;
}
/**
* Searches the favourites list with the given criteria and returns a
* filtered list of results. If the criteria parameter is an empty array,
* all records will be returned.
*
* @param array $criteria Array containing the search criteria.
* @param array $fields List of fields to return.
* @param array $blobFields A list of fields that contain binary data.
*
* @return array Hash containing the search results.
* @throws Turba_Exception
*/
protected function _search(array $criteria, array $fields, array $blobFields = array(), $count_only = false)
{
$results = array();
foreach ($this->_getAddressBook() as $key => $contact) {
if (!count($criteria)) {
$results[$key] = $contact;
continue;
}
foreach ($criteria as $op => $vals) {
if ($op == 'AND') {
if (!count($vals)) {
$found = false;
} else {
$found = true;
foreach ($vals as $val) {
if (!$this->_match($contact, $val)) {
$found = false;
break;
}
}
}
} elseif ($op == 'OR') {
$found = false;
foreach ($vals as $val) {
if ($this->_match($contact, $val)) {
$found = true;
break;
}
}
} else {
$found = false;
}
}
if ($found) {
$results[$key] = $contact;
}
}
return $count_only ? count($results) : $results;
}
/**
* Returns whether a contact matches some criteria.
*
* @param array $contact A contact hash.
* @param array $val Some matching criterion, see _search().
*
* @return boolean True if the contact matches.
*/
protected function _match($contact, $val)
{
if (!isset($contact[$val['field']])) {
return false;
}
switch ($val['op']) {
case '=':
return (string)$contact[$val['field']] == (string)$val['test'];
case 'LIKE':
return empty($val['test']) ||
stristr($contact[$val['field']], $val['test']) !== false;
}
}
/**
* Reads the given data from the address book and returns the results.
*
* @param string $key The primary key field to use.
* @param mixed $ids The ids of the contacts to load.
* @param string $owner Only return contacts owned by this user.
* @param array $fields List of fields to return.
* @param array $blobFields Array of fields containing binary data.
* @param array $dateFields Array of fields containing date data.
* @since 4.2.0
*
* @return array Hash containing the search results.
* @throws Turba_Exception
*/
protected function _read($key, $ids, $owner, array $fields,
array $blobFields = array(),
array $dateFields = array())
{
$book = $this->_getAddressBook();
$results = array();
if (!is_array($ids)) {
$ids = array($ids);
}
foreach ($ids as $id) {
if (isset($book[$id])) {
$results[] = $book[$id];
}
}
return $results;
}
/**
* TODO
*
* @throws Turba_Exception
*/
protected function _getAddressBook()
{
global $registry;
if (!$registry->hasMethod('contacts/favouriteRecipients')) {
throw new Turba_Exception(_("No source for favourite recipients exists."));
}
try {
$addresses = $registry->call('contacts/favouriteRecipients', array($this->_params['limit']));
} catch (Horde_Exception $e) {
if ($e->getCode() == Horde_Registry::AUTH_FAILURE ||
$e->getCode() == Horde_Registry::NOT_ACTIVE ||
$e->getCode() == Horde_Registry::PERMISSION_DENIED) {
return array();
}
throw new Turba_Exception($e);
} catch (Exception $e) {
throw new Turba_Exception($e);
}
$addressbook = array();
foreach ($addresses as $address) {
$addressbook[$address] = array('email' => $address);
}
return $addressbook;
}
}