Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/plugins/acl/acl-shared-storage.c @ 9658:8ba4253adc9b HEAD tip
*-login: SSL connections didn't get closed when the client got destroyed.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 08 May 2014 16:41:29 +0300 |
parents | 00cd9aacd03c |
children |
rev | line source |
---|---|
9532
00cd9aacd03c
Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents:
8905
diff
changeset
|
1 /* Copyright (c) 2008-2010 Dovecot authors, see the included COPYING file */ |
8433
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "array.h" |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "ioloop.h" |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "str.h" |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "var-expand.h" |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "acl-plugin.h" |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "acl-lookup-dict.h" |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "acl-shared-storage.h" |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #include "index/shared/shared-storage.h" |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #define SHARED_NS_RETRY_SECS (60*60) |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 static void |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 acl_shared_namespace_add(struct mail_user *user, |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 struct shared_storage *sstorage, |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 const char *userdomain) |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 { |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 static struct var_expand_table static_tab[] = { |
8544
983d38de06c9
var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents:
8447
diff
changeset
|
21 { 'u', NULL, "user" }, |
983d38de06c9
var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents:
8447
diff
changeset
|
22 { 'n', NULL, "username" }, |
983d38de06c9
var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents:
8447
diff
changeset
|
23 { 'd', NULL, "domain" }, |
983d38de06c9
var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents:
8447
diff
changeset
|
24 { '\0', NULL, NULL } |
8433
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 }; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 struct var_expand_table *tab; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 struct mail_namespace *ns; |
8447
c56835b33b14
acl: If a user's namespace has no mailboxes visible to us, remove the namespace immediately.
Timo Sirainen <tss@iki.fi>
parents:
8433
diff
changeset
|
28 struct mailbox_list_iterate_context *iter; |
c56835b33b14
acl: If a user's namespace has no mailboxes visible to us, remove the namespace immediately.
Timo Sirainen <tss@iki.fi>
parents:
8433
diff
changeset
|
29 const struct mailbox_info *info; |
8433
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 const char *p, *mailbox; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 string_t *str; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 if (strcmp(user->username, userdomain) == 0) { |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 /* skip ourself */ |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 return; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 } |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 p = strchr(userdomain, '@'); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 tab = t_malloc(sizeof(static_tab)); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 memcpy(tab, static_tab, sizeof(static_tab)); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 tab[0].value = userdomain; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 tab[1].value = p == NULL ? userdomain : t_strdup_until(userdomain, p); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 tab[2].value = p == NULL ? "" : p + 1; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 str = t_str_new(128); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 var_expand(str, sstorage->ns_prefix_pattern, tab); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 mailbox = str_c(str); |
8905
b567f5f42b3d
acl: Don't crash if shared_storage_get_namespace() fails.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
49 if (shared_storage_get_namespace(&sstorage->storage, &mailbox, &ns) < 0) |
b567f5f42b3d
acl: Don't crash if shared_storage_get_namespace() fails.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
50 return; |
8447
c56835b33b14
acl: If a user's namespace has no mailboxes visible to us, remove the namespace immediately.
Timo Sirainen <tss@iki.fi>
parents:
8433
diff
changeset
|
51 |
c56835b33b14
acl: If a user's namespace has no mailboxes visible to us, remove the namespace immediately.
Timo Sirainen <tss@iki.fi>
parents:
8433
diff
changeset
|
52 /* check if there are any mailboxes really visible to us */ |
c56835b33b14
acl: If a user's namespace has no mailboxes visible to us, remove the namespace immediately.
Timo Sirainen <tss@iki.fi>
parents:
8433
diff
changeset
|
53 iter = mailbox_list_iter_init(ns->list, "*", |
c56835b33b14
acl: If a user's namespace has no mailboxes visible to us, remove the namespace immediately.
Timo Sirainen <tss@iki.fi>
parents:
8433
diff
changeset
|
54 MAILBOX_LIST_ITER_RETURN_NO_FLAGS); |
c56835b33b14
acl: If a user's namespace has no mailboxes visible to us, remove the namespace immediately.
Timo Sirainen <tss@iki.fi>
parents:
8433
diff
changeset
|
55 while ((info = mailbox_list_iter_next(iter)) != NULL) |
c56835b33b14
acl: If a user's namespace has no mailboxes visible to us, remove the namespace immediately.
Timo Sirainen <tss@iki.fi>
parents:
8433
diff
changeset
|
56 break; |
c56835b33b14
acl: If a user's namespace has no mailboxes visible to us, remove the namespace immediately.
Timo Sirainen <tss@iki.fi>
parents:
8433
diff
changeset
|
57 (void)mailbox_list_iter_deinit(&iter); |
c56835b33b14
acl: If a user's namespace has no mailboxes visible to us, remove the namespace immediately.
Timo Sirainen <tss@iki.fi>
parents:
8433
diff
changeset
|
58 |
c56835b33b14
acl: If a user's namespace has no mailboxes visible to us, remove the namespace immediately.
Timo Sirainen <tss@iki.fi>
parents:
8433
diff
changeset
|
59 if (info == NULL) { |
c56835b33b14
acl: If a user's namespace has no mailboxes visible to us, remove the namespace immediately.
Timo Sirainen <tss@iki.fi>
parents:
8433
diff
changeset
|
60 /* no visible mailboxes, remove the namespace */ |
c56835b33b14
acl: If a user's namespace has no mailboxes visible to us, remove the namespace immediately.
Timo Sirainen <tss@iki.fi>
parents:
8433
diff
changeset
|
61 mail_namespace_destroy(ns); |
c56835b33b14
acl: If a user's namespace has no mailboxes visible to us, remove the namespace immediately.
Timo Sirainen <tss@iki.fi>
parents:
8433
diff
changeset
|
62 } |
8433
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 } |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 int acl_shared_namespaces_add(struct mail_namespace *ns) |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 { |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 struct shared_storage *sstorage = (struct shared_storage *)ns->storage; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 struct acl_user *auser = ACL_USER_CONTEXT(ns->user); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 struct acl_lookup_dict_iter *iter; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 const char *name; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 i_assert(ns->type == NAMESPACE_SHARED); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 i_assert(strcmp(ns->storage->name, SHARED_STORAGE_NAME) == 0); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 if (ioloop_time < auser->last_shared_add_check + SHARED_NS_RETRY_SECS) { |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 /* already added, don't bother rechecking */ |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 return 0; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 } |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 auser->last_shared_add_check = ioloop_time; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 iter = acl_lookup_dict_iterate_visible_init(auser->acl_lookup_dict); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 while ((name = acl_lookup_dict_iterate_visible_next(iter)) != NULL) { |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 T_BEGIN { |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 acl_shared_namespace_add(ns->user, sstorage, name); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 } T_END; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 } |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 return acl_lookup_dict_iterate_visible_deinit(&iter); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 } |