09-acl-change.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #!/usr/bin/env python3
  2. # Check whether messages deliver or not after some access is revoked.
  3. from mosq_test_helper import *
  4. import signal
  5. def write_config(filename, port, per_listener):
  6. with open(filename, 'w') as f:
  7. f.write("per_listener_settings %s\n" % (per_listener))
  8. f.write("port %d\n" % (port))
  9. f.write("allow_anonymous true\n")
  10. f.write("acl_file %s\n" % (filename.replace('.conf', '.acl')))
  11. def write_acl(filename, en):
  12. with open(filename, 'w') as f:
  13. f.write('user username\n')
  14. f.write('topic readwrite topic/one\n')
  15. if en:
  16. f.write('topic readwrite topic/two\n')
  17. keepalive = 60
  18. username = "username"
  19. connect1_packet = mosq_test.gen_connect("acl-check", keepalive=keepalive, username=username, clean_session=False)
  20. connack1a_packet = mosq_test.gen_connack(rc=0)
  21. connack1b_packet = mosq_test.gen_connack(rc=0, flags=1)
  22. mid = 1
  23. subscribe1_packet = mosq_test.gen_subscribe(mid=mid, topic="topic/one", qos=1)
  24. suback1_packet = mosq_test.gen_suback(mid=mid, qos=1)
  25. mid = 2
  26. subscribe2_packet = mosq_test.gen_subscribe(mid=mid, topic="topic/two", qos=1)
  27. suback2_packet = mosq_test.gen_suback(mid=mid, qos=1)
  28. disconnect_packet = mosq_test.gen_disconnect()
  29. connect2_packet = mosq_test.gen_connect("helper", keepalive=keepalive, username=username)
  30. connack2_packet = mosq_test.gen_connack(rc=0)
  31. mid = 1
  32. publish1s_packet = mosq_test.gen_publish(topic="topic/one", mid=mid, qos=1, payload="message1")
  33. puback1s_packet = mosq_test.gen_puback(mid)
  34. mid = 2
  35. publish2s_packet = mosq_test.gen_publish(topic="topic/two", mid=mid, qos=1, payload="message2")
  36. puback2s_packet = mosq_test.gen_puback(mid)
  37. mid = 1
  38. publish1r_packet = mosq_test.gen_publish(topic="topic/one", mid=mid, qos=1, payload="message1")
  39. puback1r_packet = mosq_test.gen_puback(mid)
  40. mid = 2
  41. publish3s_packet = mosq_test.gen_publish(topic="topic/one", mid=mid, qos=1, payload="message3")
  42. puback3s_packet = mosq_test.gen_puback(mid)
  43. mid = 3
  44. publish3r_packet = mosq_test.gen_publish(topic="topic/one", mid=mid, qos=1, payload="message3")
  45. puback3r_packet = mosq_test.gen_puback(mid)
  46. mid = 3
  47. publish4s_packet = mosq_test.gen_publish(topic="topic/two", mid=mid, qos=1, payload="message4")
  48. puback4s_packet = mosq_test.gen_puback(mid)
  49. rc = 1
  50. port = mosq_test.get_port()
  51. conf_file = os.path.basename(__file__).replace('.py', '.conf')
  52. write_config(conf_file, port, "false")
  53. acl_file = os.path.basename(__file__).replace('.py', '.acl')
  54. write_acl(acl_file, True)
  55. broker = mosq_test.start_broker(filename=os.path.basename(__file__), use_conf=True, port=port)
  56. try:
  57. keepalive = 60
  58. # Connect, subscribe, then disconnect
  59. sock = mosq_test.do_client_connect(connect1_packet, connack1a_packet, port=port)
  60. mosq_test.do_send_receive(sock, subscribe1_packet, suback1_packet, "suback1")
  61. mosq_test.do_send_receive(sock, subscribe2_packet, suback2_packet, "suback2")
  62. sock.send(disconnect_packet)
  63. sock.close()
  64. # Helper publish to topic/one and topic/two, will be queued for other client
  65. sock = mosq_test.do_client_connect(connect2_packet, connack2_packet, port=port)
  66. mosq_test.do_send_receive(sock, publish1s_packet, puback1s_packet, "puback1")
  67. mosq_test.do_send_receive(sock, publish2s_packet, puback2s_packet, "puback2")
  68. sock.close()
  69. # Reload ACLs with topic/two now disabled
  70. write_acl(acl_file, False)
  71. broker.send_signal(signal.SIGHUP)
  72. sock = mosq_test.do_client_connect(connect1_packet, connack1b_packet, port=port)
  73. sock.settimeout(10)
  74. mosq_test.expect_packet(sock, "publish1r", publish1r_packet)
  75. # We don't expect messages to topic/two any more, so we don't expect the queued one
  76. sock.send(publish3s_packet)
  77. mosq_test.receive_unordered(sock, puback3s_packet, publish3r_packet, "puback3/publish3r")
  78. # Send this, don't expect it to succeed
  79. mosq_test.do_send_receive(sock, publish4s_packet, puback4s_packet, "puback4")
  80. # Check for non delivery with a ping
  81. mosq_test.do_ping(sock)
  82. sock.close()
  83. rc = 0
  84. except mosq_test.TestError:
  85. pass
  86. finally:
  87. os.remove(conf_file)
  88. os.remove(acl_file)
  89. broker.terminate()
  90. broker.wait()
  91. (stdo, stde) = broker.communicate()
  92. if rc:
  93. print(stde.decode('utf-8'))
  94. exit(rc)
  95. port = mosq_test.get_port()