sessionUserDataProvider = $sessionUserDataProvider; $this->activeSessionRepository = $activeSessionRepository; $this->activeSessionFactory = $activeSessionFactory; $this->dateTime = $dateTime; $this->adminSessionInfoCollectionFactory = $adminSessionInfoCollectionFactory; $this->adminSessionInfoResource = $adminSessionInfoResource; $this->scopeConfig = $scopeConfig; $this->activeSessionCollectionFactory = $activeSessionCollectionFactory; // OM for backward compatibility $this->activeSession = $activeSession ?? ObjectManager::getInstance()->get(ActiveSessionResource::class); } public function initNew(): void { $userData = $this->sessionUserDataProvider->getUserPreparedData(); $activeSessionModel = $this->activeSessionFactory->create()->setData($userData); $this->activeSessionRepository->save($activeSessionModel); } public function update(): void { $sessionId = $this->sessionUserDataProvider->getSessionId(); try { $activeSessionModel = $this->activeSessionRepository->getBySessionId($sessionId); $activeSessionModel->setRecentActivity($this->dateTime->date()); $this->activeSessionRepository->save($activeSessionModel); } catch (NoSuchEntityException $e) { return; } } public function terminate(string $sessionId = null): void { if ($sessionId === null) { $sessionId = $this->sessionUserDataProvider->getSessionId(); } try { $activeSessionModel = $this->activeSessionRepository->getBySessionId($sessionId); $this->activeSessionRepository->delete($activeSessionModel); } catch (NoSuchEntityException $e) { return; } $adminSessionInfoId = (int)$activeSessionModel->getAdminSessionInfoId(); if ($adminSessionInfoId) { // Since Magento 2.4.3-p1, 2.3.7-p2 session_id is no longer used in admin_user_session $this->destroySessionByAdminSessionInfoId($adminSessionInfoId); } else { $this->destroySessionBySessionId($sessionId); } } public function getInactiveSessions(): array { $sessionLifeTime = $this->scopeConfig->getValue(self::SESSION_LIFETIME_CONFIG_PATH); if (empty($sessionLifeTime)) { $sessionLifeTime = 900; } $activeSessionCollection = $this->activeSessionCollectionFactory->create(); $activeSessionCollection->addFieldToFilter( ActiveSession::RECENT_ACTIVITY, ['lteq' => $this->dateTime->gmtDate('Y-m-d H:i:s', "- $sessionLifeTime seconds") ] ); return $activeSessionCollection->getColumnValues(ActiveSession::SESSION_ID); } public function terminateAll(): void { $sessionIds = $this->activeSession->getAllSessionIds(); foreach ($sessionIds as $sessionId) { $this->terminate($sessionId); } } private function destroySessionBySessionId(string $sessionId): void { /** @var AdminSessionInfo $adminSessionInfo */ $adminSessionInfo = $this->adminSessionInfoCollectionFactory->create() ->addFieldToFilter('session_id', $sessionId) ->getFirstItem(); if (!$adminSessionInfo->getId()) { return; } $this->updateAdminSessionInfoStatus($adminSessionInfo); } private function destroySessionByAdminSessionInfoId(int $adminSessionInfoId): void { /** @var AdminSessionInfo $adminSessionInfo */ $adminSessionInfo = $this->adminSessionInfoCollectionFactory->create() ->addFieldToFilter('id', $adminSessionInfoId) ->getFirstItem(); if (!$adminSessionInfo->getId()) { return; } $this->updateAdminSessionInfoStatus($adminSessionInfo); } private function updateAdminSessionInfoStatus(AdminSessionInfo $adminSessionInfo): void { $this->adminSessionInfoResource->updateStatusByUserId( AdminSessionInfo::LOGGED_OUT_MANUALLY, $adminSessionInfo->getUserId(), [AdminSessionInfo::LOGGED_IN] ); } }