getIsGuest()) { return null; } /** @var IdentityInterface $identity */ $identity = $this->getIdentity(); if (!$identity instanceof JwtIdentity) { return null; } /** @var int|null $sessionId */ $sessionId = $identity->getToken()->claims()->get('jti'); if ($sessionId === null) { return null; } return AccountSession::findOne(['id' => (int)$sessionId]); } /** * @param int-mask-of $mode */ public function terminateSessions(Account $account, int $mode = 0): void { $currentSession = null; if ($mode & self::KEEP_CURRENT_SESSION) { $currentSession = $this->getActiveSession(); } if (!($mode & self::KEEP_SITE_SESSIONS)) { foreach ($account->sessions as $session) { if ($currentSession === null || $currentSession->id !== $session->id) { $session->delete(); } } } if (!($mode & self::KEEP_MINECRAFT_SESSIONS)) { /** @var \common\models\OauthSession|null $minecraftSession */ $minecraftSession = $account->getOauthSessions() ->andWhere(['client_id' => OauthClient::UNAUTHORIZED_MINECRAFT_GAME_LAUNCHER]) ->one(); if ($minecraftSession !== null) { $minecraftSession->revoked_at = time(); Assert::true($minecraftSession->save()); } } if (!($mode & self::KEEP_OAUTH_SESSIONS)) { // The sessions themselves are kept, so the approved clients and their scopes are kept too OauthSession::updateAll(['revoked_at' => time()], [ 'AND', ['account_id' => $account->id], ['NOT', ['client_id' => OauthClient::UNAUTHORIZED_MINECRAFT_GAME_LAUNCHER]], ]); } } }