From b8b27ec3f2a036e1db965468d1b96ace8c23d92f Mon Sep 17 00:00:00 2001 From: Andrew Shvayka Date: Wed, 7 Jun 2017 19:19:43 +0300 Subject: [PATCH 1/2] Extra logging and gateway fix --- .../server/extensions/api/device/DeviceAttributes.java | 9 +++++++++ .../action/template/AbstractTemplatePluginAction.java | 3 +++ .../server/extensions/kafka/plugin/KafkaMsgHandler.java | 4 +++- .../server/transport/mqtt/session/GatewaySessionCtx.java | 1 + 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceAttributes.java b/extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceAttributes.java index 8628d0c16c..2cfeefb19e 100644 --- a/extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceAttributes.java +++ b/extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceAttributes.java @@ -91,4 +91,13 @@ public class DeviceAttributes { } return map; } + + @Override + public String toString() { + return "DeviceAttributes{" + + "clientSideAttributesMap=" + clientSideAttributesMap + + ", serverPrivateAttributesMap=" + serverPrivateAttributesMap + + ", serverPublicAttributesMap=" + serverPublicAttributesMap + + '}'; + } } diff --git a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/action/template/AbstractTemplatePluginAction.java b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/action/template/AbstractTemplatePluginAction.java index 9360af17ac..12958f5a3e 100644 --- a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/action/template/AbstractTemplatePluginAction.java +++ b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/action/template/AbstractTemplatePluginAction.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.extensions.core.action.template; +import lombok.extern.slf4j.Slf4j; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.runtime.parser.ParseException; @@ -35,6 +36,7 @@ import java.util.Optional; /** * @author Andrew Shvayka */ +@Slf4j public abstract class AbstractTemplatePluginAction extends SimpleRuleLifecycleComponent implements PluginAction { protected T configuration; protected Template template; @@ -69,6 +71,7 @@ public abstract class AbstractTemplatePluginAction producer; @@ -40,7 +42,7 @@ public class KafkaMsgHandler implements RuleMsgHandler { throw new RuleException("Unsupported message type " + msg.getClass().getName() + "!"); } KafkaActionPayload payload = ((KafkaActionMsg) msg).getPayload(); - + log.debug("Processing kafka payload: {}", payload); try { producer.send(new ProducerRecord<>(payload.getTopic(), payload.getMsgBody()), (metadata, e) -> { diff --git a/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/GatewaySessionCtx.java b/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/GatewaySessionCtx.java index a78319afd9..d6a953a1f9 100644 --- a/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/GatewaySessionCtx.java +++ b/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/GatewaySessionCtx.java @@ -78,6 +78,7 @@ public class GatewaySessionCtx { Device newDevice = new Device(); newDevice.setTenantId(gateway.getTenantId()); newDevice.setName(deviceName); + newDevice.setType("default"); return deviceService.saveDevice(newDevice); }); GatewayDeviceSessionCtx ctx = new GatewayDeviceSessionCtx(this, device); From 1b469df40c801a1df9c10ed159ca6ef484051e25 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Thu, 8 Jun 2017 12:20:41 +0300 Subject: [PATCH 2/2] Fix permissions for Rules and Plugins details --- .../plugin/PluginProcessingContext.java | 28 +++++++++++++++++-- .../attribute/attribute-table.directive.js | 12 +++++--- ui/src/app/locale/locale.constant.js | 2 +- ui/src/app/plugin/plugin.controller.js | 2 ++ ui/src/app/plugin/plugins.tpl.html | 10 +++---- ui/src/app/rule/rule.controller.js | 2 ++ ui/src/app/rule/rules.tpl.html | 10 +++---- 7 files changed, 49 insertions(+), 17 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/actors/plugin/PluginProcessingContext.java b/application/src/main/java/org/thingsboard/server/actors/plugin/PluginProcessingContext.java index 5dbc5f4244..57a838f471 100644 --- a/application/src/main/java/org/thingsboard/server/actors/plugin/PluginProcessingContext.java +++ b/application/src/main/java/org/thingsboard/server/actors/plugin/PluginProcessingContext.java @@ -326,7 +326,19 @@ public final class PluginProcessingContext implements PluginContext { callback.onSuccess(this, Boolean.FALSE); } else { ListenableFuture ruleFuture = pluginCtx.ruleService.findRuleByIdAsync(new RuleId(entityId.getId())); - Futures.addCallback(ruleFuture, getCallback(callback, rule -> rule != null && rule.getTenantId().equals(ctx.getTenantId()))); + Futures.addCallback(ruleFuture, getCallback(callback, rule -> { + if (rule == null) { + return Boolean.FALSE; + } else { + if (ctx.isTenantAdmin() && !rule.getTenantId().equals(ctx.getTenantId())) { + return Boolean.FALSE; + } else if (ctx.isSystemAdmin() && !rule.getTenantId().isNullUid()) { + return Boolean.FALSE; + } else { + return Boolean.TRUE; + } + } + })); } return; case PLUGIN: @@ -334,7 +346,19 @@ public final class PluginProcessingContext implements PluginContext { callback.onSuccess(this, Boolean.FALSE); } else { ListenableFuture pluginFuture = pluginCtx.pluginService.findPluginByIdAsync(new PluginId(entityId.getId())); - Futures.addCallback(pluginFuture, getCallback(callback, plugin -> plugin != null && plugin.getTenantId().equals(ctx.getTenantId()))); + Futures.addCallback(pluginFuture, getCallback(callback, plugin -> { + if (plugin == null) { + return Boolean.FALSE; + } else { + if (ctx.isTenantAdmin() && !plugin.getTenantId().equals(ctx.getTenantId())) { + return Boolean.FALSE; + } else if (ctx.isSystemAdmin() && !plugin.getTenantId().isNullUid()) { + return Boolean.FALSE; + } else { + return Boolean.TRUE; + } + } + })); } return; case CUSTOMER: diff --git a/ui/src/app/entity/attribute/attribute-table.directive.js b/ui/src/app/entity/attribute/attribute-table.directive.js index e05fcb64af..da7697d5d1 100644 --- a/ui/src/app/entity/attribute/attribute-table.directive.js +++ b/ui/src/app/entity/attribute/attribute-table.directive.js @@ -51,7 +51,6 @@ export default function AttributeTableDirective($compile, $templateCache, $rootS scope.types = types; scope.entityType = attrs.entityType; - scope.attributeScope = getAttributeScopeByValue(attrs.defaultAttributeScope); if (scope.entityType === types.entityType.device) { scope.attributeScopes = types.attributesScope; @@ -60,8 +59,13 @@ export default function AttributeTableDirective($compile, $templateCache, $rootS scope.attributeScopes = {}; scope.attributeScopes.server = types.attributesScope.server; scope.attributeScopeSelectionReadonly = true; + } + + scope.attributeScope = getAttributeScopeByValue(attrs.defaultAttributeScope); + + if (scope.entityType != types.entityType.device) { if (scope.attributeScope != types.latestTelemetry) { - scope.attributeScope = scope.attributeScopes.server.value; + scope.attributeScope = scope.attributeScopes.server; } } @@ -81,8 +85,8 @@ export default function AttributeTableDirective($compile, $templateCache, $rootS search: null }; - scope.$watch("entityId", function(newVal, prevVal) { - if (newVal && !angular.equals(newVal, prevVal)) { + scope.$watch("entityId", function(newVal) { + if (newVal) { scope.resetFilter(); scope.getEntityAttributes(false, true); } diff --git a/ui/src/app/locale/locale.constant.js b/ui/src/app/locale/locale.constant.js index fcde13c9a4..6bc6e7e894 100644 --- a/ui/src/app/locale/locale.constant.js +++ b/ui/src/app/locale/locale.constant.js @@ -171,7 +171,7 @@ export default angular.module('thingsboard.locale', []) "attribute": { "attributes": "Attributes", "latest-telemetry": "Latest telemetry", - "attributes-scope": "Device attributes scope", + "attributes-scope": "Entity attributes scope", "scope-latest-telemetry": "Latest telemetry", "scope-client": "Client attributes", "scope-server": "Server attributes", diff --git a/ui/src/app/plugin/plugin.controller.js b/ui/src/app/plugin/plugin.controller.js index b250f61b4a..c83dc38add 100644 --- a/ui/src/app/plugin/plugin.controller.js +++ b/ui/src/app/plugin/plugin.controller.js @@ -138,6 +138,8 @@ export default function PluginController(pluginService, userService, importExpor vm.pluginGridConfig.topIndex = $stateParams.topIndex; } + vm.isPluginEditable = isPluginEditable; + vm.activatePlugin = activatePlugin; vm.suspendPlugin = suspendPlugin; vm.exportPlugin = exportPlugin; diff --git a/ui/src/app/plugin/plugins.tpl.html b/ui/src/app/plugin/plugins.tpl.html index d04ebcbea5..5b03506e40 100644 --- a/ui/src/app/plugin/plugins.tpl.html +++ b/ui/src/app/plugin/plugins.tpl.html @@ -19,7 +19,7 @@
- - + - + - + - + diff --git a/ui/src/app/rule/rule.controller.js b/ui/src/app/rule/rule.controller.js index 3cff981f2d..9cc90cff92 100644 --- a/ui/src/app/rule/rule.controller.js +++ b/ui/src/app/rule/rule.controller.js @@ -134,6 +134,8 @@ export default function RuleController(ruleService, userService, importExport, $ vm.ruleGridConfig.topIndex = $stateParams.topIndex; } + vm.isRuleEditable = isRuleEditable; + vm.activateRule = activateRule; vm.suspendRule = suspendRule; vm.exportRule = exportRule; diff --git a/ui/src/app/rule/rules.tpl.html b/ui/src/app/rule/rules.tpl.html index 16097ccd77..098bbee7fb 100644 --- a/ui/src/app/rule/rules.tpl.html +++ b/ui/src/app/rule/rules.tpl.html @@ -19,7 +19,7 @@
- - + - + - + - +