Mercurial > dovecot > original-hg > dovecot-1.2
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 |
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 }; |