123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- #!/usr/bin/env python3
- # Check whether messages deliver or not after some access is revoked.
- from mosq_test_helper import *
- import signal
- def write_config(filename, port, per_listener):
- with open(filename, 'w') as f:
- f.write("per_listener_settings %s\n" % (per_listener))
- f.write("port %d\n" % (port))
- f.write("allow_anonymous true\n")
- f.write("acl_file %s\n" % (filename.replace('.conf', '.acl')))
- def write_acl(filename, en):
- with open(filename, 'w') as f:
- f.write('user username\n')
- f.write('topic readwrite topic/one\n')
- if en:
- f.write('topic readwrite topic/two\n')
- keepalive = 60
- username = "username"
- connect1_packet = mosq_test.gen_connect("acl-check", keepalive=keepalive, username=username, clean_session=False)
- connack1a_packet = mosq_test.gen_connack(rc=0)
- connack1b_packet = mosq_test.gen_connack(rc=0, flags=1)
- mid = 1
- subscribe1_packet = mosq_test.gen_subscribe(mid=mid, topic="topic/one", qos=1)
- suback1_packet = mosq_test.gen_suback(mid=mid, qos=1)
- mid = 2
- subscribe2_packet = mosq_test.gen_subscribe(mid=mid, topic="topic/two", qos=1)
- suback2_packet = mosq_test.gen_suback(mid=mid, qos=1)
- disconnect_packet = mosq_test.gen_disconnect()
- connect2_packet = mosq_test.gen_connect("helper", keepalive=keepalive, username=username)
- connack2_packet = mosq_test.gen_connack(rc=0)
- mid = 1
- publish1s_packet = mosq_test.gen_publish(topic="topic/one", mid=mid, qos=1, payload="message1")
- puback1s_packet = mosq_test.gen_puback(mid)
- mid = 2
- publish2s_packet = mosq_test.gen_publish(topic="topic/two", mid=mid, qos=1, payload="message2")
- puback2s_packet = mosq_test.gen_puback(mid)
- mid = 1
- publish1r_packet = mosq_test.gen_publish(topic="topic/one", mid=mid, qos=1, payload="message1")
- puback1r_packet = mosq_test.gen_puback(mid)
- mid = 2
- publish3s_packet = mosq_test.gen_publish(topic="topic/one", mid=mid, qos=1, payload="message3")
- puback3s_packet = mosq_test.gen_puback(mid)
- mid = 3
- publish3r_packet = mosq_test.gen_publish(topic="topic/one", mid=mid, qos=1, payload="message3")
- puback3r_packet = mosq_test.gen_puback(mid)
- mid = 3
- publish4s_packet = mosq_test.gen_publish(topic="topic/two", mid=mid, qos=1, payload="message4")
- puback4s_packet = mosq_test.gen_puback(mid)
- rc = 1
- port = mosq_test.get_port()
- conf_file = os.path.basename(__file__).replace('.py', '.conf')
- write_config(conf_file, port, "false")
- acl_file = os.path.basename(__file__).replace('.py', '.acl')
- write_acl(acl_file, True)
- broker = mosq_test.start_broker(filename=os.path.basename(__file__), use_conf=True, port=port)
- try:
- keepalive = 60
- # Connect, subscribe, then disconnect
- sock = mosq_test.do_client_connect(connect1_packet, connack1a_packet, port=port)
- mosq_test.do_send_receive(sock, subscribe1_packet, suback1_packet, "suback1")
- mosq_test.do_send_receive(sock, subscribe2_packet, suback2_packet, "suback2")
- sock.send(disconnect_packet)
- sock.close()
- # Helper publish to topic/one and topic/two, will be queued for other client
- sock = mosq_test.do_client_connect(connect2_packet, connack2_packet, port=port)
- mosq_test.do_send_receive(sock, publish1s_packet, puback1s_packet, "puback1")
- mosq_test.do_send_receive(sock, publish2s_packet, puback2s_packet, "puback2")
- sock.close()
- # Reload ACLs with topic/two now disabled
- write_acl(acl_file, False)
- broker.send_signal(signal.SIGHUP)
- sock = mosq_test.do_client_connect(connect1_packet, connack1b_packet, port=port)
- sock.settimeout(10)
- mosq_test.expect_packet(sock, "publish1r", publish1r_packet)
- # We don't expect messages to topic/two any more, so we don't expect the queued one
- sock.send(publish3s_packet)
- mosq_test.receive_unordered(sock, puback3s_packet, publish3r_packet, "puback3/publish3r")
- # Send this, don't expect it to succeed
- mosq_test.do_send_receive(sock, publish4s_packet, puback4s_packet, "puback4")
- # Check for non delivery with a ping
- mosq_test.do_ping(sock)
- sock.close()
- rc = 0
- except mosq_test.TestError:
- pass
- finally:
- os.remove(conf_file)
- os.remove(acl_file)
- broker.terminate()
- broker.wait()
- (stdo, stde) = broker.communicate()
- if rc:
- print(stde.decode('utf-8'))
- exit(rc)
- port = mosq_test.get_port()
|