X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=include%2Finit.php;h=9f17708eb87466feed7f59a8d9bb792a6d78f988;hp=3899239379d40225f8e28dc8e94b525d515f393f;hb=7e77425503d3545d50a965e15df5f06b068c4e79;hpb=4a9f606333513eea3a56e772bd4a1338c492396f diff --git a/include/init.php b/include/init.php index 38992393..9f17708e 100644 --- a/include/init.php +++ b/include/init.php @@ -19,7 +19,6 @@ FIXME: disabling this for now, because we now have $sm_debug_mode, but the probl //error_reporting(E_ALL); - /** * Make sure we have a page name * @@ -75,6 +74,14 @@ if ((bool) ini_get('register_globals') && global $null; $null = NULL; +/** + * The global $server_os variable will be "windows" if + * we are working in a Windows environment or "*nix" + * otherwise. + */ +global $server_os; +if (DIRECTORY_SEPARATOR == '\\') $server_os = 'windows'; else $server_os = '*nix'; + /** * [#1518885] session.use_cookies = off breaks SquirrelMail * @@ -87,6 +94,46 @@ if (!(bool)ini_get('session.use_cookies') || ini_set('session.use_cookies','1'); } +/** + * Initialize seed of random number generator. + * We use a number of things to randomize input: current time in ms, + * info about the remote client, info about the current process, the + * randomness of uniqid and stat of the current file. + * + * We seed this here only once per init, not only to save cycles + * but also to make the result of mt_rand more random (it now also + * depends on the number of times mt_rand was called before in this + * execution. + */ +$seed = microtime() . $_SERVER['REMOTE_PORT'] . $_SERVER['REMOTE_ADDR'] . getmypid(); + +if (function_exists('getrusage')) { + /* Avoid warnings with Win32 */ + $dat = @getrusage(); + if (isset($dat) && is_array($dat)) { $seed .= implode('', $dat); } +} + +if(!empty($_SERVER['UNIQUE_ID'])) { + $seed .= $_SERVER['UNIQUE_ID']; +} + +$seed .= uniqid(mt_rand(),TRUE); +$seed .= implode( '', stat( __FILE__) ); + +// mt_srand() uses an integer to seed, so we need to distill our +// very large seed to something useful (without taking a sub-string, +// the integer conversion of such a large number is always 0 on +// many systems, but strangely, 9 hex numbers - even if larger +// than a signed 32 bit integer - seem to be an acceptable "integer" +// seed (perhaps it is used as unsigned?)... +// we may want to revisit this and always force it to be less than +// 2,147,483,647 +// +$seed = hexdec(substr(md5($seed), 0, 9)); + +// PHP 4.2 and up don't require seeding, but their used seed algorithm +// is of questionable quality, so we keep doing it ourselves. */ +mt_srand($seed); /** * calculate SM_PATH and calculate the base_uri @@ -154,6 +201,7 @@ require(SM_PATH . 'include/constants.php'); require(SM_PATH . 'functions/global.php'); require(SM_PATH . 'functions/strings.php'); require(SM_PATH . 'functions/arrays.php'); +require(SM_PATH . 'functions/files.php'); /* load default configuration */ require(SM_PATH . 'config/config_default.php'); @@ -187,6 +235,12 @@ if ($sm_debug_mode & SM_DEBUG_MODE_STRICT) error_reporting($error_level); +/** + * Detect SSL connections + */ +$is_secure_connection = is_ssl_secured_connection(); + + require(SM_PATH . 'functions/plugin.php'); require(SM_PATH . 'include/languages.php'); require(SM_PATH . 'class/template/Template.class.php'); @@ -229,12 +283,12 @@ if (!isset($session_name) || !$session_name) { * When session.auto_start is On we want to destroy/close the session */ $sSessionAutostartName = session_name(); -$sCookiePath = null; -if (isset($sSessionAutostartName) && $sSessionAutostartName !== $session_name) { +$sSessionAutostartID = session_id(); +if (!empty($sSessionAutostartID) && $sSessionAutostartName !== $session_name) { $sCookiePath = ini_get('session.cookie_path'); $sCookieDomain = ini_get('session.cookie_domain'); // reset the cookie - setcookie($sSessionAutostartName,'',time() - 604800,$sCookiePath,$sCookieDomain); + sqsetcookie($sSessionAutostartName,'',1,$sCookiePath,$sCookieDomain); @session_destroy(); session_write_close(); } @@ -340,7 +394,7 @@ require(SM_PATH . 'functions/prefs.php'); * the current user is NOT that user, turn them * back on */ -sqgetGlobalVar('username',$username,SQ_SESSION); +sqgetGlobalVar('username', $username, SQ_SESSION); if ($disable_plugins && !empty($disable_plugins_user) && $username != $disable_plugins_user) { $disable_plugins = false; @@ -418,10 +472,24 @@ if (! sqgetGlobalVar('squirrelmail_language',$squirrelmail_language,SQ_COOKIE)) } +/** + * In some cases, buffering all output allows more complex functionality, + * especially for plugins that want to add headers on hooks that are beyond + * the point of output having been sent to the browser otherwise. + * + * Note that we don't turn this on any earlier since we want to allow plugins + * to turn it on themselves via a configuration override on the prefs_backend + * hook. + * + */ +if ($buffer_output) ob_start(!empty($buffered_output_handler) ? $buffered_output_handler : NULL); + + /** * Do something special for some pages. This is based on the PAGE_NAME constant * set at the top of every page. */ +$set_up_langage_after_template_setup = FALSE; switch (PAGE_NAME) { case 'style': @@ -471,7 +539,7 @@ switch (PAGE_NAME) { // reset template file cache // $sTemplateID = Template::get_default_template_set(); - Template::cache_template_file_hierarchy(TRUE); + Template::cache_template_file_hierarchy($sTemplateID, TRUE); /** * Make sure icon variables are setup for the login page. @@ -484,22 +552,6 @@ switch (PAGE_NAME) { */ $icon_theme_path = (!$use_icons || $icon_theme=='none') ? NULL : ($icon_theme == 'template' ? SM_PATH . Template::calculate_template_images_directory($sTemplateID) : $icon_theme); - /** - * cleanup old cookies with a cookie path the same as the standard php.ini - * cookie path. All previous SquirrelMail version used the standard php.ini - * cookie path for storing the session name. That behaviour changed. - */ - if ($sCookiePath !== SM_BASE_URI) { - /** - * do not delete the standard sessions with session.name is i.e. PHPSESSID - * because they probably belong to other php apps - */ - if (ini_get('session.name') !== $sSessionAutostartName) { - // This does not work. Sometimes the cookie with SQSESSID=deleted and path / - // is picked up in webmail.php => login will fail - //sqsetcookie(ini_get('session.name'),'',0,$sCookiePath); - } - } break; default: require(SM_PATH . 'functions/display_messages.php' ); @@ -547,9 +599,13 @@ switch (PAGE_NAME) { /* * $sTemplateID is not initialized when a user is not logged in, so we * will use the config file defaults here. If the neccesary variables - * are net set, force a default value. + * are not set, force a default value. */ - $sTemplateID = Template::get_default_template_set(); + if (PAGE_NAME == 'squirrelmail_rpc') { + $sTemplateID = Template::get_rpc_template_set(); + } else { + $sTemplateID = Template::get_default_template_set(); + } $oTemplate = Template::construct_template($sTemplateID); set_up_language($squirrelmail_language, true); @@ -580,7 +636,6 @@ switch (PAGE_NAME) { */ require(SM_PATH . 'include/load_prefs.php'); -// i do not understand the frames language cookie story /** * We'll need this to later have a noframes version * @@ -592,20 +647,8 @@ switch (PAGE_NAME) { if ($my_language != $squirrelmail_language) { sqsetcookie('squirrelmail_language', $my_language, time()+2592000, $base_uri); } -// /dont understand - /** - * Set up the language. - */ - $err=set_up_language(getPref($data_dir, $username, 'language')); - - // Japanese translation used without mbstring support - if ($err==2) { - $sError = "

Your administrator needs to have PHP installed with the multibyte string extension enabled (using configure option --enable-mbstring).

\n" - . "

This system has assumed that you accidently switched to Japanese and has reverted your language preference to English.

\n" - . "

Please refresh this page in order to continue using your webmail.

\n"; - error_box($sError); - } + $set_up_langage_after_template_setup = TRUE; $timeZone = getPref($data_dir, $username, 'timezone'); @@ -663,7 +706,11 @@ switch (PAGE_NAME) { * so we shouldn't change it here. */ if (!isset($sTemplateID)) { - $sTemplateID = Template::get_default_template_set(); + if (PAGE_NAME == 'squirrelmail_rpc') { + $sTemplateID = Template::get_rpc_template_set(); + } else { + $sTemplateID = Template::get_default_template_set(); + } $icon_theme_path = !$use_icons ? NULL : Template::calculate_template_images_directory($sTemplateID); } @@ -689,11 +736,34 @@ foreach ($always_include as $var) { $nbsp = $oTemplate->fetch('non_breaking_space.tpl'); $br = $oTemplate->fetch('line_break.tpl'); + +/** + * Set up the language. + * + * This code block corresponds to the *default* block of the switch + * statement above, but the language cannot be set up until after the + * template is instantiated, so we set $set_up_langage_after_template_setup + * above and do the linguistic stuff now. + */ +if ($set_up_langage_after_template_setup) { + $err=set_up_language(getPref($data_dir, $username, 'language')); + + // Japanese translation used without mbstring support + if ($err==2) { + $sError = "

Your administrator needs to have PHP installed with the multibyte string extension enabled (using configure option --enable-mbstring).

\n" + . "

This system has assumed that you accidently switched to Japanese and has reverted your language preference to English.

\n" + . "

Please refresh this page in order to continue using your webmail.

\n"; + error_box($sError); + } +} + + /** * Initialize our custom error handler object */ $oErrorHandler = new ErrorHandler($oTemplate,'error_message.tpl'); + /** * Activate custom error handling */