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 &copy; 2006 The SquirrelMail Project Team
  9.  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  10.  * @version $Id: init.php,v 1.28 2006/10/05 21:59:04 stevetruckstuff Exp $
  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.  */
  18.  
  19.  
  20. /**
  21.  * If register_globals are on, unregister globals.
  22.  * Second test covers boolean set as string (php_value register_globals off).
  23.  */
  24. if ((bool) ini_get('register_globals'&&
  25.     strtolower(ini_get('register_globals'))!='off'{
  26.     /**
  27.      * Remove all globals that are not reserved by PHP
  28.      * 'value' and 'key' are used by foreach. Don't unset them inside foreach.
  29.      */
  30.     foreach ($GLOBALS as $key => $value{
  31.         switch($key{
  32.         case 'HTTP_POST_VARS':
  33.         case '_POST':
  34.         case 'HTTP_GET_VARS':
  35.         case '_GET':
  36.         case 'HTTP_COOKIE_VARS':
  37.         case '_COOKIE':
  38.         case 'HTTP_SERVER_VARS':
  39.         case '_SERVER':
  40.         case 'HTTP_ENV_VARS':
  41.         case '_ENV':
  42.         case 'HTTP_POST_FILES':
  43.         case '_FILES':
  44.         case '_REQUEST':
  45.         case 'HTTP_SESSION_VARS':
  46.         case '_SESSION':
  47.         case 'GLOBALS':
  48.         case 'key':
  49.         case 'value':
  50.             break;
  51.         case 'sInitLocation':
  52.             // FIXME: variable must be set only in src/login.php
  53.                         break;
  54.         default:
  55.             unset($GLOBALS[$key]);
  56.         }
  57.     }
  58.     // Unset variables used in foreach
  59.         unset($GLOBALS['key']);
  60.     unset($GLOBALS['value']);
  61. }
  62.  
  63. /**
  64.  * [#1518885] session.use_cookies = off breaks SquirrelMail
  65.  *
  66.  * When session cookies are not used, all http redirects, meta refreshes,
  67.  * src/download.php and javascript URLs are broken. Setting must be set
  68.  * before session is started.
  69.  */
  70. if (!(bool)ini_get('session.use_cookies'||
  71.     ini_get('session.use_cookies'== 'off'{
  72.     ini_set('session.use_cookies','1');
  73. }
  74.  
  75. /**
  76.  * calculate SM_PATH and calculate the base_uri
  77.  * assumptions made: init.php is only called from plugins or from the src dir.
  78.  * files in the plugin directory may not be part of a subdirectory called "src"
  79.  *
  80.  */
  81. if (isset($_SERVER['SCRIPT_NAME'])) {
  82.     $a explode('/',$_SERVER['SCRIPT_NAME']);
  83. elseif (isset($HTTP_SERVER_VARS['SCRIPT_NAME'])) {
  84.     $a explode('/',$HTTP_SERVER_VARS['SCRIPT_NAME']);
  85. else {
  86.     $error 'Unable to detect script environment. '
  87.     .'Please test your PHP settings and send PHP core config, $_SERVER '
  88.     .'and $HTTP_SERVER_VARS to SquirrelMail developers.';
  89.     die($error);
  90. }
  91. $sSM_PATH '';
  92. for($i count($a-2;$i > -1--$i{
  93.     $sSM_PATH .= '../';
  94.     if ($a[$i=== 'src' || $a[$i=== 'plugins'{
  95.         break;
  96.     }
  97. }
  98.  
  99. $base_uri implode('/',array_slice($a,0,$i))'/';
  100.  
  101. define('SM_PATH',$sSM_PATH);
  102. define('SM_BASE_URI'$base_uri);
  103. /**
  104.  * global var $bInit is used to check if initialisation took place.
  105.  * At this moment it's a workarounf for the include of addrbook_search_html
  106.  * inside compose.php. If we found a better way then remove this. Do only use
  107.  * this var if you know for sure a page can be called stand alone and be included
  108.  * in another file.
  109.  */
  110. $bInit true;
  111.  
  112. /**
  113.  * This theme as a failsafe if no themes were found, or if we error
  114.  * out before anything could be initialised.
  115.  */
  116. $color array();
  117. $color[0]  '#DCDCDC';  /* light gray    TitleBar               */
  118. $color[1]  '#800000';  /* red                                  */
  119. $color[2]  '#CC0000';  /* light red     Warning/Error Messages */
  120. $color[3]  '#A0B8C8';  /* green-blue    Left Bar Background    */
  121. $color[4]  '#FFFFFF';  /* white         Normal Background      */
  122. $color[5]  '#FFFFCC';  /* light yellow  Table Headers          */
  123. $color[6]  '#000000';  /* black         Text on left bar       */
  124. $color[7]  '#0000CC';  /* blue          Links                  */
  125. $color[8]  '#000000';  /* black         Normal text            */
  126. $color[9]  '#ABABAB';  /* mid-gray      Darker version of #0   */
  127. $color[10'#666666';  /* dark gray     Darker version of #9   */
  128. $color[11'#770000';  /* dark red      Special Folders color  */
  129. $color[12'#EDEDED';
  130. $color[13'#800000';  /* (dark red)    Color for quoted text -- > 1 quote */
  131. $color[14'#ff0000';  /* (red)         Color for quoted text -- >> 2 or more */
  132. $color[15'#002266';  /* (dark blue)   Unselectable folders */
  133. $color[16'#ff9933';  /* (orange)      Highlight color */
  134.  
  135. require(SM_PATH 'functions/global.php');
  136. require(SM_PATH 'functions/arrays.php');
  137.  
  138. /* load default configuration */
  139. require(SM_PATH 'config/config_default.php');
  140. /* reset arrays in default configuration */
  141. $ldap_server array();
  142. $plugins array();
  143. $fontsets array();
  144. $theme array();
  145. $theme[0]['PATH'SM_PATH 'themes/default_theme.php';
  146. $theme[0]['NAME''Default';
  147. $aTemplateSet array();
  148. $aTemplateSet[0]['ID''default';
  149. $aTemplateSet[0]['NAME''Default';
  150. /* load site configuration */
  151. require(SM_PATH 'config/config.php');
  152. /* load local configuration overrides */
  153. if (file_exists(SM_PATH 'config/config_local.php')) {
  154.     require(SM_PATH 'config/config_local.php');
  155. }
  156.  
  157. require(SM_PATH 'functions/plugin.php');
  158. require(SM_PATH 'include/constants.php');
  159. require(SM_PATH 'include/languages.php');
  160. require(SM_PATH 'class/template/Template.class.php');
  161.  
  162. /**
  163.  * If magic_quotes_runtime is on, SquirrelMail breaks in new and creative ways.
  164.  * Force magic_quotes_runtime off.
  165.  * [email protected] - I put it here in the hopes that all SM code includes this.
  166.  * If there's a better place, please let me know.
  167.  */
  168. ini_set('magic_quotes_runtime','0');
  169.  
  170.  
  171. /* if running with magic_quotes_gpc then strip the slashes
  172.    from POST and GET global arrays */
  173.     sqstripslashes($_GET);
  174.     sqstripslashes($_POST);
  175. }
  176.  
  177.  
  178. /* strip any tags added to the url from PHP_SELF.
  179. This fixes hand crafted url XXS expoits for any
  180.    page that uses PHP_SELF as the FORM action */
  181. $_SERVER['PHP_SELF'strip_tags($_SERVER['PHP_SELF']);
  182.  
  183. $PHP_SELF php_self();
  184.  
  185. /**
  186.  * Initialize the session
  187.  */
  188.  
  189. /** set the name of the session cookie */
  190. if (!isset($session_name|| !$session_name{
  191.     $session_name 'SQMSESSID';
  192. }
  193.  
  194. /**
  195.  * if session.auto_start is On then close the session
  196.  */
  197. $sSessionAutostartName session_name();
  198. if ((isset($sSessionAutostartName|| $sSessionAutostartName == ''&&
  199.      $sSessionAutostartName !== $session_name{
  200.     $sCookiePath ini_get('session.cookie_path');
  201.     $sCookieDomain ini_get('session.cookie_domain');
  202.     // reset the cookie
  203.         setcookie($sSessionAutostartName,'',time(604800,$sCookiePath,$sCookieDomain);
  204.     @session_destroy();
  205. }
  206.  
  207. /**
  208.  * includes from classes stored in the session
  209.  */
  210. require(SM_PATH 'class/mime.class.php');
  211.  
  212. ini_set('session.name' $session_name);
  213. session_set_cookie_params (0$base_uri);
  214.  
  215. /**
  216.  * DISABLED.
  217.  * Remove globalized session data in rg=on setups
  218.  * 
  219.  * Code can be utilized when session is started, but data is not loaded.
  220.  * We have already loaded configuration and other important vars. Can't
  221.  * clean session globals here.
  222. if ((bool) @ini_get('register_globals') &&
  223.     strtolower(ini_get('register_globals'))!='off') {
  224.     foreach ($_SESSION as $key => $value) {
  225.         unset($GLOBALS[$key]);
  226.     }
  227. }
  228. */
  229.  
  230.  
  231. /**
  232.  * SquirrelMail version number -- DO NOT CHANGE
  233.  */
  234. $version '1.5.2 [CVS]';
  235.  
  236. /**
  237.  * SquirrelMail internal version number -- DO NOT CHANGE
  238.  * $sm_internal_version = array (release, major, minor)
  239.  */
  240. $SQM_INTERNAL_VERSION array(1,5,2);
  241.  
  242. /**
  243.  * Retrieve the language cookie
  244.  */
  245. if (sqgetGlobalVar('squirrelmail_language',$squirrelmail_language,SQ_COOKIE)) {
  246.     $squirrelmail_language '';
  247. }
  248.  
  249.  
  250. /**
  251.  * @var $sInitlocation From where do we include.
  252.  */
  253. if (!isset($sInitLocation)) {
  254.     $sInitLocation=NULL;
  255. }
  256.  
  257. /**
  258.  * MAIN PLUGIN LOADING CODE HERE
  259.  */
  260.  
  261. /**
  262.  * Include Compatibility plugin if available.
  263.  */
  264. if (file_exists(SM_PATH 'plugins/compatibility/functions.php'))
  265.     include_once(SM_PATH 'plugins/compatibility/functions.php');
  266. $squirrelmail_plugin_hooks array();
  267.  
  268. /* On init, register all plugins configured for use. */
  269. if (isset($plugins&& is_array($plugins)) {
  270.     // turn on output buffering in order to prevent output of new lines
  271.         ob_start();
  272.     foreach ($plugins as $name{
  273.         use_plugin($name);
  274.     }
  275.     // get output and remove whitespace
  276.         $output trim(ob_get_contents());
  277.     ob_end_clean();
  278.     // if plugins output more than newlines and spacing, stop script execution.
  279.         if (!empty($output)) {
  280.         die($output);
  281.     }
  282. }
  283.  
  284. /**
  285.  * Before 1.5.2 version hook was part of functions/constants.php.
  286.  * After init layout changes, hook had to be moved because include/constants.php is
  287.  * loaded before plugins are initialized.
  288.  * @since 1.2.0
  289.  */
  290. do_hook('loading_constants');
  291.  
  292. switch ($sInitLocation{
  293.     case 'style'
  294.  
  295.         // need to get the right template set up
  296.         //
  297.                 sqGetGlobalVar('templateid'$templateidSQ_GET);
  298.  
  299.         // sanitize just in case...
  300.         //
  301.                 $templateid preg_replace('/(\.\.\/){1,}/'''$templateid);
  302.  
  303.         // make sure given template actually is available
  304.         //
  305.                 $found_templateset false;
  306.         for ($i 0$i count($aTemplateSet)++$i{
  307.             if ($aTemplateSet[$i]['ID'== $templateid{
  308.                 $found_templateset true;
  309.                 break;
  310.             }
  311.         }
  312.  
  313. // FIXME: do we need/want to check here for actual presence of template sets?
  314.         // selected template not available, fall back to default template
  315.         //
  316.                 if (!$found_templateset{
  317.             $sTemplateID Template::get_default_template_set();
  318.         else {
  319.             $sTemplateID $templateid;
  320.         }
  321.  
  322.         session_write_close();
  323.         sqsetcookieflush();
  324.         break;
  325.  
  326.     case 'redirect':
  327.         /**
  328.          * directory hashing functions are needed for all setups in case
  329.          * plugins use own pref files.
  330.          */
  331.         require(SM_PATH 'functions/prefs.php');
  332.         require(SM_PATH 'functions/auth.php');
  333.         /* hook loads custom prefs backend plugins */
  334.         $prefs_backend do_hook_function('prefs_backend');
  335.         if (isset($prefs_backend&& !empty($prefs_backend&& file_exists(SM_PATH $prefs_backend)) {
  336.             require(SM_PATH $prefs_backend);
  337.         elseif (isset($prefs_dsn&& !empty($prefs_dsn)) {
  338.             require(SM_PATH 'functions/db_prefs.php');
  339.         else {
  340.             require(SM_PATH 'functions/file_prefs.php');
  341.         }
  342.         //nobreak;
  343.         case 'login':
  344.         require(SM_PATH 'functions/display_messages.php' );
  345.         require(SM_PATH 'functions/page_header.php');
  346.         require(SM_PATH 'functions/html.php');
  347.  
  348.         // reset template file cache
  349.         //
  350.                 $sTemplateID Template::get_default_template_set();
  351.         Template::cache_template_file_hierarchy(TRUE);
  352.  
  353.         /**
  354.          * cleanup old cookies with a cookie path the same as the standard php.ini
  355.          * cookie path. All previous SquirrelMail version used the standard php.ini
  356.          * cookie path for storing the session name. That behaviour changed.
  357.          */
  358.         if ($sCookiePath !== SM_BASE_URI{
  359.             /**
  360.              * do not delete the standard sessions with session.name is i.e. PHPSESSID
  361.              * because they probably belong to other php apps
  362.              */
  363.             if (ini_get('session.name'!== $sSessionAutostartName{
  364.                 sqsetcookie(ini_get('session.name'),'',0,$sCookiePath);
  365.             }
  366.         }
  367.         break;
  368.     default:
  369.         require(SM_PATH 'functions/display_messages.php' );
  370.         require(SM_PATH 'functions/page_header.php');
  371.         require(SM_PATH 'functions/html.php');
  372.         require(SM_PATH 'functions/strings.php');
  373.  
  374.  
  375.         /**
  376.          * Check if we are logged in
  377.          */
  378.         require(SM_PATH 'functions/auth.php');
  379.  
  380.         if !sqsession_is_registered('user_is_logged_in') ) {
  381.             //  First we store some information in the new session to prevent
  382.             //  information-loss.
  383.             //
  384.                         $session_expired_post $_POST;
  385.             $session_expired_location $PHP_SELF;
  386.             if (!sqsession_is_registered('session_expired_post')) {
  387.                 sqsession_register($session_expired_post,'session_expired_post');
  388.             }
  389.             if (!sqsession_is_registered('session_expired_location')) {
  390.                 sqsession_register($session_expired_location,'session_expired_location');
  391.             }
  392.             // signout page will deal with users who aren't logged
  393.             // in on its own; don't show error here
  394.             //
  395.                         if (strpos($PHP_SELF'signout.php'!== FALSE{
  396.             return;
  397.             }
  398.  
  399.             /**
  400.              * Initialize the template object (logout_error uses it)
  401.              */
  402.             /*
  403.              * $sTemplateID is not initialized when a user is not logged in, so we 
  404.              * will use the config file defaults here.  If the neccesary variables 
  405.              * are net set, force a default value.
  406.              */
  407.             $sTemplateID Template::get_default_template_set();
  408.             $oTemplate Template::construct_template($sTemplateID);
  409.  
  410.             set_up_language($squirrelmail_languagetrue);
  411.             logout_error_("You must be logged in to access this page.") );
  412.             exit;
  413.         }
  414.  
  415.         sqgetGlobalVar('username',$username,SQ_SESSION);
  416.  
  417.         /**
  418.          * Setting the prefs backend
  419.          */
  420.         sqgetGlobalVar('prefs_cache'$prefs_cacheSQ_SESSION );
  421.         sqgetGlobalVar('prefs_are_cached'$prefs_are_cachedSQ_SESSION );
  422.  
  423.         if !sqsession_is_registered('prefs_are_cached'||
  424.             !isset$prefs_cache||
  425.             !is_array$prefs_cache)) {
  426.             $prefs_are_cached false;
  427.             $prefs_cache false//array();
  428.                 }
  429.  
  430.         /* see 'redirect' case */
  431.         require(SM_PATH 'functions/prefs.php');
  432.  
  433.         $prefs_backend do_hook_function('prefs_backend');
  434.         if (isset($prefs_backend&& !empty($prefs_backend&& file_exists(SM_PATH $prefs_backend)) {
  435.             require(SM_PATH $prefs_backend);
  436.         elseif (isset($prefs_dsn&& !empty($prefs_dsn)) {
  437.             require(SM_PATH 'functions/db_prefs.php');
  438.         else {
  439.             require(SM_PATH 'functions/file_prefs.php');
  440.         }
  441.  
  442.         /**
  443.          * initializing user settings
  444.          */
  445.         require(SM_PATH 'include/load_prefs.php');
  446.  
  447. // i do not understand the frames language cookie story
  448.                 /**
  449.          * We'll need this to later have a noframes version
  450.          *
  451.          * Check if the user has a language preference, but no cookie.
  452.          * Send him a cookie with his language preference, if there is
  453.          * such discrepancy.
  454.          */
  455.          $my_language getPref($data_dir$username'language');
  456.          if ($my_language != $squirrelmail_language{
  457.              sqsetcookie('squirrelmail_language'$my_languagetime()+2592000$base_uri);
  458.          }
  459. // /dont understand
  460.  
  461.         
  462.         /**
  463.          * Set up the language.
  464.          */
  465.         $err=set_up_language(getPref($data_dir$username'language'));
  466.         /* this is the last cookie we set so flush it. */
  467.         sqsetcookieflush();
  468.  
  469.         // Japanese translation used without mbstring support
  470.                 if ($err==2{
  471.             $sError =
  472.                 "<p>You need to have PHP installed with the multibyte string function \n".
  473.                 "enabled (using configure option --enable-mbstring).</p>\n".
  474.                 "<p>System assumed that you accidently switched to Japanese translation \n".
  475.                 "and reverted your language preference to English.</p>\n".
  476.                 "<p>Please refresh this page in order to use webmail.</p>\n";
  477.             error_box($sError);
  478.         }
  479.  
  480.         $timeZone getPref($data_dir$username'timezone');
  481.  
  482.         /* Check to see if we are allowed to set the TZ environment variable.
  483.          * We are able to do this if ...
  484.          *   safe_mode is disabled OR
  485.          *   safe_mode_allowed_env_vars is empty (you are allowed to set any) OR
  486.          *   safe_mode_allowed_env_vars contains TZ
  487.          */
  488.         $tzChangeAllowed (!ini_get('safe_mode')) ||
  489.                             !strcmp(ini_get('safe_mode_allowed_env_vars'),''||
  490.                             preg_match('/^([\w_]+,)*TZ/'ini_get('safe_mode_allowed_env_vars'));
  491.  
  492.         if $timeZone != SMPREF_NONE && ($timeZone != "")
  493.             && $tzChangeAllowed {
  494.  
  495.             // get time zone key, if strict or custom strict timezones are used
  496.                         if (isset($time_zone_type&&
  497.                 ($time_zone_type == || $time_zone_type == 3)) {
  498.                 /* load time zone functions */
  499.                 require(SM_PATH 'include/timezones.php');
  500.                 $realTimeZone sq_get_tz_key($timeZone);
  501.             else {
  502.                 $realTimeZone $timeZone;
  503.             }
  504.  
  505.             // set time zone
  506.                         if ($realTimeZone{
  507.                 putenv("TZ=".$realTimeZone);
  508.             }
  509.         }
  510.  
  511.         /**
  512.          * php 5.1.0 added time zone functions. Set time zone with them in order
  513.          * to prevent E_STRICT notices and allow time zone modifications in safe_mode.
  514.          */
  515.         if (function_exists('date_default_timezone_set')) {
  516.             if ($timeZone != SMPREF_NONE && $timeZone != ""{
  517.                 date_default_timezone_set($timeZone);
  518.             else {
  519.                 // interface runs on server's time zone. Remove php E_STRICT complains
  520.                                 $default_timezone @date_default_timezone_get();
  521.                 date_default_timezone_set($default_timezone);        
  522.             }
  523.         }
  524.         break;
  525. }
  526.  
  527. /*
  528.  * $sTemplateID is not initialized when a user is not logged in, so we 
  529.  * will use the config file defaults here.  If the neccesary variables 
  530.  * are not set, force a default value.
  531.  * 
  532.  * If the user is logged in, $sTemplateID will be set in load_prefs.php, 
  533.  * so we shouldn't change it here.
  534.  */
  535. if (!isset($sTemplateID)) {
  536.     $sTemplateID Template::get_default_template_set();
  537.     $icon_theme_path !$use_icons NULL Template::calculate_template_images_directory($sTemplateID);
  538. }
  539. $oTemplate Template::construct_template($sTemplateID);
  540.  
  541. // We want some variables to always be available to the template
  542. $always_include array('sTemplateID''icon_theme_path''javascript_on');
  543. foreach ($always_include as $var{
  544.     $oTemplate->assign($var(isset($$var? $$var NULL));
  545. }
  546.  
  547. /**
  548.  * Initialize our custom error handler object
  549.  */
  550. require(SM_PATH 'class/error.class.php');
  551. $oErrorHandler new ErrorHandler($oTemplate,'error_message.tpl');
  552.  
  553. /**
  554.  * Activate custom error handling
  555.  */
  556. if (version_compare(PHP_VERSION"4.3.0"">=")) {
  557.     $oldErrorHandler set_error_handler(array($oErrorHandler'SquirrelMailErrorhandler'));
  558. else {
  559.     $oldErrorHandler set_error_handler('SquirrelMailErrorhandler');
  560. }
  561.  
  562. /**
  563.  * Javascript support detection function
  564.  * @param boolean $reset recheck javascript support if set to true.
  565.  * @return integer SMPREF_JS_ON or SMPREF_JS_OFF ({@see include/constants.php})
  566.  * @since 1.5.1
  567.  */
  568. function checkForJavascript($reset FALSE{
  569.   global $data_dir$username$javascript_on$javascript_setting;
  570.  
  571.   if !$reset && sqGetGlobalVar('javascript_on'$javascript_onSQ_SESSION) )
  572.     return $javascript_on;
  573.  
  574.   if $reset || !isset($javascript_setting) )
  575.     $javascript_setting getPref($data_dir$username'javascript_setting'SMPREF_JS_AUTODETECT);
  576.  
  577.   if !sqGetGlobalVar('new_js_autodetect_results'$js_autodetect_results&&
  578.        !sqGetGlobalVar('js_autodetect_results'$js_autodetect_results) )
  579.     $js_autodetect_results SMPREF_JS_OFF;
  580.  
  581.   if $javascript_setting == SMPREF_JS_AUTODETECT )
  582.     $javascript_on $js_autodetect_results;
  583.   else
  584.     $javascript_on $javascript_setting;
  585.  
  586.   sqsession_register($javascript_on'javascript_on');
  587.   return $javascript_on;
  588. }
  589.  
  590. function sqm_baseuri({
  591.     global $base_uri;
  592.     return $base_uri;
  593. }

Documentation generated on Sat, 07 Oct 2006 16:11:53 +0300 by phpDocumentor 1.3.0RC6