From d016dcc6f6a3daf8c19e2ececd3c676cd274381a Mon Sep 17 00:00:00 2001
From: Thomas <tb@woodcrest.local>
Date: Wed, 09 Oct 2013 06:02:52 -0400
Subject: [PATCH] Refactor multi-threaded autocomple contact searching to make it available for other purposes, too
---
index.php | 95 +++++++++++++++++++++++++++++------------------
1 files changed, 58 insertions(+), 37 deletions(-)
diff --git a/index.php b/index.php
index 6790338..3be71f2 100644
--- a/index.php
+++ b/index.php
@@ -2,9 +2,9 @@
/*
+-------------------------------------------------------------------------+
| Roundcube Webmail IMAP Client |
- | Version 0.9-svn |
+ | Version 1.0-git |
| |
- | Copyright (C) 2005-2012, The Roundcube Dev Team |
+ | Copyright (C) 2005-2013, The Roundcube Dev Team |
| |
| This program is free software: you can redistribute it and/or modify |
| it under the terms of the GNU General Public License (with exceptions |
@@ -33,16 +33,13 @@
+-------------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> |
+-------------------------------------------------------------------------+
-
- $Id$
-
*/
// include environment
require_once 'program/include/iniset.php';
// init application, start session, init output class, etc.
-$RCMAIL = rcmail::get_instance();
+$RCMAIL = rcmail::get_instance($GLOBALS['env']);
// Make the whole PHP output non-cacheable (#1487797)
$RCMAIL->output->nocacheing_headers();
@@ -103,12 +100,9 @@
'valid' => $request_valid,
));
- // check if client supports cookies
- if ($auth['cookiecheck'] && empty($_COOKIE)) {
- $OUTPUT->show_message("cookiesdisabled", 'warning');
- }
- else if ($auth['valid'] && !$auth['abort'] &&
- $RCMAIL->login($auth['user'], $auth['pass'], $auth['host'])
+ // Login
+ if ($auth['valid'] && !$auth['abort'] &&
+ $RCMAIL->login($auth['user'], $auth['pass'], $auth['host'], $auth['cookiecheck'])
) {
// create new session ID, don't destroy the current session
// it was destroyed already by $RCMAIL->kill_session() above
@@ -129,6 +123,10 @@
// prevent endless looping on login page
if ($query['_task'] == 'login')
unset($query['_task']);
+
+ // prevent redirect to compose with specified ID (#1488226)
+ if ($query['_action'] == 'compose' && !empty($query['_id']))
+ $query = array();
}
// allow plugins to control the redirect url after login success
@@ -139,9 +137,26 @@
$OUTPUT->redirect($redir);
}
else {
- $error_code = is_object($RCMAIL->storage) ? $RCMAIL->storage->get_error_code() : 1;
+ if (!$auth['valid']) {
+ $error_code = RCMAIL::ERROR_INVALID_REQUEST;
+ }
+ else {
+ $error_code = $auth['error'] ? $auth['error'] : $RCMAIL->login_error();
+ }
- $OUTPUT->show_message($error_code < -1 ? 'storageerror' : (!$auth['valid'] ? 'invalidrequest' : 'loginfailed'), 'warning');
+ $error_labels = array(
+ RCMAIL::ERROR_STORAGE => 'storageerror',
+ RCMAIL::ERROR_COOKIES_DISABLED => 'cookiesdisabled',
+ RCMAIL::ERROR_INVALID_REQUEST => 'invalidrequest',
+ RCMAIL::ERROR_INVALID_HOST => 'invalidhost',
+ );
+
+ $error_message = $error_labels[$error_code] ? $error_labels[$error_code] : 'loginfailed';
+
+ // log failed login
+ $RCMAIL->log_login($auth['user'], true, $error_code);
+
+ $OUTPUT->show_message($error_message, 'warning');
$RCMAIL->plugins->exec_hook('login_failed', array(
'code' => $error_code, 'host' => $auth['host'], 'user' => $auth['user']));
$RCMAIL->kill_session();
@@ -149,7 +164,7 @@
}
// end session (after optional referer check)
-else if ($RCMAIL->task == 'logout' && isset($_SESSION['user_id']) && (!$RCMAIL->config->get('referer_check') || rcmail::check_referer())) {
+else if ($RCMAIL->task == 'logout' && isset($_SESSION['user_id']) && (!$RCMAIL->config->get('referer_check') || rcube_utils::check_referer())) {
$userdata = array(
'user' => $_SESSION['username'],
'host' => $_SESSION['storage_host'],
@@ -199,33 +214,36 @@
if ($session_error || $_REQUEST['_err'] == 'session')
$OUTPUT->show_message('sessionerror', 'error', null, true, -1);
- $RCMAIL->set_task('login');
- $OUTPUT->send('login');
+ $plugin = $RCMAIL->plugins->exec_hook('unauthenticated', array('task' => 'login', 'error' => $session_error));
+
+ $RCMAIL->set_task($plugin['task']);
+ $OUTPUT->send($plugin['task']);
}
// CSRF prevention
else {
// don't check for valid request tokens in these actions
- $request_check_whitelist = array('login'=>1, 'spell'=>1);
+ $request_check_whitelist = array('login'=>1, 'spell'=>1, 'spell_html'=>1);
- // check client X-header to verify request origin
- if ($OUTPUT->ajax_call) {
- if (rcube_utils::request_header('X-Roundcube-Request') != $RCMAIL->get_request_token() && !$RCMAIL->config->get('devel_mode')) {
- header('HTTP/1.1 403 Forbidden');
- die("Invalid Request");
+ if (!$request_check_whitelist[$RCMAIL->action]) {
+ // check client X-header to verify request origin
+ if ($OUTPUT->ajax_call) {
+ if (rcube_utils::request_header('X-Roundcube-Request') != $RCMAIL->get_request_token()) {
+ header('HTTP/1.1 403 Forbidden');
+ die("Invalid Request");
+ }
}
- }
- // check request token in POST form submissions
- else if (!empty($_POST) && !$request_check_whitelist[$RCMAIL->action] && !$RCMAIL->check_request()) {
- $OUTPUT->show_message('invalidrequest', 'error');
- $OUTPUT->send($RCMAIL->task);
- }
+ // check request token in POST form submissions
+ else if (!empty($_POST) && !$RCMAIL->check_request()) {
+ $OUTPUT->show_message('invalidrequest', 'error');
+ $OUTPUT->send($RCMAIL->task);
+ }
- // check referer if configured
- if (!$request_check_whitelist[$RCMAIL->action] && $RCMAIL->config->get('referer_check') && !rcmail::check_referer()) {
- raise_error(array(
- 'code' => 403,
- 'type' => 'php',
- 'message' => "Referer check failed"), true, true);
+ // check referer if configured
+ if ($RCMAIL->config->get('referer_check') && !rcube_utils::check_referer()) {
+ raise_error(array(
+ 'code' => 403, 'type' => 'php',
+ 'message' => "Referer check failed"), true, true);
+ }
}
}
@@ -233,7 +251,6 @@
$plugin = $RCMAIL->plugins->exec_hook('ready', array('task' => $RCMAIL->task, 'action' => $RCMAIL->action));
$RCMAIL->set_task($plugin['task']);
$RCMAIL->action = $plugin['action'];
-
// handle special actions
if ($RCMAIL->action == 'keep-alive') {
@@ -267,7 +284,8 @@
else if (($stepfile = $RCMAIL->get_action_file())
&& is_file($incfile = INSTALL_PATH . 'program/steps/'.$RCMAIL->task.'/'.$stepfile)
) {
- include $incfile;
+ // include action file only once (in case it don't exit)
+ include_once $incfile;
$redirects++;
}
else {
@@ -275,6 +293,9 @@
}
}
+if ($RCMAIL->action == 'refresh') {
+ $RCMAIL->plugins->exec_hook('refresh', array());
+}
// parse main template (default)
$OUTPUT->send($RCMAIL->task);
--
Gitblit v1.9.1