public function execute() { global $wgAuth; if (!$wgAuth->allowSetLocalPassword()) { $this->error('$wgAuth does not allow local passwords. Aborting.', true); } $passwordFactory = new PasswordFactory(); $passwordFactory->init(RequestContext::getMain()->getConfig()); $typeInfo = $passwordFactory->getTypes(); $layeredType = $this->getOption('type'); // Check that type exists and is a layered type if (!isset($typeInfo[$layeredType])) { $this->error('Undefined password type', true); } $passObj = $passwordFactory->newFromType($layeredType); if (!$passObj instanceof LayeredParameterizedPassword) { $this->error('Layered parameterized password type must be used.', true); } // Extract the first layer type $typeConfig = $typeInfo[$layeredType]; $firstType = $typeConfig['types'][0]; // Get a list of password types that are applicable $dbw = $this->getDB(DB_MASTER); $typeCond = 'user_password' . $dbw->buildLike(":{$firstType}:", $dbw->anyString()); $minUserId = 0; do { $dbw->begin(); $res = $dbw->select('user', array('user_id', 'user_name', 'user_password'), array('user_id > ' . $dbw->addQuotes($minUserId), $typeCond), __METHOD__, array('ORDER BY' => 'user_id', 'LIMIT' => $this->mBatchSize, 'LOCK IN SHARE MODE')); /** @var User[] $updateUsers */ $updateUsers = array(); foreach ($res as $row) { if ($this->hasOption('verbose')) { $this->output("Updating password for user {$row->user_name} ({$row->user_id}).\n"); } $user = User::newFromId($row->user_id); /** @var ParameterizedPassword $password */ $password = $passwordFactory->newFromCiphertext($row->user_password); /** @var LayeredParameterizedPassword $layeredPassword */ $layeredPassword = $passwordFactory->newFromType($layeredType); $layeredPassword->partialCrypt($password); $updateUsers[] = $user; $dbw->update('user', array('user_password' => $layeredPassword->toString()), array('user_id' => $row->user_id), __METHOD__); $minUserId = $row->user_id; } $dbw->commit(); // Clear memcached so old passwords are wiped out foreach ($updateUsers as $user) { $user->clearSharedCache(); } } while ($res->numRows()); }