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

qpid-dispatch git commit: Apply client's view of Attach event handling. Add denials by link name, dynamic source, and anonymous sender policy.

Repository: qpid-dispatch
Updated Branches:
  refs/heads/crolke-DISPATCH-188-1 1aea48edc -> 0c42e76b6


Apply client's view of Attach event handling.
Add denials by link name, dynamic source, and anonymous sender policy.


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

Branch: refs/heads/crolke-DISPATCH-188-1
Commit: 0c42e76b6fa85797a5fd15cea83698e8a077ddd7
Parents: 1aea48e
Author: Chuck Rolke <cr...@redhat.com>
Authored: Wed Mar 23 17:44:44 2016 -0400
Committer: Chuck Rolke <cr...@redhat.com>
Committed: Wed Mar 23 17:44:44 2016 -0400

----------------------------------------------------------------------
 src/container.c |  4 ++--
 src/policy.c    | 64 +++++++++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 63 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0c42e76b/src/container.c
----------------------------------------------------------------------
diff --git a/src/container.c b/src/container.c
index a7bd1ee..db31492 100644
--- a/src/container.c
+++ b/src/container.c
@@ -396,7 +396,7 @@ int pn_event_handler(void *handler_context, void *conn_context, pn_event_t *even
         if (pn_link_state(pn_link) & PN_LOCAL_UNINIT) {
             if (pn_link_is_sender(pn_link)) {
                if (qd_conn->policy_settings) {
-                   if (!qd_policy_approve_amqp_sender_link(pn_link, qd_conn)) {
+                   if (!qd_policy_approve_amqp_receiver_link(pn_link, qd_conn)) {
                         break;
                     }
                     qd_conn->n_senders++;
@@ -404,7 +404,7 @@ int pn_event_handler(void *handler_context, void *conn_context, pn_event_t *even
                 setup_outgoing_link(container, pn_link);
             } else {
                 if (qd_conn->policy_settings) {
-                    if (!qd_policy_approve_amqp_receiver_link(pn_link, qd_conn)) {
+                    if (!qd_policy_approve_amqp_sender_link(pn_link, qd_conn)) {
                         break;
                     }
                     qd_conn->n_receivers++;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/0c42e76b/src/policy.c
----------------------------------------------------------------------
diff --git a/src/policy.c b/src/policy.c
index 0cb96b3..58967ef 100644
--- a/src/policy.c
+++ b/src/policy.c
@@ -565,7 +565,7 @@ bool _qd_policy_approve_link_name(const char *username, const char *allowed, con
             result = true;
             break;
         }
-	int matchlen = p_len;
+        int matchlen = p_len;
         int len = strlen(tok);
         if (tok[len-1] == QPALN_WILDCARD) {
             matchlen = len - 1;
@@ -591,6 +591,9 @@ bool _qd_policy_approve_link_name(const char *username, const char *allowed, con
 //
 bool qd_policy_approve_amqp_sender_link(pn_link_t *pn_link, qd_connection_t *qd_conn)
 {
+    pn_connection_t *conn = qd_connection_pn(qd_conn);
+    pn_transport_t *pn_trans = pn_connection_transport(conn);
+    const char *username = pn_transport_get_user(pn_trans);
     if (qd_conn->policy_settings->maxSenders) {
         if (qd_conn->n_senders == qd_conn->policy_settings->maxSenders) {
             // Max sender limit specified and violated.
@@ -602,13 +605,42 @@ bool qd_policy_approve_amqp_sender_link(pn_link_t *pn_link, qd_connection_t *qd_
     } else {
         // max sender limit not specified
     }
-    // TODO: Deny sender link based on target
+    // Deny sender link based on target
+    const char * target = pn_terminus_get_address(pn_link_remote_target(pn_link));
+    bool lookup;
+    if (target && *target) {
+        // a target is specified
+        lookup = _qd_policy_approve_link_name(username, qd_conn->policy_settings->targets, target);
+
+        qd_log(qd_conn->server->qd->policy->log_source, QD_LOG_TRACE,
+            "Approve sender link '%s' for user '%s': %s",
+            target, username, (lookup ? "ALLOW" : "DENY"));
+
+        if (!lookup) {
+            _qd_policy_deny_amqp_receiver_link(pn_link, qd_conn);
+            return false;
+        }
+    } else {
+        // A sender with no remote target.
+        // This happens all the time with anonymous relay
+        lookup = qd_conn->policy_settings->allowAnonymousSender;
+        qd_log(qd_conn->server->qd->policy->log_source, QD_LOG_TRACE,
+            "Approve anonymous sender for user '%s': %s",
+            username, (lookup ? "ALLOW" : "DENY"));
+        if (!lookup) {
+            _qd_policy_deny_amqp_receiver_link(pn_link, qd_conn);
+            return false;
+        }
+    }
     return true;
 }
 
 
 bool qd_policy_approve_amqp_receiver_link(pn_link_t *pn_link, qd_connection_t *qd_conn)
 {
+    pn_connection_t *conn = qd_connection_pn(qd_conn);
+    pn_transport_t *pn_trans = pn_connection_transport(conn);
+    const char *username = pn_transport_get_user(pn_trans);
     if (qd_conn->policy_settings->maxReceivers) {
         if (qd_conn->n_receivers == qd_conn->policy_settings->maxReceivers) {
             // Max sender limit specified and violated.
@@ -620,7 +652,33 @@ bool qd_policy_approve_amqp_receiver_link(pn_link_t *pn_link, qd_connection_t *q
     } else {
         // max receiver limit not specified
     }
-    // TODO: Deny receiver link based on source
+    // Deny receiver link based on source
+    bool dynamic_src = pn_terminus_is_dynamic(pn_link_remote_source(pn_link));
+    if (dynamic_src) {
+        bool lookup = qd_conn->policy_settings->allowDynamicSrc;
+        qd_log(qd_conn->server->qd->policy->log_source, QD_LOG_TRACE,
+            "Approve dynamic source for user '%s': %s",
+            username, (lookup ? "ALLOW" : "DENY"));
+        // Dynamic source policy rendered the decision
+        return lookup;
+    }
+    const char * source = pn_terminus_get_address(pn_link_remote_source(pn_link));
+    if (source && *source) {
+        // a source is specified
+        bool lookup = _qd_policy_approve_link_name(username, qd_conn->policy_settings->sources, source);
+
+        qd_log(qd_conn->server->qd->policy->log_source, QD_LOG_TRACE,
+            "Approve receiver link '%s' for user '%s': %s",
+            source, username, (lookup ? "ALLOW" : "DENY"));
+
+        if (!lookup) {
+            _qd_policy_deny_amqp_receiver_link(pn_link, qd_conn);
+            return false;
+        }
+    } else {
+        // HACK ALERT: A receiver with no remote source.
+        // This happens all the time with dynamic source
+    }
     return true;
 }
 


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