You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gs...@apache.org on 2017/05/25 22:24:01 UTC
[2/4] qpid-proton git commit: further WIP
further WIP
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/52e75d97
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/52e75d97
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/52e75d97
Branch: refs/heads/PROTON-1488
Commit: 52e75d979a98fd67677943da84c496f1490ac99f
Parents: 4894265
Author: Gordon Sim <gs...@redhat.com>
Authored: Wed May 17 20:31:30 2017 +0100
Committer: Gordon Sim <gs...@redhat.com>
Committed: Thu May 25 14:44:45 2017 +0100
----------------------------------------------------------------------
proton-c/include/proton/proactor.h | 1 +
proton-c/src/sasl/remote_sasl.c | 70 ++++++++++++++++++++++++---------
2 files changed, 53 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/52e75d97/proton-c/include/proton/proactor.h
----------------------------------------------------------------------
diff --git a/proton-c/include/proton/proactor.h b/proton-c/include/proton/proactor.h
index 5dd16f9..761fb86 100644
--- a/proton-c/include/proton/proactor.h
+++ b/proton-c/include/proton/proactor.h
@@ -286,6 +286,7 @@ PNP_EXTERN pn_proactor_t *pn_event_proactor(pn_event_t *event);
PNP_EXTERN pn_millis_t pn_proactor_now(void);
PNP_EXTERN void pn_use_remote_authentication_service(const char* address);
+PNP_EXTERN bool pn_is_authentication_service_connection(pn_connection_t* conn);
/**
* @defgroup proactor_events Events
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/52e75d97/proton-c/src/sasl/remote_sasl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/remote_sasl.c b/proton-c/src/sasl/remote_sasl.c
index 9ef3484..54a96e5 100644
--- a/proton-c/src/sasl/remote_sasl.c
+++ b/proton-c/src/sasl/remote_sasl.c
@@ -96,6 +96,39 @@ void release_pni_sasl_relay_t(pni_sasl_relay_t* instance)
}
}
+PN_HANDLE(REMOTE_SASL_CTXT)
+
+bool pn_is_authentication_service_connection(pn_connection_t* conn)
+{
+ if (conn) {
+ pn_record_t *r = pn_connection_attachments(conn);
+ return pn_record_has(r, REMOTE_SASL_CTXT);
+ } else {
+ return false;
+ }
+}
+
+pni_sasl_relay_t* get_sasl_relay_context(pn_connection_t* conn)
+{
+ if (conn) {
+ pn_record_t *r = pn_connection_attachments(conn);
+ if (pn_record_has(r, REMOTE_SASL_CTXT)) {
+ return (pni_sasl_relay_t*) pn_record_get(r, REMOTE_SASL_CTXT);
+ } else {
+ return NULL;
+ }
+ } else {
+ return NULL;
+ }
+}
+
+void set_sasl_relay_context(pn_connection_t* conn, pni_sasl_relay_t* context)
+{
+ pn_record_t *r = pn_connection_attachments(conn);
+ pn_record_def(r, REMOTE_SASL_CTXT, PN_VOID);
+ pn_record_set(r, REMOTE_SASL_CTXT, context);
+}
+
bool remote_init_server(pn_transport_t* transport)
{
pn_connection_t* upstream = pn_transport_connection(transport);
@@ -103,6 +136,7 @@ bool remote_init_server(pn_transport_t* transport)
if (transport->sasl->impl_context) {
return true;
}
+ pn_connection_open(upstream);
pni_sasl_relay_t* impl = new_pni_sasl_relay_t();
transport->sasl->impl_context = impl;
impl->upstream = upstream;
@@ -110,10 +144,8 @@ bool remote_init_server(pn_transport_t* transport)
if (!proactor) return false;
impl->downstream = pn_connection();
pn_connection_set_hostname(impl->downstream, pn_connection_get_hostname(upstream));
- //do I need to explicitly set up sasl? if so how? need to handle connection_bound?
- //for now just fake it with dummy user
- pn_connection_set_user(impl->downstream, "dummy");
- pn_connection_set_context(impl->downstream, transport->sasl->impl_context);//TODO: use record?
+ pn_connection_set_user(impl->downstream, "dummy");//force sasl
+ set_sasl_relay_context(impl->downstream, impl);
pn_proactor_connect(proactor, impl->downstream, authentication_service_address);
return true;
@@ -128,9 +160,15 @@ bool remote_init_client(pn_transport_t* transport)
//service, need to use the same context as the server side of the
//connection it is authenticating on behalf of
pn_connection_t* conn = pn_transport_connection(transport);
- transport->sasl->impl_context = pn_connection_get_context(conn);
- ((pni_sasl_relay_t*) transport->sasl->impl_context)->refcount++;
- return true;
+ pni_sasl_relay_t* impl = get_sasl_relay_context(conn);
+ if (impl) {
+ transport->sasl->impl_context = impl;
+ impl->refcount++;
+ return true;
+ } else {
+ return false;
+ //return pni_init_client(transport);
+ }
}
bool remote_free(pn_transport_t *transport)
@@ -180,11 +218,9 @@ bool remote_process_mechanisms(pn_transport_t *transport, const char *mechs)
{
pni_sasl_relay_t* impl = (pni_sasl_relay_t*) transport->sasl->impl_context;
if (impl) {
- if (impl->upstream_state != DOWNSTREAM_MECHANISMS_RECEIVED) {
- impl->mechlist = pn_strdup(mechs);
- impl->upstream_state = DOWNSTREAM_MECHANISMS_RECEIVED;
- pn_connection_wake(impl->upstream);
- }
+ impl->mechlist = pn_strdup(mechs);
+ impl->upstream_state = DOWNSTREAM_MECHANISMS_RECEIVED;
+ pn_connection_wake(impl->upstream);
return true;
} else {
return false;
@@ -195,7 +231,7 @@ bool remote_process_mechanisms(pn_transport_t *transport, const char *mechs)
void remote_process_challenge(pn_transport_t *transport, const pn_bytes_t *recv)
{
pni_sasl_relay_t* impl = (pni_sasl_relay_t*) transport->sasl->impl_context;
- if (impl && impl->upstream_state != DOWNSTREAM_CHALLENGE_RECEIVED) {
+ if (impl) {
pni_copy_bytes(recv, &(impl->challenge));
impl->upstream_state = DOWNSTREAM_CHALLENGE_RECEIVED;
pn_connection_wake(impl->upstream);
@@ -207,11 +243,9 @@ bool remote_process_outcome(pn_transport_t *transport)
{
pni_sasl_relay_t* impl = (pni_sasl_relay_t*) transport->sasl->impl_context;
if (impl) {
- if (impl->upstream_state != DOWNSTREAM_OUTCOME_RECEIVED) {
- impl->outcome = transport->sasl->outcome;
- impl->upstream_state = DOWNSTREAM_OUTCOME_RECEIVED;
- pn_connection_wake(impl->upstream);
- }
+ impl->outcome = transport->sasl->outcome;
+ impl->upstream_state = DOWNSTREAM_OUTCOME_RECEIVED;
+ pn_connection_wake(impl->upstream);
return true;
} else {
return false;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org