188 lines
6.8 KiB
PHP
Executable File
188 lines
6.8 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
namespace Magento\Security\Model\Plugin;
|
|
|
|
/**
|
|
* @magentoAppArea adminhtml
|
|
* @magentoAppIsolation enabled
|
|
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
|
*/
|
|
class AuthSessionTest extends \PHPUnit\Framework\TestCase
|
|
{
|
|
/**
|
|
* @var \Magento\Backend\Model\Auth
|
|
*/
|
|
protected $auth;
|
|
|
|
/**
|
|
* @var \Magento\Backend\Model\Auth\Session
|
|
*/
|
|
protected $authSession;
|
|
|
|
/**
|
|
* @var \Magento\Security\Model\AdminSessionInfo
|
|
*/
|
|
protected $adminSessionInfo;
|
|
|
|
/**
|
|
* @var \Magento\Security\Model\AdminSessionsManager
|
|
*/
|
|
protected $adminSessionsManager;
|
|
|
|
/**
|
|
* @var \Magento\Framework\ObjectManagerInterface
|
|
*/
|
|
protected $objectManager;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Stdlib\DateTime
|
|
*/
|
|
protected $dateTime;
|
|
|
|
/**
|
|
* @var \Magento\Security\Model\ConfigInterface
|
|
*/
|
|
protected $securityConfig;
|
|
|
|
/**
|
|
* Set up
|
|
*/
|
|
protected function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
|
|
$this->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());
|
|
}
|
|
}
|