From: Timo Sirainen Date: Mon, 8 Feb 2010 21:43:45 +0000 (+0200) Subject: mailbox_list_get_mailbox_name_status() now separates between existing mailbox and... X-Git-Tag: 2.0.beta3~126 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a574952c01611899b8ecf81434dbbb3345f27518;p=thirdparty%2Fdovecot%2Fcore.git mailbox_list_get_mailbox_name_status() now separates between existing mailbox and dir. --HG-- branch : HEAD --- diff --git a/src/imap/cmd-delete.c b/src/imap/cmd-delete.c index 4c33297104..fa24af0e66 100644 --- a/src/imap/cmd-delete.c +++ b/src/imap/cmd-delete.c @@ -21,7 +21,7 @@ bool cmd_delete(struct client_command_context *cmd) } ns = client_find_namespace(cmd, &name, - CLIENT_VERIFY_MAILBOX_SHOULD_EXIST); + CLIENT_VERIFY_MAILBOX_DIR_SHOULD_EXIST); if (ns == NULL) return TRUE; diff --git a/src/imap/cmd-rename.c b/src/imap/cmd-rename.c index 711f468dab..1063e5110f 100644 --- a/src/imap/cmd-rename.c +++ b/src/imap/cmd-rename.c @@ -15,7 +15,7 @@ bool cmd_rename(struct client_command_context *cmd) return FALSE; old_ns = client_find_namespace(cmd, &oldname, - CLIENT_VERIFY_MAILBOX_SHOULD_EXIST); + CLIENT_VERIFY_MAILBOX_DIR_SHOULD_EXIST); if (old_ns == NULL) return TRUE; diff --git a/src/imap/cmd-subscribe.c b/src/imap/cmd-subscribe.c index e99a6d1cdc..222bb7db31 100644 --- a/src/imap/cmd-subscribe.c +++ b/src/imap/cmd-subscribe.c @@ -75,7 +75,7 @@ bool cmd_subscribe_full(struct client_command_context *cmd, bool subscribe) /* subscribing to a listable namespace prefix, allow it. */ } else if (subscribe) { if (client_find_namespace(cmd, &verify_name, - CLIENT_VERIFY_MAILBOX_SHOULD_EXIST) == NULL) + CLIENT_VERIFY_MAILBOX_DIR_SHOULD_EXIST) == NULL) return TRUE; } else { if (client_find_namespace(cmd, &verify_name, diff --git a/src/imap/imap-commands-util.c b/src/imap/imap-commands-util.c index ba0dcf8a39..a7a5940109 100644 --- a/src/imap/imap-commands-util.c +++ b/src/imap/imap-commands-util.c @@ -90,31 +90,30 @@ client_find_namespace(struct client_command_context *cmd, const char **mailboxp, } switch (mailbox_status) { - case MAILBOX_NAME_EXISTS: + case MAILBOX_NAME_EXISTS_MAILBOX: switch (mode) { case CLIENT_VERIFY_MAILBOX_NONE: case CLIENT_VERIFY_MAILBOX_NAME: case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST: + case CLIENT_VERIFY_MAILBOX_DIR_SHOULD_EXIST: case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST_TRYCREATE: return ns; case CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST: break; } - if (mode == CLIENT_VERIFY_MAILBOX_NAME || - mode == CLIENT_VERIFY_MAILBOX_SHOULD_EXIST) - return ns; - client_send_tagline(cmd, t_strconcat( "NO [", IMAP_RESP_CODE_ALREADYEXISTS, "] Mailbox exists.", NULL)); break; case MAILBOX_NAME_VALID: + case MAILBOX_NAME_EXISTS_DIR: resp_code = ""; switch (mode) { case CLIENT_VERIFY_MAILBOX_NAME: case CLIENT_VERIFY_MAILBOX_SHOULD_NOT_EXIST: + case CLIENT_VERIFY_MAILBOX_DIR_SHOULD_EXIST: return ns; case CLIENT_VERIFY_MAILBOX_SHOULD_EXIST: if ((cmd->cmd_flags & COMMAND_FLAG_USE_NONEXISTENT) != 0) diff --git a/src/imap/imap-commands-util.h b/src/imap/imap-commands-util.h index f738d116d0..8c4abab953 100644 --- a/src/imap/imap-commands-util.h +++ b/src/imap/imap-commands-util.h @@ -8,6 +8,8 @@ enum client_verify_mailbox_mode { CLIENT_VERIFY_MAILBOX_NAME, /* If mailbox doesn't exist, fail with [NONEXISTENT] resp code */ CLIENT_VERIFY_MAILBOX_SHOULD_EXIST, + /* Like above, but allow also non-selectable mailboxes */ + CLIENT_VERIFY_MAILBOX_DIR_SHOULD_EXIST, /* If mailbox doesn't exist, fail with [TRYCREATE] resp code */ CLIENT_VERIFY_MAILBOX_SHOULD_EXIST_TRYCREATE, /* If mailbox exists, fail with [ALREADYEXISTS] resp code */ diff --git a/src/lib-storage/list/mailbox-list-fs.c b/src/lib-storage/list/mailbox-list-fs.c index 4d5cd0bef6..2fb7a22e90 100644 --- a/src/lib-storage/list/mailbox-list-fs.c +++ b/src/lib-storage/list/mailbox-list-fs.c @@ -235,15 +235,25 @@ fs_list_get_mailbox_name_status(struct mailbox_list *_list, const char *name, enum mailbox_name_status *status) { struct stat st; - const char *path; + const char *path, *dir_path; path = mailbox_list_get_path(_list, name, MAILBOX_LIST_PATH_TYPE_MAILBOX); if (strcmp(name, "INBOX") == 0 || stat(path, &st) == 0) { - *status = MAILBOX_NAME_EXISTS; + *status = MAILBOX_NAME_EXISTS_MAILBOX; return 0; } + if (errno == ENOENT) { + /* see if the directory exists */ + dir_path = mailbox_list_get_path(_list, name, + MAILBOX_LIST_PATH_TYPE_DIR); + if (strcmp(path, dir_path) != 0 && stat(dir_path, &st) == 0) { + *status = MAILBOX_NAME_EXISTS_DIR; + return 0; + } + errno = ENOENT; + } if (!mailbox_list_is_valid_create_name(_list, name)) { *status = MAILBOX_NAME_INVALID; diff --git a/src/lib-storage/list/mailbox-list-maildir.c b/src/lib-storage/list/mailbox-list-maildir.c index 65674d16ca..ab95f7150f 100644 --- a/src/lib-storage/list/mailbox-list-maildir.c +++ b/src/lib-storage/list/mailbox-list-maildir.c @@ -246,7 +246,7 @@ maildir_list_get_mailbox_name_status(struct mailbox_list *_list, if ((strcmp(name, "INBOX") == 0 && (_list->ns->flags & NAMESPACE_FLAG_INBOX) != 0) || stat(path, &st) == 0) { - *status = MAILBOX_NAME_EXISTS; + *status = MAILBOX_NAME_EXISTS_MAILBOX; return 0; } diff --git a/src/lib-storage/mailbox-list.h b/src/lib-storage/mailbox-list.h index cae3836336..933cf17254 100644 --- a/src/lib-storage/mailbox-list.h +++ b/src/lib-storage/mailbox-list.h @@ -43,7 +43,10 @@ enum mailbox_info_flags { }; enum mailbox_name_status { - MAILBOX_NAME_EXISTS, + /* name points to a selectable mailbox */ + MAILBOX_NAME_EXISTS_MAILBOX, + /* name points to non-selectable mailbox */ + MAILBOX_NAME_EXISTS_DIR, MAILBOX_NAME_VALID, MAILBOX_NAME_INVALID, MAILBOX_NAME_NOINFERIORS diff --git a/src/plugins/acl/acl-mailbox-list.c b/src/plugins/acl/acl-mailbox-list.c index 8fea75cc02..15f1befd53 100644 --- a/src/plugins/acl/acl-mailbox-list.c +++ b/src/plugins/acl/acl-mailbox-list.c @@ -436,7 +436,8 @@ static int acl_get_mailbox_name_status(struct mailbox_list *list, /* we shouldn't reveal this mailbox's existance */ switch (*status) { - case MAILBOX_NAME_EXISTS: + case MAILBOX_NAME_EXISTS_MAILBOX: + case MAILBOX_NAME_EXISTS_DIR: *status = MAILBOX_NAME_VALID; break; case MAILBOX_NAME_VALID: