Files
server/usr/share/psa-horde/ingo/lib/Factory/Script.php
2026-01-07 20:52:11 +01:00

168 lines
5.2 KiB
PHP

<?php
/**
* Copyright 2012-2017 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (ASL). If you
* did not receive this file, see http://www.horde.org/licenses/apache.
*
* @author Michael Slusarz <slusarz@horde.org>
* @author Jan Schneider <jan@horde.org>
* @category Horde
* @license http://www.horde.org/licenses/apache ASL
* @link http://pear.horde.org/index.php?package=Ingo
* @package Ingo
*/
/**
* A Horde_Injector based Ingo_Script factory.
*
* @author Michael Slusarz <slusarz@horde.org>
* @author Jan Schneider <jan@horde.org>
* @category Horde
* @license http://www.horde.org/licenses/apache ASL
* @link http://pear.horde.org/index.php?package=Ingo
* @package Ingo
*/
class Ingo_Factory_Script extends Horde_Core_Factory_Base
{
/**
* Returns a Ingo_Script instance.
*
* @param integer $rule A script rule, one of the Ingo::RULE_* constants.
*
* @return Ingo_Script A Ingo_Script instance.
* @throws Ingo_Exception
*/
public function create($rule)
{
global $conf, $injector, $notification, $prefs, $registry, $session;
$scripts = $GLOBALS['session']
->get('ingo', 'backend/script', Horde_Session::TYPE_ARRAY);
if ($rule != Ingo::RULE_ALL && isset($scripts[$rule])) {
$script = $scripts[$rule];
$skip = array_diff(
array(Ingo::RULE_FILTER, Ingo::RULE_BLACKLIST,
Ingo::RULE_WHITELIST, Ingo::RULE_VACATION,
Ingo::RULE_FORWARD, Ingo::RULE_SPAM),
array($rule)
);
} else {
$script = $scripts[Ingo::RULE_ALL];
$skip = array_keys($scripts);
}
$driver = ucfirst(basename($script['driver']));
$params = $script['params'];
$params['skip'] = $skip;
$params['storage'] = $injector->getInstance('Ingo_Factory_Storage')
->create();
$params['transport'] = $session->get('ingo', 'backend/transport', Horde_Session::TYPE_ARRAY);
if (!isset($params['spam_compare'])) {
$params['spam_compare'] = $conf['spam']['compare'];
}
if (!isset($params['spam_header'])) {
$params['spam_header'] = $conf['spam']['header'];
}
if (!isset($params['spam_char']) &&
($params['spam_compare'] == 'string')) {
$params['spam_char'] = $conf['spam']['char'];
}
switch ($driver) {
case 'Imap':
$params['filter_seen'] = $prefs->getValue('filter_seen');
$params['mailbox'] = 'INBOX';
$params['notification'] = $notification;
$params['registry'] = $registry;
$params['show_filter_msg'] = $prefs->getValue('show_filter_msg');
$params['api'] = new Ingo_Script_Imap_Live($params);
break;
case 'Sieve':
if (!isset($params['date_format'])) {
$params['date_format'] = $prefs->getValue('date_format');
}
if (!isset($params['time_format'])) {
// %R and %r don't work on Windows, but who runs a Sieve
// backend on a Windows server?
$params['time_format'] = $prefs->getValue('twentyFour')
? '%R'
: '%r';
}
break;
}
$class = 'Ingo_Script_' . $driver;
if (class_exists($class)) {
return new $class($params);
}
throw new Ingo_Exception(sprintf(_("Unable to load the script driver \"%s\"."), $class));
}
/**
* Returns all Ingo_Script instances.
*
* @return array All Ingo_Script instances.
* @throws Ingo_Exception
*/
public function createAll()
{
$scripts = $GLOBALS['session']
->get('ingo', 'backend/script', Horde_Session::TYPE_ARRAY);
$instances = array();
foreach (array_keys($scripts) as $rule) {
$instances[$rule] = $this->create($rule);
}
return $instances;
}
/**
* Returns whether the script drivers support a certain feature.
*
* @see Ingo_Script_Base::hasFeature()
*
* @param string $feature A feature name.
*
* @return boolean True if this feature is supported.
*/
public function hasFeature($feature)
{
foreach ($this->createAll() as $driver) {
if ($driver->hasFeature($feature)) {
return true;
}
}
return false;
}
/**
* Performs the filtering specified in all rules.
*
* @param integer $change The timestamp of the latest rule change during
* the current session.
*/
public function perform($change = null)
{
foreach ($this->createAll() as $driver) {
$driver->perform($change);
}
}
/**
* Is the perform() function available?
*
* @return boolean True if perform() is available, false if not.
*/
public function canPerform()
{
foreach ($this->createAll() as $driver) {
if ($driver->canPerform()) {
return true;
}
}
return false;
}
}