You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2018/03/20 08:02:23 UTC

[4/4] qpid-proton git commit: PROTON-1589: [C++ binding] Stop reconnect attempts on authorization failure

PROTON-1589: [C++ binding] Stop reconnect attempts on authorization failure


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/95776152
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/95776152
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/95776152

Branch: refs/heads/master
Commit: 95776152d50e856ed75f093c560b8e09006e7262
Parents: dfa23e3
Author: Andrew Stitcher <as...@apache.org>
Authored: Fri Mar 16 18:19:42 2018 -0400
Committer: Andrew Stitcher <as...@apache.org>
Committed: Tue Mar 20 03:29:58 2018 -0400

----------------------------------------------------------------------
 .../bindings/cpp/src/proactor_container_impl.cpp  |  8 ++++++--
 proton-c/src/sasl/cyrus_sasl.c                    | 18 ++++++++++++++----
 2 files changed, 20 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/95776152/proton-c/bindings/cpp/src/proactor_container_impl.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/proactor_container_impl.cpp b/proton-c/bindings/cpp/src/proactor_container_impl.cpp
index c5f46ed..f865a16 100644
--- a/proton-c/bindings/cpp/src/proactor_container_impl.cpp
+++ b/proton-c/bindings/cpp/src/proactor_container_impl.cpp
@@ -310,10 +310,14 @@ bool container::impl::setup_reconnect(pn_connection_t* pnc) {
 
     const reconnect_options::impl& roi = *rc->reconnect_options_->impl_;
 
+    pn_transport_t* t = pn_connection_transport(pnc);
+    pn_condition_t* condition = pn_transport_condition(t);
+
+    // If we failed to authenticate then don't reconnect any more and just fail
+    if ( !strcmp(pn_condition_get_name(condition), "amqp:unauthorized-access") ) return false;
+
     // If too many reconnect attempts just fail
     if ( roi.max_attempts != 0 && rc->retries_ >= roi.max_attempts) {
-        pn_transport_t* t = pn_connection_transport(pnc);
-        pn_condition_t* condition = pn_transport_condition(t);
         pn_condition_format(condition, "proton:io", "Too many reconnect attempts (%d)", rc->retries_);
         return false;
     }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/95776152/proton-c/src/sasl/cyrus_sasl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/cyrus_sasl.c b/proton-c/src/sasl/cyrus_sasl.c
index ab6eba6..c589fab 100644
--- a/proton-c/src/sasl/cyrus_sasl.c
+++ b/proton-c/src/sasl/cyrus_sasl.c
@@ -92,18 +92,28 @@ const pnx_sasl_implementation * const cyrus_sasl_impl = &sasl_impl;
 
 static const char *amqp_service = "amqp";
 
-static bool pni_check_sasl_result(sasl_conn_t *conn, int r, pn_transport_t *logger)
+static inline bool pni_check_result(sasl_conn_t *conn, int r, pn_transport_t *logger, const char* condition_name)
 {
     if (r==SASL_OK) return true;
 
     const char* err = conn ? sasl_errdetail(conn) : sasl_errstring(r, NULL, NULL);
     pnx_sasl_logf(logger, "sasl error: %s", err);
     pn_condition_t* c = pn_transport_condition(logger);
-    pn_condition_set_name(c, "proton:io:sasl_error");
+    pn_condition_set_name(c, condition_name);
     pn_condition_set_description(c, err);
     return false;
 }
 
+static bool pni_check_io_result(sasl_conn_t *conn, int r, pn_transport_t *logger)
+{
+    return pni_check_result(conn, r, logger, "proton:io:sasl_error");
+}
+
+static bool pni_check_sasl_result(sasl_conn_t *conn, int r, pn_transport_t *logger)
+{
+    return pni_check_result(conn, r, logger, "amqp:unauthorized-access");
+}
+
 // Cyrus wrappers
 static void pni_cyrus_interact(pn_transport_t *transport, sasl_interact_t *interact)
 {
@@ -565,7 +575,7 @@ ssize_t cyrus_sasl_encode(pn_transport_t *transport, pn_bytes_t in, pn_bytes_t *
   unsigned int outlen;
   int r = sasl_encode(cyrus_conn, in.start, in.size, &output, &outlen);
   if (outlen==0) return 0;
-  if ( pni_check_sasl_result(cyrus_conn, r, transport) ) {
+  if ( pni_check_io_result(cyrus_conn, r, transport) ) {
     *out = pn_bytes(outlen, output);
     return outlen;
   }
@@ -580,7 +590,7 @@ ssize_t cyrus_sasl_decode(pn_transport_t *transport, pn_bytes_t in, pn_bytes_t *
   unsigned int outlen;
   int r = sasl_decode(cyrus_conn, in.start, in.size, &output, &outlen);
   if (outlen==0) return 0;
-  if ( pni_check_sasl_result(cyrus_conn, r, transport) ) {
+  if ( pni_check_io_result(cyrus_conn, r, transport) ) {
     *out = pn_bytes(outlen, output);
     return outlen;
   }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org