16914e4b28
Bugfix release. Drop the now upstreamed patches and add 3 new post-2.0.2 patches from the fixes branch. Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
139 lines
6.4 KiB
Diff
139 lines
6.4 KiB
Diff
From 113603168bb644715395f86b78e0803f1e6b67a0 Mon Sep 17 00:00:00 2001
|
|
From: Roger Light <roger@atchoo.org>
|
|
Date: Sun, 13 Dec 2020 23:11:02 +0000
|
|
Subject: [PATCH] Fix LWT not being sent on client takeover.
|
|
|
|
This was not happening for the case when the existing session wasn't
|
|
being continued.
|
|
|
|
Closes #1946. Thanks to Rory Piper.
|
|
|
|
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
|
|
[Peter: drop ChangeLog.txt hunk]
|
|
---
|
|
src/handle_connect.c | 8 +++++
|
|
test/broker/07-will-takeover.py | 53 ++++++++++++++++++++++++---------
|
|
2 files changed, 48 insertions(+), 14 deletions(-)
|
|
|
|
diff --git a/src/handle_connect.c b/src/handle_connect.c
|
|
index 7be9833a..5a33fdde 100644
|
|
--- a/src/handle_connect.c
|
|
+++ b/src/handle_connect.c
|
|
@@ -165,6 +165,14 @@ int connect__on_authorised(struct mosquitto *context, void *auth_data_out, uint1
|
|
if(context->clean_start == true){
|
|
sub__clean_session(found_context);
|
|
}
|
|
+ if((found_context->protocol == mosq_p_mqtt5 && found_context->session_expiry_interval == 0)
|
|
+ || (found_context->protocol != mosq_p_mqtt5 && found_context->clean_start == true)
|
|
+ || (context->clean_start == true)
|
|
+ ){
|
|
+
|
|
+ context__send_will(found_context);
|
|
+ }
|
|
+
|
|
session_expiry__remove(found_context);
|
|
will_delay__remove(found_context);
|
|
will__clear(found_context);
|
|
diff --git a/test/broker/07-will-takeover.py b/test/broker/07-will-takeover.py
|
|
index 8e04b423..1024a46a 100755
|
|
--- a/test/broker/07-will-takeover.py
|
|
+++ b/test/broker/07-will-takeover.py
|
|
@@ -5,7 +5,7 @@
|
|
from mosq_test_helper import *
|
|
|
|
|
|
-def do_test(proto_ver, clean_session):
|
|
+def do_test(proto_ver, clean_session1, clean_session2):
|
|
rc = 1
|
|
keepalive = 60
|
|
|
|
@@ -13,17 +13,34 @@ def do_test(proto_ver, clean_session):
|
|
connect1_packet = mosq_test.gen_connect("will-helper", keepalive=keepalive, proto_ver=proto_ver)
|
|
connack1_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver)
|
|
|
|
- connect2_packet = mosq_test.gen_connect("will-test", keepalive=keepalive, proto_ver=proto_ver, will_topic="will/test", will_payload=b"LWT", clean_session=clean_session)
|
|
- connack2a_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver)
|
|
- if clean_session == False and proto_ver == 4:
|
|
- connack2b_packet = mosq_test.gen_connack(rc=0, flags=1, proto_ver=proto_ver)
|
|
+ if proto_ver == 5:
|
|
+ if clean_session1 == False:
|
|
+ connect_props1 = mqtt5_props.gen_uint32_prop(mqtt5_props.PROP_SESSION_EXPIRY_INTERVAL, 60)
|
|
+ else:
|
|
+ connect_props1 = mqtt5_props.gen_uint32_prop(mqtt5_props.PROP_SESSION_EXPIRY_INTERVAL, 0)
|
|
+
|
|
+ if clean_session2 == False:
|
|
+ connect_props2 = mqtt5_props.gen_uint32_prop(mqtt5_props.PROP_SESSION_EXPIRY_INTERVAL, 60)
|
|
+ else:
|
|
+ connect_props2 = mqtt5_props.gen_uint32_prop(mqtt5_props.PROP_SESSION_EXPIRY_INTERVAL, 0)
|
|
else:
|
|
- connack2b_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver)
|
|
+ connect_props1 = b""
|
|
+ connect_props2 = b""
|
|
+
|
|
+ connect2_packet = mosq_test.gen_connect("will-test", keepalive=keepalive, proto_ver=proto_ver, will_topic="will/test", will_payload=b"LWT", clean_session=clean_session1, properties=connect_props1)
|
|
+ connack2_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver)
|
|
+
|
|
+ connect3_packet = mosq_test.gen_connect("will-test", keepalive=keepalive, proto_ver=proto_ver, clean_session=clean_session2, properties=connect_props2)
|
|
+ if clean_session1 == False and clean_session2 == False:
|
|
+ connack3_packet = mosq_test.gen_connack(rc=0, flags=1, proto_ver=proto_ver)
|
|
+ else:
|
|
+ connack3_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver)
|
|
|
|
subscribe_packet = mosq_test.gen_subscribe(mid, "will/test", 0, proto_ver=proto_ver)
|
|
suback_packet = mosq_test.gen_suback(mid, 0, proto_ver=proto_ver)
|
|
|
|
publish_packet = mosq_test.gen_publish(topic="will/test", qos=0, payload="Client ready", proto_ver=proto_ver)
|
|
+ publish_lwt_packet = mosq_test.gen_publish(topic="will/test", qos=0, payload="LWT", proto_ver=proto_ver)
|
|
|
|
port = mosq_test.get_port()
|
|
broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port)
|
|
@@ -34,17 +51,21 @@ def do_test(proto_ver, clean_session):
|
|
mosq_test.do_send_receive(sock1, subscribe_packet, suback_packet, "suback")
|
|
|
|
# Connect client with will
|
|
- sock2 = mosq_test.do_client_connect(connect2_packet, connack2a_packet, timeout=5, port=port)
|
|
+ sock2 = mosq_test.do_client_connect(connect2_packet, connack2_packet, timeout=5, port=port)
|
|
|
|
# Send a "ready" message
|
|
sock2.send(publish_packet)
|
|
mosq_test.expect_packet(sock1, "publish 1", publish_packet)
|
|
|
|
# Connect client with will again as a separate connection, this should
|
|
- # take over from the previous one but not trigger a Will.
|
|
- sock3 = mosq_test.do_client_connect(connect2_packet, connack2b_packet, timeout=5, port=port)
|
|
+ # take over from the previous one but only trigger a Will if we are taking
|
|
+ # over a clean session/session-expiry-interval==0 client
|
|
+ sock3 = mosq_test.do_client_connect(connect3_packet, connack3_packet, timeout=5, port=port)
|
|
sock2.close()
|
|
|
|
+ if clean_session1 == True or clean_session2 == True:
|
|
+ mosq_test.expect_packet(sock1, "publish LWT", publish_lwt_packet)
|
|
+
|
|
# Send the "ready" message again
|
|
sock3.send(publish_packet)
|
|
mosq_test.expect_packet(sock1, "publish 2", publish_packet)
|
|
@@ -63,11 +84,15 @@ def do_test(proto_ver, clean_session):
|
|
(stdo, stde) = broker.communicate()
|
|
if rc:
|
|
print(stde.decode('utf-8'))
|
|
- print("proto_ver=%d clean_session=%d" % (proto_ver, clean_session))
|
|
+ print("proto_ver=%d clean_session1=%d clean_session2=%d" % (proto_ver, clean_session1, clean_session2))
|
|
exit(rc)
|
|
|
|
|
|
-do_test(proto_ver=4, clean_session=True)
|
|
-do_test(proto_ver=4, clean_session=False)
|
|
-do_test(proto_ver=5, clean_session=True)
|
|
-do_test(proto_ver=5, clean_session=False)
|
|
+do_test(proto_ver=4, clean_session1=True, clean_session2=True)
|
|
+do_test(proto_ver=4, clean_session1=False, clean_session2=True)
|
|
+do_test(proto_ver=4, clean_session1=True, clean_session2=False)
|
|
+do_test(proto_ver=4, clean_session1=False, clean_session2=False)
|
|
+do_test(proto_ver=5, clean_session1=True, clean_session2=True)
|
|
+do_test(proto_ver=5, clean_session1=False, clean_session2=True)
|
|
+do_test(proto_ver=5, clean_session1=True, clean_session2=False)
|
|
+do_test(proto_ver=5, clean_session1=False, clean_session2=False)
|
|
--
|
|
2.20.1
|
|
|