Add global variable indicating server OS
[squirrelmail.git] / include / init.php
CommitLineData
202bcbcc 1<?php
2
3/**
4 * init.php -- initialisation file
5 *
6 * File should be loaded in every file in src/ or plugins that occupate an entire frame
7 *
8 * @copyright &copy; 2006 The SquirrelMail Project Team
9 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
10 * @version $Id$
11 * @package squirrelmail
12 */
13
202bcbcc 14/**
15 * This is a development version so in order to track programmer mistakes we
16 * set the error reporting to E_ALL
1888b1bf 17FIXME: disabling this for now, because we now have $sm_debug_mode, but the problem with that is that we don't know what it will be until we have loaded the config file, a good 175 lines below after several important files have been included, etc. For now, we'll trust that developers have turned on E_ALL in php.ini anyway, but this can be uncommented if not.
202bcbcc 18 */
1888b1bf 19//error_reporting(E_ALL);
20
202bcbcc 21
c7ebdfcf 22/**
23 * Make sure we have a page name
24 *
25 */
26if ( !defined('PAGE_NAME') ) define('PAGE_NAME', NULL);
27
28
6a2a6e44 29/**
30 * If register_globals are on, unregister globals.
a3b99374 31 * Second test covers boolean set as string (php_value register_globals off).
6a2a6e44 32 */
55dd9abf 33if ((bool) ini_get('register_globals') &&
a3b99374 34 strtolower(ini_get('register_globals'))!='off') {
6a2a6e44 35 /**
55dd9abf 36 * Remove all globals that are not reserved by PHP
37 * 'value' and 'key' are used by foreach. Don't unset them inside foreach.
6a2a6e44 38 */
55dd9abf 39 foreach ($GLOBALS as $key => $value) {
40 switch($key) {
41 case 'HTTP_POST_VARS':
42 case '_POST':
43 case 'HTTP_GET_VARS':
44 case '_GET':
45 case 'HTTP_COOKIE_VARS':
46 case '_COOKIE':
47 case 'HTTP_SERVER_VARS':
48 case '_SERVER':
49 case 'HTTP_ENV_VARS':
50 case '_ENV':
51 case 'HTTP_POST_FILES':
52 case '_FILES':
53 case '_REQUEST':
54 case 'HTTP_SESSION_VARS':
55 case '_SESSION':
56 case 'GLOBALS':
57 case 'key':
58 case 'value':
59 break;
55dd9abf 60 default:
61 unset($GLOBALS[$key]);
62 }
6a2a6e44 63 }
55dd9abf 64 // Unset variables used in foreach
65 unset($GLOBALS['key']);
66 unset($GLOBALS['value']);
6a2a6e44 67}
68
d849b570 69/**
70 * Used as a dummy value, e.g., for passing as an empty
e39d00e9 71 * hook argument (where the value is passed by reference,
72 * and therefore NULL itself is not acceptable).
d849b570 73 */
086ad092 74global $null;
d849b570 75$null = NULL;
76
dbbd586e 77/**
78 * The global $server_os variable will be "windows" if
79 * we are working in a Windows environment or "*nix"
80 * otherwise.
81 */
82global $server_os;
83if (DIRECTORY_SEPARATOR == '\\') $server_os = 'windows'; else $server_os = '*nix';
84
71efd1ed 85/**
86 * [#1518885] session.use_cookies = off breaks SquirrelMail
87 *
086ad092 88 * When session cookies are not used, all http redirects, meta refreshes,
89 * src/download.php and javascript URLs are broken. Setting must be set
71efd1ed 90 * before session is started.
91 */
92if (!(bool)ini_get('session.use_cookies') ||
93 ini_get('session.use_cookies') == 'off') {
94 ini_set('session.use_cookies','1');
95}
6a2a6e44 96
79dd8c72 97/**
98 * Initialize seed of random number generator.
99 * We use a number of things to randomize input: current time in ms,
100 * info about the remote client, info about the current process, the
101 * randomness of uniqid and stat of the current file.
102 *
103 * We seed this here only once per init, not only to save cycles
104 * but also to make the result of mt_rand more random (it now also
105 * depends on the number of times mt_rand was called before in this
106 * execution.
107 */
108$seed = microtime() . $_SERVER['REMOTE_PORT'] . $_SERVER['REMOTE_ADDR'] . getmypid();
109
110if (function_exists('getrusage')) {
111 /* Avoid warnings with Win32 */
112 $dat = @getrusage();
113 if (isset($dat) && is_array($dat)) { $seed .= implode('', $dat); }
114}
115
116if(!empty($_SERVER['UNIQUE_ID'])) {
117 $seed .= $_SERVER['UNIQUE_ID'];
118}
119
120$seed .= uniqid(mt_rand(),TRUE);
121$seed .= implode( '', stat( __FILE__) );
122
123/** PHP 4.2 and up don't require seeding, but their used seed algorithm
124 * is of questionable quality, so we keep doing it ourselves. */
125mt_srand(hexdec(md5($seed)));
3f081dd0 126
202bcbcc 127/**
128 * calculate SM_PATH and calculate the base_uri
129 * assumptions made: init.php is only called from plugins or from the src dir.
130 * files in the plugin directory may not be part of a subdirectory called "src"
131 *
132 */
133if (isset($_SERVER['SCRIPT_NAME'])) {
3f081dd0 134 $a = explode('/', $_SERVER['SCRIPT_NAME']);
202bcbcc 135} elseif (isset($HTTP_SERVER_VARS['SCRIPT_NAME'])) {
3f081dd0 136 $a = explode('/', $HTTP_SERVER_VARS['SCRIPT_NAME']);
b0829edf 137} else {
3f081dd0 138 $error = 'Unable to detect script environment. Please test your PHP '
139 . 'settings and send your PHP core configuration, $_SERVER and '
140 . '$HTTP_SERVER_VARS contents to the SquirrelMail developers.';
b0829edf 141 die($error);
202bcbcc 142}
143$sSM_PATH = '';
3f081dd0 144for($i = count($a) -2; $i > -1; --$i) {
202bcbcc 145 $sSM_PATH .= '../';
146 if ($a[$i] === 'src' || $a[$i] === 'plugins') {
147 break;
148 }
149}
150
3f081dd0 151$base_uri = implode('/', array_slice($a, 0, $i)). '/';
202bcbcc 152
202bcbcc 153define('SM_PATH',$sSM_PATH);
6a2a6e44 154define('SM_BASE_URI', $base_uri);
3f081dd0 155
156
202bcbcc 157/**
158 * global var $bInit is used to check if initialisation took place.
159 * At this moment it's a workarounf for the include of addrbook_search_html
160 * inside compose.php. If we found a better way then remove this. Do only use
161 * this var if you know for sure a page can be called stand alone and be included
162 * in another file.
163 */
164$bInit = true;
165
8e1e2794 166/**
167 * This theme as a failsafe if no themes were found, or if we error
168 * out before anything could be initialised.
169 */
170$color = array();
171$color[0] = '#DCDCDC'; /* light gray TitleBar */
172$color[1] = '#800000'; /* red */
173$color[2] = '#CC0000'; /* light red Warning/Error Messages */
174$color[3] = '#A0B8C8'; /* green-blue Left Bar Background */
175$color[4] = '#FFFFFF'; /* white Normal Background */
176$color[5] = '#FFFFCC'; /* light yellow Table Headers */
177$color[6] = '#000000'; /* black Text on left bar */
178$color[7] = '#0000CC'; /* blue Links */
179$color[8] = '#000000'; /* black Normal text */
180$color[9] = '#ABABAB'; /* mid-gray Darker version of #0 */
181$color[10] = '#666666'; /* dark gray Darker version of #9 */
182$color[11] = '#770000'; /* dark red Special Folders color */
183$color[12] = '#EDEDED';
184$color[13] = '#800000'; /* (dark red) Color for quoted text -- > 1 quote */
185$color[14] = '#ff0000'; /* (red) Color for quoted text -- >> 2 or more */
186$color[15] = '#002266'; /* (dark blue) Unselectable folders */
187$color[16] = '#ff9933'; /* (orange) Highlight color */
188
1888b1bf 189require(SM_PATH . 'include/constants.php');
202bcbcc 190require(SM_PATH . 'functions/global.php');
4ffcf13a 191require(SM_PATH . 'functions/strings.php');
918fcc1d 192require(SM_PATH . 'functions/arrays.php');
5e68a08e 193
194/* load default configuration */
195require(SM_PATH . 'config/config_default.php');
196/* reset arrays in default configuration */
197$ldap_server = array();
198$plugins = array();
199$fontsets = array();
5e68a08e 200$aTemplateSet = array();
28294310 201$aTemplateSet[0]['ID'] = 'default';
202$aTemplateSet[0]['NAME'] = 'Default';
01fd1d1a 203
5e68a08e 204/* load site configuration */
202bcbcc 205require(SM_PATH . 'config/config.php');
5e68a08e 206/* load local configuration overrides */
207if (file_exists(SM_PATH . 'config/config_local.php')) {
208 require(SM_PATH . 'config/config_local.php');
209}
210
1888b1bf 211
212/**
213 * Set PHP error reporting level based on the SquirrelMail debug mode
214 */
215$error_level = 0;
216if ($sm_debug_mode & SM_DEBUG_MODE_SIMPLE)
217 $error_level |= E_ERROR;
218if ($sm_debug_mode & SM_DEBUG_MODE_MODERATE
219 || $sm_debug_mode & SM_DEBUG_MODE_ADVANCED)
220 $error_level |= E_ALL;
221if ($sm_debug_mode & SM_DEBUG_MODE_STRICT)
222 $error_level |= E_STRICT;
223error_reporting($error_level);
224
225
202bcbcc 226require(SM_PATH . 'functions/plugin.php');
202bcbcc 227require(SM_PATH . 'include/languages.php');
42b5e8aa 228require(SM_PATH . 'class/template/Template.class.php');
5ab684a5 229require(SM_PATH . 'class/error.class.php');
202bcbcc 230
231/**
232 * If magic_quotes_runtime is on, SquirrelMail breaks in new and creative ways.
233 * Force magic_quotes_runtime off.
234 * tassium@squirrelmail.org - I put it here in the hopes that all SM code includes this.
235 * If there's a better place, please let me know.
236 */
237ini_set('magic_quotes_runtime','0');
238
239
240/* if running with magic_quotes_gpc then strip the slashes
241 from POST and GET global arrays */
430a19f3 242if (function_exists('get_magic_quotes_gpc') && @get_magic_quotes_gpc()) {
202bcbcc 243 sqstripslashes($_GET);
244 sqstripslashes($_POST);
245}
246
202bcbcc 247
248/* strip any tags added to the url from PHP_SELF.
249This fixes hand crafted url XXS expoits for any
250 page that uses PHP_SELF as the FORM action */
251$_SERVER['PHP_SELF'] = strip_tags($_SERVER['PHP_SELF']);
252
253$PHP_SELF = php_self();
254
255/**
256 * Initialize the session
257 */
258
e8c4e350 259/** set the name of the session cookie */
260if (!isset($session_name) || !$session_name) {
261 $session_name = 'SQMSESSID';
262}
263
264/**
319ad3c0 265 * When session.auto_start is On we want to destroy/close the session
1d537493 266 */
267$sSessionAutostartName = session_name();
ccb5faf0 268$sSessionAutostartID = session_id();
269if (!empty($sSessionAutostartID) && $sSessionAutostartName !== $session_name) {
1d537493 270 $sCookiePath = ini_get('session.cookie_path');
271 $sCookieDomain = ini_get('session.cookie_domain');
e8c4e350 272 // reset the cookie
ccb5faf0 273 sqsetcookie($sSessionAutostartName,'',1,$sCookiePath,$sCookieDomain);
e8c4e350 274 @session_destroy();
275 session_write_close();
1d537493 276}
e8c4e350 277
202bcbcc 278/**
279 * includes from classes stored in the session
280 */
281require(SM_PATH . 'class/mime.class.php');
282
202bcbcc 283ini_set('session.name' , $session_name);
284session_set_cookie_params (0, $base_uri);
285sqsession_is_active();
286
319ad3c0 287/**
288 * When on login page, have to reset the user session, making
289 * sure to save session restore data first
290 */
291if (PAGE_NAME == 'login') {
292 if (!sqGetGlobalVar('session_expired_post', $sep, SQ_SESSION))
293 $sep = '';
294 if (!sqGetGlobalVar('session_expired_location', $sel, SQ_SESSION))
295 $sel = '';
296 sqsession_destroy();
297 session_write_close();
298
299 /**
300 * in some rare instances, the session seems to stick
301 * around even after destroying it (!!), so if it does,
302 * we'll manually flatten the $_SESSION data
303 */
304 if (!empty($_SESSION))
305 $_SESSION = array();
306
bc3acc5a 307 /**
308 * Allow administrators to define custom session handlers
309 * for SquirrelMail without needing to change anything in
310 * php.ini (application-level).
311 *
312 * In config_local.php, admin needs to put:
313 *
314 * $custom_session_handlers = array(
315 * 'my_open_handler',
316 * 'my_close_handler',
317 * 'my_read_handler',
318 * 'my_write_handler',
319 * 'my_destroy_handler',
320 * 'my_gc_handler',
321 * );
322 * session_module_name('user');
323 * session_set_save_handler(
324 * $custom_session_handlers[0],
325 * $custom_session_handlers[1],
326 * $custom_session_handlers[2],
327 * $custom_session_handlers[3],
328 * $custom_session_handlers[4],
329 * $custom_session_handlers[5]
330 * );
331 *
332 * We need to replicate that code once here because PHP has
333 * long had a bug that resets the session handler mechanism
334 * when the session data is also destroyed. Because of this
335 * bug, even administrators who define custom session handlers
336 * via a PHP pre-load defined in php.ini (auto_prepend_file)
337 * will still need to define the $custom_session_handlers array
338 * in config_local.php.
339 */
340 global $custom_session_handlers;
341 if (!empty($custom_session_handlers)) {
342 $open = $custom_session_handlers[0];
343 $close = $custom_session_handlers[1];
344 $read = $custom_session_handlers[2];
345 $write = $custom_session_handlers[3];
346 $destroy = $custom_session_handlers[4];
347 $gc = $custom_session_handlers[5];
348 session_module_name('user');
349 session_set_save_handler($open, $close, $read, $write, $destroy, $gc);
350 }
351
319ad3c0 352 sqsession_is_active();
353 session_regenerate_id();
ef33def6 354
355 // put session restore data back into session if necessary
356 if (!empty($sel)) {
357 sqsession_register($sel, 'session_expired_location');
358 if (!empty($sep))
359 sqsession_register($sep, 'session_expired_post');
360 }
319ad3c0 361}
362
5aed95be 363/**
364 * SquirrelMail internal version number -- DO NOT CHANGE
365 * $sm_internal_version = array (release, major, minor)
366 */
a895042a 367$SQM_INTERNAL_VERSION = explode('.', SM_VERSION, 3);
b37e457f 368$SQM_INTERNAL_VERSION[2] = intval($SQM_INTERNAL_VERSION[2]);
5aed95be 369
93d67e0d 370
6d5775db 371/* load prefs system; even when user not logged in, should be OK to do this here */
372require(SM_PATH . 'functions/prefs.php');
373
6d5775db 374
086ad092 375/* if plugins are disabled only for one user and
93d67e0d 376 * the current user is NOT that user, turn them
377 * back on
378 */
0d56053e 379sqgetGlobalVar('username', $username, SQ_SESSION);
93d67e0d 380if ($disable_plugins && !empty($disable_plugins_user)
381 && $username != $disable_plugins_user) {
382 $disable_plugins = false;
383}
384
4a9f6063 385
93d67e0d 386/* remove all plugins if they are disabled */
387if ($disable_plugins) {
388 $plugins = array();
389}
390
391
5aed95be 392/**
393 * Include Compatibility plugin if available.
394 */
93d67e0d 395if (!$disable_plugins && file_exists(SM_PATH . 'plugins/compatibility/functions.php'))
5aed95be 396 include_once(SM_PATH . 'plugins/compatibility/functions.php');
397
4a9f6063 398
5aed95be 399/**
400 * MAIN PLUGIN LOADING CODE HERE
086ad092 401 * On init, we no longer need to load all plugin setup files.
5aed95be 402 * Now, we load the statically generated hook registrations here
403 * and let the hook calls include only the plugins needed.
404 */
405$squirrelmail_plugin_hooks = array();
93d67e0d 406if (!$disable_plugins && file_exists(SM_PATH . 'config/plugin_hooks.php')) {
4a9f6063 407//FIXME: if we keep the plugin hooks array static like this, it seems like we should also keep the template files list in a static file too (when a new user session is started or the template set is changed, the code will dynamically iterate through the directory heirarchy of the template directory and catalog all the template files therein (and store the "catalog" in PHP session) -- instead, we could do that once at config-time and keep that static so SM can just include the file just like the line below)
5aed95be 408 require(SM_PATH . 'config/plugin_hooks.php');
409}
410
4a9f6063 411
5aed95be 412/**
4a9f6063 413 * Plugin authors note that the "config_override" hook used to be
414 * executed here, but please adapt your plugin to use this "prefs_backend"
415 * hook instead, making sure that it does NOT return anything, since
416 * doing so will interfere with proper prefs system functionality.
417 * Of course, otherwise, this hook may be used to do any configuration
418 * overrides as needed, as well as set up a custom preferences backend.
5aed95be 419 */
4a9f6063 420$prefs_backend = do_hook('prefs_backend', $null);
421if (isset($prefs_backend) && !empty($prefs_backend) && file_exists(SM_PATH . $prefs_backend)) {
422 require(SM_PATH . $prefs_backend);
423} elseif (isset($prefs_dsn) && !empty($prefs_dsn)) {
424 require(SM_PATH . 'functions/db_prefs.php');
425} else {
426 require(SM_PATH . 'functions/file_prefs.php');
427}
428
429
5aed95be 430
202bcbcc 431/**
3464e1f4 432 * DISABLED.
202bcbcc 433 * Remove globalized session data in rg=on setups
086ad092 434 *
3464e1f4 435 * Code can be utilized when session is started, but data is not loaded.
086ad092 436 * We have already loaded configuration and other important vars. Can't
aae60854 437 * clean session globals here, beside, the cleanout of globals at the
438 * top of this file will have removed anything this code would find anyway.
3464e1f4 439if ((bool) @ini_get('register_globals') &&
440 strtolower(ini_get('register_globals'))!='off') {
202bcbcc 441 foreach ($_SESSION as $key => $value) {
442 unset($GLOBALS[$key]);
443 }
444}
3464e1f4 445*/
6a2a6e44 446
826ddd72 447sqsession_register(SM_BASE_URI,'base_uri');
6a2a6e44 448
202bcbcc 449/**
450 * Retrieve the language cookie
451 */
452if (! sqgetGlobalVar('squirrelmail_language',$squirrelmail_language,SQ_COOKIE)) {
453 $squirrelmail_language = '';
454}
455
bf3abdc3 456
775a1f52 457/**
458 * In some cases, buffering all output allows more complex functionality,
459 * especially for plugins that want to add headers on hooks that are beyond
460 * the point of output having been sent to the browser otherwise.
461 *
462 * Note that we don't turn this on any earlier since we want to allow plugins
463 * to turn it on themselves via a configuration override on the prefs_backend
464 * hook.
465 *
466 */
467if ($buffer_output) ob_start(!empty($buffered_output_handler) ? $buffered_output_handler : NULL);
468
469
202bcbcc 470/**
f0d28f44 471 * Do something special for some pages. This is based on the PAGE_NAME constant
9e06a3ea 472 * set at the top of every page.
202bcbcc 473 */
0d56053e 474$set_up_langage_after_template_setup = FALSE;
9e06a3ea 475switch (PAGE_NAME) {
086ad092 476 case 'style':
c4e5f61f 477
2b26084f 478 // need to get the right template set up
28294310 479 //
480 sqGetGlobalVar('templateid', $templateid, SQ_GET);
c4e5f61f 481
2b26084f 482 // sanitize just in case...
28294310 483 //
484 $templateid = preg_replace('/(\.\.\/){1,}/', '', $templateid);
485
486 // make sure given template actually is available
487 //
28294310 488 $found_templateset = false;
489 for ($i = 0; $i < count($aTemplateSet); ++$i) {
490 if ($aTemplateSet[$i]['ID'] == $templateid) {
491 $found_templateset = true;
492 break;
493 }
494 }
c4e5f61f 495
be155e14 496// FIXME: do we need/want to check here for actual (physical) presence of template sets?
28294310 497 // selected template not available, fall back to default template
498 //
499 if (!$found_templateset) {
42b5e8aa 500 $sTemplateID = Template::get_default_template_set();
28294310 501 } else {
502 $sTemplateID = $templateid;
c4e5f61f 503 }
504
2b26084f 505 session_write_close();
c4e5f61f 506 break;
507
f0d28f44 508 case 'mailto':
509 // nothing to do
510 break;
511
202bcbcc 512 case 'redirect':
2e616fa4 513 require(SM_PATH . 'functions/auth.php');
202bcbcc 514 //nobreak;
bf3abdc3 515
202bcbcc 516 case 'login':
517 require(SM_PATH . 'functions/display_messages.php' );
518 require(SM_PATH . 'functions/page_header.php');
519 require(SM_PATH . 'functions/html.php');
42b5e8aa 520
521 // reset template file cache
522 //
523 $sTemplateID = Template::get_default_template_set();
d81572f7 524 Template::cache_template_file_hierarchy($sTemplateID, TRUE);
42b5e8aa 525
01fd1d1a 526 /**
527 * Make sure icon variables are setup for the login page.
528 */
529 $icon_theme = $icon_themes[$icon_theme_def]['PATH'];
530 /*
531 * NOTE: The $icon_theme_path var should contain the path to the icon
532 * theme to use. If the admin has disabled icons, or the user has
533 * set the icon theme to "None," no icons will be used.
534 */
535 $icon_theme_path = (!$use_icons || $icon_theme=='none') ? NULL : ($icon_theme == 'template' ? SM_PATH . Template::calculate_template_images_directory($sTemplateID) : $icon_theme);
536
202bcbcc 537 break;
538 default:
539 require(SM_PATH . 'functions/display_messages.php' );
540 require(SM_PATH . 'functions/page_header.php');
541 require(SM_PATH . 'functions/html.php');
202bcbcc 542
543
544 /**
545 * Check if we are logged in
546 */
547 require(SM_PATH . 'functions/auth.php');
548
549 if ( !sqsession_is_registered('user_is_logged_in') ) {
f8eb968d 550
551 // use $message to indicate what logout text the user
552 // will see... if 0, typical "You must be logged in"
553 // if 1, information that the user session was saved
554 // and will be resumed after (re)login
555 //
556 $message = 0;
557
202bcbcc 558 // First we store some information in the new session to prevent
559 // information-loss.
560 //
561 $session_expired_post = $_POST;
f8e68605 562 $session_expired_location = PAGE_NAME;
202bcbcc 563 if (!sqsession_is_registered('session_expired_post')) {
564 sqsession_register($session_expired_post,'session_expired_post');
565 }
566 if (!sqsession_is_registered('session_expired_location')) {
567 sqsession_register($session_expired_location,'session_expired_location');
f8e68605 568 if ($session_expired_location == 'compose')
f8eb968d 569 $message = 1;
202bcbcc 570 }
571 // signout page will deal with users who aren't logged
572 // in on its own; don't show error here
573 //
9e06a3ea 574 if ( PAGE_NAME == 'signout' ) {
a140422a 575 return;
202bcbcc 576 }
577
8efadc6b 578 /**
579 * Initialize the template object (logout_error uses it)
580 */
8efadc6b 581 /*
086ad092 582 * $sTemplateID is not initialized when a user is not logged in, so we
583 * will use the config file defaults here. If the neccesary variables
d81572f7 584 * are not set, force a default value.
8efadc6b 585 */
d81572f7 586 if (PAGE_NAME == 'squirrelmail_rpc') {
587 $sTemplateID = Template::get_rpc_template_set();
588 } else {
589 $sTemplateID = Template::get_default_template_set();
590 }
28294310 591 $oTemplate = Template::construct_template($sTemplateID);
8efadc6b 592
202bcbcc 593 set_up_language($squirrelmail_language, true);
f8eb968d 594 if (!$message)
595 logout_error( _("You must be logged in to access this page.") );
596 else
597 logout_error( _("Your session has expired, but will be resumed after logging in again.") );
202bcbcc 598 exit;
599 }
600
79524620 601 sqgetGlobalVar('authz',$authz,SQ_SESSION);
202bcbcc 602
603 /**
604 * Setting the prefs backend
605 */
606 sqgetGlobalVar('prefs_cache', $prefs_cache, SQ_SESSION );
607 sqgetGlobalVar('prefs_are_cached', $prefs_are_cached, SQ_SESSION );
608
609 if ( !sqsession_is_registered('prefs_are_cached') ||
610 !isset( $prefs_cache) ||
611 !is_array( $prefs_cache)) {
612 $prefs_are_cached = false;
613 $prefs_cache = false; //array();
614 }
615
202bcbcc 616 /**
617 * initializing user settings
618 */
619 require(SM_PATH . 'include/load_prefs.php');
620
202bcbcc 621 /**
622 * We'll need this to later have a noframes version
623 *
624 * Check if the user has a language preference, but no cookie.
625 * Send him a cookie with his language preference, if there is
626 * such discrepancy.
627 */
628 $my_language = getPref($data_dir, $username, 'language');
629 if ($my_language != $squirrelmail_language) {
630 sqsetcookie('squirrelmail_language', $my_language, time()+2592000, $base_uri);
631 }
202bcbcc 632
0d56053e 633 $set_up_langage_after_template_setup = TRUE;
202bcbcc 634
635 $timeZone = getPref($data_dir, $username, 'timezone');
636
637 /* Check to see if we are allowed to set the TZ environment variable.
638 * We are able to do this if ...
639 * safe_mode is disabled OR
640 * safe_mode_allowed_env_vars is empty (you are allowed to set any) OR
641 * safe_mode_allowed_env_vars contains TZ
642 */
643 $tzChangeAllowed = (!ini_get('safe_mode')) ||
644 !strcmp(ini_get('safe_mode_allowed_env_vars'),'') ||
645 preg_match('/^([\w_]+,)*TZ/', ini_get('safe_mode_allowed_env_vars'));
646
647 if ( $timeZone != SMPREF_NONE && ($timeZone != "")
648 && $tzChangeAllowed ) {
649
650 // get time zone key, if strict or custom strict timezones are used
651 if (isset($time_zone_type) &&
652 ($time_zone_type == 1 || $time_zone_type == 3)) {
653 /* load time zone functions */
654 require(SM_PATH . 'include/timezones.php');
655 $realTimeZone = sq_get_tz_key($timeZone);
656 } else {
657 $realTimeZone = $timeZone;
658 }
659
660 // set time zone
661 if ($realTimeZone) {
662 putenv("TZ=".$realTimeZone);
663 }
664 }
867fed37 665
666 /**
667 * php 5.1.0 added time zone functions. Set time zone with them in order
668 * to prevent E_STRICT notices and allow time zone modifications in safe_mode.
669 */
670 if (function_exists('date_default_timezone_set')) {
671 if ($timeZone != SMPREF_NONE && $timeZone != "") {
672 date_default_timezone_set($timeZone);
673 } else {
674 // interface runs on server's time zone. Remove php E_STRICT complains
675 $default_timezone = @date_default_timezone_get();
086ad092 676 date_default_timezone_set($default_timezone);
867fed37 677 }
678 }
202bcbcc 679 break;
680}
681
202bcbcc 682/*
086ad092 683 * $sTemplateID is not initialized when a user is not logged in, so we
684 * will use the config file defaults here. If the neccesary variables
28294310 685 * are not set, force a default value.
086ad092 686 *
687 * If the user is logged in, $sTemplateID will be set in load_prefs.php,
28294310 688 * so we shouldn't change it here.
202bcbcc 689 */
28294310 690if (!isset($sTemplateID)) {
d81572f7 691 if (PAGE_NAME == 'squirrelmail_rpc') {
692 $sTemplateID = Template::get_rpc_template_set();
693 } else {
694 $sTemplateID = Template::get_default_template_set();
695 }
28294310 696 $icon_theme_path = !$use_icons ? NULL : Template::calculate_template_images_directory($sTemplateID);
3aa46abc 697}
be155e14 698
699// template object may have already been constructed in load_prefs.php
700//
701if (empty($oTemplate)) {
702 $oTemplate = Template::construct_template($sTemplateID);
703}
202bcbcc 704
7aae649d 705// We want some variables to always be available to the template
551c7b53 706//
e39d00e9 707$oTemplate->assign('javascript_on',
708 (sqGetGlobalVar('user_is_logged_in', $user_is_logged_in, SQ_SESSION)
709 ? checkForJavascript() : 0));
fe8103c2 710$oTemplate->assign('base_uri', sqm_baseuri());
457e8593 711$always_include = array('sTemplateID', 'icon_theme_path');
7aae649d 712foreach ($always_include as $var) {
713 $oTemplate->assign($var, (isset($$var) ? $$var : NULL));
714}
715
551c7b53 716// A few output elements are used often, so just get them once here
717//
718$nbsp = $oTemplate->fetch('non_breaking_space.tpl');
719$br = $oTemplate->fetch('line_break.tpl');
720
0d56053e 721
722/**
723 * Set up the language.
724 *
725 * This code block corresponds to the *default* block of the switch
726 * statement above, but the language cannot be set up until after the
727 * template is instantiated, so we set $set_up_langage_after_template_setup
728 * above and do the linguistic stuff now.
729 */
730if ($set_up_langage_after_template_setup) {
731 $err=set_up_language(getPref($data_dir, $username, 'language'));
732
733 // Japanese translation used without mbstring support
734 if ($err==2) {
735 $sError = "<p>Your administrator needs to have PHP installed with the multibyte string extension enabled (using configure option --enable-mbstring).</p>\n"
736 . "<p>This system has assumed that you accidently switched to Japanese and has reverted your language preference to English.</p>\n"
737 . "<p>Please refresh this page in order to continue using your webmail.</p>\n";
738 error_box($sError);
739 }
740}
741
742
202bcbcc 743/**
744 * Initialize our custom error handler object
745 */
202bcbcc 746$oErrorHandler = new ErrorHandler($oTemplate,'error_message.tpl');
747
0d56053e 748
202bcbcc 749/**
750 * Activate custom error handling
751 */
752if (version_compare(PHP_VERSION, "4.3.0", ">=")) {
753 $oldErrorHandler = set_error_handler(array($oErrorHandler, 'SquirrelMailErrorhandler'));
754} else {
755 $oldErrorHandler = set_error_handler('SquirrelMailErrorhandler');
756}
757
f0d28f44 758
759// ============================================================================
760// ================= End of Live Code, Beginning of Functions =================
761// ============================================================================
762
763
202bcbcc 764/**
765 * Javascript support detection function
766 * @param boolean $reset recheck javascript support if set to true.
867fed37 767 * @return integer SMPREF_JS_ON or SMPREF_JS_OFF ({@see include/constants.php})
202bcbcc 768 * @since 1.5.1
769 */
202bcbcc 770function checkForJavascript($reset = FALSE) {
771 global $data_dir, $username, $javascript_on, $javascript_setting;
772
773 if ( !$reset && sqGetGlobalVar('javascript_on', $javascript_on, SQ_SESSION) )
774 return $javascript_on;
775
e39d00e9 776 $user_is_logged_in = FALSE;
bf3abdc3 777 if ( $reset || !isset($javascript_setting) )
202bcbcc 778 $javascript_setting = getPref($data_dir, $username, 'javascript_setting', SMPREF_JS_AUTODETECT);
779
780 if ( !sqGetGlobalVar('new_js_autodetect_results', $js_autodetect_results) &&
781 !sqGetGlobalVar('js_autodetect_results', $js_autodetect_results) )
782 $js_autodetect_results = SMPREF_JS_OFF;
783
784 if ( $javascript_setting == SMPREF_JS_AUTODETECT )
785 $javascript_on = $js_autodetect_results;
786 else
787 $javascript_on = $javascript_setting;
788
789 sqsession_register($javascript_on, 'javascript_on');
790 return $javascript_on;
791}
792
793function sqm_baseuri() {
794 global $base_uri;
795 return $base_uri;
8e1e2794 796}