From: Timo Sirainen Date: Sun, 24 Mar 2013 10:09:39 +0000 (+0200) Subject: "Mailbox doesn't exist" error mixed up using storage and virtual mailbox names. X-Git-Tag: 2.1.16~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bdb026e2dc8a7c77585ed5ba489f0056df8074d4;p=thirdparty%2Fdovecot%2Fcore.git "Mailbox doesn't exist" error mixed up using storage and virtual mailbox names. This could have allowed a user to figure out existence of a mailbox without having lookup ACL. --- diff --git a/src/lib-storage/index/cydir/cydir-storage.c b/src/lib-storage/index/cydir/cydir-storage.c index 8427c1fb07..6268834cdc 100644 --- a/src/lib-storage/index/cydir/cydir-storage.c +++ b/src/lib-storage/index/cydir/cydir-storage.c @@ -68,7 +68,7 @@ static int cydir_mailbox_open(struct mailbox *box) /* exists, open it */ } else if (errno == ENOENT) { mail_storage_set_error(box->storage, MAIL_ERROR_NOTFOUND, - T_MAIL_ERR_MAILBOX_NOT_FOUND(box->name)); + T_MAIL_ERR_MAILBOX_NOT_FOUND(box->vname)); return -1; } else if (errno == EACCES) { mail_storage_set_critical(box->storage, "%s", diff --git a/src/lib-storage/index/dbox-common/dbox-storage.c b/src/lib-storage/index/dbox-common/dbox-storage.c index 714521b1f2..ae6b3058c5 100644 --- a/src/lib-storage/index/dbox-common/dbox-storage.c +++ b/src/lib-storage/index/dbox-common/dbox-storage.c @@ -184,7 +184,7 @@ int dbox_mailbox_open(struct mailbox *box) ; else if (errno == ENOENT || errno == ENAMETOOLONG) { mail_storage_set_error(box->storage, MAIL_ERROR_NOTFOUND, - T_MAIL_ERR_MAILBOX_NOT_FOUND(box->name)); + T_MAIL_ERR_MAILBOX_NOT_FOUND(box->vname)); return -1; } else if (errno == EACCES) { mail_storage_set_critical(box->storage, "%s", diff --git a/src/lib-storage/index/maildir/maildir-storage.c b/src/lib-storage/index/maildir/maildir-storage.c index 904ebdda50..bfccec51c4 100644 --- a/src/lib-storage/index/maildir/maildir-storage.c +++ b/src/lib-storage/index/maildir/maildir-storage.c @@ -367,7 +367,7 @@ static int maildir_mailbox_open(struct mailbox *box) if (errno == ENOENT || errno == ENAMETOOLONG) { mail_storage_set_error(box->storage, MAIL_ERROR_NOTFOUND, - T_MAIL_ERR_MAILBOX_NOT_FOUND(box->name)); + T_MAIL_ERR_MAILBOX_NOT_FOUND(box->vname)); return -1; } else { mail_storage_set_critical(box->storage, diff --git a/src/lib-storage/index/mbox/mbox-storage.c b/src/lib-storage/index/mbox/mbox-storage.c index 32f1cb8c72..fd0a7e0aea 100644 --- a/src/lib-storage/index/mbox/mbox-storage.c +++ b/src/lib-storage/index/mbox/mbox-storage.c @@ -470,7 +470,7 @@ static int mbox_mailbox_open(struct mailbox *box) return -1; } else if (ENOTFOUND(errno)) { mail_storage_set_error(box->storage, MAIL_ERROR_NOTFOUND, - T_MAIL_ERR_MAILBOX_NOT_FOUND(box->name)); + T_MAIL_ERR_MAILBOX_NOT_FOUND(box->vname)); return -1; } else if (mail_storage_set_error_from_errno(box->storage)) { return -1; diff --git a/src/lib-storage/index/pop3c/pop3c-storage.c b/src/lib-storage/index/pop3c/pop3c-storage.c index b09306a0df..3703b53804 100644 --- a/src/lib-storage/index/pop3c/pop3c-storage.c +++ b/src/lib-storage/index/pop3c/pop3c-storage.c @@ -165,7 +165,7 @@ static int pop3c_mailbox_open(struct mailbox *box) if (strcmp(box->name, "INBOX") != 0) { mail_storage_set_error(box->storage, MAIL_ERROR_NOTFOUND, - T_MAIL_ERR_MAILBOX_NOT_FOUND(box->name)); + T_MAIL_ERR_MAILBOX_NOT_FOUND(box->vname)); return -1; } diff --git a/src/lib-storage/index/raw/raw-storage.c b/src/lib-storage/index/raw/raw-storage.c index 1054e81ea7..14825377b7 100644 --- a/src/lib-storage/index/raw/raw-storage.c +++ b/src/lib-storage/index/raw/raw-storage.c @@ -151,7 +151,7 @@ static int raw_mailbox_open(struct mailbox *box) if (ENOTFOUND(errno)) { mail_storage_set_error(box->storage, MAIL_ERROR_NOTFOUND, - T_MAIL_ERR_MAILBOX_NOT_FOUND(box->name)); + T_MAIL_ERR_MAILBOX_NOT_FOUND(box->vname)); } else if (!mail_storage_set_error_from_errno(box->storage)) { mail_storage_set_critical(box->storage, "open(%s) failed: %m", path); diff --git a/src/lib-storage/list/mailbox-list-delete.c b/src/lib-storage/list/mailbox-list-delete.c index e4c57f9859..70aaae688d 100644 --- a/src/lib-storage/list/mailbox-list-delete.c +++ b/src/lib-storage/list/mailbox-list-delete.c @@ -68,7 +68,7 @@ int mailbox_list_delete_maildir_via_trash(struct mailbox_list *list, continue; } mailbox_list_set_error(list, MAIL_ERROR_NOTFOUND, - T_MAIL_ERR_MAILBOX_NOT_FOUND(name)); + T_MAILBOX_LIST_ERR_NOT_FOUND(list, name)); return -1; } if (errno == EXDEV) { @@ -130,7 +130,7 @@ int mailbox_list_delete_mailbox_file(struct mailbox_list *list, return 0; else if (ENOTFOUND(errno)) { mailbox_list_set_error(list, MAIL_ERROR_NOTFOUND, - T_MAIL_ERR_MAILBOX_NOT_FOUND(name)); + T_MAILBOX_LIST_ERR_NOT_FOUND(list, name)); return -1; } else { if (!mailbox_list_set_error_from_errno(list)) { @@ -158,7 +158,7 @@ int mailbox_list_delete_mailbox_nonrecursive(struct mailbox_list *list, if (dir == NULL) { if (errno == ENOENT) { mailbox_list_set_error(list, MAIL_ERROR_NOTFOUND, - T_MAIL_ERR_MAILBOX_NOT_FOUND(name)); + T_MAILBOX_LIST_ERR_NOT_FOUND(list, name)); } else { if (!mailbox_list_set_error_from_errno(list)) { mailbox_list_set_critical(list, @@ -340,7 +340,7 @@ int mailbox_list_delete_symlink_default(struct mailbox_list *list, if (errno == ENOENT) { mailbox_list_set_error(list, MAIL_ERROR_NOTFOUND, - T_MAIL_ERR_MAILBOX_NOT_FOUND(name)); + T_MAILBOX_LIST_ERR_NOT_FOUND(list, name)); } else if (errno == EISDIR || errno == EPERM) { /* Solaris */ mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE, diff --git a/src/lib-storage/list/mailbox-list-fs.c b/src/lib-storage/list/mailbox-list-fs.c index 99705aedcf..62c51bdd5e 100644 --- a/src/lib-storage/list/mailbox-list-fs.c +++ b/src/lib-storage/list/mailbox-list-fs.c @@ -393,7 +393,7 @@ static int fs_list_delete_dir(struct mailbox_list *list, const char *name) if (errno == ENOENT || errno == ENOTDIR) { mailbox_list_set_error(list, MAIL_ERROR_NOTFOUND, - T_MAIL_ERR_MAILBOX_NOT_FOUND(name)); + T_MAILBOX_LIST_ERR_NOT_FOUND(list, name)); } else if (errno == ENOTEMPTY || errno == EEXIST) { /* mbox workaround: if only .imap/ directory is preventing the deletion, remove it */ @@ -586,7 +586,7 @@ static int fs_list_rename_mailbox(struct mailbox_list *oldlist, if (rename(oldpath, newpath) < 0) { if (ENOTFOUND(errno)) { mailbox_list_set_error(oldlist, MAIL_ERROR_NOTFOUND, - T_MAIL_ERR_MAILBOX_NOT_FOUND(oldname)); + T_MAILBOX_LIST_ERR_NOT_FOUND(oldlist, oldname)); } else if (!mailbox_list_set_error_from_errno(oldlist)) { mailbox_list_set_critical(oldlist, "rename(%s, %s) failed: %m", oldpath, newpath); diff --git a/src/lib-storage/list/mailbox-list-maildir.c b/src/lib-storage/list/mailbox-list-maildir.c index 84a4bdc675..146dd39a39 100644 --- a/src/lib-storage/list/mailbox-list-maildir.c +++ b/src/lib-storage/list/mailbox-list-maildir.c @@ -428,7 +428,7 @@ static int maildir_list_delete_dir(struct mailbox_list *list, const char *name) "Mailbox exists"); } else if (errno == ENOENT || errno == ENOTDIR) { mailbox_list_set_error(list, MAIL_ERROR_NOTFOUND, - T_MAIL_ERR_MAILBOX_NOT_FOUND(name)); + T_MAILBOX_LIST_ERR_NOT_FOUND(list, name)); } else { mailbox_list_set_critical(list, "stat(%s) failed: %m", path); } @@ -613,7 +613,7 @@ maildir_list_rename_mailbox(struct mailbox_list *oldlist, const char *oldname, return -1; if (!found && ret == 0) { mailbox_list_set_error(oldlist, MAIL_ERROR_NOTFOUND, - T_MAIL_ERR_MAILBOX_NOT_FOUND(oldname)); + T_MAILBOX_LIST_ERR_NOT_FOUND(oldlist, oldname)); return -1; } diff --git a/src/lib-storage/mailbox-list-private.h b/src/lib-storage/mailbox-list-private.h index 5c5a2922e0..30d3eb53e2 100644 --- a/src/lib-storage/mailbox-list-private.h +++ b/src/lib-storage/mailbox-list-private.h @@ -11,6 +11,10 @@ #define MAILBOX_LOG_FILE_NAME "dovecot.mailbox.log" +#define T_MAILBOX_LIST_ERR_NOT_FOUND(list, name) \ + t_strdup_printf(MAIL_ERRSTR_MAILBOX_NOT_FOUND, \ + mailbox_list_get_vname(list, name)) + enum mailbox_log_record_type; struct stat; struct dirent; diff --git a/src/plugins/acl/acl-mailbox.c b/src/plugins/acl/acl-mailbox.c index 0cb19bc672..883937acf6 100644 --- a/src/plugins/acl/acl-mailbox.c +++ b/src/plugins/acl/acl-mailbox.c @@ -159,7 +159,7 @@ static void acl_mailbox_fail_not_found(struct mailbox *box) MAIL_ERRSTR_NO_PERMISSION); } else if (ret == 0) { mail_storage_set_error(box->storage, MAIL_ERROR_NOTFOUND, - T_MAIL_ERR_MAILBOX_NOT_FOUND(box->name)); + T_MAIL_ERR_MAILBOX_NOT_FOUND(box->vname)); } } diff --git a/src/plugins/virtual/virtual-config.c b/src/plugins/virtual/virtual-config.c index f21bb7d405..502ceac5c9 100644 --- a/src/plugins/virtual/virtual-config.c +++ b/src/plugins/virtual/virtual-config.c @@ -378,7 +378,7 @@ int virtual_config_read(struct virtual_mailbox *mbox) "Virtual mailbox missing configuration file"); } else if (errno == ENOENT) { mail_storage_set_error(storage, MAIL_ERROR_NOTFOUND, - T_MAIL_ERR_MAILBOX_NOT_FOUND(mbox->box.name)); + T_MAIL_ERR_MAILBOX_NOT_FOUND(mbox->box.vname)); } else { mail_storage_set_critical(storage, "stat(%s) failed: %m", box_path);