Mercurial > hg > rc2
comparison index.php @ 8:bf99236cc5cd
try to recover from upgrade fail
| author | Charlie Root |
|---|---|
| date | Sat, 29 Dec 2018 07:07:34 -0500 |
| parents | 4681f974d28b |
| children |
comparison
equal
deleted
inserted
replaced
| 7:65fd7d441cf1 | 8:bf99236cc5cd |
|---|---|
| 1 <?php | 1 <?php |
| 2 /* | 2 /** |
| 3 +-------------------------------------------------------------------------+ | 3 +-------------------------------------------------------------------------+ |
| 4 | Roundcube Webmail IMAP Client | | 4 | Roundcube Webmail IMAP Client | |
| 5 | Version 1.1.5 | | 5 | Version 1.3.3 | |
| 6 | | | 6 | | |
| 7 | Copyright (C) 2005-2015, The Roundcube Dev Team | | 7 | Copyright (C) 2005-2017, The Roundcube Dev Team | |
| 8 | | | 8 | | |
| 9 | This program is free software: you can redistribute it and/or modify | | 9 | This program is free software: you can redistribute it and/or modify | |
| 10 | it under the terms of the GNU General Public License (with exceptions | | 10 | it under the terms of the GNU General Public License (with exceptions | |
| 11 | for skins & plugins) as published by the Free Software Foundation, | | 11 | for skins & plugins) as published by the Free Software Foundation, | |
| 12 | either version 3 of the License, or (at your option) any later version. | | 12 | either version 3 of the License, or (at your option) any later version. | |
| 38 | 38 |
| 39 // include environment | 39 // include environment |
| 40 require_once 'program/include/iniset.php'; | 40 require_once 'program/include/iniset.php'; |
| 41 | 41 |
| 42 // init application, start session, init output class, etc. | 42 // init application, start session, init output class, etc. |
| 43 $RCMAIL = rcmail::get_instance($GLOBALS['env']); | 43 $RCMAIL = rcmail::get_instance(0, $GLOBALS['env']); |
| 44 | 44 |
| 45 // Make the whole PHP output non-cacheable (#1487797) | 45 // Make the whole PHP output non-cacheable (#1487797) |
| 46 $RCMAIL->output->nocacheing_headers(); | 46 $RCMAIL->output->nocacheing_headers(); |
| 47 $RCMAIL->output->common_headers(); | 47 $RCMAIL->output->common_headers(); |
| 48 | 48 |
| 60 // check DB connections and exit on failure | 60 // check DB connections and exit on failure |
| 61 if ($err_str = $RCMAIL->db->is_error()) { | 61 if ($err_str = $RCMAIL->db->is_error()) { |
| 62 rcmail::raise_error(array( | 62 rcmail::raise_error(array( |
| 63 'code' => 603, | 63 'code' => 603, |
| 64 'type' => 'db', | 64 'type' => 'db', |
| 65 'message' => $err_str), FALSE, TRUE); | 65 'message' => $err_str), false, true); |
| 66 } | 66 } |
| 67 | 67 |
| 68 // error steps | 68 // error steps |
| 69 if ($RCMAIL->action == 'error' && !empty($_GET['_code'])) { | 69 if ($RCMAIL->action == 'error' && !empty($_GET['_code'])) { |
| 70 rcmail::raise_error(array('code' => hexdec($_GET['_code'])), FALSE, TRUE); | 70 rcmail::raise_error(array('code' => hexdec($_GET['_code'])), false, true); |
| 71 } | 71 } |
| 72 | 72 |
| 73 // check if https is required (for login) and redirect if necessary | 73 // check if https is required (for login) and redirect if necessary |
| 74 if (empty($_SESSION['user_id']) && ($force_https = $RCMAIL->config->get('force_https', false))) { | 74 if (empty($_SESSION['user_id']) && ($force_https = $RCMAIL->config->get('force_https', false))) { |
| 75 $https_port = is_bool($force_https) ? 443 : $force_https; | 75 // force_https can be true, <hostname>, <hostname>:<port>, <port> |
| 76 | 76 if (!is_bool($force_https)) { |
| 77 if (!rcube_utils::https_check($https_port)) { | 77 list($host, $port) = explode(':', $force_https); |
| 78 $host = preg_replace('/:[0-9]+$/', '', $_SERVER['HTTP_HOST']); | 78 |
| 79 $host .= ($https_port != 443 ? ':' . $https_port : ''); | 79 if (is_numeric($host) && empty($port)) { |
| 80 $port = $host; | |
| 81 $host = ''; | |
| 82 } | |
| 83 } | |
| 84 | |
| 85 if (!rcube_utils::https_check($port ?: 443)) { | |
| 86 if (empty($host)) { | |
| 87 $host = preg_replace('/:[0-9]+$/', '', $_SERVER['HTTP_HOST']); | |
| 88 } | |
| 89 if ($port && $port != 443) { | |
| 90 $host .= ':' . $port; | |
| 91 } | |
| 80 | 92 |
| 81 header('Location: https://' . $host . $_SERVER['REQUEST_URI']); | 93 header('Location: https://' . $host . $_SERVER['REQUEST_URI']); |
| 82 exit; | 94 exit; |
| 83 } | 95 } |
| 84 } | 96 } |
| 89 $RCMAIL->action = $startup['action']; | 101 $RCMAIL->action = $startup['action']; |
| 90 | 102 |
| 91 // try to log in | 103 // try to log in |
| 92 if ($RCMAIL->task == 'login' && $RCMAIL->action == 'login') { | 104 if ($RCMAIL->task == 'login' && $RCMAIL->action == 'login') { |
| 93 $request_valid = $_SESSION['temp'] && $RCMAIL->check_request(); | 105 $request_valid = $_SESSION['temp'] && $RCMAIL->check_request(); |
| 106 $pass_charset = $RCMAIL->config->get('password_charset', 'ISO-8859-1'); | |
| 94 | 107 |
| 95 // purge the session in case of new login when a session already exists | 108 // purge the session in case of new login when a session already exists |
| 96 $RCMAIL->kill_session(); | 109 $RCMAIL->kill_session(); |
| 97 | 110 |
| 98 $auth = $RCMAIL->plugins->exec_hook('authenticate', array( | 111 $auth = $RCMAIL->plugins->exec_hook('authenticate', array( |
| 99 'host' => $RCMAIL->autoselect_host(), | 112 'host' => $RCMAIL->autoselect_host(), |
| 100 'user' => trim(rcube_utils::get_input_value('_user', rcube_utils::INPUT_POST)), | 113 'user' => trim(rcube_utils::get_input_value('_user', rcube_utils::INPUT_POST)), |
| 101 'pass' => rcube_utils::get_input_value('_pass', rcube_utils::INPUT_POST, true, | 114 'pass' => rcube_utils::get_input_value('_pass', rcube_utils::INPUT_POST, true, $pass_charset), |
| 102 $RCMAIL->config->get('password_charset', 'ISO-8859-1')), | 115 'valid' => $request_valid, |
| 103 'cookiecheck' => true, | 116 'cookiecheck' => true, |
| 104 'valid' => $request_valid, | |
| 105 )); | 117 )); |
| 106 | 118 |
| 107 // Login | 119 // Login |
| 108 if ($auth['valid'] && !$auth['abort'] | 120 if ($auth['valid'] && !$auth['abort'] |
| 109 && $RCMAIL->login($auth['user'], $auth['pass'], $auth['host'], $auth['cookiecheck']) | 121 && $RCMAIL->login($auth['user'], $auth['pass'], $auth['host'], $auth['cookiecheck']) |
| 142 // send redirect | 154 // send redirect |
| 143 $OUTPUT->redirect($redir, 0, true); | 155 $OUTPUT->redirect($redir, 0, true); |
| 144 } | 156 } |
| 145 else { | 157 else { |
| 146 if (!$auth['valid']) { | 158 if (!$auth['valid']) { |
| 147 $error_code = RCMAIL::ERROR_INVALID_REQUEST; | 159 $error_code = rcmail::ERROR_INVALID_REQUEST; |
| 148 } | 160 } |
| 149 else { | 161 else { |
| 150 $error_code = is_numeric($auth['error']) ? $auth['error'] : $RCMAIL->login_error(); | 162 $error_code = is_numeric($auth['error']) ? $auth['error'] : $RCMAIL->login_error(); |
| 151 } | 163 } |
| 152 | 164 |
| 153 $error_labels = array( | 165 $error_labels = array( |
| 154 RCMAIL::ERROR_STORAGE => 'storageerror', | 166 rcmail::ERROR_STORAGE => 'storageerror', |
| 155 RCMAIL::ERROR_COOKIES_DISABLED => 'cookiesdisabled', | 167 rcmail::ERROR_COOKIES_DISABLED => 'cookiesdisabled', |
| 156 RCMAIL::ERROR_INVALID_REQUEST => 'invalidrequest', | 168 rcmail::ERROR_INVALID_REQUEST => 'invalidrequest', |
| 157 RCMAIL::ERROR_INVALID_HOST => 'invalidhost', | 169 rcmail::ERROR_INVALID_HOST => 'invalidhost', |
| 170 rcmail::ERROR_RATE_LIMIT => 'accountlocked', | |
| 158 ); | 171 ); |
| 159 | 172 |
| 160 $error_message = !empty($auth['error']) && !is_numeric($auth['error']) ? $auth['error'] : ($error_labels[$error_code] ?: 'loginfailed'); | 173 $error_message = !empty($auth['error']) && !is_numeric($auth['error']) ? $auth['error'] : ($error_labels[$error_code] ?: 'loginfailed'); |
| 161 | 174 |
| 162 $OUTPUT->show_message($error_message, 'warning'); | 175 $OUTPUT->show_message($error_message, 'warning'); |
| 220 // check if installer is still active | 233 // check if installer is still active |
| 221 if ($RCMAIL->config->get('enable_installer') && is_readable('./installer/index.php')) { | 234 if ($RCMAIL->config->get('enable_installer') && is_readable('./installer/index.php')) { |
| 222 $OUTPUT->add_footer(html::div(array('style' => "background:#ef9398; border:2px solid #dc5757; padding:0.5em; margin:2em auto; width:50em"), | 235 $OUTPUT->add_footer(html::div(array('style' => "background:#ef9398; border:2px solid #dc5757; padding:0.5em; margin:2em auto; width:50em"), |
| 223 html::tag('h2', array('style' => "margin-top:0.2em"), "Installer script is still accessible") . | 236 html::tag('h2', array('style' => "margin-top:0.2em"), "Installer script is still accessible") . |
| 224 html::p(null, "The install script of your Roundcube installation is still stored in its default location!") . | 237 html::p(null, "The install script of your Roundcube installation is still stored in its default location!") . |
| 225 html::p(null, "Please <b>remove</b> the whole <tt>installer</tt> folder from the Roundcube directory because . | 238 html::p(null, "Please <b>remove</b> the whole <tt>installer</tt> folder from the Roundcube directory because |
| 226 these files may expose sensitive configuration data like server passwords and encryption keys | 239 these files may expose sensitive configuration data like server passwords and encryption keys |
| 227 to the public. Make sure you cannot access the <a href=\"./installer/\">installer script</a> from your browser.") | 240 to the public. Make sure you cannot access the <a href=\"./installer/\">installer script</a> from your browser.") |
| 228 )); | 241 )); |
| 229 } | 242 } |
| 230 | 243 |
| 240 | 253 |
| 241 // check access to disabled actions | 254 // check access to disabled actions |
| 242 $disabled_actions = (array) $RCMAIL->config->get('disabled_actions'); | 255 $disabled_actions = (array) $RCMAIL->config->get('disabled_actions'); |
| 243 if (in_array($RCMAIL->task . '.' . ($RCMAIL->action ?: 'index'), $disabled_actions)) { | 256 if (in_array($RCMAIL->task . '.' . ($RCMAIL->action ?: 'index'), $disabled_actions)) { |
| 244 rcube::raise_error(array( | 257 rcube::raise_error(array( |
| 245 'code' => 403, 'type' => 'php', | 258 'code' => 404, 'type' => 'php', |
| 246 'message' => "Action disabled"), true, true); | 259 'message' => "Action disabled"), true, true); |
| 247 } | 260 } |
| 248 } | 261 } |
| 249 | 262 |
| 250 // we're ready, user is authenticated and the request is safe | 263 // we're ready, user is authenticated and the request is safe |
| 289 // include action file only once (in case it don't exit) | 302 // include action file only once (in case it don't exit) |
| 290 include_once $incfile; | 303 include_once $incfile; |
| 291 $redirects++; | 304 $redirects++; |
| 292 } | 305 } |
| 293 else { | 306 else { |
| 307 #rcube::write_log('mail',$incfile." not found"); | |
| 294 break; | 308 break; |
| 295 } | 309 } |
| 296 } | 310 } |
| 297 | 311 |
| 298 if ($RCMAIL->action == 'refresh') { | 312 if ($RCMAIL->action == 'refresh') { |
| 299 $RCMAIL->plugins->exec_hook('refresh', array('last' => intval(rcube_utils::get_input_value('_last', rcube_utils::INPUT_GPC)))); | 313 $RCMAIL->plugins->exec_hook('refresh', array('last' => intval(rcube_utils::get_input_value('_last', rcube_utils::INPUT_GPC)))); |
| 300 } | 314 } |
| 301 | 315 |
| 316 #rcube::write_log('mail',"task: ".$RCMAIL->task." action: ".$RCMAIL->action); | |
| 302 // parse main template (default) | 317 // parse main template (default) |
| 303 $OUTPUT->send($RCMAIL->task); | 318 $OUTPUT->send($RCMAIL->task); |
| 304 | 319 |
| 305 // if we arrive here, something went wrong | 320 // if we arrive here, something went wrong |
| 306 rcmail::raise_error(array( | 321 rcmail::raise_error(array( |
