Aleksander Machniak
2012-06-30 7c8fd8031038e7958ef4dbb059e86decd6fefa28
Show explicit error message when provided hostname is invalid (#1488550)
4 files modified
75 ■■■■ changed files
CHANGELOG 1 ●●●● patch | view | raw | blame | history
index.php 27 ●●●● patch | view | raw | blame | history
program/include/rcmail.php 46 ●●●●● patch | view | raw | blame | history
program/localization/en_US/messages.inc 1 ●●●● patch | view | raw | blame | history
CHANGELOG
@@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail
===========================
- Show explicit error message when provided hostname is invalid (#1488550)
- Fix wrong compose screen elements focus in IE9 (#1488541)
- Fix fatal error when date.timezone isn't set (#1488546)
- Update to TinyMCE 3.5.4.1
index.php
@@ -100,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
@@ -140,9 +137,23 @@
    $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';
    $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();
program/include/rcmail.php
@@ -58,6 +58,12 @@
  const JS_OBJECT_NAME = 'rcmail';
  const ERROR_STORAGE          = -2;
  const ERROR_INVALID_REQUEST  = 1;
  const ERROR_INVALID_HOST     = 2;
  const ERROR_COOKIES_DISABLED = 3;
  /**
   * This implements the 'singleton' design pattern
   *
@@ -366,12 +372,20 @@
   * @param string Mail storage (IMAP) user name
   * @param string Mail storage (IMAP) password
   * @param string Mail storage (IMAP) host
   * @param bool   Enables cookie check
   *
   * @return boolean True on success, False on failure
   */
  function login($username, $pass, $host=NULL)
  function login($username, $pass, $host = null, $cookiecheck = false)
  {
    $this->login_error = null;
    if (empty($username)) {
      return false;
    }
    if ($cookiecheck && empty($_COOKIE)) {
      $this->login_error = self::ERROR_COOKIES_DISABLED;
      return false;
    }
@@ -391,11 +405,18 @@
          break;
        }
      }
      if (!$allowed)
        return false;
      if (!$allowed) {
        $host = null;
      }
    else if (!empty($config['default_host']) && $host != rcube_utils::parse_host($config['default_host']))
    }
    else if (!empty($config['default_host']) && $host != rcube_utils::parse_host($config['default_host'])) {
      $host = null;
    }
    if (!$host) {
      $this->login_error = self::ERROR_INVALID_HOST;
      return false;
    }
    // parse $host URL
    $a_host = parse_url($host);
@@ -534,6 +555,23 @@
  }
    /**
     * Returns error code of last login operation
     *
     * @return int Error code
     */
    public function login_error()
    {
        if ($this->login_error) {
            return $this->login_error;
        }
        if ($this->storage && $this->storage->get_error_code() < -1) {
            return self::ERROR_STORAGE;
        }
    }
  /**
   * Auto-select IMAP host based on the posted login information
   *
program/localization/en_US/messages.inc
@@ -33,6 +33,7 @@
$messages['errorreadonly'] = 'Unable to perform operation. Folder is read-only.';
$messages['errornoperm'] = 'Unable to perform operation. Permission denied.';
$messages['invalidrequest'] = 'Invalid request! No data was saved.';
$messages['invalidhost'] = 'Invalid server name.';
$messages['nomessagesfound'] = 'No messages found in this mailbox.';
$messages['loggedout'] = 'You have successfully terminated the session. Good bye!';
$messages['mailboxempty'] = 'Mailbox is empty.';