From 9d1ae3f15a920b43edd7509860e7ee283ea43439 Mon Sep 17 00:00:00 2001 From: YevhenBondarenko Date: Tue, 27 Sep 2022 11:34:01 +0200 Subject: [PATCH 1/3] email pattern improvements --- .../java/org/thingsboard/server/dao/service/DataValidator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java b/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java index 9bf729ad25..28223f3e7f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java +++ b/dao/src/main/java/org/thingsboard/server/dao/service/DataValidator.java @@ -35,7 +35,7 @@ import java.util.regex.Pattern; @Slf4j public abstract class DataValidator> { private static final Pattern EMAIL_PATTERN = - Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$", Pattern.CASE_INSENSITIVE); + Pattern.compile("^[A-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$", Pattern.CASE_INSENSITIVE); private static final Pattern QUEUE_PATTERN = Pattern.compile("^[a-zA-Z0-9_.\\-]+$"); From 7d19a1d5e9150f84923990b6149dbf7176e085f0 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Tue, 27 Sep 2022 16:12:01 +0300 Subject: [PATCH 2/3] Update assetCreatedMsg and alarmActionMsg to handle rule chain and queue name from asset profile --- .../actors/ruleChain/DefaultTbContext.java | 32 +++++++++++++++++-- .../rule/engine/api/TbContext.java | 4 +++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java b/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java index b6c400685c..afff955bbb 100644 --- a/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java +++ b/application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java @@ -43,6 +43,8 @@ import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.TenantProfile; import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.asset.Asset; +import org.thingsboard.server.common.data.asset.AssetProfile; +import org.thingsboard.server.common.data.id.AssetId; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.EdgeId; @@ -328,7 +330,7 @@ class DefaultTbContext implements TbContext { public TbMsg deviceCreatedMsg(Device device, RuleNodeId ruleNodeId) { RuleChainId ruleChainId = null; - String queueName = null; + String queueName = null; if (device.getDeviceProfileId() != null) { DeviceProfile deviceProfile = mainCtx.getDeviceProfileCache().find(device.getDeviceProfileId()); if (deviceProfile == null) { @@ -342,7 +344,18 @@ class DefaultTbContext implements TbContext { } public TbMsg assetCreatedMsg(Asset asset, RuleNodeId ruleNodeId) { - return entityActionMsg(asset, asset.getId(), ruleNodeId, DataConstants.ENTITY_CREATED); + RuleChainId ruleChainId = null; + String queueName = null; + if (asset.getAssetProfileId() != null) { + AssetProfile assetProfile = mainCtx.getAssetProfileCache().find(asset.getAssetProfileId()); + if (assetProfile == null) { + log.warn("[{}] Asset profile is null!", asset.getAssetProfileId()); + } else { + ruleChainId = assetProfile.getDefaultRuleChainId(); + queueName = assetProfile.getDefaultQueueName(); + } + } + return entityActionMsg(asset, asset.getId(), ruleNodeId, DataConstants.ENTITY_CREATED, queueName, ruleChainId); } public TbMsg alarmActionMsg(Alarm alarm, RuleNodeId ruleNodeId, String action) { @@ -357,6 +370,15 @@ class DefaultTbContext implements TbContext { ruleChainId = deviceProfile.getDefaultRuleChainId(); queueName = deviceProfile.getDefaultQueueName(); } + } else if (EntityType.ASSET.equals(alarm.getOriginator().getEntityType())) { + AssetId assetId = new AssetId(alarm.getOriginator().getId()); + AssetProfile assetProfile = mainCtx.getAssetProfileCache().get(getTenantId(), assetId); + if (assetProfile == null) { + log.warn("[{}] Asset profile is null!", assetId); + } else { + ruleChainId = assetProfile.getDefaultRuleChainId(); + queueName = assetProfile.getDefaultQueueName(); + } } return entityActionMsg(alarm, alarm.getId(), ruleNodeId, action, queueName, ruleChainId); } @@ -653,9 +675,15 @@ class DefaultTbContext implements TbContext { mainCtx.getDeviceProfileCache().addListener(getTenantId(), getSelfId(), profileListener, deviceListener); } + @Override + public void addAssetProfileListeners(Consumer profileListener, BiConsumer assetListener) { + mainCtx.getAssetProfileCache().addListener(getTenantId(), getSelfId(), profileListener, assetListener); + } + @Override public void removeListeners() { mainCtx.getDeviceProfileCache().removeListener(getTenantId(), getSelfId()); + mainCtx.getAssetProfileCache().removeListener(getTenantId(), getSelfId()); mainCtx.getTenantProfileCache().removeListener(getTenantId(), getSelfId()); } diff --git a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java b/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java index 2feaf3fd49..c9c2bdc424 100644 --- a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java +++ b/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/TbContext.java @@ -25,6 +25,8 @@ import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.TenantProfile; import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.asset.Asset; +import org.thingsboard.server.common.data.asset.AssetProfile; +import org.thingsboard.server.common.data.id.AssetId; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.EdgeId; @@ -288,6 +290,8 @@ public interface TbContext { void addDeviceProfileListeners(Consumer listener, BiConsumer deviceListener); + void addAssetProfileListeners(Consumer listener, BiConsumer assetListener); + void removeListeners(); TenantProfile getTenantProfile(); From 885376e97fa8c3debd5e4e5645f5faf4224802c7 Mon Sep 17 00:00:00 2001 From: YevhenBondarenko Date: Tue, 27 Sep 2022 15:22:03 +0200 Subject: [PATCH 3/3] added email validation test --- .../server/dao/service/DataValidatorTest.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java new file mode 100644 index 0000000000..c64b418fa0 --- /dev/null +++ b/dao/src/test/java/org/thingsboard/server/dao/service/DataValidatorTest.java @@ -0,0 +1,63 @@ +/** + * Copyright © 2016-2022 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.dao.service; + +import org.junit.Test; +import org.thingsboard.server.dao.exception.DataValidationException; + +public class DataValidatorTest { + + @Test + public void validateEmail() { + String email = "aZ1_!#$%&'*+/=?`{|}~^.-@mail.io"; + DataValidator.validateEmail(email); + } + + @Test(expected = DataValidationException.class) + public void validateInvalidEmail1() { + String email = "test:1@mail.io"; + DataValidator.validateEmail(email); + } + @Test(expected = DataValidationException.class) + public void validateInvalidEmail2() { + String email = "test()1@mail.io"; + DataValidator.validateEmail(email); + } + + @Test(expected = DataValidationException.class) + public void validateInvalidEmail3() { + String email = "test[]1@mail.io"; + DataValidator.validateEmail(email); + } + + @Test(expected = DataValidationException.class) + public void validateInvalidEmail4() { + String email = "test\\1@mail.io"; + DataValidator.validateEmail(email); + } + + @Test(expected = DataValidationException.class) + public void validateInvalidEmail5() { + String email = "test\"1@mail.io"; + DataValidator.validateEmail(email); + } + + @Test(expected = DataValidationException.class) + public void validateInvalidEmail6() { + String email = "test<>1@mail.io"; + DataValidator.validateEmail(email); + } +} \ No newline at end of file