* Add id="mw-user-domain-section" to <tr> tag in Userlogin.php template so that
admins with a single domain can hide the domain section using CSS
* Dropped old Paser_OldPP class. Only new parser with preprocessor is used.
+* Moved password reset form from Special:Preferences to Special:ResetPass
+* Added Special:ChangePassword as a special page alias for Special:ResetPass
=== Bug fixes in 1.14 ===
'CreateAccount' => array( 'SpecialRedirectToSpecial', 'CreateAccount', 'Userlogin', 'signup', array( 'uselang' ) ),
'Preferences' => array( 'SpecialPage', 'Preferences' ),
'Watchlist' => array( 'SpecialPage', 'Watchlist' ),
+ 'Resetpass' => array( 'SpecialPage', 'Resetpass' ),
+
'Recentchanges' => 'SpecialRecentchanges',
'Upload' => array( 'SpecialPage', 'Upload' ),
'Recentchangeslinked' => 'SpecialRecentchangeslinked',
'Movepage' => array( 'UnlistedSpecialPage', 'Movepage' ),
'Blockme' => array( 'UnlistedSpecialPage', 'Blockme' ),
- 'Resetpass' => array( 'UnlistedSpecialPage', 'Resetpass' ),
'Booksources' => 'SpecialBookSources',
'Categories' => array( 'SpecialPage', 'Categories' ),
'Export' => array( 'SpecialPage', 'Export' ),
* @ingroup SpecialPage
*/
class PreferencesForm {
- var $mQuickbar, $mOldpass, $mNewpass, $mRetypePass, $mStubs;
+ var $mQuickbar, $mStubs;
var $mRows, $mCols, $mSkin, $mMath, $mDate, $mUserEmail, $mEmailFlag, $mNick;
var $mUserLanguage, $mUserVariant;
var $mSearch, $mRecent, $mRecentDays, $mHourDiff, $mSearchLines, $mSearchChars, $mAction;
global $wgContLang, $wgUser, $wgAllowRealName;
$this->mQuickbar = $request->getVal( 'wpQuickbar' );
- $this->mOldpass = $request->getVal( 'wpOldpass' );
- $this->mNewpass = $request->getVal( 'wpNewpass' );
- $this->mRetypePass =$request->getVal( 'wpRetypePass' );
$this->mStubs = $request->getVal( 'wpStubs' );
$this->mRows = $request->getVal( 'wpRows' );
$this->mCols = $request->getVal( 'wpCols' );
global $wgEmailAuthentication, $wgRCMaxAge;
global $wgAuth, $wgEmailConfirmToEdit;
-
- if ( ($this->mNewpass !== '' || $this->mOldpass !== '' ) && $wgAuth->allowPasswordChange() ) {
- if ( $this->mNewpass != $this->mRetypePass ) {
- wfRunHooks( 'PrefsPasswordAudit', array( $wgUser, $this->mNewpass, 'badretype' ) );
- $this->mainPrefsForm( 'error', wfMsg( 'badretype' ) );
- return;
- }
-
- if (!$wgUser->checkPassword( $this->mOldpass )) {
- wfRunHooks( 'PrefsPasswordAudit', array( $wgUser, $this->mNewpass, 'wrongpassword' ) );
- $this->mainPrefsForm( 'error', wfMsg( 'wrongpassword' ) );
- return;
- }
-
- try {
- $wgUser->setPassword( $this->mNewpass );
- wfRunHooks( 'PrefsPasswordAudit', array( $wgUser, $this->mNewpass, 'success' ) );
- $this->mNewpass = $this->mOldpass = $this->mRetypePass = '';
- } catch( PasswordError $e ) {
- wfRunHooks( 'PrefsPasswordAudit', array( $wgUser, $this->mNewpass, 'error' ) );
- $this->mainPrefsForm( 'error', $e->getMessage() );
- return;
- }
- }
$wgUser->setRealName( $this->mRealName );
$oldOptions = $wgUser->mOptions;
function resetPrefs() {
global $wgUser, $wgLang, $wgContLang, $wgContLanguageCode, $wgAllowRealName;
- $this->mOldpass = $this->mNewpass = $this->mRetypePass = '';
$this->mUserEmail = $wgUser->getEmail();
$this->mUserEmailAuthenticationtimestamp = $wgUser->getEmailAuthenticationtimestamp();
$this->mRealName = ($wgAllowRealName) ? $wgUser->getRealName() : '';
# Password
if( $wgAuth->allowPasswordChange() ) {
+ $link = $wgUser->getSkin()->link( SpecialPage::getTitleFor( 'ResetPass' ), wfMsgHtml( 'prefs-resetpass' ),
+ array() , array('returnto' => SpecialPage::getTitleFor( 'Preferences') ) );
$wgOut->addHTML(
$this->tableRow( Xml::element( 'h2', null, wfMsg( 'changepassword' ) ) ) .
- $this->tableRow(
- Xml::label( wfMsg( 'oldpassword' ), 'wpOldpass' ),
- Xml::password( 'wpOldpass', 25, $this->mOldpass, array( 'id' => 'wpOldpass', 'autocomplete' => 'off' ) )
- ) .
- $this->tableRow(
- Xml::label( wfMsg( 'newpassword' ), 'wpNewpass' ),
- Xml::password( 'wpNewpass', 25, $this->mNewpass, array( 'id' => 'wpNewpass', 'autocomplete' => 'off' ) )
- ) .
- $this->tableRow(
- Xml::label( wfMsg( 'retypenew' ), 'wpRetypePass' ),
- Xml::password( 'wpRetypePass', 25, $this->mRetypePass, array( 'id' => 'wpRetypePass', 'autocomplete' => 'off' ) )
- )
- );
- if( $wgCookieExpiration > 0 ){
- $wgOut->addHTML(
- $this->tableRow( $this->getToggle( "rememberpassword" ) )
- );
- } else {
- $this->mUsedToggles['rememberpassword'] = true;
- }
+ $this->tableRow( '<ul><li>' . $link . '</li></ul>' ) );
}
# <FIXME>
function __construct( $name=null, $reset=null ) {
if( $name !== null ) {
$this->mName = $name;
- $this->mTemporaryPassword = $reset;
+ $this->mOldpass = $reset;
} else {
global $wgRequest;
$this->mName = $wgRequest->getVal( 'wpName' );
- $this->mTemporaryPassword = $wgRequest->getVal( 'wpPassword' );
+ $this->mOldpass = $wgRequest->getVal( 'wpPassword' );
}
}
return;
}
- if( $this->mName === null && !$wgRequest->wasPosted() ) {
- $this->error( wfMsg( 'resetpass_missing' ) );
+ if( !$wgRequest->wasPosted() && !$wgUser->isLoggedIn() ) {
+ $this->error( wfMsg( 'resetpass-no-info' ) );
return;
}
try {
$this->attemptReset( $newpass, $retype );
$wgOut->addWikiMsg( 'resetpass_success' );
-
- $data = array(
- 'action' => 'submitlogin',
- 'wpName' => $this->mName,
- 'wpPassword' => $newpass,
- 'returnto' => $wgRequest->getVal( 'returnto' ),
- );
- if( $wgRequest->getCheck( 'wpRemember' ) ) {
- $data['wpRemember'] = 1;
+ if( !$wgUser->isLoggedIn() ) {
+ $data = array(
+ 'action' => 'submitlogin',
+ 'wpName' => $this->mName,
+ 'wpPassword' => $newpass,
+ 'returnto' => $wgRequest->getVal( 'returnto' ),
+ );
+ if( $wgRequest->getCheck( 'wpRemember' ) ) {
+ $data['wpRemember'] = 1;
+ }
+ $login = new LoginForm( new FauxRequest( $data, true ) );
+ $login->execute();
}
- $login = new LoginForm( new FauxRequest( $data, true ) );
- $login->execute();
-
- return;
+ $titleObj = Title::newFromText( $wgRequest->getVal( 'returnto' ) );
+ if ( !$titleObj instanceof Title ) {
+ $titleObj = Title::newMainPage();
+ }
+ $wgOut->redirect( $titleObj->getFullURL() );
} catch( PasswordError $e ) {
$this->error( $e->getMessage() );
}
function error( $msg ) {
global $wgOut;
- $wgOut->addHTML( '<div class="errorbox">' .
- htmlspecialchars( $msg ) .
- '</div>' );
+ $wgOut->addHTML( Xml::element('p', array( 'class' => 'error' ), $msg ) );
}
function showForm() {
$wgOut->disallowUserJs();
$self = SpecialPage::getTitleFor( 'Resetpass' );
- $form =
- '<div id="userloginForm">' .
- wfOpenElement( 'form',
+ if ( !$this->mName ) {
+ $this->mName = $wgUser->getName();
+ }
+ $rememberMe = '';
+ if ( !$wgUser->isLoggedIn() ) {
+ $rememberMe = '<tr>' .
+ '<td></td>' .
+ '<td>' .
+ Xml::checkLabel( wfMsg( 'remembermypassword' ),
+ 'wpRemember', 'wpRemember',
+ $wgRequest->getCheck( 'wpRemember' ) ) .
+ '</td>' .
+ '</tr>';
+ $submitMsg = 'resetpass_submit';
+ $oldpassMsg = 'resetpass-temp-password';
+ } else {
+ $oldpassMsg = 'oldpassword';
+ $submitMsg = 'resetpass-submit-loggedin';
+ }
+ $wgOut->addHTML(
+ Xml::openElement( 'fieldset' ) .
+ Xml::element( 'legend', null, wfMsg( 'resetpass_header' ) ) .
+ Xml::openElement( 'form',
array(
'method' => 'post',
- 'action' => $self->getLocalUrl() ) ) .
- '<h2>' . wfMsgHtml( 'resetpass_header' ) . '</h2>' .
- '<div id="userloginprompt">' .
+ 'action' => $self->getLocalUrl(),
+ 'id' => 'mw-resetpass-form' ) ) .
+ Xml::hidden( 'token', $wgUser->editToken() ) .
+ Xml::hidden( 'wpName', $this->mName ) .
+ Xml::hidden( 'returnto', $wgRequest->getVal( 'returnto' ) ) .
wfMsgExt( 'resetpass_text', array( 'parse' ) ) .
- '</div>' .
'<table>' .
- wfHidden( 'token', $wgUser->editToken() ) .
- wfHidden( 'wpName', $this->mName ) .
- wfHidden( 'wpPassword', $this->mTemporaryPassword ) .
- wfHidden( 'returnto', $wgRequest->getVal( 'returnto' ) ) .
$this->pretty( array(
array( 'wpName', 'username', 'text', $this->mName ),
+ array( 'wpPassword', $oldpassMsg, 'password', $this->mOldpass ),
array( 'wpNewPassword', 'newpassword', 'password', '' ),
array( 'wpRetype', 'yourpasswordagain', 'password', '' ),
) ) .
+ $rememberMe .
'<tr>' .
'<td></td>' .
'<td>' .
- Xml::checkLabel( wfMsg( 'remembermypassword' ),
- 'wpRemember', 'wpRemember',
- $wgRequest->getCheck( 'wpRemember' ) ) .
- '</td>' .
- '</tr>' .
- '<tr>' .
- '<td></td>' .
- '<td>' .
- wfSubmitButton( wfMsgHtml( 'resetpass_submit' ) ) .
+ wfSubmitButton( wfMsgHtml( $submitMsg ) ) .
'</td>' .
'</tr>' .
'</table>' .
- wfCloseElement( 'form' ) .
- '</div>';
- $wgOut->addHTML( $form );
+ Xml::closeElement( 'form' ) .
+ Xml::closeElement( 'fieldset' ) );
}
function pretty( $fields ) {
foreach( $fields as $list ) {
list( $name, $label, $type, $value ) = $list;
if( $type == 'text' ) {
- $field = '<tt>' . htmlspecialchars( $value ) . '</tt>';
+ $field = htmlspecialchars( $value );
} else {
$field = Xml::input( $name, 20, $value,
array( 'id' => $name, 'type' => $type ) );
}
$out .= '<tr>';
- $out .= '<td align="right">';
- $out .= Xml::label( wfMsg( $label ), $name );
+ $out .= "<td class='mw-label'>";
+ if ( $type != 'text' )
+ $out .= Xml::label( wfMsg( $label ), $name );
+ else
+ $out .= wfMsg( $label );
$out .= '</td>';
- $out .= '<td>';
+ $out .= "<td class='mw-input'>";
$out .= $field;
$out .= '</td>';
$out .= '</tr>';
throw new PasswordError( 'no such user' );
}
- if( !$user->checkTemporaryPassword( $this->mTemporaryPassword ) ) {
- throw new PasswordError( wfMsg( 'resetpass_bad_temporary' ) );
+ if( !$user->checkTemporaryPassword( $this->mOldpass ) && !$user->checkPassword( $this->mOldpass ) ) {
+ throw new PasswordError( wfMsg( 'resetpass-wrong-oldpass' ) );
}
if( $newpass !== $retype ) {
}
$user->setPassword( $newpass );
+ $user->setCookies();
$user->saveSettings();
}
}
function resetLoginForm( $error ) {
global $wgOut;
- $wgOut->addWikiText( "<div class=\"errorbox\">$error</div>" );
+ $wgOut->addHTML( Xml::element('p', array( 'class' => 'error' ), $error ) );
$reset = new PasswordResetForm( $this->mName, $this->mPassword );
$reset->execute( null );
}
'Listbots' => array( 'ListBots' ),
'Popularpages' => array( 'PopularPages' ),
'Search' => array( 'Search' ),
- 'Resetpass' => array( 'ResetPass', 'ResetPassword' ),
+ 'Resetpass' => array( 'ResetPass', 'ResetPassword', 'ChangePassword' ),
'Withoutinterwiki' => array( 'WithoutInterwiki' ),
'MergeHistory' => array( 'MergeHistory' ),
'Filepath' => array( 'FilePath' ),
* Nederlands|nl', # do not translate or duplicate this message to other languages
# Password reset dialog
-'resetpass' => 'Reset account password',
-'resetpass_announce' => 'You logged in with a temporary e-mailed code.
+'resetpass' => 'Change or reset account password',
+'resetpass_announce' => 'You logged in with a temporary e-mailed code.
To finish logging in, you must set a new password here:',
-'resetpass_text' => '<!-- Add text here -->', # only translate this message to other languages if you have to change it
-'resetpass_header' => 'Reset password',
-'resetpass_submit' => 'Set password and log in',
-'resetpass_success' => 'Your password has been changed successfully! Now logging you in...',
-'resetpass_bad_temporary' => 'Invalid temporary password.
+'resetpass_text' => '<!-- Add text here -->', # only translate this message to other languages if you have to change it
+'resetpass_header' => 'Reset password',
+'resetpass_submit' => 'Set password and log in',
+'resetpass_success' => 'Your password has been changed successfully! Now logging you in...',
+'resetpass_bad_temporary' => 'Invalid temporary password.
You may have already successfully changed your password or requested a new temporary password.',
-'resetpass_forbidden' => 'Passwords cannot be changed',
-'resetpass_missing' => 'No form data.',
+'resetpass_forbidden' => 'Passwords cannot be changed',
+'resetpass_missing' => 'No form data.',
+'resetpass-no-info' => 'You must be logged in to access this page directly.',
+'resetpass-submit-loggedin' => 'Change password',
+'resetpass-wrong-oldpass' => 'Invalid temporary or current password.
+You may have already successfully changed your password or requested a new temporary password.',
+'resetpass-temp-password' => 'Temporary password:',
# Edit page toolbar
'bold_sample' => 'Bold text',
'prefs-watchlist-edits' => 'Maximum number of changes to show in expanded watchlist:',
'prefs-watchlist-edits-max' => '(maximum number: 1000)',
'prefs-misc' => 'Misc',
+'prefs-resetpass' => 'Change password',
'saveprefs' => 'Save',
'resetprefs' => 'Clear unsaved changes',
'oldpassword' => 'Old password:',
'resetpass_bad_temporary',
'resetpass_forbidden',
'resetpass_missing',
+ 'resetpass-no-info',
+ 'resetpass-submit-loggedin',
+ 'resetpass-wrong-oldpass',
+ 'resetpass-temp-password',
),
'toolbar' => array(
'bold_sample',
'prefs-watchlist-edits',
'prefs-watchlist-edits-max',
'prefs-misc',
+ 'prefs-resetpass',
'saveprefs',
'resetprefs',
'oldpassword',