From 9b94eb64153a7dc6555d6b9a30a35296ce592f82 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Sat, 06 Feb 2010 13:12:49 -0500
Subject: [PATCH] - 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'. 

---
 CHANGELOG                                               |    1 +
 index.php                                               |   10 ++++++----
 plugins/http_authentication/http_authentication.php     |    3 ++-
 plugins/archive/archive.php                             |    3 ---
 program/include/rcube_plugin_api.php                    |    2 +-
 plugins/help/help.php                                   |    6 +++---
 plugins/markasjunk/markasjunk.php                       |    3 ---
 program/include/rcmail.php                              |   20 +++++++++++++-------
 program/steps/mail/func.inc                             |    2 ++
 plugins/squirrelmail_usercopy/squirrelmail_usercopy.php |    2 ++
 plugins/new_user_identity/new_user_identity.php         |    2 ++
 plugins/autologon/autologon.php                         |    3 ++-
 12 files changed, 34 insertions(+), 23 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 6416ca3..8578fdc 100644
--- a/CHANGELOG
+++ b/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)
diff --git a/index.php b/index.php
index e3c542b..7251b53 100644
--- a/index.php
+++ b/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']);
@@ -132,7 +134,7 @@
 }
 
 // end session
-else if ($RCMAIL->task=='logout' && isset($_SESSION['user_id'])) {
+else if ($RCMAIL->task == 'logout' && isset($_SESSION['user_id'])) {
   $userdata = array('user' => $_SESSION['username'], 'host' => $_SESSION['imap_host'], 'lang' => $RCMAIL->user->language);
   $OUTPUT->show_message('loggedout');
   $RCMAIL->logout_actions();
@@ -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();
@@ -168,7 +170,7 @@
 if (empty($RCMAIL->user->ID)) {
   if ($OUTPUT->ajax_call)
     $OUTPUT->redirect(array(), 2000);
-  
+
   if (!empty($_REQUEST['_framed']))
     $OUTPUT->command('redirect', '?');
 
diff --git a/plugins/archive/archive.php b/plugins/archive/archive.php
index d2269ba..939faf8 100644
--- a/plugins/archive/archive.php
+++ b/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"
diff --git a/plugins/autologon/autologon.php b/plugins/autologon/autologon.php
index c40f2d4..bc3d2ee 100644
--- a/plugins/autologon/autologon.php
+++ b/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;
diff --git a/plugins/help/help.php b/plugins/help/help.php
index 94d0654..a7b3d57 100644
--- a/plugins/help/help.php
+++ b/plugins/help/help.php
@@ -12,13 +12,13 @@
 
 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);
       
       // register actions
diff --git a/plugins/http_authentication/http_authentication.php b/plugins/http_authentication/http_authentication.php
index 57422a7..7c22966 100644
--- a/plugins/http_authentication/http_authentication.php
+++ b/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';
 
diff --git a/plugins/markasjunk/markasjunk.php b/plugins/markasjunk/markasjunk.php
index 9f75590..0466458 100644
--- a/plugins/markasjunk/markasjunk.php
+++ b/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') {
diff --git a/plugins/new_user_identity/new_user_identity.php b/plugins/new_user_identity/new_user_identity.php
index 78c9952..43eeae9 100644
--- a/plugins/new_user_identity/new_user_identity.php
+++ b/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'));
diff --git a/plugins/squirrelmail_usercopy/squirrelmail_usercopy.php b/plugins/squirrelmail_usercopy/squirrelmail_usercopy.php
index 4a14ff2..aff2f49 100644
--- a/plugins/squirrelmail_usercopy/squirrelmail_usercopy.php
+++ b/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();
 
diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index 3d26065..cd61872 100644
--- a/program/include/rcmail.php
+++ b/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)
diff --git a/program/include/rcube_plugin_api.php b/program/include/rcube_plugin_api.php
index 1eeadce..b19c0a3 100644
--- a/program/include/rcube_plugin_api.php
+++ b/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;
           }
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index e9adc15..dea85c2 100644
--- a/program/steps/mail/func.inc
+++ b/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()) {

--
Gitblit v1.9.1