index.php | ●●●●● patch | view | raw | blame | history | |
program/include/rcube_plugin.php | ●●●●● patch | view | raw | blame | history | |
program/include/rcube_plugin_api.php | ●●●●● patch | view | raw | blame | history |
index.php
@@ -242,9 +242,13 @@ while ($redirects < 5) { $stepfile = !empty($action_map[$RCMAIL->task][$RCMAIL->action]) ? $action_map[$RCMAIL->task][$RCMAIL->action] : strtr($RCMAIL->action, '-', '_') . '.inc'; // execute a plugin action if (preg_match('/^plugin\./', $RCMAIL->action)) { if ($RCMAIL->plugins->is_plugin_task($RCMAIL->task)) { $RCMAIL->plugins->exec_action($RCMAIL->task.'.'.$RCMAIL->action); break; } else if (preg_match('/^plugin\./', $RCMAIL->action)) { $RCMAIL->plugins->exec_action($RCMAIL->action); break; } program/include/rcube_plugin.php
@@ -31,6 +31,7 @@ public $task; protected $home; protected $urlbase; private $mytask; /** * Default constructor. @@ -134,19 +135,8 @@ */ public function register_task($task) { if ($task != asciiwords($task)) { raise_error(array('code' => 526, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, 'message' => "Invalid task name: $task. Only characters [a-z0-9_.-] are allowed"), true, false); } else if (in_array(rcmail::$main_tasks, $task)) { raise_error(array('code' => 526, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, 'message' => "Cannot register taks $task; already taken by another plugin or the application itself"), true, false); } else { rcmail::$main_tasks[] = $task; } if ($this->api->register_task($task, $this->ID)) $this->mytask = $task; } /** @@ -159,7 +149,7 @@ */ public function register_action($action, $callback) { $this->api->register_action($action, $this->ID, $callback); $this->api->register_action($action, $this->ID, $callback, $this->mytask); } /** program/include/rcube_plugin_api.php
@@ -34,6 +34,7 @@ public $handlers = array(); private $plugins = array(); private $tasks = array(); private $actions = array(); private $actionmap = array(); private $objectsmap = array(); @@ -206,11 +207,14 @@ * @param string Action name (_task=mail&_action=plugin.foo) * @param string Plugin name that registers this action * @param mixed Callback: string with global function name or array($obj, 'methodname') * @param string Task name registered by this plugin */ public function register_action($action, $owner, $callback) public function register_action($action, $owner, $callback, $task = null) { // check action name if (strpos($action, 'plugin.') !== 0) if ($task) $action = $task.'.'.$action; else if (strpos($action, 'plugin.') !== 0) $action = 'plugin.'.$action; // can register action only if it's not taken or registered by myself @@ -272,6 +276,45 @@ /** * Register this plugin to be responsible for a specific task * * @param string Task name (only characters [a-z0-9_.-] are allowed) * @param string Plugin name that registers this action */ public function register_task($task, $owner) { if ($task != asciiwords($task)) { raise_error(array('code' => 526, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, 'message' => "Invalid task name: $task. Only characters [a-z0-9_.-] are allowed"), true, false); } else if (in_array($task, rcmail::$main_tasks)) { raise_error(array('code' => 526, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, 'message' => "Cannot register taks $task; already taken by another plugin or the application itself"), true, false); } else { $this->tasks[$task] = $owner; rcmail::$main_tasks[] = $task; return true; } return false; } /** * Checks whether the given task is registered by a plugin * * @return boolean True if registered, otherwise false */ public function is_plugin_task($task) { return $this->tasks[$task] ? true : false; } /** * Check if a plugin hook is currently processing. * Mainly used to prevent loops and recursion. *