aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/surbl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/surbl.c')
-rw-r--r--src/plugins/surbl.c116
1 files changed, 80 insertions, 36 deletions
diff --git a/src/plugins/surbl.c b/src/plugins/surbl.c
index 1514cae1c..0fccb14b2 100644
--- a/src/plugins/surbl.c
+++ b/src/plugins/surbl.c
@@ -40,6 +40,78 @@ GRegex *extract_hoster_regexp, *extract_normal_regexp, *extract_numeric_regexp;
static int surbl_test_url (struct worker_task *task);
static void dns_callback (int result, char type, int count, int ttl, void *addresses, void *data);
+static void
+parse_host_list (GHashTable *tbl, const char *filename)
+{
+ int fd;
+ char buf[BUFSIZ], str[BUFSIZ], *s, *p;
+ ssize_t r;
+ enum {
+ READ_SYMBOL,
+ SKIP_COMMENT,
+ } state = READ_SYMBOL;
+
+ if ((fd = open (filename, O_RDONLY)) == -1) {
+ msg_warn ("parse_host_list: cannot open file '%s': %s", filename, strerror (errno));
+ return;
+ }
+
+ s = str;
+
+ while ((r = read (fd, buf, sizeof (buf) - 1)) > 0) {
+ buf[r] = '\0';
+ p = buf;
+ while (*p) {
+ switch (state) {
+ case READ_SYMBOL:
+ if (*p == '#') {
+ if (s != str) {
+ *s = '\0';
+ s = memory_pool_strdup (surbl_module_ctx->surbl_pool, str);
+ g_hash_table_insert (tbl, s, hash_fill);
+ s = str;
+ }
+ state = SKIP_COMMENT;
+ }
+ else if (*p == '\r' || *p == '\n') {
+ if (s != str) {
+ *s = '\0';
+ s = memory_pool_strdup (surbl_module_ctx->surbl_pool, str);
+ g_hash_table_insert (tbl, s, hash_fill);
+ s = str;
+ }
+ while (*p == '\r' || *p == '\n') {
+ p ++;
+ }
+ }
+ else if (g_ascii_isspace (*p)) {
+ p ++;
+ }
+ else {
+ *s = *p;
+ s ++;
+ p ++;
+ }
+ break;
+ case SKIP_COMMENT:
+ if (*p == '\r' || *p == '\n') {
+ while (*p == '\r' || *p == '\n') {
+ p ++;
+ }
+ s = str;
+ state = READ_SYMBOL;
+ }
+ else {
+ p ++;
+ }
+ break;
+ }
+ }
+ }
+
+ close (fd);
+}
+
int
surbl_module_init (struct config_file *cfg, struct module_ctx **ctx)
{
@@ -56,9 +128,9 @@ surbl_module_init (struct config_file *cfg, struct module_ctx **ctx)
surbl_module_ctx->bits = NULL;
surbl_module_ctx->surbl_pool = memory_pool_new (1024);
- surbl_module_ctx->hosters = g_hash_table_new (g_str_hash, g_str_equal);
+ surbl_module_ctx->tld2 = g_hash_table_new (g_str_hash, g_str_equal);
/* Register destructors */
- memory_pool_add_destructor (surbl_module_ctx->surbl_pool, (pool_destruct_func)g_hash_table_remove_all, surbl_module_ctx->hosters);
+ memory_pool_add_destructor (surbl_module_ctx->surbl_pool, (pool_destruct_func)g_hash_table_remove_all, surbl_module_ctx->tld2);
surbl_module_ctx->whitelist = g_hash_table_new (g_str_hash, g_str_equal);
/* Register destructors */
@@ -143,42 +215,14 @@ surbl_module_config (struct config_file *cfg)
else {
surbl_module_ctx->metric = DEFAULT_METRIC;
}
- if ((value = get_module_opt (cfg, "surbl", "hostings")) != NULL) {
- char comment_flag = 0;
- str = value;
- while (*value ++) {
- if (*value == '#') {
- comment_flag = 1;
- }
- if (*value == '\r' || *value == '\n' || *value == ',') {
- if (!comment_flag && str != value) {
- g_hash_table_insert (surbl_module_ctx->hosters, g_strstrip(str), hash_fill);
- str = value + 1;
- }
- else if (*value != ',') {
- comment_flag = 0;
- str = value + 1;
- }
- }
+ if ((value = get_module_opt (cfg, "surbl", "2tld")) != NULL) {
+ if (g_ascii_strncasecmp (value, "file://", sizeof ("file://") - 1) == 0) {
+ parse_host_list (surbl_module_ctx->tld2, value + sizeof ("file://") - 1);
}
}
if ((value = get_module_opt (cfg, "surbl", "whitelist")) != NULL) {
- char comment_flag = 0;
- str = value;
- while (*value ++) {
- if (*value == '#') {
- comment_flag = 1;
- }
- if (*value == '\r' || *value == '\n' || *value == ',') {
- if (!comment_flag && str != value) {
- g_hash_table_insert (surbl_module_ctx->whitelist, g_strstrip(str), hash_fill);
- str = value + 1;
- }
- else if (*value != ',') {
- comment_flag = 0;
- str = value + 1;
- }
- }
+ if (g_ascii_strncasecmp (value, "file://", sizeof ("file://") - 1) == 0) {
+ parse_host_list (surbl_module_ctx->whitelist, value + sizeof ("file://") - 1);
}
}
@@ -269,7 +313,7 @@ format_surbl_request (memory_pool_t *pool, f_str_t *hostname, struct suffix_item
g_match_info_free (info);
result = memory_pool_alloc (pool, len);
snprintf (result, len, "%s.%s", part1, part2);
- if (g_hash_table_lookup (surbl_module_ctx->hosters, result) != NULL) {
+ if (g_hash_table_lookup (surbl_module_ctx->tld2, result) != NULL) {
/* Match additional part for hosters */
g_free (part1);
g_free (part2);