Commit ccab1aa2c96bdc969bcba3d15d89203b212331a8
Committed by
GitHub
Merge pull request #3887 from YevhenBondarenko/mqtt-transport-improvements
Mqtt flag sessionPresent depends on flag isCleanSession
Showing
1 changed file
with
17 additions
and
17 deletions
... | ... | @@ -357,37 +357,37 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement |
357 | 357 | log.info("[{}] Processing connect msg for client: {}!", sessionId, msg.payload().clientIdentifier()); |
358 | 358 | X509Certificate cert; |
359 | 359 | if (sslHandler != null && (cert = getX509Certificate()) != null) { |
360 | - processX509CertConnect(ctx, cert); | |
360 | + processX509CertConnect(ctx, cert, msg); | |
361 | 361 | } else { |
362 | 362 | processAuthTokenConnect(ctx, msg); |
363 | 363 | } |
364 | 364 | } |
365 | 365 | |
366 | - private void processAuthTokenConnect(ChannelHandlerContext ctx, MqttConnectMessage msg) { | |
367 | - String userName = msg.payload().userName(); | |
366 | + private void processAuthTokenConnect(ChannelHandlerContext ctx, MqttConnectMessage connectMessage) { | |
367 | + String userName = connectMessage.payload().userName(); | |
368 | 368 | log.info("[{}] Processing connect msg for client with user name: {}!", sessionId, userName); |
369 | 369 | if (StringUtils.isEmpty(userName)) { |
370 | - ctx.writeAndFlush(createMqttConnAckMsg(CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD)); | |
370 | + ctx.writeAndFlush(createMqttConnAckMsg(CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD, connectMessage)); | |
371 | 371 | ctx.close(); |
372 | 372 | } else { |
373 | 373 | transportService.process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(userName).build(), |
374 | 374 | new TransportServiceCallback<ValidateDeviceCredentialsResponseMsg>() { |
375 | 375 | @Override |
376 | 376 | public void onSuccess(ValidateDeviceCredentialsResponseMsg msg) { |
377 | - onValidateDeviceResponse(msg, ctx); | |
377 | + onValidateDeviceResponse(msg, ctx, connectMessage); | |
378 | 378 | } |
379 | 379 | |
380 | 380 | @Override |
381 | 381 | public void onError(Throwable e) { |
382 | 382 | log.trace("[{}] Failed to process credentials: {}", address, userName, e); |
383 | - ctx.writeAndFlush(createMqttConnAckMsg(MqttConnectReturnCode.CONNECTION_REFUSED_SERVER_UNAVAILABLE)); | |
383 | + ctx.writeAndFlush(createMqttConnAckMsg(MqttConnectReturnCode.CONNECTION_REFUSED_SERVER_UNAVAILABLE, connectMessage)); | |
384 | 384 | ctx.close(); |
385 | 385 | } |
386 | 386 | }); |
387 | 387 | } |
388 | 388 | } |
389 | 389 | |
390 | - private void processX509CertConnect(ChannelHandlerContext ctx, X509Certificate cert) { | |
390 | + private void processX509CertConnect(ChannelHandlerContext ctx, X509Certificate cert, MqttConnectMessage connectMessage) { | |
391 | 391 | try { |
392 | 392 | if(!context.isSkipValidityCheckForClientCert()){ |
393 | 393 | cert.checkValidity(); |
... | ... | @@ -398,18 +398,18 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement |
398 | 398 | new TransportServiceCallback<ValidateDeviceCredentialsResponseMsg>() { |
399 | 399 | @Override |
400 | 400 | public void onSuccess(ValidateDeviceCredentialsResponseMsg msg) { |
401 | - onValidateDeviceResponse(msg, ctx); | |
401 | + onValidateDeviceResponse(msg, ctx, connectMessage); | |
402 | 402 | } |
403 | 403 | |
404 | 404 | @Override |
405 | 405 | public void onError(Throwable e) { |
406 | 406 | log.trace("[{}] Failed to process credentials: {}", address, sha3Hash, e); |
407 | - ctx.writeAndFlush(createMqttConnAckMsg(MqttConnectReturnCode.CONNECTION_REFUSED_SERVER_UNAVAILABLE)); | |
407 | + ctx.writeAndFlush(createMqttConnAckMsg(MqttConnectReturnCode.CONNECTION_REFUSED_SERVER_UNAVAILABLE, connectMessage)); | |
408 | 408 | ctx.close(); |
409 | 409 | } |
410 | 410 | }); |
411 | 411 | } catch (Exception e) { |
412 | - ctx.writeAndFlush(createMqttConnAckMsg(CONNECTION_REFUSED_NOT_AUTHORIZED)); | |
412 | + ctx.writeAndFlush(createMqttConnAckMsg(CONNECTION_REFUSED_NOT_AUTHORIZED, connectMessage)); | |
413 | 413 | ctx.close(); |
414 | 414 | } |
415 | 415 | } |
... | ... | @@ -433,11 +433,11 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement |
433 | 433 | doDisconnect(); |
434 | 434 | } |
435 | 435 | |
436 | - private MqttConnAckMessage createMqttConnAckMsg(MqttConnectReturnCode returnCode) { | |
436 | + private MqttConnAckMessage createMqttConnAckMsg(MqttConnectReturnCode returnCode, MqttConnectMessage msg) { | |
437 | 437 | MqttFixedHeader mqttFixedHeader = |
438 | 438 | new MqttFixedHeader(CONNACK, false, AT_MOST_ONCE, false, 0); |
439 | 439 | MqttConnAckVariableHeader mqttConnAckVariableHeader = |
440 | - new MqttConnAckVariableHeader(returnCode, true); | |
440 | + new MqttConnAckVariableHeader(returnCode, !msg.variableHeader().isCleanSession()); | |
441 | 441 | return new MqttConnAckMessage(mqttFixedHeader, mqttConnAckVariableHeader); |
442 | 442 | } |
443 | 443 | |
... | ... | @@ -513,9 +513,9 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement |
513 | 513 | } |
514 | 514 | } |
515 | 515 | |
516 | - private void onValidateDeviceResponse(ValidateDeviceCredentialsResponseMsg msg, ChannelHandlerContext ctx) { | |
516 | + private void onValidateDeviceResponse(ValidateDeviceCredentialsResponseMsg msg, ChannelHandlerContext ctx, MqttConnectMessage connectMessage) { | |
517 | 517 | if (!msg.hasDeviceInfo()) { |
518 | - ctx.writeAndFlush(createMqttConnAckMsg(CONNECTION_REFUSED_NOT_AUTHORIZED)); | |
518 | + ctx.writeAndFlush(createMqttConnAckMsg(CONNECTION_REFUSED_NOT_AUTHORIZED, connectMessage)); | |
519 | 519 | ctx.close(); |
520 | 520 | } else { |
521 | 521 | deviceSessionCtx.setDeviceInfo(msg.getDeviceInfo()); |
... | ... | @@ -532,17 +532,17 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement |
532 | 532 | .build(); |
533 | 533 | transportService.process(sessionInfo, DefaultTransportService.getSessionEventMsg(SessionEvent.OPEN), new TransportServiceCallback<Void>() { |
534 | 534 | @Override |
535 | - public void onSuccess(Void msg) { | |
535 | + public void onSuccess(Void response) { | |
536 | 536 | transportService.registerAsyncSession(sessionInfo, MqttTransportHandler.this); |
537 | 537 | checkGatewaySession(); |
538 | - ctx.writeAndFlush(createMqttConnAckMsg(CONNECTION_ACCEPTED)); | |
538 | + ctx.writeAndFlush(createMqttConnAckMsg(CONNECTION_ACCEPTED, connectMessage)); | |
539 | 539 | log.info("[{}] Client connected!", sessionId); |
540 | 540 | } |
541 | 541 | |
542 | 542 | @Override |
543 | 543 | public void onError(Throwable e) { |
544 | 544 | log.warn("[{}] Failed to submit session event", sessionId, e); |
545 | - ctx.writeAndFlush(createMqttConnAckMsg(MqttConnectReturnCode.CONNECTION_REFUSED_SERVER_UNAVAILABLE)); | |
545 | + ctx.writeAndFlush(createMqttConnAckMsg(MqttConnectReturnCode.CONNECTION_REFUSED_SERVER_UNAVAILABLE, connectMessage)); | |
546 | 546 | ctx.close(); |
547 | 547 | } |
548 | 548 | }); | ... | ... |