User::loadFromSession called before the end of Setup.php
#0 /srv/mediawiki/php-1.36.0-wmf.14/includes/user/User.php(2009): User->load() #1 /srv/mediawiki/php-1.36.0-wmf.14/includes/user/User.php(2948): User->getId() #2 /srv/mediawiki/php-1.36.0-wmf.14/includes/user/User.php(2964): User->isRegistered() #3 /srv/mediawiki/php-1.36.0-wmf.14/extensions/UniversalLanguageSelector/includes/UniversalLanguageSelectorHooks.php(309): User->isAnon() #4 /srv/mediawiki/php-1.36.0-wmf.14/includes/HookContainer/HookContainer.php(333): UniversalLanguageSelectorHooks::getLanguage(User, string, RequestContext) #5 /srv/mediawiki/php-1.36.0-wmf.14/includes/HookContainer/HookContainer.php(140): MediaWiki\HookContainer\HookContainer->callLegacyHook(string, array, array, array) #6 /srv/mediawiki/php-1.36.0-wmf.14/includes/HookContainer/HookRunner.php(4245): MediaWiki\HookContainer\HookContainer->run(string, array) #7 /srv/mediawiki/php-1.36.0-wmf.14/includes/context/RequestContext.php(370): MediaWiki\HookContainer\HookRunner->onUserGetLanguageObject(User, string, RequestContext) #8 /srv/mediawiki/php-1.36.0-wmf.14/includes/StubUserLang.php(52): RequestContext->getLanguage() #9 /srv/mediawiki/php-1.36.0-wmf.14/includes/StubObject.php(172): StubUserLang->_newObject() #10 /srv/mediawiki/php-1.36.0-wmf.14/includes/StubObject.php(115): StubObject->_unstub(string, integer) #11 /srv/mediawiki/php-1.36.0-wmf.14/includes/StubObject.php(142): StubObject->_call(string, array) #12 /srv/mediawiki/php-1.36.0-wmf.14/includes/user/User.php(2749): StubObject->__call(string, array) #13 /srv/mediawiki/php-1.36.0-wmf.14/languages/Language.php(2234): User->getDatePreference() #14 /srv/mediawiki/php-1.36.0-wmf.14/languages/Language.php(2340): Language->dateFormat(boolean) #15 /srv/mediawiki/php-1.36.0-wmf.14/languages/Language.php(4608): Language->timeanddate(string, boolean) #16 /srv/mediawiki/php-1.36.0-wmf.14/includes/block/BlockErrorFormatter.php(111): Language->formatExpiry(string) #17 /srv/mediawiki/php-1.36.0-wmf.14/includes/block/BlockErrorFormatter.php(204): MediaWiki\Block\BlockErrorFormatter->getFormattedBlockErrorInfo(MediaWiki\Block\DatabaseBlock, User, LanguageEn) #18 /srv/mediawiki/php-1.36.0-wmf.14/includes/block/BlockErrorFormatter.php(65): MediaWiki\Block\BlockErrorFormatter->getBlockErrorMessageParams(MediaWiki\Block\DatabaseBlock, User, LanguageEn, string) #19 /srv/mediawiki/php-1.36.0-wmf.14/includes/auth/CheckBlocksSecondaryAuthenticationProvider.php(92): MediaWiki\Block\BlockErrorFormatter->getMessage(MediaWiki\Block\DatabaseBlock, User, LanguageEn, string) #20 /srv/mediawiki/php-1.36.0-wmf.14/includes/auth/AuthManager.php(1706): MediaWiki\Auth\CheckBlocksSecondaryAuthenticationProvider->testUserForCreation(User, string, array) #21 /srv/mediawiki/php-1.36.0-wmf.14/includes/Setup.php(812): MediaWiki\Auth\AuthManager->autoCreateUser(User, string, boolean) #22 /srv/mediawiki/php-1.36.0-wmf.14/includes/WebStart.php(89): require_once(string) #23 /srv/mediawiki/php-1.36.0-wmf.14/api.php(43): require(string) #24 /srv/mediawiki/w/api.php(3): require(string) #25 {main}
Impact
The user options are ignored and instead the object is treated is anon/default
Exact impact to-be-determined by maintainers of UniversalLanguageSelector and/or BlockErrorFormatter (I've CC-ed Lang team, and AHT).
Notes
There is effectively a bad loop where during the initialisation of a User object, the BlockErrorFormatter is asking for information from the (same) User object thus causing a paradox. I suspect UniversalLanguageSelector is merely a bystander here, being the first one to call something on the object before it is returned to BlockErrorFormatter, but I'm not 100% sure, it's possible ULS might be inducing it somehow.
See also:
- T240083: "User::loadFromSession called before the end of Setup.php" (violation by Wikibase/ULS) [Story Points 5]
- T265125: BetaFeatures causes User::loadFromSession called before the end of Setup.php
- T151291: "User::loadFromSession called before the end of Setup.php" warning due to AbuseFilter
Status
Trying to figure out between Language-Team, Anti-Harassment and Platform Engineering who and how to address this.