Mercurial > dovecot > original-hg > dovecot-1.2
changeset 2964:e032167a05ca HEAD
Moved mbox header MD5 summing code into separate file so it's easily changed.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 14 Dec 2004 04:44:33 +0200 |
parents | c0bdb35277fc |
children | 89fd53e406dd |
files | src/lib-storage/index/mbox/Makefile.am src/lib-storage/index/mbox/mbox-sync-md5.c src/lib-storage/index/mbox/mbox-sync-parse.c src/lib-storage/index/mbox/mbox-sync-private.h |
diffstat | 4 files changed, 118 insertions(+), 98 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/mbox/Makefile.am Mon Dec 13 02:55:42 2004 +0200 +++ b/src/lib-storage/index/mbox/Makefile.am Tue Dec 14 04:44:33 2004 +0200 @@ -17,6 +17,7 @@ mbox-lock.c \ mbox-mail.c \ mbox-save.c \ + mbox-sync-md5.c \ mbox-sync-parse.c \ mbox-sync-rewrite.c \ mbox-sync-update.c \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib-storage/index/mbox/mbox-sync-md5.c Tue Dec 14 04:44:33 2004 +0200 @@ -0,0 +1,80 @@ +/* Copyright (C) 2004 Timo Sirainen */ + +#include "lib.h" +#include "message-parser.h" +#include "mbox-sync-private.h" + +#include <stdlib.h> + +static int parse_date(struct mbox_sync_mail_context *ctx, + struct message_header_line *hdr) +{ + if (!ctx->seen_received_hdr) { + /* Received-header contains date too, and more trusted one */ + md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len); + } + return TRUE; +} + +static int parse_delivered_to(struct mbox_sync_mail_context *ctx, + struct message_header_line *hdr) +{ + md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len); + return TRUE; +} + +static int parse_message_id(struct mbox_sync_mail_context *ctx, + struct message_header_line *hdr) +{ + if (!ctx->seen_received_hdr) { + /* Received-header contains unique ID too, + and more trusted one */ + md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len); + } + return TRUE; +} + +static int parse_received(struct mbox_sync_mail_context *ctx, + struct message_header_line *hdr) +{ + if (!ctx->seen_received_hdr) { + /* get only the first received-header */ + md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len); + if (!hdr->continues) + ctx->seen_received_hdr = TRUE; + } + return TRUE; +} + +static int parse_x_delivery_id(struct mbox_sync_mail_context *ctx, + struct message_header_line *hdr) +{ + /* Let the local delivery agent help generate unique ID's but don't + blindly trust this header alone as it could just as easily come from + the remote. */ + md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len); + return TRUE; +} + + +static struct mbox_sync_header_func md5_header_funcs[] = { + { "Date", parse_date }, + { "Delivered-To", parse_delivered_to }, + { "Message-ID", parse_message_id }, + { "Received", parse_received }, + { "X-Delivery-ID", parse_x_delivery_id } +}; +#define MD5_HEADER_FUNCS_COUNT \ + (sizeof(md5_header_funcs) / sizeof(*md5_header_funcs)) + +void mbox_sync_md5(struct mbox_sync_mail_context *ctx, + struct message_header_line *hdr) +{ + struct mbox_sync_header_func *func; + + func = bsearch(hdr->name, md5_header_funcs, + MD5_HEADER_FUNCS_COUNT, sizeof(*md5_header_funcs), + mbox_sync_bsearch_header_func_cmp); + if (func != NULL) + (void)func->func(ctx, hdr); +}
--- a/src/lib-storage/index/mbox/mbox-sync-parse.c Mon Dec 13 02:55:42 2004 +0200 +++ b/src/lib-storage/index/mbox/mbox-sync-parse.c Tue Dec 14 04:44:33 2004 +0200 @@ -31,12 +31,6 @@ { 0, 0 } }; -struct header_func { - const char *header; - int (*func)(struct mbox_sync_mail_context *ctx, - struct message_header_line *hdr); -}; - static void parse_trailing_whitespace(struct mbox_sync_mail_context *ctx, struct message_header_line *hdr) { @@ -286,57 +280,7 @@ return TRUE; } -static int parse_date(struct mbox_sync_mail_context *ctx, - struct message_header_line *hdr) -{ - if (!ctx->seen_received_hdr) { - /* Received-header contains date too, and more trusted one */ - md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len); - } - return TRUE; -} - -static int parse_delivered_to(struct mbox_sync_mail_context *ctx, - struct message_header_line *hdr) -{ - md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len); - return TRUE; -} - -static int parse_message_id(struct mbox_sync_mail_context *ctx, - struct message_header_line *hdr) -{ - if (!ctx->seen_received_hdr) { - /* Received-header contains unique ID too, - and more trusted one */ - md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len); - } - return TRUE; -} - -static int parse_received(struct mbox_sync_mail_context *ctx, - struct message_header_line *hdr) -{ - if (!ctx->seen_received_hdr) { - /* get only the first received-header */ - md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len); - if (!hdr->continues) - ctx->seen_received_hdr = TRUE; - } - return TRUE; -} - -static int parse_x_delivery_id(struct mbox_sync_mail_context *ctx, - struct message_header_line *hdr) -{ - /* Let the local delivery agent help generate unique ID's but don't - blindly trust this header alone as it could just as easily come from - the remote. */ - md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len); - return TRUE; -} - -static struct header_func header_funcs[] = { +static struct mbox_sync_header_func header_funcs[] = { { "Content-Length", parse_content_length }, { "Status", parse_status }, { "X-IMAP", parse_x_imap }, @@ -348,20 +292,10 @@ }; #define HEADER_FUNCS_COUNT (sizeof(header_funcs) / sizeof(*header_funcs)) -static struct header_func md5_header_funcs[] = { - { "Date", parse_date }, - { "Delivered-To", parse_delivered_to }, - { "Message-ID", parse_message_id }, - { "Received", parse_received }, - { "X-Delivery-ID", parse_x_delivery_id } -}; -#define MD5_HEADER_FUNCS_COUNT \ - (sizeof(md5_header_funcs) / sizeof(*md5_header_funcs)) - -static int bsearch_header_func_cmp(const void *p1, const void *p2) +int mbox_sync_bsearch_header_func_cmp(const void *p1, const void *p2) { const char *key = p1; - const struct header_func *func = p2; + const struct mbox_sync_header_func *func = p2; return strcasecmp(key, func->header); } @@ -372,7 +306,7 @@ struct mbox_sync_context *sync_ctx = ctx->sync_ctx; struct message_header_parser_ctx *hdr_ctx; struct message_header_line *hdr; - struct header_func *func; + struct mbox_sync_header_func *func; size_t line_start_pos; int i, ret; @@ -403,20 +337,9 @@ str_append_n(ctx->header, hdr->middle, hdr->middle_len); } - func = bsearch(hdr->name, md5_header_funcs, - MD5_HEADER_FUNCS_COUNT, - sizeof(*header_funcs), bsearch_header_func_cmp); - if (func != NULL) { - /* these functions do nothing more than update - MD5 sums */ - (void)func->func(ctx, hdr); - func = NULL; - } else { - func = bsearch(hdr->name, header_funcs, - HEADER_FUNCS_COUNT, - sizeof(*header_funcs), - bsearch_header_func_cmp); - } + func = bsearch(hdr->name, header_funcs, + HEADER_FUNCS_COUNT, sizeof(*header_funcs), + mbox_sync_bsearch_header_func_cmp); if (func != NULL) { if (hdr->continues) { @@ -437,6 +360,7 @@ buffer_append(ctx->header, hdr->full_value, hdr->full_value_len); } else { + mbox_sync_md5(ctx, hdr); buffer_append(ctx->header, hdr->value, hdr->value_len); } @@ -473,6 +397,10 @@ uint32_t uid; int ret; + /* we only wish to be sure that this mail actually is what we expect + it to be. If there's X-UID header, it's used. Otherwise use + the MD5 sum. */ + memset(&ctx, 0, sizeof(ctx)); md5_init(&ctx.hdr_md5_ctx); @@ -481,22 +409,22 @@ if (hdr->eoh) break; - func = bsearch(hdr->name, md5_header_funcs, - MD5_HEADER_FUNCS_COUNT, - sizeof(*header_funcs), bsearch_header_func_cmp); + func = bsearch(hdr->name, header_funcs, + HEADER_FUNCS_COUNT, sizeof(*header_funcs), + mbox_sync_bsearch_header_func_cmp); if (func != NULL) { - /* these functions do nothing more than update - MD5 sums */ - (void)func->func(&ctx, hdr); - } else if (strcasecmp(hdr->name, "X-UID") == 0) { - if (hdr->continues) { - hdr->use_full_value = TRUE; - continue; + if (strcasecmp(hdr->name, "X-UID") == 0) { + if (hdr->continues) { + hdr->use_full_value = TRUE; + continue; + } + (void)parse_x_uid(&ctx, hdr); + + if (ctx.mail.uid != 0) + break; } - (void)parse_x_uid(&ctx, hdr); - - if (ctx.mail.uid != 0) - break; + } else { + mbox_sync_md5(&ctx, hdr); } } i_assert(ret != 0);
--- a/src/lib-storage/index/mbox/mbox-sync-private.h Mon Dec 13 02:55:42 2004 +0200 +++ b/src/lib-storage/index/mbox/mbox-sync-private.h Tue Dec 14 04:44:33 2004 +0200 @@ -118,6 +118,12 @@ unsigned int delay_writes:1; }; +struct mbox_sync_header_func { + const char *header; + int (*func)(struct mbox_sync_mail_context *ctx, + struct message_header_line *hdr); +}; + int mbox_sync(struct index_mailbox *ibox, enum mbox_sync_flags flags); int mbox_sync_has_changed(struct index_mailbox *ibox, int leave_dirty); @@ -141,4 +147,9 @@ void mbox_sync_move_buffer(struct mbox_sync_mail_context *ctx, size_t pos, size_t need, size_t have); +int mbox_sync_bsearch_header_func_cmp(const void *p1, const void *p2); + +void mbox_sync_md5(struct mbox_sync_mail_context *ctx, + struct message_header_line *hdr); + #endif