3 * Implements Special:UserLogin
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 * http://www.gnu.org/copyleft/gpl.html
21 * @ingroup SpecialPage
24 use MediaWiki\Auth\AuthManager
;
25 use MediaWiki\Logger\LoggerFactory
;
28 * Implements Special:UserLogin
30 * @ingroup SpecialPage
32 class SpecialUserLogin
extends LoginSignupSpecialPage
{
33 protected static $allowedActions = [
34 AuthManager
::ACTION_LOGIN
,
35 AuthManager
::ACTION_LOGIN_CONTINUE
38 protected static $messages = [
39 'authform-newtoken' => 'nocookiesforlogin',
40 'authform-notoken' => 'sessionfailure',
41 'authform-wrongtoken' => 'sessionfailure',
44 public function __construct() {
45 parent
::__construct( 'Userlogin' );
48 public function doesWrites() {
52 protected function getLoginSecurityLevel() {
56 protected function getDefaultAction( $subPage ) {
57 return AuthManager
::ACTION_LOGIN
;
60 public function getDescription() {
61 return $this->msg( 'login' )->text();
64 public function setHeaders() {
65 // override the page title if we are doing a forced reauthentication
67 if ( $this->securityLevel
&& $this->getUser()->isLoggedIn() ) {
68 $this->getOutput()->setPageTitle( $this->msg( 'login-security' ) );
72 protected function isSignup() {
76 protected function beforeExecute( $subPage ) {
77 if ( $subPage === 'signup' ||
$this->getRequest()->getText( 'type' ) === 'signup' ) {
78 // B/C for old account creation URLs
79 $title = SpecialPage
::getTitleFor( 'CreateAccount' );
80 $query = array_diff_key( $this->getRequest()->getValues(),
81 array_fill_keys( [ 'type', 'title' ], true ) );
82 $url = $title->getFullURL( $query, false, PROTO_CURRENT
);
83 $this->getOutput()->redirect( $url );
86 return parent
::beforeExecute( $subPage );
90 * Run any hooks registered for logins, then HTTP redirect to
91 * $this->mReturnTo (or Main Page if that's undefined). Formerly we had a
92 * nice message here, but that's really not as useful as just being sent to
93 * wherever you logged in from. It should be clear that the action was
94 * successful, given the lack of error messages plus the appearance of your
95 * name in the upper right.
96 * @param bool $direct True if the action was successful just now; false if that happened
97 * pre-redirection (so this handler was called already)
98 * @param StatusValue|null $extraMessages
100 protected function successfulAction( $direct = false, $extraMessages = null ) {
101 global $wgSecureLogin;
103 $user = $this->targetUser ?
: $this->getUser();
104 $session = $this->getRequest()->getSession();
111 if ( $user->requiresHTTPS() ) {
112 $this->mStickHTTPS
= true;
114 $session->setForceHTTPS( $wgSecureLogin && $this->mStickHTTPS
);
116 // If the user does not have a session cookie at this point, they probably need to
117 // do something to their browser.
118 if ( !$this->hasSessionCookie() ) {
119 $this->mainLoginForm( [ /*?*/ ], $session->getProvider()->whyNoSession() );
120 // TODO something more specific? This used to use nocookieslogin
125 # Run any hooks; display injected HTML if any, else redirect
127 Hooks
::run( 'UserLoginComplete', [ &$user, &$injected_html, $direct ] );
129 if ( $injected_html !== '' ||
$extraMessages ) {
130 $this->showSuccessPage( 'success', $this->msg( 'loginsuccesstitle' ),
131 'loginsuccess', $injected_html, $extraMessages );
133 $helper = new LoginHelper( $this->getContext() );
134 $helper->showReturnToPage( 'successredirect', $this->mReturnTo
, $this->mReturnToQuery
,
135 $this->mStickHTTPS
);
139 protected function getToken() {
140 return $this->getRequest()->getSession()->getToken( '', 'login' );
143 protected function clearToken() {
144 return $this->getRequest()->getSession()->resetToken( 'login' );
147 protected function getTokenName() {
148 return 'wpLoginToken';
151 protected function getGroupName() {
155 protected function logAuthResult( $success, $status = null ) {
156 LoggerFactory
::getInstance( 'authevents' )->info( 'Login attempt', [
158 'successful' => $success,