X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FSpecialUserlogin.php;h=b33b95395cc9423b7416713e7b4aac16fccd4311;hb=281803dd1fb69b923dc88e35c74c29c69bbda167;hp=f69fc8ba4954745d84c8a0ef2d0e5617a940e263;hpb=8f147fa900d1b57702aa47d95093aff8480d8849;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/SpecialUserlogin.php b/includes/SpecialUserlogin.php index f69fc8ba49..b33b95395c 100644 --- a/includes/SpecialUserlogin.php +++ b/includes/SpecialUserlogin.php @@ -1,12 +1,17 @@ execute(); } +/** + * + * @package MediaWiki + * @subpackage SpecialPage + */ class LoginForm { var $mName, $mPassword, $mRetype, $mReturnto, $mCookieCheck, $mPosted; var $mAction, $mCreateaccount, $mCreateaccountMail, $mMailmypassword; var $mLoginattempt, $mRemember, $mEmail; + /** + * Constructor + * @param webrequest $request A webrequest object passed by reference + */ function LoginForm( &$request ) { - global $wgLang, $wgAllowRealName; + global $wgLang, $wgAllowRealName, $wgEnableEmail; $this->mName = $request->getText( 'wpName' ); $this->mPassword = $request->getText( 'wpPassword' ); $this->mRetype = $request->getText( 'wpRetype' ); $this->mReturnto = $request->getVal( 'returnto' ); - $this->mCookieCheck = $request->getVal( "wpCookieCheck" ); + $this->mCookieCheck = $request->getVal( 'wpCookieCheck' ); $this->mPosted = $request->wasPosted(); $this->mCreateaccount = $request->getCheck( 'wpCreateaccount' ); - $this->mCreateaccountMail = $request->getCheck( 'wpCreateaccountMail' ); - $this->mMailmypassword = $request->getCheck( 'wpMailmypassword' ); + $this->mCreateaccountMail = $request->getCheck( 'wpCreateaccountMail' ) + && $wgEnableEmail; + $this->mMailmypassword = $request->getCheck( 'wpMailmypassword' ) + && $wgEnableEmail; $this->mLoginattempt = $request->getCheck( 'wpLoginattempt' ); $this->mAction = $request->getVal( 'action' ); $this->mRemember = $request->getCheck( 'wpRemember' ); - $this->mEmail = $request->getText( 'wpEmail' ); - if ($wgAllowRealName) { + + if( $wgEnableEmail ) { + $this->mEmail = $request->getText( 'wpEmail' ); + } else { + $this->mEmail = ''; + } + if( $wgAllowRealName ) { $this->mRealName = $request->getText( 'wpRealName' ); } else { $this->mRealName = ''; } # When switching accounts, it sucks to get automatically logged out - if( $this->mReturnto == $wgLang->specialPage( "Userlogout" ) ) { - $this->mReturnto = ""; + if( $this->mReturnto == $wgLang->specialPage( 'Userlogout' ) ) { + $this->mReturnto = ''; } } function execute() { if ( !is_null( $this->mCookieCheck ) ) { $this->onCookieRedirectCheck( $this->mCookieCheck ); + return; } else if( $this->mPosted ) { if( $this->mCreateaccount ) { return $this->addNewAccount(); @@ -57,19 +79,21 @@ class LoginForm { return $this->addNewAccountMailPassword(); } else if ( $this->mMailmypassword ) { return $this->mailPassword(); - } else if ( ( "submit" == $this->mAction ) || $this->mLoginattempt ) { + } else if ( ( 'submitlogin' == $this->mAction ) || $this->mLoginattempt ) { return $this->processLogin(); } } - $this->mainLoginForm( "" ); + $this->mainLoginForm( '' ); } - /* private */ function addNewAccountMailPassword() - { + /** + * @access private + */ + function addNewAccountMailPassword() { global $wgOut; - if ("" == $this->mEmail) { - $this->mainLoginForm( wfMsg( "noemail", $this->mName ) ); + if ('' == $this->mEmail) { + $this->mainLoginForm( wfMsg( 'noemail', htmlspecialchars( $this->mName ) ) ); return; } @@ -80,27 +104,27 @@ class LoginForm { } $u->saveSettings(); - $error = $this->mailPasswordInternal($u); - - $wgOut->setPageTitle( wfMsg( "accmailtitle" ) ); - $wgOut->setRobotpolicy( "noindex,nofollow" ); + $result = $this->mailPasswordInternal($u); + + $wgOut->setPageTitle( wfMsg( 'accmailtitle' ) ); + $wgOut->setRobotpolicy( 'noindex,nofollow' ); $wgOut->setArticleRelated( false ); - if ( $error === "" ) { - $wgOut->addWikiText( wfMsg( "accmailtext", $u->getName(), $u->getEmail() ) ); - $wgOut->returnToMain( false ); + if( WikiError::isError( $result ) ) { + $this->mainLoginForm( wfMsg( 'mailerror', $result->getMessage() ) ); } else { - $this->mainLoginForm( wfMsg( "mailerror", $error ) ); + $wgOut->addWikiText( wfMsg( 'accmailtext', $u->getName(), $u->getEmail() ) ); + $wgOut->returnToMain( false ); } - $u = 0; } - /* private */ function addNewAccount() - { + /** + * @access private + */ + function addNewAccount() { global $wgUser, $wgOut; - global $wgDeferredUpdateList; $u = $this->addNewAccountInternal(); @@ -111,98 +135,143 @@ class LoginForm { $wgUser = $u; $wgUser->setCookies(); - $up = new UserUpdate(); - array_push( $wgDeferredUpdateList, $up ); + $wgUser->saveSettings(); + if( $wgUser->isValidEmailAddr( $wgUser->getEmail() ) ) { + $wgUser->sendConfirmationMail(); + } if( $this->hasSessionCookie() ) { - return $this->successfulLogin( wfMsg( "welcomecreation", $wgUser->getName() ) ); + return $this->successfulLogin( wfMsg( 'welcomecreation', $wgUser->getName() ) ); } else { - return $this->cookieRedirectCheck( "new" ); + return $this->cookieRedirectCheck( 'new' ); } } - - /* private */ function addNewAccountInternal() - { + /** + * @access private + */ + function addNewAccountInternal() { global $wgUser, $wgOut; global $wgMaxNameChars; global $wgMemc, $wgAccountCreationThrottle, $wgDBname, $wgIP; - - if ( $wgAccountCreationThrottle ) { - $key = "$wgDBname:acctcreate:ip:$wgIP"; - $value = $wgMemc->incr( $key ); - if ( !$value ) { - $wgMemc->set( $key, 1, 86400 ); - } - if ( $value > $wgAccountCreationThrottle ) { - $this->throttleHit( $wgAccountCreationThrottle ); - return; - } - } + global $wgMinimalPasswordLength; if (!$wgUser->isAllowedToCreateAccount()) { $this->userNotPrivilegedMessage(); - return; + return false; } if ( 0 != strcmp( $this->mPassword, $this->mRetype ) ) { - $this->mainLoginForm( wfMsg( "badretype" ) ); - return; + $this->mainLoginForm( wfMsg( 'badretype' ) ); + return false; } $name = trim( $this->mName ); $u = User::newFromName( $name ); - if ( ( "" == $name ) || - preg_match( "/\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}/", $name ) || - (strpos( $name, "/" ) !== false) || + if ( is_null( $u ) || + ( '' == $name ) || + $wgUser->isIP( $name ) || + (strpos( $name, '/' ) !== false) || (strlen( $name ) > $wgMaxNameChars) || ucFirst($name) != $u->getName() ) { - $this->mainLoginForm( wfMsg( "noname" ) ); - return; + $this->mainLoginForm( wfMsg( 'noname' ) ); + return false; } if ( wfReadOnly() ) { $wgOut->readOnlyPage(); - return; + return false; } if ( 0 != $u->idForName() ) { - $this->mainLoginForm( wfMsg( "userexists" ) ); - return; + $this->mainLoginForm( wfMsg( 'userexists' ) ); + return false; + } + + if ( strlen( $this->mPassword ) < $wgMinimalPasswordLength ) { + $this->mainLoginForm( wfMsg( 'passwordtooshort', $wgMinimalPasswordLength ) ); + return false; } + + if ( $wgAccountCreationThrottle ) { + $key = $wgDBname.':acctcreate:ip:'.$wgIP; + $value = $wgMemc->incr( $key ); + if ( !$value ) { + $wgMemc->set( $key, 1, 86400 ); + } + if ( $value > $wgAccountCreationThrottle ) { + $this->throttleHit( $wgAccountCreationThrottle ); + return false; + } + } + + return $this->initUser( $u ); + } + + /** + * Actually add a user to the database. + * Give it a User object that has been initialised with a name. + * + * @param User $u + * @return User + * @access private + */ + function &initUser( &$u ) { $u->addToDatabase(); $u->setPassword( $this->mPassword ); $u->setEmail( $this->mEmail ); $u->setRealName( $this->mRealName ); + $u->setToken(); + + global $wgAuth; + $wgAuth->initUser( $u ); if ( $this->mRemember ) { $r = 1; } else { $r = 0; } - $u->setOption( "rememberpassword", $r ); + $u->setOption( 'rememberpassword', $r ); return $u; } - - - /* private */ function processLogin() - { + /** + * @access private + */ + function processLogin() { global $wgUser; - global $wgDeferredUpdateList; - if ( "" == $this->mName ) { - $this->mainLoginForm( wfMsg( "noname" ) ); + if ( '' == $this->mName ) { + $this->mainLoginForm( wfMsg( 'noname' ) ); return; } $u = User::newFromName( $this->mName ); - $id = $u->idForName(); - if ( 0 == $id ) { - $this->mainLoginForm( wfMsg( "nosuchuser", $u->getName() ) ); + if( is_null( $u ) ) { + $this->mainLoginForm( wfMsg( 'noname' ) ); return; } - $u->setId( $id ); - $u->loadFromDatabase(); + if ( 0 == $u->getID() ) { + global $wgAuth; + /** + * If the external authentication plugin allows it, + * automatically create a new account for users that + * are externally defined but have not yet logged in. + */ + if ( $wgAuth->autoCreate() && $wgAuth->userExists( $u->getName() ) ) { + if ( $wgAuth->authenticate( $u->getName(), $this->mPassword ) ) { + $u =& $this->initUser( $u ); + } else { + $this->mainLoginForm( wfMsg( 'wrongpassword' ) ); + return; + } + } else { + $this->mainLoginForm( wfMsg( 'nosuchuser', $u->getName() ) ); + return; + } + } else { + $u->loadFromDatabase(); + } + if (!$u->checkPassword( $this->mPassword )) { - $this->mainLoginForm( wfMsg( "wrongpassword" ) ); + $this->mainLoginForm( wfMsg( 'wrongpassword' ) ); return; } @@ -210,277 +279,204 @@ class LoginForm { # if ( $this->mRemember ) { $r = 1; - $u->setCookiePassword( $this->mPassword ); } else { $r = 0; } - $u->setOption( "rememberpassword", $r ); + $u->setOption( 'rememberpassword', $r ); $wgUser = $u; $wgUser->setCookies(); - $up = new UserUpdate(); - array_push( $wgDeferredUpdateList, $up ); - + $wgUser->saveSettings(); + if( $this->hasSessionCookie() ) { - return $this->successfulLogin( wfMsg( "loginsuccess", $wgUser->getName() ) ); + return $this->successfulLogin( wfMsg( 'loginsuccess', $wgUser->getName() ) ); } else { - return $this->cookieRedirectCheck( "login" ); + return $this->cookieRedirectCheck( 'login' ); } } - /* private */ function mailPassword() - { + /** + * @access private + */ + function mailPassword() { global $wgUser, $wgDeferredUpdateList, $wgOutputEncoding; global $wgCookiePath, $wgCookieDomain, $wgDBname; - if ( "" == $this->mName ) { - $this->mainLoginForm( wfMsg( "noname" ) ); + if ( '' == $this->mName ) { + $this->mainLoginForm( wfMsg( 'noname' ) ); return; } $u = User::newFromName( $this->mName ); - $id = $u->idForName(); - if ( 0 == $id ) { - $this->mainLoginForm( wfMsg( "nosuchuser", $u->getName() ) ); + if( is_null( $u ) ) { + $this->mainLoginForm( wfMsg( 'noname' ) ); return; } - $u->setId( $id ); + if ( 0 == $u->getID() ) { + $this->mainLoginForm( wfMsg( 'nosuchuser', $u->getName() ) ); + return; + } + $u->loadFromDatabase(); - $error = $this->mailPasswordInternal( $u ); - if ($error === "") { - $this->mainLoginForm( wfMsg( "passwordsent", $u->getName() ) ); + $result = $this->mailPasswordInternal( $u ); + if( WikiError::isError( $result ) ) { + $this->mainLoginForm( wfMsg( 'mailerror', $result->getMessage() ) ); } else { - $this->mainLoginForm( wfMsg( "mailerror", $error ) ); + $this->mainLoginForm( wfMsg( 'passwordsent', $u->getName() ) ); } - } - /* private */ function mailPasswordInternal( $u ) - { - global $wgDeferredUpdateList, $wgOutputEncoding; + /** + * @return mixed true on success, WikiError on failure + * @access private + */ + function mailPasswordInternal( $u ) { global $wgPasswordSender, $wgDBname, $wgIP; global $wgCookiePath, $wgCookieDomain; - if ( "" == $u->getEmail() ) { - $this->mainLoginForm( wfMsg( "noemail", $u->getName() ) ); - return; + if ( '' == $u->getEmail() ) { + return wfMsg( 'noemail', $u->getName() ); } - $np = User::randomPassword(); + + $np = $u->randomPassword(); $u->setNewpassword( $np ); - setcookie( "{$wgDBname}Password", "", time() - 3600, $wgCookiePath, $wgCookieDomain ); + setcookie( "{$wgDBname}Token", '', time() - 3600, $wgCookiePath, $wgCookieDomain ); + $u->saveSettings(); $ip = $wgIP; - if ( "" == $ip ) { $ip = "(Unknown)"; } - - $m = wfMsg( "passwordremindertext", $ip, $u->getName(), $np ); + if ( '' == $ip ) { $ip = '(Unknown)'; } - $error = userMailer( $u->getEmail(), $wgPasswordSender, wfMsg( "passwordremindertitle" ), $m ); - - return $error; + $m = wfMsg( 'passwordremindermailbody', $ip, $u->getName(), wfUrlencode($u->getName()), $np ); + $result = $u->sendMail( wfMsg( 'passwordremindermailsubject' ), $m ); + + return $result; } - - - - /* private */ function successfulLogin( $msg ) - { + /** + * @param string $msg Message that will be shown on success. + * @access private + */ + function successfulLogin( $msg ) { global $wgUser; - global $wgDeferredUpdateList; global $wgOut; - $wgOut->setPageTitle( wfMsg( "loginsuccesstitle" ) ); - $wgOut->setRobotpolicy( "noindex,nofollow" ); + # Run any hooks; ignore results + + wfRunHooks('UserLoginComplete', array(&$wgUser)); + + $wgOut->setPageTitle( wfMsg( 'loginsuccesstitle' ) ); + $wgOut->setRobotpolicy( 'noindex,nofollow' ); $wgOut->setArticleRelated( false ); - $wgOut->addHTML( $msg ); + $wgOut->addWikiText( $msg ); $wgOut->returnToMain(); } - function userNotPrivilegedMessage() - { - global $wgOut, $wgUser, $wgLang; + /** */ + function userNotPrivilegedMessage() { + global $wgOut; - $wgOut->setPageTitle( wfMsg( "whitelistacctitle" ) ); - $wgOut->setRobotpolicy( "noindex,nofollow" ); + $wgOut->setPageTitle( wfMsg( 'whitelistacctitle' ) ); + $wgOut->setRobotpolicy( 'noindex,nofollow' ); $wgOut->setArticleRelated( false ); - $wgOut->addWikiText( wfMsg( "whitelistacctext" ) ); + $wgOut->addWikiText( wfMsg( 'whitelistacctext' ) ); $wgOut->returnToMain( false ); } - /* private */ function mainLoginForm( $err ) - { + /** + * @access private + */ + function mainLoginForm( $err ) { global $wgUser, $wgOut, $wgLang; - global $wgDBname, $wgAllowRealName; - - $le = wfMsg( "loginerror" ); - $yn = wfMsg( "yourname" ); - $yp = wfMsg( "yourpassword" ); - $ypa = wfMsg( "yourpasswordagain" ); - $rmp = wfMsg( "remembermypassword" ); - $nuo = wfMsg( "newusersonly" ); - $li = wfMsg( "login" ); - $ca = wfMsg( "createaccount" ); - $cam = wfMsg( "createaccountmail" ); - $ye = wfMsg( "youremail" ); - if ($wgAllowRealName) { - $yrn = wfMsg( "yourrealname" ); - } else { - $yrn = ''; - } - $efl = wfMsg( "emailforlost" ); - $mmp = wfMsg( "mailmypassword" ); - $endText = wfMsg( "loginend" ); + global $wgDBname, $wgAllowRealName, $wgEnableEmail; - if ( $endText = "<loginend>" ) { - $endText = ""; - } - - if ( "" == $this->mName ) { - if ( 0 != $wgUser->getID() ) { + if ( '' == $this->mName ) { + if ( $wgUser->isLoggedIn() ) { $this->mName = $wgUser->getName(); } else { - $this->mName = @$_COOKIE["{$wgDBname}UserName"]; + $this->mName = @$_COOKIE[$wgDBname.'UserName']; } } - $wgOut->setPageTitle( wfMsg( "userlogin" ) ); - $wgOut->setRobotpolicy( "noindex,nofollow" ); - $wgOut->setArticleRelated( false ); - - if ( "" == $err ) { - $lp = wfMsg( "loginprompt" ); - $wgOut->addHTML( "

$li:

\n

$lp

" ); - } else { - $wgOut->addHTML( "

$le:

\n$err\n" ); - } - if ( 1 == $wgUser->getOption( "rememberpassword" ) ) { - $checked = " checked"; - } else { - $checked = ""; - } - - $q = "action=submit"; + $q = 'action=submitlogin'; if ( !empty( $this->mReturnto ) ) { - $q .= "&returnto=" . wfUrlencode( $this->mReturnto ); - } - - $titleObj = Title::makeTitle( NS_SPECIAL, "Userlogin" ); - $action = $titleObj->escapeLocalUrl( $q ); - - $encName = wfEscapeHTML( $this->mName ); - $encPassword = wfEscapeHTML( $this->mPassword ); - $encRetype = wfEscapeHTML( $this->mRetype ); - $encEmail = wfEscapeHTML( $this->mEmail ); - $encRealName = wfEscapeHTML( $this->mRealName ); - - if ($wgUser->getID() != 0) { - $cambutton = ""; - } else { - $cambutton = ""; + $q .= '&returnto=' . wfUrlencode( $this->mReturnto ); } + $titleObj = Title::makeTitle( NS_SPECIAL, 'Userlogin' ); - $wgOut->addHTML( " -
- - - - - - - - - - "); - - if ($wgUser->isAllowedToCreateAccount()) { - $encRetype = htmlspecialchars( $this->mRetype ); - $encEmail = htmlspecialchars( $this->mEmail ); - $wgOut->addHTML(" - - - - - "); - - if ($wgAllowRealName) { - $wgOut->addHTML(" - - - "); - } - - $wgOut->addHTML(""); - } - - $wgOut->addHTML(" - -
$yn: - - - -
$yp: - - - -
 
$ypa: - - $nuo
$ye: - -  
$yrn: - - - - $cambutton -
 
-

$efl
-

-
-
\n" ); - $wgOut->addHTML( $endText ); + require_once( 'templates/Userlogin.php' ); + $template =& new UserloginTemplate(); + + $template->set( 'name', $this->mName ); + $template->set( 'password', $this->mPassword ); + $template->set( 'retype', $this->mRetype ); + $template->set( 'email', $this->mEmail ); + $template->set( 'realname', $this->mRealName ); + + $template->set( 'action', $titleObj->getLocalUrl( $q ) ); + $template->set( 'error', $err ); + $template->set( 'create', $wgUser->isAllowedToCreateAccount() ); + $template->set( 'createemail', $wgEnableEmail && $wgUser->isLoggedIn() ); + $template->set( 'userealname', $wgAllowRealName ); + $template->set( 'useemail', $wgEnableEmail ); + $template->set( 'remember', $wgUser->getOption( 'rememberpassword' ) or $this->mRemember ); + + $wgOut->setPageTitle( wfMsg( 'userlogin' ) ); + $wgOut->setRobotpolicy( 'noindex,nofollow' ); + $wgOut->setArticleRelated( false ); + $wgOut->addTemplate( $template ); } - /* private */ function hasSessionCookie() - { + /** + * @access private + */ + function hasSessionCookie() { global $wgDisableCookieCheck; - return ( $wgDisableCookieCheck ) ? true : ( "" != $_COOKIE[session_name()] ); + return ( $wgDisableCookieCheck ) ? true : ( '' != $_COOKIE[session_name()] ); } - /* private */ function cookieRedirectCheck( $type ) - { + /** + * @access private + */ + function cookieRedirectCheck( $type ) { global $wgOut, $wgLang; - $titleObj = Title::makeTitle( NS_SPECIAL, "Userlogin" ); - $check = $titleObj->getFullURL( "wpCookieCheck=$type" ); + $titleObj = Title::makeTitle( NS_SPECIAL, 'Userlogin' ); + $check = $titleObj->getFullURL( 'wpCookieCheck='.$type ); return $wgOut->redirect( $check ); } - /* private */ function onCookieRedirectCheck( $type ) { + /** + * @access private + */ + function onCookieRedirectCheck( $type ) { global $wgUser; if ( !$this->hasSessionCookie() ) { - if ( $type == "new" ) { - return $this->mainLoginForm( wfMsg( "nocookiesnew" ) ); - } else if ( $type == "login" ) { - return $this->mainLoginForm( wfMsg( "nocookieslogin" ) ); + if ( $type == 'new' ) { + return $this->mainLoginForm( wfMsg( 'nocookiesnew' ) ); + } else if ( $type == 'login' ) { + return $this->mainLoginForm( wfMsg( 'nocookieslogin' ) ); } else { # shouldn't happen - return $this->mainLoginForm( wfMsg( "error" ) ); + return $this->mainLoginForm( wfMsg( 'error' ) ); } } else { - return $this->successfulLogin( wfMsg( "loginsuccess", $wgUser->getName() ) ); + return $this->successfulLogin( wfMsg( 'loginsuccess', $wgUser->getName() ) ); } } - /* private */ function throttleHit( $limit ) { + /** + * @access private + */ + function throttleHit( $limit ) { global $wgOut; $wgOut->addWikiText( wfMsg( 'acct_creation_throttle_hit', $limit ) );