X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Fglobal.php;h=1faeac33917879d79387f97a244b9800fbe273da;hb=aa84daced451fe171b6b606939dba8df6bcab26c;hp=2903511a7e6b7f8d64ec8c244f916bb6b6083593;hpb=a14da8d673346da9d85bdb0ade10e246cf8baa1d;p=squirrelmail.git diff --git a/functions/global.php b/functions/global.php index 2903511a..1faeac33 100644 --- a/functions/global.php +++ b/functions/global.php @@ -83,6 +83,54 @@ function sqstripslashes(&$array) { } } +/** + * Squelch error output to screen (only) for the given function. + * If the SquirrelMail debug mode SM_DEBUG_MODE_ADVANCED is not + * enabled, error output will not go to the log, either. + * + * This provides an alternative to the @ error-suppression + * operator where errors will not be shown in the interface + * but will show up in the server log file (assuming the + * administrator has configured PHP logging). + * + * @since 1.4.12 and 1.5.2 + * + * @param string $function The function to be executed + * @param array $args The arguments to be passed to the function + * (OPTIONAL; default no arguments) + * NOTE: The caller must take extra action if + * the function being called is supposed + * to use any of the parameters by + * reference. In the following example, + * $x is passed by reference and $y is + * passed by value to the "my_func" + * function. + * sq_call_function_suppress_errors('my_func', array(&$x, $y)); + * + * @return mixed The return value, if any, of the function being + * executed will be returned. + * + */ +function sq_call_function_suppress_errors($function, $args=NULL) { + global $sm_debug_mode; + + $display_errors = ini_get('display_errors'); + ini_set('display_errors', '0'); + + // if advanced debug mode isn't enabled, don't log the error, either + // + if (!($sm_debug_mode & SM_DEBUG_MODE_ADVANCED)) + $error_reporting = error_reporting(0); + + $ret = call_user_func_array($function, $args); + + if (!($sm_debug_mode & SM_DEBUG_MODE_ADVANCED)) + error_reporting($error_reporting); + + ini_set('display_errors', $display_errors); + return $ret; +} + /** * Add a variable to the session. * @param mixed $var the variable to register @@ -326,9 +374,8 @@ function sqsession_destroy() { global $base_uri, $_COOKIE, $_SESSION; - if (isset($_COOKIE[session_name()]) && session_name()) sqsetcookie(session_name(), '', 0, $base_uri); - if (isset($_COOKIE['username']) && $_COOKIE['username']) sqsetcookie('username','',0,$base_uri); - if (isset($_COOKIE['key']) && $_COOKIE['key']) sqsetcookie('key','',0,$base_uri); + if (isset($_COOKIE[session_name()]) && session_name()) sqsetcookie(session_name(), $_COOKIE[session_name()], 1, $base_uri); + if (isset($_COOKIE['key']) && $_COOKIE['key']) sqsetcookie('key','SQMTRASH',1,$base_uri); $sessid = session_id(); if (!empty( $sessid )) { @@ -365,15 +412,23 @@ function sqsession_is_active() { function sqsession_start() { global $base_uri; - @session_start(); + sq_call_function_suppress_errors('session_start'); + // was: @session_start(); $session_id = session_id(); - // session_starts sets the sessionid cookie buth without the httponly var + // session_starts sets the sessionid cookie but without the httponly var // setting the cookie again sets the httponly cookie attribute - sqsetcookie(session_name(),$session_id,false,$base_uri); + // + // need to check if headers have been sent, since sqsession_is_active() + // has become just a passthru to this function, so the sqsetcookie() + // below is called every time, even after headers have already been sent + // + if (!headers_sent()) + sqsetcookie(session_name(),$session_id,false,$base_uri); } + /** * Set a cookie * @param string $sName The name of the cookie. @@ -676,270 +731,6 @@ function sm_print_r() { } -/** - * SquirrelMail wrapper for popen()/proc_open() - * - * This emulates popen() by using proc_open() if at all - * possible (reverts seamlessly to popen() if proc_open() - * is not supported in current PHP installation). - * - * This is intended for use with the related sq_pclose(), - * sq_get_pipe_stdout() and sq_get_pipe_stderr() functions, - * the latter of which add an easy interface for retrieving - * output from a child process that was opened with traditional - * popen() syntax (in write mode), while not breaking under - * earlier versions of PHP. - * - * @param string $command The command identifying what to - * execute in the child process. - * @param string $mode The desired mode for the - * unidirectional pipe that is returned; - * either 'r' for read or 'w' for write. - * - * @return resource A handle on the desired read or write pipe - * to the child process, or FALSE if the - * process cannot be created. - * - * @since 1.5.2 - * - */ -function sq_popen($command, $mode) { - - $mode = strtolower($mode{0}); - - - if (!function_exists('proc_open')) - return popen($command, $mode); - - - // set up our process store if not done already - // - global $processes; - if (empty($processes)) - $processes = array(); - - - // define read, write and error pipes - // - $descriptors = array(0 => array('pipe', 'r'), - 1 => array('pipe', 'w'), - 2 => array('pipe', 'w')); - - - // start the child process - // - $proc = proc_open($command, $descriptors, $pipes); - if (!is_resource($proc)) - return FALSE; - - - // when in read mode, we'll return a handle to the child's write pipe - // - if ($mode == 'r') - $return_value = $pipes[1]; - else if ($mode == 'w') - $return_value = $pipes[0]; - else - die('sq_popen() expects $mode to be "r" or "w"'); - - - // store the handle to the process and its pipes - // internally, keyed by whatever handle we'll be - // returning - // - $processes[$return_value] = array($proc, $pipes); - - - return $return_value; - -} - - -/** - * Get STDERR output from a child process - * - * This is designed to be used with processes that were - * opened with sq_popen(), and will return any output - * that may be available from STDERR of the child process - * at the current time. - * - * If a value is given for $timeout_seconds, this function - * will wait that long for output in case there is none - * right now. - * - * In PHP environments that do not support proc_open(), - * an empty string will always be returned. - * - * @param resource $handle The handle to the child process, - * as returned from sq_popen(). - * @param int $timeout_seconds The number of seconds to wait - * for output if there is none - * available immediately (OPTIONAL; - * default is not to wait) - * @param boolean $quiet When TRUE, errors are silently - * ignored (OPTIONAL; default is TRUE). - * - * @return string Any STDERR output that may have been found. - * - * @since 1.5.2 - * - */ -function sq_get_pipe_stderr($handle, $timeout_seconds=0, $quiet=TRUE) { - - // yes, we are testing for proc_OPEN - // because we need to know how the - // handle was actually OPENED - // - if (!function_exists('proc_open')) - return ''; - - - // get our process out of the process store - // - global $processes; - if (!is_array($processes) || !isset($processes[$handle])) { - if (!quiet) { - plain_error_message(_("Failed to find corresponding open process handle")); - } - return ''; - } - $proc = $processes[$handle]; - - - // get all we can from stderr, don't wait longer - // than our timeout for input - // - $contents = ''; - $read = array($proc[1][2]); - $write = NULL; - $except = NULL; - if (stream_select($read, $write, $except, $timeout_seconds)) - while (!feof($proc[1][2])) $contents .= fread($proc[1][2], 8192); - return $contents; - -} - - -/** - * Get STDOUT output from a child process - * - * This is designed to be used with processes that were - * opened with sq_popen(), and will return any output - * that may be available from STDOUT of the child process - * at the current time. - * - * If a value is given for $timeout_seconds, this function - * will wait that long for output in case there is none - * right now. - * - * In PHP environments that do not support proc_open(), - * an empty string will always be returned. - * - * @param resource $handle The handle to the child process, - * as returned from sq_popen(). - * @param int $timeout_seconds The number of seconds to wait - * for output if there is none - * available immediately (OPTIONAL; - * default is not to wait) - * @param boolean $quiet When TRUE, errors are silently - * ignored (OPTIONAL; default is TRUE). - * - * @return string Any STDOUT output that may have been found. - * - * @since 1.5.2 - * - */ -function sq_get_pipe_stdout($handle, $timeout_seconds=0, $quiet=TRUE) { - - // yes, we are testing for proc_OPEN - // because we need to know how the - // handle was actually OPENED - // - if (!function_exists('proc_open')) - return ''; - - - // get our process out of the process store - // - global $processes; - if (!is_array($processes) || !isset($processes[$handle])) { - if (!quiet) { - plain_error_message(_("Failed to find corresponding open process handle")); - } - return ''; - } - $proc = $processes[$handle]; - - - // get all we can from stdout, don't wait longer - // than our timeout for input - // - $contents = ''; - $read = array($proc[1][1]); - $write = NULL; - $except = NULL; - if (stream_select($read, $write, $except, $timeout_seconds)) - while (!feof($proc[1][1])) $contents .= fread($proc[1][1], 8192); - return $contents; - -} - - -/** - * SquirrelMail wrapper for pclose()/proc_close() - * - * This is designed to be used with processes that were - * opened with sq_popen(), and will correctly close - * all pipes/handles that were opened as well as the - * child process itself. - * - * @param resource $handle The handle to the child process, - * as returned from sq_popen(). - * @param boolean $quiet When TRUE, errors are silently - * ignored (OPTIONAL; default is TRUE). - * - * @return int The termination status of the child process. - * - * @since 1.5.2 - * - */ -function sq_pclose($handle, $quiet=TRUE) { - - // yes, we are testing for proc_OPEN - // because we need to know how the - // handle was actually OPENED - // - if (!function_exists('proc_open')) - return pclose($handle); - - - // get our process out of the process store - // - global $processes; - if (!is_array($processes) || !isset($processes[$handle])) { - if (!quiet) { - plain_error_message(_("Failed to find corresponding open process handle")); - } - return 127; - } - $proc = $processes[$handle]; - unset($processes[$handle]); - - - // close all pipes - // - fclose($proc[1][0]); - fclose($proc[1][1]); - fclose($proc[1][2]); - - - // close process - // - return proc_close($proc[0]); - -} - - /** * Sanitize a value using htmlspecialchars() or similar, but also * recursively run htmlspecialchars() (or similar) on array keys