Author: tross
Date: Fri Jul 10 21:26:02 2015
New Revision: 1690310

URL: http://svn.apache.org/r1690310
Log:
DISPATCH-137 - Integrated new Proton SASL capability into Dispatch.

Modified:
    qpid/dispatch/trunk/src/container.c
    qpid/dispatch/trunk/src/posix/driver.c
    qpid/dispatch/trunk/src/server.c
    qpid/dispatch/trunk/tests/system_test.py
    qpid/dispatch/trunk/tests/system_tests_management.py

Modified: qpid/dispatch/trunk/src/container.c
URL: 
http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/container.c?rev=1690310&r1=1690309&r2=1690310&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/container.c (original)
+++ qpid/dispatch/trunk/src/container.c Fri Jul 10 21:26:02 2015
@@ -432,6 +432,7 @@ int pn_event_handler(void *handler_conte
     case PN_TRANSPORT_HEAD_CLOSED :
     case PN_TRANSPORT_TAIL_CLOSED :
     case PN_TRANSPORT_CLOSED :
+    case PN_TRANSPORT_AUTHENTICATED :
     case PN_SELECTABLE_INIT :
     case PN_SELECTABLE_UPDATED :
     case PN_SELECTABLE_READABLE :
@@ -459,8 +460,6 @@ static void open_handler(qd_container_t
     qdc_node_type_t *nt_item = DEQ_HEAD(container->node_type_list);
     sys_mutex_unlock(container->lock);
 
-    pn_connection_open(qd_connection_pn(conn));
-
     while (nt_item) {
         nt = nt_item->ntype;
         if (dir == QD_INCOMING) {

Modified: qpid/dispatch/trunk/src/posix/driver.c
URL: 
http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/posix/driver.c?rev=1690310&r1=1690309&r2=1690310&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/posix/driver.c (original)
+++ qpid/dispatch/trunk/src/posix/driver.c Fri Jul 10 21:26:02 2015
@@ -40,7 +40,6 @@
 #include <qpid/dispatch/threading.h>
 #include "alloc.h"
 #include <proton/error.h>
-#include <proton/sasl.h>
 #include <proton/ssl.h>
 #include <proton/object.h>
 #include <qpid/dispatch/ctools.h>
@@ -101,7 +100,6 @@ struct qdpn_connector_t {
     pn_timestamp_t wakeup;
     pn_connection_t *connection;
     pn_transport_t *transport;
-    pn_sasl_t *sasl;
     qdpn_listener_t *listener;
     void *context;
     int idx;
@@ -507,7 +505,6 @@ qdpn_connector_t *qdpn_connector_fd(qdpn
     c->wakeup = 0;
     c->connection = NULL;
     c->transport = pn_transport();
-    c->sasl = pn_sasl(c->transport);
     c->input_done = false;
     c->output_done = false;
     c->context = context;
@@ -553,11 +550,6 @@ void qdpn_connector_trace(qdpn_connector
     if (ctor->transport) pn_transport_trace(ctor->transport, trace);
 }
 
-pn_sasl_t *qdpn_connector_sasl(qdpn_connector_t *ctor)
-{
-    return ctor ? ctor->sasl : NULL;
-}
-
 pn_transport_t *qdpn_connector_transport(qdpn_connector_t *ctor)
 {
     return ctor ? ctor->transport : NULL;

Modified: qpid/dispatch/trunk/src/server.c
URL: 
http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/server.c?rev=1690310&r1=1690309&r2=1690310&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/server.c (original)
+++ qpid/dispatch/trunk/src/server.c Fri Jul 10 21:26:02 2015
@@ -174,10 +174,10 @@ static void thread_process_listeners(qd_
         if (!cxtr)
             continue;
 
-       char logbuf[qd_log_max_len()];
+        char logbuf[qd_log_max_len()];
 
         qd_log(qd_server->log_source, QD_LOG_DEBUG, "Accepting %s",
-              log_incoming(logbuf, sizeof(logbuf), cxtr));
+               log_incoming(logbuf, sizeof(logbuf), cxtr));
         ctx = new_qd_connection_t();
         DEQ_ITEM_INIT(ctx);
         ctx->state        = CONN_STATE_OPENING;
@@ -224,8 +224,8 @@ static void thread_process_listeners(qd_
 
         // Set up SSL if configured
         if (config->ssl_enabled) {
-           qd_log(qd_server->log_source, QD_LOG_TRACE, "Configuring SSL on %s",
-                  log_incoming(logbuf, sizeof(logbuf), cxtr));
+            qd_log(qd_server->log_source, QD_LOG_TRACE, "Configuring SSL on 
%s",
+                   log_incoming(logbuf, sizeof(logbuf), cxtr));
             if (listener_setup_ssl(config, tport) != QD_ERROR_NONE) {
                 qd_log(qd_server->log_source, QD_LOG_ERROR, "%s on %s",
                        qd_error_message(), log_incoming(logbuf, 
sizeof(logbuf), cxtr));
@@ -238,10 +238,8 @@ static void thread_process_listeners(qd_
         // Set up SASL
         //
         pn_sasl_t *sasl = pn_sasl(tport);
-        pn_sasl_mechanisms(sasl, config->sasl_mechanisms);
-        pn_sasl_server(sasl);
-        pn_sasl_allow_skip(sasl, config->allow_no_sasl);
-        pn_sasl_done(sasl, PN_SASL_OK);  // TODO - This needs to go away
+        pn_sasl_allowed_mechs(sasl, config->sasl_mechanisms);
+        pn_transport_require_auth(tport, !config->allow_no_sasl);
     }
 }
 
@@ -342,6 +340,7 @@ static int process_connector(qd_server_t
             pn_data_put_symbol(pn_connection_offered_capabilities(conn), 
pn_bytes(clen, (char*) QD_CAPABILITY_ANONYMOUS_RELAY));
             qdpn_connector_set_connection(cxtr, conn);
             pn_connection_set_context(conn, ctx);
+            pn_connection_open(conn);
             ctx->pn_conn = conn;
             ctx->state   = CONN_STATE_OPENING;
             assert(ctx->connector);
@@ -351,33 +350,38 @@ static int process_connector(qd_server_t
         }
 
         case CONN_STATE_OPENING: {
-            pn_transport_t *tport = qdpn_connector_transport(cxtr);
-            pn_sasl_t      *sasl  = pn_sasl(tport);
-
-            if (pn_sasl_outcome(sasl) == PN_SASL_OK ||
-                pn_sasl_outcome(sasl) == PN_SASL_SKIPPED) {
-                ctx->state = CONN_STATE_OPERATIONAL;
-
-                qd_conn_event_t ce = QD_CONN_EVENT_LISTENER_OPEN;
-
-                if (ctx->connector) {
-                    ce = QD_CONN_EVENT_CONNECTOR_OPEN;
-                    ctx->connector->delay = 0;
-                } else
-                    assert(ctx->listener);
-
-                qd_server->conn_handler(qd_server->conn_handler_context,
-                                        ctx->context, ce, (qd_connection_t*) 
qdpn_connector_context(cxtr));
-                events = 1;
-                break;
-            }
-            else if (pn_sasl_outcome(sasl) != PN_SASL_NONE) {
-                ctx->state = CONN_STATE_FAILED;
-                if (ctx->connector) {
-                    const qd_server_config_t *config = ctx->connector->config;
-                    qd_log(qd_server->log_source, QD_LOG_TRACE, "Connection to 
%s:%s failed", config->host, config->port);
+            qd_connection_t *qd_conn   = (qd_connection_t*) 
qdpn_connector_context(cxtr);
+            pn_collector_t  *collector = qd_connection_collector(qd_conn);
+            pn_event_t      *event;
+
+            events = 0;
+            event = pn_collector_peek(collector);
+            while (event) {
+                if (pn_event_type(event) == PN_CONNECTION_REMOTE_OPEN) {
+                    ctx->state = CONN_STATE_OPERATIONAL;
+                    qd_conn_event_t ce = QD_CONN_EVENT_LISTENER_OPEN;
+
+                    if (ctx->connector) {
+                        ce = QD_CONN_EVENT_CONNECTOR_OPEN;
+                        ctx->connector->delay = 0;
+                    } else
+                        assert(ctx->listener);
+
+                    qd_server->conn_handler(qd_server->conn_handler_context,
+                                            ctx->context, ce, 
(qd_connection_t*) qdpn_connector_context(cxtr));
+                    events = 1;
+                    break;  // Break without popping this event.  It will be 
re-processed in OPERATIONAL state.
+                } else if (pn_event_type(event) == PN_TRANSPORT_ERROR) {
+                    ctx->state = CONN_STATE_FAILED;
+                    if (ctx->connector) {
+                        const qd_server_config_t *config = 
ctx->connector->config;
+                        qd_log(qd_server->log_source, QD_LOG_TRACE, 
"Connection to %s:%s failed", config->host, config->port);
+                    }
                 }
+                pn_collector_pop(collector);
+                event = pn_collector_peek(collector);
             }
+            break;
         }
 
         case CONN_STATE_OPERATIONAL:
@@ -829,8 +833,9 @@ static void cxtr_try_open(void *context)
     // Set up SASL
     //
     pn_sasl_t *sasl = pn_sasl(tport);
-    pn_sasl_mechanisms(sasl, config->sasl_mechanisms);
-    pn_sasl_client(sasl);
+    pn_sasl_allowed_mechs(sasl, config->sasl_mechanisms);
+    pn_transport_require_auth(tport, !config->allow_no_sasl);
+
     ctx->owner_thread = CONTEXT_NO_OWNER;
 }
 

Modified: qpid/dispatch/trunk/tests/system_test.py
URL: 
http://svn.apache.org/viewvc/qpid/dispatch/trunk/tests/system_test.py?rev=1690310&r1=1690309&r2=1690310&view=diff
==============================================================================
--- qpid/dispatch/trunk/tests/system_test.py (original)
+++ qpid/dispatch/trunk/tests/system_test.py Fri Jul 10 21:26:02 2015
@@ -305,7 +305,7 @@ class Qdrouterd(Process):
         """
 
         DEFAULTS = {
-            'listener':{'addr':'0.0.0.0', 'saslMechanisms':'ANONYMOUS'},
+            'listener':{'addr':'0.0.0.0', 'saslMechanisms':'ANONYMOUS', 
'allowNoSasl': True},
             'connector':{'addr':'127.0.0.1', 'saslMechanisms':'ANONYMOUS', 
'role':'on-demand'},
             'container':{'debugDump':"qddebug.txt"}
         }

Modified: qpid/dispatch/trunk/tests/system_tests_management.py
URL: 
http://svn.apache.org/viewvc/qpid/dispatch/trunk/tests/system_tests_management.py?rev=1690310&r1=1690309&r2=1690310&view=diff
==============================================================================
--- qpid/dispatch/trunk/tests/system_tests_management.py (original)
+++ qpid/dispatch/trunk/tests/system_tests_management.py Fri Jul 10 21:26:02 
2015
@@ -167,7 +167,7 @@ class ManagementTest(system_test.TestCas
 
         port = self.get_port()
         # Note qdrouter schema defines port as string not int, since it can be 
a service name.
-        attributes = {'name':'foo', 'port':str(port), 'role':'normal', 
'saslMechanisms': 'ANONYMOUS'}
+        attributes = {'name':'foo', 'port':str(port), 'role':'normal', 
'saslMechanisms': 'ANONYMOUS', 'allowNoSasl': True}
         entity = self.assert_create_ok(LISTENER, 'foo', attributes)
         self.assertEqual(entity['name'], 'foo')
         self.assertEqual(entity['addr'], '127.0.0.1')



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to