Mercurial > dovecot > core-2.2
changeset 10672:a9922c28f5cb HEAD
mailbox_list_get_mailbox_name_status() now separates between existing mailbox and dir.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 08 Feb 2010 23:43:45 +0200 |
parents | cf6f3ce452d3 |
children | 6552652a9504 |
files | 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 |
diffstat | 9 files changed, 28 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/imap/cmd-delete.c Mon Feb 08 22:48:22 2010 +0200 +++ b/src/imap/cmd-delete.c Mon Feb 08 23:43:45 2010 +0200 @@ -21,7 +21,7 @@ } ns = client_find_namespace(cmd, &name, - CLIENT_VERIFY_MAILBOX_SHOULD_EXIST); + CLIENT_VERIFY_MAILBOX_DIR_SHOULD_EXIST); if (ns == NULL) return TRUE;
--- a/src/imap/cmd-rename.c Mon Feb 08 22:48:22 2010 +0200 +++ b/src/imap/cmd-rename.c Mon Feb 08 23:43:45 2010 +0200 @@ -15,7 +15,7 @@ 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;
--- a/src/imap/cmd-subscribe.c Mon Feb 08 22:48:22 2010 +0200 +++ b/src/imap/cmd-subscribe.c Mon Feb 08 23:43:45 2010 +0200 @@ -75,7 +75,7 @@ /* 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,
--- a/src/imap/imap-commands-util.c Mon Feb 08 22:48:22 2010 +0200 +++ b/src/imap/imap-commands-util.c Mon Feb 08 23:43:45 2010 +0200 @@ -90,31 +90,30 @@ } 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)
--- a/src/imap/imap-commands-util.h Mon Feb 08 22:48:22 2010 +0200 +++ b/src/imap/imap-commands-util.h Mon Feb 08 23:43:45 2010 +0200 @@ -8,6 +8,8 @@ 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 */
--- a/src/lib-storage/list/mailbox-list-fs.c Mon Feb 08 22:48:22 2010 +0200 +++ b/src/lib-storage/list/mailbox-list-fs.c Mon Feb 08 23:43:45 2010 +0200 @@ -235,15 +235,25 @@ 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;
--- a/src/lib-storage/list/mailbox-list-maildir.c Mon Feb 08 22:48:22 2010 +0200 +++ b/src/lib-storage/list/mailbox-list-maildir.c Mon Feb 08 23:43:45 2010 +0200 @@ -246,7 +246,7 @@ 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; }
--- a/src/lib-storage/mailbox-list.h Mon Feb 08 22:48:22 2010 +0200 +++ b/src/lib-storage/mailbox-list.h Mon Feb 08 23:43:45 2010 +0200 @@ -43,7 +43,10 @@ }; 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
--- a/src/plugins/acl/acl-mailbox-list.c Mon Feb 08 22:48:22 2010 +0200 +++ b/src/plugins/acl/acl-mailbox-list.c Mon Feb 08 23:43:45 2010 +0200 @@ -436,7 +436,8 @@ /* 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: