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