1: <?php
2: /**
3: * The IMP_Filter:: class contains all functions related to handling
4: * filtering messages in IMP.
5: *
6: * For full use, the following Horde API calls should be defined
7: * (These API methods are not defined in IMP):
8: * mail/applyFilters
9: * mail/canApplyFilters
10: * mail/showFilters
11: * mail/blacklistFrom
12: * mail/showBlacklist
13: * mail/whitelistFrom
14: * mail/showWhitelist
15: *
16: * Copyright 2002-2012 Horde LLC (http://www.horde.org/)
17: *
18: * See the enclosed file COPYING for license information (GPL). If you
19: * did not receive this file, see http://www.horde.org/licenses/gpl.
20: *
21: * @author Michael Slusarz <slusarz@horde.org>
22: * @category Horde
23: * @license http://www.horde.org/licenses/gpl GPL
24: * @package IMP
25: */
26: class IMP_Filter
27: {
28: /**
29: * Runs the filters if they are able to be applied manually.
30: *
31: * @param string $mbox The mailbox to apply the filters to.
32: * @throws Horde_Exception
33: */
34: public function filter($mbox)
35: {
36: if (!$GLOBALS['session']->get('imp', 'filteravail')) {
37: return;
38: }
39:
40: $imp_search = $GLOBALS['injector']->getInstance('IMP_Search');
41: $mbox_list = $imp_search->isSearchMbox($mbox)
42: ? $imp_search[$mbox]->mboxes
43: : array($mbox);
44:
45: foreach ($mbox_list as $val) {
46: $GLOBALS['registry']->call('mail/applyFilters', array(array('mailbox' => strval($val))));
47: }
48: }
49:
50: /**
51: * Adds the From address from the message(s) to the blacklist and deletes
52: * the message(s).
53: *
54: * @param IMP_Indices $indices An indices object.
55: * @param boolean $show_link Show link to the blacklist management in
56: * the notification message?
57: *
58: * @return boolean True if the messages(s) were deleted.
59: * @throws Horde_Exception
60: */
61: public function blacklistMessage($indices, $show_link = true)
62: {
63: if (!$this->_processBWlist($indices, _("your blacklist"), 'blacklistFrom', 'showBlacklist', $show_link) ||
64: !($msg_count = $GLOBALS['injector']->getInstance('IMP_Message')->delete($indices))) {
65: return false;
66: }
67:
68: if ($msg_count == 1) {
69: $GLOBALS['notification']->push(_("The message has been deleted."), 'horde.message');
70: } else {
71: $GLOBALS['notification']->push(_("The messages have been deleted."), 'horde.message');
72: }
73:
74: return true;
75: }
76:
77: /**
78: * Adds the From address from the message(s) to the whitelist.
79: *
80: * @param IMP_Indices $indices An indices object.
81: * @param boolean $show_link Show link to the whitelist management in
82: * the notification message?
83: *
84: * @return boolean True if the messages(s) were whitelisted.
85: * @throws Horde_Exception
86: */
87: public function whitelistMessage($indices, $show_link = true)
88: {
89: return $this->_processBWlist($indices, _("your whitelist"), 'whitelistFrom', 'showWhitelist', $show_link);
90: }
91:
92: /**
93: * Internal function to handle adding addresses to [black|white]list.
94: *
95: * @param IMP_Indices $indices An indices object.
96: * @param string $descrip The textual description to use.
97: * @param string $reg1 The name of the mail/ registry call to use
98: * for adding the addresses.
99: * @param string $reg2 The name of the mail/ registry call to use
100: * for linking to the filter management page.
101: * @param boolean $link Show link to the whitelist management in
102: * the notification message?
103: *
104: * @return boolean True on success.
105: * @throws IMP_Exception
106: */
107: protected function _processBWlist($indices, $descrip, $reg1, $reg2, $link)
108: {
109: if (!count($indices)) {
110: return false;
111: }
112:
113: $addr = array();
114: $imp_imap = $GLOBALS['injector']->getInstance('IMP_Factory_Imap')->create();
115:
116: foreach ($indices as $ob) {
117: $ob->mbox->uidvalid;
118:
119: foreach ($ob->uids as $idx) {
120: /* Get the list of from addresses. */
121: $contents = $GLOBALS['injector']->getInstance('IMP_Factory_Contents')->create($ob->mbox->getIndicesOb($idx));
122: $addr[] = Horde_Mime_Address::bareAddress($contents->getHeader()->getValue('from'));
123: }
124: }
125:
126: $GLOBALS['registry']->call('mail/' . $reg1, array($addr));
127:
128: /* Add link to filter management page. */
129: if ($link && $GLOBALS['registry']->hasMethod('mail/' . $reg2)) {
130: $manage_link = Horde::link(Horde::url($GLOBALS['registry']->link('mail/' . $reg2)), sprintf(_("Filters: %s management page"), $descrip)) . _("HERE") . '</a>';
131: $GLOBALS['notification']->push(sprintf(_("Click %s to go to %s management page."), $manage_link, $descrip), 'horde.message', array('content.raw'));
132: }
133:
134: return true;
135: }
136:
137: }
138: