mailbox-list.c revision 220e21750948941dc6e33b8f11b552fa21d7f81e
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (C) 2006 Timo Sirainen */
f30577ff7cf29858f1878abe963b4f40a436434fTimo Sirainen/* 20 * (200+1) < 4096 which is the standard PATH_MAX. Having these settings
de754cb78f75e8b3b994cddafe41c9ed1467c33dTimo Sirainen prevents malicious user from creating eg. "a/a/a/.../a" mailbox name and
0af9ef2e9bb71a426bba236e74ceec30be699fb7Timo Sirainen then start renaming them to larger names from end to beginning, which
e3a838c80f54f024115fade93c6c87a0998f1fabTimo Sirainen eventually would start causing the failures when trying to use too
8372fc7efb6d64dff2e5f55fb4a3822c56869cfeTimo Sirainen long mailbox names. */
3cb26db7f4756b71ba06c6e4950fa4f8ce7fad66Timo Sirainen/* Message to show to users when critical error occurs */
3612ee5c737954d5fb88fd1775aad80f7bf1dc4eTimo Sirainen "Internal error occurred. Refer to server log for more information."
3612ee5c737954d5fb88fd1775aad80f7bf1dc4eTimo Sirainen#define CRITICAL_MSG_STAMP CRITICAL_MSG " [%Y-%m-%d %H:%M:%S]"
3612ee5c737954d5fb88fd1775aad80f7bf1dc4eTimo Sirainenvoid (*hook_mailbox_list_created)(struct mailbox_list *list);
3612ee5c737954d5fb88fd1775aad80f7bf1dc4eTimo Sirainenstatic ARRAY_DEFINE(mailbox_list_drivers, const struct mailbox_list *);
89795c6bbbc52bb382e88bc8617d22092223e9a5Timo Sirainenstatic bool mailbox_list_driver_find(const char *name, unsigned int *idx_r)
ddbdc644a15f56f4b43596f1b8c0fc196c101445Timo Sirainen unsigned int i, count;
b55f914c0ade77252cfd798ea8eb9a84bda56315Timo Sirainen drivers = array_get(&mailbox_list_drivers, &count);
89795c6bbbc52bb382e88bc8617d22092223e9a5Timo Sirainen for (i = 0; i < count; i++) {
89795c6bbbc52bb382e88bc8617d22092223e9a5Timo Sirainen if (strcasecmp(drivers[i]->name, name) == 0) {
ddbdc644a15f56f4b43596f1b8c0fc196c101445Timo Sirainenvoid mailbox_list_register(const struct mailbox_list *list)
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen unsigned int idx;
8372fc7efb6d64dff2e5f55fb4a3822c56869cfeTimo Sirainen if (mailbox_list_driver_find(list->name, &idx)) {
8372fc7efb6d64dff2e5f55fb4a3822c56869cfeTimo Sirainen i_fatal("mailbox_list_register(%s): duplicate driver",
abd4203d97d6db19550fc45d6b6806b2deadb625Aki Tuomivoid mailbox_list_unregister(const struct mailbox_list *list)
abd4203d97d6db19550fc45d6b6806b2deadb625Aki Tuomi unsigned int idx;
abd4203d97d6db19550fc45d6b6806b2deadb625Aki Tuomi if (!mailbox_list_driver_find(list->name, &idx)) {
abd4203d97d6db19550fc45d6b6806b2deadb625Aki Tuomi i_fatal("mailbox_list_unregister(%s): unknown driver",
2c5c293940fd6c7e020e1d58dae77a9d01f9059bTimo Sirainen mailbox_list_is_mailbox_t *callback, void *context,
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen struct mailbox_list **list_r, const char **error_r)
3bc9d91f987261e989aa653fd412b0e8095e4810Timo Sirainen unsigned int idx;
3bc9d91f987261e989aa653fd412b0e8095e4810Timo Sirainen if (!mailbox_list_driver_find(driver, &idx)) {
ab281fc992907b6cf6c730f672dc3aa4c6685015Timo Sirainen class_p = array_idx(&mailbox_list_drivers, idx);
52fe791133ad838c3aca3f1c88f96aab755950f8Timo Sirainen /* copy settings */
52fe791133ad838c3aca3f1c88f96aab755950f8Timo Sirainen list->set.root_dir = p_strdup(list->pool, set->root_dir);
52fe791133ad838c3aca3f1c88f96aab755950f8Timo Sirainen list->set.index_dir = set->index_dir == NULL ||
52fe791133ad838c3aca3f1c88f96aab755950f8Timo Sirainen strcmp(set->index_dir, set->root_dir) == 0 ? NULL :
52fe791133ad838c3aca3f1c88f96aab755950f8Timo Sirainen list->set.control_dir = set->control_dir == NULL ||
e95dba8921087afebb8a92c592af3b8ca22ae796Timo Sirainen strcmp(set->control_dir, set->root_dir) == 0 ? NULL :
686ad6d723004b807fd558f3ef9d1f88afa7e127Timo Sirainen list->set.inbox_path = p_strdup(list->pool, set->inbox_path);
e95dba8921087afebb8a92c592af3b8ca22ae796Timo Sirainen p_strdup(list->pool, set->subscription_fname);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen list->set.maildir_name = p_strdup(list->pool, set->maildir_name);
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen i_info("%s: root=%s, index=%s, control=%s, inbox=%s",
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen list->set.index_dir == NULL ? "" : list->set.index_dir,
de754cb78f75e8b3b994cddafe41c9ed1467c33dTimo Sirainen array_create(&list->module_contexts, list->pool, sizeof(void *), 5);
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainenvoid mailbox_list_deinit(struct mailbox_list *list)
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainenconst char *mailbox_list_get_driver_name(struct mailbox_list *list)
e95dba8921087afebb8a92c592af3b8ca22ae796Timo Sirainenchar mailbox_list_get_hierarchy_sep(struct mailbox_list *list)
3cb26db7f4756b71ba06c6e4950fa4f8ce7fad66Timo Sirainenbool mailbox_list_is_valid_mask(struct mailbox_list *list, const char *mask)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenbool mailbox_list_is_valid_existing_name(struct mailbox_list *list,
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen return list->v.is_valid_existing_name(list, name);
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainenbool mailbox_list_is_valid_create_name(struct mailbox_list *list,
e95dba8921087afebb8a92c592af3b8ca22ae796Timo Sirainen return list->v.is_valid_create_name(list, name);
52fe791133ad838c3aca3f1c88f96aab755950f8Timo Sirainenconst char *mailbox_list_get_path(struct mailbox_list *list, const char *name,
abd4203d97d6db19550fc45d6b6806b2deadb625Aki Tuomiconst char *mailbox_list_get_temp_prefix(struct mailbox_list *list)
abd4203d97d6db19550fc45d6b6806b2deadb625Aki Tuomiint mailbox_list_get_mailbox_name_status(struct mailbox_list *list,
abd4203d97d6db19550fc45d6b6806b2deadb625Aki Tuomi const char *name,
abd4203d97d6db19550fc45d6b6806b2deadb625Aki Tuomi return list->v.get_mailbox_name_status(list, name, status);
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainenmailbox_list_iter_init(struct mailbox_list *list,
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen return list->v.iter_init(list, ref, mask, flags);
be71a9de88d1266597eb8c5e0b6f519d90e14397Timo Sirainenmailbox_list_iter_next(struct mailbox_list_iterate_context *ctx)
be71a9de88d1266597eb8c5e0b6f519d90e14397Timo Sirainenint mailbox_list_iter_deinit(struct mailbox_list_iterate_context **_ctx)
be71a9de88d1266597eb8c5e0b6f519d90e14397Timo Sirainen struct mailbox_list_iterate_context *ctx = *_ctx;
be71a9de88d1266597eb8c5e0b6f519d90e14397Timo Sirainenint mailbox_list_set_subscribed(struct mailbox_list *list,
be71a9de88d1266597eb8c5e0b6f519d90e14397Timo Sirainen return list->v.set_subscribed(list, name, set);
be71a9de88d1266597eb8c5e0b6f519d90e14397Timo Sirainenbool mailbox_list_name_is_too_large(const char *name, char sep)
be71a9de88d1266597eb8c5e0b6f519d90e14397Timo Sirainen if (level_len > MAILBOX_MAX_HIERARCHY_NAME_LENGTH)
ba90e657bc68a72ab3b3021e2f4a874fac9965baTimo Sirainen if (level_len > MAILBOX_MAX_HIERARCHY_NAME_LENGTH)
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainenenum mailbox_list_file_type mailbox_list_get_file_type(const struct dirent *d)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen switch (d->d_type) {
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainenconst char *mailbox_list_get_last_error(struct mailbox_list *list,
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainenvoid mailbox_list_clear_error(struct mailbox_list *list)
d229d26d263a57a77eec8fe7cba24fbfd9509966Timo Sirainenvoid mailbox_list_set_error(struct mailbox_list *list, const char *error)
e95dba8921087afebb8a92c592af3b8ca22ae796Timo Sirainenstatic void mailbox_list_set_internal_error(struct mailbox_list *list)
e95dba8921087afebb8a92c592af3b8ca22ae796Timo Sirainen strftime(str, sizeof(str), CRITICAL_MSG_STAMP, tm) > 0 ?
e95dba8921087afebb8a92c592af3b8ca22ae796Timo Sirainenvoid mailbox_list_set_critical(struct mailbox_list *list, const char *fmt, ...)
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen /* critical errors may contain sensitive data, so let user
e95dba8921087afebb8a92c592af3b8ca22ae796Timo Sirainen see only "Internal error" with a timestamp to make it
ccef83820a01bb37ad48653a05a9c5aa6560826aTimo Sirainen easier to look from log files the actual error message. */