X-Git-Url: https://git.cyclocoop.org/%7B%24www_url%7Dadmin/compta/banques/ajouter.php?a=blobdiff_plain;f=includes%2FGlobalFunctions.php;h=b421f96caa08823415b073834b071dcda4fc0f40;hb=a303296f2730d6279a249bde77f3e0b9b42e494f;hp=d4226aa651bf20fca2952c6b3bb0e873b48ba463;hpb=b203ec5fcd8a63019caeb802ce251d060d5a1eb6;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index d4226aa651..b421f96caa 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -30,7 +30,6 @@ use MediaWiki\Session\SessionManager; // Hide compatibility functions from Doxygen /// @cond - /** * Compatibility functions * @@ -223,17 +222,17 @@ function wfAppendToArrayIfNotDefault( $key, $value, $default, &$changed ) { * Merge arrays in the style of getUserPermissionsErrors, with duplicate removal * e.g. * wfMergeErrorArrays( - * array( array( 'x' ) ), - * array( array( 'x', '2' ) ), - * array( array( 'x' ) ), - * array( array( 'y' ) ) + * [ [ 'x' ] ], + * [ [ 'x', '2' ] ], + * [ [ 'x' ] ], + * [ [ 'y' ] ] * ); * returns: - * array( - * array( 'x', '2' ), - * array( 'x' ), - * array( 'y' ) - * ) + * [ + * [ 'x', '2' ], + * [ 'x' ], + * [ 'y' ] + * ] * * @param array $array1,... * @return array @@ -501,12 +500,26 @@ function wfAppendQuery( $url, $query ) { $query = wfArrayToCgi( $query ); } if ( $query != '' ) { + // Remove the fragment, if there is one + $fragment = false; + $hashPos = strpos( $url, '#' ); + if ( $hashPos !== false ) { + $fragment = substr( $url, $hashPos ); + $url = substr( $url, 0, $hashPos ); + } + + // Add parameter if ( false === strpos( $url, '?' ) ) { $url .= '?'; } else { $url .= '&'; } $url .= $query; + + // Put the fragment back + if ( $fragment !== false ) { + $url .= $fragment; + } } return $url; } @@ -798,7 +811,7 @@ function wfUrlProtocolsWithoutProtRel() { * 3) Adds a "delimiter" element to the array, either '://', ':' or '//' (see (2)). * * @param string $url A URL to parse - * @return string[] Bits of the URL in an associative array, per PHP docs + * @return string[]|bool Bits of the URL in an associative array, per PHP docs, false on failure */ function wfParseUrl( $url ) { global $wgUrlProtocols; // Allow all protocols defined in DefaultSettings/LocalSettings.php @@ -814,7 +827,7 @@ function wfParseUrl( $url ) { $bits = parse_url( $url ); MediaWiki\restoreWarnings(); // parse_url() returns an array without scheme for some invalid URLs, e.g. - // parse_url("%0Ahttp://example.com") == array( 'host' => '%0Ahttp', 'path' => 'example.com' ) + // parse_url("%0Ahttp://example.com") == [ 'host' => '%0Ahttp', 'path' => 'example.com' ] if ( !$bits || !isset( $bits['scheme'] ) ) { return false; } @@ -2121,6 +2134,24 @@ function wfTempDir() { return $tmp; } } + + /** + * PHP on Windows will detect C:\Windows\Temp as not writable even though PHP can write to it + * so create a directory within that called 'mwtmp' with a suffix of the user running the + * current process. + * The user is included as if various scripts are run by different users they will likely + * not be able to access each others temporary files. + */ + if ( wfIsWindows() ) { + $tmp = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'mwtmp' . '-' . get_current_user(); + if ( !file_exists( $tmp ) ) { + mkdir( $tmp ); + } + if ( file_exists( $tmp ) && is_dir( $tmp ) && is_writable( $tmp ) ) { + return $tmp; + } + } + throw new MWException( 'No writable temporary directory could be found. ' . 'Please set $wgTmpDirectory to a writable directory.' ); } @@ -2426,6 +2457,15 @@ function wfShellExec( $cmd, &$retval = null, $environ = [], } wfDebug( "wfShellExec: $cmd\n" ); + // Don't try to execute commands that exceed Linux's MAX_ARG_STRLEN. + // Other platforms may be more accomodating, but we don't want to be + // accomodating, because very long commands probably include user + // input. See T129506. + if ( strlen( $cmd ) > SHELL_MAX_ARG_STRLEN ) { + throw new Exception( __METHOD__ . + '(): total length of $cmd must not exceed SHELL_MAX_ARG_STRLEN' ); + } + $desc = [ 0 => [ 'file', 'php://stdin', 'r' ], 1 => [ 'pipe', 'w' ], @@ -2460,14 +2500,6 @@ function wfShellExec( $cmd, &$retval = null, $environ = [], $eintr = defined( 'SOCKET_EINTR' ) ? SOCKET_EINTR : 4; $eintrMessage = "stream_select(): unable to select [$eintr]"; - // Build a table mapping resource IDs to pipe FDs to work around a - // PHP 5.3 issue in which stream_select() does not preserve array keys - // . - $fds = []; - foreach ( $pipes as $fd => $pipe ) { - $fds[(int)$pipe] = $fd; - } - $running = true; $timeout = null; $numReadyPipes = 0; @@ -2500,9 +2532,8 @@ function wfShellExec( $cmd, &$retval = null, $environ = [], break; } } - foreach ( $readyPipes as $pipe ) { + foreach ( $readyPipes as $fd => $pipe ) { $block = fread( $pipe, 65536 ); - $fd = $fds[(int)$pipe]; if ( $block === '' ) { // End of file fclose( $pipes[$fd] ); @@ -2920,7 +2951,7 @@ function wfRelativePath( $path, $from ) { * Supports base 2 through 36; digit values 10-36 are represented * as lowercase letters a-z. Input is case-insensitive. * - * @deprecated 1.27 Use Wikimedia\base_convert() directly + * @deprecated since 1.27 Use Wikimedia\base_convert() directly * * @param string $input Input number * @param int $sourceBase Base of the input number @@ -3320,9 +3351,9 @@ function wfCountDown( $seconds ) { } /** - * Replace all invalid characters with - - * Additional characters can be defined in $wgIllegalFileChars (see bug 20489) - * By default, $wgIllegalFileChars = ':' + * Replace all invalid characters with '-'. + * Additional characters can be defined in $wgIllegalFileChars (see T22489). + * By default, $wgIllegalFileChars includes ':', '/', '\'. * * @param string $name Filename to process * @return string @@ -3330,12 +3361,13 @@ function wfCountDown( $seconds ) { function wfStripIllegalFilenameChars( $name ) { global $wgIllegalFileChars; $illegalFileChars = $wgIllegalFileChars ? "|[" . $wgIllegalFileChars . "]" : ''; - $name = wfBaseName( $name ); $name = preg_replace( "/[^" . Title::legalChars() . "]" . $illegalFileChars . "/", '-', $name ); + // $wgIllegalFileChars may not include '/' and '\', so we still need to do this + $name = wfBaseName( $name ); return $name; } @@ -3494,7 +3526,7 @@ function wfGetParserCacheStorage() { * @param string|null $deprecatedVersion Optionally mark hook as deprecated with version number * * @return bool True if no handler aborted the hook - * @deprecated 1.25 - use Hooks::run + * @deprecated since 1.25 - use Hooks::run */ function wfRunHooks( $event, array $args = [], $deprecatedVersion = null ) { return Hooks::run( $event, $args, $deprecatedVersion );