35use Wikimedia\AtEase\AtEase;
42use Wikimedia\RequestTimeout\RequestTimeout;
43use Wikimedia\Timestamp\ConvertibleTimestamp;
58$path =
"$wgExtensionDirectory/$ext/extension.json";
60 ExtensionRegistry::getInstance()->queue(
$path );
78 $registry = ExtensionRegistry::getInstance();
79foreach ( $exts as $ext ) {
80 $registry->queue(
"$wgExtensionDirectory/$ext/extension.json" );
95$path =
"$wgStyleDirectory/$skin/skin.json";
97 ExtensionRegistry::getInstance()->queue(
$path );
109 $registry = ExtensionRegistry::getInstance();
110foreach ( $skins as $skin ) {
111 $registry->queue(
"$wgStyleDirectory/$skin/skin.json" );
128 $comparator =
staticfunction ( $a, $b ):
int {
129if ( is_string( $a ) && is_string( $b ) ) {
130return strcmp( $a, $b );
132if ( !is_array( $a ) && !is_array( $b ) ) {
133thrownew InvalidArgumentException(
134'This function assumes that array elements are all strings or all arrays' 137if ( count( $a ) !== count( $b ) ) {
138return count( $a ) <=> count( $b );
142while ( key( $a ) !==
null && key( $b ) !==
null ) {
143 $valueA = current( $a );
144 $valueB = current( $b );
145 $cmp = strcmp( $valueA, $valueB );
155return array_udiff( $arr1, $arr2, $comparator );
181foreach ( $args as $errors ) {
182foreach ( $errors as $params ) {
183 $originalParams = $params;
185 $params = [ $params[0]->getKey(), ...$params[0]->getParams() ];
187 # @todo FIXME: Sometimes get nested arrays for $params, 188 # which leads to E_NOTICEs 189 $spec = implode(
"\t", $params );
190 $out[$spec] = $originalParams;
193return array_values( $out );
206// Find the offset of the element to insert after. 207 $keys = array_keys( $array );
208 $offsetByKey = array_flip( $keys );
210if ( !\array_key_exists( $after, $offsetByKey ) ) {
213 $offset = $offsetByKey[$after];
215// Insert at the specified offset 216 $before = array_slice( $array, 0, $offset + 1,
true );
217 $after = array_slice( $array, $offset + 1, count( $array ) - $offset,
true );
219 $output = $before + $insert + $after;
234if ( is_object( $objOrArray ) ) {
235 $objOrArray = get_object_vars( $objOrArray );
237foreach ( $objOrArray as $key => $value ) {
238if ( $recursive && ( is_object( $value ) || is_array( $value ) ) ) {
242 $array[$key] = $value;
259// The maximum random value is "only" 2^31-1, so get two random 260// values to reduce the chance of dupes 261 $max = mt_getrandmax() + 1;
262 $rand = number_format( ( mt_rand() * $max + mt_rand() ) / $max / $max, 12,
'.',
'' );
278for ( $n = 0; $n < $length; $n += 7 ) {
279 $str .= sprintf(
'%07x', mt_rand() & 0xfffffff );
281return substr( $str, 0, $length );
315// Reset $needle for testing. 320if ( $needle ===
null ) {
321 $needle = [
'%3B',
'%40',
'%24',
'%21',
'%2A',
'%28',
'%29',
'%2C',
'%2F',
'%7E' ];
322if ( !isset( $_SERVER[
'SERVER_SOFTWARE'] ) ||
323 !str_contains( $_SERVER[
'SERVER_SOFTWARE'],
'Microsoft-IIS/7' )
329 $s = urlencode( $s );
332 [
';',
'@',
'$',
'!',
'*',
'(',
')',
',',
'/',
'~',
':' ],
350if ( $array2 !==
null ) {
355foreach ( $array1 as $key => $value ) {
356if ( $value !==
null && $value !==
false ) {
360if ( $prefix !==
'' ) {
361 $key = $prefix .
"[$key]";
363if ( is_array( $value ) ) {
365foreach ( $value as $k => $v ) {
366 $cgi .= $firstTime ?
'' :
'&';
367if ( is_array( $v ) ) {
370 $cgi .= urlencode( $key .
"[$k]" ) .
'=' . urlencode( $v );
375if ( is_object( $value ) ) {
376 $value = $value->__toString();
378 $cgi .= urlencode( $key ) .
'=' . urlencode( $value );
395if ( isset( $query[0] ) && $query[0] ==
'?' ) {
396 $query = substr( $query, 1 );
398 $bits = explode(
'&', $query );
400foreach ( $bits as $bit ) {
404if ( strpos( $bit,
'=' ) ===
false ) {
405// Pieces like &qwerty become 'qwerty' => '' (at least this is what php does) 409 [ $key, $value ] = explode(
'=', $bit );
411 $key = urldecode( $key );
412 $value = urldecode( $value );
413if ( strpos( $key,
'[' ) !==
false ) {
414 $keys = array_reverse( explode(
'[', $key ) );
415 $key = array_pop( $keys );
417foreach ( $keys as $k ) {
418 $k = substr( $k, 0, -1 );
419 $temp = [ $k => $temp ];
421if ( isset( $ret[$key] ) && is_array( $ret[$key] ) ) {
422 $ret[$key] = array_merge( $ret[$key], $temp );
442if ( is_array( $query ) ) {
446// Remove the fragment, if there is one 448 $hashPos = strpos(
$url,
'#' );
449if ( $hashPos !==
false ) {
450 $fragment = substr(
$url, $hashPos );
455if ( strpos(
$url,
'?' ) ===
false ) {
462// Put the fragment back 463if ( $fragment !==
false ) {
479if ( MediaWikiServices::hasInstance() ) {
480 $services = MediaWikiServices::getInstance();
481if ( $services->hasService(
'UrlUtils' ) ) {
482return $services->getUrlUtils();
487// UrlUtils throws if the relevant $wg(|Canonical|Internal) variable is null, but the old 488// implementations implicitly converted it to an empty string (presumably by mistake). 489// Preserve the old behavior for compatibility. 561return UrlUtils::assemble( (array)$urlParts );
575return $includeProtocolRelative ?
wfGetUrlUtils()->validProtocols() :
671functionwfDebug( $text, $dest =
'all', array $context = [] ) {
678 $text = trim( $text );
683 $context[
'private'] = ( $dest ===
false || $dest ===
'private' );
685 $logger = LoggerFactory::getInstance(
'wfDebug' );
686 $logger->debug( $text, $context );
695if ( $cache !==
null ) {
698// Check for raw action using $_GET not $wgRequest, since the latter might not be initialised yet 699// phpcs:ignore MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals 700if ( ( isset( $_GET[
'action'] ) && $_GET[
'action'] ==
'raw' )
736 $logGroup, $text, $dest =
'all', array $context = []
738 $text = trim( $text );
740 $logger = LoggerFactory::getInstance( $logGroup );
741 $context[
'private'] = ( $dest ===
false || $dest ===
'private' );
742 $logger->info( $text, $context );
754 $logger = LoggerFactory::getInstance(
'wfLogDBError' );
755 $logger->error( trim( $text ), $context );
774functionwfDeprecated( $function, $version =
false, $component =
false, $callerOffset = 2 ) {
775if ( !is_string( $version ) && $version !==
false ) {
776thrownew InvalidArgumentException(
777"MediaWiki version must either be a string or false. " .
778"Example valid version: '1.33'" 782 MWDebug::deprecated( $function, $version, $component, $callerOffset + 1 );
805functionwfDeprecatedMsg( $msg, $version =
false, $component =
false, $callerOffset = 2 ) {
806 MWDebug::deprecatedMsg( $msg, $version, $component,
807 $callerOffset ===
false ?
false : $callerOffset + 1 );
820functionwfWarn( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
821 MWDebug::warning( $msg, $callerOffset + 1, $level,
'auto' );
833functionwfLogWarning( $msg, $callerOffset = 1, $level = E_USER_WARNING ) {
834 MWDebug::warning( $msg, $callerOffset + 1, $level,
'production' );
860if ( is_array( $key ) ) {
861// Fallback keys are not allowed in message specifiers 864 $message = Message::newFromSpecifier( $key );
867// We call Message::params() to reduce code duplication 869 $message->params( ...$params );
888return Message::newFallbackSequence( ...$keys );
900 # Fix windows line-endings 901 # Some messages are split with explode("\n", $msg) 902 $message = str_replace(
"\r",
'', $message );
905if ( is_array( $args ) && $args ) {
906if ( is_array( $args[0] ) ) {
907 $args = array_values( $args[0] );
909 $replacementKeys = [];
910foreach ( $args as $n => $param ) {
911 $replacementKeys[
'$' . ( $n + 1 )] = $param;
913 $message = strtr( $message, $replacementKeys );
928// Hostname overriding 934return php_uname(
'n' ) ?:
'unknown';
948static $disabled =
null;
950if ( $disabled ===
null ) {
951 $disabled = !function_exists(
'debug_backtrace' );
953wfDebug(
"debug_backtrace() is disabled" );
961return array_slice( debug_backtrace( DEBUG_BACKTRACE_PROVIDE_OBJECT, $limit + 1 ), 1 );
963return array_slice( debug_backtrace(), 1 );
978 $frameFormat =
"%s line %s calls %s()\n";
981 $frameFormat =
"<li>%s line %s calls %s()</li>\n";
982 $traceFormat =
"<ul>\n%s</ul>\n";
985 $frames = array_map(
staticfunction ( $frame ) use ( $frameFormat ) {
986 $file = !empty( $frame[
'file'] ) ? basename( $frame[
'file'] ) :
'-';
987 $line = $frame[
'line'] ??
'-';
988 $call = $frame[
'function'];
989if ( !empty( $frame[
'class'] ) ) {
990 $call = $frame[
'class'] . $frame[
'type'] . $call;
992return sprintf( $frameFormat, $file, $line, $call );
995return sprintf( $traceFormat, implode(
'', $frames ) );
1010if ( isset( $backtrace[$level] ) ) {
1026if ( !$limit || $limit > count( $trace ) - 1 ) {
1027 $limit = count( $trace ) - 1;
1029 $trace = array_slice( $trace, -$limit - 1, $limit );
1030return implode(
'/', array_map(
'wfFormatStackFrame', $trace ) );
1046if ( !isset( $frame[
'function'] ) ) {
1047return'NO_FUNCTION_GIVEN';
1049return isset( $frame[
'class'] ) && isset( $frame[
'type'] ) ?
1050 $frame[
'class'] . $frame[
'type'] . $frame[
'function'] :
1064static $result =
null;
1065if ( $result ===
null || $force ) {
1067if ( isset( $_SERVER[
'HTTP_ACCEPT_ENCODING'] ) ) {
1068 # @todo FIXME: We may want to disallow some broken browsers 1071'/\bgzip(?:;(q)=([0-9]+(?:\.[0-9]+)))?\b/',
1072 $_SERVER[
'HTTP_ACCEPT_ENCODING'],
1076if ( isset( $m[2] ) && ( $m[1] ==
'q' ) && ( $m[2] == 0 ) ) {
1079wfDebug(
"wfClientAcceptsGzip: client accepts gzip." );
1099static $repl =
null, $repl2 =
null, $repl3 =
null, $repl4 =
null;
1100if ( $repl ===
null || defined(
'MW_PHPUNIT_TEST' ) ) {
1101// Tests depend upon being able to change $wgEnableMagicLinks, so don't cache 1102// in those situations 1104'"' =>
'"',
'&' =>
'&',
"'" =>
''',
'<' =>
'<',
1105'=' =>
'=',
'>' =>
'>',
'[' =>
'[',
']' =>
']',
1106'{' =>
'{',
'|' =>
'|',
'}' =>
'}',
1107';' =>
';',
// a token inside language converter brackets 1108'!!' =>
'!!',
// a token inside table context 1109"\n!" =>
"\n!",
"\r!" =>
"\r!",
// a token inside table context 1110"\n#" =>
"\n#",
"\r#" =>
"\r#",
1111"\n*" =>
"\n*",
"\r*" =>
"\r*",
1112"\n:" =>
"\n:",
"\r:" =>
"\r:",
1113"\n " =>
"\n ",
"\r " =>
"\r ",
1114"\n\n" =>
"\n ",
"\r\n" =>
" \n",
1115"\n\r" =>
"\n ",
"\r\r" =>
"\r ",
1116"\n\t" =>
"\n	",
"\r\t" =>
"\r	",
// "\n\t\n" is treated like "\n\n" 1117"\n----" =>
"\n----",
"\r----" =>
"\r----",
1118'__' =>
'__',
'://' =>
'://',
1119'~~~' =>
'~~~',
// protect from PST, just to be safe(r) 1123// We have to catch everything "\s" matches in PCRE 1124foreach ( $magicLinks as $magic ) {
1125 $repl[
"$magic "] =
"$magic ";
1126 $repl[
"$magic\t"] =
"$magic	";
1127 $repl[
"$magic\r"] =
"$magic ";
1128 $repl[
"$magic\n"] =
"$magic ";
1129 $repl[
"$magic\f"] =
"$magic";
1131// Additionally escape the following characters at the beginning of the 1132// string, in case they merge to form tokens when spliced into a 1133// string. Tokens like -{ {{ [[ {| etc are already escaped because 1134// the second character is escaped above, but the following tokens 1135// are handled here: |+ |- __FOO__ ~~~ 1137'+' =>
'+',
'-' =>
'-',
'_' =>
'_',
'~' =>
'~',
1139// Similarly, protect the following characters at the end of the 1140// string, which could turn form the start of `__FOO__` or `~~~~` 1141// A trailing newline could also form the unintended start of a 1142// paragraph break if it is glued to a newline in the following 1145'_' =>
'_',
'~' =>
'~',
1146"\n" =>
" ",
"\r" =>
" ",
1147"\t" =>
"	",
// "\n\t\n" is treated like "\n\n" 1150// And handle protocols that don't use "://" 1154if ( substr( $prot, -1 ) ===
':' ) {
1155 $repl2[] = preg_quote( substr( $prot, 0, -1 ),
'/' );
1158 $repl2 = $repl2 ?
'/\b(' . implode(
'|', $repl2 ) .
'):/i' :
'/^(?!)/';
1160// Tell phan that $repl2, $repl3 and $repl4 will also be non-null here 1161'@phan-var string $repl2';
1162'@phan-var string $repl3';
1163'@phan-var string $repl4';
1164// This will also stringify input in case it's not a string 1165 $text = substr( strtr(
"\n$input", $repl ), 1 );
1169 $first = strtr( $text[0], $repl3 );
// protect first character 1170if ( strlen( $text ) > 1 ) {
1171 $text = $first . substr( $text, 1, -1 ) .
1172 strtr( substr( $text, -1 ), $repl4 );
// protect last character 1174// special case for single-character strings 1175 $text = strtr( $first, $repl4 );
// protect last character 1177 $text = preg_replace( $repl2,
'$1:', $text );
1193if (
$source !==
null || $force ) {
1209 $temp = (bool)( $dest & $bit );
1210if ( $state !==
null ) {
1228 $s = str_replace(
"\n",
"<br />\n", var_export( $var,
true ) .
"\n" );
1229if ( headers_sent() ||
$wgOut ===
null || !is_object(
$wgOut ) ) {
1245 HttpStatus::header( $code );
1248$wgOut->sendCacheControl();
1251 \MediaWiki\Request\HeaderCallback::warnIfHeadersSent();
1252 header(
'Content-type: text/html; charset=utf-8' );
1254 print
'<!DOCTYPE html>' .
1255'<html><head><title>' .
1256 htmlspecialchars( $label ) .
1257'</title><meta name="color-scheme" content="light dark" /></head><body><h1>' .
1258 htmlspecialchars( $label ) .
1260 nl2br( htmlspecialchars( $desc ) ) .
1261"</p></body></html>\n";
1262 header(
'Content-Length: ' . ob_get_length() );
1287// phpcs:ignore Generic.CodeAnalysis.AssignmentInCondition.FoundInWhileCondition 1288while ( $status = ob_get_status() ) {
1289if ( isset( $status[
'flags'] ) ) {
1290 $flags = PHP_OUTPUT_HANDLER_CLEANABLE | PHP_OUTPUT_HANDLER_REMOVABLE;
1291 $deleteable = ( $status[
'flags'] & $flags ) === $flags;
1292 } elseif ( isset( $status[
'del'] ) ) {
1293 $deleteable = $status[
'del'];
1295// Guess that any PHP-internal setting can't be removed. 1296 $deleteable = $status[
'type'] !== 0;
/* PHP_OUTPUT_HANDLER_INTERNAL */ 1298if ( !$deleteable ) {
1299// Give up, and hope the result doesn't break 1303if ( $status[
'name'] ===
'MediaWikiIntegrationTestCase::wfResetOutputBuffersBarrier' ) {
1304// Unit testing barrier to prevent this function from breaking PHPUnit. 1307if ( !ob_end_clean() ) {
1308// Could not remove output buffer handler; abort now 1309// to avoid getting in some kind of infinite loop. 1312if ( $resetGzipEncoding && $status[
'name'] ==
'ob_gzhandler' ) {
1313// Reset the 'Content-Encoding' field set by this handler 1314// so we can start fresh. 1315 header_remove(
'Content-Encoding' );
1332 $ret = ConvertibleTimestamp::convert( $outputtype, $ts );
1333if ( $ret ===
false ) {
1334wfDebug(
"wfTimestamp() fed bogus time value: TYPE=$outputtype; VALUE=$ts" );
1361return ConvertibleTimestamp::now( TS_MW );
1382return TempFSFile::getUsableTempDirectory();
1396if ( FileBackend::isStoragePath( $dir ) ) {
1397thrownew LogicException( __FUNCTION__ .
" given storage path '$dir'." );
1399if ( $caller !==
null ) {
1400wfDebug(
"$caller: called wfMkdirParents($dir)" );
1402if ( strval( $dir ) ===
'' ) {
1406 $dir = str_replace( [
'\\',
'/' ], DIRECTORY_SEPARATOR, $dir );
1409// Turn off the normal warning, we're doing our own below 1410// PHP doesn't include the path in its warning message, so we add our own to aid in diagnosis. 1412// Repeat existence check if creation failed so that we silently recover in case of 1413// a race condition where another request created it since the first check. 1415// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged 1416 $ok = is_dir( $dir ) || @mkdir( $dir, $mode,
true ) || is_dir( $dir );
1418 trigger_error( sprintf(
"failed to mkdir \"%s\" mode 0%o", $dir, $mode ), E_USER_WARNING );
1430// taken from https://www.php.net/manual/en/function.rmdir.php#98622 1431if ( is_dir( $dir ) ) {
1432 $objects = scandir( $dir );
1433foreach ( $objects as $object ) {
1434if ( $object !=
"." && $object !=
".." ) {
1435if ( filetype( $dir .
'/' . $object ) ==
"dir" ) {
1438 unlink( $dir .
'/' . $object );
1453 $accForFormat = $acc >= 0 ? $acc : 0;
1454 $ret = sprintf(
"%.{$accForFormat}f", $nr );
1455return $round ? round( (
float)$ret, $acc ) .
'%' :
"$ret%";
1498 $val = strtolower( $val );
1499// 'on' and 'true' can't have whitespace around them, but '1' can. 1503 || preg_match(
"/^\s*[+-]?0*[1-9]/", $val );
// approx C atoi() function 1520return Shell::escape( ...$args );
1548 $limits = [], $options = []
1550if ( Shell::isDisabled() ) {
1552// Backwards compatibility be upon us... 1553return'Unable to run external programs, proc_open() is disabled.';
1556if ( is_array( $cmd ) ) {
1557 $cmd = Shell::escape( $cmd );
1560 $includeStderr = isset( $options[
'duplicateStderr'] ) && $options[
'duplicateStderr'];
1561 $profileMethod = $options[
'profileMethod'] ??
wfGetCaller();
1564 $result = Shell::command( [] )
1565 ->unsafeParams( (array)$cmd )
1566 ->environment( $environ )
1568 ->includeStderr( $includeStderr )
1569 ->profileMethod( $profileMethod )
1571 ->restrict( Shell::RESTRICT_NONE )
1578 $retval = $result->getExitCode();
1580return $result->getStdout();
1601returnwfShellExec( $cmd, $retval, $environ, $limits,
1602 [
'duplicateStderr' =>
true,
'profileMethod' =>
wfGetCaller() ] );
1622// Give site config file a chance to run the script in a wrapper. 1623// The caller may likely want to call wfBasename() on $script. 1624 (
newHookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
1625 ->onWfShellWikiCmd( $script, $parameters, $options );
1627if ( isset( $options[
'wrapper'] ) ) {
1628 $cmd[] = $options[
'wrapper'];
1631// Escape each parameter for shell 1632return Shell::escape( array_merge( $cmd, $parameters ) );
1655 ?
string &$simplisticMergeAttempt,
1656 ?
string &$mergeLeftovers =
null 1660 # This check may also protect against code injection in 1661 # case of broken installations. 1662 AtEase::suppressWarnings();
1664 AtEase::restoreWarnings();
1671 # Make temporary files 1673 $oldtextFile = fopen( $oldtextName = tempnam( $td,
'merge-old-' ),
'w' );
1674 $mytextFile = fopen( $mytextName = tempnam( $td,
'merge-mine-' ),
'w' );
1675 $yourtextFile = fopen( $yourtextName = tempnam( $td,
'merge-your-' ),
'w' );
1677 # NOTE: diff3 issues a warning to stderr if any of the files does not end with 1678 # a newline character. To avoid this, we normalize the trailing whitespace before 1679 # creating the diff. 1681 fwrite( $oldtextFile, rtrim( $old ) .
"\n" );
1682 fclose( $oldtextFile );
1683 fwrite( $mytextFile, rtrim( $mine ) .
"\n" );
1684 fclose( $mytextFile );
1685 fwrite( $yourtextFile, rtrim( $yours ) .
"\n" );
1686 fclose( $yourtextFile );
1688 # Check for a conflict 1689 $cmd = Shell::escape(
$wgDiff3,
'--text',
'--overlap-only', $mytextName,
1690 $oldtextName, $yourtextName );
1691 $handle = popen( $cmd,
'r' );
1693 $mergeLeftovers =
'';
1695 $data = fread( $handle, 8192 );
1696if ( $data ===
false || $data ===
'' ) {
1699 $mergeLeftovers .= $data;
1703 $conflict = $mergeLeftovers !==
'';
1705 # Merge differences automatically where possible, preferring "my" text for conflicts. 1706 $cmd = Shell::escape(
$wgDiff3,
'--text',
'--ed',
'--merge', $mytextName,
1707 $oldtextName, $yourtextName );
1708 $handle = popen( $cmd,
'r' );
1709 $simplisticMergeAttempt =
'';
1711 $data = fread( $handle, 8192 );
1712if ( $data ===
false || $data ===
'' ) {
1715 $simplisticMergeAttempt .= $data;
1718 unlink( $mytextName );
1719 unlink( $oldtextName );
1720 unlink( $yourtextName );
1722if ( $simplisticMergeAttempt ===
'' && $old !==
'' && !$conflict ) {
1723wfDebug(
"Unexpected null result from diff3. Command: $cmd" );
1742if ( $suffix ==
'' ) {
1745 $encSuffix =
'(?:' . preg_quote( $suffix,
'#' ) .
')?';
1749if ( preg_match(
"#([^/\\\\]*?){$encSuffix}[/\\\\]*$#",
$path,
$matches ) ) {
1766// Normalize mixed input on Windows... 1767$path = str_replace(
'/', DIRECTORY_SEPARATOR,
$path );
1768 $from = str_replace(
'/', DIRECTORY_SEPARATOR, $from );
1770// Trim trailing slashes -- fix for drive root 1772 $from = rtrim( $from, DIRECTORY_SEPARATOR );
1774 $pieces = explode( DIRECTORY_SEPARATOR, dirname(
$path ) );
1775 $against = explode( DIRECTORY_SEPARATOR, $from );
1777if ( $pieces[0] !== $against[0] ) {
1778// Non-matching Windows drive letters? 1779// Return a full path. 1783// Trim off common prefix 1784while ( count( $pieces ) && count( $against )
1785 && $pieces[0] == $against[0] ) {
1786 array_shift( $pieces );
1787 array_shift( $against );
1790// relative dots to bump us to the parent 1791while ( count( $against ) ) {
1792 array_unshift( $pieces,
'..' );
1793 array_shift( $against );
1798return implode( DIRECTORY_SEPARATOR, $pieces );
1812if ( $script ===
'index' ) {
1814 } elseif ( $script ===
'load' ) {
1817return"{$wgScriptPath}/{$script}.php";
1829return $value ?
'true' :
'false';
1852 $name = preg_replace(
1853"/[^" . Title::legalChars() .
"]" . $illegalFileChars .
"/",
1857// $wgIllegalFileChars may not include '/' and '\', so we still need to do this 1870// If the INI config is already unlimited, there is nothing larger 1871if ( $oldLimit != -1 ) {
1873if ( $newLimit == -1 ) {
1874wfDebug(
"Removing PHP's memory limit" );
1875 AtEase::suppressWarnings();
1876 ini_set(
'memory_limit', $newLimit );
1877 AtEase::restoreWarnings();
1878 } elseif ( $newLimit > $oldLimit ) {
1879wfDebug(
"Raising PHP's memory limit to $newLimit bytes" );
1880 AtEase::suppressWarnings();
1881 ini_set(
'memory_limit', $newLimit );
1882 AtEase::restoreWarnings();
1896 $timeout = RequestTimeout::singleton();
1897 $timeLimit = $timeout->getWallTimeLimit();
1898if ( $timeLimit !== INF ) {
1899// RequestTimeout library is active 1904// Fallback case, likely $wgRequestTimeLimit === null 1905 $timeLimit = (int)ini_get(
'max_execution_time' );
1906// Note that CLI scripts use 0 1911 ignore_user_abort(
true );
// ignore client disconnects 1924 $string = trim( $string ??
'' );
1925if ( $string ===
'' ) {
1928 $last = $string[strlen( $string ) - 1];
1929 $val = intval( $string );
1934// break intentionally missing 1938// break intentionally missing 1955// The INFINITY_VALS are hardcoded elsewhere in MediaWiki (e.g. mediawiki.special.block.js). 1956return in_array( $str, ExpiryDef::INFINITY_VALS );
1976 $multipliers = [ 1 ];
1978// These available sizes are hardcoded currently elsewhere in MediaWiki. 1979// @see Linker::processResponsiveImages 1980 $multipliers[] = 1.5;
1985if ( !$handler || !isset( $params[
'width'] ) ) {
1990if ( isset( $params[
'page'] ) ) {
1991 $basicParams[
'page'] = $params[
'page'];
1996// Expand limits to account for multipliers 1997foreach ( $multipliers as $multiplier ) {
1998 $thumbLimits = array_merge( $thumbLimits, array_map(
1999staticfunction ( $width ) use ( $multiplier ) {
2000return round( $width * $multiplier );
2003 $imageLimits = array_merge( $imageLimits, array_map(
2004staticfunction ( $pair ) use ( $multiplier ) {
2006 round( $pair[0] * $multiplier ),
2007 round( $pair[1] * $multiplier ),
2013// Check if the width matches one of $wgThumbLimits 2014if ( in_array( $params[
'width'], $thumbLimits ) ) {
2015 $normalParams = $basicParams + [
'width' => $params[
'width'] ];
2016// Append any default values to the map (e.g. "lossy", "lossless", ...) 2017 $handler->normaliseParams( $file, $normalParams );
2019// If not, then check if the width matches one of $wgImageLimits 2021foreach ( $imageLimits as $pair ) {
2022 $normalParams = $basicParams + [
'width' => $pair[0],
'height' => $pair[1] ];
2023// Decide whether the thumbnail should be scaled on width or height. 2024// Also append any default values to the map (e.g. "lossy", "lossless", ...) 2025 $handler->normaliseParams( $file, $normalParams );
2026// Check if this standard thumbnail size maps to the given width 2027if ( $normalParams[
'width'] == $params[
'width'] ) {
2033returnfalse;
// not standard for description pages 2037// Check that the given values for non-page, non-width, params are just defaults 2038foreach ( $params as $key => $value ) {
2039if ( !isset( $normalParams[$key] ) || $normalParams[$key] != $value ) {
2060// First merge items that are in both arrays 2061foreach ( $baseArray as $name => &$groupVal ) {
2062if ( isset( $newValues[$name] ) ) {
2063 $groupVal += $newValues[$name];
2066// Now add items that didn't exist yet 2067 $baseArray += $newValues;
wfIsWindows()
Check if the operating system is Windows.
wfThumbIsStandard(File $file, array $params)
Returns true if these thumbnail parameters match one that MediaWiki requests from file description pa...
wfVarDump( $var)
A wrapper around the PHP function var_export().
wfDebug( $text, $dest='all', array $context=[])
Sends a line to the debug log if enabled or, optionally, to a comment in output.
wfRandom()
Get a random decimal value in the domain of [0, 1), in a way not likely to give duplicate values for ...
wfUrlencode( $s)
We want some things to be included as literal characters in our title URLs for prettiness,...
wfParseUrl( $url)
parse_url() work-alike, but non-broken.
wfTempDir()
Tries to get the system directory for temporary files.
wfWarn( $msg, $callerOffset=1, $level=E_USER_NOTICE)
Send a warning either to the debug log or in a PHP error depending on $wgDevelopmentWarnings.
wfRandomString( $length=32)
Get a random string containing a number of pseudo-random hex characters.
wfTimestampOrNull( $outputtype=TS_UNIX, $ts=null)
Return a formatted timestamp, or null if input is null.
wfBaseName( $path, $suffix='')
Return the final portion of a pathname.
wfTimestampNow()
Convenience function; returns MediaWiki timestamp for the present time.
wfClientAcceptsGzip( $force=false)
Whether the client accept gzip encoding.
wfEscapeShellArg(... $args)
Locale-independent version of escapeshellarg()
wfLogDBError( $text, array $context=[])
Log for database errors.
wfLoadSkins(array $skins)
Load multiple skins at once.
wfEscapeWikiText( $input)
Escapes the given text so that it may be output using addWikiText() without any linking,...
wfUrlProtocolsWithoutProtRel()
Like wfUrlProtocols(), but excludes '//' from the protocol list.
wfRecursiveRemoveDir( $dir)
Remove a directory and all its content.
wfLoadExtension( $ext, $path=null)
Load an extension.
wfMemoryLimit( $newLimit)
Raise PHP's memory limit (if needed).
wfSetBit(&$dest, $bit, $state=true)
As for wfSetVar except setting a bit.
wfIniGetBool( $setting)
Safety wrapper around ini_get() for boolean settings.
wfShorthandToInteger(?string $string='', int $default=-1)
Converts shorthand byte notation to integer form.
wfBacktrace( $raw=null)
Get a debug backtrace as a string.
wfArrayDiff2( $arr1, $arr2)
Like array_diff( $arr1, $arr2 ) except that it works with two-dimensional arrays.
wfGetCaller( $level=2)
Get the name of the function which called this function wfGetCaller( 1 ) is the function with the wfG...
wfExpandIRI( $url)
Take a URL, make sure it's expanded to fully qualified, and replace any encoded non-ASCII Unicode cha...
wfMergeErrorArrays(... $args)
Merge arrays in the style of PermissionManager::getPermissionErrors, with duplicate removal e....
wfDeprecatedMsg( $msg, $version=false, $component=false, $callerOffset=2)
Log a deprecation warning with arbitrary message text.
wfShellExec( $cmd, &$retval=null, $environ=[], $limits=[], $options=[])
Execute a shell command, with time and memory limits mirrored from the PHP configuration if supported...
wfIsDebugRawPage()
Returns true if debug logging should be suppressed if $wgDebugRawPage = false.
wfHostname()
Get host name of the current machine, for use in error reporting.
wfExpandUrl( $url, $defaultProto=PROTO_CURRENT)
Expand a potentially local URL to a fully-qualified URL using $wgServer (or one of its alternatives).
wfShellWikiCmd( $script, array $parameters=[], array $options=[])
Generate a shell-escaped command line string to run a MediaWiki cli script.
wfPercent( $nr, int $acc=2, bool $round=true)
wfSetVar(&$dest, $source, $force=false)
Sets dest to source and returns the original value of dest If source is NULL, it just returns the val...
wfShellExecWithStderr( $cmd, &$retval=null, $environ=[], $limits=[])
Execute a shell command, returning both stdout and stderr.
wfGetNull()
Get a platform-independent path to the null file, e.g.
wfRelativePath( $path, $from)
Generate a relative path name to the given file.
wfHttpError( $code, $label, $desc)
Provide a simple HTTP error.
wfUrlProtocols( $includeProtocolRelative=true)
Returns a partial regular expression of recognized URL protocols, e.g.
wfMessageFallback(... $keys)
This function accepts multiple message keys and returns a message instance for the first message whic...
wfMerge(string $old, string $mine, string $yours, ?string &$simplisticMergeAttempt, ?string &$mergeLeftovers=null)
wfMerge attempts to merge differences between three texts.
wfGetAllCallers( $limit=3)
Return a string consisting of callers in the stack.
wfArrayPlus2d(array $baseArray, array $newValues)
Merges two (possibly) 2 dimensional arrays into the target array ($baseArray).
wfLogWarning( $msg, $callerOffset=1, $level=E_USER_WARNING)
Send a warning as a PHP error and the debug log.
wfTransactionalTimeLimit()
Raise the request time limit to $wgTransactionalTimeLimit.
wfDebugLog( $logGroup, $text, $dest='all', array $context=[])
Send a line to a supplementary debug log file, if configured, or main debug log if not.
wfObjectToArray( $objOrArray, $recursive=true)
Recursively converts the parameter (an object) to an array with the same data.
wfLoadSkin( $skin, $path=null)
Load a skin.
wfMsgReplaceArgs( $message, $args)
Replace message parameter keys on the given formatted output.
wfGetServerUrl( $proto)
Get the wiki's "server", i.e.
wfStringToBool( $val)
Convert string value to boolean, when the following are interpreted as true:
wfDebugBacktrace( $limit=0)
Safety wrapper for debug_backtrace().
wfAppendQuery( $url, $query)
Append a query string to an existing URL, which may or may not already have query string parameters a...
wfStripIllegalFilenameChars( $name)
Replace all invalid characters with '-'.
wfFormatStackFrame( $frame)
Return a string representation of frame.
wfArrayToCgi( $array1, $array2=null, $prefix='')
This function takes one or two arrays as input, and returns a CGI-style string, e....
wfScript( $script='index')
Get the URL path to a MediaWiki entry point.
wfCgiToArray( $query)
This is the logical opposite of wfArrayToCgi(): it accepts a query string as its argument and returns...
wfMatchesDomainList( $url, $domains)
Check whether a given URL has a domain that occurs in a given set of domains.
wfIsInfinity( $str)
Determine input string is represents as infinity.
wfMkdirParents( $dir, $mode=null, $caller=null)
Make directory, and make all parent directories if they don't exist.
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
wfLoadExtensions(array $exts)
Load multiple extensions at once.
wfBoolToStr( $value)
Convenience function converts boolean values into "true" or "false" (string) values.
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
wfDeprecated( $function, $version=false, $component=false, $callerOffset=2)
Logs a warning that a deprecated feature was used.
wfArrayInsertAfter(array $array, array $insert, $after)
Insert an array into another array after the specified key.
wfAssembleUrl( $urlParts)
This function will reassemble a URL parsed with wfParseURL.
wfResetOutputBuffers( $resetGzipEncoding=true)
Clear away any user-level output buffers, discarding contents.
if(!defined( 'MW_NO_SESSION') &&MW_ENTRY_POINT !=='cli' $wgOut
Implements some public methods and some protected utility functions which are required by multiple ch...
getHandler()
Get a MediaHandler instance for this file.
This class provides an implementation of the core hook interfaces, forwarding hook calls to HookConta...
Create PSR-3 logger objects.
Service locator for MediaWiki core services.
The Message class deals with fetching and processing of interface message into a variety of formats.
Load JSON files, and uses a Processor to extract information.
The WebRequest class encapsulates getting at data passed in the URL or via a POSTed form,...
Represents a title within MediaWiki.
A service to expand, parse, and otherwise manipulate URLs.
expand(string $url, $defaultProto=PROTO_FALLBACK)
Expand a potentially local URL to a fully-qualified URL using $wgServer (or one of its alternatives).
This class is used to hold the location and do limited manipulation of files stored temporarily (this...
Base class for all file backend classes (including multi-write backends).
Value object representing a message parameter that consists of a list of values.
Type definition for expiry timestamps.
$wgScript
Config variable stub for the Script setting, for use by phpdoc and IDEs.
$wgInternalServer
Config variable stub for the InternalServer setting, for use by phpdoc and IDEs.
$wgThumbLimits
Config variable stub for the ThumbLimits setting, for use by phpdoc and IDEs.
$wgDebugLogPrefix
Config variable stub for the DebugLogPrefix setting, for use by phpdoc and IDEs.
$wgPhpCli
Config variable stub for the PhpCli setting, for use by phpdoc and IDEs.
$wgOverrideHostname
Config variable stub for the OverrideHostname setting, for use by phpdoc and IDEs.
$wgImageLimits
Config variable stub for the ImageLimits setting, for use by phpdoc and IDEs.
$wgTmpDirectory
Config variable stub for the TmpDirectory setting, for use by phpdoc and IDEs.
$wgStyleDirectory
Config variable stub for the StyleDirectory setting, for use by phpdoc and IDEs.
$wgTransactionalTimeLimit
Config variable stub for the TransactionalTimeLimit setting, for use by phpdoc and IDEs.
$wgIllegalFileChars
Config variable stub for the IllegalFileChars setting, for use by phpdoc and IDEs.
$wgDirectoryMode
Config variable stub for the DirectoryMode setting, for use by phpdoc and IDEs.
$wgDiff3
Config variable stub for the Diff3 setting, for use by phpdoc and IDEs.
$wgUrlProtocols
Config variable stub for the UrlProtocols setting, for use by phpdoc and IDEs.
$wgResponsiveImages
Config variable stub for the ResponsiveImages setting, for use by phpdoc and IDEs.
$wgDebugRawPage
Config variable stub for the DebugRawPage setting, for use by phpdoc and IDEs.
$wgEnableMagicLinks
Config variable stub for the EnableMagicLinks setting, for use by phpdoc and IDEs.
$wgScriptPath
Config variable stub for the ScriptPath setting, for use by phpdoc and IDEs.
$wgExtensionDirectory
Config variable stub for the ExtensionDirectory setting, for use by phpdoc and IDEs.
$wgLoadScript
Config variable stub for the LoadScript setting, for use by phpdoc and IDEs.
$wgCanonicalServer
Config variable stub for the CanonicalServer setting, for use by phpdoc and IDEs.
$wgServer
Config variable stub for the Server setting, for use by phpdoc and IDEs.
$wgHttpsPort
Config variable stub for the HttpsPort setting, for use by phpdoc and IDEs.