123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- <?php
- /**
- *
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\User\Controller\Adminhtml\User\Role;
- use Magento\Framework\App\Action\HttpPostActionInterface as HttpPostActionInterface;
- use Magento\Authorization\Model\Acl\Role\Group as RoleGroup;
- use Magento\Authorization\Model\UserContextInterface;
- use Magento\Framework\Controller\ResultFactory;
- use Magento\Framework\Exception\LocalizedException;
- use Magento\Framework\Exception\State\UserLockedException;
- use Magento\Security\Model\SecurityCookie;
- /**
- * Save role controller
- *
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class SaveRole extends \Magento\User\Controller\Adminhtml\User\Role implements HttpPostActionInterface
- {
- /**
- * Session keys for Info form data
- */
- const ROLE_EDIT_FORM_DATA_SESSION_KEY = 'role_edit_form_data';
- /**
- * Session keys for Users form data
- */
- const IN_ROLE_USER_FORM_DATA_SESSION_KEY = 'in_role_user_form_data';
- /**
- * Session keys for original Users form data
- */
- const IN_ROLE_OLD_USER_FORM_DATA_SESSION_KEY = 'in_role_old_user_form_data';
- /**
- * Session keys for Use all resources flag form data
- */
- const RESOURCE_ALL_FORM_DATA_SESSION_KEY = 'resource_all_form_data';
- /**
- * Session keys for Resource form data
- */
- const RESOURCE_FORM_DATA_SESSION_KEY = 'resource_form_data';
- /**
- * @var SecurityCookie
- */
- private $securityCookie;
- /**
- * Get security cookie
- *
- * @return SecurityCookie
- * @deprecated 100.1.0
- */
- private function getSecurityCookie()
- {
- if (!($this->securityCookie instanceof SecurityCookie)) {
- return \Magento\Framework\App\ObjectManager::getInstance()->get(SecurityCookie::class);
- }
- return $this->securityCookie;
- }
- /**
- * Role form submit action to save or create new role
- *
- * @return \Magento\Backend\Model\View\Result\Redirect
- */
- public function execute()
- {
- /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
- $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
- $rid = $this->getRequest()->getParam('role_id', false);
- $resource = $this->getRequest()->getParam('resource', false);
- $oldRoleUsers = $this->parseRequestVariable('in_role_user_old');
- $roleUsers = $this->parseRequestVariable('in_role_user');
- $isAll = $this->getRequest()->getParam('all');
- if ($isAll) {
- $resource = [$this->_objectManager->get(\Magento\Framework\Acl\RootResource::class)->getId()];
- }
- $role = $this->_initRole('role_id');
- if (!$role->getId() && $rid) {
- $this->messageManager->addError(__('This role no longer exists.'));
- return $resultRedirect->setPath('adminhtml/*/');
- }
- try {
- $this->validateUser();
- $roleName = $this->_filterManager->removeTags($this->getRequest()->getParam('rolename', false));
- $role->setName($roleName)
- ->setPid($this->getRequest()->getParam('parent_id', false))
- ->setRoleType(RoleGroup::ROLE_TYPE)
- ->setUserType(UserContextInterface::USER_TYPE_ADMIN);
- $this->_eventManager->dispatch(
- 'admin_permissions_role_prepare_save',
- ['object' => $role, 'request' => $this->getRequest()]
- );
- $role->save();
- $this->_rulesFactory->create()->setRoleId($role->getId())->setResources($resource)->saveRel();
- $this->processPreviousUsers($role, $oldRoleUsers);
- $this->processCurrentUsers($role, $roleUsers);
- $this->messageManager->addSuccessMessage(__('You saved the role.'));
- } catch (UserLockedException $e) {
- $this->_auth->logout();
- $this->getSecurityCookie()->setLogoutReasonCookie(
- \Magento\Security\Model\AdminSessionsManager::LOGOUT_REASON_USER_LOCKED
- );
- return $resultRedirect->setPath('*');
- } catch (\Magento\Framework\Exception\AuthenticationException $e) {
- $this->messageManager->addErrorMessage(
- __('The password entered for the current user is invalid. Verify the password and try again.')
- );
- return $this->saveDataToSessionAndRedirect($role, $this->getRequest()->getPostValue(), $resultRedirect);
- } catch (\Magento\Framework\Exception\LocalizedException $e) {
- $this->messageManager->addErrorMessage($e->getMessage());
- } catch (\Exception $e) {
- $this->messageManager->addErrorMessage(__('An error occurred while saving this role.'));
- }
- return $resultRedirect->setPath('*/*/');
- }
- /**
- * Validate current user password
- *
- * @return $this
- * @throws UserLockedException
- * @throws \Magento\Framework\Exception\AuthenticationException
- */
- protected function validateUser()
- {
- $password = $this->getRequest()->getParam(
- \Magento\User\Block\Role\Tab\Info::IDENTITY_VERIFICATION_PASSWORD_FIELD
- );
- $user = $this->_authSession->getUser();
- $user->performIdentityCheck($password);
- return $this;
- }
- /**
- * Parse request value from string
- *
- * @param string $paramName
- * @return array
- */
- private function parseRequestVariable($paramName): array
- {
- $value = $this->getRequest()->getParam($paramName, null);
- parse_str($value, $value);
- $value = array_keys($value);
- return $value;
- }
- /**
- * Process previous users
- *
- * @param \Magento\Authorization\Model\Role $role
- * @param array $oldRoleUsers
- * @return $this
- * @throws \Exception
- */
- protected function processPreviousUsers(\Magento\Authorization\Model\Role $role, array $oldRoleUsers): self
- {
- foreach ($oldRoleUsers as $oUid) {
- $this->_deleteUserFromRole($oUid, $role->getId());
- }
- return $this;
- }
- /**
- * Processes users to be assigned to roles
- *
- * @param \Magento\Authorization\Model\Role $role
- * @param array $roleUsers
- * @return $this
- */
- private function processCurrentUsers(\Magento\Authorization\Model\Role $role, array $roleUsers): self
- {
- foreach ($roleUsers as $nRuid) {
- try {
- $this->_addUserToRole($nRuid, $role->getId());
- } catch (LocalizedException $e) {
- $this->messageManager->addErrorMessage($e->getMessage());
- }
- }
- return $this;
- }
- /**
- * Assign user to role
- *
- * @param int $userId
- * @param int $roleId
- * @return bool
- * @throws LocalizedException
- */
- protected function _addUserToRole($userId, $roleId)
- {
- $user = $this->_userFactory->create()->load($userId);
- $user->setRoleId($roleId);
- if ($user->roleUserExists() === true) {
- return false;
- } else {
- $user->save();
- return true;
- }
- }
- /**
- * Remove user from role
- *
- * @param int $userId
- * @param int $roleId
- * @return bool
- * @throws \Exception
- */
- protected function _deleteUserFromRole($userId, $roleId)
- {
- try {
- $this->_userFactory->create()->setRoleId($roleId)->setUserId($userId)->deleteFromRole();
- } catch (\Exception $e) {
- throw $e;
- }
- return true;
- }
- /**
- * Save data to session and redirect
- *
- * @param \Magento\Authorization\Model\Role $role
- * @param array $data
- * @param \Magento\Backend\Model\View\Result\Redirect $resultRedirect
- * @return \Magento\Backend\Model\View\Result\Redirect
- */
- protected function saveDataToSessionAndRedirect($role, $data, $resultRedirect)
- {
- $this->_getSession()->setData(self::ROLE_EDIT_FORM_DATA_SESSION_KEY, ['rolename' => $data['rolename']]);
- $this->_getSession()->setData(self::IN_ROLE_USER_FORM_DATA_SESSION_KEY, $data['in_role_user']);
- $this->_getSession()->setData(self::IN_ROLE_OLD_USER_FORM_DATA_SESSION_KEY, $data['in_role_user_old']);
- if ($data['all']) {
- $this->_getSession()->setData(self::RESOURCE_ALL_FORM_DATA_SESSION_KEY, $data['all']);
- } else {
- $resource = isset($data['resource']) ? $data['resource'] : [];
- $this->_getSession()->setData(self::RESOURCE_FORM_DATA_SESSION_KEY, $resource);
- }
- $arguments = $role->getId() ? ['rid' => $role->getId()] : [];
- return $resultRedirect->setPath('*/*/editrole', $arguments);
- }
- }
|