qdr_terminus_t *qdr_terminus(pn_terminus_t *pn) { qdr_terminus_t *term = new_qdr_terminus_t(); ZERO(term); term->properties = pn_data(0); term->filter = pn_data(0); term->outcomes = pn_data(0); term->capabilities = pn_data(0); if (pn) { const char *addr = pn_terminus_get_address(pn); if (addr && *addr) term->address = qdr_field(addr); term->durability = pn_terminus_get_durability(pn); term->expiry_policy = pn_terminus_get_expiry_policy(pn); term->timeout = pn_terminus_get_timeout(pn); term->dynamic = pn_terminus_is_dynamic(pn); term->distribution_mode = pn_terminus_get_distribution_mode(pn); pn_data_copy(term->properties, pn_terminus_properties(pn)); pn_data_copy(term->filter, pn_terminus_filter(pn)); pn_data_copy(term->outcomes, pn_terminus_outcomes(pn)); pn_data_copy(term->capabilities, pn_terminus_capabilities(pn)); } return term; }
bool qd_policy_approve_amqp_receiver_link(pn_link_t *pn_link, qd_connection_t *qd_conn) { const char *hostip = qdpn_connector_hostip(qd_conn->pn_cxtr); const char *app = pn_connection_remote_hostname(qd_connection_pn(qd_conn)); if (qd_conn->policy_settings->maxReceivers) { if (qd_conn->n_receivers == qd_conn->policy_settings->maxReceivers) { // Max sender limit specified and violated. qd_log(qd_conn->server->qd->policy->log_source, QD_LOG_INFO, "DENY AMQP Attach receiver for user '%s', host '%s', app '%s' based on maxReceivers limit", qd_conn->user_id, hostip, app); _qd_policy_deny_amqp_receiver_link(pn_link, qd_conn); return false; } else { // max receiver limit not violated } } else { // max receiver limit not specified } // Approve 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, (lookup ? QD_LOG_TRACE : QD_LOG_INFO), "%s AMQP Attach receiver dynamic source for user '%s', host '%s', app '%s',", (lookup ? "ALLOW" : "DENY"), qd_conn->user_id, hostip, app); // Dynamic source policy rendered the decision if (!lookup) { _qd_policy_deny_amqp_receiver_link(pn_link, qd_conn); } 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(qd_conn->user_id, qd_conn->policy_settings->sources, source); qd_log(qd_conn->server->qd->policy->log_source, (lookup ? QD_LOG_TRACE : QD_LOG_INFO), "%s AMQP Attach receiver link '%s' for user '%s', host '%s', app '%s' based on link source name", (lookup ? "ALLOW" : "DENY"), source, qd_conn->user_id, hostip, app); if (!lookup) { _qd_policy_deny_amqp_receiver_link(pn_link, qd_conn); return false; } } else { // A receiver with no remote source. qd_log(qd_conn->server->qd->policy->log_source, QD_LOG_TRACE, "DENY AMQP Attach receiver link '' for user '%s', host '%s', app '%s'", qd_conn->user_id, hostip, app); _qd_policy_deny_amqp_receiver_link(pn_link, qd_conn); return false; } // Approved return true; }
bool terminus::dynamic() const { return pn_terminus_is_dynamic(object_); }
bool terminus::dynamic() const { return (type_t) pn_terminus_is_dynamic(pn_cast(this)); }