From f63864f06ecfc4a871ad6cfc754c7e452133b2a3 Mon Sep 17 00:00:00 2001 From: VoBa Date: Wed, 1 Apr 2020 09:41:23 +0300 Subject: [PATCH] Filter relation by To and From entities (#2567) * Filter relation by To and From entities * Rename typo --- .../controller/EntityRelationController.java | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/EntityRelationController.java b/application/src/main/java/org/thingsboard/server/controller/EntityRelationController.java index ea87f86781..8058cca685 100644 --- a/application/src/main/java/org/thingsboard/server/controller/EntityRelationController.java +++ b/application/src/main/java/org/thingsboard/server/controller/EntityRelationController.java @@ -24,13 +24,11 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; -import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.audit.ActionType; import org.thingsboard.server.common.data.exception.ThingsboardErrorCode; import org.thingsboard.server.common.data.exception.ThingsboardException; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityIdFactory; -import org.thingsboard.server.common.data.id.UUIDBased; import org.thingsboard.server.common.data.relation.EntityRelation; import org.thingsboard.server.common.data.relation.EntityRelationInfo; import org.thingsboard.server.common.data.relation.EntityRelationsQuery; @@ -38,6 +36,7 @@ import org.thingsboard.server.common.data.relation.RelationTypeGroup; import org.thingsboard.server.service.security.permission.Operation; import java.util.List; +import java.util.stream.Collectors; @RestController @@ -167,7 +166,7 @@ public class EntityRelationController extends BaseController { checkEntityId(entityId, Operation.READ); RelationTypeGroup typeGroup = parseRelationTypeGroup(strRelationTypeGroup, RelationTypeGroup.COMMON); try { - return checkNotNull(relationService.findByFrom(getTenantId(), entityId, typeGroup)); + return checkNotNull(filterRelationsByReadPermission(relationService.findByFrom(getTenantId(), entityId, typeGroup))); } catch (Exception e) { throw handleException(e); } @@ -185,7 +184,7 @@ public class EntityRelationController extends BaseController { checkEntityId(entityId, Operation.READ); RelationTypeGroup typeGroup = parseRelationTypeGroup(strRelationTypeGroup, RelationTypeGroup.COMMON); try { - return checkNotNull(relationService.findInfoByFrom(getTenantId(), entityId, typeGroup).get()); + return checkNotNull(filterRelationsByReadPermission(relationService.findInfoByFrom(getTenantId(), entityId, typeGroup).get())); } catch (Exception e) { throw handleException(e); } @@ -205,7 +204,7 @@ public class EntityRelationController extends BaseController { checkEntityId(entityId, Operation.READ); RelationTypeGroup typeGroup = parseRelationTypeGroup(strRelationTypeGroup, RelationTypeGroup.COMMON); try { - return checkNotNull(relationService.findByFromAndType(getTenantId(), entityId, strRelationType, typeGroup)); + return checkNotNull(filterRelationsByReadPermission(relationService.findByFromAndType(getTenantId(), entityId, strRelationType, typeGroup))); } catch (Exception e) { throw handleException(e); } @@ -223,7 +222,7 @@ public class EntityRelationController extends BaseController { checkEntityId(entityId, Operation.READ); RelationTypeGroup typeGroup = parseRelationTypeGroup(strRelationTypeGroup, RelationTypeGroup.COMMON); try { - return checkNotNull(relationService.findByTo(getTenantId(), entityId, typeGroup)); + return checkNotNull(filterRelationsByReadPermission(relationService.findByTo(getTenantId(), entityId, typeGroup))); } catch (Exception e) { throw handleException(e); } @@ -241,7 +240,7 @@ public class EntityRelationController extends BaseController { checkEntityId(entityId, Operation.READ); RelationTypeGroup typeGroup = parseRelationTypeGroup(strRelationTypeGroup, RelationTypeGroup.COMMON); try { - return checkNotNull(relationService.findInfoByTo(getTenantId(), entityId, typeGroup).get()); + return checkNotNull(filterRelationsByReadPermission(relationService.findInfoByTo(getTenantId(), entityId, typeGroup).get())); } catch (Exception e) { throw handleException(e); } @@ -261,7 +260,7 @@ public class EntityRelationController extends BaseController { checkEntityId(entityId, Operation.READ); RelationTypeGroup typeGroup = parseRelationTypeGroup(strRelationTypeGroup, RelationTypeGroup.COMMON); try { - return checkNotNull(relationService.findByToAndType(getTenantId(), entityId, strRelationType, typeGroup)); + return checkNotNull(filterRelationsByReadPermission(relationService.findByToAndType(getTenantId(), entityId, strRelationType, typeGroup))); } catch (Exception e) { throw handleException(e); } @@ -276,7 +275,7 @@ public class EntityRelationController extends BaseController { checkNotNull(query.getFilters()); checkEntityId(query.getParameters().getEntityId(), Operation.READ); try { - return checkNotNull(relationService.findByQuery(getTenantId(), query).get()); + return checkNotNull(filterRelationsByReadPermission(relationService.findByQuery(getTenantId(), query).get())); } catch (Exception e) { throw handleException(e); } @@ -291,12 +290,28 @@ public class EntityRelationController extends BaseController { checkNotNull(query.getFilters()); checkEntityId(query.getParameters().getEntityId(), Operation.READ); try { - return checkNotNull(relationService.findInfoByQuery(getTenantId(), query).get()); + return checkNotNull(filterRelationsByReadPermission(relationService.findInfoByQuery(getTenantId(), query).get())); } catch (Exception e) { throw handleException(e); } } + private List filterRelationsByReadPermission(List relationsByQuery) { + return relationsByQuery.stream().filter(relationByQuery -> { + try { + checkEntityId(relationByQuery.getTo(), Operation.READ); + } catch (ThingsboardException e) { + return false; + } + try { + checkEntityId(relationByQuery.getFrom(), Operation.READ); + } catch (ThingsboardException e) { + return false; + } + return true; + }).collect(Collectors.toList()); + } + private RelationTypeGroup parseRelationTypeGroup(String strRelationTypeGroup, RelationTypeGroup defaultValue) { RelationTypeGroup result = defaultValue; if (strRelationTypeGroup != null && strRelationTypeGroup.trim().length() > 0) {