From 2c4bda882f37ed889b6cdb9cd02ac843653a88b1 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Fri, 16 Apr 2021 12:28:18 +0300 Subject: [PATCH] new acl usage --- .../ActionHistoryRecord/OwnershipChecker.php} | 12 ++-- .../Acl/Email/AccessChecker.php} | 50 ++++++------- .../Classes/Acl/Email/OwnershipChecker.php | 72 +++++++++++++++++++ .../metadata/aclDefs/ActionHistoryRecord.json | 3 + .../Resources/metadata/aclDefs/Email.json | 2 + 5 files changed, 105 insertions(+), 34 deletions(-) rename application/Espo/{Acl/ActionHistoryRecord.php => Classes/Acl/ActionHistoryRecord/OwnershipChecker.php} (86%) rename application/Espo/{Acl/Email.php => Classes/Acl/Email/AccessChecker.php} (75%) create mode 100644 application/Espo/Classes/Acl/Email/OwnershipChecker.php create mode 100644 application/Espo/Resources/metadata/aclDefs/ActionHistoryRecord.json diff --git a/application/Espo/Acl/ActionHistoryRecord.php b/application/Espo/Classes/Acl/ActionHistoryRecord/OwnershipChecker.php similarity index 86% rename from application/Espo/Acl/ActionHistoryRecord.php rename to application/Espo/Classes/Acl/ActionHistoryRecord/OwnershipChecker.php index 9b8d0a73c6..d9bf956809 100644 --- a/application/Espo/Acl/ActionHistoryRecord.php +++ b/application/Espo/Classes/Acl/ActionHistoryRecord/OwnershipChecker.php @@ -27,17 +27,19 @@ * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ -namespace Espo\Acl; +namespace Espo\Classes\Acl\ActionHistoryRecord; -use Espo\Entities\User as EntityUser; +use Espo\Entities\User; use Espo\ORM\Entity; -use Espo\Core\Acl\Acl; +use Espo\Core\{ + Acl\OwnershipOwnChecker, +}; -class ActionHistoryRecord extends Acl +class OwnershipChecker implements OwnershipOwnChecker { - public function checkIsOwner(EntityUser $user, Entity $entity) + public function checkOwn(User $user, Entity $entity): bool { return $entity->get('userId') === $user->getId(); } diff --git a/application/Espo/Acl/Email.php b/application/Espo/Classes/Acl/Email/AccessChecker.php similarity index 75% rename from application/Espo/Acl/Email.php rename to application/Espo/Classes/Acl/Email/AccessChecker.php index 5053f2a709..0e0e63fbe5 100644 --- a/application/Espo/Acl/Email.php +++ b/application/Espo/Classes/Acl/Email/AccessChecker.php @@ -27,27 +27,36 @@ * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ -namespace Espo\Acl; +namespace Espo\Classes\Acl\Email; -use Espo\Entities\User as EntityUser; +use Espo\Entities\User; use Espo\ORM\Entity; use Espo\Core\{ - Acl\Acl, - Acl\ScopeData, Acl\Table, + Acl\ScopeData, + Acl\DefaultAccessChecker, + Acl\AccessEntityCREDSChecker, + Acl\Traits\DefaultAccessCheckerDependency, }; -class Email extends Acl +class AccessChecker implements AccessEntityCREDSChecker { - public function checkEntityRead(EntityUser $user, Entity $entity, ScopeData $data): bool + use DefaultAccessCheckerDependency; + + public function __construct(DefaultAccessChecker $defaultAccessChecker) { - if ($this->checkEntity($user, $entity, $data, 'read')) { + $this->defaultAccessChecker = $defaultAccessChecker; + } + + public function checkEntityRead(User $user, Entity $entity, ScopeData $data): bool + { + if ($this->defaultAccessChecker->checkEntityRead($user, $entity, $data)) { return true; } - if (!$data->isFalse()) { + if ($data->isFalse()) { return false; } @@ -61,37 +70,20 @@ class Email extends Acl $userIdList = $entity->get('usersIds'); - if (is_array($userIdList) && in_array($user->id, $userIdList)) { + if (is_array($userIdList) && in_array($user->getId(), $userIdList)) { return true; } return false; } - public function checkIsOwner(EntityUser $user, Entity $entity) - { - if ($user->getId() === $entity->get('assignedUserId')) { - return true; - } - - if ($user->getId() === $entity->get('createdById')) { - return true; - } - - if ($entity->hasLinkMultipleId('assignedUsers', $user->id)) { - return true; - } - - return false; - } - - public function checkEntityDelete(EntityUser $user, Entity $entity, ScopeData $data): bool + public function checkEntityDelete(User $user, Entity $entity, ScopeData $data): bool { if ($user->isAdmin()) { return true; } - if (!$data->isFalse()) { + if ($data->isFalse()) { return false; } @@ -116,7 +108,7 @@ class Email extends Acl return false; } - if ($this->checkEntity($user, $entity, $data, Table::ACTION_DELETE)) { + if ($this->defaultAccessChecker->checkEntityDelete($user, $entity, $data)) { return true; } diff --git a/application/Espo/Classes/Acl/Email/OwnershipChecker.php b/application/Espo/Classes/Acl/Email/OwnershipChecker.php new file mode 100644 index 0000000000..6291232604 --- /dev/null +++ b/application/Espo/Classes/Acl/Email/OwnershipChecker.php @@ -0,0 +1,72 @@ +defaultOwnershipChecker = $defaultOwnershipChecker; + } + + public function checkOwn(User $user, Entity $entity): bool + { + if ($user->getId() === $entity->get('assignedUserId')) { + return true; + } + + if ($user->getId() === $entity->get('createdById')) { + return true; + } + + if ($entity->hasLinkMultipleId('assignedUsers', $user->getId())) { + return true; + } + + return false; + } + + public function checkTeam(User $user, Entity $entity): bool + { + return $this->defaultOwnershipChecker->checkTeam($user, $entity); + } +} diff --git a/application/Espo/Resources/metadata/aclDefs/ActionHistoryRecord.json b/application/Espo/Resources/metadata/aclDefs/ActionHistoryRecord.json new file mode 100644 index 0000000000..a8743aae6b --- /dev/null +++ b/application/Espo/Resources/metadata/aclDefs/ActionHistoryRecord.json @@ -0,0 +1,3 @@ +{ + "ownershipCheckerClassName": "Espo\\Classes\\Acl\\ActionHistoryRecord\\OwnershipChecker" +} \ No newline at end of file diff --git a/application/Espo/Resources/metadata/aclDefs/Email.json b/application/Espo/Resources/metadata/aclDefs/Email.json index 6ae915feee..6c65a967e8 100644 --- a/application/Espo/Resources/metadata/aclDefs/Email.json +++ b/application/Espo/Resources/metadata/aclDefs/Email.json @@ -1,3 +1,5 @@ { + "accessCheckerClassName": "Espo\\Classes\\Acl\\Email\\AccessChecker", + "ownershipCheckerClassName": "Espo\\Classes\\Acl\\Email\\OwnershipChecker", "readOwnerUserField": "users" } \ No newline at end of file