diff --git a/includes/api/ApiLogout.php b/includes/api/ApiLogout.php index 6c005bbb5b6..12397231135 100644 --- a/includes/api/ApiLogout.php +++ b/includes/api/ApiLogout.php @@ -51,6 +51,13 @@ class ApiLogout extends ApiBase { } $user = $this->getUser(); + + if ( $user->isAnon() ) { + // Cannot logout a anon user, so add a warning and return early. + $this->addWarning( 'apierror-mustbeloggedin-generic', 'notloggedin' ); + return; + } + $oldName = $user->getName(); $user->logout(); diff --git a/tests/phpunit/includes/api/ApiLogoutTest.php b/tests/phpunit/includes/api/ApiLogoutTest.php index 0fc3338456c..c56d9abda1e 100644 --- a/tests/phpunit/includes/api/ApiLogoutTest.php +++ b/tests/phpunit/includes/api/ApiLogoutTest.php @@ -35,6 +35,20 @@ class ApiLogoutTest extends ApiTestCase { } } + public function testUserLogoutAlreadyLoggedOut() { + $user = $this->getServiceContainer()->getUserFactory()->newAnonymous( '1.2.3.4' ); + + $this->assertFalse( $user->isRegistered() ); + $token = $this->getUserCsrfTokenFromApi( $user ); + $response = $this->doUserLogout( $token, $user )[0]; + $this->assertFalse( $user->isRegistered() ); + + $this->assertArrayEquals( + [ 'warnings' => [ 'logout' => [ 'warnings' => 'You must be logged in.' ] ] ], + $response + ); + } + public function testUserLogout() { $user = $this->getTestSysop()->getUser();