From: Timo Sirainen Date: Mon, 3 Aug 2009 03:21:43 +0000 (-0400) Subject: Allow namespace prefix to be opened as mailbox, if it already exists. X-Git-Tag: 2.0.alpha1~339 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1c885b304f060e3ac4fe04195a2f53457d0ac99e;p=thirdparty%2Fdovecot%2Fcore.git Allow namespace prefix to be opened as mailbox, if it already exists. --HG-- branch : HEAD --- diff --git a/src/imap/cmd-append.c b/src/imap/cmd-append.c index e6e52310c5..b4c47a042d 100644 --- a/src/imap/cmd-append.c +++ b/src/imap/cmd-append.c @@ -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; diff --git a/src/imap/cmd-copy.c b/src/imap/cmd-copy.c index 4658a68ea8..f37ed3c9da 100644 --- a/src/imap/cmd-copy.c +++ b/src/imap/cmd-copy.c @@ -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; diff --git a/src/imap/cmd-create.c b/src/imap/cmd-create.c index b874850712..b87b0b2d07 100644 --- a/src/imap/cmd-create.c +++ b/src/imap/cmd-create.c @@ -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); diff --git a/src/imap/cmd-delete.c b/src/imap/cmd-delete.c index 7e3962eebc..8db06484a1 100644 --- a/src/imap/cmd-delete.c +++ b/src/imap/cmd-delete.c @@ -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; diff --git a/src/imap/cmd-list.c b/src/imap/cmd-list.c index caac742dbf..7e5ce0a942 100644 --- a/src/imap/cmd-list.c +++ b/src/imap/cmd-list.c @@ -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; } diff --git a/src/imap/cmd-rename.c b/src/imap/cmd-rename.c index 6bb7b449b2..aa64d0a0b1 100644 --- a/src/imap/cmd-rename.c +++ b/src/imap/cmd-rename.c @@ -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; diff --git a/src/imap/cmd-select.c b/src/imap/cmd-select.c index 4860e77b41..6f27f94769 100644 --- a/src/imap/cmd-select.c +++ b/src/imap/cmd-select.c @@ -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; diff --git a/src/imap/cmd-status.c b/src/imap/cmd-status.c index 1af4764a27..817a14eb34 100644 --- a/src/imap/cmd-status.c +++ b/src/imap/cmd-status.c @@ -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; diff --git a/src/imap/cmd-subscribe.c b/src/imap/cmd-subscribe.c index a682f2b897..d2476ab4af 100644 --- a/src/imap/cmd-subscribe.c +++ b/src/imap/cmd-subscribe.c @@ -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; } diff --git a/src/imap/imap-commands-util.c b/src/imap/imap-commands-util.c index 3771bd5cb7..5a16ae1853 100644 --- a/src/imap/imap-commands-util.c +++ b/src/imap/imap-commands-util.c @@ -20,35 +20,28 @@ #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) diff --git a/src/imap/imap-commands-util.h b/src/imap/imap-commands-util.h index ae59c7da6b..c1964c56df 100644 --- a/src/imap/imap-commands-util.h +++ b/src/imap/imap-commands-util.h @@ -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. */ diff --git a/src/lib-storage/index/maildir/maildir-storage.c b/src/lib-storage/index/maildir/maildir-storage.c index 006494f7c5..24b6bdc4bc 100644 --- a/src/lib-storage/index/maildir/maildir-storage.c +++ b/src/lib-storage/index/maildir/maildir-storage.c @@ -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; diff --git a/src/lib-storage/list/mailbox-list-maildir.c b/src/lib-storage/list/mailbox-list-maildir.c index 6179556214..c0993201cb 100644 --- a/src/lib-storage/list/mailbox-list-maildir.c +++ b/src/lib-storage/list/mailbox-list-maildir.c @@ -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; diff --git a/src/lib-storage/mail-namespace.c b/src/lib-storage/mail-namespace.c index c7c9885155..45f3c27e60 100644 --- a/src/lib-storage/mail-namespace.c +++ b/src/lib-storage/mail-namespace.c @@ -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; } diff --git a/src/lib-storage/mailbox-list.c b/src/lib-storage/mailbox-list.c index 92cd9454b1..98733c0093 100644 --- a/src/lib-storage/mailbox-list.c +++ b/src/lib-storage/mailbox-list.c @@ -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"); diff --git a/src/lib-storage/mailbox-list.h b/src/lib-storage/mailbox-list.h index 7b307fd5fd..0956c48276 100644 --- a/src/lib-storage/mailbox-list.h +++ b/src/lib-storage/mailbox-list.h @@ -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 diff --git a/src/plugins/imap-acl/imap-acl-plugin.c b/src/plugins/imap-acl/imap-acl-plugin.c index 4b527bb19a..8a26f9db85 100644 --- a/src/plugins/imap-acl/imap-acl-plugin.c +++ b/src/plugins/imap-acl/imap-acl-plugin.c @@ -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; diff --git a/src/plugins/imap-quota/imap-quota-plugin.c b/src/plugins/imap-quota/imap-quota-plugin.c index 41f6b8dcf3..51a3bcc40e 100644 --- a/src/plugins/imap-quota/imap-quota-plugin.c +++ b/src/plugins/imap-quota/imap-quota-plugin.c @@ -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;