Commit 4cd59674ee3ae844754e38398a5ba048d43b612e
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 | ... | ... |