Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-mail/message-id.c @ 9261:51aee73e49a5 HEAD
maildir: When UIDVALIDITY changes, don't reset uid_next to 1 in uidlist.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 26 Jul 2009 23:36:12 -0400 |
parents | 9d634c93d28a |
children | 00cd9aacd03c |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1 /* Copyright (c) 2006-2009 Dovecot authors, see the included COPYING file */ |
4488
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "str.h" |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "rfc822-parser.h" |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "message-id.h" |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 static bool get_untokenized_msgid(const char **msgid_p, string_t *msgid) |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 { |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 struct rfc822_parser_context parser; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 rfc822_parser_init(&parser, (const unsigned char *)*msgid_p, |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 strlen(*msgid_p), NULL); |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 /* |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 msg-id = [CFWS] "<" id-left "@" id-right ">" [CFWS] |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 id-left = dot-atom-text / no-fold-quote / obs-id-left |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 id-right = dot-atom-text / no-fold-literal / obs-id-right |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 no-fold-quote = DQUOTE *(qtext / quoted-pair) DQUOTE |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 no-fold-literal = "[" *(dtext / quoted-pair) "]" |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 */ |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 (void)rfc822_skip_lwsp(&parser); |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 if (rfc822_parse_dot_atom(&parser, msgid) <= 0) |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 return FALSE; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 if (*parser.data != '@') |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 return FALSE; |
9112
9d634c93d28a
message_id_get_next() didn't contain @ in reply when msgid wasn't in canonical form.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
30 str_append_c(msgid, '@'); |
4488
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 parser.data++; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 (void)rfc822_skip_lwsp(&parser); |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 if (rfc822_parse_dot_atom(&parser, msgid) <= 0) |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 return FALSE; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 if (*parser.data != '>') |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 return FALSE; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 *msgid_p = (const char *)parser.data + 1; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 return TRUE; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 } |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 static void strip_lwsp(char *str) |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 { |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 /* @UNSAFE */ |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 char *dest; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 /* find the first lwsp */ |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 while (*str != ' ' && *str != '\t' && *str != '\r' && *str != '\n') { |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 if (*str == '\0') |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 return; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 str++; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 } |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 for (dest = str; *str != '\0'; str++) { |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 if (*str != ' ' && *str != '\t' && *str != '\r' && *str != '\n') |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 *dest++ = *str; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 } |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 *dest = '\0'; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 } |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 const char *message_id_get_next(const char **msgid_p) |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 { |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 const char *msgid = *msgid_p; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 const char *p; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 string_t *str = NULL; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 bool found_at; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 if (*msgid_p == NULL) |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 return NULL; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 for (;;) { |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 /* skip until '<' */ |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 while (*msgid != '<') { |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 if (*msgid == '\0') { |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 *msgid_p = msgid; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 return NULL; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 } |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 msgid++; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 } |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 msgid++; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 /* check it through quickly to see if it's already normalized */ |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 p = msgid; found_at = FALSE; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 for (;; p++) { |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 if ((unsigned char)*p >= 'A') /* matches most */ |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 continue; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 if (*p == '@') |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 found_at = TRUE; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 if (*p == '>' || *p == '"' || *p == '(' || *p == '[') |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 break; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 if (*p == '\0') { |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 *msgid_p = p; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 return NULL; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 } |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 } |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 if (*p == '>') { |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 *msgid_p = p+1; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 if (found_at) { |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 char *s; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 s = p_strdup_until(unsafe_data_stack_pool, |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 msgid, p); |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 strip_lwsp(s); |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 return s; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 } |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 } else { |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 /* ok, do it the slow way */ |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 *msgid_p = msgid; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 if (str == NULL) { |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 /* allocate only once, so we don't leak |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 with multiple invalid message IDs */ |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 str = t_str_new(256); |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 } |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 if (get_untokenized_msgid(msgid_p, str)) |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 return str_c(str); |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 } |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 /* invalid message id, see if there's another valid one */ |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 msgid = *msgid_p; |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 } |
1489be4d7b26
Added message_id_get_next() to return the next valid Message-ID from a
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 } |