message-header-decode.c revision 847aeef259d42e2f14cf126699e28291e6e1fb53
a8c5a86d183db25a57bf193c06b41e092ec2e151Timo Sirainen/* Copyright (C) 2002 Timo Sirainen */
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainenstatic int split_encoded(const unsigned char *data, size_t *size_p,
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen const unsigned char **text, size_t *text_size_r)
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen /* get charset */
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen for (pos = 0; pos < size && data[pos] != '?'; pos++) ;
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen /* get encoding */
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen else if (data[pos] == 'B' || data[pos] == 'b')
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen /* get text */
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen if (data[pos] != '?' || pos+1 >= size || data[pos+1] != '=')
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainenmessage_header_decode_encoded(const unsigned char *data, size_t *size,
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen const unsigned char *text;
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen /* first split the string charset?encoding?text?= */
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen if (!split_encoded(data, size, &charset, &encoding,
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen decodebuf = buffer_create_static_hard(data_stack_pool, text_size);
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen quoted_printable_decode(text, text_size, NULL, decodebuf);
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen if (base64_decode(text, text_size, NULL, decodebuf) < 0) {
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen /* corrupted encoding */
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen buffer_get_used_size(decodebuf), charset, context);
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainenvoid message_header_decode(const unsigned char *data, size_t size,
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen if (data[pos] == '=' && pos+1 < size && data[pos+1] == '?') {
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen /* encoded string beginning */
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen /* send the unencoded data so far */
96f89d51e8315f644f46804a9f0fc4f685ac48bfTimo Sirainen if (!message_header_decode_encoded(data + pos, &subsize,