diff --git a/common/util/src/main/java/org/thingsboard/common/util/JacksonUtil.java b/common/util/src/main/java/org/thingsboard/common/util/JacksonUtil.java index 18b7abb67e..5ccfbd1461 100644 --- a/common/util/src/main/java/org/thingsboard/common/util/JacksonUtil.java +++ b/common/util/src/main/java/org/thingsboard/common/util/JacksonUtil.java @@ -23,6 +23,8 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import java.io.IOException; import java.util.Arrays; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; /** * Created by Valerii Sosliuk on 5/12/2017. @@ -118,4 +120,25 @@ public class JacksonUtil { public static JsonNode valueToTree(T value) { return OBJECT_MAPPER.valueToTree(value); } + + public static String validateFieldsToTree(JsonNode nodeCredentialsValue, String[] fields, String delimiter) { + try { + Set msgSet = ConcurrentHashMap.newKeySet(); + for (String field : fields) { + String[] keys = field.split(delimiter); + JsonNode nodeVal = nodeCredentialsValue; + for (String key : keys) { + if (!nodeVal.hasNonNull(key)) { + msgSet.add(keys[keys.length - 1]); + break; + } else { + nodeVal = nodeVal.get(key); + } + } + } + return String.join(", ", msgSet); + } catch (Exception e) { + throw new IllegalArgumentException(e); + } + } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java index 9d0ff83491..1974f970cc 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java @@ -260,14 +260,14 @@ public class DeviceCredentialsServiceImpl extends AbstractEntityService implemen // LwM2MCredentialsValid credentials = JacksonUtil.fromString(deviceCredentials.getCredentialsValue(), LwM2MCredentialsValid.class); JsonNode nodeCredentialsValue = JacksonUtil.toJsonNode(deviceCredentials.getCredentialsValue()); String [] fields = {"client", "bootstrap", "bootstrap:bootstrapServer", "bootstrap:lwm2mServer"}; - String validateMsg = validateNodeCredentials (nodeCredentialsValue, fields); + String validateMsg = JacksonUtil.validateFieldsToTree(nodeCredentialsValue, fields, ":"); if (validateMsg.isEmpty()) { checkClientKey(nodeCredentialsValue.get("client")); checkServerKey(nodeCredentialsValue.get("bootstrap").get("bootstrapServer"), "Client`s by bootstrapServer"); checkServerKey(nodeCredentialsValue.get("bootstrap").get("lwm2mServer"), "Client`s by lwm2mServer"); } else { - throw new DataValidationException(validateMsg); + throw new DataValidationException("Device credentials are missing fields or mandatory value in this fields: " + validateMsg); } } catch (DataValidationException | DecoderException e) { throw new DataValidationException(e.getMessage()); @@ -286,27 +286,6 @@ public class DeviceCredentialsServiceImpl extends AbstractEntityService implemen } } - private String validateNodeCredentials (JsonNode nodeCredentialsValue, String [] fields) { - Set msgSet = ConcurrentHashMap.newKeySet(); - String msg = ""; - for (String field : fields) { - if (field.contains(":")) { - String [] keys = field.split(":"); - if (!nodeCredentialsValue.hasNonNull(keys[0])) { - msgSet.add(keys[1]); - } - else { - if (!nodeCredentialsValue.get(keys[0]).hasNonNull(keys[1])) msgSet.add(keys[1]); - } - } - else { - if (!nodeCredentialsValue.hasNonNull(field)) msgSet.add(field); - } - } - if (msgSet.size() > 0) msg = "Device credentials are missing fields or mandatory value in this fields: " + String.join(", ", msgSet); - return msg; - } - private void checkClientKey (JsonNode node) throws DataValidationException, DecoderException { String modeName = node.get("securityConfigClientMode").asText(); // checks security config