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