Mercurial > dnsbl
diff src/context.h @ 71:dd21c8e13074
start coding on new config syntax
author | carl |
---|---|
date | Sat, 09 Jul 2005 19:24:41 -0700 |
parents | |
children | 2b369f7db7bf |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/context.h Sat Jul 09 19:24:41 2005 -0700 @@ -0,0 +1,149 @@ +#include "tokenizer.h" +#include <map> + + +enum status {oksofar, // not rejected yet + white, // whitelisted + black, // blacklisted + reject, // rejected by a dns list + reject_tag, // too many bad html tags + reject_host}; // too many hosts/urls in body + +class DNSBL; +class CONTEXT; + +typedef map<char *, char *, ltstr> string_map; +typedef set<int> int_set; +typedef list<char *> string_list; +typedef DNSBL * DNSBLP; +typedef list<DNSBLP> dnsblp_list; +typedef map<char *, DNSBLP, ltstr> dnsblp_map; +typedef CONTEXT * CONTEXTP; +typedef list<CONTEXTP> context_list; +typedef map<char *, CONTEXTP, ltstr> context_map; +typedef map<char *, int, ltstr> ns_mapper; + +struct DNSBL { + char *name; // nickname for this dns based list + char *suffix; // blacklist suffix like blackholes.five-ten-sg.com + char *message; // error message with one or two %s operators for the ip address replacement + DNSBL(char *n, char *s, char *m); +}; + +class CONTEXT { + CONTEXTP parent; + char * name; + context_map children; // map child context names to their contexts + string_set env_to; // + string_map env_from; // map senders to white/black/unknown + context_map env_from_context; // map senders to a child context + char * env_from_default; // default value for senders that are not found in the map white/black/unknown/inherit + bool content_filtering; // + char * content_suffix; // for sbl url body filtering + char * content_message; // "" + string_set content_host_ignore;// hosts to ignore for content sbl checking + string_set content_tlds; // + string_set html_tags; // set of valid html tags + int host_limit; // limit on host names + char * host_limit_message; // error message for excessive host names + bool host_random; // pick a random selection of host names rather than error for excessive hosts + int tag_limit; // limit on bad html tags + char * tag_limit_message; // error message for excessive bad html tags + dnsblp_map dnsbl_names; // name to dnsbl mapping for lists that are available in this context and children + dnsblp_list dnsbl_list; // list of dnsbls to be used in this context + +public: + CONTEXT(CONTEXTP parent_, char *name_); + ~CONTEXT(); + CONTEXTP get_parent() {return parent;}; + char* get_full_name(char *buf, int size); + void add_context(CONTEXTP child) {children[child->name] = child;}; + bool allow_env_to(char *to) {return (parent) ? parent->cover_env_to(to) : true;}; + bool cover_env_to(char *to); + + void add_to(char *to) {env_to.insert(to);}; + void add_from(char *from, char *status) {env_from[from] = status;}; + void add_from_context(char *from, CONTEXTP con) {env_from_context[from] = con;}; + void set_from_default(char *status) {env_from_default = status;}; + char* find_from(char *from); + CONTEXTP find_from_context(char *from); + CONTEXTP find_from_context_name(char *name); + + void set_content_filtering(bool filter) {content_filtering = filter;}; + void set_content_suffix(char *suffix) {content_suffix = suffix;}; + void set_content_message(char *message) {content_message = message;}; + void add_ignore(char *host) {content_host_ignore.insert(host);}; + void add_tld(char *tld) {content_tlds.insert(tld);}; + + void set_host_limit(int limit) {host_limit = limit;}; + void set_host_message(char *message) {host_limit_message = message;}; + void set_host_random(bool random) {host_random = random;}; + void set_tag_limit(int limit) {tag_limit = limit;}; + void set_tag_message(char *message) {tag_limit_message = message;}; + void add_tag(char *tag) {html_tags.insert(tag);}; + + void add_dnsbl(char *name, DNSBLP dns) {dnsbl_names[name] = dns;}; + void add_dnsbl(DNSBLP dns) {dnsbl_list.push_back(dns);}; + DNSBLP find_dnsbl(char *name); + + void dump(int level = 0); +}; + + +struct CONFIG { + // the only mutable stuff once it has been loaded from the config file + int reference_count; // protected by the global config_mutex + // all the rest is constant after loading from the config file + int generation; + time_t load_time; + string_set config_files; + context_list contexts; // owns all the contexts, not just top level contexts + context_map env_to; // map recipient to a filtering context + CONTEXTP default_context;// for env_to values that don't have their own specific filtering context + + CONFIG(); + ~CONFIG(); + void add_context(CONTEXTP con); + void add_to(char *to, CONTEXTP con) {env_to[to] = con;}; + CONTEXTP find_context(char *to, char *from); + void dump(); +}; + +extern char *token_black; +extern char *token_content; +extern char *token_context; +extern char *token_dccfrom; +extern char *token_dccto; +extern char *token_default; +extern char *token_dnsbl; +extern char *token_dnsbll; +extern char *token_envfrom; +extern char *token_envto; +extern char *token_filter; +extern char *token_host_limit; +extern char *token_html_limit; +extern char *token_html_tags; +extern char *token_ignore; +extern char *token_include; +extern char *token_inherit; +extern char *token_lbrace; +extern char *token_many; +extern char *token_off; +extern char *token_ok; +extern char *token_ok2; +extern char *token_on; +extern char *token_rbrace; +extern char *token_semi; +extern char *token_soft; +extern char *token_tld; +extern char *token_unknown; +extern char *token_white; + +extern string_set all_strings; // owns all the strings, only modified by the config loader thread + +static void discard(string_set &s); +char* register_string(string_set &s, char *name); +char* register_string(char *name); +CONFIG *parse_config(char *fn); +bool load_conf(CONFIG &dc, char *fn); +void token_init();