Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/plugins/acl/acl-shared-storage.c @ 8433:dfe39e9a9e78 HEAD
Initial support for LISTing users with shared mailboxes.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 16 Nov 2008 19:20:28 +0200 |
parents | |
children | c56835b33b14 |
rev | line source |
---|---|
8433
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (c) 2008 Dovecot authors, see the included COPYING file */ |
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[] = { |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 { 'u', NULL }, |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 { 'n', NULL }, |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 { 'd', NULL }, |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 { '\0', NULL } |
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; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 const char *p, *mailbox; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 string_t *str; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 if (strcmp(user->username, userdomain) == 0) { |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 /* skip ourself */ |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 return; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 } |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 p = strchr(userdomain, '@'); |
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 tab = t_malloc(sizeof(static_tab)); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 memcpy(tab, static_tab, sizeof(static_tab)); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 tab[0].value = userdomain; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 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
|
42 tab[2].value = p == NULL ? "" : p + 1; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 str = t_str_new(128); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 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
|
46 mailbox = str_c(str); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 shared_storage_get_namespace(&sstorage->storage, &mailbox, &ns); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 } |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 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
|
51 { |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 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
|
53 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
|
54 struct acl_lookup_dict_iter *iter; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 const char *name; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 i_assert(ns->type == NAMESPACE_SHARED); |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 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
|
59 |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 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
|
61 /* already added, don't bother rechecking */ |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 return 0; |
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 auser->last_shared_add_check = ioloop_time; |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 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
|
67 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
|
68 T_BEGIN { |
dfe39e9a9e78
Initial support for LISTing users with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 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
|
70 } T_END; |
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 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
|
73 } |