From 6b9a1c6d5b96dd55b05b9db5d4ab864973b7ff8f Mon Sep 17 00:00:00 2001 From: Alexandre Emsenhuber Date: Sun, 29 Jun 2014 15:17:43 +0200 Subject: [PATCH] Update Special:ChangeEmail to use HTMLForm Makes the code shorter and easier to read. Change-Id: I629cee4264fad6cde98495c0e8daffe5ea245b48 --- includes/specials/SpecialChangeEmail.php | 232 ++++++++--------------- 1 file changed, 78 insertions(+), 154 deletions(-) diff --git a/includes/specials/SpecialChangeEmail.php b/includes/specials/SpecialChangeEmail.php index 7fc4a17508..d3e7398c84 100644 --- a/includes/specials/SpecialChangeEmail.php +++ b/includes/specials/SpecialChangeEmail.php @@ -26,18 +26,11 @@ * * @ingroup SpecialPage */ -class SpecialChangeEmail extends UnlistedSpecialPage { +class SpecialChangeEmail extends FormSpecialPage { /** - * Users password - * @var string + * @var Status */ - protected $mPassword; - - /** - * Users new email address - * @var string - */ - protected $mNewEmail; + private $status; public function __construct() { parent::__construct( 'ChangeEmail', 'editmyprivateinfo' ); @@ -57,196 +50,128 @@ class SpecialChangeEmail extends UnlistedSpecialPage { * @param string $par */ function execute( $par ) { - global $wgAuth; - - $this->setHeaders(); - $this->outputHeader(); - $out = $this->getOutput(); $out->disallowUserJs(); $out->addModules( 'mediawiki.special.changeemail' ); - if ( !$wgAuth->allowPropChange( 'emailaddress' ) ) { - $this->error( 'cannotchangeemail' ); - - return; - } - - $user = $this->getUser(); - $request = $this->getRequest(); - - $this->requireLogin( 'changeemail-no-info' ); + return parent::execute( $par ); + } - if ( $request->wasPosted() && $request->getBool( 'wpCancel' ) ) { - $this->doReturnTo(); + protected function checkExecutePermissions( User $user ) { + global $wgAuth; - return; + if ( !$wgAuth->allowPropChange( 'emailaddress' ) ) { + throw new ErrorPageError( 'changeemail', 'cannotchangeemail' ); } - $this->checkReadOnly(); - $this->checkPermissions(); + $this->requireLogin( 'changeemail-no-info' ); // This could also let someone check the current email address, so // require both permissions. - if ( !$user->isAllowed( 'viewmyprivateinfo' ) ) { + if ( !$this->getUser()->isAllowed( 'viewmyprivateinfo' ) ) { throw new PermissionsError( 'viewmyprivateinfo' ); } - $this->mPassword = $request->getVal( 'wpPassword' ); - $this->mNewEmail = $request->getVal( 'wpNewEmail' ); + parent::checkExecutePermissions( $user ); + } - if ( $request->wasPosted() - && $user->matchEditToken( $request->getVal( 'token' ) ) - ) { - $info = $this->attemptChange( $user, $this->mPassword, $this->mNewEmail ); - if ( $info === true ) { - $this->doReturnTo(); - } elseif ( $info === 'eauth' ) { - # Notify user that a confirmation email has been sent... - $out->wrapWikiMsg( "
\n$1\n
", - 'eauthentsent', $user->getName() ); - $this->doReturnTo( 'soft' ); // just show the link to go back - return; // skip form - } - } + protected function getFormFields() { + $user = $this->getUser(); - $this->showForm(); - } + $fields = array( + 'Name' => array( + 'type' => 'info', + 'label-message' => 'username', + 'default' => $user->getName(), + ), + 'OldEmail' => array( + 'type' => 'info', + 'label-message' => 'changeemail-oldemail', + 'default' => $user->getEmail() ?: $this->msg( 'changeemail-none' )->text(), + ), + 'NewEmail' => array( + 'type' => 'email', + 'label-message' => 'changeemail-newemail', + ), + ); - /** - * @param string $type - */ - protected function doReturnTo( $type = 'hard' ) { - $titleObj = Title::newFromText( $this->getRequest()->getVal( 'returnto' ) ); - if ( !$titleObj instanceof Title ) { - $titleObj = Title::newMainPage(); - } - if ( $type == 'hard' ) { - $this->getOutput()->redirect( $titleObj->getFullURL() ); - } else { - $this->getOutput()->addReturnTo( $titleObj ); + if ( $this->getConfig()->get( 'RequirePasswordforEmailChange' ) ) { + $fields['Password'] = array( + 'type' => 'password', + 'label-message' => 'changeemail-password', + 'autofocus' => true, + ); } - } - /** - * @param string $msg - */ - protected function error( $msg ) { - $this->getOutput()->wrapWikiMsg( "

\n$1\n

", $msg ); + return $fields; } - protected function showForm() { - $user = $this->getUser(); + protected function alterForm( HTMLForm $form ) { + $form->setId( 'mw-changeemail-form' ); + $form->setTableId( 'mw-changeemail-table' ); + $form->setWrapperLegendMsg( 'changeemail-header' ); + $form->setSubmitTextMsg( 'changeemail-submit' ); + $form->addButton( 'wpCancel', $this->msg( 'changeemail-cancel' )->text() ); + $form->addHiddenField( 'returnto', $this->getRequest()->getVal( 'returnto' ) ); + } - $oldEmailText = $user->getEmail() - ? $user->getEmail() - : $this->msg( 'changeemail-none' )->text(); - - $this->getOutput()->addHTML( - Xml::fieldset( $this->msg( 'changeemail-header' )->text() ) . - Xml::openElement( 'form', - array( - 'method' => 'post', - 'action' => $this->getPageTitle()->getLocalURL(), - 'id' => 'mw-changeemail-form' ) ) . "\n" . - Html::hidden( 'token', $user->getEditToken() ) . "\n" . - Html::hidden( 'returnto', $this->getRequest()->getVal( 'returnto' ) ) . "\n" . - $this->msg( 'changeemail-text' )->parseAsBlock() . "\n" . - Xml::openElement( 'table', array( 'id' => 'mw-changeemail-table' ) ) . "\n" - ); - $items = array( - array( 'wpName', 'username', 'text', $user->getName() ), - array( 'wpOldEmail', 'changeemail-oldemail', 'text', $oldEmailText ), - array( 'wpNewEmail', 'changeemail-newemail', 'email', $this->mNewEmail ), - ); - if ( $this->getConfig()->get( 'RequirePasswordforEmailChange' ) ) { - $items[] = array( 'wpPassword', 'changeemail-password', 'password', $this->mPassword ); + public function onSubmit( array $data ) { + if ( $this->getRequest()->getBool( 'wpCancel' ) ) { + $status = Status::newGood( true ); + } else { + $password = isset( $data['Password'] ) ? $data['Password'] : null; + $status = $this->attemptChange( $this->getUser(), $password, $data['NewEmail'] ); } - $this->getOutput()->addHTML( - $this->pretty( $items ) . - "\n" . - "\n" . - "\n" . - '' . - Xml::submitButton( $this->msg( 'changeemail-submit' )->text() ) . - Xml::submitButton( $this->msg( 'changeemail-cancel' )->text(), array( 'name' => 'wpCancel' ) ) . - "\n" . - "\n" . - Xml::closeElement( 'table' ) . - Xml::closeElement( 'form' ) . - Xml::closeElement( 'fieldset' ) . "\n" - ); + $this->status = $status; + + return $status; } - /** - * @param array $fields - * @return string - */ - protected function pretty( $fields ) { - $out = ''; - foreach ( $fields as $list ) { - list( $name, $label, $type, $value ) = $list; - if ( $type == 'text' ) { - $field = htmlspecialchars( $value ); - } else { - $attribs = array( 'id' => $name ); - if ( $name == 'wpPassword' ) { - $attribs[] = 'autofocus'; - } - $field = Html::input( $name, $value, $type, $attribs ); - } - $out .= "\n"; - $out .= "\t"; - if ( $type != 'text' ) { - $out .= Xml::label( $this->msg( $label )->text(), $name ); - } else { - $out .= $this->msg( $label )->escaped(); - } - $out .= "\n"; - $out .= "\t"; - $out .= $field; - $out .= "\n"; - $out .= ""; + public function onSuccess() { + $titleObj = Title::newFromText( $this->getRequest()->getVal( 'returnto' ) ); + if ( !$titleObj instanceof Title ) { + $titleObj = Title::newMainPage(); } - return $out; + if ( $this->status->value === true ) { + $this->getOutput()->redirect( $titleObj->getFullURL() ); + } elseif ( $this->status->value === 'eauth' ) { + # Notify user that a confirmation email has been sent... + $this->getOutput()->wrapWikiMsg( "
\n$1\n
", + 'eauthentsent', $this->getUser()->getName() ); + $this->getOutput()->addReturnTo( $titleObj ); // just show the link to go back + } } /** * @param User $user * @param string $pass * @param string $newaddr - * @return bool|string True or string on success, false on failure + * @return Status */ protected function attemptChange( User $user, $pass, $newaddr ) { global $wgAuth; if ( $newaddr != '' && !Sanitizer::validateEmail( $newaddr ) ) { - $this->error( 'invalidemailaddress' ); - - return false; + return Status::newFatal( 'invalidemailaddress' ); } $throttleCount = LoginForm::incLoginThrottle( $user->getName() ); if ( $throttleCount === true ) { $lang = $this->getLanguage(); $throttleInfo = $this->getConfig()->get( 'PasswordAttemptThrottle' ); - $this->error( array( + return Status::newFatal( 'changeemail-throttled', $lang->formatDuration( $throttleInfo['seconds'] ) - ) ); - - return false; + ); } if ( $this->getConfig()->get( 'RequirePasswordforEmailChange' ) && !$user->checkTemporaryPassword( $pass ) && !$user->checkPassword( $pass ) ) { - $this->error( 'wrongpassword' ); - - return false; + return Status::newFatal( 'wrongpassword' ); } if ( $throttleCount ) { @@ -256,12 +181,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage { $oldaddr = $user->getEmail(); $status = $user->setEmailWithConfirmation( $newaddr ); if ( !$status->isGood() ) { - $this->getOutput()->addHTML( - '

' . - $this->getOutput()->parseInline( $status->getWikiText( 'mailerror' ) ) . - '

' ); - - return false; + return $status; } wfRunHooks( 'PrefsEmailAudit', array( $user, $oldaddr, $newaddr ) ); @@ -270,7 +190,11 @@ class SpecialChangeEmail extends UnlistedSpecialPage { $wgAuth->updateExternalDB( $user ); - return $status->value; + return $status; + } + + public function requiresUnblock() { + return false; } protected function getGroupName() { -- 2.20.1