X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Fglobal.php;h=59b3fc9692ba1e20709f922b1dc1b46f3155a709;hb=6f9fa51aafde8824af161595c85895ba21609e00;hp=2462ac6d202bd41ef84787165b9541dfbef0edcf;hpb=cc4072575deee160085a9a2abbeee14a8d03998a;p=squirrelmail.git diff --git a/functions/global.php b/functions/global.php index 2462ac6d..59b3fc96 100644 --- a/functions/global.php +++ b/functions/global.php @@ -1,107 +1,74 @@ = ($a.$b.$c); + return version_compare ( PHP_VERSION, "$a.$b.$c", 'ge' ); } /** - * returns true if the current internal SM version is at minimum a.b.c - * These are plain integer comparisons, as our internal version is + * returns true if the current internal SM version is at minimum a.b.c + * These are plain integer comparisons, as our internal version is * constructed by us, as an array of 3 ints. * * Called: check_sm_version(1,3,3) + * @param int a major version number + * @param int b minor version number + * @param int c release number + * @return bool */ function check_sm_version($a = 0, $b = 0, $c = 0) { global $SQM_INTERNAL_VERSION; if ( !isset($SQM_INTERNAL_VERSION) || $SQM_INTERNAL_VERSION[0] < $a || - $SQM_INTERNAL_VERSION[1] < $b || - ( $SQM_INTERNAL_VERSION[1] == $b && + ( $SQM_INTERNAL_VERSION[0] == $a && + $SQM_INTERNAL_VERSION[1] < $b) || + ( $SQM_INTERNAL_VERSION[0] == $a && + $SQM_INTERNAL_VERSION[1] == $b && $SQM_INTERNAL_VERSION[2] < $c ) ) { return FALSE; - } - return TRUE; + } + return TRUE; } -/* recursively strip slashes from the values of an array */ +/** + * Recursively strip slashes from the values of an array. + * @param array array the array to strip, passed by reference + * @return void + */ function sqstripslashes(&$array) { if(count($array) > 0) { foreach ($array as $index=>$value) { @@ -115,93 +82,84 @@ function sqstripslashes(&$array) { } } +/** + * Add a variable to the session. + * @param mixed $var the variable to register + * @param string $name the name to refer to this variable + * @return void + */ function sqsession_register ($var, $name) { sqsession_is_active(); - if ( !check_php_version(4,1) ) { - global $HTTP_SESSION_VARS; - $HTTP_SESSION_VARS[$name] = $var; - } - else { - $_SESSION["$name"] = $var; - } + $_SESSION["$name"] = $var; + session_register("$name"); } +/** + * Delete a variable from the session. + * @param string $name the name of the var to delete + * @return void + */ function sqsession_unregister ($name) { sqsession_is_active(); - if ( !check_php_version(4,1) ) { - global $HTTP_SESSION_VARS; - unset($HTTP_SESSION_VARS[$name]); - } - else { - unset($_SESSION[$name]); - } + unset($_SESSION[$name]); + session_unregister("$name"); } +/** + * Checks to see if a variable has already been registered + * in the session. + * @param string $name the name of the var to check + * @return bool whether the var has been registered + */ function sqsession_is_registered ($name) { $test_name = &$name; $result = false; - if ( !check_php_version(4,1) ) { - global $HTTP_SESSION_VARS; - if (isset($HTTP_SESSION_VARS[$test_name])) { - $result = true; - } - } - else { - if (isset($_SESSION[$test_name])) { - $result = true; - } + + if (isset($_SESSION[$test_name])) { + $result = true; } + return $result; } - -define('SQ_INORDER',0); -define('SQ_GET',1); -define('SQ_POST',2); -define('SQ_SESSION',3); -define('SQ_COOKIE',4); -define('SQ_SERVER',5); - /** - * Search for the var $name in $_SESSION, $_POST, $_GET, - * $_COOKIE, or $_SERVER and set it in provided var. + * Search for the var $name in $_SESSION, $_POST, $_GET, $_COOKIE, or $_SERVER + * and set it in provided var. * - * If $search is not provided, or == SQ_INORDER, it will search - * $_SESSION, then $_POST, then $_GET. Otherwise, - * use one of the defined constants to look for - * a var in one place specifically. + * If $search is not provided, or if it is SQ_INORDER, it will search $_SESSION, + * then $_POST, then $_GET. If $search is SQ_FORM it will search $_POST and + * $_GET. Otherwise, use one of the defined constants to look for a var in one + * place specifically. * - * Note: $search is an int value equal to one of the - * constants defined above. + * Note: $search is an int value equal to one of the constants defined above. * - * example: - * sqgetGlobalVar('username',$username,SQ_SESSION); - * -- no quotes around last param! + * Example: + * sqgetGlobalVar('username',$username,SQ_SESSION); + * // No quotes around last param, it's a constant - not a string! * - * Returns FALSE if variable is not found. - * Returns TRUE if it is. + * @param string name the name of the var to search + * @param mixed value the variable to return + * @param int search constant defining where to look + * @return bool whether variable is found. */ function sqgetGlobalVar($name, &$value, $search = SQ_INORDER) { - if ( !check_php_version(4,1) ) { - global $_SESSION, $_GET, $_POST, $_COOKIE, $_SERVER; - } /* NOTE: DO NOT enclose the constants in the switch statement with quotes. They are constant values, enclosing them in quotes will cause them to evaluate as strings. */ switch ($search) { - /* we want the default case to be first here, - so that if a valid value isn't specified, - all three arrays will be searched. */ + /* we want the default case to be first here, + so that if a valid value isn't specified, + all three arrays will be searched. */ default: - case SQ_INORDER: + case SQ_INORDER: // check session, post, get case SQ_SESSION: if( isset($_SESSION[$name]) ) { $value = $_SESSION[$name]; @@ -209,6 +167,7 @@ function sqgetGlobalVar($name, &$value, $search = SQ_INORDER) { } elseif ( $search == SQ_SESSION ) { break; } + case SQ_FORM: // check post, get case SQ_POST: if( isset($_POST[$name]) ) { $value = $_POST[$name]; @@ -220,13 +179,13 @@ function sqgetGlobalVar($name, &$value, $search = SQ_INORDER) { if ( isset($_GET[$name]) ) { $value = $_GET[$name]; return TRUE; - } + } /* NO IF HERE. FOR SQ_INORDER CASE, EXIT after GET */ break; case SQ_COOKIE: if ( isset($_COOKIE[$name]) ) { $value = $_COOKIE[$name]; - return TRUE; + return TRUE; } break; case SQ_SERVER: @@ -236,9 +195,14 @@ function sqgetGlobalVar($name, &$value, $search = SQ_INORDER) { } break; } + /* Nothing found, return FALSE */ return FALSE; } +/** + * Deletes an existing session, more advanced than the standard PHP + * session_destroy(), it explicitly deletes the cookies and global vars. + */ function sqsession_destroy() { /* @@ -254,37 +218,200 @@ function sqsession_destroy() { global $base_uri; - if (isset($_COOKIE[session_name()])) setcookie(session_name(), '', time() - 5, $base_uri); - if (isset($_COOKIE['username'])) setcookie('username','',time() - 5,$base_uri); - if (isset($_COOKIE['key'])) setcookie('key','',time() - 5,$base_uri); + if (isset($_COOKIE[session_name()])) sqsetcookie(session_name(), '', 0, $base_uri); + if (isset($_COOKIE['username'])) sqsetcookie('username','',0,$base_uri); + if (isset($_COOKIE['key'])) sqsetcookie('key','',0,$base_uri); $sessid = session_id(); if (!empty( $sessid )) { - if ( !check_php_version(4,1) ) { - global $HTTP_SESSION_VARS; - $HTTP_SESSION_VARS = array(); - } else { - $_SESSION = array(); - } + $_SESSION = array(); @session_destroy(); + session_regenerate_id(true); + sqsetcookie(session_name(), '', 0, $base_uri); + session_write_close(); } } -/* +/** * Function to verify a session has been started. If it hasn't * start a session up. php.net doesn't tell you that $_SESSION * (even though autoglobal), is not created unless a session is * started, unlike $_POST, $_GET and such */ - function sqsession_is_active() { - $sessid = session_id(); if ( empty( $sessid ) ) { - session_start(); + sqsession_start(); + } +} + +/** + * Function to start the session and store the cookie with the session_id as + * HttpOnly cookie which means that the cookie isn't accessible by javascript + * (IE6 only) + */ +function sqsession_start() { + global $PHP_SELF; + + $dirs = array('|src/.*|', '|plugins/.*|', '|functions/.*|'); + $repl = array('', '', ''); + $base_uri = preg_replace($dirs, $repl, $PHP_SELF); + + + session_start(); + $sessid = session_id(); + // session_starts sets the sessionid cookie buth without the httponly var + // setting the cookie again sets the httponly cookie attribute + sqsetcookie(session_name(),$sessid,false,$base_uri); +} + + +/** + * Set a cookie + * @param string $sName The name of the cookie. + * @param string $sValue The value of the cookie. + * @param int $iExpire The time the cookie expires. This is a Unix timestamp so is in number of seconds since the epoch. + * @param string $sPath The path on the server in which the cookie will be available on. + * @param string $sDomain The domain that the cookie is available. + * @param boolean $bSecure Indicates that the cookie should only be transmitted over a secure HTTPS connection. + * @param boolean $bHttpOnly Disallow JS to access the cookie (IE6 only) + * @return void + */ +function sqsetcookie($sName,$sValue,$iExpire=false,$sPath="",$sDomain="",$bSecure=false,$bHttpOnly=true) { + $sHeader = "Set-Cookie: $sName=$sValue"; + if ($sPath) { + $sHeader .= "; path=$sPath"; + } + if ($iExpire !== false) { + $sHeader .= "; Max-Age=$iExpire"; + // php uses Expire header, also add the expire header + if ($iExpire === 0) { + $sHeader .= "; expires=". date("r",time() - 3600); + } else { + $sHeader .= "; expires=". date("r",$iExpire); + } + } + if ($sDomain) { + $sHeader .= "; Domain=$sDomain"; + } + if ($bSecure) { + $sHeader .= "; Secure"; + } + if ($bHttpOnly) { + $sHeader .= "; HttpOnly"; + } + // $sHeader .= "; Version=1"; + + header($sHeader); +} + +function php_combined_lcg() { + $tv = gettimeofday(); + $lcg['s1'] = $tv['sec'] ^ (~$tv['usec']); + $lcg['s2'] = posix_getpid(); + + $q = (int) ($lcg['s1'] / 53668); + $lcg['s1'] = (int) (40014 * ($lcg['s1'] - 53668 * $q) - 12211 * $q); + if ($lcg['s1'] < 0) + $lcg['s1'] += 2147483563; + + $q = (int) ($lcg['s2'] / 52774); + $lcg['s2'] = (int) (40692 * ($lcg['s2'] - 52774 * $q) - 3791 * $q); + if ($lcg['s2'] < 0) + $lcg['s2'] += 2147483399; + + $z = (int) ($lcg['s1'] - $lcg['s2']); + if ($z < 1) { + $z += 2147483562; + } + + return $z * 4.656613e-10; +} + + +if (!function_exists('session_regenerate_id')) { + + function session_regenerate_id() { + global $base_uri; + + $tv = gettimeofday(); + $buf = sprintf("%.15s%ld%ld%0.8f", $_SERVER['REMOTE_ADDR'], $tv['sec'], $tv['usec'], php_combined_lcg() * 10); + $sessid = session_id(md5($buf)); + if (ini_get('session.use_cookies')) { + if (isset($_COOKIE[session_name()])) sqsetcookie(session_name(), $sessid, 0, $base_uri); + } + return true; + } +} + + +/** + * php_self + * + * Creates an URL for the page calling this function, using either the PHP global + * REQUEST_URI, or the PHP global PHP_SELF with QUERY_STRING added. Before 1.5.1 + * function was stored in function/strings.php. + * + * @return string the complete url for this page + * @since 1.2.3 + */ +function php_self () { + if ( sqgetGlobalVar('REQUEST_URI', $req_uri, SQ_SERVER) && !empty($req_uri) ) { + return $req_uri; + } + + if ( sqgetGlobalVar('PHP_SELF', $php_self, SQ_SERVER) && !empty($php_self) ) { + + // need to add query string to end of PHP_SELF to match REQUEST_URI + // + if ( sqgetGlobalVar('QUERY_STRING', $query_string, SQ_SERVER) && !empty($query_string) ) { + $php_self .= '?' . $query_string; + } + + return $php_self; } + + return ''; +} + +/** set the name of the session cookie */ +if(isset($session_name) && $session_name) { + ini_set('session.name' , $session_name); +} else { + ini_set('session.name' , 'SQMSESSID'); +} + +/** + * If magic_quotes_runtime is on, SquirrelMail breaks in new and creative ways. + * Force magic_quotes_runtime off. + * tassium@squirrelmail.org - I put it here in the hopes that all SM code includes this. + * If there's a better place, please let me know. + */ +ini_set('magic_quotes_runtime','0'); + +/* Since we decided all IMAP servers must implement the UID command as defined in + * the IMAP RFC, we force $uid_support to be on. + */ + +global $uid_support; +$uid_support = true; + +/* if running with magic_quotes_gpc then strip the slashes + from POST and GET global arrays */ + +if (get_magic_quotes_gpc()) { + sqstripslashes($_GET); + sqstripslashes($_POST); } +/* strip any tags added to the url from PHP_SELF. + This fixes hand crafted url XXS expoits for any + page that uses PHP_SELF as the FORM action */ +$_SERVER['PHP_SELF'] = strip_tags($_SERVER['PHP_SELF']); + +$PHP_SELF = php_self(); + +sqsession_is_active(); -?> +?> \ No newline at end of file