From bec31a4e86ac0d6b569e7b9601b0bde4a0e26a16 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Thu, 06 May 2010 13:51:31 -0400
Subject: [PATCH] - fix for use without session object

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

diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index 1224822..d9ee00a 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -107,7 +107,7 @@
     $this->action = asciiwords(get_input_value('_action', RCUBE_INPUT_GPC));
 
     // reset some session parameters when changing task
-    if ($_SESSION['task'] != $this->task)
+    if ($this->session && $_SESSION['task'] != $this->task)
       $this->session->remove('page');
 
     // set current task to session
@@ -292,22 +292,24 @@
   public function get_address_sources($writeable = false)
   {
     $abook_type = strtolower($this->config->get('address_book_type'));
-    $ldap_config = (array)$this->config->get('ldap_public');
-    $autocomplete = (array)$this->config->get('autocomplete_addressbooks');
+    $ldap_config = $this->config->get('ldap_public');
+    $autocomplete = (array) $this->config->get('autocomplete_addressbooks');
     $list = array();
 
     // We are using the DB address book
     if ($abook_type != 'ldap') {
+      $contacts = new rcube_contacts($this->db, null);
       $list['0'] = array(
         'id' => 0,
         'name' => rcube_label('personaladrbook'),
-        'groups' => true,
+        'groups' => $contacts->groups,
         'readonly' => false,
         'autocomplete' => in_array('sql', $autocomplete)
       );
     }
 
-    if (is_array($ldap_config)) {
+    if ($ldap_config) {
+      $ldap_config = (array) $ldap_config;
       foreach ($ldap_config as $id => $prop)
         $list[$id] = array(
           'id' => $id,
@@ -324,11 +326,11 @@
     if ($writeable && !empty($list)) {
       foreach ($list as $idx => $item) {
         if ($item['readonly']) {
-	  unset($list[$idx]);
+          unset($list[$idx]);
         }
       }
     }
-    
+
     return $list;
   }
   
@@ -348,7 +350,7 @@
       $this->output = new rcube_template($this->task, $framed);
 
     // set keep-alive/check-recent interval
-    if ($keep_alive = $this->session->get_keep_alive()) {
+    if ($this->session && ($keep_alive = $this->session->get_keep_alive())) {
       $this->output->set_env('keep_alive', $keep_alive);
     }
 
@@ -421,8 +423,8 @@
     // set pagesize from config
     $this->imap->set_pagesize($this->config->get('pagesize', 50));
     
-    // Setting root and delimiter before iil_Connect can save time detecting them
-    // using NAMESPACE and LIST 
+    // Setting root and delimiter before establishing the connection
+    // can save time detecting them using NAMESPACE and LIST 
     $options = array(
       'auth_method' => $this->config->get('imap_auth_type', 'check'),
       'delimiter' => isset($_SESSION['imap_delimiter']) ? $_SESSION['imap_delimiter'] : $this->config->get('imap_delimiter'),
@@ -456,21 +458,21 @@
    */
   public function imap_connect()
   {
-    $conn = false;
-
     if (!$this->imap)
       $this->imap_init();
     
-    if ($_SESSION['imap_host'] && !$this->imap->conn) {
-      if (!($conn = $this->imap->connect($_SESSION['imap_host'], $_SESSION['username'], $this->decrypt($_SESSION['password']), $_SESSION['imap_port'], $_SESSION['imap_ssl']))) {
+    if ($_SESSION['imap_host'] && !$this->imap->conn->connected()) {
+      if (!$this->imap->connect($_SESSION['imap_host'], $_SESSION['username'], $this->decrypt($_SESSION['password']), $_SESSION['imap_port'], $_SESSION['imap_ssl'])) {
         if ($this->output)
           $this->output->show_message($this->imap->error_code == -1 ? 'imaperror' : 'sessionerror', 'error');
       }
-
-      $this->set_imap_prop();
+      else {
+        $this->set_imap_prop();
+        return $this->imap->conn;
+      }
     }
 
-    return $conn;
+    return false;
   }
 
 
@@ -479,6 +481,10 @@
    */
   public function session_init()
   {
+    // session started (Installer?)
+    if (session_id())
+      return;
+
     $lifetime = $this->config->get('session_lifetime', 0) * 60;
 
     // set session domain
@@ -520,6 +526,9 @@
    */
   public function session_configure()
   {
+    if (!$this->session)
+      return;
+
     $lifetime = $this->config->get('session_lifetime', 0) * 60;
 
     // set keep-alive/check-recent interval
@@ -631,7 +640,7 @@
       else {
         raise_error(array(
           'code' => 600, 'type' => 'php',
-	  'file' => __FILE__, 'line' => __LINE__,
+	      'file' => __FILE__, 'line' => __LINE__,
           'message' => "Failed to create a user record. Maybe aborted by a plugin?"
           ), true, false);
       }
@@ -957,10 +966,8 @@
    */
   public function shutdown()
   {
-    if (is_object($this->imap)) {
+    if (is_object($this->imap))
       $this->imap->close();
-      $this->imap->write_cache();
-    }
 
     if (is_object($this->smtp))
       $this->smtp->disconnect();
@@ -980,7 +987,10 @@
         $mem .= '/'.show_bytes(memory_get_peak_usage());
 
       $log = $this->task . ($this->action ? '/'.$this->action : '') . ($mem ? " [$mem]" : '');
-      rcube_print_time(RCMAIL_START, $log);
+      if (defined('RCMAIL_START'))
+        rcube_print_time(RCMAIL_START, $log);
+      else
+        console($log);
     }
   }
   
@@ -1065,23 +1075,25 @@
       mcrypt_generic_deinit($td);
       mcrypt_module_close($td);
     }
-    else if (function_exists('des'))
-    {
-      define('DES_IV_SIZE', 8);
-      $iv = '';
-      for ($i = 0; $i < constant('DES_IV_SIZE'); $i++)
-        $iv .= sprintf("%c", mt_rand(0, 255));
-      $cipher = $iv . des($this->config->get_crypto_key($key), $clear, 1, 1, $iv);
+    else {
+      @include_once('lib/des.inc');
+
+      if (function_exists('des')) {
+        $des_iv_size = 8;
+        $iv = '';
+        for ($i = 0; $i < $des_iv_size; $i++)
+          $iv .= sprintf("%c", mt_rand(0, 255));
+        $cipher = $iv . des($this->config->get_crypto_key($key), $clear, 1, 1, $iv);
+      }
+      else {
+        raise_error(array(
+          '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);
+      }
     }
-    else
-    {
-      raise_error(array(
-        '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);
-    }
-  
+
     return $base64 ? base64_encode($cipher) : $cipher;
   }
 
@@ -1111,22 +1123,24 @@
       mcrypt_generic_deinit($td);
       mcrypt_module_close($td);
     }
-    else if (function_exists('des'))
-    {
-      define('DES_IV_SIZE', 8);
-      $iv = substr($cipher, 0, constant('DES_IV_SIZE'));
-      $cipher = substr($cipher, constant('DES_IV_SIZE'));
-      $clear = des($this->config->get_crypto_key($key), $cipher, 0, 1, $iv);
+    else {
+      @include_once('lib/des.inc');
+    
+      if (function_exists('des')) {
+        $des_iv_size = 8;
+        $iv = substr($cipher, 0, $des_iv_size);
+        $cipher = substr($cipher, $des_iv_size);
+        $clear = des($this->config->get_crypto_key($key), $cipher, 0, 1, $iv);
+      }
+      else {
+        raise_error(array(
+          '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);
+      }
     }
-    else
-    {
-      raise_error(array(
-        '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);
-    }
-  
+
     /*-
      * Trim PHP's padding and the canary byte; see note in
      * rcmail::encrypt() and http://php.net/mcrypt_generic#68082

--
Gitblit v1.9.1