]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Replaced mailbox_list_get_name_status() with mailbox_exists().
authorTimo Sirainen <tss@iki.fi>
Thu, 20 Jan 2011 16:14:53 +0000 (18:14 +0200)
committerTimo Sirainen <tss@iki.fi>
Thu, 20 Jan 2011 16:14:53 +0000 (18:14 +0200)
25 files changed:
src/imap/cmd-subscribe.c
src/lib-storage/index/cydir/cydir-storage.c
src/lib-storage/index/dbox-multi/mdbox-storage.c
src/lib-storage/index/dbox-single/sdbox-storage.c
src/lib-storage/index/imapc/imapc-storage.c
src/lib-storage/index/index-storage.c
src/lib-storage/index/index-storage.h
src/lib-storage/index/maildir/maildir-storage.c
src/lib-storage/index/mbox/mbox-storage.c
src/lib-storage/index/raw/raw-storage.c
src/lib-storage/index/shared/shared-list.c
src/lib-storage/list/mailbox-list-fs.c
src/lib-storage/list/mailbox-list-maildir.c
src/lib-storage/list/mailbox-list-none.c
src/lib-storage/mail-storage-private.h
src/lib-storage/mail-storage.c
src/lib-storage/mail-storage.h
src/lib-storage/mailbox-list-private.h
src/lib-storage/mailbox-list.c
src/lib-storage/mailbox-list.h
src/lib-storage/test-mailbox.c
src/plugins/acl/acl-mailbox-list.c
src/plugins/acl/acl-mailbox.c
src/plugins/listescape/listescape-plugin.c
src/plugins/virtual/virtual-storage.c

index 69b3198516687312d1407a7b6047723f0483ca4c..95dbaf18117e34adf53ac8c16d2823e8c0d85211 100644 (file)
@@ -29,9 +29,10 @@ static bool have_listable_namespace_prefix(struct mail_namespace *ns,
 static bool
 subscribe_is_valid_name(struct client_command_context *cmd, const char *mailbox)
 {
-       enum mailbox_name_status name_status;
        struct mail_namespace *ns;
+       struct mailbox *box;
        const char *storage_name;
+       int ret;
 
        if (have_listable_namespace_prefix(cmd->client->user->namespaces,
                                           mailbox)) {
@@ -44,12 +45,15 @@ subscribe_is_valid_name(struct client_command_context *cmd, const char *mailbox)
        if (ns == NULL)
                return FALSE;
 
-       if (mailbox_list_get_mailbox_name_status(ns->list, storage_name,
-                                                &name_status) < 0) {
-               client_send_list_error(cmd, ns->list);
+       box = mailbox_alloc(ns->list, storage_name, 0);
+       if ((ret = mailbox_exists(box)) < 0) {
+               client_send_storage_error(cmd, mailbox_get_storage(box));
+               mailbox_free(&box);
                return FALSE;
        }
-       if (name_status == MAILBOX_NAME_NONEXISTENT) {
+       mailbox_free(&box);
+
+       if (ret == 0) {
                client_send_tagline(cmd, t_strdup_printf(
                        "NO "MAIL_ERRSTR_MAILBOX_NOT_FOUND, mailbox));
                return FALSE;
index 0d20696013292f9a00ce60e855a9d65b700a1159..89998f14521a28b420e53a3d4ca062a410bd79f2 100644 (file)
@@ -136,6 +136,7 @@ struct mailbox cydir_mailbox = {
                index_storage_is_readonly,
                index_storage_allow_new_keywords,
                index_storage_mailbox_enable,
+               index_storage_mailbox_exists,
                cydir_mailbox_open,
                index_storage_mailbox_close,
                index_storage_mailbox_free,
index 1fc990da44fe5dc9b9dd634b0c3e88fcd7142f15..fc4e5b65e0204fd382c6a3628485f845d4ccb468 100644 (file)
@@ -409,6 +409,7 @@ struct mailbox mdbox_mailbox = {
                index_storage_is_readonly,
                index_storage_allow_new_keywords,
                index_storage_mailbox_enable,
+               index_storage_mailbox_exists,
                mdbox_mailbox_open,
                mdbox_mailbox_close,
                index_storage_mailbox_free,
index 1389522c3bfd57750d22cf006d7ade86b6135aee..f97101890fe4f47e105b184cc5333e281c1ada37 100644 (file)
@@ -367,6 +367,7 @@ struct mailbox sdbox_mailbox = {
                index_storage_is_readonly,
                index_storage_allow_new_keywords,
                index_storage_mailbox_enable,
+               index_storage_mailbox_exists,
                sdbox_mailbox_open,
                sdbox_mailbox_close,
                index_storage_mailbox_free,
index fa69d057f3f0038169f17517a1aceb4102b3dd9e..70e2fe52d208f4561a03be8a8ba09a3fe16c39a8 100644 (file)
@@ -536,6 +536,7 @@ struct mailbox imapc_mailbox = {
                index_storage_is_readonly,
                index_storage_allow_new_keywords,
                index_storage_mailbox_enable,
+               index_storage_mailbox_exists,
                imapc_mailbox_open,
                imapc_mailbox_close,
                index_storage_mailbox_free,
index 8c8907ec74a0594a8ea151535d27b44d6b38a908..7289e618517d0535f9e63ca470bcf87d171918b5 100644 (file)
@@ -150,6 +150,31 @@ index_mailbox_alloc_index(struct mailbox *box)
                                          box->index_prefix);
 }
 
+int index_storage_mailbox_exists(struct mailbox *box)
+{
+       struct stat st;
+       const char *path;
+
+       if (strcmp(box->name, "INBOX") == 0 &&
+           (box->list->ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0) {
+               /* INBOX always exists */
+               return 1;
+       }
+
+       path = mailbox_list_get_path(box->list, box->name,
+                                    MAILBOX_LIST_PATH_TYPE_MAILBOX);
+       if (stat(path, &st) == 0)
+               return 1;
+       else if (ENOTFOUND(errno) || errno == EACCES)
+               return 0;
+       else {
+               mail_storage_set_critical(box->storage,
+                                         "stat(%s) failed: %m", path);
+               return -1;
+       }
+}
+
+
 int index_storage_mailbox_open(struct mailbox *box, bool move_to_memory)
 {
        struct index_mailbox_context *ibox = INDEX_STORAGE_CONTEXT(box);
index 09927ffedffc1468e324417bfb3caec40671ebd0..fd042c8fef6f002d6ecf22feff0e5ab8e6d55ce8 100644 (file)
@@ -63,6 +63,7 @@ void index_storage_lock_notify_reset(struct mailbox *box);
 void index_storage_mailbox_alloc(struct mailbox *box, const char *name,
                                 enum mailbox_flags flags,
                                 const char *index_prefix);
+int index_storage_mailbox_exists(struct mailbox *box);
 int index_storage_mailbox_open(struct mailbox *box, bool move_to_memory);
 int index_storage_mailbox_enable(struct mailbox *box,
                                 enum mailbox_feature feature);
index 29648723ab68020144f213b1907855af54196aca..688766e49b9c211817069ec5e89326a083f7f138 100644 (file)
@@ -643,6 +643,7 @@ struct mailbox maildir_mailbox = {
                maildir_storage_is_readonly,
                index_storage_allow_new_keywords,
                index_storage_mailbox_enable,
+               index_storage_mailbox_exists,
                maildir_mailbox_open,
                maildir_mailbox_close,
                index_storage_mailbox_free,
index ff709111384b576556ceff376961c06e6cb321ef..e2620ae93160c3913c83aaed4b52bbe422fa2566 100644 (file)
@@ -753,6 +753,7 @@ struct mailbox mbox_mailbox = {
                mbox_storage_is_readonly,
                index_storage_allow_new_keywords,
                index_storage_mailbox_enable,
+               index_storage_mailbox_exists,
                mbox_mailbox_open,
                mbox_mailbox_close,
                index_storage_mailbox_free,
index 45566c394a88935ebef83574d138b0a7b8ef471e..f5a9e5bf76d50091b5961902124ca05a061d6c49 100644 (file)
@@ -136,6 +136,7 @@ struct mailbox raw_mailbox = {
                index_storage_is_readonly,
                index_storage_allow_new_keywords,
                index_storage_mailbox_enable,
+               index_storage_mailbox_exists,
                raw_mailbox_open,
                index_storage_mailbox_close,
                index_storage_mailbox_free,
index 6180506183d400380626dbd37087958030629643..52e97a335e2da73c4e348fbb271a88630a21ff49 100644 (file)
@@ -110,21 +110,6 @@ shared_list_get_path(struct mailbox_list *list, const char *name,
        return mailbox_list_get_path(ns->list, name, type);
 }
 
-static int
-shared_list_get_mailbox_name_status(struct mailbox_list *list, const char *name,
-                                   enum mailbox_name_status *status_r)
-{
-       struct mail_namespace *ns = list->ns;
-       int ret;
-
-       if (shared_storage_get_namespace(&ns, &name) < 0)
-               return -1;
-       ret = mailbox_list_get_mailbox_name_status(ns->list, name, status_r);
-       if (ret < 0)
-               shared_list_copy_error(list, ns);
-       return ret;
-}
-
 static const char *
 shared_list_get_temp_prefix(struct mailbox_list *list, bool global ATTR_UNUSED)
 {
@@ -326,7 +311,6 @@ struct mailbox_list shared_mailbox_list = {
                shared_is_valid_existing_name,
                shared_is_valid_create_name,
                shared_list_get_path,
-               shared_list_get_mailbox_name_status,
                shared_list_get_temp_prefix,
                shared_list_join_refpattern,
                shared_list_iter_init,
index 0f0282e3ed40946589157981f33a278445d106d2..b1fef29ca5ca2d844360b57fd2b6d4d74d852352 100644 (file)
@@ -211,58 +211,6 @@ fs_list_get_path(struct mailbox_list *_list, const char *name,
        }
 }
 
-static int
-fs_list_get_mailbox_name_status(struct mailbox_list *_list, const char *name,
-                               enum mailbox_name_status *status)
-{
-       struct stat st;
-       const char *path, *dir_path;
-       enum mailbox_info_flags flags;
-
-       if (strcmp(name, "INBOX") == 0 &&
-           (_list->ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0) {
-               *status = MAILBOX_NAME_EXISTS_MAILBOX;
-               return 0;
-       }
-
-       path = mailbox_list_get_path(_list, name,
-                                    MAILBOX_LIST_PATH_TYPE_MAILBOX);
-       if (stat(path, &st) == 0) {
-               if (*_list->set.maildir_name != '\0' ||
-                   _list->v.is_internal_name == NULL || !S_ISDIR(st.st_mode)) {
-                       *status = MAILBOX_NAME_EXISTS_MAILBOX;
-                       return 0;
-               }
-
-               /* check if mailbox is selectable */
-               if (mailbox_list_mailbox(_list, name, &flags) < 0)
-                       return -1;
-               if ((flags & (MAILBOX_NOSELECT | MAILBOX_NONEXISTENT)) == 0)
-                       *status = MAILBOX_NAME_EXISTS_MAILBOX;
-               else
-                       *status = MAILBOX_NAME_EXISTS_DIR;
-               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 (ENOTFOUND(errno) || errno == EACCES) {
-               *status = MAILBOX_NAME_NONEXISTENT;
-               return 0;
-       } else {
-               mailbox_list_set_critical(_list, "stat(%s) failed: %m", path);
-               return -1;
-       }
-}
-
 static const char *
 fs_list_get_temp_prefix(struct mailbox_list *_list, bool global)
 {
@@ -628,7 +576,6 @@ struct mailbox_list fs_mailbox_list = {
                fs_is_valid_existing_name,
                fs_is_valid_create_name,
                fs_list_get_path,
-               fs_list_get_mailbox_name_status,
                fs_list_get_temp_prefix,
                fs_list_join_refpattern,
                fs_list_iter_init,
index c45b4326b66b1a29b6e6961a419313b5f591d9f9..7b5039cb2c6ddd5cc30207c8f2cd1bf4ec00c29a 100644 (file)
@@ -222,33 +222,6 @@ maildir_list_get_path(struct mailbox_list *_list, const char *name,
        return maildir_list_get_dirname_path(_list, root_dir, name);
 }
 
-static int
-maildir_list_get_mailbox_name_status(struct mailbox_list *_list,
-                                    const char *name,
-                                    enum mailbox_name_status *status)
-{
-       struct stat st;
-       const char *path;
-
-       path = mailbox_list_get_path(_list, name,
-                                    MAILBOX_LIST_PATH_TYPE_MAILBOX);
-
-       if ((strcmp(name, "INBOX") == 0 &&
-            (_list->ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0) ||
-           stat(path, &st) == 0) {
-               *status = MAILBOX_NAME_EXISTS_MAILBOX;
-               return 0;
-       }
-
-       if (ENOTFOUND(errno) || errno == EACCES) {
-               *status = MAILBOX_NAME_NONEXISTENT;
-               return 0;
-       } else {
-               mailbox_list_set_critical(_list, "stat(%s) failed: %m", path);
-               return -1;
-       }
-}
-
 static const char *
 maildir_list_get_temp_prefix(struct mailbox_list *_list, bool global)
 {
@@ -637,7 +610,6 @@ struct mailbox_list maildir_mailbox_list = {
                maildir_is_valid_existing_name,
                maildir_is_valid_create_name,
                maildir_list_get_path,
-               maildir_list_get_mailbox_name_status,
                maildir_list_get_temp_prefix,
                NULL,
                maildir_list_iter_init,
@@ -669,7 +641,6 @@ struct mailbox_list imapdir_mailbox_list = {
                maildir_is_valid_existing_name,
                maildir_is_valid_create_name,
                maildir_list_get_path,
-               maildir_list_get_mailbox_name_status,
                maildir_list_get_temp_prefix,
                NULL,
                maildir_list_iter_init,
index e009ab0a9bb5ad5be941e22d2bf424f85bbc0e28..240cf489e07e1650381e203d23013121f5dbbb50 100644 (file)
@@ -57,15 +57,6 @@ none_list_get_path(struct mailbox_list *list ATTR_UNUSED,
        return NULL;
 }
 
-static int
-none_list_get_mailbox_name_status(struct mailbox_list *list ATTR_UNUSED,
-                                 const char *name ATTR_UNUSED,
-                                 enum mailbox_name_status *status)
-{
-       *status = MAILBOX_NAME_NONEXISTENT;
-       return 0;
-}
-
 static const char *
 none_list_get_temp_prefix(struct mailbox_list *list ATTR_UNUSED,
                          bool global ATTR_UNUSED)
@@ -168,7 +159,6 @@ struct mailbox_list none_mailbox_list = {
                none_is_valid_existing_name,
                none_is_valid_create_name,
                none_list_get_path,
-               none_list_get_mailbox_name_status,
                none_list_get_temp_prefix,
                NULL,
                none_list_iter_init,
index 85f87e1363701d5ee530520dd9b6f80264aa78e5..e4e9926a9f0beb46c61c1feb529f66563fea867d 100644 (file)
@@ -103,6 +103,7 @@ struct mailbox_vfuncs {
        bool (*allow_new_keywords)(struct mailbox *box);
 
        int (*enable)(struct mailbox *box, enum mailbox_feature features);
+       int (*exists)(struct mailbox *box);
        int (*open)(struct mailbox *box);
        void (*close)(struct mailbox *box);
        void (*free)(struct mailbox *box);
index 8c811d09d0a57c766a52110ba30a500f5fb67c87..37bffd0ada2d7e56607009624a75a1a366eff75b 100644 (file)
@@ -567,6 +567,17 @@ struct mailbox *mailbox_alloc(struct mailbox_list *list, const char *name,
        return box;
 }
 
+int mailbox_exists(struct mailbox *box)
+{
+       if (!mailbox_list_is_valid_existing_name(box->list, box->name)) {
+               mail_storage_set_error(box->storage, MAIL_ERROR_PARAMS,
+                                      "Invalid mailbox name");
+               return -1;
+       }
+
+       return box->v.exists(box);
+}
+
 static int mailbox_open_full(struct mailbox *box, struct istream *input)
 {
        int ret;
index dfc8f0f575af536ce540a42c60084da4dd9f8717..87036f709faa0a47c786175201c368b94a107520 100644 (file)
@@ -338,6 +338,9 @@ bool mail_storage_is_mailbox_file(struct mail_storage *storage) ATTR_PURE;
    with possibly different readonly-state. */
 struct mailbox *mailbox_alloc(struct mailbox_list *list, const char *name,
                              enum mailbox_flags flags);
+/* Returns 1 if mailbox exists (even if it's unselectable),
+   0 if not and -1 if some error occurred. */
+int mailbox_exists(struct mailbox *box);
 /* Open the mailbox. If this function isn't called explicitly, it's also called
    internally by lib-storage when necessary. */
 int mailbox_open(struct mailbox *box);
index dddeb8796346bfad8a8a9b9783f3fc966506b500..3fbf7570ddd403d77299ea4b672109b3f2880163 100644 (file)
@@ -45,9 +45,6 @@ struct mailbox_list_vfuncs {
 
        const char *(*get_path)(struct mailbox_list *list, const char *name,
                                enum mailbox_list_path_type type);
-       int (*get_mailbox_name_status)(struct mailbox_list *list,
-                                      const char *name,
-                                      enum mailbox_name_status *status);
 
        const char *(*get_temp_prefix)(struct mailbox_list *list, bool global);
        const char *(*join_refpattern)(struct mailbox_list *list,
index ba9775213676559783ac70c35d15fbb26849955c..6e58478085422b0c0a4c7714a53c9846f03ddb01 100644 (file)
@@ -775,18 +775,6 @@ const char *mailbox_list_join_refpattern(struct mailbox_list *list,
        return pattern;
 }
 
-int mailbox_list_get_mailbox_name_status(struct mailbox_list *list,
-                                        const char *name,
-                                        enum mailbox_name_status *status)
-{
-       if (!mailbox_list_is_valid_existing_name(list, name)) {
-               mailbox_list_set_error(list, MAIL_ERROR_PARAMS,
-                                      "Invalid mailbox name");
-               return -1;
-       }
-       return list->v.get_mailbox_name_status(list, name, status);
-}
-
 struct mailbox_list_iterate_context *
 mailbox_list_iter_init(struct mailbox_list *list, const char *pattern,
                       enum mailbox_list_iter_flags flags)
index 9cf8fc010fcd313e93640781c6bbabdf51b16415..82b0ea14abc87d77f2f09bcf60e8b784331d0204 100644 (file)
@@ -48,14 +48,6 @@ enum mailbox_info_flags {
        MAILBOX_MATCHED                 = 0x40000000
 };
 
-enum mailbox_name_status {
-       MAILBOX_NAME_NONEXISTENT,
-       /* name points to a selectable mailbox */
-       MAILBOX_NAME_EXISTS_MAILBOX,
-       /* name points to non-selectable mailbox */
-       MAILBOX_NAME_EXISTS_DIR
-};
-
 enum mailbox_list_iter_flags {
        /* Ignore index file and ACLs (used by ACL plugin internally) */
        MAILBOX_LIST_ITER_RAW_LIST              = 0x000001,
@@ -211,10 +203,6 @@ bool mailbox_list_is_valid_create_name(struct mailbox_list *list,
    For INDEX=MEMORY it returns "" as the path. */
 const char *mailbox_list_get_path(struct mailbox_list *list, const char *name,
                                  enum mailbox_list_path_type type);
-/* Returns mailbox name status */
-int mailbox_list_get_mailbox_name_status(struct mailbox_list *list,
-                                        const char *name,
-                                        enum mailbox_name_status *status);
 /* Returns mailbox's change log, or NULL if it doesn't have one. */
 struct mailbox_log *mailbox_list_get_changelog(struct mailbox_list *list);
 /* Specify timestamp to use when writing mailbox changes to changelog.
index 9572c396706a844038a7408f6c8a47973818a09d..c6fb9571526a219c991555f0251f89600f4bab19 100644 (file)
@@ -24,6 +24,11 @@ static int test_mailbox_enable(struct mailbox *box,
        return 0;
 }
 
+static int test_mailbox_exists(struct mailbox *box ATTR_UNUSED)
+{
+       return 1;
+}
+
 static int test_mailbox_open(struct mailbox *box ATTR_UNUSED)
 {
        return 0;
@@ -229,6 +234,7 @@ struct mailbox test_mailbox = {
                test_mailbox_is_readonly,
                test_mailbox_allow_new_keywords,
                test_mailbox_enable,
+               test_mailbox_exists,
                test_mailbox_open,
                test_mailbox_close,
                NULL,
index bca883f5fc1d0234a97d5e90d12dcbf814ecd21d..14549c00169ff60fb6869862c1934b35347cd5ed 100644 (file)
@@ -407,59 +407,6 @@ acl_mailbox_list_iter_deinit(struct mailbox_list_iterate_context *_ctx)
        return ret;
 }
 
-static int acl_mailbox_have_visibility_rights(struct acl_mailbox_list *alist,
-                                             const char *name)
-{
-       struct acl_object *aclobj;
-       const char *const *rights;
-       unsigned int i;
-       int ret;
-
-       aclobj = acl_object_init_from_name(alist->rights.backend, name);
-       ret = acl_object_get_my_rights(aclobj, pool_datastack_create(),
-                                      &rights);
-       acl_object_deinit(&aclobj);
-
-       if (ret < 0)
-               return -1;
-
-       /* for now this is used only by IMAP SUBSCRIBE. we'll intentionally
-          violate RFC 4314 here, because it says SUBSCRIBE should succeed only
-          when mailbox has 'l' right. But there's no point in not allowing
-          a subscribe for a mailbox that can be selected anyway. Just the
-          opposite: subscribing to such mailboxes is a very useful feature. */
-       for (i = 0; rights[i] != NULL; i++) {
-               if (strcmp(rights[i], MAIL_ACL_LOOKUP) == 0 ||
-                   strcmp(rights[i], MAIL_ACL_READ) == 0 ||
-                   strcmp(rights[i], MAIL_ACL_INSERT) == 0)
-                       return 1;
-       }
-       return 0;
-}
-
-static int acl_get_mailbox_name_status(struct mailbox_list *list,
-                                      const char *name,
-                                      enum mailbox_name_status *status)
-{
-       struct acl_mailbox_list *alist = ACL_LIST_CONTEXT(list);
-       int ret;
-
-       T_BEGIN {
-               ret = acl_mailbox_have_visibility_rights(alist, name);
-       } T_END;
-       if (ret < 0)
-               return -1;
-
-       if (alist->module_ctx.super.get_mailbox_name_status(list, name,
-                                                           status) < 0)
-               return -1;
-       if (ret == 0) {
-               /* we shouldn't reveal this mailbox's existance */
-               *status = MAILBOX_NAME_NONEXISTENT;
-       }
-       return 0;
-}
-
 static int
 acl_mailbox_list_create_dir(struct mailbox_list *list, const char *name,
                            enum mailbox_dir_create_type type)
@@ -537,7 +484,6 @@ static void acl_mailbox_list_init_default(struct mailbox_list *list)
        v->iter_init = acl_mailbox_list_iter_init;
        v->iter_next = acl_mailbox_list_iter_next;
        v->iter_deinit = acl_mailbox_list_iter_deinit;
-       v->get_mailbox_name_status = acl_get_mailbox_name_status;
        v->create_mailbox_dir = acl_mailbox_list_create_dir;
 
        MODULE_CONTEXT_SET(list, acl_mailbox_list_module, alist);
index 3ecc40d41a6511b125a626221add176132587d94..166e4136540207dbe6ad22374701ef7d4e4e3664 100644 (file)
@@ -428,6 +428,30 @@ acl_transaction_commit(struct mailbox_transaction_context *ctx,
        return abox->module_ctx.super.transaction_commit(ctx, changes_r);
 }
 
+static int acl_mailbox_exists(struct mailbox *box)
+{
+       struct acl_mailbox *abox = ACL_CONTEXT(box);
+       const char *const *rights;
+       unsigned int i;
+
+       if (acl_object_get_my_rights(abox->aclobj, pool_datastack_create(),
+                                    &rights) < 0)
+               return -1;
+
+       /* for now this is used only by IMAP SUBSCRIBE. we'll intentionally
+          violate RFC 4314 here, because it says SUBSCRIBE should succeed only
+          when mailbox has 'l' right. But there's no point in not allowing
+          a subscribe for a mailbox that can be selected anyway. Just the
+          opposite: subscribing to such mailboxes is a very useful feature. */
+       for (i = 0; rights[i] != NULL; i++) {
+               if (strcmp(rights[i], MAIL_ACL_LOOKUP) == 0 ||
+                   strcmp(rights[i], MAIL_ACL_READ) == 0 ||
+                   strcmp(rights[i], MAIL_ACL_INSERT) == 0)
+                       return abox->module_ctx.super.exists(box);
+       }
+       return 0;
+}
+
 static int acl_mailbox_open_check_acl(struct mailbox *box)
 {
        struct acl_mailbox *abox = ACL_CONTEXT(box);
@@ -494,6 +518,7 @@ void acl_mailbox_allocated(struct mailbox *box)
                abox->acl_enabled = TRUE;
                v->is_readonly = acl_is_readonly;
                v->allow_new_keywords = acl_allow_new_keywords;
+               v->exists = acl_mailbox_exists;
                v->open = acl_mailbox_open;
                v->create = acl_mailbox_create;
                v->update = acl_mailbox_update;
index 4c40b14f6a4ed0d60a5a2a06a64d799e48e2f49d..e8b100f722c92f8618e9006b5f5bdb3f77aa5ea7 100644 (file)
@@ -285,17 +285,6 @@ static int listescape_set_subscribed(struct mailbox_list *list,
        return mlist->module_ctx.super.set_subscribed(list, name, set);
 }
 
-static int listescape_get_mailbox_name_status(struct mailbox_list *list,
-                                             const char *name,
-                                             enum mailbox_name_status *status)
-{
-       struct listescape_mailbox_list *mlist = LIST_ESCAPE_LIST_CONTEXT(list);
-
-       name = list_escape(mlist, list->ns, name, FALSE);
-       return mlist->module_ctx.super.
-               get_mailbox_name_status(list, name, status);
-}
-
 static bool listescape_is_valid_existing_name(struct mailbox_list *list,
                                              const char *name)
 {
@@ -346,7 +335,6 @@ static void listescape_mailbox_list_created(struct mailbox_list *list)
        v->iter_next = listescape_mailbox_list_iter_next;
        v->iter_deinit = listescape_mailbox_list_iter_deinit;
        v->set_subscribed = listescape_set_subscribed;
-       v->get_mailbox_name_status = listescape_get_mailbox_name_status;
        v->is_valid_existing_name = listescape_is_valid_existing_name;
        v->is_valid_create_name = listescape_is_valid_create_name;
 
index f0cdf42874a8ada2ee708515ab914ee91782ee4f..32835d64a77b7f2666a9a3089487e6c150bb76e6 100644 (file)
@@ -513,6 +513,7 @@ struct mailbox virtual_mailbox = {
                index_storage_is_readonly,
                index_storage_allow_new_keywords,
                index_storage_mailbox_enable,
+               index_storage_mailbox_exists,
                virtual_mailbox_open,
                virtual_mailbox_close,
                virtual_mailbox_free,