mail-namespace.c revision 2dd39e478269d6fb0bb26d12b394aa30ee965e38
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (C) 2005-2007 Timo Sirainen */
c977374bd4651cafc1626ebe308aa66dfd8b30e0Timo Sirainenstatic void namespace_init_storage(struct mail_namespace *ns)
c977374bd4651cafc1626ebe308aa66dfd8b30e0Timo Sirainen ns->list = mail_storage_get_list(ns->storage);
c977374bd4651cafc1626ebe308aa66dfd8b30e0Timo Sirainen ns->real_sep = mailbox_list_get_hierarchy_sep(ns->list);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainennamespace_add_env(pool_t pool, const char *data, unsigned int num,
de62ce819d59a529530da4b57be1b8d6dad13d6bTimo Sirainen const char *user, enum mail_storage_flags flags,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen sep = getenv(t_strdup_printf("NAMESPACE_%u_SEP", num));
de62ce819d59a529530da4b57be1b8d6dad13d6bTimo Sirainen type = getenv(t_strdup_printf("NAMESPACE_%u_TYPE", num));
de62ce819d59a529530da4b57be1b8d6dad13d6bTimo Sirainen prefix = getenv(t_strdup_printf("NAMESPACE_%u_PREFIX", num));
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen if (getenv(t_strdup_printf("NAMESPACE_%u_INBOX", num)) != NULL)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen if (getenv(t_strdup_printf("NAMESPACE_%u_HIDDEN", num)) != NULL)
d22301419109ed4a38351715e6760011421dadecTimo Sirainen if ((ns->flags & NAMESPACE_FLAG_HIDDEN) == 0 &&
de62ce819d59a529530da4b57be1b8d6dad13d6bTimo Sirainen getenv(t_strdup_printf("NAMESPACE_%u_LIST", num)) != NULL)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen if (type == NULL || *type == '\0' || strncmp(type, "private", 7) == 0)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen i_info("Namespace: type=%s, prefix=%s, sep=%s, "
c18ff860dc22960fd37c272d929f889c7939a2c8Timo Sirainen "inbox=%s, hidden=%s, list=%s",
73a87c2ff65c6116cde6fb158dfddb8ef7346901Timo Sirainen type == NULL ? "" : type, prefix, sep == NULL ? "" : sep,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen (ns->flags & NAMESPACE_FLAG_INBOX) ? "yes" : "no",
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen (ns->flags & NAMESPACE_FLAG_HIDDEN) ? "yes" : "no",
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen (ns->flags & NAMESPACE_FLAG_LIST) ? "yes" : "no");
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen if (mail_storage_create(ns, NULL, data, user, flags, lock_method,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen i_error("Namespace '%s': %s", ns->prefix, error);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic bool namespaces_check(struct mail_namespace *namespaces)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct mail_namespace *ns, *inbox_ns = NULL, *private_ns = NULL;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen unsigned int private_ns_count = 0;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen for (ns = namespaces; ns != NULL; ns = ns->next) {
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen if ((ns->flags & NAMESPACE_FLAG_INBOX) != 0) {
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen "There can be only one namespace with "
637455ebee0453f860c9bce0626c485e35fb83deTimo Sirainen "inbox=yes");
637455ebee0453f860c9bce0626c485e35fb83deTimo Sirainen ns->prefix[strlen(ns->prefix)-1] != ns->sep) {
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen "list=yes requires prefix=%s "
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen "All list=yes namespaces must use "
637455ebee0453f860c9bce0626c485e35fb83deTimo Sirainen "the same separator");
6ae329de09afb7214c906d762320847e05469d53Timo Sirainen /* just one private namespace. we'll assume it's
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen the INBOX namespace. */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen "inbox=yes namespace missing");
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen "no list=yes namespaces");
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct mail_namespace **tmp, *next, *dest = NULL;
d22301419109ed4a38351715e6760011421dadecTimo Sirainen for (tmp = &dest; *tmp != NULL; tmp = &(*tmp)->next) {
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen if (strlen(src->prefix) < strlen((*tmp)->prefix))
73a87c2ff65c6116cde6fb158dfddb8ef7346901Timo Sirainenint mail_namespaces_init(pool_t pool, const char *user,
73a87c2ff65c6116cde6fb158dfddb8ef7346901Timo Sirainen struct mail_namespace *namespaces, *ns, **ns_p;
08a8b3de61139ba02371afc8240ac85be0e8b17cTimo Sirainen unsigned int i;
08a8b3de61139ba02371afc8240ac85be0e8b17cTimo Sirainen /* first try NAMESPACE_* environments */
08a8b3de61139ba02371afc8240ac85be0e8b17cTimo Sirainen for (i = 1; ; i++) {
08a8b3de61139ba02371afc8240ac85be0e8b17cTimo Sirainen data = getenv(t_strdup_printf("NAMESPACE_%u", i));
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen *ns_p = namespace_add_env(pool, data, i, user, flags,
08a8b3de61139ba02371afc8240ac85be0e8b17cTimo Sirainen /* fallback to MAIL */
08a8b3de61139ba02371afc8240ac85be0e8b17cTimo Sirainen /* support also maildir-specific environment */
08a8b3de61139ba02371afc8240ac85be0e8b17cTimo Sirainen ns->flags = NAMESPACE_FLAG_INBOX | NAMESPACE_FLAG_LIST;
08a8b3de61139ba02371afc8240ac85be0e8b17cTimo Sirainen if (mail_storage_create(ns, NULL, mail, user, flags, lock_method,
08a8b3de61139ba02371afc8240ac85be0e8b17cTimo Sirainenstruct mail_namespace *mail_namespaces_init_empty(pool_t pool)
08a8b3de61139ba02371afc8240ac85be0e8b17cTimo Sirainen ns->flags = NAMESPACE_FLAG_INBOX | NAMESPACE_FLAG_LIST;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid mail_namespaces_deinit(struct mail_namespace **_namespaces)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct mail_namespace *namespaces = *_namespaces;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenconst char *mail_namespace_fix_sep(struct mail_namespace *ns, const char *name)
08a8b3de61139ba02371afc8240ac85be0e8b17cTimo Sirainenchar mail_namespace_get_root_sep(struct mail_namespace *namespaces)
08a8b3de61139ba02371afc8240ac85be0e8b17cTimo Sirainen while ((namespaces->flags & NAMESPACE_FLAG_LIST) == 0)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenmail_namespace_find_int(struct mail_namespace *namespaces, const char **mailbox,
08a8b3de61139ba02371afc8240ac85be0e8b17cTimo Sirainen (((ns)->flags & NAMESPACE_FLAG_HIDDEN) == 0 || (show_hidden))
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* find the INBOX namespace */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen if ((ns->flags & NAMESPACE_FLAG_INBOX) != 0 &&
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen (strncmp(ns->prefix, box, ns->prefix_len) == 0 ||
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen (inbox && strncmp(ns->prefix, "INBOX", 5) == 0 &&
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen strncmp(ns->prefix+5, box+5, ns->prefix_len-5) == 0)) &&
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen else if (inbox && (box[5] == best->sep || box[5] == '\0'))
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen *mailbox = mail_namespace_fix_sep(best, *mailbox);
08a8b3de61139ba02371afc8240ac85be0e8b17cTimo Sirainenmail_namespace_find(struct mail_namespace *namespaces, const char **mailbox)
08a8b3de61139ba02371afc8240ac85be0e8b17cTimo Sirainen return mail_namespace_find_int(namespaces, mailbox, TRUE);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenmail_namespace_find_visible(struct mail_namespace *namespaces,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const char **mailbox)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen return mail_namespace_find_int(namespaces, mailbox, FALSE);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenmail_namespace_find_inbox(struct mail_namespace *namespaces)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen while ((namespaces->flags & NAMESPACE_FLAG_INBOX) == 0)
f71c2d4e6b802bf8e622bcd5df29286262d05d5aTimo Sirainenbool mail_namespace_update_name(struct mail_namespace *ns,
d22301419109ed4a38351715e6760011421dadecTimo Sirainen const char **mailbox)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* FIXME: a bit kludgy.. */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen return mail_namespace_find_int(&tmp_ns, mailbox, TRUE) != NULL;
struct mail_namespace *
const char *prefix)
return ns;
return NULL;
struct mail_namespace *
const char *prefix)
return ns;
return NULL;