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'. 

---
 program/include/rcmail.php |  101 ++++++++++++++++++++++++++------------------------
 1 files changed, 53 insertions(+), 48 deletions(-)

diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index a388459..cd61872 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcmail.php 328 2006-08-30 17:41:21Z thomasb $
+ $Id$
 
 */
 
@@ -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)
@@ -492,31 +498,35 @@
     if (!($imap_login  = $this->imap->connect($host, $username, $pass, $imap_port, $imap_ssl)))
       return false;
 
+    $this->set_imap_prop();
+
     // user already registered -> update user's record
     if (is_object($user)) {
+      // create default folders on first login
+      if (!$user->data['last_login'] && $config['create_default_folders'])
+        $this->imap->create_default_folders();
       $user->touch();
     }
     // create new system user
     else if ($config['auto_create_user']) {
       if ($created = rcube_user::create($username, $host)) {
         $user = $created;
-
-        // get existing mailboxes (but why?)
-        // $a_mailboxes = $this->imap->list_mailboxes();
+        // create default folders on first login
+        if ($config['create_default_folders'])
+          $this->imap->create_default_folders();
       }
       else {
         raise_error(array(
-          'code' => 600,
-          'type' => 'php',
+          'code' => 600, 'type' => 'php',
+	  'file' => __FILE__, 'line' => __LINE__,
           'message' => "Failed to create a user record. Maybe aborted by a plugin?"
-          ), true, false);        
+          ), true, false);
       }
     }
     else {
       raise_error(array(
-        'code' => 600,
-        'type' => 'php',
-        'file' => RCMAIL_CONFIG_DIR."/main.inc.php",
+        'code' => 600, 'type' => 'php',
+        'file' => __FILE__, 'line' => __LINE__,
         'message' => "Acces denied for new user $username. 'auto_create_user' is disabled"
         ), true, false);
     }
@@ -538,11 +548,7 @@
         $_SESSION['timezone'] = floatval($_REQUEST['_timezone']);
 
       // force reloading complete list of subscribed mailboxes
-      $this->set_imap_prop();
       $this->imap->clear_cache('mailboxes');
-
-      if ($config['create_default_folders'])
-          $this->imap->create_default_folders();
 
       return true;
     }
@@ -636,25 +642,14 @@
       $attrib = array('name' => $attrib);
 
     $nr = is_numeric($attrib['nr']) ? $attrib['nr'] : 1;
-    $vars = isset($attrib['vars']) ? $attrib['vars'] : '';
+    $name = $attrib['name'] ? $attrib['name'] : '';
 
-    $command_name = !empty($attrib['command']) ? $attrib['command'] : NULL;
-    $alias = $attrib['name'] ? $attrib['name'] : ($command_name && $command_label_map[$command_name] ? $command_label_map[$command_name] : '');
-    
     // check for text with domain
-    if ($domain && ($text_item = $this->texts[$domain.'.'.$alias]))
+    if ($domain && ($text_item = $this->texts[$domain.'.'.$name]))
       ;
     // text does not exist
-    else if (!($text_item = $this->texts[$alias])) {
-      /*
-      raise_error(array(
-        'code' => 500,
-        'type' => 'php',
-        'line' => __LINE__,
-        'file' => __FILE__,
-        'message' => "Missing localized text for '$alias' in '$sess_user_lang'"), TRUE, FALSE);
-      */
-      return "[$alias]";
+    else if (!($text_item = $this->texts[$name])) {
+      return "[$name]";
     }
 
     // make text item array 
@@ -684,11 +679,8 @@
     // replace vars in text
     if (is_array($attrib['vars'])) {
       foreach ($attrib['vars'] as $var_key => $var_value)
-        $a_replace_vars[$var_key{0}=='$' ? substr($var_key, 1) : $var_key] = $var_value;
+        $text = str_replace($var_key[0]!='$' ? '$'.$var_key : $var_key, $var_value, $text);
     }
-
-    if ($a_replace_vars)
-      $text = preg_replace('/\$\{?([_a-z]{1}[_a-z0-9]*)\}?/ei', '$a_replace_vars["\1"]', $text);
 
     // format output
     if (($attrib['uppercase'] && strtolower($attrib['uppercase']=='first')) || $attrib['ucfirst'])
@@ -762,7 +754,7 @@
             continue;
 
           if ($label = $rcube_languages[$name])
-            $sa_languages[$name] = $label ? $label : $name;
+            $sa_languages[$name] = $label;
         }
         closedir($dh);
       }
@@ -867,6 +859,17 @@
     // before closing the database connection, write session data
     if ($_SERVER['REMOTE_ADDR'])
       session_write_close();
+
+    // write performance stats to logs/console
+    if ($this->config->get('devel_mode')) {
+      if (function_exists('memory_get_usage'))
+        $mem = show_bytes(memory_get_usage());
+      if (function_exists('memory_get_peak_usage'))
+        $mem .= '/'.show_bytes(memory_get_peak_usage());
+
+      $log = $this->task . ($this->action ? '/'.$this->action : '') . ($mem ? " [$mem]" : '');
+      rcube_print_time(RCMAIL_START, $log);
+    }
   }
   
   
@@ -961,9 +964,8 @@
     else
     {
       raise_error(array(
-        'code' => 500,
-        'type' => 'php',
-        'file' => __FILE__,
+        'code' => 500, 'type' => 'php',
+        'file' => __FILE__, 'line' => __LINE__,
         'message' => "Could not perform encryption; make sure Mcrypt is installed or lib/des.inc is available"
       ), true, true);
     }
@@ -1007,9 +1009,8 @@
     else
     {
       raise_error(array(
-        'code' => 500,
-        'type' => 'php',
-        'file' => __FILE__,
+        'code' => 500, 'type' => 'php',
+        'file' => __FILE__, 'line' => __LINE__,
         'message' => "Could not perform decryption; make sure Mcrypt is installed or lib/des.inc is available"
       ), true, true);
     }
@@ -1061,9 +1062,13 @@
    */
   public static function setcookie($name, $value, $exp = 0)
   {
+    if (headers_sent())
+      return;
+
     $cookie = session_get_cookie_params();
+
     setcookie($name, $value, $exp, $cookie['path'], $cookie['domain'],
-      ($_SERVER['HTTPS'] && ($_SERVER['HTTPS'] != 'off')));
+      rcube_https_check(), true);
   }
 }
 

--
Gitblit v1.9.1