#define ACL_API_PRIVATE_H
#include "acl-api.h"
+#include "acl-settings.h"
struct acl_backend_vfuncs {
const char *name;
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;
const struct acl_backend_vfuncs *v;
bool owner:1;
- bool globals_only:1;
};
struct acl_mailbox_list_context {
struct mail_storage;
struct mailbox;
struct acl_object;
+struct acl_settings;
#define MAILBOX_ATTRIBUTE_PREFIX_ACL \
MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT"acl/"
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);
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;
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
#include "lib.h"
#include "llist.h"
+#include "array.h"
#include "hash.h"
#include "sort.h"
#include "mail-storage-settings.h"
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;
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",
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;
}
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";
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);
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);
}
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
/* 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);
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;
};
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);