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
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) 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 }