blob: d4fc2b25f0a2231adc25af41a4ed2e32878e875d [file] [log] [blame]
#ifndef __policy_h__
#define __policy_h__
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include "qpid/dispatch.h"
#include "qpid/dispatch/server.h"
#include "qpid/dispatch/ctools.h"
#include "qpid/dispatch/static_assert.h"
#include "config.h"
#include "alloc.h"
#include "entity.h"
#include "entity_cache.h"
#include <dlfcn.h>
typedef struct qd_policy_denial_counts_s qd_policy_denial_counts_t;
// TODO: Provide locking
struct qd_policy_denial_counts_s {
int sessionDenied;
int senderDenied;
int receiverDenied;
int dynamicSrcDenied;
int anonymousSenderDenied;
int linkSourceDenied;
int linkTargetDenied;
};
typedef struct qd_policy_t qd_policy_t;
struct qd_policy__settings_s {
int maxFrameSize;
int maxMessageSize;
int maxSessionWindow;
int maxSessions;
int maxSenders;
int maxReceivers;
bool allowDynamicSrc;
bool allowAnonymousSender;
char *sources;
char *targets;
qd_policy_denial_counts_t *denialCounts;
};
typedef struct qd_policy__settings_s qd_policy_settings_t;
/** Configure the C policy entity from the settings in qdrouterd.conf["policy"]
* Called python-to-C during config processing.
* @param[in] policy pointer to the policy
* @param[in] entity pointer to the managed entity
* @return error or not. If error then the policy is freed.
**/
qd_error_t qd_entity_configure_policy(qd_policy_t *policy, qd_entity_t *entity);
/** Memorize the address of python policy_manager object.
* This python object gets called by C to execute user lookups
* @param[in] policy pointer to the policy
* @param[in] policy_manager the address of the policy_manager object
**/
qd_error_t qd_register_policy_manager(qd_policy_t *policy, void *policy_manager);
/** Allocate counts statistics block.
* Called from Python
*/
long qd_policy_c_counts_alloc();
/** Free counts statistics block.
* Called from Python
*/
void qd_policy_c_counts_free(long ccounts);
/** Refresh a counts statistics block
* Called from Python
*/
qd_error_t qd_policy_c_counts_refresh(long ccounts, qd_entity_t*entity);
/** Allow or deny an incoming connection based on connection count(s).
* A server listener has just accepted a socket.
* Allow or deny this connection based on the absolute number
* of allowed connections.
* The identity of the connecting user has not been negotiated yet.
* @param[in] context the current policy
* @param[in] name the connector name
* @return the connection is allowed or not
**/
bool qd_policy_socket_accept(void *context, const char *hostname);
/** Record a closing connection.
* A server listener is closing a socket.
* Release the counted connection against provisioned limits
*
* @param[in] context the current policy
* @param[in] conn qd_connection
**/
void qd_policy_socket_close(void *context, const qd_connection_t *conn);
/** Approve a new session based on connection's policy.
* Sessions denied are closed and counted.
*
* @param[in] ssn proton session being approved
* @param[in] qd_conn dispatch connection with policy settings and counts
**/
bool qd_policy_approve_amqp_session(pn_session_t *ssn, qd_connection_t *qd_conn);
/** Apply policy or default settings for a new session.
*
* @param[in] ssn proton session being set
* @param[in] qd_conn dispatch connection with policy settings and counts
**/
void qd_policy_apply_session_settings(pn_session_t *ssn, qd_connection_t *qd_conn);
/** Approve a new sender link based on connection's policy.
* Links denied are closed and counted.
*
* @param[in] pn_link proton link being approved
* @param[in] qd_conn dispatch connection with policy settings and counts
**/
bool qd_policy_approve_amqp_sender_link(pn_link_t *pn_link, qd_connection_t *qd_conn);
/** Approve a new receiver link based on connection's policy.
* Links denied are closed and counted.
*
* @param[in] pn_link proton link being approved
* @param[in] qd_conn dispatch connection with policy settings and counts
**/
bool qd_policy_approve_amqp_receiver_link(pn_link_t *pn_link, qd_connection_t *qd_conn);
/** Allow or deny an incoming connection.
* An Open performative was received over a new connection.
* Consult local policy to determine if this host/user is
* allowed to make this connection.
* Denied pn_connections are closed with a condition.
* Allowed connections are signaled through qd_connection_manager.
* This function is called from the deferred queue.
* @param[in] context a qd_connection_t object
* @param[in] discard callback switch
**/
void qd_policy_amqp_open(void *context, bool discard);
#endif