summaryrefslogtreecommitdiffstats
path: root/src/libserver/symbols_cache.h
blob: d2694fd047c880272b32519517200f92fa357396 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
#ifndef RSPAMD_SYMBOLS_CACHE_H
#define RSPAMD_SYMBOLS_CACHE_H

#include "config.h"
#include "radix.h"

#define MAX_SYMBOL 128

struct rspamd_task;
struct rspamd_config;

typedef void (*symbol_func_t)(struct rspamd_task *task, gpointer user_data);

struct saved_cache_item {
	gchar symbol[MAX_SYMBOL];
	double weight;
	guint32 frequency;
	double avg_time;
};

struct dynamic_map_item {
	struct in_addr addr;
	guint32 mask;
	gboolean negative;
};

struct counter_data {
	gdouble value;
	gint number;
};

struct cache_item {
	/* Static item's data */
	struct saved_cache_item *s;
	struct counter_data *cd;

	rspamd_mempool_mutex_t *mtx;

	/* For dynamic rules */
	struct dynamic_map_item *networks;
	guint32 networks_number;
	gboolean is_dynamic;

	gboolean is_skipped;

	/* Callback data */
	symbol_func_t func;
	gpointer user_data;

	/* Flags of virtual symbols */
	gboolean is_virtual;
	gboolean is_callback;

	/* Priority */
	gint priority;
	gdouble metric_weight;
};

enum rspamd_symbol_type {
	SYMBOL_TYPE_NORMAL,
	SYMBOL_TYPE_VIRTUAL,
	SYMBOL_TYPE_CALLBACK
};

struct symbols_cache {
	/* Normal cache items */
	GList *static_items;

	/* Items that have negative weights */
	GList *negative_items;

	/* Hash table for fast access */
	GHashTable *items_by_symbol;

	rspamd_mempool_t *static_pool;

	guint cur_items;
	guint used_items;
	guint uses;
	gpointer map;
	struct rspamd_config *cfg;
};

/**
 * Load symbols cache from file, must be called _after_ init_symbols_cache
 */
gboolean init_symbols_cache (rspamd_mempool_t *pool,
	struct symbols_cache *cache,
	struct rspamd_config *cfg,
	const gchar *filename,
	gboolean ignore_checksum);

/**
 * Register function for symbols parsing
 * @param name name of symbol
 * @param func pointer to handler
 * @param user_data pointer to user_data
 */
void register_symbol (struct symbols_cache **cache,
	const gchar *name,
	double weight,
	symbol_func_t func,
	gpointer user_data);


/**
 * Register virtual symbol
 * @param name name of symbol
 */
void register_virtual_symbol (struct symbols_cache **cache,
	const gchar *name,
	double weight);

/**
 * Register callback function for symbols parsing
 * @param name name of symbol
 * @param func pointer to handler
 * @param user_data pointer to user_data
 */
void register_callback_symbol (struct symbols_cache **cache,
	const gchar *name,
	double weight,
	symbol_func_t func,
	gpointer user_data);

/**
 * Register function for symbols parsing with strict priority
 * @param name name of symbol
 * @param func pointer to handler
 * @param user_data pointer to user_data
 */
void register_callback_symbol_priority (struct symbols_cache **cache,
	const gchar *name,
	double weight,
	gint priority,
	symbol_func_t func,
	gpointer user_data);

/**
 * Register function for dynamic symbols parsing
 * @param name name of symbol
 * @param func pointer to handler
 * @param user_data pointer to user_data
 */
void register_dynamic_symbol (rspamd_mempool_t *pool,
	struct symbols_cache **cache,
	const gchar *name,
	double weight,
	symbol_func_t func,
	gpointer user_data,
	GList *networks);

/**
 * Generic function to register a symbol
 * @param cache
 * @param name
 * @param weight
 * @param priority
 * @param func
 * @param user_data
 * @param type
 */
void
register_symbol_common (struct symbols_cache **cache,
	const gchar *name,
	double weight,
	gint priority,
	symbol_func_t func,
	gpointer user_data,
	enum rspamd_symbol_type type);

/**
 * Call function for cached symbol using saved callback
 * @param task task object
 * @param cache symbols cache
 * @param saved_item pointer to currently saved item
 */
gboolean call_symbol_callback (struct rspamd_task *task,
	struct symbols_cache *cache,
	gpointer *save);

/**
 * Remove all dynamic rules from cache
 * @param cache symbols cache
 */
void remove_dynamic_rules (struct symbols_cache *cache);

/**
 * Validate cache items agains theirs weights defined in metrics
 * @param cache symbols cache
 * @param cfg configuration
 * @param strict do strict checks - symbols MUST be described in metrics
 */
gboolean validate_cache (struct symbols_cache *cache,
	struct rspamd_config *cfg,
	gboolean strict);


#endif