Commit | Line | Data |
---|---|---|
8e669ac1 | 1 | /* $Cambridge: exim/src/src/demime.h,v 1.3 2005/02/17 11:58:26 ph10 Exp $ */ |
8523533c TK |
2 | |
3 | /************************************************* | |
4 | * Exim - an Internet mail transport agent * | |
5 | *************************************************/ | |
6 | ||
7 | /* Copyright (c) Tom Kistner <tom@duncanthrax.net> 2003-???? */ | |
8 | /* License: GPL */ | |
9 | ||
10 | /* demime defines */ | |
11 | ||
12 | #ifdef WITH_OLD_DEMIME | |
13 | ||
14 | #define MIME_DEMUX_MODE_SCANNING 0 | |
15 | #define MIME_DEMUX_MODE_MIME_HEADERS 1 | |
16 | #define MIME_DEMUX_MODE_BASE64 2 | |
17 | #define MIME_DEMUX_MODE_QP 3 | |
18 | #define MIME_DEMUX_MODE_PLAIN 4 | |
19 | ||
20 | #define MIME_UU_MODE_OFF 0 | |
21 | #define MIME_UU_MODE_UNCONFIRMED 1 | |
22 | #define MIME_UU_MODE_CONFIRMED 2 | |
23 | ||
24 | #define MIME_MAX_EXTENSION 128 | |
25 | ||
26 | #define MIME_READ_LINE_EOF 0 | |
27 | #define MIME_READ_LINE_OK 1 | |
28 | #define MIME_READ_LINE_OVERFLOW 2 | |
29 | ||
30 | #define MIME_SANITY_MAX_LINE_LENGTH 131071 | |
31 | #define MIME_SANITY_MAX_FILENAME 512 | |
32 | #define MIME_SANITY_MAX_HEADER_OPTION_VALUE 1024 | |
33 | #define MIME_SANITY_MAX_B64_LINE_LENGTH 76 | |
34 | #define MIME_SANITY_MAX_BOUNDARY_LENGTH 1024 | |
35 | #define MIME_SANITY_MAX_DUMP_FILES 1024 | |
36 | ||
37 | ||
38 | ||
39 | /* MIME errorlevel settings */ | |
40 | ||
41 | #define MIME_ERRORLEVEL_LONG_LINE 3,US"line length in message or single header size exceeds %u bytes",MIME_SANITY_MAX_LINE_LENGTH | |
42 | #define MIME_ERRORLEVEL_TOO_MANY_PARTS 3,US"too many MIME parts (max %u)",MIME_SANITY_MAX_DUMP_FILES | |
43 | #define MIME_ERRORLEVEL_MESSAGE_PARTIAL 3,US"'message/partial' MIME type" | |
44 | #define MIME_ERRORLEVEL_FILENAME_LENGTH 3,US"proposed filename exceeds %u characters",MIME_SANITY_MAX_FILENAME | |
45 | #define MIME_ERRORLEVEL_BOUNDARY_LENGTH 3,US"boundary length exceeds %u characters",MIME_SANITY_MAX_BOUNDARY_LENGTH | |
46 | #define MIME_ERRORLEVEL_DOUBLE_HEADERS 2,US"double headers (content-type, content-disposition or content-transfer-encoding)" | |
47 | #define MIME_ERRORLEVEL_UU_MISALIGNED 1,US"uuencoded line length is not a multiple of 4 characters" | |
48 | #define MIME_ERRORLEVEL_UU_LINE_LENGTH 1,US"uuencoded line length does not match advertised number of bytes" | |
49 | #define MIME_ERRORLEVEL_B64_LINE_LENGTH 1,US"base64 line length exceeds %u characters",MIME_SANITY_MAX_B64_LINE_LENGTH | |
50 | #define MIME_ERRORLEVEL_B64_ILLEGAL_CHAR 2,US"base64 line contains illegal character" | |
51 | #define MIME_ERRORLEVEL_B64_MISALIGNED 1,US"base64 line length is not a multiple of 4 characters" | |
52 | #define MIME_ERRORLEVEL_QP_ILLEGAL_CHAR 1,US"quoted-printable encoding contains illegal character" | |
53 | ||
54 | ||
55 | /* demime structures */ | |
56 | ||
57 | typedef struct mime_part { | |
58 | /* true if there was a content-type header */ | |
59 | int seen_content_type; | |
60 | /* true if there was a content-transfer-encoding header | |
61 | contains the encoding type */ | |
62 | int seen_content_transfer_encoding; | |
63 | /* true if there was a content-disposition header */ | |
64 | int seen_content_disposition; | |
65 | /* pointer to a buffer with the proposed file extension */ | |
66 | uschar *extension; | |
67 | } mime_part; | |
68 | ||
69 | typedef struct boundary { | |
70 | struct boundary *next; | |
71 | uschar *boundary_string; | |
72 | } boundary; | |
73 | ||
74 | typedef struct file_extension { | |
75 | struct file_extension *next; | |
76 | uschar *file_extension_string; | |
77 | } file_extension; | |
78 | ||
79 | /* demime.c prototypes */ | |
80 | ||
81 | unsigned int mime_hstr_i(uschar *); | |
82 | uschar *mime_decode_qp(uschar *, int *); | |
83 | int mime_get_dump_file(uschar *, FILE **, uschar *); | |
84 | int mime_header_find(uschar *, uschar *, uschar **); | |
85 | int mime_read_line(FILE *, int, uschar *, long *); | |
86 | int mime_check_boundary(uschar *, struct boundary *); | |
87 | int mime_check_uu_start(uschar *, uschar *, int *); | |
88 | long uu_decode_line(uschar *, uschar **, long, uschar *); | |
89 | long mime_decode_line(int ,uschar *, uschar **, long, uschar *); | |
90 | void mime_trigger_error(int, uschar *, ...); | |
91 | int mime_demux(FILE *, uschar *); | |
92 | ||
93 | ||
94 | ||
95 | /* BASE64 decoder matrix */ | |
96 | static unsigned char b64[256]={ | |
97 | /* 0 */ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, | |
8e669ac1 | 98 | /* 16 */ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, |
8523533c TK |
99 | /* 32 */ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 62, 128, 128, 128, 63, |
100 | /* 48 */ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 255, 128, 128, | |
101 | /* 64 */ 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, | |
102 | /* 80 */ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 128, 128, 128, 128, 128, | |
103 | /* 96 */ 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, | |
104 | 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, | |
105 | 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, | |
106 | 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, | |
107 | 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, | |
108 | 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, | |
109 | 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, | |
110 | 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, | |
111 | 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, | |
8e669ac1 | 112 | 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 |
8523533c TK |
113 | }; |
114 | ||
115 | ||
116 | /* Microsoft-Style uudecode matrix */ | |
117 | static unsigned char uudec[256]={ | |
8e669ac1 | 118 | /* 0 */ 0, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, |
8523533c TK |
119 | /* 16 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, |
120 | /* 32 */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, | |
121 | /* 48 */ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
122 | /* 64 */ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, | |
123 | /* 80 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, | |
124 | /* 96 */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, | |
125 | /* 112 */ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
126 | /* 128 */ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, | |
127 | /* 144 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, | |
128 | /* 160 */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, | |
129 | /* 176 */ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | |
130 | /* 192 */ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, | |
131 | /* 208 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, | |
132 | /* 224 */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, | |
8e669ac1 | 133 | /* 240 */ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 |
8523533c TK |
134 | }; |
135 | ||
136 | #endif |