X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FGlobalFunctions.php;h=089ed81d7825cc8eaf0060d01bf51e2d9e08a544;hb=5604684b4420048b6f0db29daf5b6ae7d600b446;hp=1859c02e43c941861644073f901e73d1c9acad08;hpb=d41a6afe00783f0ad3344b7edabdc1c8eca9478d;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index 1859c02e43..089ed81d78 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -203,6 +203,38 @@ function wfArrayDiff2_cmp( $a, $b ) { } } +/** + * Like array_filter with ARRAY_FILTER_USE_BOTH, but works pre-5.6. + * + * @param array $arr + * @param callable $callback Will be called with the array value and key (in that order) and + * should return a bool which will determine whether the array element is kept. + * @return array + */ +function wfArrayFilter( array $arr, callable $callback ) { + if ( defined( 'ARRAY_FILTER_USE_BOTH' ) ) { + return array_filter( $arr, $callback, ARRAY_FILTER_USE_BOTH ); + } + $filteredKeys = array_filter( array_keys( $arr ), function ( $key ) use ( $arr, $callback ) { + return call_user_func( $callback, $arr[$key], $key ); + } ); + return array_intersect_key( $arr, array_fill_keys( $filteredKeys, true ) ); +} + +/** + * Like array_filter with ARRAY_FILTER_USE_KEY, but works pre-5.6. + * + * @param array $arr + * @param callable $callback Will be called with the array key and should return a bool which + * will determine whether the array element is kept. + * @return array + */ +function wfArrayFilterByKey( array $arr, callable $callback ) { + return wfArrayFilter( $arr, function ( $val, $key ) use ( $callback ) { + return call_user_func( $callback, $key ); + } ); +} + /** * Appends to second array if $value differs from that in $default * @@ -811,10 +843,24 @@ function wfUrlProtocolsWithoutProtRel() { * 1) Does not raise warnings on bad URLs (just returns false). * 2) Handles protocols that don't use :// (e.g., mailto: and news:, as well as * protocol-relative URLs) correctly. - * 3) Adds a "delimiter" element to the array, either '://', ':' or '//' (see (2)). + * 3) Adds a "delimiter" element to the array (see (2)). + * 4) Verifies that the protocol is on the $wgUrlProtocols whitelist. + * 5) Rejects some invalid URLs that parse_url doesn't, e.g. the empty string or URLs starting with + * a line feed character. * * @param string $url A URL to parse - * @return string[]|bool Bits of the URL in an associative array, per PHP docs, false on failure + * @return string[]|bool Bits of the URL in an associative array, or false on failure. + * Possible fields: + * - scheme: URI scheme (protocol), e.g. 'http', 'mailto'. Lowercase, always present, but can + * be an empty string for protocol-relative URLs. + * - delimiter: either '://', ':' or '//'. Always present. + * - host: domain name / IP. Always present, but could be an empty string, e.g. for file: URLs. + * - user: user name, e.g. for HTTP Basic auth URLs such as http://user:pass@example.com/ + * Missing when there is no username. + * - pass: password, same as above. + * - path: path including the leading /. Will be missing when empty (e.g. 'http://example.com') + * - query: query string (as a string; see wfCgiToArray() for parsing it), can be missing. + * - fragment: the part after #, can be missing. */ function wfParseUrl( $url ) { global $wgUrlProtocols; // Allow all protocols defined in DefaultSettings/LocalSettings.php @@ -1191,7 +1237,8 @@ function wfLogProfilingData() { $profiler->logData(); $config = $context->getConfig(); - if ( $config->get( 'StatsdServer' ) ) { + $stats = MediaWikiServices::getInstance()->getStatsdDataFactory(); + if ( $config->get( 'StatsdServer' ) && $stats->hasData() ) { try { $statsdServer = explode( ':', $config->get( 'StatsdServer' ) ); $statsdHost = $statsdServer[0]; @@ -1199,9 +1246,7 @@ function wfLogProfilingData() { $statsdSender = new SocketSender( $statsdHost, $statsdPort ); $statsdClient = new SamplingStatsdClient( $statsdSender, true, false ); $statsdClient->setSamplingRates( $config->get( 'StatsdSamplingRates' ) ); - $statsdClient->send( - MediaWikiServices::getInstance()->getStatsdDataFactory()->getBuffer() - ); + $statsdClient->send( $stats->getData() ); } catch ( Exception $ex ) { MWExceptionHandler::logException( $ex ); } @@ -2193,8 +2238,6 @@ function wfIniGetBool( $setting ) { * @return string */ function wfEscapeShellArg( /*...*/ ) { - wfInitShellLocale(); - $args = func_get_args(); if ( count( $args ) === 1 && is_array( reset( $args ) ) ) { // If only one argument has been passed, and that argument is an array, @@ -2309,8 +2352,6 @@ function wfShellExec( $cmd, &$retval = null, $environ = [], $includeStderr = isset( $options['duplicateStderr'] ) && $options['duplicateStderr']; $profileMethod = isset( $options['profileMethod'] ) ? $options['profileMethod'] : wfGetCaller(); - wfInitShellLocale(); - $envcmd = ''; foreach ( $environ as $k => $v ) { if ( wfIsWindows() ) { @@ -2534,25 +2575,14 @@ function wfShellExecWithStderr( $cmd, &$retval = null, $environ = [], $limits = } /** - * Set the locale for locale-sensitive operations + * Formerly set the locale for locale-sensitive operations * - * Sets LC_ALL to a known value to work around issues like the following: - * - https://bugs.php.net/bug.php?id=45132 escapeshellarg() destroys non-ASCII - * characters if LANG is not a UTF-8 locale - * - T107128 Scribunto string comparison works case insensitive while the - * standard Lua case sensitive + * This is now done in Setup.php. * + * @deprecated since 1.30, no longer needed * @see $wgShellLocale */ function wfInitShellLocale() { - static $done = false; - if ( $done ) { - return; - } - $done = true; - global $wgShellLocale; - putenv( "LC_ALL=$wgShellLocale" ); - setlocale( LC_ALL, $wgShellLocale ); } /** @@ -3515,7 +3545,9 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) { } $cache = ObjectCache::getLocalServerInstance( 'hash' ); - $key = wfMemcKey( 'bad-image-list', ( $blacklist === null ) ? 'default' : md5( $blacklist ) ); + $key = $cache->makeKey( + 'bad-image-list', ( $blacklist === null ) ? 'default' : md5( $blacklist ) + ); $badImages = $cache->get( $key ); if ( $badImages === false ) { // cache miss