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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
Timo Sirainen <tss@iki.fi>
parents: 4708
diff changeset
16 /* base64 takes max 4 bytes per character, q-p takes max 3. */
Timo Sirainen <tss@iki.fi>
parents: 4708
diff changeset
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
c3e15280e4cb Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 4885
diff changeset
66 if (ctx->charset_trans != NULL)
c3e15280e4cb Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 4885
diff changeset
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
c3e15280e4cb Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 4885
diff changeset
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
c3e15280e4cb Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 4885
diff changeset
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
ea4d3778c99b Charset translation fixes
Timo Sirainen <tss@iki.fi>
parents: 6579
diff changeset
207 /* @UNSAFE: move the previously untranslated bytes to trans_buf
ea4d3778c99b Charset translation fixes
Timo Sirainen <tss@iki.fi>
parents: 6579
diff changeset
208 and see if we have now enough data to get the next character
ea4d3778c99b Charset translation fixes
Timo Sirainen <tss@iki.fi>
parents: 6579
diff changeset
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
ea4d3778c99b Charset translation fixes
Timo Sirainen <tss@iki.fi>
parents: 6579
diff changeset
211 data_wanted = sizeof(trans_buf) - ctx->translation_size;
ea4d3778c99b Charset translation fixes
Timo Sirainen <tss@iki.fi>
parents: 6579
diff changeset
212 if (data_wanted > *size)
ea4d3778c99b Charset translation fixes
Timo Sirainen <tss@iki.fi>
parents: 6579
diff changeset
213 data_wanted = *size;
ea4d3778c99b Charset translation fixes
Timo Sirainen <tss@iki.fi>
parents: 6579
diff changeset
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
ea4d3778c99b Charset translation fixes
Timo Sirainen <tss@iki.fi>
parents: 6579
diff changeset
217 (void)charset_to_utf8(ctx->charset_trans, trans_buf,
ea4d3778c99b Charset translation fixes
Timo Sirainen <tss@iki.fi>
parents: 6579
diff changeset
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
ea4d3778c99b Charset translation fixes
Timo Sirainen <tss@iki.fi>
parents: 6579
diff changeset
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
93e9e081855a Fix for base64 handling
Timo Sirainen <tss@iki.fi>
parents: 5422
diff changeset
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
93e9e081855a Fix for base64 handling
Timo Sirainen <tss@iki.fi>
parents: 5422
diff changeset
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
93e9e081855a Fix for base64 handling
Timo Sirainen <tss@iki.fi>
parents: 5422
diff changeset
319 if (ret == 0) {
4885
Timo Sirainen <tss@iki.fi>
parents: 4708
diff changeset
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
Timo Sirainen <tss@iki.fi>
parents: 4708
diff changeset
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
3af80c378959 Crashfix
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
380 output->hdr = NULL;
3af80c378959 Crashfix
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
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 }