1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
/* Copyright (c) 2006-2018 Dovecot authors, see the included COPYING file */
#include "lib.h"
#include "array.h"
#include "istream.h"
#include "mail-namespace.h"
#include "mailbox-list-private.h"
#include "acl-api-private.h"
#include "acl-lookup-dict.h"
#include "acl-plugin.h"
struct acl_storage_module acl_storage_module =
MODULE_CONTEXT_INIT(&mail_storage_module_register);
struct acl_user_module acl_user_module =
MODULE_CONTEXT_INIT(&mail_user_module_register);
static void acl_user_deinit(struct mail_user *user)
{
struct acl_user *auser = ACL_USER_CONTEXT(user);
i_assert(auser != NULL);
acl_lookup_dict_deinit(&auser->acl_lookup_dict);
auser->module_ctx.super.deinit(user);
}
static void acl_mail_user_create(struct mail_user *user, const char *env)
{
struct mail_user_vfuncs *v = user->vlast;
struct acl_user *auser;
auser = p_new(user->pool, struct acl_user, 1);
auser->module_ctx.super = *v;
user->vlast = &auser->module_ctx.super;
v->deinit = acl_user_deinit;
auser->acl_lookup_dict = acl_lookup_dict_init(user);
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");
env = mail_user_plugin_getenv(user, "acl_groups");
if (env != NULL) {
auser->groups =
(const char *const *)p_strsplit(user->pool, env, ",");
}
MODULE_CONTEXT_SET(user, acl_user_module, auser);
}
void acl_mail_user_created(struct mail_user *user)
{
const char *env;
env = mail_user_plugin_getenv(user, "acl");
if (env != NULL && *env != '\0')
acl_mail_user_create(user, env);
else {
e_debug(user->event, "acl: No acl setting - ACLs are disabled");
}
}
|