Skip to content

Commit

Permalink
Log session validation errors; keep error message when redirecting to…
Browse files Browse the repository at this point in the history
… login after session error
  • Loading branch information
thomascube committed Jul 30, 2011
1 parent a164005 commit fcc7f86
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 7 deletions.
3 changes: 3 additions & 0 deletions config/main.inc.php.dist
Expand Up @@ -41,6 +41,9 @@ $rcmail_config['smtp_log'] = true;
// Log successful logins to <log_dir>/userlogins or to syslog // Log successful logins to <log_dir>/userlogins or to syslog
$rcmail_config['log_logins'] = false; $rcmail_config['log_logins'] = false;


// Log session authentication errors to <log_dir>/session or to syslog
$rcmail_config['log_session'] = false;

// Log SQL queries to <log_dir>/sql or to syslog // Log SQL queries to <log_dir>/sql or to syslog
$rcmail_config['sql_debug'] = false; $rcmail_config['sql_debug'] = false;


Expand Down
17 changes: 13 additions & 4 deletions index.php
Expand Up @@ -120,7 +120,7 @@


// allow plugins to control the redirect url after login success // allow plugins to control the redirect url after login success
$redir = $RCMAIL->plugins->exec_hook('login_after', $query + array('_task' => 'mail')); $redir = $RCMAIL->plugins->exec_hook('login_after', $query + array('_task' => 'mail'));
unset($redir['abort']); unset($redir['abort'], $redir['_err']);


// send redirect // send redirect
$OUTPUT->redirect($redir); $OUTPUT->redirect($redir);
Expand All @@ -147,18 +147,24 @@
// check session and auth cookie // check session and auth cookie
else if ($RCMAIL->task != 'login' && $_SESSION['user_id'] && $RCMAIL->action != 'send') { else if ($RCMAIL->task != 'login' && $_SESSION['user_id'] && $RCMAIL->action != 'send') {
if (!$RCMAIL->session->check_auth()) { if (!$RCMAIL->session->check_auth()) {
$OUTPUT->show_message('sessionerror', 'error');
$RCMAIL->kill_session(); $RCMAIL->kill_session();
$session_error = true;
} }
} }


// not logged in -> show login page // not logged in -> show login page
if (empty($RCMAIL->user->ID)) { if (empty($RCMAIL->user->ID)) {
// log session failures
if ($RCMAIL->task != 'login' && !$session_error && ($sess_id = $_COOKIE[ini_get('session.name')])) {
$RCMAIL->session->log("Aborted session " . $sess_id . "; no valid session data found");
$session_error = true;
}

if ($OUTPUT->ajax_call) if ($OUTPUT->ajax_call)
$OUTPUT->redirect(array(), 2000); $OUTPUT->redirect(array('_err' => 'session'), 2000);


if (!empty($_REQUEST['_framed'])) if (!empty($_REQUEST['_framed']))
$OUTPUT->command('redirect', '?'); $OUTPUT->command('redirect', $RCMAIL->url(array('_err' => 'session')));


// check if installer is still active // check if installer is still active
if ($RCMAIL->config->get('enable_installer') && is_readable('./installer/index.php')) { if ($RCMAIL->config->get('enable_installer') && is_readable('./installer/index.php')) {
Expand All @@ -171,6 +177,9 @@
) )
); );
} }

if ($session_error || $_REQUEST['_err'] == 'session')
$OUTPUT->show_message('sessionerror', 'error', null, true, -1);


$RCMAIL->set_task('login'); $RCMAIL->set_task('login');
$OUTPUT->send('login'); $OUTPUT->send('login');
Expand Down
21 changes: 19 additions & 2 deletions program/include/rcube_session.php
Expand Up @@ -42,6 +42,7 @@ class rcube_session
private $prev; private $prev;
private $secret = ''; private $secret = '';
private $ip_check = false; private $ip_check = false;
private $logging = false;
private $keep_alive = 0; private $keep_alive = 0;
private $memcache; private $memcache;


Expand All @@ -53,6 +54,7 @@ public function __construct($db, $config)
$this->db = $db; $this->db = $db;
$this->start = microtime(true); $this->start = microtime(true);
$this->ip = $_SERVER['REMOTE_ADDR']; $this->ip = $_SERVER['REMOTE_ADDR'];
$this->logging = $config->get('log_session', false);


$lifetime = $config->get('session_lifetime', 1) * 60; $lifetime = $config->get('session_lifetime', 1) * 60;
$this->set_lifetime($lifetime); $this->set_lifetime($lifetime);
Expand Down Expand Up @@ -565,12 +567,18 @@ function check_auth()
$this->cookie = $_COOKIE[$this->cookiename]; $this->cookie = $_COOKIE[$this->cookiename];
$result = $this->ip_check ? $_SERVER['REMOTE_ADDR'] == $this->ip : true; $result = $this->ip_check ? $_SERVER['REMOTE_ADDR'] == $this->ip : true;


if (!$result)
$this->log("IP check failed for " . $this->key . "; expected " . $this->ip . "; got " . $_SERVER['REMOTE_ADDR']);

if ($result && $this->_mkcookie($this->now) != $this->cookie) { if ($result && $this->_mkcookie($this->now) != $this->cookie) {
// Check if using id from previous time slot // Check if using id from previous time slot
if ($this->_mkcookie($this->prev) == $this->cookie) if ($this->_mkcookie($this->prev) == $this->cookie) {
$this->set_auth_cookie(); $this->set_auth_cookie();
else }
else {
$result = false; $result = false;
$this->log("Session authentication failed for " . $this->key . "; invalid auth cookie sent");
}
} }


return $result; return $result;
Expand Down Expand Up @@ -598,5 +606,14 @@ function _mkcookie($timeslot)
$auth_string = "$this->key,$this->secret,$timeslot"; $auth_string = "$this->key,$this->secret,$timeslot";
return "S" . (function_exists('sha1') ? sha1($auth_string) : md5($auth_string)); return "S" . (function_exists('sha1') ? sha1($auth_string) : md5($auth_string));
} }

/**
*
*/
function log($line)
{
if ($this->logging)
write_log('session', $line);
}


} }
3 changes: 2 additions & 1 deletion program/js/app.js
Expand Up @@ -5153,7 +5153,8 @@ function rcube_webmail()
obj.click(function() { return ref.hide_message(obj); }); obj.click(function() { return ref.hide_message(obj); });
} }


window.setTimeout(function() { ref.hide_message(id, type == 'loading'); }, timeout); if (timeout > 0)
window.setTimeout(function() { ref.hide_message(id, type == 'loading'); }, timeout);
return id; return id;
}; };


Expand Down

0 comments on commit fcc7f86

Please sign in to comment.