From 597cc5edd624525563e6549dc0057eca2a51c81d Mon Sep 17 00:00:00 2001 From: Micah Anderson Date: Tue, 11 Nov 2014 13:30:46 -0500 Subject: upgrade to new version --- tests/test_security_null.cpp | 148 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 tests/test_security_null.cpp (limited to 'tests/test_security_null.cpp') diff --git a/tests/test_security_null.cpp b/tests/test_security_null.cpp new file mode 100644 index 0000000..8a55632 --- /dev/null +++ b/tests/test_security_null.cpp @@ -0,0 +1,148 @@ +/* + Copyright (c) 2007-2013 Contributors as noted in the AUTHORS file + + This file is part of 0MQ. + + 0MQ is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + 0MQ is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#include "testutil.hpp" + +static void +zap_handler (void *handler) +{ + // Process ZAP requests forever + while (true) { + char *version = s_recv (handler); + if (!version) + break; // Terminating + char *sequence = s_recv (handler); + char *domain = s_recv (handler); + char *address = s_recv (handler); + char *identity = s_recv (handler); + char *mechanism = s_recv (handler); + + assert (streq (version, "1.0")); + assert (streq (mechanism, "NULL")); + + s_sendmore (handler, version); + s_sendmore (handler, sequence); + if (streq (domain, "TEST")) { + s_sendmore (handler, "200"); + s_sendmore (handler, "OK"); + s_sendmore (handler, "anonymous"); + s_send (handler, ""); + } + else { + s_sendmore (handler, "400"); + s_sendmore (handler, "BAD DOMAIN"); + s_sendmore (handler, ""); + s_send (handler, ""); + } + free (version); + free (sequence); + free (domain); + free (address); + free (identity); + free (mechanism); + } + zmq_close (handler); +} + +int main (void) +{ + setup_test_environment(); + void *ctx = zmq_ctx_new (); + assert (ctx); + + // Spawn ZAP handler + // We create and bind ZAP socket in main thread to avoid case + // where child thread does not start up fast enough. + void *handler = zmq_socket (ctx, ZMQ_REP); + assert (handler); + int rc = zmq_bind (handler, "inproc://zeromq.zap.01"); + assert (rc == 0); + void *zap_thread = zmq_threadstart (&zap_handler, handler); + + // We bounce between a binding server and a connecting client + void *server = zmq_socket (ctx, ZMQ_DEALER); + assert (server); + void *client = zmq_socket (ctx, ZMQ_DEALER); + assert (client); + + // We first test client/server with no ZAP domain + // Libzmq does not call our ZAP handler, the connect must succeed + rc = zmq_bind (server, "tcp://127.0.0.1:9000"); + assert (rc == 0); + rc = zmq_connect (client, "tcp://localhost:9000"); + assert (rc == 0); + bounce (server, client); + zmq_unbind (server, "tcp://127.0.0.1:9000"); + zmq_disconnect (client, "tcp://localhost:9000"); + + // Now define a ZAP domain for the server; this enables + // authentication. We're using the wrong domain so this test + // must fail. + // ************************************************************** + // PH: the following causes libzmq to get confused, so that the + // next step fails. To reproduce, uncomment this block. Note that + // even creating a new client/server socket pair, the behaviour + // does not change. + // ************************************************************** + // Destroying the old sockets and creating new ones isn't needed, + // but it shows that the problem isn't related to specific sockets. + //close_zero_linger (client); + //close_zero_linger (server); + //server = zmq_socket (ctx, ZMQ_DEALER); + //assert (server); + //client = zmq_socket (ctx, ZMQ_DEALER); + //assert (client); + //// The above code should not be required + //rc = zmq_setsockopt (server, ZMQ_ZAP_DOMAIN, "WRONG", 5); + //assert (rc == 0); + //rc = zmq_bind (server, "tcp://127.0.0.1:9001"); + //assert (rc == 0); + //rc = zmq_connect (client, "tcp://localhost:9001"); + //assert (rc == 0); + //expect_bounce_fail (server, client); + //zmq_unbind (server, "tcp://127.0.0.1:9001"); + //zmq_disconnect (client, "tcp://localhost:9001"); + + // Now use the right domain, the test must pass + rc = zmq_setsockopt (server, ZMQ_ZAP_DOMAIN, "TEST", 4); + assert (rc == 0); + rc = zmq_bind (server, "tcp://127.0.0.1:9002"); + assert (rc == 0); + rc = zmq_connect (client, "tcp://localhost:9002"); + assert (rc == 0); + // ************************************************************** + // PH: it fails here; though the ZAP reply is 200 OK, and + // null_mechanism.cpp correctly parses that, the connection + // never succeeds and the test hangs. + // ************************************************************** + bounce (server, client); + zmq_unbind (server, "tcp://127.0.0.1:9002"); + zmq_disconnect (client, "tcp://localhost:9002"); + + // Shutdown + close_zero_linger (client); + close_zero_linger (server); + rc = zmq_ctx_term (ctx); + assert (rc == 0); + + // Wait until ZAP handler terminates. + zmq_threadclose (zap_thread); + + return 0; +} -- cgit v1.2.3