Mercurial > dovecot > original-hg > dovecot-1.2
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 |
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 } |