Last active
September 12, 2024 06:19
-
-
Save johndoh/8173505 to your computer and use it in GitHub Desktop.
Example of how to run multiple drivers with the MarkAsJunk2 plugin for Roundcube Webmail.Warning: This is only an example and not ready for use in production, the code needs to be modified and tested for specific implementations.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* MarkAsJunk2 run multiple drivers | |
* WARNING: Use with extreme caution, running multiple drivers in succession is dangerous! | |
* Some drivers destroy the original message and create a new one, altering the message ID ($UID) | |
* and so multiple drivers must be run in a specific order. Extra step by step error checking may | |
* also be needed to prevent errors from cascading from one driver to another. | |
* | |
* In this example the edit_headers driver is used to add/remove a [SPAM] tag from the message | |
* subject while cmd_learn is used to run sa-learn. Both the edit_headers and cmd_learn driver | |
* options must be defined in the MarkAsJunk2 config file and the markasjunk2_learning_driver | |
* option set to multi_driver | |
* | |
* @version 0.2 | |
* @author Philip Weir | |
*/ | |
class markasjunk2_multi_driver | |
{ | |
public $is_error = false; | |
// In this example we want to run the drivers in different orders when making as ham/spam | |
// so there is no need to define them here, but if the order wass static we could put something | |
// like: | |
// private $drivers = array('sa_blacklist', 'cmd_learn'); | |
private $drivers = array(); | |
public function spam(&$uids, $mbox) | |
{ | |
// Define the driver list in the correct order for the mark as spam action | |
// We always want the original message to be processed by cmd_learn so when marking as | |
// spam cmd_learn should be run first. edit_headers can then alter the message | |
$this->drivers = array('cmd_learn', 'edit_headers'); | |
$this->_call_drivers($uids, $mbox, true); | |
} | |
public function ham(&$uids, $mbox) | |
{ | |
// Define the driver list in the correct order for the mark as ham action | |
// We always want the original message to be processed by cmd_learn so when marking as | |
// ham edit_headers should be run first, restoring the message to normal then cmd_learn | |
// can be run | |
$this->drivers = array('edit_headers', 'cmd_learn'); | |
$this->_call_drivers($uids, $mbox, false); | |
} | |
private function _call_drivers(&$uids, $mbox, $spam) | |
{ | |
$rcmail = rcube::get_instance(); | |
foreach ($this->drivers as $driver) { | |
$driver_file = slashify(RCUBE_PLUGINS_DIR) .'/markasjunk2/drivers/'. $driver .'.php'; | |
$class = 'markasjunk2_' . $driver; | |
if (!is_readable($driver_file)) { | |
rcube::raise_error(array( | |
'code' => 600, | |
'type' => 'php', | |
'file' => __FILE__, | |
'line' => __LINE__, | |
'message' => "MarkasJunk2 plugin - multi_driver: Unable to open driver file $driver_file" | |
), true, false); | |
$rcmail->output->command('display_message', $rcmail->gettext('internalerror'), 'error'); | |
$this->is_error = true; | |
return; | |
} | |
include_once $driver_file; | |
if (!class_exists($class, false) || !method_exists($class, 'spam') || !method_exists($class, 'ham')) { | |
rcube::raise_error(array( | |
'code' => 600, | |
'type' => 'php', | |
'file' => __FILE__, | |
'line' => __LINE__, | |
'message' => "MarkasJunk2 plugin - multi_driver: Broken driver: $driver_file" | |
), true, false); | |
$rcmail->output->command('display_message', $rcmail->gettext('internalerror'), 'error'); | |
$this->is_error = true; | |
return; | |
} | |
$object = new $class; | |
if ($spam) | |
$object->spam($uids, $mbox); | |
else | |
$object->ham($uids, $mbox); | |
if ($object->is_error) { | |
$this->is_error = true; | |
// An error was detected so lets bail out | |
return; | |
} | |
} | |
} | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment