Source for file global.php

Documentation is available at global.php

  1. <?php
  2.  
  3. /**
  4.  * global.php
  5.  *
  6.  * This includes code to update < 4.1.0 globals to the newer format
  7.  * It also has some session register functions that work across various
  8.  * php versions.
  9.  *
  10.  * @copyright &copy; 1999-2006 The SquirrelMail Project Team
  11.  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  12.  * @version $Id: global.php,v 1.78 2006/10/02 11:50:49 pdontthink Exp $
  13.  * @package squirrelmail
  14.  */
  15.  
  16. /**
  17.  */
  18. define('SQ_INORDER',0);
  19. define('SQ_GET',1);
  20. define('SQ_POST',2);
  21. define('SQ_SESSION',3);
  22. define('SQ_COOKIE',4);
  23. define('SQ_SERVER',5);
  24. define('SQ_FORM',6);
  25.  
  26.  
  27. /**
  28.  * returns true if current php version is at mimimum a.b.c
  29.  *
  30.  * Called: check_php_version(4,1)
  31.  * @param int a major version number
  32.  * @param int b minor version number
  33.  * @param int c release number
  34.  * @return bool 
  35.  */
  36. function check_php_version ($a '0'$b '0'$c '0')
  37. {
  38.     return version_compare PHP_VERSION"$a.$b.$c"'ge' );
  39. }
  40.  
  41. /**
  42.  * returns true if the current internal SM version is at minimum a.b.c
  43.  * These are plain integer comparisons, as our internal version is
  44.  * constructed by us, as an array of 3 ints.
  45.  *
  46.  * Called: check_sm_version(1,3,3)
  47.  * @param int a major version number
  48.  * @param int b minor version number
  49.  * @param int c release number
  50.  * @return bool 
  51.  */
  52. function check_sm_version($a 0$b 0$c 0)
  53. {
  54.     global $SQM_INTERNAL_VERSION;
  55.     if !isset($SQM_INTERNAL_VERSION||
  56.          $SQM_INTERNAL_VERSION[0$a ||
  57.          $SQM_INTERNAL_VERSION[0== $a &&
  58.            $SQM_INTERNAL_VERSION[1$b||
  59.          $SQM_INTERNAL_VERSION[0== $a &&
  60.            $SQM_INTERNAL_VERSION[1== $b &&
  61.            $SQM_INTERNAL_VERSION[2$c ) ) {
  62.         return FALSE;
  63.     }
  64.     return TRUE;
  65. }
  66.  
  67.  
  68. /**
  69.  * Recursively strip slashes from the values of an array.
  70.  * @param array array the array to strip, passed by reference
  71.  * @return void 
  72.  */
  73. function sqstripslashes(&$array{
  74.     if(count($array0{
  75.         foreach ($array as $index=>$value{
  76.             if (is_array($array[$index])) {
  77.                 sqstripslashes($array[$index]);
  78.             }
  79.             else {
  80.                 $array[$indexstripslashes($value);
  81.             }
  82.         }
  83.     }
  84. }
  85.  
  86. /**
  87.  * Add a variable to the session.
  88.  * @param mixed $var the variable to register
  89.  * @param string $name the name to refer to this variable
  90.  * @return void 
  91.  */
  92. function sqsession_register ($var$name{
  93.  
  94.  
  95.     $_SESSION["$name"$var;
  96.  
  97.     session_register("$name");
  98. }
  99.  
  100. /**
  101.  * Delete a variable from the session.
  102.  * @param string $name the name of the var to delete
  103.  * @return void 
  104.  */
  105. function sqsession_unregister ($name{
  106.  
  107.  
  108.     unset($_SESSION[$name]);
  109.  
  110.     session_unregister("$name");
  111. }
  112.  
  113. /**
  114.  * Checks to see if a variable has already been registered
  115.  * in the session.
  116.  * @param string $name the name of the var to check
  117.  * @return bool whether the var has been registered
  118.  */
  119. function sqsession_is_registered ($name{
  120.     $test_name &$name;
  121.     $result false;
  122.  
  123.     if (isset($_SESSION[$test_name])) {
  124.         $result true;
  125.     }
  126.  
  127.     return $result;
  128. }
  129.  
  130. /**
  131.  * Search for the var $name in $_SESSION, $_POST, $_GET, $_COOKIE, or $_SERVER
  132.  * and set it in provided var.
  133.  *
  134.  * If $search is not provided, or if it is SQ_INORDER, it will search $_SESSION,
  135.  * then $_POST, then $_GET. If $search is SQ_FORM it will search $_POST and
  136.  * $_GET.  Otherwise, use one of the defined constants to look for a var in one
  137.  * place specifically.
  138.  *
  139.  * Note: $search is an int value equal to one of the constants defined above.
  140.  *
  141.  * Example:
  142.  * sqgetGlobalVar('username',$username,SQ_SESSION);
  143.  * // No quotes around last param, it's a constant - not a string!
  144.  *
  145.  * @param string name the name of the var to search
  146.  * @param mixed value the variable to return
  147.  * @param int search constant defining where to look
  148.  * @param int typecast force variable to be cast to given type (please
  149.  *                      use SQ_TYPE_XXX constants or set to FALSE (default)
  150.  *                      to leave variable type unmolested)
  151.  * @return bool whether variable is found.
  152.  */
  153. function sqgetGlobalVar($name&$value$search SQ_INORDER$default NULL$typecast false{
  154.  
  155.     $result false;
  156.  
  157.     switch ($search{
  158.         /* we want the default case to be first here,
  159.            so that if a valid value isn't specified,
  160.            all three arrays will be searched. */
  161.       default:
  162.       case SQ_INORDER// check session, post, get
  163.       case SQ_SESSION:
  164.         ifisset($_SESSION[$name]) ) {
  165.             $value $_SESSION[$name];
  166.             $result TRUE;
  167.             break;
  168.         elseif $search == SQ_SESSION {
  169.             break;
  170.         }
  171.       case SQ_FORM:   // check post, get
  172.       case SQ_POST:
  173.         ifisset($_POST[$name]) ) {
  174.             $value $_POST[$name];
  175.             $result TRUE;
  176.             break;
  177.         elseif $search == SQ_POST {
  178.           break;
  179.         }
  180.       case SQ_GET:
  181.         if isset($_GET[$name]) ) {
  182.             $value $_GET[$name];
  183.             $result TRUE;
  184.             break;
  185.         }
  186.         /* NO IF HERE. FOR SQ_INORDER CASE, EXIT after GET */
  187.         break;
  188.       case SQ_COOKIE:
  189.         if isset($_COOKIE[$name]) ) {
  190.             $value $_COOKIE[$name];
  191.             $result TRUE;
  192.             break;
  193.         }
  194.         break;
  195.       case SQ_SERVER:
  196.         if isset($_SERVER[$name]) ) {
  197.             $value $_SERVER[$name];
  198.             $result TRUE;
  199.             break;
  200.         }
  201.         break;
  202.     }
  203.     if ($result && $typecast{
  204.         switch ($typecast{
  205.             case SQ_TYPE_INT$value = (int) $valuebreak;
  206.             case SQ_TYPE_STRING$value = (string) $valuebreak;
  207.             case SQ_TYPE_BOOL$value = (bool) $valuebreak;
  208.             defaultbreak;
  209.         }
  210.     else if (!$result && !is_null($default)) {
  211.         $value $default;
  212.     }
  213.     return $result;
  214. }
  215.  
  216. /**
  217.  * Deletes an existing session, more advanced than the standard PHP
  218.  * session_destroy(), it explicitly deletes the cookies and global vars.
  219.  *
  220.  * WARNING: Older PHP versions have some issues with session management.
  221.  * See http://bugs.php.net/11643 (warning, spammed bug tracker) and
  222.  * http://bugs.php.net/13834. SID constant is not destroyed in PHP 4.1.2,
  223.  * 4.2.3 and maybe other versions. If you restart session after session
  224.  * is destroyed, affected PHP versions produce PHP notice. Bug should
  225.  * be fixed only in 4.3.0
  226.  */
  227. function sqsession_destroy({
  228.  
  229.     /*
  230.      * php.net says we can kill the cookie by setting just the name:
  231.      * http://www.php.net/manual/en/function.setcookie.php
  232.      * maybe this will help fix the session merging again.
  233.      *
  234.      * Changed the theory on this to kill the cookies first starting
  235.      * a new session will provide a new session for all instances of
  236.      * the browser, we don't want that, as that is what is causing the
  237.      * merging of sessions.
  238.      */
  239.  
  240.     global $base_uri;
  241.  
  242.     if (isset($_COOKIE[session_name()])) sqsetcookie(session_name()''0$base_uri);
  243.     if (isset($_COOKIE['username'])) sqsetcookie('username','',0,$base_uri);
  244.     if (isset($_COOKIE['key'])) sqsetcookie('key','',0,$base_uri);
  245.  
  246.     $sessid session_id();
  247.     if (!empty$sessid )) {
  248.         $_SESSION array();
  249.         @session_destroy();
  250.     }
  251. }
  252.  
  253. /**
  254.  * Function to verify a session has been started.  If it hasn't
  255.  * start a session up.  php.net doesn't tell you that $_SESSION
  256.  * (even though autoglobal), is not created unless a session is
  257.  * started, unlike $_POST, $_GET and such
  258.  */
  259. function sqsession_is_active({
  260.     $sessid session_id();
  261.     if empty$sessid ) ) {
  262.         sqsession_start();
  263.     }
  264. }
  265.  
  266. /**
  267.  * Function to start the session and store the cookie with the session_id as
  268.  * HttpOnly cookie which means that the cookie isn't accessible by javascript
  269.  * (IE6 only)
  270.  */
  271. function sqsession_start({
  272.     global $base_uri;
  273.  
  274.     session_start();
  275.     $session_id session_id();
  276.  
  277.     // session_starts sets the sessionid cookie buth without the httponly var
  278.     // setting the cookie again sets the httponly cookie attribute
  279.  
  280.     // disable, @see sqsetcookie and php 5.1.2
  281.     // sqsetcookie(session_name(),session_id(),false,$base_uri);
  282. }
  283.  
  284.  
  285. /**
  286.  * Set a cookie
  287.  * @param string  $sName     The name of the cookie.
  288.  * @param string  $sValue    The value of the cookie.
  289.  * @param int     $iExpire   The time the cookie expires. This is a Unix timestamp so is in number of seconds since the epoch.
  290.  * @param string  $sPath     The path on the server in which the cookie will be available on.
  291.  * @param string  $sDomain   The domain that the cookie is available.
  292.  * @param boolean $bSecure   Indicates that the cookie should only be transmitted over a secure HTTPS connection.
  293.  * @param boolean $bHttpOnly Disallow JS to access the cookie (IE6 only)
  294.  * @return void 
  295.  */
  296. function sqsetcookie($sName,$sValue,$iExpire=false,$sPath="",$sDomain="",$bSecure=false,$bHttpOnly=true,$bFlush=false{
  297.     static $sCookieCache;
  298.     if (!isset($sCache)) {
  299.         $sCache '';
  300.     }
  301.     /**
  302.      * We have to send all cookies with one header call otherwise we loose cookies.
  303.      * In order to achieve that the sqsetcookieflush function calls this function with $bFlush = true.
  304.      * If that happens we send the cookie header.
  305.      */
  306.     if ($bFlush{
  307.         // header($sCookieCache);
  308.         return;
  309.     }
  310.     if (!$sNamereturn;
  311.  
  312.     // php 5.1.2 and 4.4.2 do not allow to send multiple headers at once.
  313.     // Because that's the only way to get this thing working we fallback to
  314.     // setcookie until we solved this
  315.     if ($iExpire===false$iExpire 0;
  316.     setcookie($sName$sValue$iExpire$sPath);
  317.     return;
  318.  
  319.     $sHeader "Set-Cookie$sName=$sValue";
  320.     if ($sPath{
  321.         $sHeader .= "path=$sPath";
  322.     }
  323.     if ($iExpire !== false{
  324.         $sHeader .= "Max-Age=$iExpire";
  325.         // php uses Expire header, also add the expire header
  326.         $sHeader .= "; expires="gmdate('D, d-M-Y H:i:s T',$iExpire);
  327.     }
  328.     if ($sDomain{
  329.         $sHeader .= "Domain=$sDomain";
  330.     }
  331.     // TODO: IE for Mac (5.2) thinks that semicolon is part of cookie domain
  332.     if ($bSecure{
  333.         $sHeader .= "; Secure";
  334.     }
  335.     if ($bHttpOnly{
  336.         $sHeader .= "; HttpOnly";
  337.     }
  338.     // $sHeader .= "; Version=1";
  339.     $sCookieCache .= $sHeader ."\r\n";
  340.     //header($sHeader."\r\n");
  341. }
  342.  
  343. /**
  344.  * Send the cookie header
  345.  *
  346.  * Cookies set with sqsetcookie will bet set after a sqsetcookieflush call.
  347.  * @return void 
  348.  */
  349. function sqsetcookieflush({
  350.     sqsetcookie('','','','','','','',true);
  351. }
  352.  
  353. /**
  354.  * session_regenerate_id replacement for PHP < 4.3.2
  355.  *
  356.  * This code is borrowed from Gallery, session.php version 1.53.2.1
  357.  */
  358. if (!function_exists('session_regenerate_id')) {
  359.     function make_seed({
  360.         list($usec$secexplode(' 'microtime());
  361.         return (float)$sec ((float)$usec 100000);
  362.     }
  363.  
  364.     function php_combined_lcg({
  365.         mt_srand(make_seed());
  366.         $tv gettimeofday();
  367.         $lcg['s1'$tv['sec'(~$tv['usec']);
  368.         $lcg['s2'mt_rand();
  369.         $q = (int) ($lcg['s1'53668);
  370.         $lcg['s1'= (int) (40014 ($lcg['s1'53668 $q12211 $q);
  371.         if ($lcg['s1'0{
  372.             $lcg['s1'+= 2147483563;
  373.         }
  374.         $q = (int) ($lcg['s2'52774);
  375.         $lcg['s2'= (int) (40692 ($lcg['s2'52774 $q3791 $q);
  376.         if ($lcg['s2'0{
  377.             $lcg['s2'+= 2147483399;
  378.         }
  379.         $z = (int) ($lcg['s1'$lcg['s2']);
  380.         if ($z 1{
  381.             $z += 2147483562;
  382.         }
  383.         return $z 4.656613e-10;
  384.     }
  385.  
  386.     function session_regenerate_id({
  387.         global $base_uri;
  388.         $tv gettimeofday();
  389.         sqgetGlobalVar('REMOTE_ADDR',$remote_addr,SQ_SERVER);
  390.         $buf sprintf("%.15s%ld%ld%0.8f"$remote_addr$tv['sec']$tv['usec']php_combined_lcg(10);
  391.         session_id(md5($buf));
  392.         if (ini_get('session.use_cookies')) {
  393.             // at a later stage we use sqsetcookie. At this point just do
  394.             // what session_regenerate_id would do
  395.             setcookie(session_name()session_id()NULL$base_uri);
  396.         }
  397.         return TRUE;
  398.     }
  399. }
  400.  
  401.  
  402. /**
  403.  * php_self
  404.  *
  405.  * Creates an URL for the page calling this function, using either the PHP global
  406.  * REQUEST_URI, or the PHP global PHP_SELF with QUERY_STRING added. Before 1.5.1
  407.  * function was stored in function/strings.php.
  408.  *
  409.  * @return string the complete url for this page
  410.  * @since 1.2.3
  411.  */
  412. function php_self ({
  413.     if sqgetGlobalVar('REQUEST_URI'$req_uriSQ_SERVER&& !empty($req_uri) ) {
  414.       return $req_uri;
  415.     }
  416.  
  417.     if sqgetGlobalVar('PHP_SELF'$php_selfSQ_SERVER&& !empty($php_self) ) {
  418.  
  419.       // need to add query string to end of PHP_SELF to match REQUEST_URI
  420.       //
  421.       if sqgetGlobalVar('QUERY_STRING'$query_stringSQ_SERVER&& !empty($query_string) ) {
  422.          $php_self .= '?' $query_string;
  423.       }
  424.  
  425.       return $php_self;
  426.     }
  427.  
  428.     return '';
  429. }
  430.  
  431.  
  432. /**
  433.   * Find files and/or directories in a given directory optionally
  434.   * limited to only those with the given file extension.  If the
  435.   * directory is not found or cannot be opened, no error is generated;
  436.   * only an empty file list is returned.
  437. FIXME: do we WANT to throw an error or a notice or... or return FALSE?
  438.   *
  439.   * @param string $directory_path         The path (relative or absolute)
  440.   *                                        to the desired directory.
  441.   * @param string $extension              The file extension filter (optional;
  442.   *                                        default is to return all files (dirs).
  443.   * @param boolean $return_filenames_only When TRUE, only file/dir names
  444.   *                                        are returned, otherwise the
  445.   *                                        $directory_path string is
  446.   *                                        prepended to each file/dir in
  447.   *                                        the returned list (optional;
  448.   *                                        default is filename/dirname only)
  449.   * @param boolean $include_directories   When TRUE, directories are
  450.   *                                        included (optional; default
  451.   *                                        DO include directories).
  452.   * @param boolean $directories_only      When TRUE, ONLY directories
  453.   *                                        are included (optional; default
  454.   *                                        is to include files too).
  455.   * @param boolean $separate_files_and_directories When TRUE, files and
  456.   *                                                 directories are returned
  457.   *                                                 in separate lists, so
  458.   *                                                 the return value is
  459.   *                                                 formatted as a two-element
  460.   *                                                 array with the two keys
  461.   *                                                 "FILES" and "DIRECTORIES",
  462.   *                                                 where corresponding values
  463.   *                                                 are lists of either all
  464.   *                                                 files or all directories
  465.   *                                                 (optional; default do not
  466.   *                                                 split up return array).
  467.   *                                       
  468.   *
  469.   * @return array The requested file/directory list(s).
  470.   *
  471.   * @since 1.5.2
  472.   *
  473.   */
  474. function list_files($directory_path$extension=''$return_filenames_only=TRUE,
  475.                     $include_directories=TRUE$directories_only=FALSE
  476.                     $separate_files_and_directories=FALSE{
  477.  
  478.     $files array();
  479.     $directories array();
  480.  
  481. //FIXME: do we want to place security restrictions here like only allowing
  482. //       directories under SM_PATH?
  483.     // validate given directory
  484.     // 
  485.     if (empty($directory_path
  486.      || !is_dir($directory_path
  487.      || !($DIR opendir($directory_path))) {
  488.         return $files;
  489.     }
  490.  
  491.  
  492.     if (!empty($extension)) $extension '.' trim($extension'.');
  493.     $directory_path rtrim($directory_path'/');
  494.  
  495.  
  496.     // parse through the files
  497.     //
  498.     while (($file readdir($DIR)) !== false{
  499.  
  500.         if ($file == '.' || $file == '..'continue;
  501.  
  502.         if (!empty($extension)
  503.          && strrpos($file$extension!== (strlen($filestrlen($extension))) 
  504.             continue;
  505.  
  506.         // only use is_dir() if we really need to (be as efficient as possible)
  507.         //
  508.         $is_dir FALSE;
  509.         if (!$include_directories || $directories_only 
  510.                                   || $separate_files_and_directories{
  511.             if (is_dir($directory_path '/' $file)) {
  512.                 if (!$include_directoriescontinue;
  513.                 $is_dir TRUE;
  514.                 $directories[($return_filenames_only 
  515.                                ? $file
  516.                                : $directory_path '/' $file);
  517.             
  518.             if ($directories_onlycontinue;
  519.         }
  520.  
  521.         if (!$separate_files_and_directories 
  522.          || ($separate_files_and_directories && !$is_dir)) {
  523.             $files[($return_filenames_only 
  524.                      ? $file
  525.                      : $directory_path '/' $file);
  526.         }
  527.  
  528.     }
  529.     closedir($DIR);
  530.  
  531.  
  532.     if ($directories_onlyreturn $directories;
  533.     if ($separate_files_and_directoriesreturn array('FILES' => $files,
  534.                                                       'DIRECTORIES' => $directories);
  535.     return $files;
  536.  
  537. }
  538.  
  539.  
  540. /**
  541.  * Print variable
  542.  *
  543.  * sm_print_r($some_variable, [$some_other_variable [, ...]]);
  544.  *
  545.  * Debugging function - does the same as print_r, but makes sure special
  546.  * characters are converted to htmlentities first.  This will allow
  547.  * values like <[email protected]> to be displayed.
  548.  * The output is wrapped in <<pre>> and <</pre>> tags.
  549.  * Since 1.4.2 accepts unlimited number of arguments.
  550.  * @since 1.4.1
  551.  * @return void 
  552.  */
  553. function sm_print_r({
  554.     ob_start();  // Buffer output
  555.     foreach(func_get_args(as $var{
  556.         print_r($var);
  557.         echo "\n";
  558.         // php has get_class_methods function that can print class methods
  559.         if (is_object($var)) {
  560.             // get class methods if $var is object
  561.             $aMethods=get_class_methods(get_class($var));
  562.             // make sure that $aMethods is array and array is not empty
  563.             if (is_array($aMethods&& $aMethods!=array()) {
  564.                 echo "Object methods:\n";
  565.                 foreach($aMethods as $method{
  566.                     echo '* ' $method "\n";
  567.                 }
  568.             }
  569.             echo "\n";
  570.         }
  571.     }
  572.     $buffer ob_get_contents()// Grab the print_r output
  573.     ob_end_clean();  // Silently discard the output & stop buffering
  574.     print '<div align="left"><pre>';
  575.     print htmlentities($buffer);
  576.     print '</pre></div>';
  577. }

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