Source for file init.php

Documentation is available at init.php

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

Documentation generated on Mon, 13 Jan 2020 04:22:50 +0100 by phpDocumentor 1.4.3