Skip to content

Short-term admin accounts #22833 #22837

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 98 commits into from
Mar 28, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
fa1f103
Create new database table "expires at"
avstudnitz May 11, 2019
451fae8
22833 Create new database table "expires at"
avstudnitz May 11, 2019
70821f0
Merge branch 'project_pepe' of github.com:lfolco/magento2 into projec…
lfolco May 11, 2019
b17c54d
add whitelist for expires_at on user table (#22833)
lfolco May 11, 2019
c0c6825
add getters/setters for expires_at (#22833)
lfolco May 11, 2019
6e2043e
adding validation rules (#22833)
lfolco May 11, 2019
9136564
finish validation; add tests (#22833)
lfolco May 12, 2019
37c9d12
add cronjob, finish tests (#22833)
lfolco May 12, 2019
8b5bec6
update tests to check for active session (#22833)
lfolco May 18, 2019
0b78cbb
Invalidate user sessions and handle expired users on login (#22833)
lfolco May 19, 2019
976076f
Fix test for AdminSessionsManager calling getUser (#22833)
lfolco May 19, 2019
db95a0d
handle calling getUser in test (#22833)
lfolco May 19, 2019
cf66338
handle possibility of 1 or more in user collection test (#22833)
lfolco May 20, 2019
c552e5f
clean up code style issues (#22833)
lfolco May 22, 2019
f44ac3e
Merge branch '2.3-develop' into project_pepe
lfolco Jun 1, 2019
d5855ba
clean up code style issues (#22833)
lfolco Jun 1, 2019
439f565
clean up code style issues (#22833)
lfolco Jun 1, 2019
c6f455d
Merge branch '2.3-develop' into project_pepe
lfolco Jun 12, 2019
32f8741
Merge remote-tracking branch 'upstream/2.3-develop' into project_pepe
lfolco Jun 12, 2019
a6511f5
Merge branch '2.3-develop' into project_pepe
lfolco Jun 12, 2019
ae08dad
move changes out of user and into security (magento/magento2#22833: S…
lfolco Jun 21, 2019
54882c3
Merge remote-tracking branch 'upstream/2.3-develop' into project_pepe
lfolco Jun 21, 2019
ad4628b
move changes out of user and into security (magento/magento2#22833: S…
lfolco Jun 21, 2019
3c608fd
move changes out of user and into security (magento/magento2#22833: S…
lfolco Jun 21, 2019
e4ec0e2
revert merge changes (magento/magento2#22833: Short-term admin accounts)
lfolco Jun 21, 2019
13bfde2
Merge branch '2.3-develop' into project_pepe
lfolco Jun 21, 2019
e51bf0a
Create models for userexpiration, add tests and events (magento/magen…
lfolco Jun 30, 2019
185d640
Merge branch '2.3-develop' into project_pepe
lfolco Jun 30, 2019
071f993
Move events out of adminhtml area; use Auth session prolong plugin in…
lfolco Jun 30, 2019
b407c8c
fix crontab definition, copyright (#22833: Short-term admin accounts)
lfolco Jun 30, 2019
47a9ed7
Refactor observers, update tests (magento/magento2#22833: Short-term …
lfolco Jul 4, 2019
b631f9d
Merge remote-tracking branch 'upstream/2.3-develop' into project_pepe
lfolco Jul 4, 2019
6407af8
handle dates with store time (magento/magento2#22833: Short-term admi…
lfolco Jul 6, 2019
75664d4
handle dates with store time (magento/magento2#22833: Short-term admi…
lfolco Jul 8, 2019
c384fab
using new basebox
lfolco Jul 12, 2019
cd53ca4
fix tests (magento/magento2#22833: Short-term admin accounts)
lfolco Jul 29, 2019
581ace6
Merge remote-tracking branch 'origin/project_pepe' into project_pepe
lfolco Jul 29, 2019
13038fc
fix unit test (magento/magento2#22833: Short-term admin accounts)
lfolco Jul 29, 2019
2122209
Merge branch '2.3-develop' into project_pepe
lfolco Jul 29, 2019
192f8e8
fix phpdoc (magento/magento2#22833: Short-term admin accounts)
lfolco Jul 29, 2019
c5ac841
remove phpinfo file (magento/magento2#22833: Short-term admin accounts)
lfolco Jul 29, 2019
57dda2e
test fixes (magento/magento2#22833: Short-term admin accounts)
lfolco Jul 29, 2019
05fae71
use convertConfigTimeToUtc to get UTC time (magento/magento2#22833: S…
lfolco Jul 29, 2019
6378fe6
remove unused constructor param (magento/magento2#22833: Short-term a…
lfolco Jul 29, 2019
1535364
Merge branch '2.3-develop' into project_pepe
lfolco Aug 7, 2019
c8e1e93
Merge remote-tracking branch 'upstream/2.3-develop' into project_pepe
lfolco Sep 21, 2019
437cbf0
suppress error about "sessions or cookies while not being a part of H…
lfolco Sep 21, 2019
60f5710
add MFTF test for creating new user with valid expiration date (#22833)
lfolco Sep 22, 2019
9e82e91
add MFTF test for creating new user with invalid expiration date (#22…
lfolco Sep 22, 2019
61d3ffa
Merge branch '2.3-develop' into project_pepe
lfolco Sep 23, 2019
e87d4e6
Merge branch 'project_pepe' into mftf
lfolco Sep 23, 2019
bad8f2b
rename tests (magento/magento2#22833: Short-term admin accounts)
lfolco Sep 26, 2019
6406d93
Merge remote-tracking branch 'upstream/2.3-develop' into 2.3-develop
lfolco Sep 26, 2019
e13b5e4
Merge branch '2.3-develop' into project_pepe
lfolco Sep 26, 2019
83e393e
Merge branch 'project_pepe' into mftf
lfolco Sep 26, 2019
d2538ad
Merge branch '2.3-develop' of github.com:lfolco/magento2 into 2.3-dev…
lfolco Sep 26, 2019
b16de6b
Merge branch '2.3-develop' into project_pepe
lfolco Sep 26, 2019
b195ca0
Merge branch '2.3-develop' into mftf
lfolco Sep 26, 2019
1089987
Merge branch 'mftf' into project_pepe
lfolco Sep 26, 2019
581988a
refactored tests to use more from User module (magento/magento2#22833…
lfolco Sep 27, 2019
f185806
added test to ensure timezones working correctly (magento/magento2#22…
lfolco Sep 28, 2019
d8c8473
use UTC to convert date in validator (magento/magento2#22833: Short-t…
lfolco Sep 28, 2019
0f91a9d
add MFTF tests for logging in and fix timezone issue (magento/magento…
lfolco Sep 29, 2019
8036e29
Merge remote-tracking branch 'upstream/2.3-develop' into project_pepe
lfolco Sep 29, 2019
45d648f
Update unit tests to handle new timezone dependency (magento/magento2…
lfolco Sep 29, 2019
970510c
add copyright and fix failing unrelated test (magento/magento2#22833:…
lfolco Sep 29, 2019
78dc3b5
add copyright (magento/magento2#22833: Short-term admin accounts)
lfolco Sep 29, 2019
171c4c9
increase lead time for user expiration test (magento/magento2#22833: …
lfolco Sep 30, 2019
89b8512
fixes from code review (magento/magento2#22833: Short-term admin acco…
lfolco Sep 30, 2019
bcef590
replace changes in User module with plugin for admin user form (magen…
lfolco Sep 30, 2019
627273b
phpcs fixes (magento/magento2#22833: Short-term admin accounts)
lfolco Oct 1, 2019
6b8e89e
fix invalid date input and add translations (magento/magento2#22833: …
lfolco Oct 8, 2019
9e6f316
fix invalid date input in mftf test (magento/magento2#22833: Short-te…
lfolco Oct 8, 2019
20f2f0e
Fixed test group name
sidolov Oct 9, 2019
1b1c12e
fix dates in MFTF test; update admin user form plugin to set the user…
lfolco Oct 13, 2019
91e0604
remove test debug group (#22833)
lfolco Oct 13, 2019
47dfddb
delete users after tests in mftf (magento/magento2#22833: Short-term …
lfolco Oct 14, 2019
c6f9e6b
fix phpdocs (magento/magento2#22833: Short-term admin accounts)
lfolco Oct 14, 2019
df0c97c
remove unused import and fix phpdocs (magento/magento2#22833: Short-t…
lfolco Oct 15, 2019
babc965
deactivate expired users on session prolong (#22833)
lfolco Oct 19, 2019
4c4149f
add copyright (#22833)
lfolco Oct 19, 2019
33a5d36
split out deactivateExpiredUsers into two methods suitable for callin…
lfolco Oct 25, 2019
0ed4e6a
Merge branch '2.4-develop' into project_pepe
slavvka Jan 9, 2020
74389d7
Merge branch '2.4-develop' into project_pepe
lfolco Jan 9, 2020
5111c05
Merge branch 'project_pepe' of github.com:lfolco/magento2 into projec…
lfolco Jan 9, 2020
9d8ce1c
Merge branch '2.4-develop' into project_pepe
slavvka Jan 17, 2020
95fce13
fix static tests (magento/magento2#22833: Short-term admin accounts)
lfolco Jan 18, 2020
932559d
fix static tests (magento/magento2#22833: Short-term admin accounts)
lfolco Jan 18, 2020
7fee060
create DTO for user expiration (#19093)
lfolco Jan 27, 2020
5e6fdeb
fix integration, unit tests (magento/magento2#22833: Short-term admin…
lfolco Feb 8, 2020
3a67bc8
merge
lfolco Feb 29, 2020
b03b0a0
fix date format, test names (magento/magento2#22833: Short-term admin…
lfolco Mar 3, 2020
c8a41b7
make constants private scope (magento/magento2#22833: Short-term admi…
lfolco Mar 3, 2020
107cb5f
revert constant private scope (magento/magento2#22833: Short-term adm…
lfolco Mar 3, 2020
bef0bd5
move interface into Api/Data, make it extensible (magento/magento2#22…
lfolco Mar 4, 2020
6ef861e
use fully qualified class names (magento/magento2#22833: Short-term a…
lfolco Mar 4, 2020
d65e609
fix static test failure (magento/magento2#22833: Short-term admin acc…
lfolco Mar 5, 2020
c8cfb5b
fix static test failure (magento/magento2#22833: Short-term admin acc…
lfolco Mar 5, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,9 @@
<waitForPageLoad time="30" stepKey="wait2"/>
<seeInField selector="{{AdminEditUserSection.usernameTextField}}" userInput="$$noReportUser.username$$" stepKey="seeUsernameInField"/>
<fillField selector="{{AdminEditUserSection.currentPasswordField}}" userInput="{{_ENV.MAGENTO_ADMIN_PASSWORD}}" stepKey="fillCurrentPassword"/>
<click selector="{{AdminEditUserSection.userRoleTab}}" stepKey="clickUserRoleTab"/>
<scrollToTopOfPage stepKey="scrollToTopOfPage"/>

<click selector="{{AdminEditUserSection.userRoleTab}}" stepKey="clickUserRoleTab"/>
<fillField selector="{{AdminEditUserSection.roleNameFilterTextField}}" userInput="$$noReportUserRole.rolename$$" stepKey="fillRoleNameSearch"/>
<click selector="{{AdminEditUserSection.searchButton}}" stepKey="clickSearchButtonUserRole"/>
<waitForPageLoad time="10" stepKey="wait3"/>
Expand Down
67 changes: 67 additions & 0 deletions app/code/Magento/Security/Api/Data/UserExpirationInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

declare(strict_types=1);

namespace Magento\Security\Api\Data;

use \Magento\Security\Api\Data\UserExpirationExtensionInterface;

/**
* Interface UserExpirationInterface to be used as a DTO for expires_at property on User model.
*/
interface UserExpirationInterface extends \Magento\Framework\Api\ExtensibleDataInterface
{

public const EXPIRES_AT = 'expires_at';

public const USER_ID = 'user_id';

/**
* `expires_at` getter.
*
* @return string
*/
public function getExpiresAt();

/**
* `expires_at` setter.
*
* @param string $expiresAt
* @return $this
*/
public function setExpiresAt($expiresAt);

/**
* `user_id` getter.
*
* @return string
*/
public function getUserId();

/**
* `user_id` setter.
*
* @param string $userId
* @return $this
*/
public function setUserId($userId);

/**
* Retrieve existing extension attributes object or create a new one.
*
* @return \Magento\Security\Api\Data\UserExpirationExtensionInterface|null
*/
public function getExtensionAttributes();

/**
* Set an extension attributes object.
*
* @param \Magento\Security\Api\Data\UserExpirationExtensionInterface $extensionAttributes
* @return $this
*/
public function setExtensionAttributes(UserExpirationExtensionInterface $extensionAttributes);
}
112 changes: 112 additions & 0 deletions app/code/Magento/Security/Model/Plugin/AdminUserForm.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\Security\Model\Plugin;

use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
use Magento\Security\Model\ResourceModel\UserExpiration;
use Magento\Security\Model\UserExpirationFactory;

/**
* Add the `expires_at` form field to the User main form.
*/
class AdminUserForm
{

/**
* @var TimezoneInterface
*/
private $localeDate;

/**
* @var UserExpiration
*/
private $userExpirationResource;

/**
* @var UserExpirationFactory
*/
private $userExpirationFactory;

/**
* UserForm constructor.
*
* @param TimezoneInterface $localeDate
* @param UserExpirationFactory $userExpirationFactory
* @param UserExpiration $userExpirationResource
*/
public function __construct(
TimezoneInterface $localeDate,
UserExpirationFactory $userExpirationFactory,
UserExpiration $userExpirationResource
) {
$this->localeDate = $localeDate;
$this->userExpirationResource = $userExpirationResource;
$this->userExpirationFactory = $userExpirationFactory;
}

/**
* Add the `expires_at` field to the admin user edit form.
*
* @param \Magento\User\Block\User\Edit\Tab\Main $subject
* @param \Closure $proceed
* @return mixed
*/
public function aroundGetFormHtml(
\Magento\User\Block\User\Edit\Tab\Main $subject,
\Closure $proceed
) {
/** @var \Magento\Framework\Data\Form $form */
$form = $subject->getForm();
if (is_object($form)) {
$dateFormat = $this->localeDate->getDateFormat(
\IntlDateFormatter::MEDIUM
);
$timeFormat = $this->localeDate->getTimeFormat(
\IntlDateFormatter::MEDIUM
);
$fieldset = $form->getElement('base_fieldset');
$userIdField = $fieldset->getElements()->searchById('user_id');
$userExpirationValue = null;
if ($userIdField) {
$userId = $userIdField->getValue();
$userExpirationValue = $this->loadUserExpirationByUserId($userId);
}
$fieldset->addField(
'expires_at',
'date',
[
'name' => 'expires_at',
'label' => __('Expiration Date'),
'title' => __('Expiration Date'),
'date_format' => $dateFormat,
'time_format' => $timeFormat,
'class' => 'validate-date',
'value' => $userExpirationValue,
]
);

$subject->setForm($form);
}

return $proceed();
}

/**
* Loads a user expiration record by user ID.
*
* @param string $userId
* @return string
*/
private function loadUserExpirationByUserId($userId)
{
/** @var \Magento\Security\Model\UserExpiration $userExpiration */
$userExpiration = $this->userExpirationFactory->create();
$this->userExpirationResource->load($userExpiration, $userId);
return $userExpiration->getExpiresAt();
}
}
18 changes: 17 additions & 1 deletion app/code/Magento/Security/Model/Plugin/AuthSession.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

use Magento\Backend\Model\Auth\Session;
use Magento\Security\Model\AdminSessionsManager;
use Magento\Security\Model\UserExpirationManager;

/**
* Magento\Backend\Model\Auth\Session decorator
Expand All @@ -33,22 +34,32 @@ class AuthSession
*/
protected $securityCookie;

/**
* @var UserExpirationManager
*/
private $userExpirationManager;

/**
* @param \Magento\Framework\App\RequestInterface $request
* @param \Magento\Framework\Message\ManagerInterface $messageManager
* @param AdminSessionsManager $sessionsManager
* @param \Magento\Security\Model\SecurityCookie $securityCookie
* @param UserExpirationManager|null $userExpirationManager
*/
public function __construct(
\Magento\Framework\App\RequestInterface $request,
\Magento\Framework\Message\ManagerInterface $messageManager,
AdminSessionsManager $sessionsManager,
\Magento\Security\Model\SecurityCookie $securityCookie
\Magento\Security\Model\SecurityCookie $securityCookie,
\Magento\Security\Model\UserExpirationManager $userExpirationManager = null
) {
$this->request = $request;
$this->messageManager = $messageManager;
$this->sessionsManager = $sessionsManager;
$this->securityCookie = $securityCookie;
$this->userExpirationManager = $userExpirationManager ?:
\Magento\Framework\App\ObjectManager::getInstance()
->get(\Magento\Security\Model\UserExpirationManager::class);
}

/**
Expand All @@ -64,6 +75,11 @@ public function aroundProlong(Session $session, \Closure $proceed)
$session->destroy();
$this->addUserLogoutNotification();
return null;
} elseif ($this->userExpirationManager->isUserExpired($session->getUser()->getId())) {
$this->userExpirationManager->deactivateExpiredUsersById([$session->getUser()->getId()]);
$session->destroy();
$this->addUserLogoutNotification();
return null;
}
$result = $proceed();
$this->sessionsManager->processProlong();
Expand Down
42 changes: 42 additions & 0 deletions app/code/Magento/Security/Model/Plugin/UserValidationRules.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\Security\Model\Plugin;

use Magento\Security\Model\UserExpiration\Validator;

/**
* \Magento\User\Model\UserValidationRules decorator
*/
class UserValidationRules
{
/**@var Validator */
private $validator;

/**
* UserValidationRules constructor.
*
* @param Validator $validator
*/
public function __construct(Validator $validator)
{
$this->validator = $validator;
}

/**
* Add the Expires At validator to user validation rules.
*
* @param \Magento\User\Model\UserValidationRules $userValidationRules
* @param \Magento\Framework\Validator\DataObject $result
* @return \Magento\Framework\Validator\DataObject
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function afterAddUserInfoRules(\Magento\User\Model\UserValidationRules $userValidationRules, $result)
{
return $result->addRule($this->validator, 'expires_at');
}
}
88 changes: 88 additions & 0 deletions app/code/Magento/Security/Model/ResourceModel/UserExpiration.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\Security\Model\ResourceModel;

/**
* Admin User Expiration resource model
*/
class UserExpiration extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
{

/**
* Flag that notifies whether Primary key of table is auto-incremented
*
* @var bool
*/
protected $_isPkAutoIncrement = false;

/**
* @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface
*/
private $timezone;

/**
* UserExpiration constructor.
*
* @param \Magento\Framework\Model\ResourceModel\Db\Context $context
* @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
* @param string $connectionName
*/
public function __construct(
\Magento\Framework\Model\ResourceModel\Db\Context $context,
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone,
?string $connectionName = null
) {
parent::__construct($context, $connectionName);
$this->timezone = $timezone;
}

/**
* Define main table
*
* @return void
*/
protected function _construct()
{
$this->_init('admin_user_expiration', 'user_id');
}

/**
* Convert to UTC time.
*
* @param \Magento\Framework\Model\AbstractModel $userExpiration
* @return $this
* @throws \Magento\Framework\Exception\LocalizedException
*/
protected function _beforeSave(\Magento\Framework\Model\AbstractModel $userExpiration)
{
/** @var $userExpiration \Magento\Security\Model\UserExpiration */
$expiresAt = $userExpiration->getExpiresAt();
$utcValue = $this->timezone->convertConfigTimeToUtc($expiresAt);
$userExpiration->setExpiresAt($utcValue);

return $this;
}

/**
* Convert to store time.
*
* @param \Magento\Framework\Model\AbstractModel $userExpiration
* @return $this|\Magento\Framework\Model\ResourceModel\Db\AbstractDb
* @throws \Exception
*/
protected function _afterLoad(\Magento\Framework\Model\AbstractModel $userExpiration)
{
/** @var $userExpiration \Magento\Security\Model\UserExpiration */
if ($userExpiration->getExpiresAt()) {
$storeValue = $this->timezone->date($userExpiration->getExpiresAt());
$userExpiration->setExpiresAt($storeValue->format('Y-m-d H:i:s'));
}

return $this;
}
}
Loading