annotate src/lib-storage/index/shared/shared-storage.c @ 8446:1c13cf0f8bb5 HEAD

Added mail_namespace_destroy().
author Timo Sirainen <tss@iki.fi>
date Wed, 19 Nov 2008 18:45:46 +0200
parents 118e07fdfe11
children 4cf249042df6
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"
8431
118e07fdfe11 shared-storage.h doesn't require index-storage.h, don't include it.
Timo Sirainen <tss@iki.fi>
parents: 8375
diff changeset
9 #include "index-storage.h"
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "shared-storage.h"
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11
8372
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
12 #include <stdlib.h>
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
13 #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
14
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #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
16 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
17
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 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
19 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
20
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 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
22 &mailbox_list_module_register);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 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
25 {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 struct shared_storage *storage;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 pool_t pool;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 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
30 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
31 storage->storage = shared_storage;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 storage->storage.pool = pool;
8319
8553bb4c53ad Fixed shared mailboxes to work with plugins.
Timo Sirainen <tss@iki.fi>
parents: 8291
diff changeset
33 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
34
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
35 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
36 if (storage->base_dir == NULL)
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
37 storage->base_dir = PKG_RUNDIR;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
38
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 return &storage->storage;
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
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 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
43 const char **error_r)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 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
46 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
47 const char *driver, *p;
8446
1c13cf0f8bb5 Added mail_namespace_destroy().
Timo Sirainen <tss@iki.fi>
parents: 8431
diff changeset
48 char *wildcardp;
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 bool have_username;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 /* 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
52 p = strchr(data, ':');
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 if (p == NULL) {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 *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
55 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 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
58 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
59 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
60 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
61 *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
62 driver, NULL);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 return -1;
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 _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
66
8446
1c13cf0f8bb5 Added mail_namespace_destroy().
Timo Sirainen <tss@iki.fi>
parents: 8431
diff changeset
67 wildcardp = strchr(_storage->ns->prefix, '%');
1c13cf0f8bb5 Added mail_namespace_destroy().
Timo Sirainen <tss@iki.fi>
parents: 8431
diff changeset
68 if (wildcardp == NULL) {
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 *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
70 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 }
8446
1c13cf0f8bb5 Added mail_namespace_destroy().
Timo Sirainen <tss@iki.fi>
parents: 8431
diff changeset
72 storage->ns_prefix_pattern = p_strdup(_storage->pool, wildcardp);
1c13cf0f8bb5 Added mail_namespace_destroy().
Timo Sirainen <tss@iki.fi>
parents: 8431
diff changeset
73 *wildcardp = '\0';
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 have_username = FALSE;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 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
77 if (*p != '%')
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 continue;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 if (*++p == '\0')
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 break;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 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
82 have_username = TRUE;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 else if (*p != 'd')
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 break;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 if (*p != '\0') {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 *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
88 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 if (!have_username) {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 *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
92 return -1;
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
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 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
96 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 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
98 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
99
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 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
101 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
102 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
103 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
104 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
105 return 0;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
108 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
109 {
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
110 struct shared_storage *storage = (struct shared_storage *)_storage;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
111
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
112 if (storage->auth_master_conn != NULL)
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
113 auth_master_deinit(&storage->auth_master_conn);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
114 index_storage_destroy(_storage);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
115 }
8372
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
116
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
117 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
118 {
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
119 const char *auth_socket_path;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
120 bool debug;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
121
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
122 auth_socket_path = getenv("AUTH_SOCKET_PATH");
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
123 if (auth_socket_path == NULL) {
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
124 auth_socket_path = t_strconcat(storage->base_dir,
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
125 "/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
126 }
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
127
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
128 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
129 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
130 }
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
131
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
132 static int
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
133 shared_storage_lookup_home(struct shared_storage *storage,
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
134 const char *user, const char **home_r)
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
135 {
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
136 struct auth_user_reply reply;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
137 pool_t userdb_pool;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
138 int ret;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
139
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
140 if (storage->auth_master_conn == NULL)
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
141 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
142
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
143 userdb_pool = pool_alloconly_create("userdb lookup", 512);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
144 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
145 AUTH_SERVICE_INTERNAL,
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
146 userdb_pool, &reply);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
147 if (ret > 0)
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
148 *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
149 pool_unref(&userdb_pool);
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
150 return ret;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
151 }
8372
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
152
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
153 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
154 string_t *location)
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
155 {
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
156 /* 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
157 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
158 str_append(location, storage->storage_class->name);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
159 str_append_c(location, ':');
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
160
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
161 /* 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
162 str_append(location, storage->base_dir);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
163 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
164 }
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
165
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 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
167 const char **_name,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 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
169 {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 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
171 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
172 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
173 { 'u', NULL },
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 { 'n', NULL },
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 { 'd', NULL },
8372
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
176 { 'h', NULL },
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 { '\0', NULL }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 };
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 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
180 struct mail_namespace *ns;
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
181 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
182 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
183 string_t *prefix, *location;
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
184 int ret;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
185
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
186 *ns_r = NULL;
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 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
189 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
190 if (*p != '%') {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 if (*p != *name)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 p++; name++;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 continue;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 switch (*++p) {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 case 'd':
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 dest = &domain;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 break;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 case 'n':
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 dest = &username;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 break;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 case 'u':
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 dest = &userdomain;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 break;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 default:
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 /* 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
208 i_unreached();
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 p++;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 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
213 if (next == NULL)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 *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
217 name = next;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 /* successfully matched the name. */
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 if (userdomain == NULL) {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 i_assert(username != NULL);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 userdomain = domain == NULL ? username :
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 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
224 } else {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 domain = strchr(userdomain, '@');
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 if (domain == NULL)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 username = userdomain;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 else {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 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
230 domain++;
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
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 /* 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
235 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
236 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
237 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
238 tab[0].value = userdomain;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 tab[1].value = username;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 tab[2].value = domain;
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
241
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 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
243 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
244 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
245
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 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
247 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
248 *_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
249 *ns_r = ns;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 return 0;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
253 if (!var_has_key(storage->location, 'h'))
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
254 ret = 1;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
255 else {
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
256 /* 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
257 ret = shared_storage_lookup_home(storage, userdomain,
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
258 &tab[3].value);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
259 if (ret < 0) {
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
260 mail_storage_set_critical(_storage, "Namespace '%s': "
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
261 "Could not lookup home for user %s",
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
262 _storage->ns->prefix, userdomain);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
263 return -1;
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 }
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
266
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 /* create the new namespace */
8446
1c13cf0f8bb5 Added mail_namespace_destroy().
Timo Sirainen <tss@iki.fi>
parents: 8431
diff changeset
268 ns = i_new(struct mail_namespace, 1);
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 ns->type = NAMESPACE_SHARED;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 ns->user = user;
8446
1c13cf0f8bb5 Added mail_namespace_destroy().
Timo Sirainen <tss@iki.fi>
parents: 8431
diff changeset
271 ns->prefix = i_strdup(str_c(prefix));
8291
4296aa3fbb75 Subscription handling fixes for subscriptions=no namespaces and shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8254
diff changeset
272 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
273 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
274 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
275
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 location = t_str_new(256);
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
277 if (ret > 0)
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
278 var_expand(location, storage->location, tab);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
279 else
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
280 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
281 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
282 _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
283 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
284 ns->prefix, error);
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287 /* 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
288 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
289 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
290
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
291 *_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
292 *ns_r = ns;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 return 0;
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
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 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
297 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
298 {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 const char *str;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 enum mail_error error;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 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
303 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
304 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 static struct mailbox *
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 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
308 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
309 {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 struct mail_namespace *ns;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 struct mailbox *box;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313 if (input != NULL) {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 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
315 "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
316 return NULL;
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
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 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
320 return NULL;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321
8319
8553bb4c53ad Fixed shared mailboxes to work with plugins.
Timo Sirainen <tss@iki.fi>
parents: 8291
diff changeset
322 /* 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
323 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
324 box = ns->storage->storage_class->v.
8553bb4c53ad Fixed shared mailboxes to work with plugins.
Timo Sirainen <tss@iki.fi>
parents: 8291
diff changeset
325 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
326 if (box == NULL)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327 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
328 return box;
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
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 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
332 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
333 {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 struct mail_namespace *ns;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 int ret;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 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
338 return -1;
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
339
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 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
341 if (ret < 0)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 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
343 return ret;
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
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 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
347 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
348 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
349
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 {
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 NULL,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 shared_alloc,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 shared_create,
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
355 shared_storage_destroy,
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 NULL,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357 shared_mailbox_open,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 shared_mailbox_create
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 };