public function execute()
 {
     $users = 10;
     // For number of translations, limited to [0,20]
     $mean = 15;
     $stddev = 20;
     $stash = new TranslationStashStorage(wfGetDB(DB_MASTER));
     $languages = array_keys(Language::fetchLanguageNames());
     for ($i = 0; $i < $users; $i++) {
         $username = '******' . wfRandomString(6);
         $password = wfRandomString(12);
         $email = "{$username}.{$password}@blackhole.io";
         $user = TranslateSandbox::addUser($username, $password, $email);
         $language = $languages[rand(0, count($languages) - 1)];
         $count = wfGaussMs($mean, $stddev);
         $count = min(20, $count);
         $count = max(0, $count);
         for ($j = 0; $j < $count; $j++) {
             $title = Title::makeTitle(NS_MEDIAWIKI, wfRandomString(24) . '/' . $language);
             $value = array('Pupu söi');
             for ($k = rand(0, 20); $k > 0; $k--) {
                 $value[] = wfRandomString(rand(1, 28));
             }
             $value = implode("\n", $value);
             $translation = new StashedTranslation($user, $title, $value);
             $stash->addTranslation($translation);
         }
     }
 }
 public function testPermissions()
 {
     $user = TranslateSandbox::addUser('Test user7', '*****@*****.**', 'test password');
     $title = Title::makeTitle(NS_USER_TALK, $user->getName());
     $this->assertFalse($title->userCan('edit', $user), 'Sandboxed users cannot edit their own talk page');
     TranslateSandbox::promoteUser($user);
     $this->assertTrue($title->userCan('edit', $user), 'Promoted users can edit their own talk page');
 }
 /**
  * Checks that the user is in the sandbox. Also handles special overrides
  * mainly used for integration testing.
  *
  * @return bool
  */
 protected function hasPermissionToUse()
 {
     global $wgTranslateTestUsers;
     $request = $this->getRequest();
     $user = $this->getUser();
     if (in_array($user->getName(), $wgTranslateTestUsers, true)) {
         if ($request->getVal('integrationtesting') === 'activatestash') {
             $user->addGroup('translate-sandboxed');
             return true;
         } elseif ($request->getVal('integrationtesting') === 'deactivatestash') {
             $user->removeGroup('translate-sandboxed');
             $this->stash->deleteTranslations($user);
             return false;
         }
     }
     if (!TranslateSandbox::isSandboxed($user)) {
         return false;
     }
     return true;
 }
 /**
  * Whitelisting for certain API modules. See also enforcePermissions.
  * Hook: ApiCheckCanExecute
  */
 public static function onApiCheckCanExecute(ApiBase $module, User $user, &$message)
 {
     $whitelist = array('ApiTranslationStash', 'ApiOptions');
     if (TranslateSandbox::isSandboxed($user)) {
         $class = get_class($module);
         if ($module->isWriteMode() && !in_array($class, $whitelist, true)) {
             $message = 'writerequired';
             return false;
         }
     }
     return true;
 }
    protected function makeList()
    {
        $items = array();
        $requests = array();
        $users = TranslateSandbox::getUsers();
        /** @var User $user */
        foreach ($users as $user) {
            $reminders = $user->getOption('translate-sandbox-reminders');
            $reminders = $reminders ? explode('|', $reminders) : array();
            $remindersCount = count($reminders);
            if ($remindersCount) {
                $lastReminderTimestamp = new MWTimestamp(end($reminders));
                $lastReminderAgo = htmlspecialchars($lastReminderTimestamp->getHumanTimestamp());
            } else {
                $lastReminderAgo = '';
            }
            $requests[] = array('username' => $user->getName(), 'email' => $user->getEmail(), 'gender' => $user->getOption('gender'), 'registrationdate' => $user->getRegistration(), 'translations' => count($this->stash->getTranslations($user)), 'languagepreferences' => FormatJson::decode($user->getOption('translate-sandbox')), 'userid' => $user->getId(), 'reminderscount' => $remindersCount, 'lastreminder' => $lastReminderAgo);
        }
        // Sort the requests based on translations and registration date
        usort($requests, array(__CLASS__, 'translatorRequestSort'));
        foreach ($requests as $request) {
            $items[] = $this->makeRequestItem($request);
        }
        $requestsList = implode("\n", $items);
        return <<<HTML
<div class="row request-header">
\t<div class="four columns">
\t\t<button class="language-selector unselected">
\t\t\t{$this->msg("tsb-all-languages-button-label")->escaped()}
\t\t</button>
\t</div>
\t<div class="five columns request-count"></div>
\t<div class="three columns center">
\t\t<input class="request-selector-all" name="request" type="checkbox" />
\t</div>
</div>
<div class="requests-list">
\t{$requestsList}
</div>
HTML;
    }
 protected function doRemind()
 {
     $params = $this->extractRequestParams();
     foreach ($params['userid'] as $user) {
         $user = User::newFromId($user);
         try {
             TranslateSandbox::sendEmail($this->getUser(), $user, 'reminder');
         } catch (MWException $e) {
             $this->dieUsage($e->getMessage(), 'invalidparam');
         }
     }
 }