Mercurial > dovecot > core-2.2
annotate src/lib-mail/message-decoder.c @ 5511:518a77f3bf49 HEAD
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
it to uppercase all the output.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 03 Apr 2007 21:03:55 +0300 |
parents | 93e9e081855a |
children | 7b6511e67476 |
rev | line source |
---|---|
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (C) 2006 Timo Sirainen */ |
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 "strescape.h" |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "base64.h" |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "charset-utf8.h" |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "quoted-printable.h" |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #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
|
10 #include "message-content-parser.h" |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #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
|
12 #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
|
13 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 enum content_type { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 CONTENT_TYPE_UNKNOWN = 0, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 CONTENT_TYPE_BINARY, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 CONTENT_TYPE_QP, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 CONTENT_TYPE_BASE64 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 }; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 |
4885 | 21 /* base64 takes max 4 bytes per character, q-p takes max 3. */ |
22 #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
|
23 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 /* UTF-8 takes max 5 bytes per character. Not sure about others, but I'd think |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 10 is more than enough for everyone.. */ |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 #define MAX_TRANSLATION_BUF_SIZE 10 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 struct message_decoder_context { |
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
|
29 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
|
30 |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 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
|
32 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
|
33 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 struct charset_translation *charset_trans; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 char translation_buf[MAX_TRANSLATION_BUF_SIZE]; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 unsigned int translation_size; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 char encoding_buf[MAX_ENCODING_BUF_SIZE]; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 unsigned int encoding_size; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 char *content_charset; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 enum content_type content_type; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 unsigned int charset_utf8:1; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 }; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 |
5511
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
47 struct message_decoder_context *message_decoder_init_ucase(void) |
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); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 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
|
53 ctx->buf2 = 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
|
54 return ctx; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 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
|
58 { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 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
|
60 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 *_ctx = NULL; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 |
4888 | 63 if (ctx->charset_trans != NULL) |
64 charset_to_utf8_end(&ctx->charset_trans); | |
65 | |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 buffer_free(ctx->buf); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 buffer_free(ctx->buf2); |
4888 | 68 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
|
69 i_free(ctx); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 static bool |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 message_decode_header_callback(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
|
74 const char *charset, void *context) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 struct message_decoder_context *ctx = context; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 struct charset_translation *t; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 bool unknown_charset; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 |
5511
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
80 if (charset == NULL || charset_is_utf8(charset)) { |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 /* ASCII */ |
5511
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
82 _charset_utf8_ucase(data, size, ctx->buf, ctx->buf->used); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 return TRUE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 t = charset_to_utf8_begin(charset, &unknown_charset); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 if (unknown_charset) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 /* let's just ignore this part */ |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 return TRUE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 /* ignore any errors */ |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 (void)charset_to_ucase_utf8_full(t, data, &size, ctx->buf); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 charset_to_utf8_end(&t); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 return TRUE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 static void parse_content_encoding(const unsigned char *value, size_t value_len, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 void *context) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 struct message_decoder_context *ctx = context; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 ctx->content_type = CONTENT_TYPE_UNKNOWN; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 switch (value_len) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 case 4: |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 if (memcasecmp(value, "7bit", 4) == 0 || |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 memcasecmp(value, "8bit", 4) == 0) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 ctx->content_type = CONTENT_TYPE_BINARY; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 break; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 case 6: |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 if (memcasecmp(value, "base64", 6) == 0) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 ctx->content_type = CONTENT_TYPE_BASE64; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 else if (memcasecmp(value, "binary", 6) == 0) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 ctx->content_type = CONTENT_TYPE_BINARY; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 break; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 case 16: |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 if (memcasecmp(value, "quoted-printable", 16) == 0) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 ctx->content_type = CONTENT_TYPE_QP; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 break; |
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 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 static void |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 parse_content_type_param(const unsigned char *name, size_t name_len, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 const unsigned char *value, size_t value_len, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 bool value_quoted, void *context) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 struct message_decoder_context *ctx = context; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 if (name_len == 7 && memcasecmp(name, "charset", 7) == 0 && |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 ctx->content_charset == NULL) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 ctx->content_charset = i_strndup(value, value_len); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 if (value_quoted) str_unescape(ctx->content_charset); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 ctx->charset_utf8 = charset_is_utf8(ctx->content_charset); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 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
|
141 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
|
142 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
|
143 { |
5511
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
144 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
|
145 |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 if (hdr->continues) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 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
|
148 return FALSE; |
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 if (hdr->name_len == 12 && |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 strcasecmp(hdr->name, "Content-Type") == 0) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 message_content_parse_header(hdr->full_value, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 hdr->full_value_len, |
4903
204d7edc7cdc
Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents:
4888
diff
changeset
|
155 null_parse_content_callback, |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 parse_content_type_param, ctx); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 if (hdr->name_len == 25 && |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 strcasecmp(hdr->name, "Content-Transfer-Encoding") == 0) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 message_content_parse_header(hdr->full_value, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 hdr->full_value_len, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 parse_content_encoding, |
4903
204d7edc7cdc
Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents:
4888
diff
changeset
|
163 null_parse_content_param_callback, |
204d7edc7cdc
Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents:
4888
diff
changeset
|
164 ctx); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 buffer_set_used_size(ctx->buf, 0); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 message_header_decode(hdr->full_value, hdr->full_value_len, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 message_decode_header_callback, ctx); |
5511
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
170 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
|
171 |
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
172 _charset_utf8_ucase((const unsigned char *)hdr->name, hdr->name_len, |
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
173 ctx->buf, ctx->buf->used); |
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
174 buffer_append_c(ctx->buf, '\0'); |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 ctx->hdr = *hdr; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 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
|
178 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
|
179 ctx->hdr.value_len = 0; |
5511
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
180 ctx->hdr.name = CONST_PTR_OFFSET(ctx->buf->data, |
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
181 ctx->hdr.full_value_len); |
518a77f3bf49
Renamed message_decoder_init() to message_decoder_init_ucase() and changed
Timo Sirainen <tss@iki.fi>
parents:
5510
diff
changeset
|
182 ctx->hdr.name_len = ctx->buf->used - 1 - value_len; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 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
|
185 return TRUE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 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
|
189 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
|
190 { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 unsigned char trans_buf[MAX_TRANSLATION_BUF_SIZE+1]; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 size_t pos, skip; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 /* @UNSAFE */ |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 memcpy(trans_buf, ctx->translation_buf, ctx->translation_size); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 skip = sizeof(trans_buf) - ctx->translation_size; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 if (skip > *size) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 skip = *size; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 memcpy(trans_buf + ctx->translation_size, data, skip); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 pos = *size; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 (void)charset_to_ucase_utf8_full(ctx->charset_trans, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 *data, &pos, ctx->buf2); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 i_assert(pos > ctx->translation_size); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 skip = (ctx->translation_size + skip) - pos; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 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
|
209 *data += skip; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 *size -= skip; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 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
|
213 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 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
|
216 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
|
217 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
|
218 { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 unsigned char new_buf[MAX_ENCODING_BUF_SIZE+1]; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 const unsigned char *data = NULL; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 size_t pos, size = 0, skip = 0; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 bool unknown_charset; |
5510 | 223 int ret; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 if (ctx->charset_trans == NULL && !ctx->charset_utf8) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 ctx->charset_trans = |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 charset_to_utf8_begin(ctx->content_charset != NULL ? |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 ctx->content_charset : "UTF-8", |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 &unknown_charset); |
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 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 if (ctx->encoding_size != 0) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 /* @UNSAFE */ |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 memcpy(new_buf, ctx->encoding_buf, ctx->encoding_size); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 skip = sizeof(new_buf) - ctx->encoding_size; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 if (skip > input->size) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 skip = input->size; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
238 memcpy(new_buf + ctx->encoding_size, input->data, skip); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 switch (ctx->content_type) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
242 case CONTENT_TYPE_UNKNOWN: |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 /* 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
|
244 return FALSE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 case CONTENT_TYPE_BINARY: |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 data = input->data; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
248 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
|
249 break; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 case CONTENT_TYPE_QP: |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 buffer_set_used_size(ctx->buf, 0); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 if (ctx->encoding_size != 0) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
253 quoted_printable_decode(new_buf, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 ctx->encoding_size + skip, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 &pos, ctx->buf); |
5422 | 256 i_assert(pos >= ctx->encoding_size); |
4885 | 257 skip = pos - ctx->encoding_size; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
258 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 |
4885 | 260 quoted_printable_decode(input->data + skip, input->size - skip, |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 &pos, ctx->buf); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 pos += skip; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 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
|
264 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
|
265 break; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
266 case CONTENT_TYPE_BASE64: |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 buffer_set_used_size(ctx->buf, 0); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 if (ctx->encoding_size != 0) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
269 if (base64_decode(new_buf, ctx->encoding_size + skip, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 &pos, ctx->buf) < 0) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 /* 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
|
272 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
|
273 return FALSE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 } |
5422 | 275 i_assert(pos >= ctx->encoding_size); |
4885 | 276 skip = pos - ctx->encoding_size; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 } |
5510 | 278 ret = base64_decode(input->data + skip, input->size - skip, |
279 &pos, ctx->buf); | |
280 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
|
281 /* 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
|
282 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
|
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 } |
5510 | 285 if (ret == 0) { |
4885 | 286 /* end of base64 input */ |
287 pos = input->size - skip; | |
288 } | |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 pos += skip; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
290 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
|
291 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
|
292 break; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
293 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 if (pos != input->size) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
296 /* @UNSAFE */ |
4885 | 297 i_assert(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
|
298 ctx->encoding_size = input->size - pos; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 i_assert(ctx->encoding_size <= sizeof(ctx->encoding_buf)); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 memcpy(ctx->encoding_buf, input->data + pos, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 ctx->encoding_size); |
5422 | 302 } else { |
303 ctx->encoding_size = 0; | |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 |
4708
e3534695b58a
Don't crash with unknown charsets
Timo Sirainen <tss@iki.fi>
parents:
4608
diff
changeset
|
306 if (ctx->charset_utf8 || ctx->charset_trans == NULL) { |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 output->data = data; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 output->size = size; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
309 } else { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 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
|
311 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
|
312 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
|
313 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 pos = size; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 (void)charset_to_ucase_utf8_full(ctx->charset_trans, |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 data, &pos, ctx->buf2); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 if (pos != size) { |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 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
|
319 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
|
320 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
|
321 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
|
322 ctx->translation_size); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 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
|
325 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
|
326 } |
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 output->hdr = NULL; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 return TRUE; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 } |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 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
|
333 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
|
334 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
|
335 { |
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
|
336 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
|
337 /* MIME part changed. */ |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 i_free_and_null(ctx->content_charset); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 ctx->content_type = CONTENT_TYPE_BINARY; |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
340 ctx->charset_utf8 = TRUE; |
4885 | 341 ctx->encoding_size = 0; |
4608
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 } |
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 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
|
345 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
|
346 |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
347 if (input->hdr != NULL) |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
348 return message_decode_header(ctx, input->hdr, output); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
349 else |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
350 return message_decode_body(ctx, input, output); |
61e0fe257a83
Added message-decoder to decode message's contents into readable UTF-8.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
351 } |