diff options
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | trainstore.c | 101 |
2 files changed, 49 insertions, 55 deletions
@@ -54,6 +54,9 @@ endif ifeq ("$(BACKEND)", "crm114-exec") objs += signature.o endif +ifeq ("$(BACKEND)", "trainstore") +CFLAGS += -lssl +endif # main make rules CFLAGS += -fPIC -shared -Wall -Wextra -DPLUGINNAME=$(PLUGINNAME) diff --git a/trainstore.c b/trainstore.c index 5cb7cf5..055828d 100644 --- a/trainstore.c +++ b/trainstore.c @@ -23,6 +23,9 @@ #include <fcntl.h> #include <dirent.h> #include <openssl/sha.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <libgen.h> #include "lib.h" #include "dict.h" @@ -34,75 +37,69 @@ static const char *spamdir = NULL; static const char *hamdir = NULL; -static const char *tmpdir = NULL; struct antispam_transaction_context { int count; - char *tmpdir; - int tmplen; + const char *spamdir; + const char *hamdir; }; -struct antispam_transaction_context * -backend_start(struct mailbox *box __attr_unused__) -{ - struct antispam_transaction_context *ast; - char *tmp; +int mkdir_rec(const char *dir, mode_t mask) { + char *parent; + struct stat sb; + int status; - ast = i_new(struct antispam_transaction_context, 1); - ast->count = 0; + if (stat(dir, &sb) == 0) { + if (! S_ISDIR(sb.st_mode)) { + return -1; + } + + return 0; + } - tmp = i_strconcat(tmp, "/antispam-mail-XXXXXX", NULL); + t_push(); - ast->tmpdir = mkdtemp(tmp); - if (!ast->tmpdir) - i_free(tmp); - else - ast->tmplen = strlen(ast->tmpdir); + parent = t_malloc(strlen(dir) + 1); + strcpy(parent, dir); - return ast; + if ((status = mkdir_rec(dirname(parent), mask)) == 0) { + mkdir(dir, mask); + + status = 0; + } + + t_pop(); + + return status; } -static void clear_tmpdir(struct antispam_transaction_context *ast) +struct antispam_transaction_context * +backend_start(struct mailbox *box __attr_unused__) { - char *buf; + struct antispam_transaction_context *ast; - t_push(); + ast = i_new(struct antispam_transaction_context, 1); + ast->count = 0; - buf = t_malloc(20 + ast->tmplen); + /* Create spam and hamdir */ + mkdir_rec(spamdir, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); + mkdir_rec(hamdir, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); - while (ast->count > 0) { - ast->count--; - i_snprintf(buf, 20 + ast->tmplen - 1, "%s/%d", - ast->tmpdir, ast->count); - unlink(buf); - } - rmdir(ast->tmpdir); + ast->spamdir = spamdir; + ast->hamdir = hamdir; - t_pop(); + return ast; } void backend_rollback(struct antispam_transaction_context *ast) { - if (ast->tmpdir) { - /* clear it! */ - clear_tmpdir(ast); - i_free(ast->tmpdir); - } - i_free(ast); } int backend_commit(struct mailbox_transaction_context *ctx __attr_unused__, struct antispam_transaction_context *ast) { - if (!ast->tmpdir) { - i_free(ast); - return 0; - } - - i_free(ast->tmpdir); i_free(ast); - return 0; } @@ -114,14 +111,14 @@ static char *create_unique_mailname(const char *date, const char *mail_id, char t_push(); unique_string = t_malloc(strlen(date) + strlen(mail_id) + 1); - i_snprintf(unique_string, strlen(date) + strlen(mail_id), "%s%s", date, mail_id); + i_snprintf(unique_string, strlen(date) + strlen(mail_id) + 1, "%s%s", date, mail_id); sha_bytes = t_malloc(20); sha_bytes = SHA1((unsigned char*)unique_string, strlen(date) + strlen(mail_id), sha_bytes); int i; for (i = 0; i < 20; i++) { - i_snprintf(sha1+(i*2), 2, "%hhx", sha_bytes[i]); + i_snprintf(sha1+(i*2), 3, "%02hhx", sha_bytes[i]); } sha1[40] = 0; @@ -145,7 +142,7 @@ int backend_handle_mail(struct mailbox_transaction_context *t, const char *date = NULL, *mail_id = NULL, *dest = NULL, *other = NULL; struct stat sb; - if (!hamdir || !spamdir) { + if (!ast->hamdir || !ast->spamdir) { mail_storage_set_error(t->box->storage, ME(NOTPOSSIBLE) "antispam plugin not configured"); @@ -189,12 +186,12 @@ int backend_handle_mail(struct mailbox_transaction_context *t, /* switch weather this should be ham or spam */ switch (wanted) { case CLASS_SPAM: - dest = spamdir; - other = hamdir; + dest = ast->spamdir; + other = ast->hamdir; break; case CLASS_NOTSPAM: - dest = hamdir; - other = spamdir; + dest = ast->hamdir; + other = ast->spamdir; break; } @@ -312,12 +309,6 @@ void backend_init(pool_t pool __attr_unused__) hamdir = tmp; debug("mail backend not-spam directory %s\n", tmp); } - - tmp = get_setting("DIR_TMP"); - if (tmp) { - tmpdir = tmp; - debug("mail backend temporary directory %s\n", tmp); - } } void backend_exit(void) |