Mercurial > dovecot > core-2.2
annotate src/lib-mail/message-decoder.c @ 21322:5ab8dc1a4a6f
global: Change string position/length from unsigned int to size_t
Mainly to avoid truncating >4GB strings, which might potentially cause
some security holes. Normally there are other limits, which prevent such
excessive strings from being created in the first place.
I'm sure this didn't find everything. Maybe everything could be found with
compiler warnings. -Wconversion kind of does it, but it gives way too many
unnecessary warnings.
These were mainly found with:
grep " = strlen"
egrep "unsigned int.*(size|len)"
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Mon, 12 Dec 2016 07:19:55 +0200 |
parents | d2872ec409ec |
children | 2e2563132d5f |
rev | line source |
---|---|
19552
0f22db71df7a
global: freshen copyright
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
18721
diff
changeset
|
1 /* Copyright (c) 2006-2016 Dovecot authors, see the included COPYING file */ |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "buffer.h" |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "base64.h" |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
6 #include "str.h" |
6131
5f56b2eb32b3
Use uni_utf8_to_decomposed_titlecase() to have proper case-insensitive UTF-8
Timo Sirainen <tss@iki.fi>
parents:
6122
diff
changeset
|
7 #include "unichar.h" |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "charset-utf8.h" |
18506
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
9 #include "qp-decoder.h" |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
10 #include "rfc822-parser.h" |
7950
3412c43d6707
Merge RFC 2231 header continuations in BODY/BODYSTRUCTURE replies. Also use
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
11 #include "rfc2231-parser.h" |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include "message-parser.h" |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #include "message-header-decode.h" |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #include "message-decoder.h" |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 |
4885 | 16 /* base64 takes max 4 bytes per character, q-p takes max 3. */ |
17 #define MAX_ENCODING_BUF_SIZE 3 | |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 struct message_decoder_context { |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
20 enum message_decoder_flags flags; |
15053
c976a9c01613
Replaced "decomposed titlecase" conversions with more generic normalizer function.
Timo Sirainen <tss@iki.fi>
parents:
14857
diff
changeset
|
21 normalizer_func_t *normalizer; |
5410
73032525bca0
Don't try to access output variable's contents. They are undefined at least
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
22 struct message_part *prev_part; |
73032525bca0
Don't try to access output variable's contents. They are undefined at least
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
23 |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 struct message_header_line hdr; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 buffer_t *buf, *buf2; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
27 char *charset_trans_charset; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 struct charset_translation *charset_trans; |
18151
e49a2e800650
lib-mail: Replaced MAX_TRANSLATION_BUF_SIZE with the new CHARSET_MAX_PENDING_BUF_SIZE
Timo Sirainen <tss@iki.fi>
parents:
18146
diff
changeset
|
29 char translation_buf[CHARSET_MAX_PENDING_BUF_SIZE]; |
21322
5ab8dc1a4a6f
global: Change string position/length from unsigned int to size_t
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20891
diff
changeset
|
30 size_t translation_size; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 |
18506
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
32 struct qp_decoder *qp; |
9664
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
33 buffer_t *encoding_buf; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 |
18154
55555824f636
lib-mail: Added message_decoder_current_content_type()
Timo Sirainen <tss@iki.fi>
parents:
18153
diff
changeset
|
35 char *content_type, *content_charset; |
14857
624107158354
lib-mail: Added message_decoder_parse_cte()
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
36 enum message_cte message_cte; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
38 unsigned int binary_input:1; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 }; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 |
13121
15082db3225a
lib-mail: Added message_decoder_set_return_binary()
Timo Sirainen <tss@iki.fi>
parents:
13015
diff
changeset
|
41 static void |
15082db3225a
lib-mail: Added message_decoder_set_return_binary()
Timo Sirainen <tss@iki.fi>
parents:
13015
diff
changeset
|
42 message_decode_body_init_charset(struct message_decoder_context *ctx, |
15082db3225a
lib-mail: Added message_decoder_set_return_binary()
Timo Sirainen <tss@iki.fi>
parents:
13015
diff
changeset
|
43 struct message_part *part); |
15082db3225a
lib-mail: Added message_decoder_set_return_binary()
Timo Sirainen <tss@iki.fi>
parents:
13015
diff
changeset
|
44 |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
45 struct message_decoder_context * |
15053
c976a9c01613
Replaced "decomposed titlecase" conversions with more generic normalizer function.
Timo Sirainen <tss@iki.fi>
parents:
14857
diff
changeset
|
46 message_decoder_init(normalizer_func_t *normalizer, |
c976a9c01613
Replaced "decomposed titlecase" conversions with more generic normalizer function.
Timo Sirainen <tss@iki.fi>
parents:
14857
diff
changeset
|
47 enum message_decoder_flags flags) |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 struct message_decoder_context *ctx; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 ctx = i_new(struct message_decoder_context, 1); |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
52 ctx->flags = flags; |
15053
c976a9c01613
Replaced "decomposed titlecase" conversions with more generic normalizer function.
Timo Sirainen <tss@iki.fi>
parents:
14857
diff
changeset
|
53 ctx->normalizer = normalizer; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 ctx->buf = buffer_create_dynamic(default_pool, 8192); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 ctx->buf2 = buffer_create_dynamic(default_pool, 8192); |
9664
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
56 ctx->encoding_buf = buffer_create_dynamic(default_pool, 128); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 return ctx; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 void message_decoder_deinit(struct message_decoder_context **_ctx) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 struct message_decoder_context *ctx = *_ctx; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 *_ctx = NULL; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 |
4888 | 66 if (ctx->charset_trans != NULL) |
67 charset_to_utf8_end(&ctx->charset_trans); | |
18506
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
68 if (ctx->qp != NULL) |
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
69 qp_decoder_deinit(&ctx->qp); |
4888 | 70 |
9664
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
71 buffer_free(&ctx->encoding_buf); |
6414
a6a49d5efc59
Changed buffer_free() and buffer_free_without_data() APIs to take ** pointer
Timo Sirainen <tss@iki.fi>
parents:
6133
diff
changeset
|
72 buffer_free(&ctx->buf); |
a6a49d5efc59
Changed buffer_free() and buffer_free_without_data() APIs to take ** pointer
Timo Sirainen <tss@iki.fi>
parents:
6133
diff
changeset
|
73 buffer_free(&ctx->buf2); |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
74 i_free(ctx->charset_trans_charset); |
18154
55555824f636
lib-mail: Added message_decoder_current_content_type()
Timo Sirainen <tss@iki.fi>
parents:
18153
diff
changeset
|
75 i_free(ctx->content_type); |
4888 | 76 i_free(ctx->content_charset); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 i_free(ctx); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 |
13121
15082db3225a
lib-mail: Added message_decoder_set_return_binary()
Timo Sirainen <tss@iki.fi>
parents:
13015
diff
changeset
|
80 void message_decoder_set_return_binary(struct message_decoder_context *ctx, |
15082db3225a
lib-mail: Added message_decoder_set_return_binary()
Timo Sirainen <tss@iki.fi>
parents:
13015
diff
changeset
|
81 bool set) |
15082db3225a
lib-mail: Added message_decoder_set_return_binary()
Timo Sirainen <tss@iki.fi>
parents:
13015
diff
changeset
|
82 { |
15082db3225a
lib-mail: Added message_decoder_set_return_binary()
Timo Sirainen <tss@iki.fi>
parents:
13015
diff
changeset
|
83 if (set) |
15082db3225a
lib-mail: Added message_decoder_set_return_binary()
Timo Sirainen <tss@iki.fi>
parents:
13015
diff
changeset
|
84 ctx->flags |= MESSAGE_DECODER_FLAG_RETURN_BINARY; |
15082db3225a
lib-mail: Added message_decoder_set_return_binary()
Timo Sirainen <tss@iki.fi>
parents:
13015
diff
changeset
|
85 else |
15082db3225a
lib-mail: Added message_decoder_set_return_binary()
Timo Sirainen <tss@iki.fi>
parents:
13015
diff
changeset
|
86 ctx->flags &= ~MESSAGE_DECODER_FLAG_RETURN_BINARY; |
15082db3225a
lib-mail: Added message_decoder_set_return_binary()
Timo Sirainen <tss@iki.fi>
parents:
13015
diff
changeset
|
87 message_decode_body_init_charset(ctx, ctx->prev_part); |
15082db3225a
lib-mail: Added message_decoder_set_return_binary()
Timo Sirainen <tss@iki.fi>
parents:
13015
diff
changeset
|
88 } |
15082db3225a
lib-mail: Added message_decoder_set_return_binary()
Timo Sirainen <tss@iki.fi>
parents:
13015
diff
changeset
|
89 |
14857
624107158354
lib-mail: Added message_decoder_parse_cte()
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
90 enum message_cte message_decoder_parse_cte(struct message_header_line *hdr) |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 { |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
92 struct rfc822_parser_context parser; |
14857
624107158354
lib-mail: Added message_decoder_parse_cte()
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
93 enum message_cte message_cte; |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
94 string_t *value; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
96 value = t_str_new(64); |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
97 rfc822_parser_init(&parser, hdr->full_value, hdr->full_value_len, NULL); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 |
14689
096e4c4d62bb
Try to avoid (void) casts by adding more ATTR_NOWARN_UNUSED_RESULT.
Timo Sirainen <tss@iki.fi>
parents:
14688
diff
changeset
|
99 rfc822_skip_lwsp(&parser); |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
100 (void)rfc822_parse_mime_token(&parser, value); |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
101 |
14857
624107158354
lib-mail: Added message_decoder_parse_cte()
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
102 message_cte = MESSAGE_CTE_UNKNOWN; |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
103 switch (str_len(value)) { |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 case 4: |
6423
13b0a3ba5f7b
Added i_ prefix to strcmp_p(), strcasecmp_p() and memcasecmp().
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
105 if (i_memcasecmp(str_data(value), "7bit", 4) == 0 || |
13b0a3ba5f7b
Added i_ prefix to strcmp_p(), strcasecmp_p() and memcasecmp().
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
106 i_memcasecmp(str_data(value), "8bit", 4) == 0) |
14857
624107158354
lib-mail: Added message_decoder_parse_cte()
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
107 message_cte = MESSAGE_CTE_78BIT; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 break; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 case 6: |
6423
13b0a3ba5f7b
Added i_ prefix to strcmp_p(), strcasecmp_p() and memcasecmp().
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
110 if (i_memcasecmp(str_data(value), "base64", 6) == 0) |
14857
624107158354
lib-mail: Added message_decoder_parse_cte()
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
111 message_cte = MESSAGE_CTE_BASE64; |
6423
13b0a3ba5f7b
Added i_ prefix to strcmp_p(), strcasecmp_p() and memcasecmp().
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
112 else if (i_memcasecmp(str_data(value), "binary", 6) == 0) |
14857
624107158354
lib-mail: Added message_decoder_parse_cte()
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
113 message_cte = MESSAGE_CTE_BINARY; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 break; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 case 16: |
6423
13b0a3ba5f7b
Added i_ prefix to strcmp_p(), strcasecmp_p() and memcasecmp().
Timo Sirainen <tss@iki.fi>
parents:
6414
diff
changeset
|
116 if (i_memcasecmp(str_data(value), "quoted-printable", 16) == 0) |
14857
624107158354
lib-mail: Added message_decoder_parse_cte()
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
117 message_cte = MESSAGE_CTE_QP; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 break; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 } |
14857
624107158354
lib-mail: Added message_decoder_parse_cte()
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
120 return message_cte; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 static void |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
124 parse_content_type(struct message_decoder_context *ctx, |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
125 struct message_header_line *hdr) |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 { |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
127 struct rfc822_parser_context parser; |
7950
3412c43d6707
Merge RFC 2231 header continuations in BODY/BODYSTRUCTURE replies. Also use
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
128 const char *const *results; |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
129 string_t *str; |
20891
d2872ec409ec
global: Handle broken Content-Type headers consistently.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
130 int ret; |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
131 |
18154
55555824f636
lib-mail: Added message_decoder_current_content_type()
Timo Sirainen <tss@iki.fi>
parents:
18153
diff
changeset
|
132 if (ctx->content_type != NULL) |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
133 return; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
135 rfc822_parser_init(&parser, hdr->full_value, hdr->full_value_len, NULL); |
14689
096e4c4d62bb
Try to avoid (void) casts by adding more ATTR_NOWARN_UNUSED_RESULT.
Timo Sirainen <tss@iki.fi>
parents:
14688
diff
changeset
|
136 rfc822_skip_lwsp(&parser); |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
137 str = t_str_new(64); |
20891
d2872ec409ec
global: Handle broken Content-Type headers consistently.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
138 ret = rfc822_parse_content_type(&parser, str); |
d2872ec409ec
global: Handle broken Content-Type headers consistently.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
139 ctx->content_type = i_strdup(str_c(str)); |
d2872ec409ec
global: Handle broken Content-Type headers consistently.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
140 if (ret < 0) |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
141 return; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 |
14688
128c598d2870
Avoid using (void)s by adding ATTR_NOWARN_UNUSED_RESULT attributes and other ways.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
143 rfc2231_parse(&parser, &results); |
7950
3412c43d6707
Merge RFC 2231 header continuations in BODY/BODYSTRUCTURE replies. Also use
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
144 for (; *results != NULL; results += 2) { |
3412c43d6707
Merge RFC 2231 header continuations in BODY/BODYSTRUCTURE replies. Also use
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
145 if (strcasecmp(results[0], "charset") == 0) { |
3412c43d6707
Merge RFC 2231 header continuations in BODY/BODYSTRUCTURE replies. Also use
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
146 ctx->content_charset = i_strdup(results[1]); |
6117
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
147 break; |
9214044ce1f1
Removed message-content-parser. Instead added rfc822_parse_content_type()
Timo Sirainen <tss@iki.fi>
parents:
6114
diff
changeset
|
148 } |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 static bool message_decode_header(struct message_decoder_context *ctx, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 struct message_header_line *hdr, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 struct message_block *output) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 { |
5511
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
156 size_t value_len; |
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
157 |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 if (hdr->continues) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 hdr->use_full_value = TRUE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 return FALSE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
163 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6916
diff
changeset
|
164 if (hdr->name_len == 12 && |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6916
diff
changeset
|
165 strcasecmp(hdr->name, "Content-Type") == 0) |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6916
diff
changeset
|
166 parse_content_type(ctx, hdr); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6916
diff
changeset
|
167 if (hdr->name_len == 25 && |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6916
diff
changeset
|
168 strcasecmp(hdr->name, "Content-Transfer-Encoding") == 0) |
14857
624107158354
lib-mail: Added message_decoder_parse_cte()
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
169 ctx->message_cte = message_decoder_parse_cte(hdr); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
170 } T_END; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 buffer_set_used_size(ctx->buf, 0); |
6118
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
6117
diff
changeset
|
173 message_header_decode_utf8(hdr->full_value, hdr->full_value_len, |
15053
c976a9c01613
Replaced "decomposed titlecase" conversions with more generic normalizer function.
Timo Sirainen <tss@iki.fi>
parents:
14857
diff
changeset
|
174 ctx->buf, ctx->normalizer); |
5511
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
175 value_len = ctx->buf->used; |
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
176 |
15053
c976a9c01613
Replaced "decomposed titlecase" conversions with more generic normalizer function.
Timo Sirainen <tss@iki.fi>
parents:
14857
diff
changeset
|
177 if (ctx->normalizer != NULL) { |
c976a9c01613
Replaced "decomposed titlecase" conversions with more generic normalizer function.
Timo Sirainen <tss@iki.fi>
parents:
14857
diff
changeset
|
178 (void)ctx->normalizer(hdr->name, hdr->name_len, ctx->buf); |
6113
adbfce5bf7d9
Changed message_decoder_init_ucase() to message_decoder_init(bool ucase)
Timo Sirainen <tss@iki.fi>
parents:
6112
diff
changeset
|
179 buffer_append_c(ctx->buf, '\0'); |
13015
c392158f374d
message [header] decoder: Output only valid UTF-8 data.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
180 } else { |
c392158f374d
message [header] decoder: Output only valid UTF-8 data.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
181 if (!uni_utf8_get_valid_data((const unsigned char *)hdr->name, |
c392158f374d
message [header] decoder: Output only valid UTF-8 data.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
182 hdr->name_len, ctx->buf)) |
c392158f374d
message [header] decoder: Output only valid UTF-8 data.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
183 buffer_append_c(ctx->buf, '\0'); |
6113
adbfce5bf7d9
Changed message_decoder_init_ucase() to message_decoder_init(bool ucase)
Timo Sirainen <tss@iki.fi>
parents:
6112
diff
changeset
|
184 } |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 ctx->hdr = *hdr; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 ctx->hdr.full_value = ctx->buf->data; |
5511
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
188 ctx->hdr.full_value_len = value_len; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 ctx->hdr.value_len = 0; |
13015
c392158f374d
message [header] decoder: Output only valid UTF-8 data.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
190 if (ctx->buf->used != value_len) { |
6113
adbfce5bf7d9
Changed message_decoder_init_ucase() to message_decoder_init(bool ucase)
Timo Sirainen <tss@iki.fi>
parents:
6112
diff
changeset
|
191 ctx->hdr.name = CONST_PTR_OFFSET(ctx->buf->data, |
adbfce5bf7d9
Changed message_decoder_init_ucase() to message_decoder_init(bool ucase)
Timo Sirainen <tss@iki.fi>
parents:
6112
diff
changeset
|
192 ctx->hdr.full_value_len); |
adbfce5bf7d9
Changed message_decoder_init_ucase() to message_decoder_init(bool ucase)
Timo Sirainen <tss@iki.fi>
parents:
6112
diff
changeset
|
193 ctx->hdr.name_len = ctx->buf->used - 1 - value_len; |
adbfce5bf7d9
Changed message_decoder_init_ucase() to message_decoder_init(bool ucase)
Timo Sirainen <tss@iki.fi>
parents:
6112
diff
changeset
|
194 } |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 output->hdr = &ctx->hdr; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 return TRUE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 static void translation_buf_decode(struct message_decoder_context *ctx, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 const unsigned char **data, size_t *size) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 { |
18151
e49a2e800650
lib-mail: Replaced MAX_TRANSLATION_BUF_SIZE with the new CHARSET_MAX_PENDING_BUF_SIZE
Timo Sirainen <tss@iki.fi>
parents:
18146
diff
changeset
|
203 unsigned char trans_buf[CHARSET_MAX_PENDING_BUF_SIZE+1]; |
21322
5ab8dc1a4a6f
global: Change string position/length from unsigned int to size_t
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20891
diff
changeset
|
204 size_t data_wanted, skip; |
16074
cf7b590d19f9
message-decoder: Fixed assert-crash when trying to decode partial character twice.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
205 size_t trans_size, orig_size; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 |
6832 | 207 /* @UNSAFE: move the previously untranslated bytes to trans_buf |
208 and see if we have now enough data to get the next character | |
209 translated */ | |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 memcpy(trans_buf, ctx->translation_buf, ctx->translation_size); |
6832 | 211 data_wanted = sizeof(trans_buf) - ctx->translation_size; |
212 if (data_wanted > *size) | |
213 data_wanted = *size; | |
214 memcpy(trans_buf + ctx->translation_size, *data, data_wanted); | |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 |
16074
cf7b590d19f9
message-decoder: Fixed assert-crash when trying to decode partial character twice.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
216 orig_size = trans_size = ctx->translation_size + data_wanted; |
6832 | 217 (void)charset_to_utf8(ctx->charset_trans, trans_buf, |
218 &trans_size, ctx->buf2); | |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 |
16075
311371856dcf
message-decode: Minor fix to previous change.
Timo Sirainen <tss@iki.fi>
parents:
16074
diff
changeset
|
220 if (trans_size <= ctx->translation_size) { |
16074
cf7b590d19f9
message-decoder: Fixed assert-crash when trying to decode partial character twice.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
221 /* need more data to finish the translation. */ |
18151
e49a2e800650
lib-mail: Replaced MAX_TRANSLATION_BUF_SIZE with the new CHARSET_MAX_PENDING_BUF_SIZE
Timo Sirainen <tss@iki.fi>
parents:
18146
diff
changeset
|
222 i_assert(orig_size < CHARSET_MAX_PENDING_BUF_SIZE); |
16074
cf7b590d19f9
message-decoder: Fixed assert-crash when trying to decode partial character twice.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
223 memcpy(ctx->translation_buf, trans_buf, orig_size); |
cf7b590d19f9
message-decoder: Fixed assert-crash when trying to decode partial character twice.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
224 ctx->translation_size = orig_size; |
cf7b590d19f9
message-decoder: Fixed assert-crash when trying to decode partial character twice.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
225 *data += *size; |
cf7b590d19f9
message-decoder: Fixed assert-crash when trying to decode partial character twice.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
226 *size = 0; |
cf7b590d19f9
message-decoder: Fixed assert-crash when trying to decode partial character twice.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
227 return; |
cf7b590d19f9
message-decoder: Fixed assert-crash when trying to decode partial character twice.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
228 } |
6832 | 229 skip = trans_size - ctx->translation_size; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 i_assert(*size >= skip); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 *data += skip; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 *size -= skip; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 ctx->translation_size = 0; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
238 static void |
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
239 message_decode_body_init_charset(struct message_decoder_context *ctx, |
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
240 struct message_part *part) |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
241 { |
9360
fd3c13b9837b
Message-decoder: Fixes to handling binary body parts.
Timo Sirainen <tss@iki.fi>
parents:
9322
diff
changeset
|
242 ctx->binary_input = ctx->content_charset == NULL && |
fd3c13b9837b
Message-decoder: Fixes to handling binary body parts.
Timo Sirainen <tss@iki.fi>
parents:
9322
diff
changeset
|
243 (ctx->flags & MESSAGE_DECODER_FLAG_RETURN_BINARY) != 0 && |
fd3c13b9837b
Message-decoder: Fixes to handling binary body parts.
Timo Sirainen <tss@iki.fi>
parents:
9322
diff
changeset
|
244 (part->flags & (MESSAGE_PART_FLAG_TEXT | |
fd3c13b9837b
Message-decoder: Fixes to handling binary body parts.
Timo Sirainen <tss@iki.fi>
parents:
9322
diff
changeset
|
245 MESSAGE_PART_FLAG_MESSAGE_RFC822)) == 0; |
fd3c13b9837b
Message-decoder: Fixes to handling binary body parts.
Timo Sirainen <tss@iki.fi>
parents:
9322
diff
changeset
|
246 |
18146
e3640ccaa76d
lib-mail: message-decoder no longer skips lib-charset for UTF8 -> UTF8 translations.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
247 if (ctx->binary_input) |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
248 return; |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
249 |
9360
fd3c13b9837b
Message-decoder: Fixes to handling binary body parts.
Timo Sirainen <tss@iki.fi>
parents:
9322
diff
changeset
|
250 if (ctx->charset_trans != NULL && ctx->content_charset != NULL && |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
251 strcasecmp(ctx->content_charset, ctx->charset_trans_charset) == 0) { |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
252 /* already have the correct translation selected */ |
18721
9809f68aaa36
lib-mail: Make sure iconv state is reset between MIME parts.
Timo Sirainen <tss@iki.fi>
parents:
18506
diff
changeset
|
253 charset_to_utf8_reset(ctx->charset_trans); |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
254 return; |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
255 } |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
256 |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
257 if (ctx->charset_trans != NULL) |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
258 charset_to_utf8_end(&ctx->charset_trans); |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
259 i_free_and_null(ctx->charset_trans_charset); |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
260 |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
261 ctx->charset_trans_charset = i_strdup(ctx->content_charset != NULL ? |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
262 ctx->content_charset : "UTF-8"); |
15053
c976a9c01613
Replaced "decomposed titlecase" conversions with more generic normalizer function.
Timo Sirainen <tss@iki.fi>
parents:
14857
diff
changeset
|
263 if (charset_to_utf8_begin(ctx->charset_trans_charset, ctx->normalizer, |
c976a9c01613
Replaced "decomposed titlecase" conversions with more generic normalizer function.
Timo Sirainen <tss@iki.fi>
parents:
14857
diff
changeset
|
264 &ctx->charset_trans) < 0) |
18152
38e807433e2f
lib-mail: Fixed crash in message-decoder with unknown charsets.
Timo Sirainen <tss@iki.fi>
parents:
18151
diff
changeset
|
265 ctx->charset_trans = charset_utf8_to_utf8_begin(ctx->normalizer); |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
266 } |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
267 |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 static bool message_decode_body(struct message_decoder_context *ctx, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
269 struct message_block *input, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 struct message_block *output) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 const unsigned char *data = NULL; |
11074
c32f55615055
Small code changes to make static analyzer happier.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
273 size_t pos = 0, size = 0; |
18506
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
274 const char *error; |
5510 | 275 int ret; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 |
18506
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
277 if (ctx->encoding_buf->used != 0) |
9664
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
278 buffer_append(ctx->encoding_buf, input->data, input->size); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
279 |
14857
624107158354
lib-mail: Added message_decoder_parse_cte()
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
280 switch (ctx->message_cte) { |
624107158354
lib-mail: Added message_decoder_parse_cte()
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
281 case MESSAGE_CTE_UNKNOWN: |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 /* just skip this body */ |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
283 return FALSE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
284 |
14857
624107158354
lib-mail: Added message_decoder_parse_cte()
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
285 case MESSAGE_CTE_78BIT: |
624107158354
lib-mail: Added message_decoder_parse_cte()
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
286 case MESSAGE_CTE_BINARY: |
18506
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
287 i_assert(ctx->encoding_buf->used == 0); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
288 data = input->data; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 size = pos = input->size; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
290 break; |
18506
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
291 case MESSAGE_CTE_QP: { |
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
292 i_assert(ctx->encoding_buf->used == 0); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
293 buffer_set_used_size(ctx->buf, 0); |
18506
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
294 if (ctx->qp == NULL) |
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
295 ctx->qp = qp_decoder_init(ctx->buf); |
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
296 (void)qp_decoder_more(ctx->qp, input->data, input->size, |
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
297 &pos, &error); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 data = ctx->buf->data; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 size = ctx->buf->used; |
18506
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
300 /* eat away all input. qp-decoder buffers it internally. */ |
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
301 pos = input->size; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
302 break; |
18506
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
303 } |
14857
624107158354
lib-mail: Added message_decoder_parse_cte()
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
304 case MESSAGE_CTE_BASE64: |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 buffer_set_used_size(ctx->buf, 0); |
9664
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
306 if (ctx->encoding_buf->used != 0) { |
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
307 ret = base64_decode(ctx->encoding_buf->data, |
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
308 ctx->encoding_buf->used, |
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
309 &pos, ctx->buf); |
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
310 } else { |
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
311 ret = base64_decode(input->data, input->size, |
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
312 &pos, ctx->buf); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
313 } |
5510 | 314 if (ret < 0) { |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 /* corrupted base64 data, don't bother with |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 the rest of it */ |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 return FALSE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 } |
5510 | 319 if (ret == 0) { |
4885 | 320 /* end of base64 input */ |
9664
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
321 pos = input->size; |
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
322 buffer_set_used_size(ctx->encoding_buf, 0); |
4885 | 323 } |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 data = ctx->buf->data; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 size = ctx->buf->used; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 break; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
328 |
9664
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
329 if (ctx->encoding_buf->used != 0) |
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
330 buffer_delete(ctx->encoding_buf, 0, pos); |
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
331 else if (pos != input->size) { |
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
332 buffer_append(ctx->encoding_buf, |
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
333 input->data + pos, input->size - pos); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
336 if (ctx->binary_input) { |
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
337 output->data = data; |
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
338 output->size = size; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 } else { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
340 buffer_set_used_size(ctx->buf2, 0); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
341 if (ctx->translation_size != 0) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 translation_buf_decode(ctx, &data, &size); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 pos = size; |
6122
d86581f4a0c6
charset_to_utf8() isn't used anymore, so renamed charset_to_utf8_full() to it.
Timo Sirainen <tss@iki.fi>
parents:
6118
diff
changeset
|
345 (void)charset_to_utf8(ctx->charset_trans, |
d86581f4a0c6
charset_to_utf8() isn't used anymore, so renamed charset_to_utf8_full() to it.
Timo Sirainen <tss@iki.fi>
parents:
6118
diff
changeset
|
346 data, &pos, ctx->buf2); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
347 if (pos != size) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
348 ctx->translation_size = size - pos; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
349 i_assert(ctx->translation_size <= |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
350 sizeof(ctx->translation_buf)); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
351 memcpy(ctx->translation_buf, data + pos, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
352 ctx->translation_size); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
353 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
354 output->data = ctx->buf2->data; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
355 output->size = ctx->buf2->used; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
356 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
357 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
358 output->hdr = NULL; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
359 return TRUE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
360 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
361 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
362 bool message_decoder_decode_next_block(struct message_decoder_context *ctx, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
363 struct message_block *input, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
364 struct message_block *output) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
365 { |
5410
73032525bca0
Don't try to access output variable's contents. They are undefined at least
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
366 if (input->part != ctx->prev_part) { |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
367 /* MIME part changed. */ |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
368 message_decoder_decode_reset(ctx); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
369 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
370 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
371 output->part = input->part; |
5410
73032525bca0
Don't try to access output variable's contents. They are undefined at least
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
372 ctx->prev_part = input->part; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
373 |
18153
7250ccf9ab4c
lib-mail: message-decoder now always sets output->size=0 when headers are returned.
Timo Sirainen <tss@iki.fi>
parents:
18152
diff
changeset
|
374 if (input->hdr != NULL) { |
7250ccf9ab4c
lib-mail: message-decoder now always sets output->size=0 when headers are returned.
Timo Sirainen <tss@iki.fi>
parents:
18152
diff
changeset
|
375 output->size = 0; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
376 return message_decode_header(ctx, input->hdr, output); |
18153
7250ccf9ab4c
lib-mail: message-decoder now always sets output->size=0 when headers are returned.
Timo Sirainen <tss@iki.fi>
parents:
18152
diff
changeset
|
377 } else if (input->size != 0) |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
378 return message_decode_body(ctx, input, output); |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
379 else { |
6942 | 380 output->hdr = NULL; |
381 output->size = 0; | |
9322
ce612bdafc84
message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
382 message_decode_body_init_charset(ctx, input->part); |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
383 return TRUE; |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
384 } |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
385 } |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
386 |
18154
55555824f636
lib-mail: Added message_decoder_current_content_type()
Timo Sirainen <tss@iki.fi>
parents:
18153
diff
changeset
|
387 const char * |
55555824f636
lib-mail: Added message_decoder_current_content_type()
Timo Sirainen <tss@iki.fi>
parents:
18153
diff
changeset
|
388 message_decoder_current_content_type(struct message_decoder_context *ctx) |
55555824f636
lib-mail: Added message_decoder_current_content_type()
Timo Sirainen <tss@iki.fi>
parents:
18153
diff
changeset
|
389 { |
55555824f636
lib-mail: Added message_decoder_current_content_type()
Timo Sirainen <tss@iki.fi>
parents:
18153
diff
changeset
|
390 return ctx->content_type; |
55555824f636
lib-mail: Added message_decoder_current_content_type()
Timo Sirainen <tss@iki.fi>
parents:
18153
diff
changeset
|
391 } |
55555824f636
lib-mail: Added message_decoder_current_content_type()
Timo Sirainen <tss@iki.fi>
parents:
18153
diff
changeset
|
392 |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
393 void message_decoder_decode_reset(struct message_decoder_context *ctx) |
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
394 { |
18506
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
395 const char *error; |
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
396 |
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
397 if (ctx->qp != NULL) |
b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
Timo Sirainen <tss@iki.fi>
parents:
18154
diff
changeset
|
398 (void)qp_decoder_finish(ctx->qp, &error); |
18154
55555824f636
lib-mail: Added message_decoder_current_content_type()
Timo Sirainen <tss@iki.fi>
parents:
18153
diff
changeset
|
399 i_free_and_null(ctx->content_type); |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
400 i_free_and_null(ctx->content_charset); |
14857
624107158354
lib-mail: Added message_decoder_parse_cte()
Timo Sirainen <tss@iki.fi>
parents:
14689
diff
changeset
|
401 ctx->message_cte = MESSAGE_CTE_78BIT; |
9664
4c255c7b6245
message-decoder: Fixed assert-crashes caused by the previous quoted-printable change.
Timo Sirainen <tss@iki.fi>
parents:
9360
diff
changeset
|
402 buffer_set_used_size(ctx->encoding_buf, 0); |
6916
0b8a78914db7
Message decoding wasn't reset properly between messages when searching.
Timo Sirainen <tss@iki.fi>
parents:
6915
diff
changeset
|
403 } |