From 7d716afc5d775055d07b5cbc5093334ac36a9cac Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Thu, 14 Sep 2017 01:56:38 +0200 Subject: [PATCH] lib-storage: Created mailbox_alloc_delivery(), which initializes a mailbox for message delivery. --- src/lib-storage/mail-storage.c | 26 ++++++++++++++++++++++++++ src/lib-storage/mail-storage.h | 4 ++++ 2 files changed, 30 insertions(+) diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index e472b3efc9..4faf4e8c8a 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -869,6 +869,32 @@ struct mailbox *mailbox_alloc_guid(struct mailbox_list *list, return box; } +struct mailbox *mailbox_alloc_delivery(struct mail_user *user, + const char *name, enum mailbox_flags flags) +{ + struct mail_namespace *ns; + + flags |= MAILBOX_FLAG_SAVEONLY | + MAILBOX_FLAG_POST_SESSION; + + ns = mail_namespace_find(user->namespaces, name); + if (strcmp(name, ns->prefix) == 0 && + (ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0) { + /* delivering to a namespace prefix means we actually want to + deliver to the INBOX instead */ + name = "INBOX"; + ns = mail_namespace_find_inbox(user->namespaces); + } + + if (strcasecmp(name, "INBOX") == 0) { + /* deliveries to INBOX must always succeed, + regardless of ACLs */ + flags |= MAILBOX_FLAG_IGNORE_ACLS; + } + + return mailbox_alloc(ns->list, name, flags); +} + void mailbox_set_reason(struct mailbox *box, const char *reason) { i_assert(reason != NULL); diff --git a/src/lib-storage/mail-storage.h b/src/lib-storage/mail-storage.h index 9b9a967185..179aa5e347 100644 --- a/src/lib-storage/mail-storage.h +++ b/src/lib-storage/mail-storage.h @@ -510,6 +510,10 @@ struct mailbox *mailbox_alloc(struct mailbox_list *list, const char *vname, struct mailbox *mailbox_alloc_guid(struct mailbox_list *list, const guid_128_t guid, enum mailbox_flags flags); +/* Initialize mailbox for delivery without actually opening any files or + verifying that it exists. */ +struct mailbox *mailbox_alloc_delivery(struct mail_user *user, + const char *name, enum mailbox_flags flags); /* Set a human-readable reason for why this mailbox is being accessed. This is used for logging purposes. */ void mailbox_set_reason(struct mailbox *box, const char *reason); -- 2.47.3