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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }