annotate src/lib-storage/index/mbox/mbox-md5.c @ 8590:b9faf4db2a9f HEAD

Updated copyright notices to include year 2009.
author Timo Sirainen <tss@iki.fi>
date Tue, 06 Jan 2009 09:25:38 -0500
parents 7ed926ed7aa4
children 00cd9aacd03c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8590
b9faf4db2a9f Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
1 /* Copyright (c) 2004-2009 Dovecot authors, see the included COPYING file */
2972
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "md5.h"
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "message-parser.h"
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "mbox-md5.h"
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include <stdlib.h>
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 struct mbox_md5_context {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 struct md5_context hdr_md5_ctx;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2972
diff changeset
12 bool seen_received_hdr;
2972
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 };
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 struct mbox_md5_header_func {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 const char *header;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2972
diff changeset
17 bool (*func)(struct mbox_md5_context *ctx,
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2972
diff changeset
18 struct message_header_line *hdr);
2972
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 };
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2972
diff changeset
21 static bool parse_date(struct mbox_md5_context *ctx,
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2972
diff changeset
22 struct message_header_line *hdr)
2972
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 if (!ctx->seen_received_hdr) {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 /* Received-header contains date too, and more trusted one */
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len);
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 }
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 return TRUE;
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 }
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2972
diff changeset
31 static bool parse_delivered_to(struct mbox_md5_context *ctx,
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2972
diff changeset
32 struct message_header_line *hdr)
2972
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len);
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 return TRUE;
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 }
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2972
diff changeset
38 static bool parse_message_id(struct mbox_md5_context *ctx,
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2972
diff changeset
39 struct message_header_line *hdr)
2972
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 if (!ctx->seen_received_hdr) {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 /* Received-header contains unique ID too,
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 and more trusted one */
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len);
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 }
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 return TRUE;
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 }
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2972
diff changeset
49 static bool parse_received(struct mbox_md5_context *ctx,
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2972
diff changeset
50 struct message_header_line *hdr)
2972
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 if (!ctx->seen_received_hdr) {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 /* get only the first received-header */
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len);
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 if (!hdr->continues)
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 ctx->seen_received_hdr = TRUE;
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 }
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 return TRUE;
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 }
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2972
diff changeset
61 static bool parse_x_delivery_id(struct mbox_md5_context *ctx,
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2972
diff changeset
62 struct message_header_line *hdr)
2972
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 /* Let the local delivery agent help generate unique ID's but don't
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 blindly trust this header alone as it could just as easily come from
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 the remote. */
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 md5_update(&ctx->hdr_md5_ctx, hdr->value, hdr->value_len);
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 return TRUE;
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 }
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 static struct mbox_md5_header_func md5_header_funcs[] = {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 { "Date", parse_date },
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 { "Delivered-To", parse_delivered_to },
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 { "Message-ID", parse_message_id },
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 { "Received", parse_received },
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 { "X-Delivery-ID", parse_x_delivery_id }
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 };
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 static int bsearch_header_func_cmp(const void *p1, const void *p2)
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 const char *key = p1;
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 const struct mbox_md5_header_func *func = p2;
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 return strcasecmp(key, func->header);
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 }
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 struct mbox_md5_context *mbox_md5_init(void)
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 struct mbox_md5_context *ctx;
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 ctx = i_new(struct mbox_md5_context, 1);
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 md5_init(&ctx->hdr_md5_ctx);
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 return ctx;
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 }
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 void mbox_md5_continue(struct mbox_md5_context *ctx,
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 struct message_header_line *hdr)
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 struct mbox_md5_header_func *func;
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 func = bsearch(hdr->name, md5_header_funcs,
6494
59490181469e Use N_ELEMENTS() macro instead of doing sizeof()/sizeof([0]) ourself.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
103 N_ELEMENTS(md5_header_funcs), sizeof(*md5_header_funcs),
2972
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 bsearch_header_func_cmp);
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 if (func != NULL)
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 (void)func->func(ctx, hdr);
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 }
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 void mbox_md5_finish(struct mbox_md5_context *ctx,
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 unsigned char result[16])
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 md5_final(&ctx->hdr_md5_ctx, result);
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 i_free(ctx);
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 }