10use MediaWiki\Auth\AuthenticationRequest;
11use MediaWiki\Auth\AuthenticationResponse;
12use MediaWiki\Auth\AuthManager;
18use MediaWiki\MediaWikiServices;
19use Wikimedia\ScopedCallback;
41 public static function addUser( $name, $email, $password ) {
42 $user = User::newFromName( $name,
'creatable' );
45 throw new InvalidArgumentException(
'Invalid user name' );
49 'username' => $user->getName(),
50 'password' => $password,
51 'retype' => $password,
56 $services = MediaWikiServices::getInstance();
58 $permissionManager = $services->getPermissionManager();
59 $creator = TranslateUserManager::getUser();
60 $guard = $permissionManager->addTemporaryUserRights( $creator,
'createaccount' );
62 $authManager = $services->getAuthManager();
63 $reqs = $authManager->getAuthenticationRequests( AuthManager::ACTION_CREATE );
64 $reqs = AuthenticationRequest::loadRequestsFromSubmission( $reqs, $data );
65 $res = $authManager->beginAccountCreation( $creator, $reqs,
'null:' );
67 ScopedCallback::consume( $guard );
69 switch ( $res->status ) {
70 case AuthenticationResponse::PASS:
72 case AuthenticationResponse::FAIL:
76 $reason = $res->message->inLanguage(
'en' )->useDatabase(
false )->text();
77 throw new RuntimeException(
78 "Account creation failed: $reason",
79 self::USER_CREATION_FAILURE
84 if ( $user->getId() ) {
85 self::deleteUser( $user,
'force' );
88 throw new RuntimeException(
89 'AuthManager does not support such simplified account creation'
94 $services->getUserGroupManager()->addUserToGroup( $user,
'translate-sandboxed' );
106 public static function deleteUser( User $user, $force =
'' ) {
107 $uid = $user->getId();
108 $actorId = $user->getActorId();
110 if ( $force !==
'force' && !self::isSandboxed( $user ) ) {
115 $dbw = wfGetDB( DB_PRIMARY );
116 $dbw->delete(
'user', [
'user_id' => $uid ], __METHOD__ );
117 $dbw->delete(
'user_groups', [
'ug_user' => $uid ], __METHOD__ );
118 $dbw->delete(
'user_properties', [
'up_user' => $uid ], __METHOD__ );
120 MediaWikiServices::getInstance()->getActorStore()->deleteActor( $user, $dbw );
123 $dbw->delete(
'logging', [
'log_actor' => $actorId ], __METHOD__ );
124 $dbw->delete(
'recentchanges', [
'rc_actor' => $actorId ], __METHOD__ );
127 $statsUpdate = SiteStatsUpdate::factory( [
'users' => -1 ] );
128 $statsUpdate->doUpdate();
132 $user->clearInstanceCache(
'defaults' );
136 $user->invalidateCache();
144 $dbw = Utilities::getSafeReadDB();
145 $userQuery = User::getQueryInfo();
146 $tables = array_merge( $userQuery[
'tables'], [
'user_groups' ] );
147 $fields = $userQuery[
'fields'];
149 'ug_group' =>
'translate-sandboxed',
152 'user_groups' => [
'JOIN',
'ug_user = user_id' ],
153 ] + $userQuery[
'joins'];
155 $res = $dbw->select( $tables, $fields, $conds, __METHOD__, [], $joins );
157 return UserArray::newFromResult( $res );
166 global $wgTranslateSandboxPromotedGroup;
168 if ( !self::isSandboxed( $user ) ) {
172 $mwServices = MediaWikiServices::getInstance();
174 $userGroupManager = $mwServices->getUserGroupManager();
175 $userGroupManager->removeUserFromGroup( $user,
'translate-sandboxed' );
177 if ( $wgTranslateSandboxPromotedGroup ) {
178 $userGroupManager->addUserToGroup( $user, $wgTranslateSandboxPromotedGroup );
181 $userOptionsManager = $mwServices->getUserOptionsManager();
182 $userOptionsManager->setOption( $user,
'translate-sandbox-reminders',
'' );
183 $userOptionsManager->saveOptions( $user );
185 $hookRunner = Services::getInstance()->getHookRunner();
186 $hookRunner->onTranslate_TranslatorSandbox_UserPromoted( $user );
197 public static function sendEmail( User $sender, User $target, $type ) {
198 global $wgEmergencyContact;
200 $userOptionsLookup = MediaWikiServices::getInstance()->getUserOptionsLookup();
201 $targetLang = $userOptionsLookup->getOption( $target,
'language' );
205 if ( !self::isSandboxed( $target ) ) {
209 $subjectMsg =
'tsb-reminder-title-generic';
210 $bodyMsg =
'tsb-reminder-content-generic';
211 $targetSpecialPage =
'TranslationStash';
215 $subjectMsg =
'tsb-email-promoted-subject';
216 $bodyMsg =
'tsb-email-promoted-body';
217 $targetSpecialPage =
'Translate';
221 $subjectMsg =
'tsb-email-rejected-subject';
222 $bodyMsg =
'tsb-email-rejected-body';
223 $targetSpecialPage =
'TwnMainPage';
227 throw new UnexpectedValueException(
"'$type' is an invalid type of translate sandbox email" );
230 $subject = wfMessage( $subjectMsg )->inLanguage( $targetLang )->text();
234 SpecialPage::getTitleFor( $targetSpecialPage )->getCanonicalURL(),
236 )->inLanguage( $targetLang )->text();
239 'user' => $target->getId(),
240 'to' => MailAddress::newFromUser( $target ),
241 'from' =>
new MailAddress( $wgEmergencyContact ),
242 'replyto' =>
new MailAddress( $wgEmergencyContact ),
245 'emailType' => $type,
248 $services = MediaWikiServices::getInstance();
249 $userOptionsManager = $services->getUserOptionsManager();
251 $reminders = $userOptionsManager->getOption( $target,
'translate-sandbox-reminders' );
252 $reminders = $reminders ? explode(
'|', $reminders ) : [];
253 $reminders[] = wfTimestamp();
255 $userOptionsManager->setOption( $target,
'translate-sandbox-reminders', implode(
'|', $reminders ) );
256 $userOptionsManager->saveOptions( $target );
268 $userGroupManager = MediaWikiServices::getInstance()->getUserGroupManager();
269 return in_array(
'translate-sandboxed', $userGroupManager->getUserGroups( $user ),
true );
279 global $wgTranslateUseSandbox;
281 if ( !$wgTranslateUseSandbox ) {
285 if ( !self::isSandboxed( $user ) ) {
295 'translate-sandboxaction',
306 $preferences[
'translate-sandbox'] = $preferences[
'translate-sandbox-reminders'] =
323 TranslationStashActionApi::class,
328 if ( self::isSandboxed( $user ) ) {
329 $class = get_class( $module );
330 if ( $module->isWriteMode() && !in_array( $class, $inclusionList,
true ) ) {
331 $message = ApiMessage::create(
'apierror-writeapidenied' );
static newJob(array $params)
Utility class for the sandbox feature of Translate.
static sendEmail(User $sender, User $target, $type)
Sends a reminder to the user.
static addUser( $name, $email, $password)
Adds a new user without doing much validation.
static enforcePermissions(User $user, array &$rights)
Hook: UserGetRights.
static promoteUser(User $user)
Removes the user from the sandbox.
static deleteUser(User $user, $force='')
Deletes a sandboxed user without doing much validation.
static isSandboxed(User $user)
Shortcut for checking if given user is in the sandbox.
static onApiCheckCanExecute(ApiBase $module, User $user, &$message)
Inclusion listing for certain API modules.
static onGetPreferences( $user, &$preferences)
Hook: onGetPreferences.
static getUsers()
Get all sandboxed users.
const USER_CREATION_FAILURE
Custom exception code used when user creation fails in order to differentiate between other exception...