annotate src/lib-storage/index/shared/shared-storage.c @ 9532:00cd9aacd03c HEAD

Updated copyright notices to include year 2010.
author Timo Sirainen <tss@iki.fi>
date Mon, 25 Jan 2010 01:18:58 +0200
parents 518963e8a20d
children 0a00dcc4f0ea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9532
00cd9aacd03c Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 9233
diff changeset
1 /* Copyright (c) 2008-2010 Dovecot authors, see the included COPYING file */
8173
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"
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #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
8 #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
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
8685
6ee78e18d026 Increased some initial memory pool sizes.
Timo Sirainen <tss@iki.fi>
parents: 8677
diff changeset
28 pool = pool_alloconly_create("shared storage", 1024);
8173
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;
8446
1c13cf0f8bb5 Added mail_namespace_destroy().
Timo Sirainen <tss@iki.fi>
parents: 8431
diff changeset
47 char *wildcardp;
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 bool have_username;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 /* 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
51 p = strchr(data, ':');
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 if (p == NULL) {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 *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
54 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 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
57 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
58 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
59 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
60 *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
61 driver, NULL);
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 _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
65
8446
1c13cf0f8bb5 Added mail_namespace_destroy().
Timo Sirainen <tss@iki.fi>
parents: 8431
diff changeset
66 wildcardp = strchr(_storage->ns->prefix, '%');
1c13cf0f8bb5 Added mail_namespace_destroy().
Timo Sirainen <tss@iki.fi>
parents: 8431
diff changeset
67 if (wildcardp == NULL) {
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 *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
69 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 }
8446
1c13cf0f8bb5 Added mail_namespace_destroy().
Timo Sirainen <tss@iki.fi>
parents: 8431
diff changeset
71 storage->ns_prefix_pattern = p_strdup(_storage->pool, wildcardp);
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 have_username = FALSE;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 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
75 if (*p != '%')
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 continue;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 if (*++p == '\0')
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 break;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 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
80 have_username = TRUE;
8677
61dd475e9f0a Shared namespaces: Allow using %% in the prefix.
Timo Sirainen <tss@iki.fi>
parents: 8652
diff changeset
81 else if (*p != '%' && *p != 'd')
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 break;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 if (*p != '\0') {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 *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
86 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 if (!have_username) {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 *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
90 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92
8915
676efa08f5d7 shared mailboxes: Error logging improvement.
Timo Sirainen <tss@iki.fi>
parents: 8904
diff changeset
93 /* truncate prefix after the above checks are done, so they can log
676efa08f5d7 shared mailboxes: Error logging improvement.
Timo Sirainen <tss@iki.fi>
parents: 8904
diff changeset
94 the full prefix in error conditions */
676efa08f5d7 shared mailboxes: Error logging improvement.
Timo Sirainen <tss@iki.fi>
parents: 8904
diff changeset
95 *wildcardp = '\0';
676efa08f5d7 shared mailboxes: Error logging improvement.
Timo Sirainen <tss@iki.fi>
parents: 8904
diff changeset
96
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 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
98 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 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
100 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
101
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 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
103 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
104 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
105 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
106 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
107 return 0;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109
8467
03c418eadc8b mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents: 8465
diff changeset
110 static void
03c418eadc8b mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents: 8465
diff changeset
111 get_nonexisting_user_location(struct shared_storage *storage,
03c418eadc8b mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents: 8465
diff changeset
112 const char *username, string_t *location)
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
113 {
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
114 /* 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
115 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
116 str_append(location, storage->storage_class->name);
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
117 str_append_c(location, ':');
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 /* 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
120 str_append(location, storage->base_dir);
8467
03c418eadc8b mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents: 8465
diff changeset
121 str_append(location, "/user-not-found/");
03c418eadc8b mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents: 8465
diff changeset
122 str_append(location, username);
8372
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
123 }
469fc16380da shared namespaces: new %%h variable, expanding to the traget users home.
Sascha Wilde <wilde@intevation.de>
parents: 8371
diff changeset
124
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 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
126 const char **_name,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 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
128 {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 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
130 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
131 static struct var_expand_table static_tab[] = {
8544
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8467
diff changeset
132 { 'u', NULL, "user" },
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8467
diff changeset
133 { 'n', NULL, "username" },
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8467
diff changeset
134 { 'd', NULL, "domain" },
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8467
diff changeset
135 { 'h', NULL, "home" },
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8467
diff changeset
136 { '\0', NULL, NULL }
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 };
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 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
139 struct mail_namespace *ns;
8467
03c418eadc8b mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents: 8465
diff changeset
140 struct mail_user *owner;
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
141 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
142 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
143 string_t *prefix, *location;
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
144 int ret;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
145
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
146 *ns_r = NULL;
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 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
149 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
150 if (*p != '%') {
8928
3a30d73fc463 Shared mailboxes: If selecting prefix/<username>, try to open the user's INBOX.
Timo Sirainen <tss@iki.fi>
parents: 8927
diff changeset
151 if (*p != *name)
3a30d73fc463 Shared mailboxes: If selecting prefix/<username>, try to open the user's INBOX.
Timo Sirainen <tss@iki.fi>
parents: 8927
diff changeset
152 break;
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 p++; name++;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 continue;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 switch (*++p) {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 case 'd':
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 dest = &domain;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 break;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 case 'n':
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 dest = &username;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 break;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 case 'u':
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 dest = &userdomain;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 break;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 default:
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 /* 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
168 i_unreached();
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 p++;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 next = strchr(name, *p != '\0' ? *p : _storage->ns->sep);
8904
2b6107437df3 If shared_storage_get_namespace() fails due to ns prefix pattern mismatch, log an error.
Timo Sirainen <tss@iki.fi>
parents: 8901
diff changeset
173 if (next == NULL) {
8928
3a30d73fc463 Shared mailboxes: If selecting prefix/<username>, try to open the user's INBOX.
Timo Sirainen <tss@iki.fi>
parents: 8927
diff changeset
174 *dest = name;
3a30d73fc463 Shared mailboxes: If selecting prefix/<username>, try to open the user's INBOX.
Timo Sirainen <tss@iki.fi>
parents: 8927
diff changeset
175 name = "";
3a30d73fc463 Shared mailboxes: If selecting prefix/<username>, try to open the user's INBOX.
Timo Sirainen <tss@iki.fi>
parents: 8927
diff changeset
176 break;
3a30d73fc463 Shared mailboxes: If selecting prefix/<username>, try to open the user's INBOX.
Timo Sirainen <tss@iki.fi>
parents: 8927
diff changeset
177 }
3a30d73fc463 Shared mailboxes: If selecting prefix/<username>, try to open the user's INBOX.
Timo Sirainen <tss@iki.fi>
parents: 8927
diff changeset
178 *dest = t_strdup_until(name, next);
3a30d73fc463 Shared mailboxes: If selecting prefix/<username>, try to open the user's INBOX.
Timo Sirainen <tss@iki.fi>
parents: 8927
diff changeset
179 name = next;
3a30d73fc463 Shared mailboxes: If selecting prefix/<username>, try to open the user's INBOX.
Timo Sirainen <tss@iki.fi>
parents: 8927
diff changeset
180 }
3a30d73fc463 Shared mailboxes: If selecting prefix/<username>, try to open the user's INBOX.
Timo Sirainen <tss@iki.fi>
parents: 8927
diff changeset
181 if (*p != '\0') {
3a30d73fc463 Shared mailboxes: If selecting prefix/<username>, try to open the user's INBOX.
Timo Sirainen <tss@iki.fi>
parents: 8927
diff changeset
182 if (*name == '\0' ||
3a30d73fc463 Shared mailboxes: If selecting prefix/<username>, try to open the user's INBOX.
Timo Sirainen <tss@iki.fi>
parents: 8927
diff changeset
183 (name[1] == '\0' && *name == _storage->ns->sep)) {
3a30d73fc463 Shared mailboxes: If selecting prefix/<username>, try to open the user's INBOX.
Timo Sirainen <tss@iki.fi>
parents: 8927
diff changeset
184 /* trying to open <prefix>/<user> mailbox */
3a30d73fc463 Shared mailboxes: If selecting prefix/<username>, try to open the user's INBOX.
Timo Sirainen <tss@iki.fi>
parents: 8927
diff changeset
185 name = "INBOX";
3a30d73fc463 Shared mailboxes: If selecting prefix/<username>, try to open the user's INBOX.
Timo Sirainen <tss@iki.fi>
parents: 8927
diff changeset
186 } else {
8904
2b6107437df3 If shared_storage_get_namespace() fails due to ns prefix pattern mismatch, log an error.
Timo Sirainen <tss@iki.fi>
parents: 8901
diff changeset
187 mail_storage_set_critical(_storage,
8928
3a30d73fc463 Shared mailboxes: If selecting prefix/<username>, try to open the user's INBOX.
Timo Sirainen <tss@iki.fi>
parents: 8927
diff changeset
188 "Invalid namespace prefix %s vs %s",
3a30d73fc463 Shared mailboxes: If selecting prefix/<username>, try to open the user's INBOX.
Timo Sirainen <tss@iki.fi>
parents: 8927
diff changeset
189 storage->ns_prefix_pattern, *_name);
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 return -1;
8904
2b6107437df3 If shared_storage_get_namespace() fails due to ns prefix pattern mismatch, log an error.
Timo Sirainen <tss@iki.fi>
parents: 8901
diff changeset
191 }
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 }
8956
9619fbd698d5 shared mailboxes: Don't assert-crash if trying to look up "" user's mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8928
diff changeset
193
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 /* successfully matched the name. */
9233
518963e8a20d shared mailboxes: If only %%n is specified in prefix, default to current user's domain.
Timo Sirainen <tss@iki.fi>
parents: 9009
diff changeset
195 if (userdomain != NULL) {
518963e8a20d shared mailboxes: If only %%n is specified in prefix, default to current user's domain.
Timo Sirainen <tss@iki.fi>
parents: 9009
diff changeset
196 /* user@domain given */
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 domain = strchr(userdomain, '@');
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 if (domain == NULL)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 username = userdomain;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 else {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 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
202 domain++;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 }
9233
518963e8a20d shared mailboxes: If only %%n is specified in prefix, default to current user's domain.
Timo Sirainen <tss@iki.fi>
parents: 9009
diff changeset
204 } else if (username == NULL) {
518963e8a20d shared mailboxes: If only %%n is specified in prefix, default to current user's domain.
Timo Sirainen <tss@iki.fi>
parents: 9009
diff changeset
205 /* trying to open namespace "shared/domain"
518963e8a20d shared mailboxes: If only %%n is specified in prefix, default to current user's domain.
Timo Sirainen <tss@iki.fi>
parents: 9009
diff changeset
206 namespace prefix. */
518963e8a20d shared mailboxes: If only %%n is specified in prefix, default to current user's domain.
Timo Sirainen <tss@iki.fi>
parents: 9009
diff changeset
207 mail_storage_set_error(_storage, MAIL_ERROR_NOTFOUND,
518963e8a20d shared mailboxes: If only %%n is specified in prefix, default to current user's domain.
Timo Sirainen <tss@iki.fi>
parents: 9009
diff changeset
208 T_MAIL_ERR_MAILBOX_NOT_FOUND(*_name));
518963e8a20d shared mailboxes: If only %%n is specified in prefix, default to current user's domain.
Timo Sirainen <tss@iki.fi>
parents: 9009
diff changeset
209 return -1;
518963e8a20d shared mailboxes: If only %%n is specified in prefix, default to current user's domain.
Timo Sirainen <tss@iki.fi>
parents: 9009
diff changeset
210 } else {
518963e8a20d shared mailboxes: If only %%n is specified in prefix, default to current user's domain.
Timo Sirainen <tss@iki.fi>
parents: 9009
diff changeset
211 if (domain == NULL) {
518963e8a20d shared mailboxes: If only %%n is specified in prefix, default to current user's domain.
Timo Sirainen <tss@iki.fi>
parents: 9009
diff changeset
212 /* no domain given, use ours (if we have one) */
518963e8a20d shared mailboxes: If only %%n is specified in prefix, default to current user's domain.
Timo Sirainen <tss@iki.fi>
parents: 9009
diff changeset
213 domain = strchr(user->username, '@');
518963e8a20d shared mailboxes: If only %%n is specified in prefix, default to current user's domain.
Timo Sirainen <tss@iki.fi>
parents: 9009
diff changeset
214 if (domain != NULL) domain++;
518963e8a20d shared mailboxes: If only %%n is specified in prefix, default to current user's domain.
Timo Sirainen <tss@iki.fi>
parents: 9009
diff changeset
215 }
518963e8a20d shared mailboxes: If only %%n is specified in prefix, default to current user's domain.
Timo Sirainen <tss@iki.fi>
parents: 9009
diff changeset
216 userdomain = domain == NULL ? username :
518963e8a20d shared mailboxes: If only %%n is specified in prefix, default to current user's domain.
Timo Sirainen <tss@iki.fi>
parents: 9009
diff changeset
217 t_strconcat(username, "@", domain, NULL);
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 }
8956
9619fbd698d5 shared mailboxes: Don't assert-crash if trying to look up "" user's mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8928
diff changeset
219 if (*userdomain == '\0') {
9619fbd698d5 shared mailboxes: Don't assert-crash if trying to look up "" user's mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8928
diff changeset
220 mail_storage_set_error(_storage, MAIL_ERROR_PARAMS,
9619fbd698d5 shared mailboxes: Don't assert-crash if trying to look up "" user's mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8928
diff changeset
221 "Empty username doesn't exist");
9619fbd698d5 shared mailboxes: Don't assert-crash if trying to look up "" user's mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8928
diff changeset
222 return -1;
9619fbd698d5 shared mailboxes: Don't assert-crash if trying to look up "" user's mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8928
diff changeset
223 }
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 /* 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
226 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
227 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
228 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
229 tab[0].value = userdomain;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 tab[1].value = username;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 tab[2].value = domain;
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
232
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 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
234 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
235 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
236
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 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
238 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
239 *_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
240 *ns_r = ns;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 return 0;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243
8467
03c418eadc8b mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents: 8465
diff changeset
244 owner = mail_user_init(userdomain);
8544
983d38de06c9 var_expand(): Added support for long %{variable} names.
Timo Sirainen <tss@iki.fi>
parents: 8467
diff changeset
245 if (!var_has_key(storage->location, 'h', "home"))
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
246 ret = 1;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
247 else {
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
248 /* we'll need to look up the user's home directory */
8467
03c418eadc8b mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents: 8465
diff changeset
249 if ((ret = mail_user_get_home(owner, &tab[3].value)) < 0) {
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
250 mail_storage_set_critical(_storage, "Namespace '%s': "
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
251 "Could not lookup home for user %s",
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
252 _storage->ns->prefix, userdomain);
8467
03c418eadc8b mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents: 8465
diff changeset
253 mail_user_unref(&owner);
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
254 return -1;
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
255 }
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
256 }
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
257
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 /* create the new namespace */
8446
1c13cf0f8bb5 Added mail_namespace_destroy().
Timo Sirainen <tss@iki.fi>
parents: 8431
diff changeset
259 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
260 ns->type = NAMESPACE_SHARED;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 ns->user = user;
8446
1c13cf0f8bb5 Added mail_namespace_destroy().
Timo Sirainen <tss@iki.fi>
parents: 8431
diff changeset
262 ns->prefix = i_strdup(str_c(prefix));
8467
03c418eadc8b mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents: 8465
diff changeset
263 ns->owner = owner;
8967
0dcb7e34a216 Allow shared namespaces to have subscriptions=yes.
Timo Sirainen <tss@iki.fi>
parents: 8956
diff changeset
264 ns->flags = (NAMESPACE_FLAG_SUBSCRIPTIONS & _storage->ns->flags) |
0dcb7e34a216 Allow shared namespaces to have subscriptions=yes.
Timo Sirainen <tss@iki.fi>
parents: 8956
diff changeset
265 NAMESPACE_FLAG_LIST_PREFIX | NAMESPACE_FLAG_HIDDEN |
8895
9b3bb65b808e shared mailboxes: Mark created users' namespaces as having INBOXes.
Timo Sirainen <tss@iki.fi>
parents: 8685
diff changeset
266 NAMESPACE_FLAG_AUTOCREATED | NAMESPACE_FLAG_INBOX;
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
267 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
268
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 location = t_str_new(256);
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
270 if (ret > 0)
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
271 var_expand(location, storage->location, tab);
8901
703214a10642 acl: Don't try to create dovecot-acl-list file for unknown users' auto-created namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8895
diff changeset
272 else {
8467
03c418eadc8b mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents: 8465
diff changeset
273 get_nonexisting_user_location(storage, userdomain, location);
8901
703214a10642 acl: Don't try to create dovecot-acl-list file for unknown users' auto-created namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8895
diff changeset
274 ns->flags |= NAMESPACE_FLAG_UNUSABLE;
703214a10642 acl: Don't try to create dovecot-acl-list file for unknown users' auto-created namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8895
diff changeset
275 }
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 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
277 _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
278 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
279 ns->prefix, error);
8467
03c418eadc8b mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents: 8465
diff changeset
280 mail_namespace_destroy(ns);
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 return -1;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 }
8461
659667d89f69 Added list=children option for namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8457
diff changeset
283 _storage->ns->flags |= NAMESPACE_FLAG_USABLE;
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
284 *_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
285 *ns_r = ns;
8652
8b3af54b4dc3 hook_mail_namespaces_created() wasn't always called with all namespaces as parameter.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
286
8b3af54b4dc3 hook_mail_namespaces_created() wasn't always called with all namespaces as parameter.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
287 mail_user_add_namespace(user, &ns);
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 return 0;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 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
292 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
293 {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 const char *str;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 enum mail_error error;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 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
298 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
299 }
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 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
302 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
303 {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 struct mail_namespace *ns;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 int ret;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 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
308 return -1;
8375
4aafdbe62680 shared mailboxes: Cleanups, fixes and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 8372
diff changeset
309
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 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
311 if (ret < 0)
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 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
313 return ret;
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 }
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316 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
317 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
318 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
319
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 {
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 NULL,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 NULL,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 shared_alloc,
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 shared_create,
8467
03c418eadc8b mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents: 8465
diff changeset
325 index_storage_destroy,
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 NULL,
8927
7d484e0f0789 Shared mailboxes: Find the final storage before calling mail_storage.mailbox_open(), not inside it.
Timo Sirainen <tss@iki.fi>
parents: 8915
diff changeset
327 NULL,
8173
6dd0c6755afe Added initial support for shared mailboxes. Listing isn't supported yet.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 shared_mailbox_create
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 };