mail-namespace.c revision 94ce7e7700cda14a8342cb08e7285507b4b531da
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2005-2009 Dovecot authors, see the included COPYING file */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "lib.h"
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainen#include "str.h"
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen#include "file-lock.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "mail-storage.h"
1dd875d96ab5640f78250079961c10e99ed4aa79Timo Sirainen#include "mail-namespace.h"
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
ffd9a1898a18fadfc5dce399162c25d50548f905Timo Sirainen#include <stdlib.h>
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
89b548af722113acb5d63dfffb44423cb60f91e4Timo Sirainenvoid (*hook_mail_namespaces_created)(struct mail_namespace *namespaces);
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid mail_namespace_init_storage(struct mail_namespace *ns)
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ns->list = mail_storage_get_list(ns->storage);
66ae183b6e895216037bd921367670f4b0665911Timo Sirainen ns->prefix_len = strlen(ns->prefix);
e86d0d34fe365da4c7ca4312d575bfcbf3a01c0eTimo Sirainen ns->real_sep = mailbox_list_get_hierarchy_sep(ns->list);
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (ns->sep == '\0')
da5d50534cfca45d0aaaf0bdac17b287b4588809Timo Sirainen ns->sep = ns->real_sep;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (ns->sep == '"' || ns->sep == '\\') {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ns->sep_str[0] = '\\';
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ns->sep_str[1] = ns->sep;
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen } else {
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen ns->sep_str[0] = ns->sep;
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen }
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic void mail_namespace_free(struct mail_namespace *ns)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (ns->owner != ns->user && ns->owner != NULL)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_user_unref(&ns->owner);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen i_free(ns->prefix);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen i_free(ns);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen
8fa41238067c854435884c459963fde6f8c6436bTimo Sirainenstatic struct mail_namespace *
8fa41238067c854435884c459963fde6f8c6436bTimo Sirainennamespace_add_env(const char *data, unsigned int num,
91dca97b367c54a139c268b56a0c67f564bd9197Timo Sirainen struct mail_user *user, enum mail_storage_flags flags,
91dca97b367c54a139c268b56a0c67f564bd9197Timo Sirainen enum file_lock_method lock_method,
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen struct mail_namespace *prev_namespaces)
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen{
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen struct mail_namespace *ns;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *sep, *type, *prefix, *driver, *error, *list, *alias_for;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
036626b19f14bef582f96e556913ae91b1d67881Timo Sirainen ns = i_new(struct mail_namespace, 1);
036626b19f14bef582f96e556913ae91b1d67881Timo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen sep = getenv(t_strdup_printf("NAMESPACE_%u_SEP", num));
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen type = getenv(t_strdup_printf("NAMESPACE_%u_TYPE", num));
5aeb15e5817fbd4b1d8de540aa7673e3819a8030Timo Sirainen prefix = getenv(t_strdup_printf("NAMESPACE_%u_PREFIX", num));
5aeb15e5817fbd4b1d8de540aa7673e3819a8030Timo Sirainen list = getenv(t_strdup_printf("NAMESPACE_%u_LIST", num));
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen alias_for = getenv(t_strdup_printf("NAMESPACE_%u_ALIAS", num));
91dca97b367c54a139c268b56a0c67f564bd9197Timo Sirainen if (getenv(t_strdup_printf("NAMESPACE_%u_INBOX", num)) != NULL)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen ns->flags |= NAMESPACE_FLAG_INBOX;
3ccab0bac68040f179a7de45c516cec258e28fdbTimo Sirainen if (getenv(t_strdup_printf("NAMESPACE_%u_HIDDEN", num)) != NULL)
3ccab0bac68040f179a7de45c516cec258e28fdbTimo Sirainen ns->flags |= NAMESPACE_FLAG_HIDDEN;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen if (list != NULL) {
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen if (strcmp(list, "children") == 0)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ns->flags |= NAMESPACE_FLAG_LIST_CHILDREN;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen else
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ns->flags |= NAMESPACE_FLAG_LIST_PREFIX;
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (getenv(t_strdup_printf("NAMESPACE_%u_SUBSCRIPTIONS", num)) != NULL)
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen ns->flags |= NAMESPACE_FLAG_SUBSCRIPTIONS;
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen if (type == NULL || *type == '\0' || strncmp(type, "private", 7) == 0) {
9f32b9444d2a6db8f556d2c49ffceab1a59791ffTimo Sirainen ns->type = NAMESPACE_PRIVATE;
9f32b9444d2a6db8f556d2c49ffceab1a59791ffTimo Sirainen ns->owner = user;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen } else if (strncmp(type, "shared", 6) == 0)
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen ns->type = NAMESPACE_SHARED;
3ccab0bac68040f179a7de45c516cec258e28fdbTimo Sirainen else if (strncmp(type, "public", 6) == 0)
648d24583c1574441c4fa0331a90bd4d6e7996c5Timo Sirainen ns->type = NAMESPACE_PUBLIC;
648d24583c1574441c4fa0331a90bd4d6e7996c5Timo Sirainen else {
ee246b46953e4b94b2f22e093373674fa9155500Timo Sirainen i_error("Unknown namespace type: %s", type);
287ba82a8da3eaa473b5735d4eeac2fb4c5d8117Timo Sirainen mail_namespace_free(ns);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen return NULL;
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen }
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen if (alias_for != NULL) {
e156adefc1260d31a145df2f5e9b3c82050d4163Timo Sirainen ns->alias_for = mail_namespace_find_prefix(prev_namespaces,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen alias_for);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (ns->alias_for == NULL) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen i_error("Invalid namespace alias_for: %s", alias_for);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_namespace_free(ns);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return NULL;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
b780aa272b742a43579cdb523cc79cc8d4521306Timo Sirainen if (ns->alias_for->alias_for != NULL) {
b780aa272b742a43579cdb523cc79cc8d4521306Timo Sirainen i_error("Chained namespace alias_for: %s", alias_for);
b780aa272b742a43579cdb523cc79cc8d4521306Timo Sirainen mail_namespace_free(ns);
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen return NULL;
b780aa272b742a43579cdb523cc79cc8d4521306Timo Sirainen }
b780aa272b742a43579cdb523cc79cc8d4521306Timo Sirainen ns->alias_chain_next = ns->alias_for->alias_chain_next;
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen ns->alias_for->alias_chain_next = ns;
80fc743146da5130de34174cdaad2576f103723fTimo Sirainen }
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen
e156adefc1260d31a145df2f5e9b3c82050d4163Timo Sirainen if (prefix == NULL)
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen prefix = "";
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen if ((flags & MAIL_STORAGE_FLAG_DEBUG) != 0) {
e156adefc1260d31a145df2f5e9b3c82050d4163Timo Sirainen i_info("Namespace: type=%s, prefix=%s, sep=%s, "
e156adefc1260d31a145df2f5e9b3c82050d4163Timo Sirainen "inbox=%s, hidden=%s, list=%s, subscriptions=%s",
e156adefc1260d31a145df2f5e9b3c82050d4163Timo Sirainen type == NULL ? "" : type, prefix, sep == NULL ? "" : sep,
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen (ns->flags & NAMESPACE_FLAG_INBOX) ? "yes" : "no",
20a802016205bbcafc90f164f769ea801f88d014Timo Sirainen (ns->flags & NAMESPACE_FLAG_HIDDEN) ? "yes" : "no",
036626b19f14bef582f96e556913ae91b1d67881Timo Sirainen list,
036626b19f14bef582f96e556913ae91b1d67881Timo Sirainen (ns->flags & NAMESPACE_FLAG_SUBSCRIPTIONS) ?
036626b19f14bef582f96e556913ae91b1d67881Timo Sirainen "yes" : "no");
036626b19f14bef582f96e556913ae91b1d67881Timo Sirainen }
036626b19f14bef582f96e556913ae91b1d67881Timo Sirainen
036626b19f14bef582f96e556913ae91b1d67881Timo Sirainen if (sep != NULL)
036626b19f14bef582f96e556913ae91b1d67881Timo Sirainen ns->sep = *sep;
036626b19f14bef582f96e556913ae91b1d67881Timo Sirainen ns->prefix = i_strdup(prefix);
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen ns->user = user;
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen if (ns->type == NAMESPACE_SHARED && strchr(ns->prefix, '%') != NULL) {
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen /* dynamic shared namespace */
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen ns->flags |= NAMESPACE_FLAG_INTERNAL;
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen driver = "shared";
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen } else {
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen driver = NULL;
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen }
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen if (mail_storage_create(ns, driver, data, flags, lock_method,
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen &error) < 0) {
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen i_error("Namespace '%s': %s", ns->prefix, error);
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen mail_namespace_free(ns);
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen return NULL;
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen }
47e0598840ecffa364ebed523e06939e22738f06Timo Sirainen return ns;
7797aa2479e99aeb71057b7a2584b2cb72e4d3f8Timo Sirainen}
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainenstatic bool namespaces_check(struct mail_namespace *namespaces)
bbf796c17f02538058d7559bfe96d677e5b55015Timo Sirainen{
8e7da21696c9f8a6d5e601243fb6172ec85d47b2Timo Sirainen struct mail_namespace *ns, *inbox_ns = NULL, *private_ns = NULL;
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen unsigned int private_ns_count = 0;
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen unsigned int subscriptions_count = 0;
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen char list_sep = '\0';
d161e3c2cde2bd8d5917840f68823a2259ed426eTimo Sirainen
ffd9a1898a18fadfc5dce399162c25d50548f905Timo Sirainen for (ns = namespaces; ns != NULL; ns = ns->next) {
ffd9a1898a18fadfc5dce399162c25d50548f905Timo Sirainen if ((ns->flags & NAMESPACE_FLAG_INBOX) != 0) {
1e923fcf497665fe071a154c31fb452766b0b2deTimo Sirainen if (inbox_ns != NULL) {
d161e3c2cde2bd8d5917840f68823a2259ed426eTimo Sirainen i_error("namespace configuration error: "
1e923fcf497665fe071a154c31fb452766b0b2deTimo Sirainen "There can be only one namespace with "
d161e3c2cde2bd8d5917840f68823a2259ed426eTimo Sirainen "inbox=yes");
d161e3c2cde2bd8d5917840f68823a2259ed426eTimo Sirainen return FALSE;
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen }
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen inbox_ns = ns;
1175f27441385a7011629f295f42708f9a3a4ffcTimo Sirainen }
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen if (ns->type == NAMESPACE_PRIVATE) {
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen private_ns = ns;
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen private_ns_count++;
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen }
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen if (*ns->prefix != '\0' &&
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen (ns->flags & NAMESPACE_FLAG_LIST_PREFIX) != 0 &&
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen ns->prefix[strlen(ns->prefix)-1] != ns->sep) {
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen i_error("namespace configuration error: "
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen "list=yes requires prefix=%s "
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen "to end with separator", ns->prefix);
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen return FALSE;
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen }
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen if ((ns->flags & (NAMESPACE_FLAG_LIST_PREFIX |
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen NAMESPACE_FLAG_LIST_CHILDREN)) != 0) {
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen if (list_sep == '\0')
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen list_sep = ns->sep;
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen else if (list_sep != ns->sep) {
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen i_error("namespace configuration error: "
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen "All list=yes namespaces must use "
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen "the same separator");
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen return FALSE;
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen }
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen }
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen if (*ns->prefix == '\0' &&
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen (ns->flags & NAMESPACE_FLAG_LIST_PREFIX) == 0) {
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen i_error("namespace configuration error: "
c5454841b5067a22827556ca9bc7935d190f57baTimo Sirainen "Empty prefix requires list=yes");
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen return FALSE;
5a07b37a9df398b5189c14872a600384208ab74bTimo Sirainen }
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen if ((ns->flags & NAMESPACE_FLAG_SUBSCRIPTIONS) != 0)
59151b71059df1190acd75d8717ed04a7920c862Timo Sirainen subscriptions_count++;
da985034a708db2f61394b30d117050ae6829ee5Timo Sirainen }
59151b71059df1190acd75d8717ed04a7920c862Timo Sirainen
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen if (inbox_ns == NULL) {
de12ff295bb3d0873b4dced5840612cbacd635efTimo Sirainen if (private_ns_count == 1) {
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen /* just one private namespace. we'll assume it's
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen the INBOX namespace. */
7d7b5c98f086ffa8ac9c90f21db17748ca607202Timo Sirainen private_ns->flags |= NAMESPACE_FLAG_INBOX;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen } else {
de12ff295bb3d0873b4dced5840612cbacd635efTimo Sirainen i_error("namespace configuration error: "
da985034a708db2f61394b30d117050ae6829ee5Timo Sirainen "inbox=yes namespace missing");
da985034a708db2f61394b30d117050ae6829ee5Timo Sirainen return FALSE;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen }
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen }
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen if (list_sep == '\0') {
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen i_error("namespace configuration error: "
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen "no list=yes namespaces");
de12ff295bb3d0873b4dced5840612cbacd635efTimo Sirainen return FALSE;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen }
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen if (subscriptions_count == 0) {
de12ff295bb3d0873b4dced5840612cbacd635efTimo Sirainen i_error("namespace configuration error: "
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen "no subscriptions=yes namespaces");
de12ff295bb3d0873b4dced5840612cbacd635efTimo Sirainen return FALSE;
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen }
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen return TRUE;
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen}
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainenint mail_namespaces_init(struct mail_user *user)
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen{
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen struct mail_namespace *namespaces, *ns, **ns_p;
5626ae5e3316eced244adb6485c0927f1c7fdc41Timo Sirainen enum mail_storage_flags flags;
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen enum file_lock_method lock_method;
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen const char *mail, *data, *error;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen unsigned int i;
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen mail_storage_parse_env(&flags, &lock_method);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen namespaces = NULL; ns_p = &namespaces;
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen /* first try NAMESPACE_* environments */
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen for (i = 1; ; i++) {
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen T_BEGIN {
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen data = getenv(t_strdup_printf("NAMESPACE_%u", i));
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen } T_END;
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen if (data == NULL)
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen break;
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen
c27f03fa8fd2ef4acd1db814fae7d90e0eb9d3aeTimo Sirainen T_BEGIN {
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen *ns_p = namespace_add_env(data, i, user, flags,
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen lock_method, namespaces);
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainen } T_END;
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainen
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainen if (*ns_p == NULL)
287ba82a8da3eaa473b5735d4eeac2fb4c5d8117Timo Sirainen return -1;
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainen
f23298fea47eecbeded985ee2537a34c4c4ef56bTimo Sirainen ns_p = &(*ns_p)->next;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen }
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen if (namespaces != NULL) {
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen if (!namespaces_check(namespaces)) {
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen while (namespaces != NULL) {
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen ns = namespaces;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen namespaces = ns->next;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen mail_namespace_free(ns);
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen }
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen return -1;
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen }
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen mail_user_add_namespace(user, &namespaces);
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen if (hook_mail_namespaces_created != NULL) {
519e0a461271843833a2b42626ad93f6e7ddc497Timo Sirainen T_BEGIN {
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen hook_mail_namespaces_created(namespaces);
6825360d446542046757b06064282301c4c6b27cTimo Sirainen } T_END;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen }
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen return 0;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen }
6a04c5112961c5f4fb2d2f25192b3dc424d62ad0Timo Sirainen
6a04c5112961c5f4fb2d2f25192b3dc424d62ad0Timo Sirainen /* fallback to MAIL */
6a04c5112961c5f4fb2d2f25192b3dc424d62ad0Timo Sirainen mail = getenv("MAIL");
3ccab0bac68040f179a7de45c516cec258e28fdbTimo Sirainen if (mail == NULL) {
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen /* support also maildir-specific environment */
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen mail = getenv("MAILDIR");
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen if (mail != NULL)
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen mail = t_strconcat("maildir:", mail, NULL);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen }
6825360d446542046757b06064282301c4c6b27cTimo Sirainen
6825360d446542046757b06064282301c4c6b27cTimo Sirainen ns = i_new(struct mail_namespace, 1);
6825360d446542046757b06064282301c4c6b27cTimo Sirainen ns->type = NAMESPACE_PRIVATE;
6825360d446542046757b06064282301c4c6b27cTimo Sirainen ns->flags = NAMESPACE_FLAG_INBOX | NAMESPACE_FLAG_LIST_PREFIX |
6825360d446542046757b06064282301c4c6b27cTimo Sirainen NAMESPACE_FLAG_SUBSCRIPTIONS;
6825360d446542046757b06064282301c4c6b27cTimo Sirainen ns->prefix = i_strdup("");
6825360d446542046757b06064282301c4c6b27cTimo Sirainen ns->user = user;
6825360d446542046757b06064282301c4c6b27cTimo Sirainen ns->owner = user;
6825360d446542046757b06064282301c4c6b27cTimo Sirainen
6825360d446542046757b06064282301c4c6b27cTimo Sirainen if (mail_storage_create(ns, NULL, mail, flags, lock_method,
c8d093d149253fe8faec267c5057f45fe626f84cTimo Sirainen &error) < 0) {
c8d093d149253fe8faec267c5057f45fe626f84cTimo Sirainen if (mail != NULL && *mail != '\0')
6825360d446542046757b06064282301c4c6b27cTimo Sirainen i_error("mail_location: %s", error);
6825360d446542046757b06064282301c4c6b27cTimo Sirainen else {
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen i_error("mail_location not set and "
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen "autodetection failed: %s", error);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen }
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen mail_namespace_free(ns);
3ccab0bac68040f179a7de45c516cec258e28fdbTimo Sirainen return -1;
3ccab0bac68040f179a7de45c516cec258e28fdbTimo Sirainen }
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen user->namespaces = ns;
f5c53272acbe1517440aa9c277133babc887ee84Timo Sirainen
f5c53272acbe1517440aa9c277133babc887ee84Timo Sirainen if (hook_mail_namespaces_created != NULL) {
f5c53272acbe1517440aa9c277133babc887ee84Timo Sirainen T_BEGIN {
f5c53272acbe1517440aa9c277133babc887ee84Timo Sirainen hook_mail_namespaces_created(ns);
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen } T_END;
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen }
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen return 0;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen}
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenstruct mail_namespace *
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenmail_namespaces_init_empty(struct mail_user *user)
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen{
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen struct mail_namespace *ns;
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen ns = i_new(struct mail_namespace, 1);
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen ns->user = user;
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen ns->owner = user;
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen ns->prefix = i_strdup("");
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen ns->flags = NAMESPACE_FLAG_INBOX | NAMESPACE_FLAG_LIST_PREFIX |
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen NAMESPACE_FLAG_SUBSCRIPTIONS;
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen user->namespaces = ns;
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen return ns;
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen}
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainenvoid mail_namespaces_deinit(struct mail_namespace **_namespaces)
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen{
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen struct mail_namespace *ns, *namespaces = *_namespaces;
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen *_namespaces = NULL;
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen while (namespaces != NULL) {
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen ns = namespaces;
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen namespaces = namespaces->next;
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen if (ns->storage != NULL)
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen mail_storage_destroy(&ns->storage);
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen mail_namespace_free(ns);
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen }
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen}
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainenvoid mail_namespace_destroy(struct mail_namespace *ns)
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen{
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen struct mail_namespace **nsp;
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen /* remove from user's namespaces list */
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen for (nsp = &ns->user->namespaces; *nsp != NULL; nsp = &(*nsp)->next) {
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen if (*nsp == ns) {
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen *nsp = ns->next;
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen break;
4a09c57f1c66b4a8880bcc12b567bb42c3549f52Timo Sirainen }
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen }
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen if (ns->storage != NULL)
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen mail_storage_destroy(&ns->storage);
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen mail_namespace_free(ns);
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen}
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainenconst char *mail_namespace_fix_sep(struct mail_namespace *ns, const char *name)
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen{
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen char *ret, *p;
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen if (ns->sep == ns->real_sep)
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen return name;
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen ret = p_strdup(unsafe_data_stack_pool, name);
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen for (p = ret; *p != '\0'; p++) {
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen if (*p == ns->sep)
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen *p = ns->real_sep;
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen }
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen return ret;
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen}
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainenconst char *mail_namespace_get_vname(struct mail_namespace *ns, string_t *dest,
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen const char *name)
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen{
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen str_truncate(dest, 0);
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen if ((ns->flags & NAMESPACE_FLAG_INBOX) == 0 ||
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen strcasecmp(name, "INBOX") != 0)
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen str_append(dest, ns->prefix);
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen for (; *name != '\0'; name++) {
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen if (*name == ns->real_sep)
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen str_append_c(dest, ns->sep);
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen else
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen str_append_c(dest, *name);
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen }
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen return str_c(dest);
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen}
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainenchar mail_namespace_get_root_sep(const struct mail_namespace *namespaces)
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen{
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen while ((namespaces->flags & NAMESPACE_FLAG_LIST_PREFIX) == 0)
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen namespaces = namespaces->next;
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen return namespaces->sep;
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen}
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainenstatic struct mail_namespace *
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainenmail_namespace_find_mask(struct mail_namespace *namespaces,
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen const char **mailbox,
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen enum namespace_flags flags,
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen enum namespace_flags mask)
3f2ad7b8c3a243dabcba469c8a331423d036f3fcTimo Sirainen{
2a34e2be33f8a17d21384a5527ed9f75f4d270e0Timo Sirainen struct mail_namespace *ns = namespaces;
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen const char *box = *mailbox;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen struct mail_namespace *best = NULL;
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen size_t best_len = 0;
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen bool inbox;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
c53e8ee216904ffe6de4f6518d9f9f5107b7610eTimo Sirainen inbox = strncasecmp(box, "INBOX", 5) == 0;
c53e8ee216904ffe6de4f6518d9f9f5107b7610eTimo Sirainen if (inbox && box[5] == '\0') {
c53e8ee216904ffe6de4f6518d9f9f5107b7610eTimo Sirainen /* find the INBOX namespace */
c53e8ee216904ffe6de4f6518d9f9f5107b7610eTimo Sirainen *mailbox = "INBOX";
c53e8ee216904ffe6de4f6518d9f9f5107b7610eTimo Sirainen while (ns != NULL) {
c53e8ee216904ffe6de4f6518d9f9f5107b7610eTimo Sirainen if ((ns->flags & NAMESPACE_FLAG_INBOX) != 0 &&
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen (ns->flags & mask) == flags)
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen return ns;
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen if (*ns->prefix == '\0')
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen best = ns;
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen ns = ns->next;
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen }
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen return best;
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen }
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen for (; ns != NULL; ns = ns->next) {
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen if (ns->prefix_len >= best_len &&
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen (strncmp(ns->prefix, box, ns->prefix_len) == 0 ||
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen (inbox && strncmp(ns->prefix, "INBOX", 5) == 0 &&
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen strncmp(ns->prefix+5, box+5, ns->prefix_len-5) == 0)) &&
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen (ns->flags & mask) == flags) {
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen best = ns;
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen best_len = ns->prefix_len;
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen }
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen }
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen if (best != NULL) {
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen if (best_len > 0)
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen *mailbox += best_len;
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen else if (inbox && (box[5] == best->sep || box[5] == '\0'))
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen *mailbox = t_strconcat("INBOX", box+5, NULL);
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen *mailbox = mail_namespace_fix_sep(best, *mailbox);
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen }
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen
14c474d9f4591c397ed0b5206af6537c7b52c924Timo Sirainen return best;
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen}
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen
e3689d0f073341e844638f34e1e4d0b7bb053cc8Timo Sirainenstruct mail_namespace *
e3689d0f073341e844638f34e1e4d0b7bb053cc8Timo Sirainenmail_namespace_find(struct mail_namespace *namespaces, const char **mailbox)
e3689d0f073341e844638f34e1e4d0b7bb053cc8Timo Sirainen{
e3689d0f073341e844638f34e1e4d0b7bb053cc8Timo Sirainen return mail_namespace_find_mask(namespaces, mailbox, 0, 0);
e3689d0f073341e844638f34e1e4d0b7bb053cc8Timo Sirainen}
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainenstruct mail_namespace *
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainenmail_namespace_find_visible(struct mail_namespace *namespaces,
e4b09b008ab544eb8994beecbfffefa21d855e43Timo Sirainen const char **mailbox)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return mail_namespace_find_mask(namespaces, mailbox, 0,
d22390f33eedbd2413debabc0662dde5241b1aa6Timo Sirainen NAMESPACE_FLAG_HIDDEN);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mail_namespace *
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainenmail_namespace_find_subscribable(struct mail_namespace *namespaces,
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen const char **mailbox)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
d22390f33eedbd2413debabc0662dde5241b1aa6Timo Sirainen return mail_namespace_find_mask(namespaces, mailbox,
14b8bbb81e0b546436d4d5d5f38e45027c146b9bTimo Sirainen NAMESPACE_FLAG_SUBSCRIPTIONS,
d22390f33eedbd2413debabc0662dde5241b1aa6Timo Sirainen NAMESPACE_FLAG_SUBSCRIPTIONS);
14b8bbb81e0b546436d4d5d5f38e45027c146b9bTimo Sirainen}
14b8bbb81e0b546436d4d5d5f38e45027c146b9bTimo Sirainen
14b8bbb81e0b546436d4d5d5f38e45027c146b9bTimo Sirainenstruct mail_namespace *
14b8bbb81e0b546436d4d5d5f38e45027c146b9bTimo Sirainenmail_namespace_find_unsubscribable(struct mail_namespace *namespaces,
14b8bbb81e0b546436d4d5d5f38e45027c146b9bTimo Sirainen const char **mailbox)
14b8bbb81e0b546436d4d5d5f38e45027c146b9bTimo Sirainen{
14b8bbb81e0b546436d4d5d5f38e45027c146b9bTimo Sirainen return mail_namespace_find_mask(namespaces, mailbox,
14b8bbb81e0b546436d4d5d5f38e45027c146b9bTimo Sirainen 0, NAMESPACE_FLAG_SUBSCRIPTIONS);
14b8bbb81e0b546436d4d5d5f38e45027c146b9bTimo Sirainen}
14b8bbb81e0b546436d4d5d5f38e45027c146b9bTimo Sirainen
14b8bbb81e0b546436d4d5d5f38e45027c146b9bTimo Sirainenstruct mail_namespace *
e8fd7988ec183fb6c104aed19a61f1a096c51d34Timo Sirainenmail_namespace_find_inbox(struct mail_namespace *namespaces)
e8fd7988ec183fb6c104aed19a61f1a096c51d34Timo Sirainen{
e8fd7988ec183fb6c104aed19a61f1a096c51d34Timo Sirainen while ((namespaces->flags & NAMESPACE_FLAG_INBOX) == 0)
e8fd7988ec183fb6c104aed19a61f1a096c51d34Timo Sirainen namespaces = namespaces->next;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return namespaces;
1f80b32fc28f7a723ff07c1694230a090808b506Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenbool mail_namespace_update_name(const struct mail_namespace *ns,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char **mailbox)
1fd0d511885c30028aba388588151acf4ee85e75Timo Sirainen{
1fd0d511885c30028aba388588151acf4ee85e75Timo Sirainen struct mail_namespace tmp_ns = *ns;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* FIXME: a bit kludgy.. */
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen tmp_ns.next = NULL;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return mail_namespace_find_mask(&tmp_ns, mailbox, 0, 0) != NULL;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenstruct mail_namespace *
1fd0d511885c30028aba388588151acf4ee85e75Timo Sirainenmail_namespace_find_prefix(struct mail_namespace *namespaces,
4b231ca0bbe3b536acbd350101e183441ce0247aTimo Sirainen const char *prefix)
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainen{
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainen struct mail_namespace *ns;
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainen unsigned int len = strlen(prefix);
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainen
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainen for (ns = namespaces; ns != NULL; ns = ns->next) {
af1e2b2ab5d1c5ca5afe482ef8c8161c17acc190Timo Sirainen if (ns->prefix_len == len &&
af1e2b2ab5d1c5ca5afe482ef8c8161c17acc190Timo Sirainen strcmp(ns->prefix, prefix) == 0)
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainen return ns;
94aa90d2d17a7aebcda5a4193a62e80ddbb169b7Timo Sirainen }
af1e2b2ab5d1c5ca5afe482ef8c8161c17acc190Timo Sirainen return NULL;
af1e2b2ab5d1c5ca5afe482ef8c8161c17acc190Timo Sirainen}
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainen
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainenstruct mail_namespace *
94aa90d2d17a7aebcda5a4193a62e80ddbb169b7Timo Sirainenmail_namespace_find_prefix_nosep(struct mail_namespace *namespaces,
2bda0d095e029ec72ec683b4186e04f322b4978eTimo Sirainen const char *prefix)
2bda0d095e029ec72ec683b4186e04f322b4978eTimo Sirainen{
2bda0d095e029ec72ec683b4186e04f322b4978eTimo Sirainen struct mail_namespace *ns;
2bda0d095e029ec72ec683b4186e04f322b4978eTimo Sirainen unsigned int len = strlen(prefix);
2bda0d095e029ec72ec683b4186e04f322b4978eTimo Sirainen
94aa90d2d17a7aebcda5a4193a62e80ddbb169b7Timo Sirainen for (ns = namespaces; ns != NULL; ns = ns->next) {
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen if (ns->prefix_len == len + 1 &&
95a284736b8b11319a3f575ba249ba2eb7dbac1bTimo Sirainen strncmp(ns->prefix, prefix, len) == 0 &&
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen ns->prefix[len] == ns->sep)
94aa90d2d17a7aebcda5a4193a62e80ddbb169b7Timo Sirainen return ns;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen }
94aa90d2d17a7aebcda5a4193a62e80ddbb169b7Timo Sirainen return NULL;
0b49cfeae91a4020a404714b11c99e8e955fb631Timo Sirainen}
94aa90d2d17a7aebcda5a4193a62e80ddbb169b7Timo Sirainen