}
ns = client_find_namespace(cmd, &name,
- CLIENT_VERIFY_MAILBOX_SHOULD_EXIST);
+ CLIENT_VERIFY_MAILBOX_DIR_SHOULD_EXIST);
if (ns == NULL)
return TRUE;
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;
/* 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,
}
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)
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 */
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;
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;
}
};
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
/* 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: