*/ class AccessChecker implements AccessEntityCREDChecker { use DefaultAccessCheckerDependency; private $aclManager; private $entityManager; public function __construct( DefaultAccessChecker $defaultAccessChecker, AclManager $aclManager, EntityManager $entityManager ) { $this->defaultAccessChecker = $defaultAccessChecker; $this->aclManager = $aclManager; $this->entityManager = $entityManager; } public function checkEntityRead(User $user, Entity $entity, ScopeData $data): bool { /** @var Attachment $entity */ if ($entity->get('parentType') === 'Settings') { // Allow the logo. return true; } $parent = null; $parentType = $entity->get('parentType'); $parentId = $entity->get('parentId'); $relatedType = $entity->get('relatedType'); $relatedId = $entity->get('relatedId'); if ($parentId && $parentType) { $parent = $this->entityManager->getEntityById($parentType, $parentId); } else if ($relatedId && $relatedType) { $parent = $this->entityManager->getEntityById($relatedType, $relatedId); } if (!$parent) { if ($this->defaultAccessChecker->checkEntityRead($user, $entity, $data)) { return true; } return false; } if ($parent->getEntityType() === 'Note') { /** @var Note $parent */ $result = $this->checkEntityReadNoteParent($user, $parent); if ($result !== null) { return $result; } } else if ($this->aclManager->checkEntity($user, $parent)) { if ( $entity->getTargetField() && in_array( $entity->getTargetField(), $this->aclManager->getScopeForbiddenFieldList($user, $parent->getEntityType()) ) ) { return false; } return true; } if ($this->defaultAccessChecker->checkEntityRead($user, $entity, $data)) { return true; } return false; } private function checkEntityReadNoteParent(User $user, Note $note): ?bool { if ($note->getTargetType() === Note::TARGET_TEAMS) { $intersect = array_intersect( $note->getLinkMultipleIdList('teams') ?? [], $user->getLinkMultipleIdList('teams') ?? [] ); if (count($intersect)) { return true; } return null; } if ($note->getTargetType() === Note::TARGET_USERS) { $isRelated = $this->entityManager ->getRDBRepository('Note') ->getRelation($note, 'users') ->isRelated($user); if ($isRelated) { return true; } return null; } if (!$note->getParentId() || !$note->getParentType()) { return null; } $parent = $this->entityManager->getEntity($note->getParentType(), $note->getParentId()); if ($parent && $this->aclManager->checkEntity($user, $parent)) { return true; } return null; } }