annotate src/lib-storage/index/mbox/mbox-md5.c @ 3863:55df57c028d4 HEAD

Added "bool" type and changed all ints that were used as booleans to bool.
author Timo Sirainen <tss@iki.fi>
date Fri, 13 Jan 2006 22:25:57 +0200
parents 7c4238c78aee
children 65c69a53a7be
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2972
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (C) 2004 Timo Sirainen */
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 #define MD5_HEADER_FUNCS_COUNT \
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 (sizeof(md5_header_funcs) / sizeof(*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
81
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 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
83 {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 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
85 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
86
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 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
88 }
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 *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
91 {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 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
93
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 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
95 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
96 return ctx;
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 }
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 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
100 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
101 {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 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
103
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 func = bsearch(hdr->name, 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
105 MD5_HEADER_FUNCS_COUNT, sizeof(*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
106 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
107 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
108 (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
109 }
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 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
112 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
113 {
7c4238c78aee Reorganized mbox md5 summing code so it doesn't require sync context anymore.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 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
115 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
116 }