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