Commit 0fff85121052c4b38fe1d01cc3b0d850062b87b9

Authored by Andrii Shvaika
1 parent 986cfe5c

Alarm Query fix for propagated alarms with entities assigned to customer

@@ -130,7 +130,6 @@ public class DefaultAlarmQueryRepository implements AlarmQueryRepository { @@ -130,7 +130,6 @@ public class DefaultAlarmQueryRepository implements AlarmQueryRepository {
130 AlarmDataPageLink pageLink = query.getPageLink(); 130 AlarmDataPageLink pageLink = query.getPageLink();
131 QueryContext ctx = new QueryContext(new QuerySecurityContext(tenantId, customerId, EntityType.ALARM)); 131 QueryContext ctx = new QueryContext(new QuerySecurityContext(tenantId, customerId, EntityType.ALARM));
132 ctx.addUuidListParameter("entity_ids", orderedEntityIds.stream().map(EntityId::getId).collect(Collectors.toList())); 132 ctx.addUuidListParameter("entity_ids", orderedEntityIds.stream().map(EntityId::getId).collect(Collectors.toList()));
133 -  
134 StringBuilder selectPart = new StringBuilder(FIELDS_SELECTION); 133 StringBuilder selectPart = new StringBuilder(FIELDS_SELECTION);
135 StringBuilder fromPart = new StringBuilder(" from alarm a "); 134 StringBuilder fromPart = new StringBuilder(" from alarm a ");
136 StringBuilder wherePart = new StringBuilder(" where "); 135 StringBuilder wherePart = new StringBuilder(" where ");
@@ -282,24 +281,27 @@ public class DefaultAlarmQueryRepository implements AlarmQueryRepository { @@ -282,24 +281,27 @@ public class DefaultAlarmQueryRepository implements AlarmQueryRepository {
282 StringBuilder permissionsQuery = new StringBuilder(); 281 StringBuilder permissionsQuery = new StringBuilder();
283 ctx.addUuidParameter("permissions_tenant_id", tenantId.getId()); 282 ctx.addUuidParameter("permissions_tenant_id", tenantId.getId());
284 permissionsQuery.append(" a.tenant_id = :permissions_tenant_id "); 283 permissionsQuery.append(" a.tenant_id = :permissions_tenant_id ");
285 - if (customerId != null && !customerId.isNullUid()) {  
286 - ctx.addUuidParameter("permissions_customer_id", customerId.getId());  
287 - ctx.addUuidParameter("permissions_device_customer_id", customerId.getId());  
288 - ctx.addUuidParameter("permissions_asset_customer_id", customerId.getId());  
289 - ctx.addUuidParameter("permissions_user_customer_id", customerId.getId());  
290 - ctx.addUuidParameter("permissions_entity_view_customer_id", customerId.getId());  
291 - permissionsQuery.append(" and (");  
292 - permissionsQuery.append("(a.originator_type = '").append(EntityType.DEVICE.ordinal()).append("' and exists (select 1 from device cd where cd.id = a.originator_id and cd.customer_id = :permissions_device_customer_id))");  
293 - permissionsQuery.append(" or ");  
294 - permissionsQuery.append("(a.originator_type = '").append(EntityType.ASSET.ordinal()).append("' and exists (select 1 from asset ca where ca.id = a.originator_id and ca.customer_id = :permissions_device_customer_id))");  
295 - permissionsQuery.append(" or ");  
296 - permissionsQuery.append("(a.originator_type = '").append(EntityType.CUSTOMER.ordinal()).append("' and exists (select 1 from customer cc where cc.id = a.originator_id and cc.id = :permissions_customer_id))");  
297 - permissionsQuery.append(" or ");  
298 - permissionsQuery.append("(a.originator_type = '").append(EntityType.USER.ordinal()).append("' and exists (select 1 from tb_user cu where cu.id = a.originator_id and cu.customer_id = :permissions_user_customer_id))");  
299 - permissionsQuery.append(" or ");  
300 - permissionsQuery.append("(a.originator_type = '").append(EntityType.ENTITY_VIEW.ordinal()).append("' and exists (select 1 from entity_view cv where cv.id = a.originator_id and cv.customer_id = :permissions_entity_view_customer_id))");  
301 - permissionsQuery.append(")");  
302 - } 284 +/*
  285 + No need to check the customer id, because we already use entity id list that passed security check when we were evaluating the data query.
  286 + */
  287 +// if (customerId != null && !customerId.isNullUid()) {
  288 +// ctx.addUuidParameter("permissions_customer_id", customerId.getId());
  289 +// ctx.addUuidParameter("permissions_device_customer_id", customerId.getId());
  290 +// ctx.addUuidParameter("permissions_asset_customer_id", customerId.getId());
  291 +// ctx.addUuidParameter("permissions_user_customer_id", customerId.getId());
  292 +// ctx.addUuidParameter("permissions_entity_view_customer_id", customerId.getId());
  293 +// permissionsQuery.append(" and (");
  294 +// permissionsQuery.append("(a.originator_type = '").append(EntityType.DEVICE.ordinal()).append("' and exists (select 1 from device cd where cd.id = a.originator_id and cd.customer_id = :permissions_device_customer_id))");
  295 +// permissionsQuery.append(" or ");
  296 +// permissionsQuery.append("(a.originator_type = '").append(EntityType.ASSET.ordinal()).append("' and exists (select 1 from asset ca where ca.id = a.originator_id and ca.customer_id = :permissions_device_customer_id))");
  297 +// permissionsQuery.append(" or ");
  298 +// permissionsQuery.append("(a.originator_type = '").append(EntityType.CUSTOMER.ordinal()).append("' and exists (select 1 from customer cc where cc.id = a.originator_id and cc.id = :permissions_customer_id))");
  299 +// permissionsQuery.append(" or ");
  300 +// permissionsQuery.append("(a.originator_type = '").append(EntityType.USER.ordinal()).append("' and exists (select 1 from tb_user cu where cu.id = a.originator_id and cu.customer_id = :permissions_user_customer_id))");
  301 +// permissionsQuery.append(" or ");
  302 +// permissionsQuery.append("(a.originator_type = '").append(EntityType.ENTITY_VIEW.ordinal()).append("' and exists (select 1 from entity_view cv where cv.id = a.originator_id and cv.customer_id = :permissions_entity_view_customer_id))");
  303 +// permissionsQuery.append(")");
  304 +// }
303 return permissionsQuery.toString(); 305 return permissionsQuery.toString();
304 } 306 }
305 307
@@ -32,9 +32,9 @@ public class DefaultQueryLogComponent implements QueryLogComponent { @@ -32,9 +32,9 @@ public class DefaultQueryLogComponent implements QueryLogComponent {
32 32
33 @Override 33 @Override
34 public void logQuery(QueryContext ctx, String query, long duration) { 34 public void logQuery(QueryContext ctx, String query, long duration) {
35 - if (logSqlQueries && duration > logQueriesThreshold) { 35 +// if (logSqlQueries && duration > logQueriesThreshold) {
36 log.info("QUERY: {} took {}ms", query, duration); 36 log.info("QUERY: {} took {}ms", query, duration);
37 Arrays.asList(ctx.getParameterNames()).forEach(param -> log.info("QUERY PARAM: {} -> {}", param, ctx.getValue(param))); 37 Arrays.asList(ctx.getParameterNames()).forEach(param -> log.info("QUERY PARAM: {} -> {}", param, ctx.getValue(param)));
38 - } 38 +// }
39 } 39 }
40 } 40 }
@@ -123,8 +123,10 @@ class AlarmState { @@ -123,8 +123,10 @@ class AlarmState {
123 } 123 }
124 124
125 public boolean clearAlarmState(boolean stateUpdate, AlarmRuleState state) { 125 public boolean clearAlarmState(boolean stateUpdate, AlarmRuleState state) {
126 - state.clear();  
127 - stateUpdate |= state.checkUpdate(); 126 + if (state != null) {
  127 + state.clear();
  128 + stateUpdate |= state.checkUpdate();
  129 + }
128 return stateUpdate; 130 return stateUpdate;
129 } 131 }
130 132