diff --git a/classes/login/GmsClient.php b/classes/login/GmsClient.php index 0c3c4e895c4b7b5ff6dcc8d3ab09cd1b1009e0d5..c644a643924982f8f7169e2469212bc06c72d3e5 100644 --- a/classes/login/GmsClient.php +++ b/classes/login/GmsClient.php @@ -36,7 +36,6 @@ class GmsClient { $info = curl_getinfo($conn); if ($info['http_code'] === 200) { - error_log($response); $joinResult = json_decode($response); curl_close($conn); if (!array_key_exists('mergedId', $joinResult)) { diff --git a/classes/login/LoginHandler.php b/classes/login/LoginHandler.php index b480f27ce236adc715b326a919caa815baad1845..df29c1f3a5ffdabde049c8a8f7f206280a78880e 100644 --- a/classes/login/LoginHandler.php +++ b/classes/login/LoginHandler.php @@ -93,6 +93,10 @@ class LoginHandler { $joinableUsers = $userDao->findJoinableUsersByUserId($user->id); } + if (count($session->getRejectedJoins()) > 0) { + $joinableUsers = array_values(array_diff($joinableUsers, $session->getRejectedJoins())); + } + if (count($joinableUsers) > 0) { // select first user $userToJoin = $userDao->findUserById($joinableUsers[0]); @@ -113,14 +117,14 @@ class LoginHandler { throw new \RAP\BadRequestException("Unable to find user"); } - $session->setJoinRejected(true); - - if ($session->getUser()->id === null) { - return $this->redirectToTOUCheck(); + if ($user->id === null) { + $session->addRejectedJoin($session->getUserToJoin()->id); } else { - $this->saveRejectedJoinIfPossible(); - return $this->getAfterLoginRedirect(); + $this->locator->getUserDAO() + ->insertRejectedJoin($user->id, $session->getUserToJoin()->id); } + + return $this->getAfterLoginRedirect(); } private function showConfirmJoin(User $userToJoin): string { @@ -139,12 +143,21 @@ class LoginHandler { * Stores the user data into the database after he/she accepted the Terms of Use. */ public function register(): string { - $user = $this->locator->getSession()->getUser(); + + $session = $this->locator->getSession(); + $user = $session->getUser(); if ($user === null) { throw new BadRequestException("User data not retrieved."); } else { + $this->locator->getUserHandler()->saveUser($user); + + // save rejected joins stored in session + foreach ($session->getRejectedJoins() as $userId) { + $this->locator->getUserDAO()->insertRejectedJoin($user->id, $userId); + } + return $this->getAfterLoginRedirect(); } } @@ -155,7 +168,7 @@ class LoginHandler { $user = $session->getUser(); $userToJoin = $session->getUserToJoin(); - $joinedUser = $this->locator->getUserHandler()->joinUsers($userToJoin, $user); + $joinedUser = $this->locator->getUserHandler()->joinUsers($user, $userToJoin); $session->setUser($joinedUser); if ($session->getAction() === 'join') { @@ -173,10 +186,13 @@ class LoginHandler { } $session = $this->locator->getSession(); + $user = $session->getUser(); - $this->saveRejectedJoinIfPossible(); + if ($user->id === null) { + return $this->redirectToTOUCheck($user); + } - $this->locator->getAuditLogger()->info("LOGIN," . $session->getLoginIdentityType() . "," . $session->getUser()->id); + $this->locator->getAuditLogger()->info("LOGIN," . $session->getLoginIdentityType() . "," . $user->id); if ($session->getOAuth2RequestData() !== null) { // Redirect to OAuth2 client callback URL @@ -194,18 +210,4 @@ class LoginHandler { throw new \Exception("Unable to find a proper redirect"); } - private function saveRejectedJoinIfPossible(): void { - - $session = $this->locator->getSession(); - - if ($session->isJoinRejected() && $session->getUserToJoin() !== null) { - $id1 = $session->getUser()->id; - $id2 = $session->getUserToJoin()->id; - if ($id1 !== null && $id2 !== null) { - $this->locator->getUserDAO()->insertRejectedJoin($id1, $id2); - $session->setJoinRejected(false); - } - } - } - } diff --git a/classes/model/SessionData.php b/classes/model/SessionData.php index 7d4d2d42d9b5ae0548d2ce2e36c236f44ff04038..a4936ebca3391516292dc3f29216be4c404e3147 100644 --- a/classes/model/SessionData.php +++ b/classes/model/SessionData.php @@ -39,7 +39,7 @@ class SessionData { private $action; private $loginIdentityType; private $autojoin = false; - private $joinRejected = false; + private $rejectedJoins = []; public function setUser(?User $user): void { $this->user = $user; @@ -68,13 +68,13 @@ class SessionData { return $this->autojoin; } - public function setJoinRejected(bool $joinRejected): void { - $this->joinRejected = $joinRejected; + public function addRejectedJoin(string $userId): void { + array_push($this->rejectedJoins, $userId); $this->save(); } - public function isJoinRejected(): bool { - return $this->joinRejected; + public function getRejectedJoins(): array { + return $this->rejectedJoins; } /** diff --git a/tests/LoginFlowTest.php b/tests/LoginFlowTest.php index e784ecb96485c4b5d88566204df4fb5a78d4bf85..a31de9f09f218381dc454d8cdeef0aad4c3dc05e 100644 --- a/tests/LoginFlowTest.php +++ b/tests/LoginFlowTest.php @@ -174,27 +174,36 @@ final class LoginFlowTest extends TestCase { $this->sessionData->setAction('account'); - $this->userDaoStub->method('findJoinableUsersByEmail')->willReturn(['1']); - $this->userDaoStub->method('findUserById')->willReturn($this->getFakeUser1()); + $this->userDaoStub->method('findJoinableUsersByEmail')->willReturn(['1', '2']); + $this->userDaoStub->method('findUserById')->will( + $this->returnValueMap(array( + array('1', $this->getFakeUser1()), + array('2', $this->getFakeUser2())))); - // Login: one joinable user detected + // Login: two joinable users detected $redirect1 = $this->loginHandler->onIdentityDataReceived($this->getFakeIdentity3()); $this->assertTrue($this->sessionData->isAutojoin()); $this->assertEquals('http://rap-ia2/confirm-join', $redirect1); - // User rejects join, redirect to TOU check + // User rejects first join, new confirm join is displayed $redirect2 = $this->loginHandler->rejectJoin(); - $this->assertTrue($this->sessionData->isJoinRejected()); - $this->assertEquals('http://rap-ia2/tou-check', $redirect2); + $this->assertEquals(1, count($this->sessionData->getRejectedJoins())); + $this->assertEquals('http://rap-ia2/confirm-join', $redirect2); + + // User rejects second join, redirect to TOU check + $redirect3 = $this->loginHandler->rejectJoin(); + + $this->assertEquals(2, count($this->sessionData->getRejectedJoins())); + $this->assertEquals('http://rap-ia2/tou-check', $redirect3); $this->userDaoStub->method('createUser')->willReturn('5'); - $this->userDaoStub->expects($this->once())->method('insertRejectedJoin'); + $this->userDaoStub->expects($this->exactly(2))->method('insertRejectedJoin'); // User accepts TOU - $redirect3 = $this->loginHandler->register(); - $this->assertEquals('http://rap-ia2/account', $redirect3); + $redirect4 = $this->loginHandler->register(); + $this->assertEquals('http://rap-ia2/account', $redirect4); } public function testExplicitJoin(): void {