]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Allow namespace prefix to be opened as mailbox, if it already exists.
authorTimo Sirainen <tss@iki.fi>
Mon, 3 Aug 2009 03:21:43 +0000 (23:21 -0400)
committerTimo Sirainen <tss@iki.fi>
Mon, 3 Aug 2009 03:21:43 +0000 (23:21 -0400)
--HG--
branch : HEAD

18 files changed:
src/imap/cmd-append.c
src/imap/cmd-copy.c
src/imap/cmd-create.c
src/imap/cmd-delete.c
src/imap/cmd-list.c
src/imap/cmd-rename.c
src/imap/cmd-select.c
src/imap/cmd-status.c
src/imap/cmd-subscribe.c
src/imap/imap-commands-util.c
src/imap/imap-commands-util.h
src/lib-storage/index/maildir/maildir-storage.c
src/lib-storage/list/mailbox-list-maildir.c
src/lib-storage/mail-namespace.c
src/lib-storage/mailbox-list.c
src/lib-storage/mailbox-list.h
src/plugins/imap-acl/imap-acl-plugin.c
src/plugins/imap-quota/imap-quota-plugin.c

index e6e52310c5f13a6218fdae94572edc793aee4d6a..b4c47a042db2aa615138c05867a0d872639a71f8 100644 (file)
@@ -455,11 +455,8 @@ get_mailbox(struct client_command_context *cmd, const char *name)
        struct mail_namespace *ns;
        struct mailbox *box;
 
-       if (!client_verify_mailbox_name(cmd, name,
-                               CLIENT_VERIFY_MAILBOX_SHOULD_EXIST_TRYCREATE))
-               return NULL;
-
-       ns = client_find_namespace(cmd, &name);
+       ns = client_find_namespace(cmd, &name,
+                                  CLIENT_VERIFY_MAILBOX_SHOULD_EXIST_TRYCREATE);
        if (ns == NULL)
                return NULL;
 
index 4658a68ea8399e8c8e49013f02cd5aa4d0b42da7..f37ed3c9da66cbc3053649316186fdb34e32fbc3 100644 (file)
@@ -106,16 +106,13 @@ bool cmd_copy(struct client_command_context *cmd)
        if (!client_verify_open_mailbox(cmd))
                return TRUE;
 
-       /* open the destination mailbox */
-       if (!client_verify_mailbox_name(cmd, mailbox,
-                               CLIENT_VERIFY_MAILBOX_SHOULD_EXIST_TRYCREATE))
-               return TRUE;
-
        ret = imap_search_get_seqset(cmd, messageset, cmd->uid, &search_args);
        if (ret <= 0)
                return ret < 0;
 
-       dest_ns = client_find_namespace(cmd, &mailbox);
+       /* open the destination mailbox */
+       dest_ns = client_find_namespace(cmd, &mailbox,
+                               CLIENT_VERIFY_MAILBOX_SHOULD_EXIST_TRYCREATE);
        if (dest_ns == NULL)
                return TRUE;
 
index b87485071228c9da707bd5619bd7f6ada6492055..b87b0b2d07a85a8551f1dba809fe1e99da401a52 100644 (file)
@@ -1,6 +1,7 @@
 /* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
 
 #include "imap-common.h"
+#include "imap-resp-code.h"
 #include "mail-namespace.h"
 #include "imap-commands.h"
 
@@ -17,7 +18,7 @@ bool cmd_create(struct client_command_context *cmd)
                return FALSE;
        full_mailbox = mailbox;
 
-       ns = client_find_namespace(cmd, &mailbox);
+       ns = client_find_namespace(cmd, &mailbox, CLIENT_VERIFY_MAILBOX_NONE);
        if (ns == NULL)
                return TRUE;
 
@@ -25,7 +26,8 @@ bool cmd_create(struct client_command_context *cmd)
        if (len == 0 || full_mailbox[len-1] != ns->sep)
                directory = FALSE;
        else if (*mailbox == '\0') {
-               client_send_tagline(cmd, "NO Namespace already exists.");
+               client_send_tagline(cmd, "NO ["IMAP_RESP_CODE_ALREADYEXISTS
+                                   "] Namespace already exists.");
                return TRUE;
        } else {
                /* name ends with hierarchy separator - client is just
@@ -36,8 +38,10 @@ bool cmd_create(struct client_command_context *cmd)
                full_mailbox = t_strndup(full_mailbox, len-1);
        }
 
-       if (!client_verify_mailbox_name(cmd, full_mailbox,
-                                       CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST))
+       mailbox = full_mailbox;
+       ns = client_find_namespace(cmd, &mailbox,
+                                  CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST);
+       if (ns == NULL)
                return TRUE;
 
        box = mailbox_alloc(ns->list, mailbox, NULL, 0);
index 7e3962eebcb4b450891a422e9387ca7a48614faa..8db06484a109d237f8b8d91566084775a0eede90 100644 (file)
@@ -20,7 +20,8 @@ bool cmd_delete(struct client_command_context *cmd)
                return TRUE;
        }
 
-       ns = client_find_namespace(cmd, &name);
+       ns = client_find_namespace(cmd, &name,
+                                  CLIENT_VERIFY_MAILBOX_SHOULD_EXIST);
        if (ns == NULL)
                return TRUE;
 
index caac742dbf115e2cba96d9bc2ab5b7c1f9d6706a..7e5ce0a94217dcd5097a115948d26a62ea7790b1 100644 (file)
@@ -269,6 +269,8 @@ list_namespace_send_prefix(struct cmd_list_context *ctx, bool have_children)
 
                ctx->inbox_found = TRUE;
                flags = list_get_inbox_flags(ctx);
+       } else if (mailbox_list_mailbox(ctx->ns->list, "", &flags) > 0) {
+               /* mailbox with namespace prefix exists */
        } else {
                flags = MAILBOX_NONEXISTENT;
        }
index 6bb7b449b25cf65eecebbc7d4dcdb25a79f06886..aa64d0a0b1ba2f0db5c6f5ab3495db557548579e 100644 (file)
@@ -14,18 +14,13 @@ bool cmd_rename(struct client_command_context *cmd)
        if (!client_read_string_args(cmd, 2, &oldname, &newname))
                return FALSE;
 
-       if (!client_verify_mailbox_name(cmd, oldname,
-                                       CLIENT_VERIFY_MAILBOX_SHOULD_EXIST))
-               return TRUE;
-       if (!client_verify_mailbox_name(cmd, newname,
-                                       CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST))
-               return TRUE;
-
-       old_ns = client_find_namespace(cmd, &oldname);
+       old_ns = client_find_namespace(cmd, &oldname,
+                                      CLIENT_VERIFY_MAILBOX_SHOULD_EXIST);
        if (old_ns == NULL)
                return TRUE;
 
-       new_ns = client_find_namespace(cmd, &newname);
+       new_ns = client_find_namespace(cmd, &newname,
+                                      CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST);
        if (new_ns == NULL)
                return TRUE;
 
index 4860e77b4164fbc10a424dea68e8e8f2fb9d472c..6f27f9476906731be09c10e7ffbad60decda9901 100644 (file)
@@ -357,7 +357,8 @@ bool cmd_select_full(struct client_command_context *cmd, bool readonly)
 
        ctx = p_new(cmd->pool, struct imap_select_context, 1);
        ctx->cmd = cmd;
-       ctx->ns = client_find_namespace(cmd, &mailbox);
+       ctx->ns = client_find_namespace(cmd, &mailbox,
+                                       CLIENT_VERIFY_MAILBOX_SHOULD_EXIST);
        if (ctx->ns == NULL)
                return TRUE;
 
index 1af4764a279a5ecdbb13edaae57af9fb3132cc78..817a14eb34434d22ecc9e571588fc570b6d93144 100644 (file)
@@ -31,7 +31,8 @@ bool cmd_status(struct client_command_context *cmd)
                                    &items) < 0)
                return TRUE;
 
-       ns = client_find_namespace(cmd, &real_mailbox);
+       ns = client_find_namespace(cmd, &real_mailbox,
+                                  CLIENT_VERIFY_MAILBOX_SHOULD_EXIST);
        if (ns == NULL)
                return TRUE;
 
index a682f2b8977ea6702fe852054a43de8aa636c4d5..d2476ab4affa52708712c6d73d0a319d4289d0d8 100644 (file)
@@ -37,7 +37,8 @@ bool cmd_subscribe_full(struct client_command_context *cmd, bool subscribe)
        verify_name = mailbox;
 
        real_name = mailbox;
-       real_ns = client_find_namespace(cmd, &real_name);
+       real_ns = client_find_namespace(cmd, &real_name,
+                                       CLIENT_VERIFY_MAILBOX_NONE);
        if (real_ns == NULL)
                return TRUE;
 
@@ -69,12 +70,12 @@ bool cmd_subscribe_full(struct client_command_context *cmd, bool subscribe)
                                           verify_name)) {
                /* subscribing to a listable namespace prefix, allow it. */
        } else if (subscribe) {
-               if (!client_verify_mailbox_name(cmd, verify_name,
-                                       CLIENT_VERIFY_MAILBOX_SHOULD_EXIST))
+               if (client_find_namespace(cmd, &verify_name,
+                               CLIENT_VERIFY_MAILBOX_SHOULD_EXIST) == NULL)
                        return TRUE;
        } else {
-               if (!client_verify_mailbox_name(cmd, verify_name,
-                                               CLIENT_VERIFY_MAILBOX_NAME))
+               if (client_find_namespace(cmd, &verify_name,
+                               CLIENT_VERIFY_MAILBOX_NAME) == NULL)
                        return TRUE;
        }
 
index 3771bd5cb723e533d048af767b4d2705de43b9c6..5a16ae1853cc97134afb554630b1db17cc206bc1 100644 (file)
 #define MAILBOX_MAX_NAME_LEN 512
 
 struct mail_namespace *
-client_find_namespace(struct client_command_context *cmd, const char **mailbox)
-{
-       struct mail_namespace *ns;
-
-       ns = mail_namespace_find(cmd->client->user->namespaces, mailbox);
-       if (ns != NULL)
-               return ns;
-
-       client_send_tagline(cmd, "NO Unknown namespace.");
-       return NULL;
-}
-
-bool client_verify_mailbox_name(struct client_command_context *cmd,
-                               const char *mailbox,
-                               enum client_verify_mailbox_mode mode)
+client_find_namespace(struct client_command_context *cmd, const char **mailboxp,
+                     enum client_verify_mailbox_mode mode)
 {
        struct mail_namespace *ns;
        enum mailbox_name_status mailbox_status;
-       const char *orig_mailbox, *p, *resp_code = NULL;
+       const char *orig_mailbox, *mailbox, *p, *resp_code = NULL;
 
-       orig_mailbox = mailbox;
-       ns = client_find_namespace(cmd, &mailbox);
-       if (ns == NULL)
-               return FALSE;
+       orig_mailbox = *mailboxp;
+       ns = mail_namespace_find(cmd->client->user->namespaces, mailboxp);
+       if (ns == NULL) {
+               client_send_tagline(cmd, "NO Unknown namespace.");
+               return NULL;
+       }
+       mailbox = *mailboxp;
+
+       if (mode == CLIENT_VERIFY_MAILBOX_NONE)
+               return ns;
 
        /* make sure it even looks valid */
-       if (*mailbox == '\0') {
+       if (*mailbox == '\0' && !(*orig_mailbox != '\0' && ns->list)) {
                client_send_tagline(cmd, "NO Empty mailbox name.");
-               return FALSE;
+               return NULL;
        }
 
        if (ns->real_sep != ns->sep && ns->prefix_len < strlen(orig_mailbox)) {
@@ -61,7 +54,7 @@ bool client_verify_mailbox_name(struct client_command_context *cmd,
                                        "NO Character not allowed "
                                        "in mailbox name: '%c'",
                                        ns->real_sep));
-                               return FALSE;
+                               return NULL;
                        }
                }
        }
@@ -70,36 +63,37 @@ bool client_verify_mailbox_name(struct client_command_context *cmd,
        for (p = mailbox+1; *p != '\0'; p++) {
                if (p[0] == ns->real_sep && p[-1] == ns->real_sep) {
                        client_send_tagline(cmd, "NO Invalid mailbox name.");
-                       return FALSE;
+                       return NULL;
                }
        }
 
        if (strlen(mailbox) > MAILBOX_MAX_NAME_LEN) {
                client_send_tagline(cmd, "NO Mailbox name too long.");
-               return FALSE;
+               return NULL;
        }
 
        /* check what our storage thinks of it */
        if (mailbox_list_get_mailbox_name_status(ns->list, mailbox,
                                                 &mailbox_status) < 0) {
                client_send_list_error(cmd, ns->list);
-               return FALSE;
+               return NULL;
        }
 
        switch (mailbox_status) {
        case MAILBOX_NAME_EXISTS:
                switch (mode) {
+               case CLIENT_VERIFY_MAILBOX_NONE:
                case CLIENT_VERIFY_MAILBOX_NAME:
                case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST:
                case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST_TRYCREATE:
-                       return TRUE;
+                       return ns;
                case CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST:
                        break;
                }
 
                if (mode == CLIENT_VERIFY_MAILBOX_NAME ||
                    mode == CLIENT_VERIFY_MAILBOX_SHOULD_EXIST)
-                       return TRUE;
+                       return ns;
 
                client_send_tagline(cmd, t_strconcat(
                        "NO [", IMAP_RESP_CODE_ALREADYEXISTS,
@@ -110,7 +104,7 @@ bool client_verify_mailbox_name(struct client_command_context *cmd,
                switch (mode) {
                case CLIENT_VERIFY_MAILBOX_NAME:
                case CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST:
-                       return TRUE;
+                       return ns;
                case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST:
                        resp_code = IMAP_RESP_CODE_NONEXISTENT;
                        break;
@@ -143,8 +137,7 @@ bool client_verify_mailbox_name(struct client_command_context *cmd,
        default:
                 i_unreached();
        }
-
-       return FALSE;
+       return NULL;
 }
 
 bool client_verify_open_mailbox(struct client_command_context *cmd)
index ae59c7da6b6ef96d315d40a0fa7d8c66114da8a8..c1964c56df33197bffdfd2ec3d9118f013e7901f 100644 (file)
@@ -2,6 +2,8 @@
 #define IMAP_COMMANDS_UTIL_H
 
 enum client_verify_mailbox_mode {
+       /* Don't verify mailbox name validity */
+       CLIENT_VERIFY_MAILBOX_NONE,
        /* Verify only that the mailbox name is valid */
        CLIENT_VERIFY_MAILBOX_NAME,
        /* If mailbox doesn't exist, fail with [NONEXISTENT] resp code */
@@ -20,16 +22,11 @@ struct msgset_generator_context {
 struct mail_full_flags;
 struct mailbox_keywords;
 
-/* Finds namespace for given mailbox from namespaces. If not found,
-   sends "Unknown namespace" error message to client. */
+/* Finds namespace for given mailbox from namespaces. If namespace isn't found
+   or mailbox name is invalid, sends a tagged NO reply to client. */
 struct mail_namespace *
-client_find_namespace(struct client_command_context *cmd, const char **mailbox);
-
-/* Returns TRUE if verifications succeeds. If it fails, a tagged NO is sent to
-   client. */
-bool client_verify_mailbox_name(struct client_command_context *cmd,
-                               const char *mailbox,
-                               enum client_verify_mailbox_mode mode);
+client_find_namespace(struct client_command_context *cmd, const char **mailbox,
+                     enum client_verify_mailbox_mode mode);
 
 /* Returns TRUE if mailbox is selected. If not, sends "No mailbox selected"
    error message to client. */
index 006494f7c52e6549f2aee8c3c55b442c2f732d92..24b6bdc4bc5d9b035b32d6a67516dfb370b52c5a 100644 (file)
@@ -436,7 +436,7 @@ static int maildir_mailbox_open(struct mailbox *box)
                return -1;
 
        /* tmp/ directory doesn't exist. does the maildir? */
-       if (inbox || stat(box->path, &st) == 0) {
+       if (inbox || (*box->name != '\0' && stat(box->path, &st) == 0)) {
                /* yes, we'll need to create the missing dirs */
                mailbox_list_get_dir_permissions(box->list, box->name,
                                                 &mode, &gid, &gid_origin);
@@ -445,7 +445,7 @@ static int maildir_mailbox_open(struct mailbox *box)
                        return -1;
 
                return maildir_mailbox_open_existing(box);
-       } else if (errno == ENOENT) {
+       } else if (*box->name == '\0' || errno == ENOENT) {
                mail_storage_set_error(box->storage, MAIL_ERROR_NOTFOUND,
                        T_MAIL_ERR_MAILBOX_NOT_FOUND(box->name));
                return -1;
index 61795562147a2bc0d6748882c6df3d1bdc04f441..c0993201cb9015501fe3edb7a9b13d8d9935d352 100644 (file)
@@ -59,7 +59,7 @@ static const char *
 maildir_list_get_dirname_path(struct mailbox_list *list, const char *dir,
                              const char *name)
 {
-       if (strcmp(list->name, MAILBOX_LIST_NAME_IMAPDIR) == 0)
+       if (strcmp(list->name, MAILBOX_LIST_NAME_IMAPDIR) == 0 || *name == '\0')
                return t_strdup_printf("%s/%s", dir, name);
        
        return t_strdup_printf("%s/%c%s", dir, list->hierarchy_sep, name);
@@ -134,13 +134,6 @@ maildir_is_valid_existing_name(struct mailbox_list *list, const char *name)
 {
        size_t len;
 
-       if (*name == '\0' && *list->ns->prefix != '\0' &&
-           (list->ns->flags & NAMESPACE_FLAG_INBOX) == 0) {
-               /* an ugly way to get to Maildir/ root when it's not the
-                  INBOX. */
-               return TRUE;
-       }
-
        if (!maildir_list_is_valid_common(list, name, &len))
                return FALSE;
 
index c7c9885155950134833043525aef518762ef60f2..45f3c27e60a6244dddae1480b2dcacbce6a4c0ee 100644 (file)
@@ -443,6 +443,31 @@ char mail_namespaces_get_root_sep(const struct mail_namespace *namespaces)
        return namespaces->sep;
 }
 
+static bool mail_namespace_is_usable_prefix(struct mail_namespace *ns,
+                                           const char *mailbox, bool inbox)
+{
+       if (strncmp(ns->prefix, mailbox, ns->prefix_len) == 0) {
+               /* true exact prefix match */
+               return TRUE;
+       }
+
+       if (inbox && strncmp(ns->prefix, "INBOX", 5) == 0 &&
+           strncmp(ns->prefix+5, mailbox+5, ns->prefix_len-5) == 0) {
+               /* we already checked that mailbox begins with case-insensitive
+                  INBOX. this namespace also begins with INBOX and the rest
+                  of the prefix matches too. */
+               return TRUE;
+       }
+
+       if (strncmp(ns->prefix, mailbox, ns->prefix_len-1) == 0 &&
+           mailbox[ns->prefix_len-1] == '\0' &&
+           ns->prefix[ns->prefix_len-1] == ns->sep) {
+               /* we're trying to access the namespace prefix itself */
+               return TRUE;
+       }
+       return FALSE;
+}
+
 static struct mail_namespace *
 mail_namespace_find_mask(struct mail_namespace *namespaces,
                         const char **mailbox,
@@ -452,7 +477,7 @@ mail_namespace_find_mask(struct mail_namespace *namespaces,
         struct mail_namespace *ns = namespaces;
        const char *box = *mailbox;
        struct mail_namespace *best = NULL;
-       size_t best_len = 0;
+       unsigned int len, best_len = 0;
        bool inbox;
 
        inbox = strncasecmp(box, "INBOX", 5) == 0;
@@ -471,25 +496,22 @@ mail_namespace_find_mask(struct mail_namespace *namespaces,
        }
 
        for (; ns != NULL; ns = ns->next) {
-               if (ns->prefix_len >= best_len &&
-                   (strncmp(ns->prefix, box, ns->prefix_len) == 0 ||
-                    (inbox && strncmp(ns->prefix, "INBOX", 5) == 0 &&
-                     strncmp(ns->prefix+5, box+5, ns->prefix_len-5) == 0)) &&
-                   (ns->flags & mask) == flags) {
+               if (ns->prefix_len >= best_len && (ns->flags & mask) == flags &&
+                   mail_namespace_is_usable_prefix(ns, box, inbox)) {
                        best = ns;
                        best_len = ns->prefix_len;
                }
        }
 
        if (best != NULL) {
-               if (best_len > 0)
-                       *mailbox += best_len;
-               else if (inbox && (box[5] == best->sep || box[5] == '\0'))
+               if (best_len > 0) {
+                       len = strlen(*mailbox);
+                       *mailbox += I_MIN(len, best_len);
+               } else if (inbox && (box[5] == best->sep || box[5] == '\0'))
                        *mailbox = t_strconcat("INBOX", box+5, NULL);
 
                *mailbox = mail_namespace_fix_sep(best, *mailbox);
        }
-
        return best;
 }
 
index 92cd9454b12bc497466c68fbe200ee9a50a24389..98733c0093c26b5be45ce973dab37495538153b2 100644 (file)
@@ -454,6 +454,13 @@ bool mailbox_list_is_valid_pattern(struct mailbox_list *list,
 bool mailbox_list_is_valid_existing_name(struct mailbox_list *list,
                                         const char *name)
 {
+       if (*name == '\0' && *list->ns->prefix != '\0' &&
+           (list->ns->flags & NAMESPACE_FLAG_LIST_PREFIX) != 0) {
+               /* an ugly way to get to mailbox root (e.g. Maildir/ when
+                  it's not the INBOX) */
+               return TRUE;
+       }
+
        return list->v.is_valid_existing_name(list, name);
 }
 
@@ -512,7 +519,6 @@ int mailbox_list_get_mailbox_name_status(struct mailbox_list *list,
                *status = MAILBOX_NAME_INVALID;
                return 0;
        }
-
        return list->v.get_mailbox_name_status(list, name, status);
 }
 
@@ -637,6 +643,22 @@ int mailbox_list_iter_deinit(struct mailbox_list_iterate_context **_ctx)
        return ctx->list->v.iter_deinit(ctx);
 }
 
+int mailbox_list_mailbox(struct mailbox_list *list, const char *name,
+                        enum mailbox_info_flags *flags_r)
+{
+       struct mailbox_list_iterate_context ctx;
+       const char *path;
+
+       memset(&ctx, 0, sizeof(ctx));
+       ctx.list = list;
+
+       *flags_r = 0;
+       path = mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_DIR);
+       return list->v.iter_is_mailbox(&ctx, path, "", "",
+                                      MAILBOX_LIST_FILE_TYPE_UNKNOWN,
+                                      flags_r);
+}
+
 int mailbox_list_set_subscribed(struct mailbox_list *list,
                                const char *name, bool set)
 {
@@ -647,7 +669,7 @@ int mailbox_list_set_subscribed(struct mailbox_list *list,
 
 int mailbox_list_delete_mailbox(struct mailbox_list *list, const char *name)
 {
-       if (!mailbox_list_is_valid_existing_name(list, name)) {
+       if (!mailbox_list_is_valid_existing_name(list, name) || *name == '\0') {
                mailbox_list_set_error(list, MAIL_ERROR_PARAMS,
                                       "Invalid mailbox name");
                return -1;
@@ -681,6 +703,7 @@ int mailbox_list_rename_mailbox(struct mailbox_list *oldlist,
        mailbox_list_get_closest_storage(newlist, &newstorage);
 
        if (!mailbox_list_is_valid_existing_name(oldlist, oldname) ||
+           *oldname == '\0' ||
            !mailbox_list_is_valid_create_name(newlist, newname)) {
                mailbox_list_set_error(oldlist, MAIL_ERROR_PARAMS,
                                       "Invalid mailbox name");
index 7b307fd5fd44dc6bd6316b4dda55ce9b807fb9ed..0956c482762b460f457d7897d1fc2d145135c5a1 100644 (file)
@@ -216,6 +216,10 @@ mailbox_list_iter_next(struct mailbox_list_iterate_context *ctx);
 /* Deinitialize mailbox list request. Returns -1 if some error
    occurred while listing. */
 int mailbox_list_iter_deinit(struct mailbox_list_iterate_context **ctx);
+/* List one mailbox. Returns 1 if info returned, 0 if mailbox doesn't exist,
+   -1 if error. */
+int mailbox_list_mailbox(struct mailbox_list *list, const char *name,
+                        enum mailbox_info_flags *flags_r);
 
 /* Subscribe/unsubscribe mailbox. There should be no error when
    subscribing to already subscribed mailbox. Subscribing to
index 4b527bb19a8e534025c5c2b674ec9f3ae3353743..8a26f9db85134eac226f4f3e261253182f7b5cea 100644 (file)
@@ -63,7 +63,7 @@ acl_mailbox_open_as_admin(struct client_command_context *cmd, const char *name)
                return NULL;
        }
 
-       ns = client_find_namespace(cmd, &name);
+       ns = client_find_namespace(cmd, &name, CLIENT_VERIFY_MAILBOX_NONE);
        if (ns == NULL)
                return NULL;
 
@@ -293,7 +293,8 @@ static bool cmd_myrights(struct client_command_context *cmd)
        }
 
        real_mailbox = mailbox;
-       ns = client_find_namespace(cmd, &real_mailbox);
+       ns = client_find_namespace(cmd, &real_mailbox,
+                                  CLIENT_VERIFY_MAILBOX_NONE);
        if (ns == NULL)
                return TRUE;
 
index 41f6b8dcf3a5b4e4817e2a3f2790ade38c8ffd06..51a3bcc40ead789cbacb80adaf4be232e3d86ec9 100644 (file)
@@ -80,7 +80,7 @@ static bool cmd_getquotaroot(struct client_command_context *cmd)
                return FALSE;
 
        orig_mailbox = mailbox;
-       ns = client_find_namespace(cmd, &mailbox);
+       ns = client_find_namespace(cmd, &mailbox, CLIENT_VERIFY_MAILBOX_NONE);
        if (ns == NULL)
                return TRUE;