]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
mailbox_list_get_mailbox_name_status() now separates between existing mailbox and...
authorTimo Sirainen <tss@iki.fi>
Mon, 8 Feb 2010 21:43:45 +0000 (23:43 +0200)
committerTimo Sirainen <tss@iki.fi>
Mon, 8 Feb 2010 21:43:45 +0000 (23:43 +0200)
--HG--
branch : HEAD

src/imap/cmd-delete.c
src/imap/cmd-rename.c
src/imap/cmd-subscribe.c
src/imap/imap-commands-util.c
src/imap/imap-commands-util.h
src/lib-storage/list/mailbox-list-fs.c
src/lib-storage/list/mailbox-list-maildir.c
src/lib-storage/mailbox-list.h
src/plugins/acl/acl-mailbox-list.c

index 4c332971049c23a5da8da008a863e53e603ee129..fa24af0e664e7a7997eac28c0228eeca03c57493 100644 (file)
@@ -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;
 
index 711f468dab057520d2500f5935847ec237a1e640..1063e5110fe487dbbdd40dbb25930187d519b33b 100644 (file)
@@ -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;
 
index e99a6d1cdc0a35bce940512ea4a34b56517f0086..222bb7db318533fc1246245b22dd91d83985f54e 100644 (file)
@@ -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,
index ba0dcf8a39ae670c32e8c32112c9f10661298c89..a7a5940109846b2df3bee564f15c15197ebcc379 100644 (file)
@@ -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)
index f738d116d0bf11f876422c7c6fa2389b56f18995..8c4abab953ea3d817b64d313e72fe934d9d35981 100644 (file)
@@ -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 */
index 4d5cd0bef600da98044ab66cf08f41d9371b2934..2fb7a22e902a93af16f2fc516c9b93869a850caf 100644 (file)
@@ -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;
index 65674d16ca317e623a6159549f1c3a6d6d96c71a..ab95f7150f0e04c2c93302770d2e3f84b1d80ae8 100644 (file)
@@ -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;
        }
 
index cae3836336f31764e1ebf1fa1fd4467ad6b81529..933cf17254a52f66d0f26cb6df94d9cbf8502f9b 100644 (file)
@@ -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
index 8fea75cc0274f13509ad94cc55fc0a87a7180922..15f1befd534ea1af1b497a8bce914dfa3a83ea7c 100644 (file)
@@ -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: