Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-imap/imap-quote.c @ 339:6f4eeb6a0a0d HEAD
Several fields in BODY were unquoted.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 01 Oct 2002 00:18:12 +0300 |
parents | |
children | e524da896d92 |
rev | line source |
---|---|
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (C) 2002 Timo Sirainen */ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "temp-string.h" |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #define IS_BREAK_CHAR(c) \ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 ((c) == ' ' || (c) == '\t' || \ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 (c) == ',' || (c) == ':' || (c) == ';' || (c) == '@' || \ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 (c) == '<' || (c) == '>' || (c) == '(' || (c) == ')' || \ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 (c) == '[' || (c) == ']' || (c) == '=') |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #define IS_BREAK_OR_CRLF_CHAR(c) \ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 (IS_BREAK_CHAR(c) || (c) == '\r' || (c) == '\n') |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 static size_t next_token_quoted(const char *value, size_t len, |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 int *need_qp, int *quoted) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 size_t i; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 *need_qp = FALSE; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 *quoted = TRUE; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 for (i = *quoted ? 0 : 1; i < len; i++) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 if ((unsigned char)value[i] & 0x80) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 *need_qp = TRUE; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 if (value[i] == '"' || value[i] == '\r' || value[i] == '\n') { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 i++; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 *quoted = value[i] == '"'; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 break; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 return i; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 static size_t next_token(const char *value, size_t len, |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 int *need_qp, int *quoted, int qp_on) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 size_t i = 0; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 if (value[0] == '"' || *quoted) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 return next_token_quoted(value, len, need_qp, quoted); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 *need_qp = FALSE; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 if (qp_on) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 /* skip spaces, so we don't end up QP'ing word at a time */ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 for (i = 0; i < len; i++) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 if (value[i] != ' ') |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 break; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 if (i == len) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 return i; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 if (IS_BREAK_OR_CRLF_CHAR(value[i])) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 /* return all break-chars in one token */ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 for (i++; i < len; i++) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 if (!IS_BREAK_CHAR(value[i])) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 break; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 return i; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 /* then stop at break-char */ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 for (; i < len; i++) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 if ((unsigned char)value[i] & 0x80) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 *need_qp = TRUE; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 if (IS_BREAK_OR_CRLF_CHAR(value[i])) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 break; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 return i; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 static void append_quoted_qp(TempString *str, const char *value, size_t len) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 size_t i; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 unsigned char c; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 /* do this the easy way, it's already broken behaviour to leave the |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 8bit text in mailbox, so we shouldn't need to try too hard to make |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 it readable. Keep 'A'..'Z', 'a'..'z' and '0'..'9', QP rest */ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 for (i = 0; i < len; i++) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 if (value[i] == ' ') |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 t_string_append_c(str, '_'); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 else if ((value[i] >= 'A' && value[i] <= 'Z') || |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 (value[i] >= 'a' && value[i] <= 'z') || |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 (value[i] >= '0' && value[i] <= '9')) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 t_string_append_c(str, value[i]); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 } else { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 t_string_append_c(str, '='); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 c = (unsigned char)value[i] >> 4; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 t_string_append_c(str, c < 10 ? (c+'0') : (c-10+'A')); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 c = (unsigned char)value[i] & 0x0f; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 t_string_append_c(str, c < 10 ? (c+'0') : (c-10+'A')); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 static void append_quoted(TempString *str, const char *value, size_t len) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 size_t i; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 for (i = 0; i < len; i++) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 if (value[i] == '\\' || value[i] == '"') |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 t_string_append_c(str, '\\'); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 t_string_append_c(str, value[i]); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 /* does two things: 1) escape '\' and '"' characters, 2) 8bit text -> QP */ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 static TempString *get_quoted_str(const char *value, size_t value_len) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 TempString *str; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 size_t token_len; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 int qp, need_qp, quoted; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 str = t_string_new(value_len * 2); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 qp = FALSE; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 quoted = FALSE; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 t_string_append_c(str, '"'); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 while (value_len > 0) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 token_len = next_token(value, value_len, &need_qp, "ed, qp); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 i_assert(token_len > 0 && token_len <= value_len); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 /* header may be split to multiple lines, we don't want them */ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 while (token_len > 0 && (value[0] == '\r' || |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 value[0] == '\n')) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 value++; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 token_len--; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 value_len--; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 if (need_qp && !qp) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 t_string_append(str, "=?x-unknown?Q?"); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 qp = TRUE; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 } else if (!need_qp && qp) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 t_string_append(str, "?="); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 qp = FALSE; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 if (need_qp) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 append_quoted_qp(str, value, token_len); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 else |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 append_quoted(str, value, token_len); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 value += token_len; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 value_len -= token_len; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 if (qp) t_string_append(str, "?="); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 t_string_append_c(str, '"'); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 return str; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 const char *imap_quote_str_nil(const char *value) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 return value == NULL ? "NIL" : |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 get_quoted_str(value, strlen(value))->str; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 char *imap_quote_value(Pool pool, const char *value, size_t value_len) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 TempString *str; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 str = get_quoted_str(value, value_len); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 return p_strndup(pool, str->str, str->len); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 } |