[dovecot-cvs] dovecot/src/lib-storage/index/mbox Makefile.am, 1.5, 1.6 mbox-md5.c, NONE, 1.1 mbox-md5.h, NONE, 1.1 mbox-sync-parse.c, 1.32, 1.33 mbox-sync-md5.c, 1.1, NONE mbox-sync-private.h, 1.39, 1.40

cras at dovecot.org cras at dovecot.org
Wed Dec 15 20:43:42 EET 2004


Update of /var/lib/cvs/dovecot/src/lib-storage/index/mbox
In directory talvi:/tmp/cvs-serv23500

Modified Files:
	Makefile.am mbox-sync-parse.c mbox-sync-private.h 
Added Files:
	mbox-md5.c mbox-md5.h 
Removed Files:
	mbox-sync-md5.c 
Log Message:
Reorganized mbox md5 summing code so it doesn't require sync context anymore.



Index: Makefile.am
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/mbox/Makefile.am,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- Makefile.am	14 Dec 2004 02:44:33 -0000	1.5
+++ Makefile.am	15 Dec 2004 18:43:40 -0000	1.6
@@ -16,8 +16,8 @@
 	mbox-list.c \
 	mbox-lock.c \
 	mbox-mail.c \
+	mbox-md5.c \
 	mbox-save.c \
-	mbox-sync-md5.c \
 	mbox-sync-parse.c \
 	mbox-sync-rewrite.c \
 	mbox-sync-update.c \
@@ -30,5 +30,6 @@
 	mbox-file.h \
 	mbox-from.h \
 	mbox-lock.h \
+	mbox-md5.h \
 	mbox-storage.h \
 	mbox-sync-private.h

--- NEW FILE: mbox-md5.c ---
/* Copyright (C) 2004 Timo Sirainen */

#include "lib.h"
#include "md5.h"
#include "message-parser.h"
#include "mbox-md5.h"

#include <stdlib.h>

struct mbox_md5_context {
	struct md5_context hdr_md5_ctx;
	int seen_received_hdr;
};

struct mbox_md5_header_func {
	const char *header;
	int (*func)(struct mbox_md5_context *ctx,
		    struct message_header_line *hdr);
};

static int parse_date(struct mbox_md5_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_md5_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_md5_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_md5_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_md5_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_md5_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)
{
	const char *key = p1;
	const struct mbox_md5_header_func *func = p2;

	return strcasecmp(key, func->header);
}

struct mbox_md5_context *mbox_md5_init(void)
{
	struct mbox_md5_context *ctx;

	ctx = i_new(struct mbox_md5_context, 1);
	md5_init(&ctx->hdr_md5_ctx);
	return ctx;
}

void mbox_md5_continue(struct mbox_md5_context *ctx,
		       struct message_header_line *hdr)
{
	struct mbox_md5_header_func *func;

	func = bsearch(hdr->name, md5_header_funcs,
		       MD5_HEADER_FUNCS_COUNT, sizeof(*md5_header_funcs),
		       bsearch_header_func_cmp);
	if (func != NULL)
		(void)func->func(ctx, hdr);
}

void mbox_md5_finish(struct mbox_md5_context *ctx,
		     unsigned char result[16])
{
	md5_final(&ctx->hdr_md5_ctx, result);
	i_free(ctx);
}

--- NEW FILE: mbox-md5.h ---
#ifndef __MBOX_MD5_H
#define __MBOX_MD5_H

struct mbox_md5_context *mbox_md5_init(void);
void mbox_md5_continue(struct mbox_md5_context *ctx,
		       struct message_header_line *hdr);
void mbox_md5_finish(struct mbox_md5_context *ctx,
		     unsigned char result[16]);

#endif

Index: mbox-sync-parse.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/mbox/mbox-sync-parse.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- mbox-sync-parse.c	14 Dec 2004 03:03:35 -0000	1.32
+++ mbox-sync-parse.c	15 Dec 2004 18:43:40 -0000	1.33
@@ -11,12 +11,19 @@
 #include "message-parser.h"
 #include "mail-index.h"
 #include "mbox-storage.h"
+#include "mbox-md5.h"
 #include "mbox-sync-private.h"
 
 #include <stdlib.h>
 
 #define IS_LWSP_LF(c) (IS_LWSP(c) || (c) == '\n')
 
+struct mbox_sync_header_func {
+	const char *header;
+	int (*func)(struct mbox_sync_mail_context *ctx,
+		    struct message_header_line *hdr);
+};
+
 struct mbox_flag_type mbox_status_flags[] = {
 	{ 'R', MAIL_SEEN },
 	{ 'O', MBOX_NONRECENT },
@@ -292,7 +299,7 @@
 };
 #define HEADER_FUNCS_COUNT (sizeof(header_funcs) / sizeof(*header_funcs))
 
-int mbox_sync_bsearch_header_func_cmp(const void *p1, const void *p2)
+static int mbox_sync_bsearch_header_func_cmp(const void *p1, const void *p2)
 {
 	const char *key = p1;
 	const struct mbox_sync_header_func *func = p2;
@@ -307,6 +314,7 @@
 	struct message_header_parser_ctx *hdr_ctx;
 	struct message_header_line *hdr;
 	struct mbox_sync_header_func *func;
+	struct mbox_md5_context *mbox_md5_ctx;
 	size_t line_start_pos;
 	int i, ret;
 
@@ -321,7 +329,7 @@
 	ctx->content_length = (uoff_t)-1;
 	str_truncate(ctx->header, 0);
 
-	md5_init(&ctx->hdr_md5_ctx);
+        mbox_md5_ctx = mbox_md5_init();
 
         line_start_pos = 0;
 	hdr_ctx = message_parse_header_init(input, NULL, FALSE);
@@ -360,7 +368,7 @@
 			buffer_append(ctx->header, hdr->full_value,
 				      hdr->full_value_len);
 		} else {
-			mbox_sync_md5(ctx, hdr);
+			mbox_md5_continue(mbox_md5_ctx, hdr);
 			buffer_append(ctx->header, hdr->value,
 				      hdr->value_len);
 		}
@@ -370,7 +378,7 @@
 	i_assert(ret != 0);
 	message_parse_header_deinit(hdr_ctx);
 
-	md5_final(&ctx->hdr_md5_ctx, ctx->hdr_md5_sum);
+	mbox_md5_finish(mbox_md5_ctx, ctx->hdr_md5_sum);
 
 	if ((ctx->seq == 1 && sync_ctx->base_uid_validity == 0) ||
 	    (ctx->seq > 1 && sync_ctx->dest_first_mail)) {
@@ -393,6 +401,7 @@
 	struct message_header_parser_ctx *hdr_ctx;
 	struct message_header_line *hdr;
 	struct header_func *func;
+	struct mbox_md5_context *mbox_md5_ctx;
 	const void *data;
 	uint32_t uid;
 	int ret;
@@ -402,7 +411,7 @@
 	   the MD5 sum. */
 
 	memset(&ctx, 0, sizeof(ctx));
-	md5_init(&ctx.hdr_md5_ctx);
+        mbox_md5_ctx = mbox_md5_init();
 
 	hdr_ctx = message_parse_header_init(ibox->mbox_stream, NULL, FALSE);
 	while ((ret = message_parse_header_next(hdr_ctx, &hdr)) > 0) {
@@ -424,13 +433,13 @@
 					break;
 			}
 		} else {
-			mbox_sync_md5(&ctx, hdr);
+			mbox_md5_continue(mbox_md5_ctx, hdr);
 		}
 	}
 	i_assert(ret != 0);
 	message_parse_header_deinit(hdr_ctx);
 
-	md5_final(&ctx.hdr_md5_ctx, ctx.hdr_md5_sum);
+	mbox_md5_finish(mbox_md5_ctx, ctx.hdr_md5_sum);
 
 	if (ctx.mail.uid != 0) {
 		/* match by X-UID header */

--- mbox-sync-md5.c DELETED ---

Index: mbox-sync-private.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/mbox/mbox-sync-private.h,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -d -r1.39 -r1.40
--- mbox-sync-private.h	14 Dec 2004 02:44:33 -0000	1.39
+++ mbox-sync-private.h	15 Dec 2004 18:43:40 -0000	1.40
@@ -67,7 +67,6 @@
 	size_t header_first_change, header_last_change;
 	string_t *header, *uidl;
 
-	struct md5_context hdr_md5_ctx;
 	unsigned char hdr_md5_sum[16];
 
 	uoff_t content_length;
@@ -82,7 +81,6 @@
 	unsigned int updated:1;
 	unsigned int recent:1;
 	unsigned int dirty:1;
-	unsigned int seen_received_hdr:1;
 	unsigned int uid_broken:1;
 };
 
@@ -118,12 +116,6 @@
 	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);
 
@@ -147,9 +139,4 @@
 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



More information about the dovecot-cvs mailing list