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

226 lines
7.1 KiB
PHP

<?php
/**
* Copyright 2004-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 2004-2017 Horde LLC
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*/
/**
* Handles spam/innocent reporting within IMP.
*
* Copyright 2004-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.
*
* @author Michael Slusarz <slusarz@horde.org>
* @category Horde
* @copyright 2004-2017 Horde LLC
* @license http://www.horde.org/licenses/gpl GPL
* @package IMP
*/
class IMP_Spam
{
/* Action constants. */
const INNOCENT = 1;
const SPAM = 2;
/**
* Action.
*
* @var integer
*/
protected $_action;
/**
* Driver list.
*
* @var array
*/
protected $_drivers;
/**
* Constructor.
*
* @param integer $action Either IMP_Spam::SPAM or IMP_Spam::INNOCENT.
* @param array $drivers List of reporting drivers.
*/
public function __construct($action, array $drivers = array())
{
$this->_action = $action;
$this->_drivers = $drivers;
}
/**
* Reports a list of messages as innocent/spam.
*
* @param IMP_Indices $indices An indices object.
* @param array $opts Additional options:
* - mailboxob: (IMP_Mailbox_List) Update this mailbox list object.
* DEFAULT: No update.
*
* @return integer 1 if messages have been deleted, 2 if messages have
* been moved.
*/
public function report(IMP_Indices $indices, array $opts = array())
{
global $injector, $notification, $prefs;
/* Abort immediately if spam reporting has not been enabled, or if
* there are no messages. */
if (empty($this->_drivers) || !count($indices)) {
return 0;
}
$imp_contents = $injector->getInstance('IMP_Factory_Contents');
$report_count = 0;
foreach ($indices as $ob) {
try {
$ob->mbox->uidvalid;
} catch (IMP_Exception $e) {
continue;
}
foreach ($ob->uids as $idx) {
try {
$contents = $imp_contents->create($ob->mbox->getIndicesOb($idx));
} catch (IMP_Exception $e) {
continue;
}
$report_flag = false;
foreach ($this->_drivers as $val) {
if ($val->report($contents, $this->_action)) {
$report_flag = true;
}
}
if ($report_flag) {
++$report_count;
}
}
}
if (!$report_count) {
return 0;
}
/* Report what we've done. */
if ($report_count == 1) {
$hdrs = $contents->getHeader();
if ($subject = $hdrs->getValue('subject')) {
$subject = Horde_String::truncate($subject, 30);
} elseif ($from = $hdrs->getValue('from')) {
$from = Horde_String::truncate($from, 30);
} else {
$subject = '[' . _("No Subject") . ']';
}
switch ($this->_action) {
case self::INNOCENT:
$msg = $subject
? sprintf(_("The message \"%s\" has been reported as innocent."), $subject)
: sprintf(_("The message from \"%s\" has been reported as innocent."), $from);
break;
case self::SPAM:
$msg = $subject
? sprintf(_("The message \"%s\" has been reported as spam."), $subject)
: sprintf(_("The message from \"%s\" has been reported as spam."), $from);
break;
}
} else {
switch ($this->_action) {
case self::INNOCENT:
$msg = sprintf(_("%d messages have been reported as innocent."), $report_count);
break;
case self::SPAM:
$msg = sprintf(_("%d messages have been reported as spam."), $report_count);
break;
}
}
$notification->push($msg, 'horde.message');
$mbox_args = array();
if (isset($opts['mailboxob'])) {
$mbox_args['mailboxob'] = $opts['mailboxob'];
}
/* Run post-reporting hook. */
try {
$injector->getInstance('Horde_Core_Hooks')->callHook(
'post_spam',
'imp',
array(
($this->_action == self::SPAM) ? 'spam' : 'innocent',
$indices
)
);
} catch (Horde_Exception_HookNotSet $e) {}
/* Delete/move message after report. */
switch ($this->_action) {
case self::INNOCENT:
/* Always flag messages as NotJunk. */
$imp_message = $injector->getInstance('IMP_Message');
$imp_message->flag(array(
'add' => array(Horde_Imap_Client::FLAG_NOTJUNK),
'remove' => array(Horde_Imap_Client::FLAG_JUNK)
), $indices);
if (($result = $prefs->getValue('move_innocent_after_report')) &&
!$imp_message->copy('INBOX', 'move', $indices, $mbox_args)) {
$result = 0;
}
break;
case self::SPAM:
/* Always flag messages as Junk. */
$imp_message = $injector->getInstance('IMP_Message');
$imp_message->flag(array(
'add' => array(Horde_Imap_Client::FLAG_JUNK),
'remove' => array(Horde_Imap_Client::FLAG_NOTJUNK)
), $indices);
switch ($result = $prefs->getValue('delete_spam_after_report')) {
case 1:
$msg_count = $imp_message->delete($indices, $mbox_args);
if ($msg_count === false) {
$result = 0;
} else {
if ($msg_count == 1) {
$notification->push(_("The message has been deleted."), 'horde.message');
} else {
$notification->push(sprintf(_("%d messages have been deleted."), $msg_count), 'horde.message');
}
}
break;
case 2:
if ($targetMbox = IMP_Mailbox::getPref(IMP_Mailbox::MBOX_SPAM)) {
if (!$imp_message->copy($targetMbox, 'move', $indices, array_merge($mbox_args, array('create' => true)))) {
$result = 0;
}
} else {
$notification->push(_("Could not move message to spam mailbox - no spam mailbox defined in preferences."), 'horde.error');
$result = 0;
}
break;
}
break;
}
return $result;
}
}