]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
plugins: acl - Move settings to acl_settings
authorAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Nov 2023 06:33:40 +0000 (08:33 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:11 +0000 (12:34 +0200)
src/plugins/acl/acl-api-private.h
src/plugins/acl/acl-api.h
src/plugins/acl/acl-backend-vfile-acllist.c
src/plugins/acl/acl-backend-vfile.c
src/plugins/acl/acl-backend.c
src/plugins/acl/acl-lookup-dict.c
src/plugins/acl/acl-mailbox-list.c
src/plugins/acl/acl-plugin.h
src/plugins/acl/acl-storage.c

index c994da94bc565ca5071546fd84997857201720ca..c6ec37cccb53e1756ec90f39760380d9eb429282 100644 (file)
@@ -2,6 +2,7 @@
 #define ACL_API_PRIVATE_H
 
 #include "acl-api.h"
+#include "acl-settings.h"
 
 struct acl_backend_vfuncs {
        const char *name;
@@ -37,9 +38,8 @@ struct acl_backend_vfuncs {
 
 struct acl_backend {
        pool_t pool;
+       const struct acl_settings *set;
        const char *username;
-       const char **groups;
-       unsigned int group_count;
 
        struct event *event;
        struct mailbox_list *list;
@@ -53,7 +53,6 @@ struct acl_backend {
        const struct acl_backend_vfuncs *v;
 
        bool owner:1;
-       bool globals_only:1;
 };
 
 struct acl_mailbox_list_context {
index 6b4bd64bc2a4390d65d286096d411d6b44e11ff4..6e35330ce680372c42d132947e5fbdcea93db51d 100644 (file)
@@ -9,6 +9,7 @@ struct mailbox_list;
 struct mail_storage;
 struct mailbox;
 struct acl_object;
+struct acl_settings;
 
 #define MAILBOX_ATTRIBUTE_PREFIX_ACL \
        MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT"acl/"
@@ -18,7 +19,7 @@ struct acl_object;
    case-sensitively. */
 struct acl_backend *
 acl_backend_init(const char *data, struct mailbox_list *list,
-                const char *acl_username, const char *const *groups,
+                const char *acl_username, const struct acl_settings *set,
                 bool owner);
 void acl_backend_deinit(struct acl_backend **backend);
 
index bdb7a2a3706231d0a7d9f085ed24fc5fc6e1f300..75efdece3343e7c02c34460f484c2f94b5bf99dd 100644 (file)
@@ -46,7 +46,7 @@ static bool acl_list_get_root_dir(struct acl_backend_vfile *backend,
        const char *rootdir, *maildir;
        enum mailbox_list_path_type type;
 
-       if (backend->backend.globals_only)
+       if (backend->backend.set->acl_globals_only)
                return FALSE;
 
        storage = mailbox_list_get_namespace(backend->backend.list)->storage;
index a0265cfc38bf9bffe55f7192a9ba92ae3b17ea9c..9fa9cc9343d7e703f99dfc70e2095104ad62e636 100644 (file)
@@ -109,7 +109,7 @@ acl_backend_vfile_get_local_dir(struct acl_backend *backend,
        if (*name == '\0')
                name = NULL;
 
-       if (backend->globals_only)
+       if (backend->set->acl_globals_only)
                return NULL;
 
        /* ACL files are very important. try to keep them among the main
index d9d59c4953b6c2dced47dce8c771293fceb0029c..712eaba24b614909f77d383ca1717cfa20a5f525 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "lib.h"
 #include "llist.h"
+#include "array.h"
 #include "hash.h"
 #include "sort.h"
 #include "mail-storage-settings.h"
@@ -43,21 +44,18 @@ static struct acl_backend_entry *acl_backend_find(const char *name)
 
 struct acl_backend *
 acl_backend_init(const char *data, struct mailbox_list *list,
-                const char *acl_username, const char *const *groups,
+                const char *acl_username, const struct acl_settings *set,
                 bool owner)
 {
        struct mail_user *user = mailbox_list_get_user(list);
        struct acl_backend_entry *be;
        struct acl_backend *backend;
        const char *be_name;
-       unsigned int i, group_count;
 
        e_debug(user->event, "acl: initializing backend with data: %s", data);
        e_debug(user->event, "acl: acl username = %s", acl_username);
        e_debug(user->event, "acl: owner = %d", owner ? 1 : 0);
 
-       group_count = str_array_length(groups);
-
        be_name = strchr(data, ':');
        if (be_name == NULL)
                be_name = data;
@@ -76,21 +74,16 @@ acl_backend_init(const char *data, struct mailbox_list *list,
        backend->list = list;
        backend->username = p_strdup(backend->pool, acl_username);
        backend->owner = owner;
-       backend->globals_only =
-               mail_user_plugin_getenv_bool(user, "acl_globals_only");
-
-       if (group_count > 0) {
-               backend->group_count = group_count;
-               backend->groups =
-                       p_new(backend->pool, const char *, group_count);
-               for (i = 0; i < group_count; i++) {
-                       backend->groups[i] = p_strdup(backend->pool, groups[i]);
-                       e_debug(backend->event, "acl: group added: %s", groups[i]);
+
+       if (event_want_debug(user->event) && array_is_created(&set->acl_groups)) {
+               const char *group;
+               array_foreach_elem(&set->acl_groups, group) {
+                       e_debug(user->event, "acl: group added: %s", group);
                }
-               i_qsort(backend->groups, group_count, sizeof(const char *),
-                       i_strcmp_p);
        }
 
+       backend->set = set;
+
        T_BEGIN {
                if (backend->v->init(backend, data) < 0)
                        i_fatal("acl: backend %s init failed with data: %s",
@@ -148,7 +141,9 @@ bool acl_backend_user_name_equals(struct acl_backend *backend,
 bool acl_backend_user_is_in_group(struct acl_backend *backend,
                                  const char *group_name)
 {
-       return i_bsearch(group_name, backend->groups, backend->group_count,
+       unsigned int group_count;
+       const char *const *groups = array_get(&backend->set->acl_groups, &group_count);
+       return i_bsearch(group_name, groups, group_count,
                         sizeof(const char *), bsearch_strcmp) != NULL;
 }
 
@@ -181,14 +176,13 @@ unsigned int acl_backend_lookup_right(struct acl_backend *backend,
 
 struct acl_object *acl_backend_get_default_object(struct acl_backend *backend)
 {
-       struct mail_user *user = mailbox_list_get_user(backend->list);
        struct mail_namespace *ns = mailbox_list_get_namespace(backend->list);
        const char *default_name = "";
 
        if (backend->default_aclobj != NULL)
                return backend->default_aclobj;
 
-       if (mail_user_plugin_getenv_bool(user, "acl_defaults_from_inbox")) {
+       if (backend->set->acl_defaults_from_inbox) {
                if (ns->type == MAIL_NAMESPACE_TYPE_PRIVATE ||
                    ns->type == MAIL_NAMESPACE_TYPE_SHARED)
                        default_name = "INBOX";
index c07ce96ba4f30eef21f3abd3666ee0f56758f479..dfebe7cd3adc365e7818113818f35ac52f78b4eb 100644 (file)
@@ -313,7 +313,6 @@ acl_lookup_dict_iterate_visible_init(struct acl_lookup_dict *dict)
        struct acl_user *auser = ACL_USER_CONTEXT(dict->user);
        struct acl_lookup_dict_iter *iter;
        const char *id;
-       unsigned int i;
        pool_t pool;
 
        i_assert(auser != NULL);
@@ -334,9 +333,10 @@ acl_lookup_dict_iterate_visible_init(struct acl_lookup_dict *dict)
                pool_alloconly_create("acl lookup dict iter values", 1024);
 
        /* get all groups we belong to */
-       if (auser->groups != NULL) {
-               for (i = 0; auser->groups[i] != NULL; i++) {
-                       id = p_strconcat(pool, "group/", auser->groups[i],
+       if (array_is_created(&auser->set->acl_groups)) {
+               const char *group;
+               array_foreach_elem(&auser->set->acl_groups, group) {
+                       id = p_strconcat(pool, "group/", group,
                                         NULL);
                        array_push_back(&iter->iter_ids, &id);
                }
index d888b8cd4afdbc4814a1c6aa558511e0c2733120..457ddacc3e1603119ee72491c464762d163448d5 100644 (file)
@@ -589,7 +589,7 @@ void acl_mail_namespace_storage_added(struct mail_namespace *ns)
        struct acl_user *auser = ACL_USER_CONTEXT_REQUIRE(ns->user);
 
        owner_username = ns->user->username;
-       current_username = auser->acl_user;
+       current_username = auser->set->acl_user;
        if (current_username == NULL)
                current_username = owner_username;
        else
@@ -603,7 +603,7 @@ void acl_mail_namespace_storage_added(struct mail_namespace *ns)
 
        /* we need to know the storage when initializing backend */
        backend = acl_backend_init(auser->acl_env, ns->list, current_username,
-                                  auser->groups, owner);
+                                  auser->set, owner);
        if (backend == NULL)
                i_fatal("ACL backend initialization failed");
        acl_storage_rights_ctx_init(&alist->rights, backend);
index 6acfe897acd75756365707704222f7e93c0d8b64..257bcadad9fc896c06353cc3cd04972700467f2e 100644 (file)
@@ -22,9 +22,8 @@
 struct acl_user {
        union mail_user_module_context module_ctx;
 
-       const char *acl_user;
        const char *acl_env;
-       const char *const *groups;
+       const struct acl_settings *set;
 
        struct acl_lookup_dict *acl_lookup_dict;
 };
index 988c0b8b3e4d4626165fb60a8a27da81a5cd32be..eb84106a526f7938bf2c945ede35544b6e2326f0 100644 (file)
@@ -35,15 +35,23 @@ static void acl_mail_user_create(struct mail_user *user, const char *env)
        v->deinit = acl_user_deinit;
        auser->acl_lookup_dict = acl_lookup_dict_init(user);
 
+       struct acl_settings *set = p_new(user->pool, struct acl_settings, 1);
        auser->acl_env = env;
-       auser->acl_user = mail_user_plugin_getenv(user, "acl_user");
-       if (auser->acl_user == NULL)
-               auser->acl_user = mail_user_plugin_getenv(user, "master_user");
+       set->acl_globals_only =
+               mail_user_plugin_getenv_bool(user, "acl_globals_only");
+       set->acl_defaults_from_inbox =
+               mail_user_plugin_getenv_bool(user, "acl_defaults_from_inbox");
+       set->acl_user = mail_user_plugin_getenv(user, "acl_user");
+       if (set->acl_user == NULL)
+               set->acl_user = mail_user_plugin_getenv(user, "master_user");
 
        env = mail_user_plugin_getenv(user, "acl_groups");
        if (env != NULL) {
-               auser->groups =
-                       (const char *const *)p_strsplit(user->pool, env, ",");
+               p_array_init(&set->acl_groups, user->pool, 1);
+               const char *const *groups = (const char *const *)
+                       p_strsplit_spaces(user->pool, env, ", ");
+               array_append(&set->acl_groups, groups, str_array_length(groups));
+               array_sort(&set->acl_groups, i_strcmp_p);
        }
 
        MODULE_CONTEXT_SET(user, acl_user_module, auser);