From: Aki Tuomi Date: Fri, 17 Nov 2023 06:33:40 +0000 (+0200) Subject: plugins: acl - Move settings to acl_settings X-Git-Tag: 2.4.1~1165 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=555f757c387a0e46903a179e925d1fdd582a6305;p=thirdparty%2Fdovecot%2Fcore.git plugins: acl - Move settings to acl_settings --- diff --git a/src/plugins/acl/acl-api-private.h b/src/plugins/acl/acl-api-private.h index c994da94bc..c6ec37cccb 100644 --- a/src/plugins/acl/acl-api-private.h +++ b/src/plugins/acl/acl-api-private.h @@ -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 { diff --git a/src/plugins/acl/acl-api.h b/src/plugins/acl/acl-api.h index 6b4bd64bc2..6e35330ce6 100644 --- a/src/plugins/acl/acl-api.h +++ b/src/plugins/acl/acl-api.h @@ -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); diff --git a/src/plugins/acl/acl-backend-vfile-acllist.c b/src/plugins/acl/acl-backend-vfile-acllist.c index bdb7a2a370..75efdece33 100644 --- a/src/plugins/acl/acl-backend-vfile-acllist.c +++ b/src/plugins/acl/acl-backend-vfile-acllist.c @@ -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; diff --git a/src/plugins/acl/acl-backend-vfile.c b/src/plugins/acl/acl-backend-vfile.c index a0265cfc38..9fa9cc9343 100644 --- a/src/plugins/acl/acl-backend-vfile.c +++ b/src/plugins/acl/acl-backend-vfile.c @@ -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 diff --git a/src/plugins/acl/acl-backend.c b/src/plugins/acl/acl-backend.c index d9d59c4953..712eaba24b 100644 --- a/src/plugins/acl/acl-backend.c +++ b/src/plugins/acl/acl-backend.c @@ -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"; diff --git a/src/plugins/acl/acl-lookup-dict.c b/src/plugins/acl/acl-lookup-dict.c index c07ce96ba4..dfebe7cd3a 100644 --- a/src/plugins/acl/acl-lookup-dict.c +++ b/src/plugins/acl/acl-lookup-dict.c @@ -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); } diff --git a/src/plugins/acl/acl-mailbox-list.c b/src/plugins/acl/acl-mailbox-list.c index d888b8cd4a..457ddacc3e 100644 --- a/src/plugins/acl/acl-mailbox-list.c +++ b/src/plugins/acl/acl-mailbox-list.c @@ -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); diff --git a/src/plugins/acl/acl-plugin.h b/src/plugins/acl/acl-plugin.h index 6acfe897ac..257bcadad9 100644 --- a/src/plugins/acl/acl-plugin.h +++ b/src/plugins/acl/acl-plugin.h @@ -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; }; diff --git a/src/plugins/acl/acl-storage.c b/src/plugins/acl/acl-storage.c index 988c0b8b3e..eb84106a52 100644 --- a/src/plugins/acl/acl-storage.c +++ b/src/plugins/acl/acl-storage.c @@ -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);