32 public static function addUser( $name, $email, $password ) {
33 $user = User::newFromName( $name,
'creatable' );
36 throw new MWException(
'Invalid user name' );
40 'username' => $user->getName(),
41 'password' => $password,
42 'retype' => $password,
47 $services = MediaWikiServices::getInstance();
49 $permissionManager = $services->getPermissionManager();
50 $creator = TranslateUserManager::getUser();
51 $guard = $permissionManager->addTemporaryUserRights( $creator,
'createaccount' );
53 $authManager = $services->getAuthManager();
54 $reqs = $authManager->getAuthenticationRequests( AuthManager::ACTION_CREATE );
55 $reqs = AuthenticationRequest::loadRequestsFromSubmission( $reqs, $data );
56 $res = $authManager->beginAccountCreation( $creator, $reqs,
'null:' );
58 ScopedCallback::consume( $guard );
60 switch ( $res->status ) {
61 case AuthenticationResponse::PASS:
63 case AuthenticationResponse::FAIL:
67 $reason = $res->message->inLanguage(
'en' )->useDatabase(
false )->text();
68 throw new MWException(
"Account creation failed: $reason" );
72 if ( $user->getId() ) {
73 self::deleteUser( $user,
'force' );
76 throw new MWException(
77 'AuthManager does not support such simplified account creation'
82 $services->getUserGroupManager()->addUserToGroup( $user,
'translate-sandboxed' );
94 public static function deleteUser( User $user, $force =
'' ) {
95 $uid = $user->getId();
96 $actorId = $user->getActorId();
98 if ( $force !==
'force' && !self::isSandboxed( $user ) ) {
99 throw new MWException(
'Not a sandboxed user' );
103 $dbw = wfGetDB( DB_PRIMARY );
104 $dbw->delete(
'user', [
'user_id' => $uid ], __METHOD__ );
105 $dbw->delete(
'user_groups', [
'ug_user' => $uid ], __METHOD__ );
106 $dbw->delete(
'user_properties', [
'up_user' => $uid ], __METHOD__ );
108 MediaWikiServices::getInstance()->getActorStore()->deleteActor( $user, $dbw );
111 $dbw->delete(
'logging', [
'log_actor' => $actorId ], __METHOD__ );
112 $dbw->delete(
'recentchanges', [
'rc_actor' => $actorId ], __METHOD__ );
115 $statsUpdate = SiteStatsUpdate::factory( [
'users' => -1 ] );
116 $statsUpdate->doUpdate();
120 $user->clearInstanceCache(
'defaults' );
124 $user->invalidateCache();
132 $dbw = TranslateUtils::getSafeReadDB();
133 $userQuery = User::getQueryInfo();
134 $tables = array_merge( $userQuery[
'tables'], [
'user_groups' ] );
135 $fields = $userQuery[
'fields'];
137 'ug_group' =>
'translate-sandboxed',
140 'user_groups' => [
'JOIN',
'ug_user = user_id' ],
141 ] + $userQuery[
'joins'];
143 $res = $dbw->select( $tables, $fields, $conds, __METHOD__, [], $joins );
145 return UserArray::newFromResult( $res );
154 global $wgTranslateSandboxPromotedGroup;
156 if ( !self::isSandboxed( $user ) ) {
157 throw new MWException(
'Not a sandboxed user' );
160 $services = MediaWikiServices::getInstance();
162 $userGroupManager = $services->getUserGroupManager();
163 $userGroupManager->removeUserFromGroup( $user,
'translate-sandboxed' );
165 if ( $wgTranslateSandboxPromotedGroup ) {
166 $userGroupManager->addUserToGroup( $user, $wgTranslateSandboxPromotedGroup );
169 $userOptionsManager = $services->getUserOptionsManager();
170 $userOptionsManager->setOption( $user,
'translate-sandbox-reminders',
'' );
171 $userOptionsManager->saveOptions( $user );
182 public static function sendEmail( User $sender, User $target, $type ) {
183 global $wgNoReplyAddress;
185 $userOptionsLookup = MediaWikiServices::getInstance()->getUserOptionsLookup();
186 $targetLang = $userOptionsLookup->getOption( $target,
'language' );
190 if ( !self::isSandboxed( $target ) ) {
191 throw new MWException(
'Not a sandboxed user' );
194 $subjectMsg =
'tsb-reminder-title-generic';
195 $bodyMsg =
'tsb-reminder-content-generic';
196 $targetSpecialPage =
'TranslationStash';
200 $subjectMsg =
'tsb-email-promoted-subject';
201 $bodyMsg =
'tsb-email-promoted-body';
202 $targetSpecialPage =
'Translate';
206 $subjectMsg =
'tsb-email-rejected-subject';
207 $bodyMsg =
'tsb-email-rejected-body';
208 $targetSpecialPage =
'TwnMainPage';
212 throw new MWException(
"'$type' is an invalid type of translate sandbox email" );
215 $subject = wfMessage( $subjectMsg )->inLanguage( $targetLang )->text();
219 SpecialPage::getTitleFor( $targetSpecialPage )->getCanonicalURL(),
221 )->inLanguage( $targetLang )->text();
224 'user' => $target->getId(),
225 'to' => MailAddress::newFromUser( $target ),
226 'from' => MailAddress::newFromUser( $sender ),
227 'replyto' =>
new MailAddress( $wgNoReplyAddress ),
230 'emailType' => $type,
233 $services = MediaWikiServices::getInstance();
234 $userOptionsManager = $services->getUserOptionsManager();
236 $reminders = $userOptionsManager->getOption( $target,
'translate-sandbox-reminders' );
237 $reminders = $reminders ? explode(
'|', $reminders ) : [];
238 $reminders[] = wfTimestamp();
240 $userOptionsManager->setOption( $target,
'translate-sandbox-reminders', implode(
'|', $reminders ) );
241 $userOptionsManager->saveOptions( $target );
308 TranslationStashActionApi::class,
313 if ( self::isSandboxed( $user ) ) {
314 $class = get_class( $module );
315 if ( $module->isWriteMode() && !in_array( $class, $inclusionList,
true ) ) {
316 $message = ApiMessage::create(
'apierror-writeapidenied' );