Commit 4cd59674ee3ae844754e38398a5ba048d43b612e

Authored by YevhenBondarenko
Committed by Andrew Shvayka
1 parent 552a1efb

refactored LwM2M client credentials for the new UI

Showing 15 changed files with 163 additions and 98 deletions
... ... @@ -151,7 +151,7 @@ public class AbstractLwM2MIntegrationTest extends AbstractWebsocketTest {
151 151 parameterSpec);
152 152 KeySpec privateKeySpec = new ECPrivateKeySpec(new BigInteger(privateS), parameterSpec);
153 153
154   -// // Get keys
  154 + // Get keys
155 155 serverPublicKey = KeyFactory.getInstance("EC").generatePublic(publicKeySpec);
156 156 serverPrivateKey = KeyFactory.getInstance("EC").generatePrivate(privateKeySpec);
157 157
... ...
... ... @@ -36,7 +36,7 @@ import org.thingsboard.server.service.telemetry.cmd.v2.EntityDataUpdate;
36 36 import org.thingsboard.server.service.telemetry.cmd.v2.LatestValueCmd;
37 37 import org.thingsboard.server.transport.lwm2m.client.LwM2MTestClient;
38 38 import org.thingsboard.server.transport.lwm2m.secure.credentials.LwM2MCredentials;
39   -import org.thingsboard.server.transport.lwm2m.secure.credentials.NoSecClientCredentialsConfig;
  39 +import org.thingsboard.server.common.data.device.credentials.lwm2m.NoSecClientCredentials;
40 40
41 41 import java.util.Collections;
42 42 import java.util.List;
... ... @@ -112,10 +112,10 @@ public class NoSecLwM2MIntegrationTest extends AbstractLwM2MIntegrationTest {
112 112 Assert.assertEquals(device.getId(), deviceCredentials.getDeviceId());
113 113 deviceCredentials.setCredentialsType(DeviceCredentialsType.LWM2M_CREDENTIALS);
114 114
115   - deviceCredentials.setCredentialsId(deviceAEndpoint);
116   -
117 115 LwM2MCredentials noSecCredentials = new LwM2MCredentials();
118   - noSecCredentials.setClient(new NoSecClientCredentialsConfig());
  116 + NoSecClientCredentials clientCredentials = new NoSecClientCredentials();
  117 + clientCredentials.setEndpoint(deviceAEndpoint);
  118 + noSecCredentials.setClient(clientCredentials);
119 119 deviceCredentials.setCredentialsValue(JacksonUtil.toString(noSecCredentials));
120 120 doPost("/api/device/credentials", deviceCredentials).andExpect(status().isOk());
121 121 return device;
... ...
... ... @@ -22,6 +22,7 @@ import org.junit.Assert;
22 22 import org.junit.Test;
23 23 import org.thingsboard.common.util.JacksonUtil;
24 24 import org.thingsboard.server.common.data.Device;
  25 +import org.thingsboard.server.common.data.device.credentials.lwm2m.X509ClientCredentials;
25 26 import org.thingsboard.server.common.data.query.EntityData;
26 27 import org.thingsboard.server.common.data.query.EntityDataPageLink;
27 28 import org.thingsboard.server.common.data.query.EntityDataQuery;
... ... @@ -37,7 +38,6 @@ import org.thingsboard.server.service.telemetry.cmd.v2.EntityDataUpdate;
37 38 import org.thingsboard.server.service.telemetry.cmd.v2.LatestValueCmd;
38 39 import org.thingsboard.server.transport.lwm2m.client.LwM2MTestClient;
39 40 import org.thingsboard.server.transport.lwm2m.secure.credentials.LwM2MCredentials;
40   -import org.thingsboard.server.transport.lwm2m.secure.credentials.X509ClientCredentialsConfig;
41 41
42 42 import java.util.Collections;
43 43 import java.util.List;
... ... @@ -101,7 +101,7 @@ public class X509LwM2MIntegrationTest extends AbstractLwM2MIntegrationTest {
101 101 private final String serverUri = "coaps://localhost:" + port;
102 102
103 103 @NotNull
104   - private Device createDevice(String credentialsId, X509ClientCredentialsConfig credentialsConfig) throws Exception {
  104 + private Device createDevice(X509ClientCredentials clientCredentials) throws Exception {
105 105 Device device = new Device();
106 106 device.setName("Device A");
107 107 device.setDeviceProfileId(deviceProfile.getId());
... ... @@ -114,13 +114,11 @@ public class X509LwM2MIntegrationTest extends AbstractLwM2MIntegrationTest {
114 114 Assert.assertEquals(device.getId(), deviceCredentials.getDeviceId());
115 115 deviceCredentials.setCredentialsType(DeviceCredentialsType.LWM2M_CREDENTIALS);
116 116
117   - deviceCredentials.setCredentialsId(credentialsId);
  117 + LwM2MCredentials credentials = new LwM2MCredentials();
118 118
119   - LwM2MCredentials X509Credentials = new LwM2MCredentials();
  119 + credentials.setClient(clientCredentials);
120 120
121   - X509Credentials.setClient(credentialsConfig);
122   -
123   - deviceCredentials.setCredentialsValue(JacksonUtil.toString(X509Credentials));
  121 + deviceCredentials.setCredentialsValue(JacksonUtil.toString(credentials));
124 122 doPost("/api/device/credentials", deviceCredentials).andExpect(status().isOk());
125 123 return device;
126 124 }
... ... @@ -128,8 +126,9 @@ public class X509LwM2MIntegrationTest extends AbstractLwM2MIntegrationTest {
128 126 @Test
129 127 public void testConnectAndObserveTelemetry() throws Exception {
130 128 createDeviceProfile(TRANSPORT_CONFIGURATION);
131   -
132   - Device device = createDevice(endpoint, new X509ClientCredentialsConfig(null, null));
  129 + X509ClientCredentials credentials = new X509ClientCredentials();
  130 + credentials.setEndpoint(endpoint);
  131 + Device device = createDevice(credentials);
133 132
134 133 SingleEntityFilter sef = new SingleEntityFilter();
135 134 sef.setSingleEntity(device.getId());
... ... @@ -166,7 +165,10 @@ public class X509LwM2MIntegrationTest extends AbstractLwM2MIntegrationTest {
166 165 @Test
167 166 public void testConnectWithCertAndObserveTelemetry() throws Exception {
168 167 createDeviceProfile(TRANSPORT_CONFIGURATION);
169   - Device device = createDevice(null, new X509ClientCredentialsConfig(SslUtil.getCertificateString(clientX509CertNotTrusted), endpoint));
  168 + X509ClientCredentials credentials = new X509ClientCredentials();
  169 + credentials.setEndpoint(endpoint);
  170 + credentials.setCert(SslUtil.getCertificateString(clientX509CertNotTrusted));
  171 + Device device = createDevice(credentials);
170 172
171 173 SingleEntityFilter sef = new SingleEntityFilter();
172 174 sef.setSingleEntity(device.getId());
... ...
common/data/src/main/java/org/thingsboard/server/common/data/device/credentials/lwm2m/AbstractLwM2MClientCredentials.java renamed from common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/credentials/X509ClientCredentialsConfig.java
... ... @@ -13,24 +13,15 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.transport.lwm2m.secure.credentials;
  16 +package org.thingsboard.server.common.data.device.credentials.lwm2m;
17 17
18   -import lombok.AllArgsConstructor;
19   -import lombok.Data;
  18 +import lombok.Getter;
20 19 import lombok.NoArgsConstructor;
21   -import org.eclipse.leshan.core.SecurityMode;
  20 +import lombok.Setter;
22 21
23   -import static org.eclipse.leshan.core.SecurityMode.X509;
24   -
25   -@Data
  22 +@Getter
  23 +@Setter
26 24 @NoArgsConstructor
27   -@AllArgsConstructor
28   -public class X509ClientCredentialsConfig implements LwM2MClientCredentialsConfig {
29   - private String cert;
  25 +public abstract class AbstractLwM2MClientCredentials implements LwM2MClientCredentials {
30 26 private String endpoint;
31   -
32   - @Override
33   - public SecurityMode getSecurityConfigClientMode() {
34   - return X509;
35   - }
36 27 }
... ...
common/data/src/main/java/org/thingsboard/server/common/data/device/credentials/lwm2m/HasKey.java renamed from common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/credentials/HasKey.java
... ... @@ -13,13 +13,15 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.transport.lwm2m.secure.credentials;
  16 +package org.thingsboard.server.common.data.device.credentials.lwm2m;
17 17
18   -import org.eclipse.leshan.core.util.Hex;
  18 +import lombok.SneakyThrows;
  19 +import org.apache.commons.codec.binary.Hex;
19 20
20   -public class HasKey {
  21 +public abstract class HasKey extends AbstractLwM2MClientCredentials {
21 22 private byte[] key;
22 23
  24 + @SneakyThrows
23 25 public void setKey(String key) {
24 26 if (key != null) {
25 27 this.key = Hex.decodeHex(key.toLowerCase().toCharArray());
... ...
common/data/src/main/java/org/thingsboard/server/common/data/device/credentials/lwm2m/LwM2MClientCredentials.java renamed from common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/credentials/LwM2MClientCredentialsConfig.java
... ... @@ -13,25 +13,24 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.transport.lwm2m.secure.credentials;
  16 +package org.thingsboard.server.common.data.device.credentials.lwm2m;
17 17
18 18 import com.fasterxml.jackson.annotation.JsonIgnore;
19   -import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
20 19 import com.fasterxml.jackson.annotation.JsonSubTypes;
21 20 import com.fasterxml.jackson.annotation.JsonTypeInfo;
22   -import org.eclipse.leshan.core.SecurityMode;
23 21
24   -@JsonIgnoreProperties(ignoreUnknown = true)
25 22 @JsonTypeInfo(
26 23 use = JsonTypeInfo.Id.NAME,
27 24 property = "securityConfigClientMode")
28 25 @JsonSubTypes({
29   - @JsonSubTypes.Type(value = NoSecClientCredentialsConfig.class, name = "NO_SEC"),
30   - @JsonSubTypes.Type(value = PSKClientCredentialsConfig.class, name = "PSK"),
31   - @JsonSubTypes.Type(value = RPKClientCredentialsConfig.class, name = "RPK"),
32   - @JsonSubTypes.Type(value = X509ClientCredentialsConfig.class, name = "X509")})
33   -public interface LwM2MClientCredentialsConfig {
  26 + @JsonSubTypes.Type(value = NoSecClientCredentials.class, name = "NO_SEC"),
  27 + @JsonSubTypes.Type(value = PSKClientCredentials.class, name = "PSK"),
  28 + @JsonSubTypes.Type(value = RPKClientCredentials.class, name = "RPK"),
  29 + @JsonSubTypes.Type(value = X509ClientCredentials.class, name = "X509")})
  30 +public interface LwM2MClientCredentials {
34 31
35 32 @JsonIgnore
36   - SecurityMode getSecurityConfigClientMode();
  33 + LwM2MSecurityMode getSecurityConfigClientMode();
  34 +
  35 + String getEndpoint();
37 36 }
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.common.data.device.credentials.lwm2m;
  17 +
  18 +public enum LwM2MSecurityMode {
  19 + PSK, RPK, X509, NO_SEC;
  20 +}
... ...
common/data/src/main/java/org/thingsboard/server/common/data/device/credentials/lwm2m/NoSecClientCredentials.java renamed from common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/credentials/NoSecClientCredentialsConfig.java
... ... @@ -13,16 +13,12 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.transport.lwm2m.secure.credentials;
  16 +package org.thingsboard.server.common.data.device.credentials.lwm2m;
17 17
18   -import org.eclipse.leshan.core.SecurityMode;
19   -
20   -import static org.eclipse.leshan.core.SecurityMode.NO_SEC;
21   -
22   -public class NoSecClientCredentialsConfig implements LwM2MClientCredentialsConfig {
  18 +public class NoSecClientCredentials extends AbstractLwM2MClientCredentials {
23 19
24 20 @Override
25   - public SecurityMode getSecurityConfigClientMode() {
26   - return NO_SEC;
  21 + public LwM2MSecurityMode getSecurityConfigClientMode() {
  22 + return LwM2MSecurityMode.NO_SEC;
27 23 }
28 24 }
... ...
common/data/src/main/java/org/thingsboard/server/common/data/device/credentials/lwm2m/PSKClientCredentials.java renamed from common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/credentials/PSKClientCredentialsConfig.java
... ... @@ -13,20 +13,18 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.transport.lwm2m.secure.credentials;
  16 +package org.thingsboard.server.common.data.device.credentials.lwm2m;
17 17
18   -import lombok.Data;
19   -import org.eclipse.leshan.core.SecurityMode;
  18 +import lombok.Getter;
  19 +import lombok.Setter;
20 20
21   -import static org.eclipse.leshan.core.SecurityMode.PSK;
22   -
23   -@Data
24   -public class PSKClientCredentialsConfig extends HasKey implements LwM2MClientCredentialsConfig {
  21 +@Getter
  22 +@Setter
  23 +public class PSKClientCredentials extends HasKey {
25 24 private String identity;
26   - private String endpoint;
27 25
28 26 @Override
29   - public SecurityMode getSecurityConfigClientMode() {
30   - return PSK;
  27 + public LwM2MSecurityMode getSecurityConfigClientMode() {
  28 + return LwM2MSecurityMode.PSK;
31 29 }
32 30 }
... ...
common/data/src/main/java/org/thingsboard/server/common/data/device/credentials/lwm2m/RPKClientCredentials.java renamed from common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/credentials/RPKClientCredentialsConfig.java
... ... @@ -13,16 +13,12 @@
13 13 * See the License for the specific language governing permissions and
14 14 * limitations under the License.
15 15 */
16   -package org.thingsboard.server.transport.lwm2m.secure.credentials;
  16 +package org.thingsboard.server.common.data.device.credentials.lwm2m;
17 17
18   -import org.eclipse.leshan.core.SecurityMode;
19   -
20   -import static org.eclipse.leshan.core.SecurityMode.RPK;
21   -
22   -public class RPKClientCredentialsConfig extends HasKey implements LwM2MClientCredentialsConfig {
  18 +public class RPKClientCredentials extends HasKey {
23 19
24 20 @Override
25   - public SecurityMode getSecurityConfigClientMode() {
26   - return RPK;
  21 + public LwM2MSecurityMode getSecurityConfigClientMode() {
  22 + return LwM2MSecurityMode.RPK;
27 23 }
28 24 }
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.common.data.device.credentials.lwm2m;
  17 +
  18 +import lombok.Getter;
  19 +import lombok.Setter;
  20 +
  21 +@Getter
  22 +@Setter
  23 +public class X509ClientCredentials extends AbstractLwM2MClientCredentials {
  24 + private String cert;
  25 +
  26 + @Override
  27 + public LwM2MSecurityMode getSecurityConfigClientMode() {
  28 + return LwM2MSecurityMode.X509;
  29 + }
  30 +}
... ...
... ... @@ -17,21 +17,21 @@ package org.thingsboard.server.transport.lwm2m.secure;
17 17
18 18 import lombok.RequiredArgsConstructor;
19 19 import lombok.extern.slf4j.Slf4j;
20   -import org.eclipse.leshan.core.SecurityMode;
21 20 import org.eclipse.leshan.core.util.SecurityUtil;
22 21 import org.eclipse.leshan.server.security.SecurityInfo;
23 22 import org.springframework.stereotype.Component;
24 23 import org.thingsboard.common.util.JacksonUtil;
25 24 import org.thingsboard.server.common.data.StringUtils;
  25 +import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MSecurityMode;
26 26 import org.thingsboard.server.common.transport.TransportServiceCallback;
27 27 import org.thingsboard.server.common.transport.auth.ValidateDeviceCredentialsResponse;
28 28 import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceLwM2MCredentialsRequestMsg;
29 29 import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
30 30 import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
31   -import org.thingsboard.server.transport.lwm2m.secure.credentials.LwM2MClientCredentialsConfig;
  31 +import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MClientCredentials;
32 32 import org.thingsboard.server.transport.lwm2m.secure.credentials.LwM2MCredentials;
33   -import org.thingsboard.server.transport.lwm2m.secure.credentials.PSKClientCredentialsConfig;
34   -import org.thingsboard.server.transport.lwm2m.secure.credentials.RPKClientCredentialsConfig;
  33 +import org.thingsboard.server.common.data.device.credentials.lwm2m.PSKClientCredentials;
  34 +import org.thingsboard.server.common.data.device.credentials.lwm2m.RPKClientCredentials;
35 35 import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportContext;
36 36 import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil;
37 37
... ... @@ -97,8 +97,8 @@ public class LwM2mCredentialsSecurityInfoValidator {
97 97 if (credentials != null) {
98 98 if (keyValue.equals(LwM2mTransportUtil.LwM2mTypeServer.BOOTSTRAP)) {
99 99 result.setBootstrapCredentialConfig(credentials.getBootstrap());
100   - if (SecurityMode.PSK.equals(credentials.getClient().getSecurityConfigClientMode())) {
101   - PSKClientCredentialsConfig pskClientConfig = (PSKClientCredentialsConfig) credentials.getClient();
  100 + if (LwM2MSecurityMode.PSK.equals(credentials.getClient().getSecurityConfigClientMode())) {
  101 + PSKClientCredentials pskClientConfig = (PSKClientCredentials) credentials.getClient();
102 102 endpoint = StringUtils.isNotEmpty(pskClientConfig.getEndpoint()) ? pskClientConfig.getEndpoint() : endpoint;
103 103 }
104 104 result.setEndpoint(endpoint);
... ... @@ -130,8 +130,8 @@ public class LwM2mCredentialsSecurityInfoValidator {
130 130 result.setSecurityMode(NO_SEC);
131 131 }
132 132
133   - private void createClientSecurityInfoPSK(EndpointSecurityInfo result, String endpoint, LwM2MClientCredentialsConfig clientCredentialsConfig) {
134   - PSKClientCredentialsConfig pskConfig = (PSKClientCredentialsConfig) clientCredentialsConfig;
  133 + private void createClientSecurityInfoPSK(EndpointSecurityInfo result, String endpoint, LwM2MClientCredentials clientCredentialsConfig) {
  134 + PSKClientCredentials pskConfig = (PSKClientCredentials) clientCredentialsConfig;
135 135 if (StringUtils.isNotEmpty(pskConfig.getIdentity())) {
136 136 try {
137 137 if (pskConfig.getKey() != null && pskConfig.getKey().length > 0) {
... ... @@ -149,8 +149,8 @@ public class LwM2mCredentialsSecurityInfoValidator {
149 149 }
150 150 }
151 151
152   - private void createClientSecurityInfoRPK(EndpointSecurityInfo result, String endpoint, LwM2MClientCredentialsConfig clientCredentialsConfig) {
153   - RPKClientCredentialsConfig rpkConfig = (RPKClientCredentialsConfig) clientCredentialsConfig;
  152 + private void createClientSecurityInfoRPK(EndpointSecurityInfo result, String endpoint, LwM2MClientCredentials clientCredentialsConfig) {
  153 + RPKClientCredentials rpkConfig = (RPKClientCredentials) clientCredentialsConfig;
154 154 try {
155 155 if (rpkConfig.getKey() != null) {
156 156 PublicKey key = SecurityUtil.publicKey.decode(rpkConfig.getKey());
... ... @@ -164,7 +164,7 @@ public class LwM2mCredentialsSecurityInfoValidator {
164 164 }
165 165 }
166 166
167   - private void createClientSecurityInfoX509(EndpointSecurityInfo result, String endpoint, LwM2MClientCredentialsConfig clientCredentialsConfig) {
  167 + private void createClientSecurityInfoX509(EndpointSecurityInfo result, String endpoint, LwM2MClientCredentials clientCredentialsConfig) {
168 168 result.setSecurityInfo(SecurityInfo.newX509CertInfo(endpoint));
169 169 result.setSecurityMode(X509);
170 170 }
... ...
... ... @@ -15,7 +15,6 @@
15 15 */
16 16 package org.thingsboard.server.transport.lwm2m.secure;
17 17
18   -import com.fasterxml.jackson.databind.JsonNode;
19 18 import lombok.RequiredArgsConstructor;
20 19 import lombok.extern.slf4j.Slf4j;
21 20 import org.eclipse.californium.elements.util.CertPathUtil;
... ... @@ -30,12 +29,12 @@ import org.eclipse.californium.scandium.dtls.HandshakeResultHandler;
30 29 import org.eclipse.californium.scandium.dtls.x509.NewAdvancedCertificateVerifier;
31 30 import org.eclipse.californium.scandium.dtls.x509.StaticCertificateVerifier;
32 31 import org.eclipse.californium.scandium.util.ServerNames;
33   -import org.eclipse.leshan.core.SecurityMode;
34 32 import org.springframework.beans.factory.annotation.Value;
35 33 import org.springframework.stereotype.Component;
36 34 import org.springframework.util.StringUtils;
37 35 import org.thingsboard.common.util.JacksonUtil;
38 36 import org.thingsboard.server.common.data.DeviceProfile;
  37 +import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MSecurityMode;
39 38 import org.thingsboard.server.common.msg.EncryptionUtil;
40 39 import org.thingsboard.server.common.transport.TransportService;
41 40 import org.thingsboard.server.common.transport.TransportServiceCallback;
... ... @@ -44,7 +43,7 @@ import org.thingsboard.server.common.transport.util.SslUtil;
44 43 import org.thingsboard.server.gen.transport.TransportProtos;
45 44 import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
46 45 import org.thingsboard.server.transport.lwm2m.secure.credentials.LwM2MCredentials;
47   -import org.thingsboard.server.transport.lwm2m.secure.credentials.X509ClientCredentialsConfig;
  46 +import org.thingsboard.server.common.data.device.credentials.lwm2m.X509ClientCredentials;
48 47 import org.thingsboard.server.transport.lwm2m.server.store.TbLwM2MDtlsSessionStore;
49 48
50 49 import javax.annotation.PostConstruct;
... ... @@ -140,10 +139,10 @@ public class TbLwM2MDtlsCertificateVerifier implements NewAdvancedCertificateVer
140 139 ValidateDeviceCredentialsResponse msg = deviceCredentialsResponse[0];
141 140 if (msg != null && org.thingsboard.server.common.data.StringUtils.isNotEmpty(msg.getCredentials())) {
142 141 LwM2MCredentials credentials = JacksonUtil.fromString(msg.getCredentials(), LwM2MCredentials.class);
143   - if(!credentials.getClient().getSecurityConfigClientMode().equals(SecurityMode.X509)){
  142 + if(!credentials.getClient().getSecurityConfigClientMode().equals(LwM2MSecurityMode.X509)){
144 143 continue;
145 144 }
146   - X509ClientCredentialsConfig config = (X509ClientCredentialsConfig) credentials.getClient();
  145 + X509ClientCredentials config = (X509ClientCredentials) credentials.getClient();
147 146 String certBody = config.getCert();
148 147 String endpoint = config.getEndpoint();
149 148 if (strCert.equals(certBody)) {
... ...
... ... @@ -16,10 +16,11 @@
16 16 package org.thingsboard.server.transport.lwm2m.secure.credentials;
17 17
18 18 import lombok.Data;
  19 +import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MClientCredentials;
19 20 import org.thingsboard.server.transport.lwm2m.bootstrap.secure.LwM2MBootstrapConfig;
20 21
21 22 @Data
22 23 public class LwM2MCredentials {
23   - private LwM2MClientCredentialsConfig client;
  24 + private LwM2MClientCredentials client;
24 25 private LwM2MBootstrapConfig bootstrap;
25 26 }
... ...
... ... @@ -16,7 +16,6 @@
16 16 package org.thingsboard.server.dao.device;
17 17
18 18
19   -import com.fasterxml.jackson.databind.JsonNode;
20 19 import com.fasterxml.jackson.databind.node.ObjectNode;
21 20 import lombok.extern.slf4j.Slf4j;
22 21 import org.hibernate.exception.ConstraintViolationException;
... ... @@ -28,6 +27,9 @@ import org.springframework.util.StringUtils;
28 27 import org.thingsboard.common.util.JacksonUtil;
29 28 import org.thingsboard.server.common.data.Device;
30 29 import org.thingsboard.server.common.data.device.credentials.BasicMqttCredentials;
  30 +import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MClientCredentials;
  31 +import org.thingsboard.server.common.data.device.credentials.lwm2m.PSKClientCredentials;
  32 +import org.thingsboard.server.common.data.device.credentials.lwm2m.X509ClientCredentials;
31 33 import org.thingsboard.server.common.data.id.DeviceId;
32 34 import org.thingsboard.server.common.data.id.EntityId;
33 35 import org.thingsboard.server.common.data.id.TenantId;
... ... @@ -133,7 +135,6 @@ public class DeviceCredentialsServiceImpl extends AbstractEntityService implemen
133 135 deviceCredentials.setCredentialsValue(JacksonUtil.toString(mqttCredentials));
134 136 }
135 137
136   -
137 138 private void formatCertData(DeviceCredentials deviceCredentials) {
138 139 String cert = EncryptionUtil.trimNewLines(deviceCredentials.getCredentialsValue());
139 140 String sha3Hash = EncryptionUtil.getSha3Hash(cert);
... ... @@ -142,18 +143,48 @@ public class DeviceCredentialsServiceImpl extends AbstractEntityService implemen
142 143 }
143 144
144 145 private void formatSimpleLwm2mCredentials(DeviceCredentials deviceCredentials) {
145   - ObjectNode json = JacksonUtil.fromString(deviceCredentials.getCredentialsValue(), ObjectNode.class);
146   - JsonNode client = json.get("client");
147   - if (client != null && client.get("securityConfigClientMode").asText().equals("X509") && client.has("cert")) {
148   - JsonNode certJson = client.get("cert");
149   - if (!certJson.isNull()) {
150   - String cert = EncryptionUtil.trimNewLines(certJson.asText());
151   - String sha3Hash = EncryptionUtil.getSha3Hash(cert);
152   - deviceCredentials.setCredentialsId(sha3Hash);
153   - ((ObjectNode) client).put("cert", cert);
154   - deviceCredentials.setCredentialsValue(JacksonUtil.toString(json));
  146 + LwM2MClientCredentials clientCredentials;
  147 + ObjectNode json;
  148 + try {
  149 + json = JacksonUtil.fromString(deviceCredentials.getCredentialsValue(), ObjectNode.class);
  150 + if (json == null) {
  151 + throw new IllegalArgumentException();
155 152 }
  153 + clientCredentials = JacksonUtil.convertValue(json.get("client"), LwM2MClientCredentials.class);
  154 + if (clientCredentials == null) {
  155 + throw new IllegalArgumentException();
  156 + }
  157 + } catch (IllegalArgumentException e) {
  158 + throw new DataValidationException("Invalid credentials body for LwM2M credentials!");
  159 + }
  160 +
  161 + String credentialsId;
  162 +
  163 + switch (clientCredentials.getSecurityConfigClientMode()) {
  164 + case NO_SEC:
  165 + case RPK:
  166 + credentialsId = clientCredentials.getEndpoint();
  167 + break;
  168 + case PSK:
  169 + credentialsId = ((PSKClientCredentials) clientCredentials).getIdentity();
  170 + break;
  171 + case X509:
  172 + X509ClientCredentials x509Config = (X509ClientCredentials) clientCredentials;
  173 + if (x509Config.getCert() != null) {
  174 + String cert = EncryptionUtil.trimNewLines(x509Config.getCert());
  175 + String sha3Hash = EncryptionUtil.getSha3Hash(cert);
  176 + x509Config.setCert(cert);
  177 + ((ObjectNode) json.get("client")).put("cert", cert);
  178 + deviceCredentials.setCredentialsValue(JacksonUtil.toString(json));
  179 + credentialsId = sha3Hash;
  180 + } else {
  181 + credentialsId = x509Config.getEndpoint();
  182 + }
  183 + break;
  184 + default:
  185 + throw new DataValidationException("Invalid credentials body for LwM2M credentials!");
156 186 }
  187 + deviceCredentials.setCredentialsId(credentialsId);
157 188 }
158 189
159 190 @Override
... ...