/*
 * Program: Synonym
 * File: config.h
 * Author: Ionut Nistor
 * Date: 20 Feb 2003
 *
 * $Id: config.h,v 1.5 2004/01/19 09:24:31 diciu Exp $
 *
 * Licensed under the Modulo Consulting Software License
 * (see file license.txt)
 * 
 */

#ifndef _CONFIG_INCLUDED
#define _CONFIG_INCLUDED

#include <sys/types.h>
#include <regex.h>

#include "synonym.h"



/* Names for the tags in the config file */
/* These are case insensitive */

#define TAG_RULES "Rules"
#define TAG_RULE "Rule"
#define TAG_CONDITION "Condition"
#define TAG_ACTION "Action"
#define TAG_HEADER "Header"
#define TAG_FROM "EnvFrom"
#define TAG_TO "EnvTo"
#define TAG_MATCH "Match"
#define TAG_ACTIONTYPE "ActionType"
#define TAG_ACTIONADDRESS "Address"
#define TAG_HTML_DISCLAIMER "HtmlDisclaimer"
#define TAG_TEXT_DISCLAIMER "TextDisclaimer"

/* Some definitions for the matching criteria */
#define MAX_FIELD_SIZE 255
#define MAX_REGEXP_SIZE 255

/* Some definitions for the actions */
#define MAX_ACTION_CUSTOMFIELD_SIZE 255
#define MAX_DISCLAIMER_SIZE 2048


/* For some specific custom fields in actions */
#define MAX_SMTP_REPLY_SIZE 64

/* Synonym criteria - chain of criteria that synonym will use in order decide which actions to perform */
typedef struct _tag_synonym_condition {
	char header_field[MAX_FIELD_SIZE+1]; /* The header whose value will be matched against the regexp */ 
	char header_regexp[MAX_REGEXP_SIZE+1]; /* Value to be matched against the header value */
	regex_t header_compiled_regexp;
	char env_from_condition[MAX_REGEXP_SIZE+1];
	regex_t env_from_compiled_regexp;
	char env_to_condition[MAX_REGEXP_SIZE+1];
	regex_t env_to_compiled_regexp;
	
	struct _tag_synonym_condition *next;
} synonym_condition;



/* Specific actions for synonym. The first one defines the 'void' or uninitialized action */
#define ACTION_NONE 0
#define ACTION_COPY 1
#define ACTION_DELETE 2
#define ACTION_REJECT 3
#define ACTION_DISCLAIMER 4

/* Action names - for use in the configuration file */
#define ACTIONNAME_COPY "Copy"
#define ACTIONNAME_DELETE "Delete"
#define ACTIONNAME_REJECT "Reject"
#define ACTIONNAME_DISCLAIMER "Disclaimer"

/* Action structure */
typedef struct {
	int action_type; /* Defined from a fixed set of actions (integer) - see above */
	char action_custom_field[MAX_ACTION_CUSTOMFIELD_SIZE+1]; /* Depending on the action, this field may be used (i.e. for the 'copy' action, this field will contain the email address) */
	char action_text_disclaimer[MAX_DISCLAIMER_SIZE+1];
	char action_html_disclaimer[MAX_DISCLAIMER_SIZE+1];
} synonym_action;

/* Used for processing of the rules - a chain of matched_actions structures will be yielded by the parse function */
typedef struct _tag_matched_action {
	synonym_action action;
	struct _tag_matched_action *next;
} matched_action;

/* Synonym rule definition - structure will be linked-type */
typedef struct _tag_synonym_rule {
	synonym_condition *conditions;
	synonym_action action;
	struct _tag_synonym_rule *next;
} synonym_rule;


/* Synonym configuration parameters (will be read from a file)*/
/* !! All processes accessing this structure should lock it (mutex) otherwise serious problems may appear while reloading the configuration !! */
typedef struct {
	synonym_rule *rules;
} _type_synonym_config;


/* Get the parameters from the configuration file
 * Input parms:
 * - name of the configuration file
 * - structure containing the config data
 */
sresult Synonym_Get_Config(char *configfile, _type_synonym_config *config);


/* Free the configuration structure (rules and conditions, which are allocated dynamically) */
void Synonym_Free_Config(_type_synonym_config *config);

/* Reload the Synonym configuration file - probably called from a signal handler */
sresult Synonym_Reload_Config(char *configfile, _type_synonym_config *config);

#endif


syntax highlighted by Code2HTML, v. 0.9.1