alecpl
2010-02-06 9b94eb64153a7dc6555d6b9a30a35296ce592f82
- Fix setting task name according to auth state. So, any action before user
is authenticated is assigned to 'login' task instead of 'mail'. Now binding
plugins to 'login' task is possible and realy usefull. It's also possible
to bind to all tasks excluding 'login'.


12 files modified
53 ■■■■■ changed files
CHANGELOG 1 ●●●● patch | view | raw | blame | history
index.php 6 ●●●●● patch | view | raw | blame | history
plugins/archive/archive.php 3 ●●●●● patch | view | raw | blame | history
plugins/autologon/autologon.php 3 ●●●● patch | view | raw | blame | history
plugins/help/help.php 6 ●●●● patch | view | raw | blame | history
plugins/http_authentication/http_authentication.php 3 ●●●● patch | view | raw | blame | history
plugins/markasjunk/markasjunk.php 3 ●●●●● patch | view | raw | blame | history
plugins/new_user_identity/new_user_identity.php 2 ●●●●● patch | view | raw | blame | history
plugins/squirrelmail_usercopy/squirrelmail_usercopy.php 2 ●●●●● patch | view | raw | blame | history
program/include/rcmail.php 20 ●●●●● patch | view | raw | blame | history
program/include/rcube_plugin_api.php 2 ●●● patch | view | raw | blame | history
program/steps/mail/func.inc 2 ●●●●● patch | view | raw | blame | history
CHANGELOG
@@ -1,6 +1,7 @@
CHANGELOG RoundCube Webmail
===========================
- Fix setting task name according to auth state
- Password: fix vpopmaild driver (#1486478)
- Add workaround for MySQL bug [http://bugs.mysql.com/bug.php?id=46293] (#1486474)
- Fix quoted text wrapping when replying to an HTML email in plain text (#1484141)
index.php
@@ -80,7 +80,7 @@
$RCMAIL->action = $startup['action'];
// try to log in
if ($RCMAIL->action=='login' && $RCMAIL->task=='mail') {
if ($RCMAIL->task == 'login' && $RCMAIL->action == 'login') {
  // purge the session in case of new login when a session already exists 
  $RCMAIL->kill_session();
  
@@ -117,6 +117,8 @@
    if ($url = get_input_value('_url', RCUBE_INPUT_POST))
      parse_str($url, $query);
    $RCMAIL->set_task('mail');
    // allow plugins to control the redirect url after login success
    $redir = $RCMAIL->plugins->exec_hook('login_after', $query + array('task' => $RCMAIL->task));
    unset($redir['abort']);
@@ -141,7 +143,7 @@
}
// check session and auth cookie
else if ($RCMAIL->action != 'login' && $_SESSION['user_id'] && $RCMAIL->action != 'send') {
else if ($RCMAIL->task != 'login' && $_SESSION['user_id'] && $RCMAIL->action != 'send') {
  if (!$RCMAIL->authenticate_session()) {
    $OUTPUT->show_message('sessionerror', 'error');
    $RCMAIL->kill_session();
plugins/archive/archive.php
@@ -17,9 +17,6 @@
  {
    $rcmail = rcmail::get_instance();
    if (!$rcmail->user->ID)
      return;
    $this->register_action('plugin.archive', array($this, 'request_action'));
    // There is no "Archived flags"
plugins/autologon/autologon.php
@@ -6,6 +6,7 @@
 */
class autologon extends rcube_plugin
{
  public $task = 'login';
  function init()
  {
@@ -18,7 +19,7 @@
    $rcmail = rcmail::get_instance();
    // change action to login
    if ($args['task'] == 'mail' && empty($args['action']) && empty($_SESSION['user_id']) && !empty($_GET['_autologin']) && $this->is_localhost())
    if (empty($_SESSION['user_id']) && !empty($_GET['_autologin']) && $this->is_localhost())
      $args['action'] = 'login';
    return $args;
plugins/help/help.php
@@ -12,12 +12,12 @@
class help extends rcube_plugin
{
    // all task excluding 'login' and 'logout'
    public $task = '?(?!login|logout).*';
    function init()
    {
      $rcmail = rcmail::get_instance();
      if (!$rcmail->user->ID)
        return;
      $this->add_texts('localization/', false);
      
plugins/http_authentication/http_authentication.php
@@ -10,6 +10,7 @@
 */
class http_authentication extends rcube_plugin
{
  public $task = 'login';
  function init()
  {
@@ -20,7 +21,7 @@
  function startup($args)
  {
    // change action to login
    if ($args['task'] == 'mail' && empty($args['action']) && empty($_SESSION['user_id'])
    if (empty($args['action']) && empty($_SESSION['user_id'])
        && !empty($_SERVER['PHP_AUTH_USER']) && !empty($_SERVER['PHP_AUTH_PW']))
      $args['action'] = 'login';
plugins/markasjunk/markasjunk.php
@@ -17,9 +17,6 @@
  {
    $rcmail = rcmail::get_instance();
    if (!$rcmail->user->ID)
      return;
    $this->register_action('plugin.markasjunk', array($this, 'request_action'));
      
    if ($rcmail->action == '' || $rcmail->action == 'show') {
plugins/new_user_identity/new_user_identity.php
@@ -22,6 +22,8 @@
 */
class new_user_identity extends rcube_plugin
{
    public $task = 'login';
    function init()
    {
        $this->add_hook('create_user', array($this, 'lookup_user_name'));
plugins/squirrelmail_usercopy/squirrelmail_usercopy.php
@@ -10,6 +10,8 @@
 */
class squirrelmail_usercopy extends rcube_plugin
{
    public $task = 'login|settings';
    private $prefs = null;
    private $abook = array();
program/include/rcmail.php
@@ -39,7 +39,7 @@
  public $imap;
  public $output;
  public $plugins;
  public $task = 'mail';
  public $task;
  public $action = '';
  public $comm_path = './';
  
@@ -91,10 +91,6 @@
      openlog($syslog_id, LOG_ODELAY, $syslog_facility);
    }
    // set task and action properties
    $this->set_task(get_input_value('_task', RCUBE_INPUT_GPC));
    $this->action = asciiwords(get_input_value('_action', RCUBE_INPUT_GPC));
    // connect to database
    $GLOBALS['DB'] = $this->get_dbh();
@@ -123,6 +119,10 @@
    // create user object
    $this->set_user(new rcube_user($_SESSION['user_id']));
    // set task and action properties
    $this->set_task(get_input_value('_task', RCUBE_INPUT_GPC));
    $this->action = asciiwords(get_input_value('_action', RCUBE_INPUT_GPC));
    // reset some session parameters when changing task
    if ($_SESSION['task'] != $this->task)
      rcube_sess_unset('page');
@@ -131,7 +131,7 @@
    $_SESSION['task'] = $this->task;
    // create IMAP object
    if ($this->task == 'mail')
    if ($this->task == 'login')
      $this->imap_init();
      
    // create plugin API and load plugins
@@ -147,7 +147,13 @@
  public function set_task($task)
  {
    $task = asciiwords($task);
    $this->task = $task ? $task : 'mail';
    if ($this->user && $this->user->ID)
      $task = !$task || $task == 'login' ? 'mail' : $task;
    else
      $task = 'login';
    $this->task = $task;
    $this->comm_path = $this->url(array('task' => $this->task));
    
    if ($this->output)
program/include/rcube_plugin_api.php
@@ -90,7 +90,7 @@
        if (class_exists($plugin_name, false)) {
          $plugin = new $plugin_name($this);
          // check inheritance and task specification
          if (is_subclass_of($plugin, 'rcube_plugin') && (!$plugin->task || preg_match('/('.$plugin->task.')/i', $rcmail->task))) {
          if (is_subclass_of($plugin, 'rcube_plugin') && (!$plugin->task || preg_match('/^('.$plugin->task.')$/i', $rcmail->task))) {
            $plugin->init();
            $this->plugins[] = $plugin;
          }
program/steps/mail/func.inc
@@ -24,6 +24,8 @@
// actions that do not require imap connection
$NOIMAP_ACTIONS = array('spell', 'addcontact', 'autocomplete', 'upload', 'display-attachment', 'remove-attachment');
// Init IMAP object
$RCMAIL->imap_init();
// log in to imap server
if (!in_array($RCMAIL->action, $NOIMAP_ACTIONS) && !$RCMAIL->imap_connect()) {