Mercurial > dovecot > core-2.2
annotate src/lib-mail/message-decoder.c @ 22713:cb108f786fb4
Updated copyright notices to include the year 2018.
author | Stephan Bosch <stephan.bosch@dovecot.fi> |
---|---|
date | Mon, 01 Jan 2018 22:42:08 +0100 |
parents | 2e2563132d5f |
children | 075c48f8ffb5 |
rev | line source |
---|---|
22713
cb108f786fb4
Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
1 /* Copyright (c) 2006-2018 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 } |