X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FGlobalFunctions.php;h=eda636a99655dcde064d301a44c4f54ba156baee;hb=a0e11fff0c12b73aa2d9083b32a066f61e55399e;hp=e30b3715cf8d3da5853ea4f595dd153f21508817;hpb=25d33bacb3496e9acb6ec0d7147b48a6a552c81d;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index e30b3715cf..eda636a996 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -26,6 +26,7 @@ if ( !defined( 'MEDIAWIKI' ) ) { use Liuggio\StatsdClient\Sender\SocketSender; use MediaWiki\Logger\LoggerFactory; +use MediaWiki\Session\SessionManager; // Hide compatibility functions from Doxygen /// @cond @@ -1038,7 +1039,12 @@ function wfMatchesDomainList( $url, $domains ) { * @since 1.25 support for additional context data * * @param string $text - * @param string|bool $dest Unused + * @param string|bool $dest Destination of the message: + * - 'all': both to the log and HTML (debug toolbar or HTML comments) + * - 'private': excluded from HTML output + * For backward compatibility, it can also take a boolean: + * - true: same as 'all' + * - false: same as 'private' * @param array $context Additional logging context data */ function wfDebug( $text, $dest = 'all', array $context = array() ) { @@ -1065,6 +1071,7 @@ function wfDebug( $text, $dest = 'all', array $context = array() ) { if ( $wgDebugLogPrefix !== '' ) { $context['prefix'] = $wgDebugLogPrefix; } + $context['private'] = ( $dest === false || $dest === 'private' ); $logger = LoggerFactory::getInstance( 'wfDebug' ); $logger->debug( $text, $context ); @@ -1126,7 +1133,6 @@ function wfDebugMem( $exact = false ) { * @param string $text * @param string|bool $dest Destination of the message: * - 'all': both to the log and HTML (debug toolbar or HTML comments) - * - 'log': only to the log and not in HTML * - 'private': only to the specific log if set in $wgDebugLogGroups and * discarded otherwise * For backward compatibility, it can also take a boolean: @@ -1137,17 +1143,10 @@ function wfDebugMem( $exact = false ) { function wfDebugLog( $logGroup, $text, $dest = 'all', array $context = array() ) { - // Turn $dest into a string if it's a boolean (for b/c) - if ( $dest === true ) { - $dest = 'all'; - } elseif ( $dest === false ) { - $dest = 'private'; - } - $text = trim( $text ); $logger = LoggerFactory::getInstance( $logGroup ); - $context['private'] = ( $dest === 'private' ); + $context['private'] = ( $dest === false || $dest === 'private' ); $logger->info( $text, $context ); } @@ -1462,159 +1461,6 @@ function wfMessageFallback( /*...*/ ) { return call_user_func_array( 'Message::newFallbackSequence', $args ); } -/** - * Get a message from anywhere, for the current user language. - * - * Use wfMsgForContent() instead if the message should NOT - * change depending on the user preferences. - * - * @deprecated since 1.18 - * - * @param string $key Lookup key for the message, usually - * defined in languages/Language.php - * - * Parameters to the message, which can be used to insert variable text into - * it, can be passed to this function in the following formats: - * - One per argument, starting at the second parameter - * - As an array in the second parameter - * These are not shown in the function definition. - * - * @return string - */ -function wfMsg( $key ) { - wfDeprecated( __METHOD__, '1.21' ); - - $args = func_get_args(); - array_shift( $args ); - return wfMsgReal( $key, $args ); -} - -/** - * Same as above except doesn't transform the message - * - * @deprecated since 1.18 - * - * @param string $key - * @return string - */ -function wfMsgNoTrans( $key ) { - wfDeprecated( __METHOD__, '1.21' ); - - $args = func_get_args(); - array_shift( $args ); - return wfMsgReal( $key, $args, true, false, false ); -} - -/** - * Get a message from anywhere, for the current global language - * set with $wgLanguageCode. - * - * Use this if the message should NOT change dependent on the - * language set in the user's preferences. This is the case for - * most text written into logs, as well as link targets (such as - * the name of the copyright policy page). Link titles, on the - * other hand, should be shown in the UI language. - * - * Note that MediaWiki allows users to change the user interface - * language in their preferences, but a single installation - * typically only contains content in one language. - * - * Be wary of this distinction: If you use wfMsg() where you should - * use wfMsgForContent(), a user of the software may have to - * customize potentially hundreds of messages in - * order to, e.g., fix a link in every possible language. - * - * @deprecated since 1.18 - * - * @param string $key Lookup key for the message, usually - * defined in languages/Language.php - * @return string - */ -function wfMsgForContent( $key ) { - wfDeprecated( __METHOD__, '1.21' ); - - global $wgForceUIMsgAsContentMsg; - $args = func_get_args(); - array_shift( $args ); - $forcontent = true; - if ( is_array( $wgForceUIMsgAsContentMsg ) - && in_array( $key, $wgForceUIMsgAsContentMsg ) - ) { - $forcontent = false; - } - return wfMsgReal( $key, $args, true, $forcontent ); -} - -/** - * Same as above except doesn't transform the message - * - * @deprecated since 1.18 - * - * @param string $key - * @return string - */ -function wfMsgForContentNoTrans( $key ) { - wfDeprecated( __METHOD__, '1.21' ); - - global $wgForceUIMsgAsContentMsg; - $args = func_get_args(); - array_shift( $args ); - $forcontent = true; - if ( is_array( $wgForceUIMsgAsContentMsg ) - && in_array( $key, $wgForceUIMsgAsContentMsg ) - ) { - $forcontent = false; - } - return wfMsgReal( $key, $args, true, $forcontent, false ); -} - -/** - * Really get a message - * - * @deprecated since 1.18 - * - * @param string $key Key to get. - * @param array $args - * @param bool $useDB - * @param string|bool $forContent Language code, or false for user lang, true for content lang. - * @param bool $transform Whether or not to transform the message. - * @return string The requested message. - */ -function wfMsgReal( $key, $args, $useDB = true, $forContent = false, $transform = true ) { - wfDeprecated( __METHOD__, '1.21' ); - - $message = wfMsgGetKey( $key, $useDB, $forContent, $transform ); - $message = wfMsgReplaceArgs( $message, $args ); - return $message; -} - -/** - * Fetch a message string value, but don't replace any keys yet. - * - * @deprecated since 1.18 - * - * @param string $key - * @param bool $useDB - * @param string|bool $langCode Code of the language to get the message for, or - * behaves as a content language switch if it is a boolean. - * @param bool $transform Whether to parse magic words, etc. - * @return string - */ -function wfMsgGetKey( $key, $useDB = true, $langCode = false, $transform = true ) { - wfDeprecated( __METHOD__, '1.21' ); - - Hooks::run( 'NormalizeMessageKey', array( &$key, &$useDB, &$langCode, &$transform ) ); - - $cache = MessageCache::singleton(); - $message = $cache->get( $key, $useDB, $langCode ); - if ( $message === false ) { - $message = '<' . htmlspecialchars( $key ) . '>'; - } elseif ( $transform ) { - $message = $cache->transform( $message ); - } - return $message; -} - /** * Replace message parameter keys on the given formatted output. * @@ -1643,159 +1489,6 @@ function wfMsgReplaceArgs( $message, $args ) { return $message; } -/** - * Return an HTML-escaped version of a message. - * Parameter replacements, if any, are done *after* the HTML-escaping, - * so parameters may contain HTML (eg links or form controls). Be sure - * to pre-escape them if you really do want plaintext, or just wrap - * the whole thing in htmlspecialchars(). - * - * @deprecated since 1.18 - * - * @param string $key - * @param string $args,... Parameters - * @return string - */ -function wfMsgHtml( $key ) { - wfDeprecated( __METHOD__, '1.21' ); - - $args = func_get_args(); - array_shift( $args ); - return wfMsgReplaceArgs( htmlspecialchars( wfMsgGetKey( $key ) ), $args ); -} - -/** - * Return an HTML version of message - * Parameter replacements, if any, are done *after* parsing the wiki-text message, - * so parameters may contain HTML (eg links or form controls). Be sure - * to pre-escape them if you really do want plaintext, or just wrap - * the whole thing in htmlspecialchars(). - * - * @deprecated since 1.18 - * - * @param string $key - * @param string $args,... Parameters - * @return string - */ -function wfMsgWikiHtml( $key ) { - wfDeprecated( __METHOD__, '1.21' ); - - $args = func_get_args(); - array_shift( $args ); - return wfMsgReplaceArgs( - MessageCache::singleton()->parse( wfMsgGetKey( $key ), null, - /* can't be set to false */ true, /* interface */ true )->getText(), - $args ); -} - -/** - * Returns message in the requested format - * - * @deprecated since 1.18 - * - * @param string $key Key of the message - * @param array $options Processing rules. - * Can take the following options: - * parse: parses wikitext to HTML - * parseinline: parses wikitext to HTML and removes the surrounding - * p's added by parser or tidy - * escape: filters message through htmlspecialchars - * escapenoentities: same, but allows entity references like   through - * replaceafter: parameters are substituted after parsing or escaping - * parsemag: transform the message using magic phrases - * content: fetch message for content language instead of interface - * Also can accept a single associative argument, of the form 'language' => 'xx': - * language: Language object or language code to fetch message for - * (overridden by content). - * Behavior for conflicting options (e.g., parse+parseinline) is undefined. - * - * @return string - */ -function wfMsgExt( $key, $options ) { - wfDeprecated( __METHOD__, '1.21' ); - - $args = func_get_args(); - array_shift( $args ); - array_shift( $args ); - $options = (array)$options; - $validOptions = array( 'parse', 'parseinline', 'escape', 'escapenoentities', 'replaceafter', - 'parsemag', 'content' ); - - foreach ( $options as $arrayKey => $option ) { - if ( !preg_match( '/^[0-9]+|language$/', $arrayKey ) ) { - // An unknown index, neither numeric nor "language" - wfWarn( "wfMsgExt called with incorrect parameter key $arrayKey", 1, E_USER_WARNING ); - } elseif ( preg_match( '/^[0-9]+$/', $arrayKey ) && !in_array( $option, $validOptions ) ) { - // A numeric index with unknown value - wfWarn( "wfMsgExt called with incorrect parameter $option", 1, E_USER_WARNING ); - } - } - - if ( in_array( 'content', $options, true ) ) { - $forContent = true; - $langCode = true; - $langCodeObj = null; - } elseif ( array_key_exists( 'language', $options ) ) { - $forContent = false; - $langCode = wfGetLangObj( $options['language'] ); - $langCodeObj = $langCode; - } else { - $forContent = false; - $langCode = false; - $langCodeObj = null; - } - - $string = wfMsgGetKey( $key, /*DB*/true, $langCode, /*Transform*/false ); - - if ( !in_array( 'replaceafter', $options, true ) ) { - $string = wfMsgReplaceArgs( $string, $args ); - } - - $messageCache = MessageCache::singleton(); - $parseInline = in_array( 'parseinline', $options, true ); - if ( in_array( 'parse', $options, true ) || $parseInline ) { - $string = $messageCache->parse( $string, null, true, !$forContent, $langCodeObj ); - if ( $string instanceof ParserOutput ) { - $string = $string->getText(); - } - - if ( $parseInline ) { - $string = Parser::stripOuterParagraph( $string ); - } - } elseif ( in_array( 'parsemag', $options, true ) ) { - $string = $messageCache->transform( $string, - !$forContent, $langCodeObj ); - } - - if ( in_array( 'escape', $options, true ) ) { - $string = htmlspecialchars( $string ); - } elseif ( in_array( 'escapenoentities', $options, true ) ) { - $string = Sanitizer::escapeHtmlAllowEntities( $string ); - } - - if ( in_array( 'replaceafter', $options, true ) ) { - $string = wfMsgReplaceArgs( $string, $args ); - } - - return $string; -} - -/** - * Since wfMsg() and co suck, they don't return false if the message key they - * looked up didn't exist but instead the key wrapped in <>'s, this function checks for the - * nonexistence of messages by checking the MessageCache::get() result directly. - * - * @deprecated since 1.18. Use Message::isDisabled(). - * - * @param string $key The message key looked up - * @return bool True if the message *doesn't* exist. - */ -function wfEmptyMsg( $key ) { - wfDeprecated( __METHOD__, '1.21' ); - - return MessageCache::singleton()->get( $key, /*useDB*/true, /*content*/false ) === false; -} - /** * Fetch server name for use in error reporting etc. * Use real server name if available, so we know which machine @@ -2014,21 +1707,6 @@ function wfClientAcceptsGzip( $force = false ) { return $result; } -/** - * Obtain the offset and limit values from the request string; - * used in special pages - * - * @param int $deflimit Default limit if none supplied - * @param string $optionname Name of a user preference to check against - * @return array - * @deprecated since 1.24, just call WebRequest::getLimitOffset() directly - */ -function wfCheckLimits( $deflimit = 50, $optionname = 'rclimit' ) { - global $wgRequest; - wfDeprecated( __METHOD__, '1.24' ); - return $wgRequest->getLimitOffset( $deflimit, $optionname ); -} - /** * Escapes the given text so that it may be output using addWikiText() * without any linking, formatting, etc. making its way through. This @@ -3330,9 +3008,12 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, /** * Check if there is sufficient entropy in php's built-in session generation * + * @deprecated since 1.27, PHP's session generation isn't used with + * MediaWiki\\Session\\SessionManager * @return bool True = there is sufficient entropy */ function wfCheckEntropy() { + wfDeprecated( __FUNCTION__, '1.27' ); return ( ( wfIsWindows() && version_compare( PHP_VERSION, '5.3.3', '>=' ) ) || ini_get( 'session.entropy_file' ) @@ -3341,83 +3022,65 @@ function wfCheckEntropy() { } /** - * Override session_id before session startup if php's built-in - * session generation code is not secure. + * @deprecated since 1.27, PHP's session generation isn't used with + * MediaWiki\\Session\\SessionManager */ function wfFixSessionID() { - // If the cookie or session id is already set we already have a session and should abort - if ( isset( $_COOKIE[session_name()] ) || session_id() ) { - return; - } - - // PHP's built-in session entropy is enabled if: - // - entropy_file is set or you're on Windows with php 5.3.3+ - // - AND entropy_length is > 0 - // We treat it as disabled if it doesn't have an entropy length of at least 32 - $entropyEnabled = wfCheckEntropy(); - - // If built-in entropy is not enabled or not sufficient override PHP's - // built in session id generation code - if ( !$entropyEnabled ) { - wfDebug( __METHOD__ . ": PHP's built in entropy is disabled or not sufficient, " . - "overriding session id generation using our cryptrand source.\n" ); - session_id( MWCryptRand::generateHex( 32 ) ); - } + wfDeprecated( __FUNCTION__, '1.27' ); } /** - * Reset the session_id + * Reset the session id * + * @deprecated since 1.27, use MediaWiki\\Session\\SessionManager instead * @since 1.22 */ function wfResetSessionID() { - global $wgCookieSecure; - $oldSessionId = session_id(); - $cookieParams = session_get_cookie_params(); - if ( wfCheckEntropy() && $wgCookieSecure == $cookieParams['secure'] ) { - session_regenerate_id( false ); - } else { - $tmp = $_SESSION; - session_destroy(); - wfSetupSession( MWCryptRand::generateHex( 32 ) ); - $_SESSION = $tmp; + wfDeprecated( __FUNCTION__, '1.27' ); + $session = SessionManager::getGlobalSession(); + $delay = $session->delaySave(); + + $session->resetId(); + + // Make sure a session is started, since that's what the old + // wfResetSessionID() did. + if ( session_id() !== $session->getId() ) { + wfSetupSession( $session->getId() ); } - $newSessionId = session_id(); + + ScopedCallback::consume( $delay ); } /** * Initialise php session * - * @param bool $sessionId + * @deprecated since 1.27, use MediaWiki\\Session\\SessionManager instead. + * Generally, "using" SessionManager will be calling ->getSessionById() or + * ::getGlobalSession() (depending on whether you were passing $sessionId + * here), then calling $session->persist(). + * @param bool|string $sessionId */ function wfSetupSession( $sessionId = false ) { - global $wgSessionsInObjectCache, $wgSessionHandler; - global $wgCookiePath, $wgCookieDomain, $wgCookieSecure, $wgCookieHttpOnly; + wfDeprecated( __FUNCTION__, '1.27' ); - if ( $wgSessionsInObjectCache ) { - ObjectCacheSessionHandler::install(); - } elseif ( $wgSessionHandler && $wgSessionHandler != ini_get( 'session.save_handler' ) ) { - # Only set this if $wgSessionHandler isn't null and session.save_handler - # hasn't already been set to the desired value (that causes errors) - ini_set( 'session.save_handler', $wgSessionHandler ); + // If they're calling this, they probably want our session management even + // if NO_SESSION was set for Setup.php. + if ( !MediaWiki\Session\PHPSessionHandler::isInstalled() ) { + MediaWiki\Session\PHPSessionHandler::install( SessionManager::singleton() ); } - session_set_cookie_params( - 0, $wgCookiePath, $wgCookieDomain, $wgCookieSecure, $wgCookieHttpOnly ); - session_cache_limiter( 'private, must-revalidate' ); if ( $sessionId ) { session_id( $sessionId ); - } else { - wfFixSessionID(); } - MediaWiki\suppressWarnings(); - session_start(); - MediaWiki\restoreWarnings(); + $session = SessionManager::getGlobalSession(); + $session->persist(); - if ( $wgSessionsInObjectCache ) { - ObjectCacheSessionHandler::renewCurrentSession(); + if ( session_id() !== $session->getId() ) { + session_id( $session->getId() ); } + + MediaWiki\quietCall( 'session_start' ); } /**