#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 "qpid/dispatch/alloc.h"

#include "config.h"
#include "entity.h"
#include "entity_cache.h"
#include "parse_tree.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;
};

typedef struct qd_policy_t qd_policy_t;

struct qd_policy__settings_s {
    int  maxFrameSize;
    int  maxSessionWindow;
    int  maxSessions;
    int  maxSenders;
    int  maxReceivers;
    bool allowDynamicSource;
    bool allowAnonymousSender;
    bool allowUserIdProxy;
    bool allowWaypointLinks;
    bool allowFallbackLinks;
    bool allowDynamicLinkRoutes;
    bool allowAdminStatusUpdate;
    bool outgoingConnection;
    char *sources;
    char *targets;
    char *sourcePattern;
    char *targetPattern;
    qd_parse_tree_t *sourceParseTree;
    qd_parse_tree_t *targetParseTree;
    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(qd_policy_t *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(qd_policy_t *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.
 **/
void qd_policy_amqp_open(qd_connection_t *conn);


/** Allow or deny an outgoing connector 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.
 **/
void qd_policy_amqp_open_connector(qd_connection_t *conn);


/** Dispose of policy settings
 * 
 * @param settings the settings to be destroyed
 */
void qd_policy_settings_free(qd_policy_settings_t *settings);

/** Approve link by source/target name.
 * @param[in] username authenticated user name
 * @param[in] settings policy settings
 * @param[in] proposed the link target name to be approved
 * @param[in] isReceiver indication to check using receiver settings
 */
bool qd_policy_approve_link_name(const char *username,
                                  const qd_policy_settings_t *settings,
                                  const char *proposed,
                                  bool isReceiver
                                );

/** Add a hostname to the lookup parse_tree
 * Note that the parse_tree may store an 'optimised' pattern for a given
 * pattern. Thus the patterns a user puts in may collide with existing
 * patterns even though the text of the host patterns is different.
 * This function does not allow new patterns with thier optimizations 
 * to overwrite existing patterns that may have been optimised.
 * @param[in] policy qd_policy_t
 * @param[in] hostPattern the hostname pattern with possible parse_tree wildcards
 * @return True if the possibly optimised pattern was added to the lookup parse tree
 */
bool qd_policy_host_pattern_add(qd_policy_t *policy, const char *hostPattern);

/** Remove a hostname from the lookup parse_tree
 * @param[in] policy qd_policy_t
 * @param[in] hostPattern the hostname pattern with possible parse_tree wildcards
 */
void qd_policy_host_pattern_remove(qd_policy_t *policy, const char *hostPattern);

/** Look up a hostname in the lookup parse_tree
 * @param[in] policy qd_policy_t
 * @param[in] hostname a concrete vhost name
 * @return the name of the ruleset whose hostname pattern matched this actual hostname
 */
char * qd_policy_host_pattern_lookup(qd_policy_t *policy, const char *hostPattern);

/**
 * Compile raw CSV spec of allowed sources/targets and return
 * the string of tuples used by policy runtime.
 * The returned string is allocated here and freed by the caller.
 * This function does no error checking or logging.
 *
 * @param[in] csv the CSV allowed list
 * @return the ruleset string to be used in policy settings.
 */
char * qd_policy_compile_allowed_csv(char * csv);
/**
 * Approve sending of message on anonymous link based on connection's policy.
 *
 * @param[in] address the address from the message 'to' field
 * @param[in] qd_conn dispatch connection with policy settings
 */
bool qd_policy_approve_message_target(qd_iterator_t *address, qd_connection_t *qd_conn);
#endif
