From 395def89b2c55daa7bb4958e6261ab1400f04c76 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Sat, 30 Aug 2008 15:22:33 +0200 Subject: [PATCH] Incorporated changes in deliver into the mail-raw implementation of the sieve tools. --- src/sieve-bin/mail-raw.c | 79 +++++++++++++++++++++++++------------- src/sieve-bin/mail-raw.h | 12 +++--- src/sieve-bin/sieve-exec.c | 21 +++++----- src/sieve-bin/sieve-test.c | 9 +---- 4 files changed, 70 insertions(+), 51 deletions(-) diff --git a/src/sieve-bin/mail-raw.c b/src/sieve-bin/mail-raw.c index 9dbb4878b..5f8421363 100644 --- a/src/sieve-bin/mail-raw.c +++ b/src/sieve-bin/mail-raw.c @@ -16,6 +16,7 @@ #include "str-sanitize.h" #include "strescape.h" #include "message-address.h" +#include "mbox-from.h" #include "raw-storage.h" #include "mail-namespace.h" @@ -37,17 +38,32 @@ where to read the mail. */ #define MAIL_MAX_MEMORY_BUFFER (1024*128) +static const char *wanted_headers[] = { + "From", "Message-ID", "Subject", "Return-Path", + NULL +}; + +/* + * Global data + */ + +static struct mail_namespace *raw_ns; +static struct mail_user *raw_mail_user; + /* * Raw mail implementation */ -static struct istream *create_raw_stream(int fd) +static struct istream *create_raw_stream + (int fd, time_t *mtime_r, const char **sender) { struct istream *input, *input2, *input_list[2]; const unsigned char *data; size_t i, size; - int ret; + int ret, tz; + char *env_sender; + *mtime_r = (time_t)-1; fd_set_nonblock(fd, FALSE); input = i_stream_create_fd(fd, 4096, FALSE); @@ -63,12 +79,18 @@ static struct istream *create_raw_stream(int fd) break; } if (i != size) { + (void)mbox_from_parse(data, i, mtime_r, &tz, &env_sender); i_stream_skip(input, i + 1); break; } i_stream_skip(input, size); - } + } + } + + if (sender != NULL) { + *sender = t_strdup(env_sender); } + i_free(env_sender); if (input->v_offset == 0) { input2 = input; @@ -80,41 +102,48 @@ static struct istream *create_raw_stream(int fd) input_list[0] = input2; input_list[1] = NULL; input = i_stream_create_seekable(input_list, MAIL_MAX_MEMORY_BUFFER, - "/tmp/dovecot.deliver."); + "/tmp/dovecot.deliver."); i_stream_unref(&input2); return input; } -static struct mail_namespace *raw_ns; - void mail_raw_init(const char *user) { const char *error; - struct mail_user *raw_mail_user; - + raw_mail_user = mail_user_init(user, NULL); - raw_ns = mail_namespaces_init_empty(raw_mail_user); - raw_ns->flags |= NAMESPACE_FLAG_INTERNAL; + raw_ns = mail_namespaces_init_empty(raw_mail_user); + raw_ns->flags |= NAMESPACE_FLAG_INTERNAL; + if (mail_storage_create(raw_ns, "raw", "/tmp", MAIL_STORAGE_FLAG_FULL_FS_ACCESS, FILE_LOCK_METHOD_FCNTL, &error) < 0) i_fatal("Couldn't create internal raw storage: %s", error); } -struct mail_raw *mail_raw_open(int fd) +struct mail_raw *mail_raw_open(const char *path) { pool_t pool; + time_t mtime; + struct istream *input; struct raw_mailbox *raw_box; struct mail_raw *mailr; + const char *sender = NULL; pool = pool_alloconly_create("mail_raw", 1024); mailr = p_new(pool, struct mail_raw, 1); mailr->pool = pool; - mailr->input = create_raw_stream(fd); - - mailr->box = mailbox_open(raw_ns->storage, - "Dovecot Raw Mail", mailr->input, MAILBOX_OPEN_NO_INDEX_FILES); + if ( path == NULL || strcmp(path, "-") == 0 ) { + input = create_raw_stream(0, &mtime, &sender); + mailr->box = mailbox_open(raw_ns->storage, "Dovecot Delivery Mail", + input, MAILBOX_OPEN_NO_INDEX_FILES); + i_stream_unref(&input); + } else { + mtime = (time_t)-1; + mailr->box = mailbox_open(raw_ns->storage, path, NULL, + MAILBOX_OPEN_NO_INDEX_FILES); + } if (mailr->box == NULL) i_fatal("Can't open mail stream as raw"); @@ -122,27 +151,25 @@ struct mail_raw *mail_raw_open(int fd) if (mailbox_sync(mailr->box, 0, 0, NULL) < 0) { enum mail_error error; - i_fatal("Can't sync raw mail: %s", - mail_storage_get_last_error(raw_ns->storage, &error)); + i_fatal("Can't sync delivery mail: %s", + mail_storage_get_last_error(raw_ns->storage, &error)); } - raw_box = (struct raw_mailbox *) mailr->box; - raw_box->envelope_sender = DEFAULT_ENVELOPE_SENDER; + raw_box = (struct raw_mailbox *)mailr->box; + raw_box->envelope_sender = sender != NULL ? sender : DEFAULT_ENVELOPE_SENDER; + raw_box->mtime = mtime; mailr->trans = mailbox_transaction_begin(mailr->box, 0); - mailr->mail = mail_alloc(mailr->trans, 0, NULL); + mailr->headers_ctx = mailbox_header_lookup_init(mailr->box, wanted_headers); + mailr->mail = mail_alloc(mailr->trans, 0, mailr->headers_ctx); mail_set_seq(mailr->mail, 1); - /* */ - i_stream_seek(mailr->input, 0); - return mailr; } void mail_raw_close(struct mail_raw *mailr) { - i_stream_unref(&mailr->input); - mail_free(&mailr->mail); + mailbox_header_lookup_unref(&mailr->headers_ctx); mailbox_transaction_rollback(&mailr->trans); mailbox_close(&mailr->box); @@ -151,6 +178,6 @@ void mail_raw_close(struct mail_raw *mailr) void mail_raw_deinit(void) { - mail_namespaces_deinit(&raw_ns); + mail_user_deinit(&raw_mail_user); } diff --git a/src/sieve-bin/mail-raw.h b/src/sieve-bin/mail-raw.h index 050174047..b9e6ae4de 100644 --- a/src/sieve-bin/mail-raw.h +++ b/src/sieve-bin/mail-raw.h @@ -5,16 +5,16 @@ #define __MAIL_RAW_H struct mail_raw { - pool_t pool; - struct mail *mail; + pool_t pool; + struct mail *mail; - struct istream *input; - struct mailbox *box; - struct mailbox_transaction_context *trans; + struct mailbox *box; + struct mailbox_header_lookup_ctx *headers_ctx; + struct mailbox_transaction_context *trans; }; void mail_raw_init(const char *user); -struct mail_raw *mail_raw_open(int fd); +struct mail_raw *mail_raw_open(const char *path); void mail_raw_close(struct mail_raw *mailr); void mail_raw_deinit(void); diff --git a/src/sieve-bin/sieve-exec.c b/src/sieve-bin/sieve-exec.c index 193635220..cc52aca76 100644 --- a/src/sieve-bin/sieve-exec.c +++ b/src/sieve-bin/sieve-exec.c @@ -85,9 +85,10 @@ int main(int argc, char **argv) const char *scriptfile, *recipient, *sender, *mailbox, *dumpfile, *mailfile; const char *mailloc; const char *user, *home; - int i, mfd; + int i; struct mail_raw *mailr; - struct mail_namespace *ns; + struct mail_namespace *ns = NULL; + struct mail_user *mail_user = NULL; struct sieve_binary *sbin; struct sieve_message_data msgdata; struct sieve_script_env scriptenv; @@ -148,9 +149,6 @@ int main(int argc, char **argv) print_help(); i_fatal("Missing <mailfile> argument"); } - - /* Open the mail file */ - mfd = bin_open_mail_file(mailfile); /* Compile sieve script */ sbin = bin_open_sieve_script(scriptfile); @@ -165,8 +163,6 @@ int main(int argc, char **argv) /* Obtain mail namespaces from -l argument */ if ( mailloc != NULL ) { - struct mail_user *mail_user; - env_put(t_strdup_printf("NAMESPACE_1=%s", mailloc)); env_put("NAMESPACE_1_INBOX=1"); env_put("NAMESPACE_1_LIST=1"); @@ -178,13 +174,11 @@ int main(int argc, char **argv) i_fatal("Namespace initialization failed"); ns = mail_user->namespaces; - } else { - ns = NULL; - } + } /* Open text file as mail message */ mail_raw_init(user); - mailr = mail_raw_open(mfd); + mailr = mail_raw_open(mailfile); bin_fill_in_envelope(mailr->mail, &recipient, &sender); @@ -234,9 +228,12 @@ int main(int argc, char **argv) sieve_close(&sbin); sieve_error_handler_unref(&ehandler); - bin_close_mail_file(mfd); mail_raw_close(mailr); mail_raw_deinit(); + + if ( mail_user != NULL ) + mail_user_deinit(&mail_user); + namespaces_deinit(); bin_deinit(); diff --git a/src/sieve-bin/sieve-test.c b/src/sieve-bin/sieve-test.c index f6656d168..b2e9ff8af 100644 --- a/src/sieve-bin/sieve-test.c +++ b/src/sieve-bin/sieve-test.c @@ -50,7 +50,7 @@ int main(int argc, char **argv) { const char *scriptfile, *recipient, *sender, *mailbox, *dumpfile, *mailfile; const char *user; - int i, mfd; + int i; struct mail_raw *mailr; struct sieve_binary *sbin; struct sieve_message_data msgdata; @@ -118,9 +118,6 @@ int main(int argc, char **argv) print_help(); i_fatal("Missing <mailfile> argument"); } - - /* Open the mail file */ - mfd = bin_open_mail_file(mailfile); /* Compile sieve script */ if ( force_compile ) { @@ -137,7 +134,7 @@ int main(int argc, char **argv) namespaces_init(); mail_raw_init(user); - mailr = mail_raw_open(mfd); + mailr = mail_raw_open(mailfile); bin_fill_in_envelope(mailr->mail, &recipient, &sender); @@ -179,8 +176,6 @@ int main(int argc, char **argv) sieve_close(&sbin); sieve_error_handler_unref(&ehandler); - bin_close_mail_file(mfd); - mail_raw_close(mailr); mail_raw_deinit(); namespaces_deinit(); -- GitLab