]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
acl-plugin: Make iterators more conforming
authorAki Tuomi <aki.tuomi@dovecot.fi>
Sat, 3 Sep 2016 10:14:29 +0000 (13:14 +0300)
committerGitLab <gitlab@git.dovecot.net>
Wed, 7 Sep 2016 09:09:15 +0000 (12:09 +0300)
The *_next functions return true/false, deinit will
report errors and end result.

src/plugins/acl/acl-api-private.h
src/plugins/acl/acl-api.c
src/plugins/acl/acl-api.h
src/plugins/acl/acl-attributes.c
src/plugins/acl/acl-backend-vfile-acllist.c
src/plugins/acl/acl-backend-vfile.h
src/plugins/acl/doveadm-acl.c

index 581a4c14405a9dd20731dc463d1db4e8c4685e53..e1aeac94f07adf3f61b411f985707f95a3ce34e5 100644 (file)
@@ -17,9 +17,9 @@ struct acl_backend_vfuncs {
 
        struct acl_mailbox_list_context *
                (*nonowner_lookups_iter_init)(struct acl_backend *backend);
-       int (*nonowner_lookups_iter_next)(struct acl_mailbox_list_context *ctx,
+       bool (*nonowner_lookups_iter_next)(struct acl_mailbox_list_context *ctx,
                                          const char **name_r);
-       void (*nonowner_lookups_iter_deinit)
+       int (*nonowner_lookups_iter_deinit)
                (struct acl_mailbox_list_context *ctx);
        int (*nonowner_lookups_rebuild)(struct acl_backend *backend);
 
@@ -36,9 +36,9 @@ struct acl_backend_vfuncs {
 
        struct acl_object_list_iter *
                (*object_list_init)(struct acl_object *aclobj);
-       int (*object_list_next)(struct acl_object_list_iter *iter,
+       bool (*object_list_next)(struct acl_object_list_iter *iter,
                                struct acl_rights *rights_r);
-       void (*object_list_deinit)(struct acl_object_list_iter *iter);
+       int (*object_list_deinit)(struct acl_object_list_iter *iter);
 };
 
 struct acl_backend {
@@ -63,6 +63,10 @@ struct acl_backend {
 
 struct acl_mailbox_list_context {
        struct acl_backend *backend;
+
+       bool empty:1;
+       bool failed:1;
+       const char *error;
 };
 
 struct acl_object {
@@ -79,16 +83,19 @@ struct acl_object_list_iter {
 
        struct acl_rights *rights;
        unsigned int idx, count;
+
+       bool empty:1;
        bool failed:1;
+       const char *error;
 };
 
 extern const char *const all_mailbox_rights[];
 
 struct acl_object_list_iter *
 acl_default_object_list_init(struct acl_object *aclobj);
-int acl_default_object_list_next(struct acl_object_list_iter *iter,
-                                struct acl_rights *rights_r);
-void acl_default_object_list_deinit(struct acl_object_list_iter *iter);
+bool acl_default_object_list_next(struct acl_object_list_iter *iter,
+                                 struct acl_rights *rights_r);
+int acl_default_object_list_deinit(struct acl_object_list_iter *iter);
 
 const char *const *
 acl_backend_mask_get_names(struct acl_backend *backend,
index 33410a51e785a528a6f9b4b9c7b70f1e5ee9f294..ff8b10613cbc2d42bee3b01d07e3c42e600377e0 100644 (file)
@@ -169,21 +169,21 @@ struct acl_object_list_iter *acl_object_list_init(struct acl_object *aclobj)
         return aclobj->backend->v.object_list_init(aclobj);
 }
 
-int acl_object_list_next(struct acl_object_list_iter *iter,
+bool acl_object_list_next(struct acl_object_list_iter *iter,
                          struct acl_rights *rights_r)
 {
        if (iter->failed)
-               return -1;
+               return FALSE;
 
        return iter->aclobj->backend->v.object_list_next(iter, rights_r);
 }
 
-void acl_object_list_deinit(struct acl_object_list_iter **_iter)
+int acl_object_list_deinit(struct acl_object_list_iter **_iter)
 {
        struct acl_object_list_iter *iter = *_iter;
 
        *_iter = NULL;
-        iter->aclobj->backend->v.object_list_deinit(iter);
+        return iter->aclobj->backend->v.object_list_deinit(iter);
 }
 
 struct acl_object_list_iter *
@@ -213,25 +213,35 @@ acl_default_object_list_init(struct acl_object *aclobj)
                iter->rights = p_new(pool, struct acl_rights, iter->count);
                for (i = 0; i < iter->count; i++)
                        acl_rights_dup(&aclobj_rights[i], pool, &iter->rights[i]);
-       }
+       } else
+               iter->empty = TRUE;
        return iter;
 }
 
-int acl_default_object_list_next(struct acl_object_list_iter *iter,
+bool acl_default_object_list_next(struct acl_object_list_iter *iter,
                                 struct acl_rights *rights_r)
 {
        if (iter->failed)
-               return -1;
+               return FALSE;
 
        if (iter->idx == iter->count)
-               return 0;
+               return FALSE;
        *rights_r = iter->rights[iter->idx++];
-       return 1;
+       return TRUE;
 }
 
-void acl_default_object_list_deinit(struct acl_object_list_iter *iter)
+int acl_default_object_list_deinit(struct acl_object_list_iter *iter)
 {
+       int ret = 0;
+       if (iter->failed)
+               ret = -1;
+       else if (iter->empty)
+               ret = 0;
+       else
+               ret = 1;
+
        pool_unref(&iter->pool);
+       return ret;
 }
 
 struct acl_mailbox_list_context *
@@ -240,19 +250,18 @@ acl_backend_nonowner_lookups_iter_init(struct acl_backend *backend)
        return backend->v.nonowner_lookups_iter_init(backend);
 }
 
-int acl_backend_nonowner_lookups_iter_next(struct acl_mailbox_list_context *ctx,
+bool acl_backend_nonowner_lookups_iter_next(struct acl_mailbox_list_context *ctx,
                                           const char **name_r)
 {
        return ctx->backend->v.nonowner_lookups_iter_next(ctx, name_r);
 }
 
-void
-acl_backend_nonowner_lookups_iter_deinit(struct acl_mailbox_list_context **_ctx)
+int acl_backend_nonowner_lookups_iter_deinit(struct acl_mailbox_list_context **_ctx)
 {
        struct acl_mailbox_list_context *ctx = *_ctx;
 
        *_ctx = NULL;
-       ctx->backend->v.nonowner_lookups_iter_deinit(ctx);
+       return ctx->backend->v.nonowner_lookups_iter_deinit(ctx);
 }
 
 int acl_backend_nonowner_lookups_rebuild(struct acl_backend *backend)
index 91aa82b798930d8f5357711a1fa1a6f400cb30aa..b3a0190cae405417b45d6a537abecf5b3be9a4bd 100644 (file)
@@ -123,10 +123,11 @@ bool acl_backend_rights_match_me(struct acl_backend *backend,
 /* List mailboxes that have lookup right to some non-owners. */
 struct acl_mailbox_list_context *
 acl_backend_nonowner_lookups_iter_init(struct acl_backend *backend);
-int acl_backend_nonowner_lookups_iter_next(struct acl_mailbox_list_context *ctx,
+bool acl_backend_nonowner_lookups_iter_next(struct acl_mailbox_list_context *ctx,
                                           const char **name_r);
-void
+int
 acl_backend_nonowner_lookups_iter_deinit(struct acl_mailbox_list_context **ctx);
+
 /* Force a rebuild for nonowner lookups index */
 int acl_backend_nonowner_lookups_rebuild(struct acl_backend *backend);
 
@@ -154,9 +155,9 @@ int acl_object_update(struct acl_object *aclobj,
 
 /* List all identifiers. */
 struct acl_object_list_iter *acl_object_list_init(struct acl_object *aclobj);
-int acl_object_list_next(struct acl_object_list_iter *iter,
+bool acl_object_list_next(struct acl_object_list_iter *iter,
                          struct acl_rights *rights_r);
-void acl_object_list_deinit(struct acl_object_list_iter **iter);
+int acl_object_list_deinit(struct acl_object_list_iter **iter);
 
 /* Returns the canonical ID for the right. */
 const char *acl_rights_get_id(const struct acl_rights *right);
index 63130b26ecbd074652950e262a8e91e8e3d20905..06ed200e8e67b854c22ca3a8a262ac60c5c43499 100644 (file)
@@ -83,7 +83,7 @@ static int acl_attribute_get_acl(struct mailbox *box, const char *key,
        }
 
        iter = acl_object_list_init(aclobj);
-       while ((ret = acl_object_list_next(iter, &rights)) > 0) {
+       while (acl_object_list_next(iter, &rights)) {
                if (!rights.global &&
                    rights.id_type == wanted_rights.id_type &&
                    null_strcmp(rights.identifier, wanted_rights.identifier) == 0) {
@@ -91,9 +91,8 @@ static int acl_attribute_get_acl(struct mailbox *box, const char *key,
                        break;
                }
        }
-       if (ret < 0)
+       if ((ret = acl_object_list_deinit(&iter)) < 0)
                mail_storage_set_internal_error(box->storage);
-       acl_object_list_deinit(&iter);
        return ret;
 }
 
@@ -195,21 +194,19 @@ static const char *
 acl_attribute_iter_next_acl(struct acl_mailbox_attribute_iter *aiter)
 {
        struct acl_rights rights;
-       int ret;
 
-       while ((ret = acl_object_list_next(aiter->acl_iter, &rights)) > 0) {
+       while (acl_object_list_next(aiter->acl_iter, &rights)) {
                if (rights.global)
                        continue;
                str_truncate(aiter->acl_name, strlen(MAILBOX_ATTRIBUTE_PREFIX_ACL));
                acl_rights_write_id(aiter->acl_name, &rights);
                return str_c(aiter->acl_name);
        }
-       if (ret < 0) {
+       if (acl_object_list_deinit(&aiter->acl_iter) < 0) {
                mail_storage_set_internal_error(aiter->iter.box->storage);
                aiter->failed = TRUE;
                return NULL;
        }
-       acl_object_list_deinit(&aiter->acl_iter);
        return NULL;
 }
 
index 7ec62bfc3ef33a8b821107aa815dd66780922b4d..4224d589328daa5650e9f962eadd05a83dc02023 100644 (file)
@@ -379,7 +379,7 @@ acl_backend_vfile_nonowner_iter_init(struct acl_backend *_backend)
        return &ctx->ctx;
 }
 
-int acl_backend_vfile_nonowner_iter_next(struct acl_mailbox_list_context *_ctx,
+bool acl_backend_vfile_nonowner_iter_next(struct acl_mailbox_list_context *_ctx,
                                         const char **name_r)
 {
        struct acl_mailbox_list_context_vfile *ctx =
@@ -389,22 +389,35 @@ int acl_backend_vfile_nonowner_iter_next(struct acl_mailbox_list_context *_ctx,
        const struct acl_backend_vfile_acllist *acllist;
        unsigned int count;
 
+       if (_ctx->failed)
+               return FALSE;
+
        acllist = array_get(&backend->acllist, &count);
+       if (count == 0)
+               _ctx->empty = TRUE;
        if (ctx->idx == count)
-               return 0;
+               return FALSE;
 
        *name_r = acllist[ctx->idx++].name;
-       return 1;
+       return TRUE;
 }
 
-void
+int
 acl_backend_vfile_nonowner_iter_deinit(struct acl_mailbox_list_context *ctx)
 {
        struct acl_backend_vfile *backend =
                (struct acl_backend_vfile *)ctx->backend;
+       int ret;
 
        backend->iterating_acllist = FALSE;
+       if (ctx->failed)
+               ret = -1;
+       else if (ctx->empty)
+               ret = 0;
+       else
+               ret = 1;
        i_free(ctx);
+       return ret;
 }
 
 int acl_backend_vfile_nonowner_lookups_rebuild(struct acl_backend *_backend)
index b55239ffa9e9318ab69139a09df81895f78cfc87..1fa4d16afc0b2e88cd28b76743e9135de62a1486 100644 (file)
@@ -62,9 +62,9 @@ void acl_backend_vfile_acllist_verify(struct acl_backend_vfile *backend,
 
 struct acl_mailbox_list_context *
 acl_backend_vfile_nonowner_iter_init(struct acl_backend *backend);
-int acl_backend_vfile_nonowner_iter_next(struct acl_mailbox_list_context *ctx,
+bool acl_backend_vfile_nonowner_iter_next(struct acl_mailbox_list_context *ctx,
                                         const char **name_r);
-void
+int
 acl_backend_vfile_nonowner_iter_deinit(struct acl_mailbox_list_context *ctx);
 int acl_backend_vfile_nonowner_lookups_rebuild(struct acl_backend *backend);
 
index 55f2136efcac57a714ee5d3baf62703cde0ef8fe..254292e81247282a40276fd7a8d366eeca1f4777 100644 (file)
@@ -85,14 +85,13 @@ static int cmd_acl_get_mailbox(struct doveadm_acl_cmd_context *ctx,
        backend = acl_mailbox_list_get_backend(box->list);
 
        iter = acl_object_list_init(aclobj);
-       while ((ret = acl_object_list_next(iter, &rights)) > 0) T_BEGIN {
+       while (acl_object_list_next(iter, &rights)) T_BEGIN {
                if (!ctx->get_match_me ||
                    acl_backend_rights_match_me(backend, &rights))
                        cmd_acl_get_right(&rights);
        } T_END;
-       acl_object_list_deinit(&iter);
 
-       if (ret < 0) {
+       if ((ret = acl_object_list_deinit(&iter))<0) {
                i_error("ACL iteration failed");
                doveadm_mail_failed_error(&ctx->ctx, MAIL_ERROR_TEMP);
        }
@@ -445,12 +444,11 @@ static bool cmd_acl_debug_mailbox(struct mailbox *box, bool *retry_r)
        }
 
        iter = acl_backend_nonowner_lookups_iter_init(backend);
-       while ((ret = acl_backend_nonowner_lookups_iter_next(iter, &name)) > 0) {
+       while (acl_backend_nonowner_lookups_iter_next(iter, &name)) {
                if (strcmp(name, box->name) == 0)
                        break;
        }
-       acl_backend_nonowner_lookups_iter_deinit(&iter);
-       if (ret < 0)
+       if ((ret = acl_backend_nonowner_lookups_iter_deinit(&iter))<0)
                i_fatal("ACL non-owner iteration failed");
        if (ret == 0) {
                i_error("Mailbox not found from dovecot-acl-list, rebuilding");