dovecot-2.0-sslstream: mailbox_list_get_mailbox_name_status() no...
dovecot at dovecot.org
dovecot at dovecot.org
Sat Feb 13 03:00:56 EET 2010
details: http://hg.dovecot.org/dovecot-2.0-sslstream/rev/a9922c28f5cb
changeset: 10673:a9922c28f5cb
user: Timo Sirainen <tss at iki.fi>
date: Mon Feb 08 23:43:45 2010 +0200
description:
mailbox_list_get_mailbox_name_status() now separates between existing mailbox and dir.
diffstat:
9 files changed, 29 insertions(+), 14 deletions(-)
src/imap/cmd-delete.c | 2 +-
src/imap/cmd-rename.c | 2 +-
src/imap/cmd-subscribe.c | 2 +-
src/imap/imap-commands-util.c | 9 ++++-----
src/imap/imap-commands-util.h | 2 ++
src/lib-storage/list/mailbox-list-fs.c | 16 +++++++++++++---
src/lib-storage/list/mailbox-list-maildir.c | 2 +-
src/lib-storage/mailbox-list.h | 5 ++++-
src/plugins/acl/acl-mailbox-list.c | 3 ++-
diffs (158 lines):
diff -r cf6f3ce452d3 -r a9922c28f5cb src/imap/cmd-delete.c
--- 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 @@ bool cmd_delete(struct client_command_co
}
ns = client_find_namespace(cmd, &name,
- CLIENT_VERIFY_MAILBOX_SHOULD_EXIST);
+ CLIENT_VERIFY_MAILBOX_DIR_SHOULD_EXIST);
if (ns == NULL)
return TRUE;
diff -r cf6f3ce452d3 -r a9922c28f5cb src/imap/cmd-rename.c
--- 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 @@ bool cmd_rename(struct client_command_co
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 -r cf6f3ce452d3 -r a9922c28f5cb src/imap/cmd-subscribe.c
--- 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 @@ bool cmd_subscribe_full(struct client_co
/* 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 -r cf6f3ce452d3 -r a9922c28f5cb src/imap/imap-commands-util.c
--- 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 @@ client_find_namespace(struct client_comm
}
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 -r cf6f3ce452d3 -r a9922c28f5cb src/imap/imap-commands-util.h
--- 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 @@ 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 -r cf6f3ce452d3 -r a9922c28f5cb src/lib-storage/list/mailbox-list-fs.c
--- 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,14 +235,24 @@ fs_list_get_mailbox_name_status(struct m
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;
- return 0;
+ *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)) {
diff -r cf6f3ce452d3 -r a9922c28f5cb src/lib-storage/list/mailbox-list-maildir.c
--- 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 @@ maildir_list_get_mailbox_name_status(str
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 -r cf6f3ce452d3 -r a9922c28f5cb src/lib-storage/mailbox-list.h
--- 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_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 -r cf6f3ce452d3 -r a9922c28f5cb src/plugins/acl/acl-mailbox-list.c
--- 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 @@ static int acl_get_mailbox_name_status(s
/* 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:
More information about the dovecot-cvs
mailing list