static struct module *imap_acl_module;
static imap_client_created_func_t *next_hook_client_created;
-static struct mailbox *
-acl_mailbox_open_as_admin(struct client_command_context *cmd, const char *name)
+static int
+acl_mailbox_open_allocated_as_admin(struct client_command_context *cmd,
+ struct mailbox *box, const char *name)
{
- struct mail_namespace *ns;
- struct mailbox *box;
enum mailbox_existence existence = MAILBOX_EXISTENCE_NONE;
int ret;
if (ACL_USER_CONTEXT(cmd->client->user) == NULL) {
client_send_command_error(cmd, "ACLs disabled.");
- return NULL;
+ return 0;
}
- ns = client_find_namespace(cmd, &name);
- if (ns == NULL)
- return NULL;
-
- /* Force opening the mailbox so that we can give a nicer error message
- if mailbox isn't selectable but is listable. */
- box = mailbox_alloc(ns->list, name, MAILBOX_FLAG_READONLY |
- MAILBOX_FLAG_IGNORE_ACLS);
if (mailbox_exists(box, TRUE, &existence) == 0 &&
existence == MAILBOX_EXISTENCE_SELECT) {
ret = acl_mailbox_right_lookup(box, ACL_STORAGE_RIGHT_ADMIN);
if (ret > 0)
- return box;
+ return ret;
}
/* mailbox doesn't exist / not an administrator. */
} else {
client_send_tagline(cmd, "NO "ERROR_NOT_ADMIN);
}
- mailbox_free(&box);
- return NULL;
+ return 0;
+}
+
+static struct mailbox *
+acl_mailbox_open_as_admin(struct client_command_context *cmd, const char *name)
+{
+ struct mail_namespace *ns;
+ struct mailbox *box;
+
+ if (ACL_USER_CONTEXT(cmd->client->user) == NULL) {
+ client_send_command_error(cmd, "ACLs disabled.");
+ return NULL;
+ }
+
+ ns = client_find_namespace(cmd, &name);
+ if (ns == NULL)
+ return NULL;
+
+ /* Force opening the mailbox so that we can give a nicer error message
+ if mailbox isn't selectable but is listable. */
+ box = mailbox_alloc(ns->list, name, MAILBOX_FLAG_READONLY |
+ MAILBOX_FLAG_IGNORE_ACLS);
+ if (acl_mailbox_open_allocated_as_admin(cmd, box, name) <= 0) {
+ mailbox_free(&box);
+ return NULL;
+ }
+ return box;
}
static const struct imap_acl_letter_map *