From: Stephan Bosch Date: Wed, 13 Sep 2017 23:56:38 +0000 (+0200) Subject: lib-storage: Created mailbox_alloc_delivery(), which initializes a mailbox for messag... X-Git-Tag: 2.3.0.rc1~932 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7d716afc5d775055d07b5cbc5093334ac36a9cac;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Created mailbox_alloc_delivery(), which initializes a mailbox for message delivery. --- 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);