mail-storage.c revision 5505efe43cc7d5058561cda8882487b7971f8ad9
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter/* Copyright (C) 2002-2003 Timo Sirainen */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter/* Message to show to users when critical error occurs */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter "Internal error occurred. Refer to server log for more information."
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter#define CRITICAL_MSG_STAMP CRITICAL_MSG " [%Y-%m-%d %H:%M:%S]"
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter/* 20 * (200+1) < 4096 which is the standard PATH_MAX. Having these settings
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter prevents malicious user from creating eg. "a/a/a/.../a" mailbox name and
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter then start renaming them to larger names from end to beginning, which
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter eventually would start causing the failures when trying to use too
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter long mailbox names. */
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic array_t ARRAY_DEFINE(storages, struct mail_storage *);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter ARRAY_CREATE(&storages, default_pool, struct mail_storage *, 8);
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnikvoid mail_storage_class_register(struct mail_storage *storage_class)
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnik /* append it after the list, so the autodetection order is correct */
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnikvoid mail_storage_class_unregister(struct mail_storage *storage_class)
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnik unsigned int i, count;
1a94716209e40a9ccaedc7e70f9de961d1cced48Lukas Slebodnik for (i = 0; i < count; i++) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Waltervoid mail_storage_parse_env(enum mail_storage_flags *flags_r,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter const char *str;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walterstatic struct mail_storage *mail_storage_find(const char *name)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter unsigned int i, count;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter for (i = 0; i < count; i++) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Waltermail_storage_create(const char *name, const char *data, const char *user,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter return storage->v.create(data, user, flags, lock_method);
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Waltermail_storage_create_default(const char *user, enum mail_storage_flags flags,
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter unsigned int i, count;
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter for (i = 0; i < count; i++) {
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Walter storage = classes[i]->v.create(NULL, user, flags, lock_method);
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walterstatic struct mail_storage *
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Waltermail_storage_autodetect(const char *data, enum mail_storage_flags flags)
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter unsigned int i, count;
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter for (i = 0; i < count; i++) {
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Waltermail_storage_create_with_data(const char *data, const char *user,
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter const char *p, *name;
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter return mail_storage_create_default(user, flags, lock_method);
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter /* check if we're in the form of mailformat:data
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter (eg. maildir:Maildir) */
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter while (i_isalnum(*p)) p++;
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter if (*p == ':') {
dff909d473f43a6bd0f0286fa2d279c0ebe945c6Stef Walter storage = mail_storage_create(name, p+1, user, flags,
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter "don't know what to do with it: %s "
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter "(try prefixing it with mbox: or maildir:)",
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Waltervoid mail_storage_destroy(struct mail_storage **_storage)
c2cc119de8eac712c040b3993f41c967ff2278deStef Waltervoid mail_storage_clear_error(struct mail_storage *storage)
c2cc119de8eac712c040b3993f41c967ff2278deStef Waltervoid mail_storage_set_error(struct mail_storage *storage, const char *fmt, ...)
b699c4d7f85a5404be1d1ee9450331aea869b886Stef Waltervoid mail_storage_set_syntax_error(struct mail_storage *storage,
fcd8093c58638dc7c4f9cddfc97f273b94ce2eadStef Walter const char *fmt, ...)
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid mail_storage_set_internal_error(struct mail_storage *storage)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter strftime(str, sizeof(str), CRITICAL_MSG_STAMP, tm) > 0 ?
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid mail_storage_set_critical(struct mail_storage *storage,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter const char *fmt, ...)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter /* critical errors may contain sensitive data, so let user
1203e462650f035b0df2304075d60b9a99e36715Stef Walter see only "Internal error" with a timestamp to make it
1203e462650f035b0df2304075d60b9a99e36715Stef Walter easier to look from log files the actual error message. */
1203e462650f035b0df2304075d60b9a99e36715Stef Walterchar mail_storage_get_hierarchy_sep(struct mail_storage *storage)
1203e462650f035b0df2304075d60b9a99e36715Stef Waltervoid mail_storage_set_callbacks(struct mail_storage *storage,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter storage->v.set_callbacks(storage, callbacks, context);
1203e462650f035b0df2304075d60b9a99e36715Stef Walterint mail_storage_mailbox_create(struct mail_storage *storage, const char *name,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter return storage->v.mailbox_create(storage, name, directory);
1203e462650f035b0df2304075d60b9a99e36715Stef Walterint mail_storage_mailbox_delete(struct mail_storage *storage, const char *name)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter return storage->v.mailbox_delete(storage, name);
1203e462650f035b0df2304075d60b9a99e36715Stef Walterint mail_storage_mailbox_rename(struct mail_storage *storage,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter return storage->v.mailbox_rename(storage, oldname, newname);
1203e462650f035b0df2304075d60b9a99e36715Stef Waltermail_storage_mailbox_list_init(struct mail_storage *storage,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter return storage->v.mailbox_list_init(storage, ref, mask, flags);
1203e462650f035b0df2304075d60b9a99e36715Stef Waltermail_storage_mailbox_list_next(struct mailbox_list_context *ctx)
1203e462650f035b0df2304075d60b9a99e36715Stef Walterint mail_storage_mailbox_list_deinit(struct mailbox_list_context **_ctx)
1203e462650f035b0df2304075d60b9a99e36715Stef Walter return ctx->storage->v.mailbox_list_deinit(ctx);
1203e462650f035b0df2304075d60b9a99e36715Stef Walterint mail_storage_set_subscribed(struct mail_storage *storage,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter return storage->v.set_subscribed(storage, name, set);
1203e462650f035b0df2304075d60b9a99e36715Stef Walterint mail_storage_get_mailbox_name_status(struct mail_storage *storage,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter const char *name,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter return storage->v.get_mailbox_name_status(storage, name, status);
1203e462650f035b0df2304075d60b9a99e36715Stef Walterconst char *mail_storage_get_last_error(struct mail_storage *storage,
1203e462650f035b0df2304075d60b9a99e36715Stef Walter return storage->v.get_last_error(storage, syntax_error_r,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekconst char *mail_storage_get_mailbox_path(struct mail_storage *storage,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return storage->v.get_mailbox_path(storage, name, is_file_r);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekconst char *mail_storage_get_mailbox_control_dir(struct mail_storage *storage,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek const char *name)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return storage->v.get_mailbox_control_dir(storage, name);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekstruct mailbox *mailbox_open(struct mail_storage *storage, const char *name,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return storage->v.mailbox_open(storage, name, input, flags);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekstruct mail_storage *mailbox_get_storage(struct mailbox *box)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekconst char *mailbox_get_name(struct mailbox *box)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekbool mailbox_allow_new_keywords(struct mailbox *box)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekmailbox_sync_init(struct mailbox *box, enum mailbox_sync_flags flags)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_sync_next(struct mailbox_sync_context *ctx,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_sync_deinit(struct mailbox_sync_context **_ctx,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekvoid mailbox_notify_changes(struct mailbox *box, unsigned int min_interval,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek mailbox_notify_callback_t *callback, void *context)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek box->v.notify_changes(box, min_interval, callback, context);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekmailbox_keywords_create(struct mailbox_transaction_context *t,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek const char *const keywords[])
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekvoid mailbox_keywords_free(struct mailbox_transaction_context *t,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_get_uids(struct mailbox *box, uint32_t uid1, uint32_t uid2,
58229439447d5617913a5a2e173b78105c694842Pavel Březina return box->v.get_uids(box, uid1, uid2, seq1_r, seq2_r);
58229439447d5617913a5a2e173b78105c694842Pavel Březinamailbox_header_lookup_init(struct mailbox *box, const char *const headers[])
58229439447d5617913a5a2e173b78105c694842Pavel Březina return box->v.header_lookup_init(box, headers);
5de968e80ade1c02d1907834dcff95e9fc9ad10aJakub Hrozekvoid mailbox_header_lookup_deinit(struct mailbox_header_lookup_ctx **_ctx)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekmailbox_search_init(struct mailbox_transaction_context *t,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek const char *charset, struct mail_search_arg *args,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return t->box->v.search_init(t, charset, args, sort_program);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_search_deinit(struct mail_search_context **_ctx)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return ctx->transaction->box->v.search_deinit(ctx);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_search_next(struct mail_search_context *ctx, struct mail *mail)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return ctx->transaction->box->v.search_next(ctx, mail);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_transaction_commit(struct mailbox_transaction_context **_t,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekvoid mailbox_transaction_rollback(struct mailbox_transaction_context **_t)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_save_init(struct mailbox_transaction_context *t,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek enum mail_flags flags, struct mail_keywords *keywords,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek const char *from_envelope, struct istream *input,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek struct mail *dest_mail, struct mail_save_context **ctx_r)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_save_continue(struct mail_save_context *ctx)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return ctx->transaction->box->v.save_continue(ctx);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_save_finish(struct mail_save_context **_ctx)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return ctx->transaction->box->v.save_finish(ctx);
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekvoid mailbox_save_cancel(struct mail_save_context **_ctx)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekint mailbox_copy(struct mailbox_transaction_context *t, struct mail *mail,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek enum mail_flags flags, struct mail_keywords *keywords,
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek return t->box->v.copy(t, mail, flags, keywords, dest_mail);
1203e462650f035b0df2304075d60b9a99e36715Stef Walterbool mailbox_is_inconsistent(struct mailbox *box)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozekbool mailbox_name_is_too_large(const char *name, char sep)
90e04eae7e54ec892a6f239783df94dab5d1ed9aJakub Hrozek if (level_len > MAILBOX_MAX_HIERARCHY_NAME_LENGTH)