objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); $this->objectManager->get(\Magento\Framework\Config\ScopeInterface::class) ->setCurrentScope(\Magento\Backend\App\Area\FrontNameResolver::AREA_CODE); $this->auth = $this->objectManager->create(\Magento\Backend\Model\Auth::class); $this->authSession = $this->objectManager->create(\Magento\Backend\Model\Auth\Session::class); $this->adminSessionInfo = $this->objectManager->create(\Magento\Security\Model\AdminSessionInfo::class); $this->auth->setAuthStorage($this->authSession); $this->adminSessionsManager = $this->objectManager->get(\Magento\Security\Model\AdminSessionsManager::class); $this->dateTime = $this->objectManager->create(\Magento\Framework\Stdlib\DateTime::class); $this->securityConfig = $this->objectManager->create(\Magento\Security\Model\ConfigInterface::class); } /** * Tear down */ protected function tearDown(): void { $this->auth = null; $this->authSession = null; $this->adminSessionInfo = null; $this->adminSessionsManager = null; $this->objectManager = null; parent::tearDown(); } /** * Test of prolong user action * session manager will not trigger new prolong if previous prolong was less than X sec ago * X - is calculated based on current admin session lifetime * * @see \Magento\Security\Model\AdminSessionsManager::lastProlongIsOldEnough * @magentoDbIsolation enabled */ public function testConsecutiveProcessProlong() { $this->auth->login( \Magento\TestFramework\Bootstrap::ADMIN_NAME, \Magento\TestFramework\Bootstrap::ADMIN_PASSWORD ); $adminSessionInfoId = $this->authSession->getAdminSessionInfoId(); $prolongsDiff = log($this->securityConfig->getAdminSessionLifetime()) - 2; // X from comment above $dateInPast = $this->dateTime->formatDate((int) ($this->authSession->getUpdatedAt() - $prolongsDiff)); $this->adminSessionsManager->getCurrentSession() ->setData( 'updated_at', $dateInPast ) ->save(); $this->adminSessionInfo->load($adminSessionInfoId, 'id'); $oldUpdatedAt = $this->adminSessionInfo->getUpdatedAt(); $this->authSession->prolong(); $this->adminSessionInfo->load($adminSessionInfoId, 'id'); $updatedAt = $this->adminSessionInfo->getUpdatedAt(); $this->assertSame(strtotime($oldUpdatedAt), strtotime($updatedAt)); } /** * Test of prolong user action * session manager will trigger new prolong if previous prolong was more than X sec ago * X - is calculated based on current admin session lifetime * * @see \Magento\Security\Model\AdminSessionsManager::lastProlongIsOldEnough * @magentoDbIsolation enabled */ public function testProcessProlong() { $this->auth->login( \Magento\TestFramework\Bootstrap::ADMIN_NAME, \Magento\TestFramework\Bootstrap::ADMIN_PASSWORD ); $adminSessionInfoId = $this->authSession->getAdminSessionInfoId(); $prolongsDiff = 4 * log($this->securityConfig->getAdminSessionLifetime()) + 2; // X from comment above $dateInPast = $this->dateTime->formatDate((int) ($this->authSession->getUpdatedAt() - $prolongsDiff)); $this->adminSessionsManager->getCurrentSession() ->setData( 'updated_at', $dateInPast ) ->save(); $this->adminSessionInfo->load($adminSessionInfoId, 'id'); $oldUpdatedAt = $this->adminSessionInfo->getUpdatedAt(); $this->authSession->prolong(); $this->adminSessionInfo->load($adminSessionInfoId, 'id'); $updatedAt = $this->adminSessionInfo->getUpdatedAt(); $this->assertGreaterThan(strtotime($oldUpdatedAt), strtotime($updatedAt)); } /** * Test processing prolong with an expired user. * * @magentoDbIsolation enabled */ public function testProcessProlongWithExpiredUser() { $this->auth->login( \Magento\TestFramework\Bootstrap::ADMIN_NAME, \Magento\TestFramework\Bootstrap::ADMIN_PASSWORD ); $expireDate = new \DateTime(); $expireDate->modify('-10 days'); /** @var \Magento\User\Model\User $user */ $user = $this->objectManager->create(\Magento\User\Model\User::class); $user->loadByUsername(\Magento\TestFramework\Bootstrap::ADMIN_NAME); $userExpirationFactory = $this->objectManager->create(\Magento\Security\Api\Data\UserExpirationInterfaceFactory::class); /** @var \Magento\Security\Api\Data\UserExpirationInterface $userExpiration */ $userExpiration = $userExpirationFactory->create(); $userExpiration->setId($user->getId()) ->setExpiresAt($expireDate->format('Y-m-d H:i:s')) ->save(); // need to trigger a prolong $adminSessionInfoId = $this->authSession->getAdminSessionInfoId(); $prolongsDiff = 4 * log($this->securityConfig->getAdminSessionLifetime()) + 2; $dateInPast = $this->dateTime->formatDate((int) ($this->authSession->getUpdatedAt() - $prolongsDiff)); $this->adminSessionsManager->getCurrentSession() ->setData( 'updated_at', $dateInPast ) ->save(); $this->adminSessionInfo->load($adminSessionInfoId, 'id'); $this->authSession->prolong(); static::assertFalse($this->auth->isLoggedIn()); $user->reload(); static::assertFalse((bool)$user->getIsActive()); } }