summaryrefslogtreecommitdiffstats
path: root/external_libs/python/pyzmq-14.7.0/examples/security/woodhouse.py
diff options
context:
space:
mode:
Diffstat (limited to 'external_libs/python/pyzmq-14.7.0/examples/security/woodhouse.py')
-rw-r--r--external_libs/python/pyzmq-14.7.0/examples/security/woodhouse.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/external_libs/python/pyzmq-14.7.0/examples/security/woodhouse.py b/external_libs/python/pyzmq-14.7.0/examples/security/woodhouse.py
new file mode 100644
index 00000000..0db97343
--- /dev/null
+++ b/external_libs/python/pyzmq-14.7.0/examples/security/woodhouse.py
@@ -0,0 +1,90 @@
+#!/usr/bin/env python
+
+'''
+Woodhouse extends Strawhouse with a name and password check.
+
+This uses the PLAIN mechanism which does plain-text username and password authentication).
+It's not really secure, and anyone sniffing the network (trivial with WiFi)
+can capture passwords and then login.
+
+Author: Chris Laws
+'''
+
+import logging
+import sys
+
+import zmq
+import zmq.auth
+from zmq.auth.thread import ThreadAuthenticator
+
+def run():
+ '''Run woodhouse example'''
+
+ valid_client_test_pass = False
+ invalid_client_test_pass = False
+
+ ctx = zmq.Context.instance()
+
+ # Start an authenticator for this context.
+ auth = ThreadAuthenticator(ctx)
+ auth.start()
+ auth.allow('127.0.0.1')
+ # Instruct authenticator to handle PLAIN requests
+ auth.configure_plain(domain='*', passwords={'admin': 'secret'})
+
+ server = ctx.socket(zmq.PUSH)
+ server.plain_server = True # must come before bind
+ server.bind('tcp://*:9000')
+
+ client = ctx.socket(zmq.PULL)
+ client.plain_username = b'admin'
+ client.plain_password = b'secret'
+ client.connect('tcp://127.0.0.1:9000')
+
+ server.send(b"Hello")
+
+ if client.poll():
+ msg = client.recv()
+ if msg == b"Hello":
+ valid_client_test_pass = True
+
+ client.close()
+
+
+ # now use invalid credentials - expect no msg received
+ client2 = ctx.socket(zmq.PULL)
+ client2.plain_username = b'admin'
+ client2.plain_password = b'bogus'
+ client2.connect('tcp://127.0.0.1:9000')
+
+ server.send(b"World")
+
+ if client2.poll(50):
+ msg = client.recv()
+ if msg == "World":
+ invalid_client_test_pass = False
+ else:
+ # no message is expected
+ invalid_client_test_pass = True
+
+ # stop auth thread
+ auth.stop()
+
+ if valid_client_test_pass and invalid_client_test_pass:
+ logging.info("Woodhouse test OK")
+ else:
+ logging.error("Woodhouse test FAIL")
+
+
+if __name__ == '__main__':
+ if zmq.zmq_version_info() < (4,0):
+ raise RuntimeError("Security is not supported in libzmq version < 4.0. libzmq version {0}".format(zmq.zmq_version()))
+
+ if '-v' in sys.argv:
+ level = logging.DEBUG
+ else:
+ level = logging.INFO
+
+ logging.basicConfig(level=level, format="[%(levelname)s] %(message)s")
+
+ run()