annotate src/lib-storage/index/shared/shared-storage.c @ 8375:4aafdbe62680 HEAD

shared mailboxes: Cleanups, fixes and optimizations.
author Timo Sirainen <tss@iki.fi>
date Sat, 01 Nov 2008 16:05:19 +0200
parents 469fc16380da
children 118e07fdfe11
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (c) 2008 Dovecot authors, see the included COPYING file */
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "array.h"
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "str.h"
8372
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
6 #include "ioloop.h"
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
7 #include "auth-master.h"
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "var-expand.h"
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "shared-storage.h"
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10
8372
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
11 #include <stdlib.h>
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
12 #include <ctype.h>
8372
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
13
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #define SHARED_LIST_CONTEXT(obj) \
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 MODULE_CONTEXT(obj, shared_mailbox_list_module)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 extern struct mail_storage shared_storage;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 extern struct mailbox shared_mailbox;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 static MODULE_CONTEXT_DEFINE_INIT(shared_mailbox_list_module,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 &mailbox_list_module_register);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 static struct mail_storage *shared_alloc(void)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 struct shared_storage *storage;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 pool_t pool;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 pool = pool_alloconly_create("shared storage", 256);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 storage = p_new(pool, struct shared_storage, 1);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 storage->storage = shared_storage;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 storage->storage.pool = pool;
8319
8553bb4c53ad Fixed shared mailboxes to work with plugins.
Timo Sirainen <tss@iki.fi>
parents: 8291
diff changeset
32 storage->storage.storage_class = &shared_storage;
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
34 storage->base_dir = p_strdup(pool, getenv("BASE_DIR"));
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
35 if (storage->base_dir == NULL)
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
36 storage->base_dir = PKG_RUNDIR;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
37
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 return &storage->storage;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 static int shared_create(struct mail_storage *_storage, const char *data,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 const char **error_r)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 struct shared_storage *storage = (struct shared_storage *)_storage;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 struct mailbox_list_settings list_set;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 const char *driver, *p;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 bool have_username;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 /* data must begin with the actual mailbox driver */
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 p = strchr(data, ':');
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 if (p == NULL) {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 *error_r = "Shared mailbox location not prefixed with driver";
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 driver = t_strdup_until(data, p);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 storage->location = p_strdup(_storage->pool, data);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 storage->storage_class = mail_storage_find_class(driver);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 if (storage->storage_class == NULL) {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 *error_r = t_strconcat("Unknown shared storage driver: ",
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 driver, NULL);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 _storage->mailbox_is_file = storage->storage_class->mailbox_is_file;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 p = strchr(_storage->ns->prefix, '%');
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 if (p == NULL) {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 *error_r = "Shared namespace prefix doesn't contain %";
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 storage->ns_prefix_pattern = p_strdup(_storage->pool, p);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 _storage->ns->prefix = p_strdup_until(_storage->ns->user->pool,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 _storage->ns->prefix, p);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 have_username = FALSE;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 for (p = storage->ns_prefix_pattern; *p != '\0'; p++) {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 if (*p != '%')
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 continue;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 if (*++p == '\0')
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 break;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 if (*p == 'u' || *p == 'n')
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 have_username = TRUE;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 else if (*p != 'd')
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 break;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 if (*p != '\0') {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 *error_r = "Shared namespace prefix contains unknown variables";
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 if (!have_username) {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 *error_r = "Shared namespace prefix doesn't contain %u or %n";
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 if (mailbox_list_alloc("shared", &_storage->list, error_r) < 0)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 MODULE_CONTEXT_SET_FULL(_storage->list, shared_mailbox_list_module,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 storage, &storage->list_module_ctx);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 memset(&list_set, 0, sizeof(list_set));
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 list_set.mail_storage_flags = &_storage->flags;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 list_set.lock_method = &_storage->lock_method;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 mailbox_list_init(_storage->list, _storage->ns, &list_set,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 mail_storage_get_list_flags(_storage->flags));
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 return 0;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
107 static void shared_storage_destroy(struct mail_storage *_storage)
8372
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
108 {
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
109 struct shared_storage *storage = (struct shared_storage *)_storage;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
110
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
111 if (storage->auth_master_conn != NULL)
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
112 auth_master_deinit(&storage->auth_master_conn);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
113 index_storage_destroy(_storage);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
114 }
8372
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
115
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
116 static void shared_storage_auth_master_init(struct shared_storage *storage)
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
117 {
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
118 const char *auth_socket_path;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
119 bool debug;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
120
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
121 auth_socket_path = getenv("AUTH_SOCKET_PATH");
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
122 if (auth_socket_path == NULL) {
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
123 auth_socket_path = t_strconcat(storage->base_dir,
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
124 "/auth-master", NULL);
8372
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
125 }
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
126
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
127 debug = (storage->storage.flags & MAIL_STORAGE_FLAG_DEBUG) != 0;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
128 storage->auth_master_conn = auth_master_init(auth_socket_path, debug);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
129 }
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
130
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
131 static int
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
132 shared_storage_lookup_home(struct shared_storage *storage,
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
133 const char *user, const char **home_r)
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
134 {
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
135 struct auth_user_reply reply;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
136 pool_t userdb_pool;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
137 int ret;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
138
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
139 if (storage->auth_master_conn == NULL)
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
140 shared_storage_auth_master_init(storage);
8372
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
141
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
142 userdb_pool = pool_alloconly_create("userdb lookup", 512);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
143 ret = auth_master_user_lookup(storage->auth_master_conn, user,
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
144 AUTH_SERVICE_INTERNAL,
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
145 userdb_pool, &reply);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
146 if (ret > 0)
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
147 *home_r = t_strdup(reply.home);
8372
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
148 pool_unref(&userdb_pool);
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
149 return ret;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
150 }
8372
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
151
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
152 static void get_nonexisting_user_location(struct shared_storage *storage,
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
153 string_t *location)
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
154 {
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
155 /* user wasn't found. we'll still need to create the storage
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
156 to avoid exposing which users exist and which don't. */
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
157 str_append(location, storage->storage_class->name);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
158 str_append_c(location, ':');
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
159
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
160 /* use a reachable but non-existing path as the mail root directory */
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
161 str_append(location, storage->base_dir);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
162 str_append(location, PKG_RUNDIR"/user-not-found");
8372
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
163 }
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
164
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 int shared_storage_get_namespace(struct mail_storage *_storage,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 const char **_name,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 struct mail_namespace **ns_r)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 struct shared_storage *storage = (struct shared_storage *)_storage;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 struct mail_user *user = _storage->ns->user;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 static struct var_expand_table static_tab[] = {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 { 'u', NULL },
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 { 'n', NULL },
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 { 'd', NULL },
8372
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
175 { 'h', NULL },
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 { '\0', NULL }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 };
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 struct var_expand_table *tab;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 struct mail_namespace *ns;
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
180 const char *domain = NULL, *username = NULL, *userdomain = NULL;
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 const char *name, *p, *next, **dest, *error;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 string_t *prefix, *location;
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
183 int ret;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
184
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
185 *ns_r = NULL;
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 p = storage->ns_prefix_pattern;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 for (name = *_name; *p != '\0';) {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 if (*p != '%') {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 if (*p != *name)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 p++; name++;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 continue;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 switch (*++p) {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 case 'd':
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 dest = &domain;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 break;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 case 'n':
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 dest = &username;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 break;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 case 'u':
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 dest = &userdomain;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 break;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 default:
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 /* we checked this already above */
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 i_unreached();
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 p++;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 next = strchr(name, *p != '\0' ? *p : _storage->ns->sep);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 if (next == NULL)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 *dest = t_strdup_until(name, next);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 name = next;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 /* successfully matched the name. */
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 if (userdomain == NULL) {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 i_assert(username != NULL);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 userdomain = domain == NULL ? username :
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 t_strconcat(username, "@", domain, NULL);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 } else {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 domain = strchr(userdomain, '@');
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 if (domain == NULL)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 username = userdomain;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 else {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 username = t_strdup_until(userdomain, domain);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 domain++;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 /* expand the namespace prefix and see if it already exists.
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 this should normally happen only when the mailbox is being opened */
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 tab = t_malloc(sizeof(static_tab));
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 memcpy(tab, static_tab, sizeof(static_tab));
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 tab[0].value = userdomain;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 tab[1].value = username;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 tab[2].value = domain;
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
240
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 prefix = t_str_new(128);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 str_append(prefix, _storage->ns->prefix);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 var_expand(prefix, storage->ns_prefix_pattern, tab);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 ns = mail_namespace_find_prefix(user->namespaces, str_c(prefix));
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 if (ns != NULL) {
8254
c465b10a76fd Shared mailboxes: First mailbox access failed if virtual separator didn't match real separator.
Timo Sirainen <tss@iki.fi>
parents: 8173
diff changeset
247 *_name = mail_namespace_fix_sep(ns, name);
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 *ns_r = ns;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 return 0;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
252 if (!var_has_key(storage->location, 'h'))
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
253 ret = 1;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
254 else {
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
255 /* we'll need to look up the user's home directory */
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
256 ret = shared_storage_lookup_home(storage, userdomain,
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
257 &tab[3].value);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
258 if (ret < 0) {
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
259 mail_storage_set_critical(_storage, "Namespace '%s': "
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
260 "Could not lookup home for user %s",
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
261 _storage->ns->prefix, userdomain);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
262 return -1;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
263 }
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
264 }
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
265
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 /* create the new namespace */
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 ns = p_new(user->pool, struct mail_namespace, 1);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 ns->type = NAMESPACE_SHARED;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 ns->user = user;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 ns->prefix = p_strdup(user->pool, str_c(prefix));
8291
4296aa3fbb75 Subscription handling fixes for subscriptions=no namespaces and shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8254
diff changeset
271 ns->flags = NAMESPACE_FLAG_LIST | NAMESPACE_FLAG_HIDDEN |
4296aa3fbb75 Subscription handling fixes for subscriptions=no namespaces and shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8254
diff changeset
272 NAMESPACE_FLAG_AUTOCREATED;
8254
c465b10a76fd Shared mailboxes: First mailbox access failed if virtual separator didn't match real separator.
Timo Sirainen <tss@iki.fi>
parents: 8173
diff changeset
273 ns->sep = _storage->ns->sep;
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 location = t_str_new(256);
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
276 if (ret > 0)
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
277 var_expand(location, storage->location, tab);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
278 else
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
279 get_nonexisting_user_location(storage, location);
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 if (mail_storage_create(ns, NULL, str_c(location), _storage->flags,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 _storage->lock_method, &error) < 0) {
8371
b46cf0979768 Use mail_storage_set_critical() instead of i_error() directly.
Timo Sirainen <tss@iki.fi>
parents: 8319
diff changeset
282 mail_storage_set_critical(_storage, "Namespace '%s': %s",
b46cf0979768 Use mail_storage_set_critical() instead of i_error() directly.
Timo Sirainen <tss@iki.fi>
parents: 8319
diff changeset
283 ns->prefix, error);
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 /* FIXME: we could remove namespaces here that don't have usable
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287 mailboxes. otherwise the memory usage could just keep growing. */
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 mail_user_add_namespace(user, ns);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289
8254
c465b10a76fd Shared mailboxes: First mailbox access failed if virtual separator didn't match real separator.
Timo Sirainen <tss@iki.fi>
parents: 8173
diff changeset
290 *_name = mail_namespace_fix_sep(ns, name);
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 *ns_r = ns;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 return 0;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 static void shared_mailbox_copy_error(struct mail_storage *shared_storage,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 struct mail_namespace *backend_ns)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 const char *str;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 enum mail_error error;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 str = mail_storage_get_last_error(backend_ns->storage, &error);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 mail_storage_set_error(shared_storage, error, str);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 static struct mailbox *
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 shared_mailbox_open(struct mail_storage *storage, const char *name,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 struct istream *input, enum mailbox_open_flags flags)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 struct mail_namespace *ns;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 struct mailbox *box;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 if (input != NULL) {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313 mail_storage_set_critical(storage,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 "Shared storage doesn't support streamed mailboxes");
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 return NULL;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 if (shared_storage_get_namespace(storage, &name, &ns) < 0)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 return NULL;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320
8319
8553bb4c53ad Fixed shared mailboxes to work with plugins.
Timo Sirainen <tss@iki.fi>
parents: 8291
diff changeset
321 /* if we call the normal mailbox_open() here the plugins will see
8553bb4c53ad Fixed shared mailboxes to work with plugins.
Timo Sirainen <tss@iki.fi>
parents: 8291
diff changeset
322 mailbox_open() called twice and they could break. */
8553bb4c53ad Fixed shared mailboxes to work with plugins.
Timo Sirainen <tss@iki.fi>
parents: 8291
diff changeset
323 box = ns->storage->storage_class->v.
8553bb4c53ad Fixed shared mailboxes to work with plugins.
Timo Sirainen <tss@iki.fi>
parents: 8291
diff changeset
324 mailbox_open(ns->storage, name, NULL, flags);
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 if (box == NULL)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 shared_mailbox_copy_error(storage, ns);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327 return box;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 static int shared_mailbox_create(struct mail_storage *storage,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 const char *name, bool directory)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 struct mail_namespace *ns;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 int ret;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 if (shared_storage_get_namespace(storage, &name, &ns) < 0)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 return -1;
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
338
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 ret = mail_storage_mailbox_create(ns->storage, name, directory);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 if (ret < 0)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 shared_mailbox_copy_error(storage, ns);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 return ret;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 struct mail_storage shared_storage = {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 MEMBER(name) SHARED_STORAGE_NAME,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 MEMBER(mailbox_is_file) FALSE, /* unknown at this point */
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 NULL,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 NULL,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 shared_alloc,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 shared_create,
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
354 shared_storage_destroy,
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 NULL,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 shared_mailbox_open,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357 shared_mailbox_create
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 };