diff --git a/src/Parse/ParseSession.php b/src/Parse/ParseSession.php index 92d8edf5..c36a3299 100644 --- a/src/Parse/ParseSession.php +++ b/src/Parse/ParseSession.php @@ -86,6 +86,32 @@ public static function _isRevocable($token) return strpos($token, 'r:') === 0; } + /** + * Upgrades the current session to a revocable one + * + * @throws ParseException + */ + public static function upgradeToRevocableSession() + { + $user = ParseUser::getCurrentUser(); + if ($user) { + $token = $user->getSessionToken(); + $response = ParseClient::_request( + 'POST', + 'upgradeToRevocableSession', + $token, + null, + false + ); + $session = new self(); + $session->_mergeAfterFetch($response); + $session->handleSaveResult(); + ParseUser::become($session->getSessionToken()); + } else { + throw new ParseException('No session to upgrade.'); + } + } + /** * After a save, perform Session object specific logic. */ diff --git a/tests/Parse/ParseSessionTest.php b/tests/Parse/ParseSessionTest.php index 1d48a79a..9ca8f152 100644 --- a/tests/Parse/ParseSessionTest.php +++ b/tests/Parse/ParseSessionTest.php @@ -56,4 +56,37 @@ public function testRevocableSession() $this->setExpectedException('Parse\ParseException', 'invalid session token'); ParseUser::become($sessionToken); } + + /** + * @group upgrade-to-revocable-session + */ + public function testUpgradeToRevocableSession() + { + $user = new ParseUser(); + $user->setUsername('revocable_username'); + $user->setPassword('revocable_password'); + $user->signUp(); + + $session = ParseSession::getCurrentSession(); + $this->assertEquals($user->getSessionToken(), $session->getSessionToken()); + + // upgrade the current session (changes our session as well) + ParseSession::upgradeToRevocableSession(); + + // verify that our session has changed, and our updated current user matches it + $session = ParseSession::getCurrentSession(); + $user = ParseUser::getCurrentUser(); + $this->assertEquals($user->getSessionToken(), $session->getSessionToken()); + $this->assertTrue($session->isCurrentSessionRevocable()); + } + + /** + * @group upgrade-to-revocable-session + */ + public function testBadUpgradeToRevocableSession() + { + // upgrade the current session (changes our session as well) + $this->setExpectedException('Parse\ParseException', 'No session to upgrade.'); + ParseSession::upgradeToRevocableSession(); + } }