wiki.techinc.nl/includes/exception/UserNotLoggedIn.php
Bartosz Dziewoński 5623b2e44c LoginSignupSpecialPage: Support &display=popup
Setting this URL parameter will replace the default skin with a
"micro-skin" that omits most of the usual interface elements,
making the page suitable to be displayed in a small popup window.
Its design (such as it is) is mostly based on Vector 2022.

In the future, we might allow normal skins to serve this mode too,
if they advise that they support it by setting a skin option.
For now that is out of scope.

The login/signup process is otherwise completely normal. To make use
of it, launch the login page in a popup, and set &returnto=... to
redirect back to your own success page, which should communicate the
successful login to your app and then close itself.

The display=popup / display=page vocabulary is borrowed from the
OpenID Connect spec.

Bug: T362706
Change-Id: Ic7cbbe98344b25d2e965750e0c4429ce157163ed
2024-05-22 22:06:31 +02:00

115 lines
3.7 KiB
PHP

<?php
/**
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
*/
use MediaWiki\Context\RequestContext;
use MediaWiki\SpecialPage\SpecialPage;
/**
* Redirect a user to the login page
*
* This is essentially an ErrorPageError exception which by default uses the
* 'exception-nologin' as a title and 'exception-nologin-text' for the message.
*
* @note In order for this exception to redirect, the error message passed to the
* constructor has to be explicitly added to LoginHelper::validErrorMessages or with
* the LoginFormValidErrorMessages hook. Otherwise, the user will just be shown the message
* rather than redirected.
*
* @par Example:
* @code
* if ( $user->isAnon() ) {
* throw new UserNotLoggedIn();
* }
* @endcode
*
* Note the parameter order differs from ErrorPageError, this allows you to
* simply specify a reason without overriding the default title.
*
* @par Example:
* @code
* if ( $user->isAnon() ) {
* throw new UserNotLoggedIn( 'action-require-loggedin' );
* }
* @endcode
*
* @newable
* @see T39627
* @since 1.20
* @ingroup Exception
*/
class UserNotLoggedIn extends ErrorPageError {
/**
* @stable to call
*
* @note The value of the $reasonMsg parameter must be set with the LoginFormValidErrorMessages
* hook if you want the user to be automatically redirected to the login form.
*
* @param string $reasonMsg A message key containing the reason for the error.
* Optional, default: 'exception-nologin-text'
* @param string $titleMsg A message key to set the page title.
* Optional, default: 'exception-nologin'
* @param array $params Parameters to wfMessage().
* Optional, default: []
*/
public function __construct(
$reasonMsg = 'exception-nologin-text',
$titleMsg = 'exception-nologin',
$params = []
) {
parent::__construct( $titleMsg, $reasonMsg, $params );
}
/**
* Redirect to Special:Userlogin if the specified message is compatible. Otherwise,
* show an error page as usual.
* @param int $action
*/
public function report( $action = self::SEND_OUTPUT ) {
// If an unsupported message is used, don't try redirecting to Special:Userlogin,
// since the message may not be compatible.
if ( !in_array( $this->msg, LoginHelper::getValidErrorMessages() ) ) {
parent::report( $action );
return;
}
// Message is valid. Redirect to Special:Userlogin
$context = RequestContext::getMain();
$output = $context->getOutput();
$query = $context->getRequest()->getValues();
// Title will be overridden by returnto
unset( $query['title'] );
// Redirect to Special:Userlogin
$output->redirect( SpecialPage::getTitleFor( 'Userlogin' )->getFullURL( [
// Return to this page when the user logs in
'returnto' => $context->getTitle()->getFullText(),
'returntoquery' => wfArrayToCgi( $query ),
'warning' => $this->msg,
// Forward the 'display' parameter if provided
'display' => $query['display'] ?? null,
] ) );
if ( $action === self::SEND_OUTPUT ) {
$output->output();
}
}
}