Skip to content

Commit 47a9ed7

Browse files
committed
Refactor observers, update tests (#22833: Short-term admin accounts)
1 parent b407c8c commit 47a9ed7

File tree

16 files changed

+185
-99
lines changed

16 files changed

+185
-99
lines changed

app/code/Magento/Security/Model/Plugin/UserValidationRules.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ public function __construct(\Magento\Security\Model\UserExpiration\Validator $va
2828
}
2929

3030
/**
31+
* Add the Expires At validator to user validation rules.
32+
*
3133
* @param \Magento\User\Model\UserValidationRules $userValidationRules
3234
* @param \Magento\Framework\Validator\DataObject $result
3335
* @return \Magento\Framework\Validator\DataObject

app/code/Magento/Security/Model/ResourceModel/UserExpiration.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class UserExpiration extends \Magento\Framework\Model\ResourceModel\Db\AbstractD
2121
protected $_isPkAutoIncrement = false;
2222

2323
/**
24+
* Define main table
25+
*
2426
* @return void
2527
*/
2628
protected function _construct()

app/code/Magento/Security/Model/ResourceModel/UserExpiration/Collection.php

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
1818
protected $_idFieldName = 'user_id';
1919

2020
/**
21+
* Initialize collection
22+
*
2123
* @return void
2224
*/
2325
protected function _construct()
@@ -53,7 +55,8 @@ public function addActiveExpiredUsersFilter($now = null): Collection
5355

5456
/**
5557
* Filter collection by user id.
56-
* @param array $userIds
58+
*
59+
* @param int[] $userIds
5760
* @return Collection
5861
*/
5962
public function addUserIdsFilter($userIds = []): Collection
@@ -64,12 +67,12 @@ public function addUserIdsFilter($userIds = []): Collection
6467
/**
6568
* Get any expired records for the given user.
6669
*
67-
* @param $userId
70+
* @param string $userId
6871
* @return Collection
6972
*/
70-
public function addExpiredRecordsForUserFilter($userId): Collection
73+
public function addExpiredRecordsForUserFilter(string $userId): Collection
7174
{
7275
return $this->addActiveExpiredUsersFilter()
73-
->addFieldToFilter('main_table.user_id', $userId);
76+
->addFieldToFilter('main_table.user_id', (int)$userId);
7477
}
7578
}

app/code/Magento/Security/Model/UserExpirationManager.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ public function deactivateExpiredUsers(?array $userIds = null): void
9090
$currentSessions = $this->adminSessionInfoCollectionFactory->create()
9191
->addFieldToFilter('user_id', ['in' => $expiredRecords->getAllIds()])
9292
->filterExpiredSessions($this->securityConfig->getAdminSessionLifetime());
93+
/** @var \Magento\Security\Model\AdminSessionInfo $currentSession */
9394
$currentSessions->setDataToAll('status', \Magento\Security\Model\AdminSessionInfo::LOGGED_OUT)
9495
->save();
9596
}
@@ -107,12 +108,14 @@ public function deactivateExpiredUsers(?array $userIds = null): void
107108
/**
108109
* Check if the given user is expired.
109110
* // TODO: check users expired an hour ago (timezone stuff)
111+
*
110112
* @param \Magento\User\Model\User $user
111113
* @return bool
112114
*/
113115
public function userIsExpired(\Magento\User\Model\User $user): bool
114116
{
115117
$isExpired = false;
118+
/** @var \Magento\Security\Model\UserExpiration $expiredRecord */
116119
$expiredRecord = $this->userExpirationCollectionFactory->create()
117120
->addExpiredRecordsForUserFilter($user->getId())
118121
->getFirstItem();

app/code/Magento/Security/Observer/BeforeAdminUserAuthenticate.php renamed to app/code/Magento/Security/Observer/AdminUserAuthenticateBefore.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313
use Magento\Security\Model\UserExpirationManager;
1414

1515
/**
16-
* Class BeforeAdminUserAuthenticate
16+
* Check for expired users.
1717
*
1818
* @package Magento\Security\Observer
1919
*/
20-
class BeforeAdminUserAuthenticate implements ObserverInterface
20+
class AdminUserAuthenticateBefore implements ObserverInterface
2121
{
2222
/**
2323
* @var UserExpirationManager
@@ -29,6 +29,12 @@ class BeforeAdminUserAuthenticate implements ObserverInterface
2929
*/
3030
private $user;
3131

32+
/**
33+
* AdminUserAuthenticateBefore constructor.
34+
*
35+
* @param UserExpirationManager $userExpirationManager
36+
* @param \Magento\User\Model\User $user
37+
*/
3238
public function __construct(
3339
\Magento\Security\Model\UserExpirationManager $userExpirationManager,
3440
\Magento\User\Model\User $user
@@ -38,6 +44,8 @@ public function __construct(
3844
}
3945

4046
/**
47+
* Check for expired user when logging in.
48+
*
4149
* @param Observer $observer
4250
* @return void
4351
* @throws AuthenticationException

app/code/Magento/Security/Observer/AfterAdminUserLoad.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ class AfterAdminUserLoad implements ObserverInterface
2525
*/
2626
private $userExpirationResource;
2727

28+
/**
29+
* AfterAdminUserLoad constructor.
30+
*
31+
* @param \Magento\Security\Model\UserExpirationFactory $userExpirationFactory
32+
* @param \Magento\Security\Model\ResourceModel\UserExpiration $userExpirationResource
33+
*/
2834
public function __construct(
2935
\Magento\Security\Model\UserExpirationFactory $userExpirationFactory,
3036
\Magento\Security\Model\ResourceModel\UserExpiration $userExpirationResource
@@ -35,6 +41,8 @@ public function __construct(
3541
}
3642

3743
/**
44+
* Set the user expiration date onto the user.
45+
*
3846
* @param Observer $observer
3947
* @return void
4048
*/

app/code/Magento/Security/Observer/AfterAdminUserSave.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ class AfterAdminUserSave implements ObserverInterface
2525
*/
2626
private $userExpirationResource;
2727

28+
/**
29+
* AfterAdminUserSave constructor.
30+
*
31+
* @param \Magento\Security\Model\UserExpirationFactory $userExpirationFactory
32+
* @param \Magento\Security\Model\ResourceModel\UserExpiration $userExpirationResource
33+
*/
2834
public function __construct(
2935
\Magento\Security\Model\UserExpirationFactory $userExpirationFactory,
3036
\Magento\Security\Model\ResourceModel\UserExpiration $userExpirationResource
@@ -35,6 +41,8 @@ public function __construct(
3541
}
3642

3743
/**
44+
* Save user expiration.
45+
*
3846
* @param Observer $observer
3947
* @return void
4048
*/

app/code/Magento/Security/Test/Unit/Observer/BeforeAdminUserAuthenticateTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
namespace Magento\Security\Test\Unit\Observer;
99

1010
/**
11-
* Test for \Magento\Security\Observer\BeforeAdminUserAuthenticate
11+
* Test for \Magento\Security\Observer\AdminUserAuthenticateBefore
1212
*
1313
* @package Magento\Security\Test\Unit\Observer
1414
*/
@@ -30,7 +30,7 @@ class BeforeAdminUserAuthenticateTest extends \PHPUnit\Framework\TestCase
3030
private $userMock;
3131

3232
/**
33-
* @var \Magento\Security\Observer\BeforeAdminUserAuthenticate
33+
* @var \Magento\Security\Observer\AdminUserAuthenticateBefore
3434
*/
3535
private $observer;
3636

@@ -64,7 +64,7 @@ protected function setUp()
6464
);
6565
$this->userMock = $this->createPartialMock(\Magento\User\Model\User::class, ['loadByUsername', 'getId']);
6666
$this->observer = $this->objectManager->getObject(
67-
\Magento\Security\Observer\BeforeAdminUserAuthenticate::class,
67+
\Magento\Security\Observer\AdminUserAuthenticateBefore::class,
6868
[
6969
'userExpirationManager' => $this->userExpirationManagerMock,
7070
'user' => $this->userMock,

app/code/Magento/Security/etc/crontab.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<job name="security_clean_password_reset_request_event_records" instance="Magento\Security\Model\SecurityManager" method="cleanExpiredRecords">
1414
<schedule>0 0 * * *</schedule>
1515
</job>
16-
<job name="security_expire_users" instance="Magento\Security\Model\UserExpirationManager" method="deactivateExpiredUsers">
16+
<job name="security_deactivate_expired_users" instance="Magento\Security\Model\UserExpirationManager" method="deactivateExpiredUsers">
1717
<schedule>0 * * * *</schedule>
1818
</job>
1919
</group>

app/code/Magento/Security/etc/events.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@
1414
<observer name="add_user_expiration" instance="Magento\Security\Observer\AfterAdminUserLoad"/>
1515
</event>
1616
<event name="admin_user_authenticate_before">
17-
<observer name="check_user_expiration" instance="Magento\Security\Observer\BeforeAdminUserAuthenticate"/>
17+
<observer name="check_user_expiration" instance="Magento\Security\Observer\AdminUserAuthenticateBefore"/>
1818
</event>
1919
</config>

dev/tests/integration/testsuite/Magento/Security/Model/Plugin/AuthSessionTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,9 @@ public function testProcessProlong()
142142
}
143143

144144
/**
145+
* Test processing prolong with an expired user.
146+
*
147+
* @magentoDbIsolation enabled
145148
*/
146149
public function testProcessProlongWithExpiredUser()
147150
{

dev/tests/integration/testsuite/Magento/Security/Model/ResourceModel/UserExpiration/CollectionTest.php

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,25 +38,39 @@ protected function setUp()
3838
/**
3939
* @magentoDataFixture Magento/Security/_files/expired_users.php
4040
*/
41-
public function testExpiredActiveUsersFilter()
41+
public function testAddExpiredActiveUsersFilter()
4242
{
4343
/** @var \Magento\Security\Model\ResourceModel\UserExpiration\Collection $collectionModel */
4444
$collectionModel = $this->collectionModelFactory->create();
4545
$collectionModel->addActiveExpiredUsersFilter();
46-
static::assertGreaterThanOrEqual(1, $collectionModel->getSize());
46+
static::assertEquals(1, $collectionModel->getSize());
4747
}
4848

4949
/**
5050
* @magentoDataFixture Magento/Security/_files/expired_users.php
5151
*/
52-
public function testGetExpiredRecordsForUser()
52+
public function testAddUserIdsFilter()
53+
{
54+
$adminUserNameFromFixture = 'adminUserExpired';
55+
$user = $this->objectManager->create(\Magento\User\Model\User::class);
56+
$user->loadByUsername($adminUserNameFromFixture);
57+
58+
/** @var \Magento\Security\Model\ResourceModel\UserExpiration\Collection $collectionModel */
59+
$collectionModel = $this->collectionModelFactory->create()->addUserIdsFilter([$user->getId()]);
60+
static::assertEquals(1, $collectionModel->getSize());
61+
}
62+
63+
/**
64+
* @magentoDataFixture Magento/Security/_files/expired_users.php
65+
*/
66+
public function testAddExpiredRecordsForUserFilter()
5367
{
5468
$adminUserNameFromFixture = 'adminUserExpired';
5569
$user = $this->objectManager->create(\Magento\User\Model\User::class);
5670
$user->loadByUsername($adminUserNameFromFixture);
5771

5872
/** @var \Magento\Security\Model\ResourceModel\UserExpiration\Collection $collectionModel */
5973
$collectionModel = $this->collectionModelFactory->create()->addExpiredRecordsForUserFilter($user->getId());
60-
static::assertGreaterThanOrEqual(1, $collectionModel->getSize());
74+
static::assertEquals(1, $collectionModel->getSize());
6175
}
6276
}

0 commit comments

Comments
 (0)