Merge "Add tests for WikiMap and WikiReference"
[lhc/web/wiklou.git] / includes / exception / UserNotLoggedIn.php
index f7a56b5..02fca3d 100644 (file)
  */
 
 /**
- * Shows a generic "user is not logged in" error page.
+ * 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.
- * @see bug 37627
- * @since 1.20
+ *
+ * @note In order for this exception to redirect, the error message passed to the
+ * constructor has to be explicitly added to LoginForm::validErrorMessages or with
+ * the LoginFormValidErrorMessages hook. Otherwise, the user will just be shown the message
+ * rather than redirected.
  *
  * @par Example:
  * @code
  * }
  * @endcode
  *
+ * @see bug 37627
+ * @since 1.20
  * @ingroup Exception
  */
 class UserNotLoggedIn extends ErrorPageError {
 
        /**
+        * @note The value of the $reasonMsg parameter must be put into LoginForm::validErrorMessages or
+        * 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.
@@ -64,16 +73,30 @@ class UserNotLoggedIn extends ErrorPageError {
        }
 
        /**
-        * Redirect to Special:Userlogin
+        * Redirect to Special:Userlogin if the specified message is compatible. Otherwise,
+        * show an error page as usual.
         */
        public function report() {
+               // 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, LoginForm::getValidErrorMessages() ) ) {
+                       parent::report();
+               }
+
+               // Message is valid. Redirec 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( array(
                        // Return to this page when the user logs in
-                       'returnto' => $context->getTitle()->getText(),
-                       'returntoquery' => wfArrayToCgi( $context->getRequest()->getValues() )
+                       'returnto' => $context->getTitle()->getFullText(),
+                       'returntoquery' => wfArrayToCgi( $query ),
+                       'warning' => $this->msg,
                ) ) );
 
                $output->output();