Parent5446 has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/52432


Change subject: Added separate pages for authentication; i18n typo.
......................................................................

Added separate pages for authentication; i18n typo.

Added functionality so that the user enters the
OTP on a separate page rather than on the login
form (mainly for UX so users without a token are
not confused by the field).

Also fixed a typo in the extension messages and
added a missing Qqq message.

Change-Id: If0b48654cab8d1ded4410fbf894ed0eaa1f71bef
---
M SpecialTwoFactorAuth.php
M TwoFactorAuth.i18n.php
M TwoFactorAuth.php
M lib/TwoFactorUser.php
4 files changed, 91 insertions(+), 35 deletions(-)


  git pull 
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/TwoFactorAuthentication 
refs/changes/32/52432/1

diff --git a/SpecialTwoFactorAuth.php b/SpecialTwoFactorAuth.php
index 613b6a9..090d21f 100644
--- a/SpecialTwoFactorAuth.php
+++ b/SpecialTwoFactorAuth.php
@@ -26,6 +26,7 @@
 
                $this->action = $this->TwoFactorUser->enabled() ? 'disable' : 
'enable';
                $this->reset = $this->getRequest()->getCheck( 'reset' );
+               $this->loginRequest = false;
        }
 
        /**
@@ -43,8 +44,26 @@
         */
        protected function checkExecutePermissions( User $user ) {
                parent::checkExecutePermissions( $user );
-               if( !$user->isLoggedIn() ) {
+               if( !$user->isLoggedIn() && !$this->loginRequest ) {
                        throw new UserNotLoggedIn();
+               }
+       }
+
+       /**
+        * If the parameter is /auth, we're authenticating.
+        */
+       function setParameter( $par ) {
+               global $wgTwoFactorSeparatePages;
+               if ( $wgTwoFactorSeparatePages && $par === 'auth' ) {
+                       $loginRequest = $this->getRequest()->getSessionData( 
'wsLoginRequest' );
+                       if ( $loginRequest ) {
+                               $this->action = 'auth';
+                               $this->loginRequest = $loginRequest;
+
+                               $user = User::newFromName( 
$this->loginRequest->getText( 'wpName' ) );
+                               $this->TwoFactorUser = new TwoFactorAuthUser( 
$user );
+                               $this->TwoFactorUser->loadFromDatabase();
+                       }
                }
        }
 
@@ -136,14 +155,19 @@
         * @return bool
         */
        public function onSubmit( array $formData ) {
-               var_dump( $formData );
+               global $wgOut;
+
                $verify = $this->TwoFactorUser->verifyToken( $formData['token'] 
);
                if( !$verify ) {
                        $this->getOutput()->addWikiMsg( 
'twofactorauth-authfailed' );
                        return false;
                }
 
-               if( $this->action == 'enable' ) {
+               if( $this->action == 'auth' ) {
+                       $login = new LoginForm( $this->loginRequest );
+                       $login->execute( null );
+                       $result = true;
+               } elseif( $this->action == 'enable' ) {
                        $result = $this->TwoFactorUser->enable();
                } elseif( $this->reset ) {
                        $this->TwoFactorUser->regenerateScratchTokens();
@@ -165,6 +189,10 @@
         * Display a success message.
         */
        public function onSuccess() {
+               if( $this->action == 'auth' ) {
+                       return;
+               }
+
                if( $this->reset ) {
                        $backupTokens = Html::rawElement( 'table', array(),
                                Html::rawElement( 'tr', array(),
diff --git a/TwoFactorAuth.i18n.php b/TwoFactorAuth.i18n.php
index 73d12a7..16badd3 100644
--- a/TwoFactorAuth.i18n.php
+++ b/TwoFactorAuth.i18n.php
@@ -27,6 +27,7 @@
        'twofactorauth-title-enable' => 'Enable Two Factor Authentication',
        'twofactorauth-title-disable' => 'Disable Two Factor Authentication',
        'twofactorauth-title-reset' => 'Reset Two Factor Authentication',
+       'twofactorauth-title-auth' => 'Login with Two Factor Authentication',
        'twofactorauth-enabledisable' => 'Enable/Disable Two Factor 
Authentication',
        'twofactorauth-token' => 'Token',
        'twofactorauth-qrcode' => 'QR Code Secret',
@@ -34,8 +35,9 @@
        'twofactorauth-authfailed' => 'Failed to validate two factor 
credentials',
        'twofactorauth-success-enable' => 'Two step verification successfully 
enabled.',
        'twofactorauth-success-disable' => 'Two step verification successfully 
disabled.',
-       'twofactoruath-enable' => 'Enable',
+       'twofactorauth-enable' => 'Enable',
        'twofactorauth-disable' => 'Disable',
+       'twofactorauth-auth' => 'Login',
        'twofactorauth-resetscratchtokens' => 'Reset Backup Tokens',
        'twofactorauth-scratchwarning-link' => 'reset your backup tokens',
        'twofactorauth-scratchwarning-text' => '<b>Warning!</b> The number of 
backup tokens you have for Two Factor authentication is running low. It is 
recommended you $1 soon.',
@@ -59,6 +61,7 @@
        'twofactorauth-title-enable' => 'Page title on Special:TwoFactorAuth, 
when enabling twofactor.',
        'twofactorauth-title-disable' => 'Page title on Special:TwoFactorAuth 
while disabling twofactor.',
        'twofactorauth-title-reset' => 'Page title when resetting scratch 
tokens',
+       'twofactorauth-title-auth' => 'Page title when user is logging in and 
needs to authenticate with a token',
        'twofactorauth-enabledisable' => 'Label for the link to 
Special:TwoFactorAuth from [[Special:Preferences]].',
        'twofactorauth-token' => 'HTMLForm label, found on 
Special:TwoFactorAuth, when verifying twofactor.',
        'twofactorauth-qrcode' => 'HTMLForm label, found on 
Special:TwoFactorAuth, for the QR code secret.',
@@ -66,7 +69,9 @@
        'twofactorauth-authfailed' => 'Plain text, found on 
Special:TwoFactorAuth when failing to enable twofactor.',
        'twofactorauth-success-enable' => 'Success message after enabling 
two-factor authentication.',
        'twofactorauth-success-disable' => 'Success message after disabling 
two-factor authentication.',
+       'twofactorauth-enable' => 'Label for submit button to enable two-factor 
auth',
        'twofactorauth-disable' => 'Label for submit button to disable 
two-factor auth',
+       'twofactorauth-auth' => 'Label for submit button to log in with 
two-factor auth',
        'twofactorauth-resetscratchtokens' => 'Label for submit button to reset 
scratch tokens',
        'twofactorauth-scratchwarning-link' => 'Text for the link to 
Special:TwoFactorAuth when warning the user about backup tokens. It is used as 
parameter $1 in {{msg-mw|Twofactorauth-scratchwarning-text}}.',
        'twofactorauth-scratchwarning-text' => 'This message is a warning and 
the first parameter is the link to the special page. Parameters:
@@ -87,7 +92,7 @@
        'twofactorauth-desc' => 'Прапануе падтрымку аўтэнтыфікацыі з 
выкарыстаньнем аднаразовых пароляў на аснове HMAC',
        'twofactorauth' => 'Двухфактарная аўтэнтыфікацыя',
        'twofactorauth-token' => 'Токен',
-       'twofactoruath-enable' => 'Уключыць',
+       'twofactorauth-enable' => 'Уключыць',
        'twofactorauth-disable' => 'Выключыць',
 );
 
@@ -95,14 +100,14 @@
  * @author Y-M D
  */
 $messages['br'] = array(
-       'twofactoruath-enable' => 'Gweredekaat',
+       'twofactorauth-enable' => 'Gweredekaat',
 );
 
 /** Czech (česky)
  * @author Vks
  */
 $messages['cs'] = array(
-       'twofactoruath-enable' => 'Povolit',
+       'twofactorauth-enable' => 'Povolit',
        'twofactorauth-disable' => 'Zakázat',
 );
 
@@ -127,7 +132,7 @@
        'twofactorauth-authfailed' => 'Die Zwei-Faktor-Anmeldeinformationen 
konnten nicht bestätigt werden.',
        'twofactorauth-success-enable' => 'Zwei-Schritte-Überprüfung wurde 
erfolgreich aktiviert.',
        'twofactorauth-success-disable' => 'Zwei-Schritte-Überprüfung wurde 
erfolgreich deaktiviert.',
-       'twofactoruath-enable' => 'Aktivieren',
+       'twofactorauth-enable' => 'Aktivieren',
        'twofactorauth-disable' => 'Deaktivieren',
        'twofactorauth-resetscratchtokens' => 'Sicherungstoken zurücksetzen',
        'twofactorauth-scratchwarning-link' => 'Setze deine Sicherungstoken 
zurück',
@@ -163,7 +168,7 @@
        'twofactorauth-authfailed' => 'Error al validar las credenciales de dos 
factores',
        'twofactorauth-success-enable' => 'La verificación de dos pasos se ha 
activado correctamente.',
        'twofactorauth-success-disable' => 'La verificación de dos pasos se ha 
desactivado correctamente.',
-       'twofactoruath-enable' => 'Activar',
+       'twofactorauth-enable' => 'Activar',
        'twofactorauth-disable' => 'Desactivar',
        'twofactorauth-resetscratchtokens' => 'Restablecer las claves de 
respaldo',
        'twofactorauth-scratchwarning-link' => 'restablecer tus claves de 
respaldo',
@@ -174,7 +179,7 @@
  * @author Mjbmr
  */
 $messages['fa'] = array(
-       'twofactoruath-enable' => 'فعال سازی',
+       'twofactorauth-enable' => 'فعال سازی',
        'twofactorauth-disable' => 'غیرفعال سازی',
 );
 
@@ -199,7 +204,7 @@
        'twofactorauth-authfailed' => 'Échec de validation des identités à deux 
facteurs',
        'twofactorauth-success-enable' => 'Vérification à deux étapes bien 
activée.',
        'twofactorauth-success-disable' => 'Vérification à deux étapes bien 
désactivée.',
-       'twofactoruath-enable' => 'Activé',
+       'twofactorauth-enable' => 'Activé',
        'twofactorauth-disable' => 'Désactivé',
        'twofactorauth-resetscratchtokens' => 'Réinitialiser les jetons 
enregistrés',
        'twofactorauth-scratchwarning-link' => 'réinitialiser vos jetons 
enregistrés',
@@ -212,7 +217,7 @@
 $messages['frp'] = array(
        'twofactorauth-token' => 'Jeton',
        'twofactorauth-qrcode' => 'Code secrèt QR',
-       'twofactoruath-enable' => 'Activar',
+       'twofactorauth-enable' => 'Activar',
        'twofactorauth-disable' => 'Dèsactivar',
 );
 
@@ -236,7 +241,7 @@
        'twofactorauth-authfailed' => 'Erro ao validar as credenciais de dous 
factores',
        'twofactorauth-success-enable' => 'A verificación en dous pasos 
activouse correctamente.',
        'twofactorauth-success-disable' => 'A verificación en dous pasos 
desactivouse correctamente.',
-       'twofactoruath-enable' => 'Activar',
+       'twofactorauth-enable' => 'Activar',
        'twofactorauth-disable' => 'Desactivar',
        'twofactorauth-resetscratchtokens' => 'Restablecer os pases de 
respaldo',
        'twofactorauth-scratchwarning-link' => 'restableza os seus pases de 
respaldo',
@@ -263,7 +268,7 @@
        'twofactorauth-authfailed' => 'Dwufaktorowe přizjewjenske informacije 
njedachu so přepruwować',
        'twofactorauth-success-enable' => 'Dwukročelowe přepruwowanje wuspěšnje 
zmóžnjene.',
        'twofactorauth-success-disable' => 'Dwukročelowe přepruwowanje 
wuspěšnje znjemóžnjene.',
-       'twofactoruath-enable' => 'Zmóžnić',
+       'twofactorauth-enable' => 'Zmóžnić',
        'twofactorauth-disable' => 'Znjemóžnić',
        'twofactorauth-resetscratchtokens' => 'Zawěsćenske tokeny wróćo stajić',
        'twofactorauth-scratchwarning-link' => 'swoje zawěsćenske tokeny wróćo 
stajiš',
@@ -290,7 +295,7 @@
        'twofactorauth-authfailed' => 'Impossibile convalidare le credenziali a 
due fattori',
        'twofactorauth-success-enable' => 'Verifica in due passaggi 
correttamente abilitata.',
        'twofactorauth-success-disable' => 'Verifica in due passaggi 
correttamente disabilitata.',
-       'twofactoruath-enable' => 'Abilita',
+       'twofactorauth-enable' => 'Abilita',
        'twofactorauth-disable' => 'Disabilita',
        'twofactorauth-resetscratchtokens' => 'Ripristino token di backup',
        'twofactorauth-scratchwarning-link' => 'ripristinare i propri token di 
backup',
@@ -316,7 +321,7 @@
        'twofactorauth-authfailed' => '二要素信用情報の検証に失敗しました。',
        'twofactorauth-success-enable' => '二段階検証を有効にしました。',
        'twofactorauth-success-disable' => '二段階検証を無効にしました。',
-       'twofactoruath-enable' => '有効',
+       'twofactorauth-enable' => '有効',
        'twofactorauth-disable' => '無効',
        'twofactorauth-resetscratchtokens' => 'バックアップ トークンをリセット',
        'twofactorauth-scratchwarning-link' => '自分のバックアップ トークンをリセット',
@@ -328,7 +333,7 @@
  */
 $messages['ka'] = array(
        'twofactorauth-token' => 'ჟეტონი',
-       'twofactoruath-enable' => 'ჩართული',
+       'twofactorauth-enable' => 'ჩართული',
        'twofactorauth-disable' => 'გამორთული',
 );
 
@@ -336,7 +341,7 @@
  * @author Purodha
  */
 $messages['ksh'] = array(
-       'twofactoruath-enable' => 'Enschallde',
+       'twofactorauth-enable' => 'Enschallde',
        'twofactorauth-disable' => 'Ußschallde',
 );
 
@@ -344,7 +349,7 @@
  * @author Robby
  */
 $messages['lb'] = array(
-       'twofactoruath-enable' => 'Aschalten',
+       'twofactorauth-enable' => 'Aschalten',
        'twofactorauth-disable' => 'Ausschalten',
 );
 
@@ -368,7 +373,7 @@
        'twofactorauth-authfailed' => 'Не успеав да го заверам двофакторското 
полномоштво',
        'twofactorauth-success-enable' => 'Двофакторската заверка е успешно 
овозможена.',
        'twofactorauth-success-disable' => 'Двофакторската заверка е успешно 
оневозможена.',
-       'twofactoruath-enable' => 'Овозможи',
+       'twofactorauth-enable' => 'Овозможи',
        'twofactorauth-disable' => 'Оневозможи',
        'twofactorauth-resetscratchtokens' => 'Презадавање на резервни жетони',
        'twofactorauth-scratchwarning-link' => 'презададете резервни жетони',
@@ -395,7 +400,7 @@
        'twofactorauth-authfailed' => 'Het valideren van de gebruikersgegevens 
voor twee-factor is mislukt.',
        'twofactorauth-success-enable' => 'Twee-factorverificatie is 
ingeschakeld.',
        'twofactorauth-success-disable' => 'Twee-factorverificatie is 
uitgeschakeld.',
-       'twofactoruath-enable' => 'Inschakelen',
+       'twofactorauth-enable' => 'Inschakelen',
        'twofactorauth-disable' => 'Uitschakelen',
        'twofactorauth-resetscratchtokens' => 'Back-uptokens opnieuw instellen',
        'twofactorauth-scratchwarning-link' => 'back-uptokens opnieuw 
instellen',
@@ -423,7 +428,7 @@
        'twofactorauth-authfailed' => 'Falì a validé le credensiaj a doi fator',
        'twofactorauth-success-enable' => 'Abilità da bin la verìfica a doi 
pass.',
        'twofactorauth-success-disable' => 'Disabilità da bin la verìfica a doi 
pass.',
-       'twofactoruath-enable' => 'Abìlita',
+       'twofactorauth-enable' => 'Abìlita',
        'twofactorauth-disable' => 'Disabìlita',
        'twofactorauth-resetscratchtokens' => 'Amposté torna ij Geton argistrà',
        'twofactorauth-scratchwarning-link' => "d'amposté torna ij sò geton 
argistrà",
@@ -434,7 +439,7 @@
  * @author Ahmed-Najib-Biabani-Ibrahimkhel
  */
 $messages['ps'] = array(
-       'twofactoruath-enable' => 'چارنول',
+       'twofactorauth-enable' => 'چارنول',
        'twofactorauth-disable' => 'ناچارنول',
 );
 
@@ -455,7 +460,7 @@
        'twofactorauth-scratch' => 'උපස්ථ ටෝකන',
        'twofactorauth-success-enable' => 'දෙ පිය සත්‍යාපනය සාර්ථකව සක්‍රිය කරන 
ලදී.',
        'twofactorauth-success-disable' => 'දෙ පිය සත්‍යාපනය සාර්ථකව අක්‍රිය 
කරන ලදී.',
-       'twofactoruath-enable' => 'සක්‍රීය කරන්න',
+       'twofactorauth-enable' => 'සක්‍රීය කරන්න',
        'twofactorauth-disable' => 'අක්‍රීය කරන්න',
        'twofactorauth-resetscratchtokens' => 'උපස්ථ ටෝකන යළි සකසන්න',
        'twofactorauth-scratchwarning-link' => 'ඔබේ උපස්ථ ටෝකන යළි සකසන්න',
@@ -465,7 +470,7 @@
  * @author WikiPhoenix
  */
 $messages['sv'] = array(
-       'twofactoruath-enable' => 'Aktivera',
+       'twofactorauth-enable' => 'Aktivera',
        'twofactorauth-disable' => 'Inaktivera',
 );
 
@@ -473,7 +478,7 @@
  * @author மதனாஹரன்
  */
 $messages['ta'] = array(
-       'twofactoruath-enable' => 'செயலாக்கு',
+       'twofactorauth-enable' => 'செயலாக்கு',
 );
 
 /** Tagalog (Tagalog)
@@ -496,7 +501,7 @@
        'twofactorauth-authfailed' => 'Nabigo sa pagpapatunay ng dalawang salik 
na mga kredensiyal',
        'twofactorauth-success-enable' => 'Matagumpay na napagana ang 
pagpapatunay na may dalawang hakbang.',
        'twofactorauth-success-disable' => 'Hindi na pinagagana ang 
pagpapatunay na may dalawang hakbang.',
-       'twofactoruath-enable' => 'Paganahin',
+       'twofactorauth-enable' => 'Paganahin',
        'twofactorauth-disable' => 'Huwag paganahin',
        'twofactorauth-resetscratchtokens' => 'Itakdang Muli Ang Mga Kahalip Na 
Pansalo',
        'twofactorauth-scratchwarning-link' => 'itakdang muli ang iyong mga 
kahalip na pansalo',
@@ -524,7 +529,7 @@
        'twofactorauth-authfailed' => 'Не вдалося перевірити двофакторні 
повноваження',
        'twofactorauth-success-enable' => 'Двокрокова верифікація успішно 
активована.',
        'twofactorauth-success-disable' => 'Двокрокова верифікація успішно 
вимкнена.',
-       'twofactoruath-enable' => 'Увімкнути',
+       'twofactorauth-enable' => 'Увімкнути',
        'twofactorauth-disable' => 'Вимкнути',
        'twofactorauth-resetscratchtokens' => 'Скиданути резервне копіювання 
маркерів',
        'twofactorauth-scratchwarning-link' => 'скидання резервного копіювання 
маркерів',
@@ -546,7 +551,7 @@
        'twofactorauth-title-reset' => '重置双因素身份验证',
        'twofactorauth-enabledisable' => '启用/禁用双因素身份验证',
        'twofactorauth-token' => '令牌',
-       'twofactoruath-enable' => '启用',
+       'twofactorauth-enable' => '启用',
        'twofactorauth-disable' => '禁用',
 );
 
@@ -557,6 +562,6 @@
        'twofactorauth' => '雙因素身份驗證',
        'twofactorauth-legend' => '雙因素身份驗證',
        'twofactorauth-account' => '雙因素帳戶名:',
-       'twofactoruath-enable' => '啟用',
+       'twofactorauth-enable' => '啟用',
        'twofactorauth-disable' => '禁用',
 );
diff --git a/TwoFactorAuth.php b/TwoFactorAuth.php
index e7d98fe..25f2de7 100644
--- a/TwoFactorAuth.php
+++ b/TwoFactorAuth.php
@@ -34,6 +34,11 @@
  */
 $wgTwoFactorWindowLeniency = 1;
 
+/**
+ * Whether to show the two factor authentication on another page.
+ */
+$wgTwoFactorSeparatePages = true;
+
 $wgExtensionCredits['other'][] = array(
        'path' => __FILE__,
        'name' => 'TwoFactorAuth',
@@ -77,6 +82,12 @@
  * @return bool
  */
 function TwoFactorAuth_LoginForm( &$template ) {
+       global $wgTwoFactorSeparatePages;
+
+       if( $wgTwoFactorSeparatePages ) {
+               return true;
+       }
+
        if( isset( $template->data['extrafields'] ) ) {
                $extrafields = $template->data['extrafields'];
        } else {
@@ -144,12 +155,24 @@
  * @param $result bool
  * @return bool
  */
-function TwoFactorAuth_onAbortLogin( $user, $password, &$result ) {
-       global $wgRequest;
+function TwoFactorAuth_onAbortLogin( User $user, $password, &$result ) {
+       global $wgTwoFactorSeparatePages;
 
+       $context = RequestContext::getMain();
        $authuser = new TwoFactorAuthUser( $user );
-       $token = $wgRequest->getText( 'wpTwoFactorToken' );
-       if( $authuser->loadFromDatabase() && !$authuser->verifyToken( $token ) 
) {
+       if ( !$authuser->loadFromDatabase() || !$context->getTitle()->equals( 
SpecialPage::getTitleFor( 'Userlogin' ) ) ) {
+               return true;
+       }
+
+       if ( $wgTwoFactorSeparatePages ) {
+               $authuser->saveToSession();
+               $context->getRequest()->setSessionData( 'wsLoginRequest', 
$context->getRequest() );
+               $context->getOutput()->redirect(
+                       SpecialPage::getTitleFor( 'TwoFactorAuth', 'auth' )
+                       ->getFullURL( '', false, PROTO_CURRENT )
+               );
+               return false;
+       } elseif( !$authuser->verifyToken( $context->getRequest()->getText( 
'wpTwoFactorToken' ) ) ) {
                $result = LoginForm::WRONG_PLUGIN_PASS;
                return false;
        }
diff --git a/lib/TwoFactorUser.php b/lib/TwoFactorUser.php
index 931e490..be4f58d 100644
--- a/lib/TwoFactorUser.php
+++ b/lib/TwoFactorUser.php
@@ -15,7 +15,7 @@
         *
         * @param $user User object
         */
-       public function __construct( $user ) {
+       public function __construct( User $user ) {
                $this->user = $user;
                $this->enabled = false;
        }

-- 
To view, visit https://gerrit.wikimedia.org/r/52432
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: If0b48654cab8d1ded4410fbf894ed0eaa1f71bef
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/TwoFactorAuthentication
Gerrit-Branch: master
Gerrit-Owner: Parent5446 <tylerro...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to