Go to the documentation of this file.
64 $this->centralId = (int)$row->bp_user;
65 $this->appId = $row->bp_app_id;
66 $this->token = $row->bp_token;
76 public static function getDB( $db ) {
79 $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
116 $row = $db->selectRow(
118 [
'bp_user',
'bp_app_id',
'bp_token',
'bp_restrictions',
'bp_grants' ],
123 return $row ?
new self( $row,
true,
$flags ) :
null;
141 'bp_app_id' => isset( $data[
'appId'] ) ? trim( $data[
'appId'] ) :
'',
142 'bp_token' =>
'**unsaved**',
144 'bp_grants' => $data[
'grants'] ?? [],
148 $row->bp_app_id ===
'' || strlen( $row->bp_app_id ) > self::APPID_MAXLENGTH ||
150 !is_array( $row->bp_grants )
155 $row->bp_restrictions = $row->bp_restrictions->toJson();
158 if ( isset( $data[
'user'] ) ) {
159 if ( !$data[
'user'] instanceof
User ) {
165 } elseif ( isset( $data[
'username'] ) ) {
169 } elseif ( isset( $data[
'centralId'] ) ) {
170 $row->bp_user = $data[
'centralId'];
172 if ( !$row->bp_user ) {
176 return new self( $row,
false,
$flags );
243 $password = $db->selectField(
246 [
'bp_user' => $this->centralId,
'bp_app_id' => $this->appId ],
250 if ( $password ===
false ) {
254 $passwordFactory = MediaWikiServices::getInstance()->getPasswordFactory();
256 return $passwordFactory->newFromCiphertext( $password );
284 'bp_restrictions' => $this->restrictions->toJson(),
288 if ( $password !==
null ) {
289 $fields[
'bp_password'] = $password->toString();
290 } elseif ( $operation ===
'insert' ) {
295 switch ( $operation ) {
297 $dbw->insert(
'bot_passwords', $fields + $conds, __METHOD__, [
'IGNORE' ] );
301 $dbw->update(
'bot_passwords', $fields, $conds, __METHOD__ );
307 $ok = (bool)$dbw->affectedRows();
309 $this->token = $dbw->selectField(
'bot_passwords',
'bp_token', $conds, __METHOD__ );
319 public function delete() {
325 $dbw->delete(
'bot_passwords', $conds, __METHOD__ );
326 $ok = (bool)$dbw->affectedRows();
328 $this->token =
'**unsaved**';
365 return (
bool)$dbw->affectedRows();
398 return (
bool)$dbw->affectedRows();
408 max( 32, $config->get(
'MinimalPasswordLength' ) ) );
423 if ( strlen( $password ) >= 32 && strpos( $username, $sep ) !==
false ) {
425 if ( preg_match(
'/^[0-9a-w]{32,}$/', $password ) ) {
426 return [ $username, $password ];
428 } elseif ( strlen( $password ) > 32 && strpos( $password, $sep ) !==
false ) {
429 $segments = explode( $sep, $password );
430 $password = array_pop( $segments );
431 $appId = implode( $sep, $segments );
432 if ( preg_match(
'/^[0-9a-w]{32,}$/', $password ) ) {
433 return [ $username . $sep .
$appId, $password ];
454 $provider = $manager->getProvider( BotPasswordSessionProvider::class );
461 if ( strpos( $username, $sep ) ===
false ) {
464 list( $name,
$appId ) = explode( $sep, $username, 2 );
468 if ( !$user || $user->isAnon() ) {
472 if ( $user->isLocked() ) {
479 'type' =>
'botpassword',
482 $result = $throttle->increase( $user->getName(), $request->
getIP(), __METHOD__ );
484 $msg =
wfMessage(
'login-throttled' )->durationParams( $result[
'wait'] );
497 $status = $bp->getRestrictions()->check( $request );
503 $passwordObj = $bp->getPassword();
508 if ( !$passwordObj->verify( $password ) ) {
514 $throttle->clear( $user->getName(), $request->
getIP() );
518 Status::newGood( $provider->newSessionForRequest( $user, $bp, $request ) ) );
534 if ( $user instanceof
User ) {
535 $name = $user->getName();
545 $response = AuthenticationResponse::newPass( $name );
549 Hooks::run(
'AuthManagerLoginAuthenticateAudit', [
$response, $user, $name, $extraData ] );
A class to check request restrictions expressed as a JSON object.
getRestrictions()
Get the restrictions.
static newFatal( $message,... $parameters)
Factory function for fatal errors.
getUserCentralId()
Get the central user ID.
string bool $wgBotPasswordsDatabase
Database name for the bot_passwords table.
static getLocalClusterInstance()
Get the main cluster-local cache object.
static canonicalizeLoginData( $username, $password)
There are two ways to login with a bot password: "username@appId", "password" and "username",...
Utility class for bot passwords.
static getSeparator()
Get the separator for combined user name + app ID.
string bool $wgBotPasswordsCluster
Cluster for the bot_passwords table If false, the normal cluster will be used.
static generatePassword( $config)
Returns a (raw, unhashed) random password string.
Show an error when any operation involving passwords fails to run.
isInvalid()
Whether the password is currently invalid.
static newFromName( $name, $validate='valid')
Static factory method for creation from username.
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
getAppId()
Get the app ID.
static generateRandomPasswordString( $minLength=10)
Generate a random string suitable for a password.
static getDBOptions( $bitfield)
Get an appropriate DB index, options, and fallback DB index for a query.
Represents an invalid password hash.
static getDB( $db)
Get a database connection for the bot passwords database.
static invalidateAllPasswordsForCentralId( $centralId)
Invalidate all passwords for a user, by central ID.
Interface for database access objects.
__construct( $row, $isSaved, $flags=self::READ_NORMAL)
save( $operation, Password $password=null)
Save the BotPassword to the database.
Generic operation result class Has warning/error list, boolean status and arbitrary value.
isSaved()
Indicate whether this is known to be saved.
static newUnsaved(array $data, $flags=self::READ_NORMAL)
Create an unsaved BotPassword.
$wgUserrightsInterwikiDelimiter
Character used as a delimiter when testing for interwiki userrights (In Special:UserRights,...
const TOKEN_LENGTH
Number of characters required for the user_token field.
static newFromUser(User $user, $appId, $flags=self::READ_NORMAL)
Load a BotPassword from the database.
getPassword()
Get the password.
static newGood( $value=null)
Factory function for good results.
static invalidateAllPasswordsForUser( $username)
Invalidate all passwords for a user, by name.
$wgPasswordAttemptThrottle
Limit password attempts to X attempts per Y seconds per IP per account.
static generateHex( $chars)
Generate a run of cryptographically random data and return it in hexadecimal string format.
static newFromCentralId( $centralId, $appId, $flags=self::READ_NORMAL)
Load a BotPassword from the database.
static login( $username, $password, WebRequest $request)
Try to log the user in.
The WebRequest class encapsulates getting at data passed in the URL or via a POSTed form stripping il...
getIP()
Work out the IP address based on various globals For trusted proxies, use the XFF client IP (first of...
getGrants()
Get the grants.
static newInvalidPassword()
Create an InvalidPassword.
static loginHook( $user, $bp, Status $status)
Call AuthManagerLoginAuthenticateAudit.
static newFromJson( $json)
static removeAllPasswordsForUser( $username)
Remove all passwords for a user, by name.
bool $wgEnableBotPasswords
Whether to enable bot passwords.
Represents a password hash for use in authentication.
static factory( $providerId=null)
Fetch a CentralIdLookup.
The User object encapsulates all of the user-specific settings (user_id, name, rights,...
static run( $event, array $args=[], $deprecatedVersion=null)
Call hook functions defined in Hooks::register and $wgHooks.
static removeAllPasswordsForCentralId( $centralId)
Remove all passwords for a user, by central ID.
MWRestrictions $restrictions