Commit b9b82446ebe87b5bb892e48305ed7710cb17a587

Authored by Andrii Shvaika
1 parent d440d500

Transport Type check

... ... @@ -24,6 +24,7 @@ import org.eclipse.californium.core.network.ExchangeObserver;
24 24 import org.eclipse.californium.core.server.resources.CoapExchange;
25 25 import org.eclipse.californium.core.server.resources.Resource;
26 26 import org.springframework.util.ReflectionUtils;
  27 +import org.thingsboard.server.common.data.DeviceTransportType;
27 28 import org.thingsboard.server.common.data.security.DeviceTokenCredentials;
28 29 import org.thingsboard.server.common.msg.session.FeatureType;
29 30 import org.thingsboard.server.common.msg.session.SessionMsgType;
... ... @@ -145,7 +146,7 @@ public class CoapTransportResource extends CoapResource {
145 146 return;
146 147 }
147 148
148   - transportService.process(TransportProtos.ValidateDeviceTokenRequestMsg.newBuilder().setToken(credentials.get().getCredentialsId()).build(),
  149 + transportService.process(DeviceTransportType.DEFAULT, TransportProtos.ValidateDeviceTokenRequestMsg.newBuilder().setToken(credentials.get().getCredentialsId()).build(),
149 150 new DeviceAuthCallback(transportContext, exchange, sessionInfo -> {
150 151 UUID sessionId = new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB());
151 152 try {
... ...
... ... @@ -30,6 +30,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
30 30 import org.springframework.web.bind.annotation.RequestParam;
31 31 import org.springframework.web.bind.annotation.RestController;
32 32 import org.springframework.web.context.request.async.DeferredResult;
  33 +import org.thingsboard.server.common.data.DeviceTransportType;
33 34 import org.thingsboard.server.common.data.id.DeviceId;
34 35 import org.thingsboard.server.common.transport.SessionMsgListener;
35 36 import org.thingsboard.server.common.transport.TransportContext;
... ... @@ -78,7 +79,7 @@ public class DeviceApiController {
78 79 @RequestParam(value = "sharedKeys", required = false, defaultValue = "") String sharedKeys,
79 80 HttpServletRequest httpRequest) {
80 81 DeferredResult<ResponseEntity> responseWriter = new DeferredResult<>();
81   - transportContext.getTransportService().process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(),
  82 + transportContext.getTransportService().process(DeviceTransportType.DEFAULT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(),
82 83 new DeviceAuthCallback(transportContext, responseWriter, sessionInfo -> {
83 84 GetAttributeRequestMsg.Builder request = GetAttributeRequestMsg.newBuilder().setRequestId(0);
84 85 List<String> clientKeySet = !StringUtils.isEmpty(clientKeys) ? Arrays.asList(clientKeys.split(",")) : null;
... ... @@ -100,7 +101,7 @@ public class DeviceApiController {
100 101 public DeferredResult<ResponseEntity> postDeviceAttributes(@PathVariable("deviceToken") String deviceToken,
101 102 @RequestBody String json, HttpServletRequest request) {
102 103 DeferredResult<ResponseEntity> responseWriter = new DeferredResult<>();
103   - transportContext.getTransportService().process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(),
  104 + transportContext.getTransportService().process(DeviceTransportType.DEFAULT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(),
104 105 new DeviceAuthCallback(transportContext, responseWriter, sessionInfo -> {
105 106 TransportService transportService = transportContext.getTransportService();
106 107 transportService.process(sessionInfo, JsonConverter.convertToAttributesProto(new JsonParser().parse(json)),
... ... @@ -114,7 +115,7 @@ public class DeviceApiController {
114 115 public DeferredResult<ResponseEntity> postTelemetry(@PathVariable("deviceToken") String deviceToken,
115 116 @RequestBody String json, HttpServletRequest request) {
116 117 DeferredResult<ResponseEntity> responseWriter = new DeferredResult<ResponseEntity>();
117   - transportContext.getTransportService().process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(),
  118 + transportContext.getTransportService().process(DeviceTransportType.DEFAULT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(),
118 119 new DeviceAuthCallback(transportContext, responseWriter, sessionInfo -> {
119 120 TransportService transportService = transportContext.getTransportService();
120 121 transportService.process(sessionInfo, JsonConverter.convertToTelemetryProto(new JsonParser().parse(json)),
... ... @@ -128,7 +129,7 @@ public class DeviceApiController {
128 129 public DeferredResult<ResponseEntity> claimDevice(@PathVariable("deviceToken") String deviceToken,
129 130 @RequestBody(required = false) String json, HttpServletRequest request) {
130 131 DeferredResult<ResponseEntity> responseWriter = new DeferredResult<>();
131   - transportContext.getTransportService().process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(),
  132 + transportContext.getTransportService().process(DeviceTransportType.DEFAULT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(),
132 133 new DeviceAuthCallback(transportContext, responseWriter, sessionInfo -> {
133 134 TransportService transportService = transportContext.getTransportService();
134 135 DeviceId deviceId = new DeviceId(new UUID(sessionInfo.getDeviceIdMSB(), sessionInfo.getDeviceIdLSB()));
... ... @@ -143,7 +144,7 @@ public class DeviceApiController {
143 144 @RequestParam(value = "timeout", required = false, defaultValue = "0") long timeout,
144 145 HttpServletRequest httpRequest) {
145 146 DeferredResult<ResponseEntity> responseWriter = new DeferredResult<>();
146   - transportContext.getTransportService().process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(),
  147 + transportContext.getTransportService().process(DeviceTransportType.DEFAULT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(),
147 148 new DeviceAuthCallback(transportContext, responseWriter, sessionInfo -> {
148 149 TransportService transportService = transportContext.getTransportService();
149 150 transportService.registerSyncSession(sessionInfo, new HttpSessionListener(responseWriter),
... ... @@ -160,7 +161,7 @@ public class DeviceApiController {
160 161 @PathVariable("requestId") Integer requestId,
161 162 @RequestBody String json, HttpServletRequest request) {
162 163 DeferredResult<ResponseEntity> responseWriter = new DeferredResult<ResponseEntity>();
163   - transportContext.getTransportService().process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(),
  164 + transportContext.getTransportService().process(DeviceTransportType.DEFAULT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(),
164 165 new DeviceAuthCallback(transportContext, responseWriter, sessionInfo -> {
165 166 TransportService transportService = transportContext.getTransportService();
166 167 transportService.process(sessionInfo, ToDeviceRpcResponseMsg.newBuilder().setRequestId(requestId).setPayload(json).build(), new HttpOkCallback(responseWriter));
... ... @@ -172,7 +173,7 @@ public class DeviceApiController {
172 173 public DeferredResult<ResponseEntity> postRpcRequest(@PathVariable("deviceToken") String deviceToken,
173 174 @RequestBody String json, HttpServletRequest httpRequest) {
174 175 DeferredResult<ResponseEntity> responseWriter = new DeferredResult<ResponseEntity>();
175   - transportContext.getTransportService().process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(),
  176 + transportContext.getTransportService().process(DeviceTransportType.DEFAULT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(),
176 177 new DeviceAuthCallback(transportContext, responseWriter, sessionInfo -> {
177 178 JsonObject request = new JsonParser().parse(json).getAsJsonObject();
178 179 TransportService transportService = transportContext.getTransportService();
... ... @@ -190,7 +191,7 @@ public class DeviceApiController {
190 191 @RequestParam(value = "timeout", required = false, defaultValue = "0") long timeout,
191 192 HttpServletRequest httpRequest) {
192 193 DeferredResult<ResponseEntity> responseWriter = new DeferredResult<>();
193   - transportContext.getTransportService().process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(),
  194 + transportContext.getTransportService().process(DeviceTransportType.DEFAULT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(),
194 195 new DeviceAuthCallback(transportContext, responseWriter, sessionInfo -> {
195 196 TransportService transportService = transportContext.getTransportService();
196 197 transportService.registerSyncSession(sessionInfo, new HttpSessionListener(responseWriter),
... ...
... ... @@ -24,6 +24,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
24 24 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
25 25 import org.springframework.stereotype.Component;
26 26 import org.springframework.util.StringUtils;
  27 +import org.thingsboard.server.common.data.DeviceTransportType;
27 28 import org.thingsboard.server.common.msg.EncryptionUtil;
28 29 import org.thingsboard.server.common.transport.TransportService;
29 30 import org.thingsboard.server.common.transport.TransportServiceCallback;
... ... @@ -157,7 +158,7 @@ public class MqttSslHandlerProvider {
157 158 String sha3Hash = EncryptionUtil.getSha3Hash(strCert);
158 159 final String[] credentialsBodyHolder = new String[1];
159 160 CountDownLatch latch = new CountDownLatch(1);
160   - transportService.process(TransportProtos.ValidateDeviceX509CertRequestMsg.newBuilder().setHash(sha3Hash).build(),
  161 + transportService.process(DeviceTransportType.MQTT, TransportProtos.ValidateDeviceX509CertRequestMsg.newBuilder().setHash(sha3Hash).build(),
161 162 new TransportServiceCallback<ValidateDeviceCredentialsResponse>() {
162 163 @Override
163 164 public void onSuccess(ValidateDeviceCredentialsResponse msg) {
... ...
... ... @@ -39,6 +39,7 @@ import io.netty.util.concurrent.Future;
39 39 import io.netty.util.concurrent.GenericFutureListener;
40 40 import lombok.extern.slf4j.Slf4j;
41 41 import org.springframework.util.StringUtils;
  42 +import org.thingsboard.server.common.data.DeviceTransportType;
42 43 import org.thingsboard.server.common.data.device.profile.MqttTopics;
43 44 import org.thingsboard.server.common.msg.EncryptionUtil;
44 45 import org.thingsboard.server.common.transport.SessionMsgListener;
... ... @@ -366,7 +367,7 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
366 367 ctx.writeAndFlush(createMqttConnAckMsg(CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD));
367 368 ctx.close();
368 369 } else {
369   - transportService.process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(userName).build(),
  370 + transportService.process(DeviceTransportType.MQTT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(userName).build(),
370 371 new TransportServiceCallback<ValidateDeviceCredentialsResponse>() {
371 372 @Override
372 373 public void onSuccess(ValidateDeviceCredentialsResponse msg) {
... ... @@ -387,7 +388,7 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
387 388 try {
388 389 String strCert = SslUtil.getX509CertificateString(cert);
389 390 String sha3Hash = EncryptionUtil.getSha3Hash(strCert);
390   - transportService.process(ValidateDeviceX509CertRequestMsg.newBuilder().setHash(sha3Hash).build(),
  391 + transportService.process(DeviceTransportType.MQTT, ValidateDeviceX509CertRequestMsg.newBuilder().setHash(sha3Hash).build(),
391 392 new TransportServiceCallback<ValidateDeviceCredentialsResponse>() {
392 393 @Override
393 394 public void onSuccess(ValidateDeviceCredentialsResponse msg) {
... ...
... ... @@ -16,6 +16,7 @@
16 16 package org.thingsboard.server.common.transport;
17 17
18 18 import org.thingsboard.server.common.data.DeviceProfile;
  19 +import org.thingsboard.server.common.data.DeviceTransportType;
19 20 import org.thingsboard.server.common.data.id.DeviceProfileId;
20 21 import org.thingsboard.server.common.transport.auth.GetOrCreateDeviceFromGatewayResponse;
21 22 import org.thingsboard.server.common.transport.auth.ValidateDeviceCredentialsResponse;
... ... @@ -45,10 +46,10 @@ public interface TransportService {
45 46
46 47 GetTenantRoutingInfoResponseMsg getRoutingInfo(GetTenantRoutingInfoRequestMsg msg);
47 48
48   - void process(ValidateDeviceTokenRequestMsg msg,
  49 + void process(DeviceTransportType transportType, ValidateDeviceTokenRequestMsg msg,
49 50 TransportServiceCallback<ValidateDeviceCredentialsResponse> callback);
50 51
51   - void process(ValidateDeviceX509CertRequestMsg msg,
  52 + void process(DeviceTransportType transportType, ValidateDeviceX509CertRequestMsg msg,
52 53 TransportServiceCallback<ValidateDeviceCredentialsResponse> callback);
53 54
54 55 void process(GetOrCreateDeviceFromGatewayRequestMsg msg,
... ...
... ... @@ -27,6 +27,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
27 27 import org.springframework.stereotype.Service;
28 28 import org.thingsboard.common.util.ThingsBoardThreadFactory;
29 29 import org.thingsboard.server.common.data.DeviceProfile;
  30 +import org.thingsboard.server.common.data.DeviceTransportType;
30 31 import org.thingsboard.server.common.data.EntityType;
31 32 import org.thingsboard.server.common.data.id.DeviceId;
32 33 import org.thingsboard.server.common.data.id.DeviceProfileId;
... ... @@ -252,20 +253,20 @@ public class DefaultTransportService implements TransportService {
252 253 }
253 254
254 255 @Override
255   - public void process(TransportProtos.ValidateDeviceTokenRequestMsg msg, TransportServiceCallback<ValidateDeviceCredentialsResponse> callback) {
  256 + public void process(DeviceTransportType transportType, TransportProtos.ValidateDeviceTokenRequestMsg msg, TransportServiceCallback<ValidateDeviceCredentialsResponse> callback) {
256 257 log.trace("Processing msg: {}", msg);
257 258 TbProtoQueueMsg<TransportApiRequestMsg> protoMsg = new TbProtoQueueMsg<>(UUID.randomUUID(), TransportApiRequestMsg.newBuilder().setValidateTokenRequestMsg(msg).build());
258   - doProcess(protoMsg, callback);
  259 + doProcess(transportType, protoMsg, callback);
259 260 }
260 261
261 262 @Override
262   - public void process(TransportProtos.ValidateDeviceX509CertRequestMsg msg, TransportServiceCallback<ValidateDeviceCredentialsResponse> callback) {
  263 + public void process(DeviceTransportType transportType, TransportProtos.ValidateDeviceX509CertRequestMsg msg, TransportServiceCallback<ValidateDeviceCredentialsResponse> callback) {
263 264 log.trace("Processing msg: {}", msg);
264 265 TbProtoQueueMsg<TransportApiRequestMsg> protoMsg = new TbProtoQueueMsg<>(UUID.randomUUID(), TransportApiRequestMsg.newBuilder().setValidateX509CertRequestMsg(msg).build());
265   - doProcess(protoMsg, callback);
  266 + doProcess(transportType, protoMsg, callback);
266 267 }
267 268
268   - private void doProcess(TbProtoQueueMsg<TransportApiRequestMsg> protoMsg, TransportServiceCallback<ValidateDeviceCredentialsResponse> callback) {
  269 + private void doProcess(DeviceTransportType transportType, TbProtoQueueMsg<TransportApiRequestMsg> protoMsg, TransportServiceCallback<ValidateDeviceCredentialsResponse> callback) {
269 270 ListenableFuture<ValidateDeviceCredentialsResponse> response = Futures.transform(transportApiRequestTemplate.send(protoMsg), tmp -> {
270 271 TransportProtos.ValidateDeviceCredentialsResponseMsg msg = tmp.getValue().getValidateTokenResponseMsg();
271 272 ValidateDeviceCredentialsResponse.ValidateDeviceCredentialsResponseBuilder result = ValidateDeviceCredentialsResponse.builder();
... ... @@ -283,6 +284,11 @@ public class DefaultTransportService implements TransportService {
283 284 deviceProfiles.put(tdi.getDeviceProfileId(), profile);
284 285 }
285 286 }
  287 + if (transportType != DeviceTransportType.DEFAULT
  288 + && profile != null && profile.getTransportType() != DeviceTransportType.DEFAULT && profile.getTransportType() != transportType) {
  289 + log.debug("[{}] Device profile [{}] has different transport type: {}, expected: {}", tdi.getDeviceId(), tdi.getDeviceProfileId(), profile.getTransportType(), transportType);
  290 + throw new IllegalStateException("Device profile has different transport type: " + profile.getTransportType() + ". Expected: " + transportType);
  291 + }
286 292 result.deviceProfile(profile);
287 293 }
288 294 }
... ...