if (!$secret) { throw new RuntimeException("Cannot use MWCryptHKDF without a secret."); } // In HKDF, the context can be known to the attacker, but this will // keep simultaneous runs from producing the same output. $context = [microtime(), getmypid(), gethostname()]; // Setup salt cache. Use APC, or fallback to the main cache if it isn't setup $cache = $services->getLocalServerObjectCache(); if ($cache instanceof EmptyBagOStuff) { $cache = ObjectCache::getLocalClusterInstance(); } return new CryptHKDF($secret, $config->get('HKDFAlgorithm'), $cache, $context, $services->getCryptRand()); }, 'MediaHandlerFactory' => function (MediaWikiServices $services) { return new MediaHandlerFactory($services->getMainConfig()->get('MediaHandlers')); }, 'MimeAnalyzer' => function (MediaWikiServices $services) { return new MimeMagic(MimeMagic::applyDefaultParameters([], $services->getMainConfig())); }, 'ProxyLookup' => function (MediaWikiServices $services) { $mainConfig = $services->getMainConfig(); return new ProxyLookup($mainConfig->get('SquidServers'), $mainConfig->get('SquidServersNoPurge')); }, 'Parser' => function (MediaWikiServices $services) { $conf = $services->getMainConfig()->get('ParserConf'); return ObjectFactory::constructClassInstance($conf['class'], [$conf]); }, 'LinkCache' => function (MediaWikiServices $services) { return new LinkCache($services->getTitleFormatter(), ObjectCache::getMainWANInstance()); }, 'LinkRendererFactory' => function (MediaWikiServices $services) { return new LinkRendererFactory($services->getTitleFormatter(), $services->getLinkCache()); }, 'LinkRenderer' => function (MediaWikiServices $services) { global $wgUser; if (defined('MW_NO_SESSION')) { return $services->getLinkRendererFactory()->create(); } else {