diff options
Diffstat (limited to '')
-rwxr-xr-x[-rw-r--r--] | src/mime.c | 165 |
1 files changed, 148 insertions, 17 deletions
diff --git a/src/mime.c b/src/mime.c index ed44104..05602f5 100644..100755 --- a/src/mime.c +++ b/src/mime.c | |||
@@ -2,13 +2,10 @@ | |||
2 | * MIME support functions | 2 | * MIME support functions |
3 | * LuaSocket toolkit | 3 | * LuaSocket toolkit |
4 | \*=========================================================================*/ | 4 | \*=========================================================================*/ |
5 | #include <string.h> | 5 | #include "luasocket.h" |
6 | |||
7 | #include "lua.h" | ||
8 | #include "lauxlib.h" | ||
9 | #include "compat.h" | ||
10 | |||
11 | #include "mime.h" | 6 | #include "mime.h" |
7 | #include <string.h> | ||
8 | #include <ctype.h> | ||
12 | 9 | ||
13 | /*=========================================================================*\ | 10 | /*=========================================================================*\ |
14 | * Don't want to trust escape character constants | 11 | * Don't want to trust escape character constants |
@@ -30,12 +27,12 @@ static int mime_global_eol(lua_State *L); | |||
30 | static int mime_global_dot(lua_State *L); | 27 | static int mime_global_dot(lua_State *L); |
31 | 28 | ||
32 | static size_t dot(int c, size_t state, luaL_Buffer *buffer); | 29 | static size_t dot(int c, size_t state, luaL_Buffer *buffer); |
33 | static void b64setup(UC *base); | 30 | /*static void b64setup(UC *base);*/ |
34 | static size_t b64encode(UC c, UC *input, size_t size, luaL_Buffer *buffer); | 31 | static size_t b64encode(UC c, UC *input, size_t size, luaL_Buffer *buffer); |
35 | static size_t b64pad(const UC *input, size_t size, luaL_Buffer *buffer); | 32 | static size_t b64pad(const UC *input, size_t size, luaL_Buffer *buffer); |
36 | static size_t b64decode(UC c, UC *input, size_t size, luaL_Buffer *buffer); | 33 | static size_t b64decode(UC c, UC *input, size_t size, luaL_Buffer *buffer); |
37 | 34 | ||
38 | static void qpsetup(UC *class, UC *unbase); | 35 | /*static void qpsetup(UC *class, UC *unbase);*/ |
39 | static void qpquote(UC c, luaL_Buffer *buffer); | 36 | static void qpquote(UC c, luaL_Buffer *buffer); |
40 | static size_t qpdecode(UC c, UC *input, size_t size, luaL_Buffer *buffer); | 37 | static size_t qpdecode(UC c, UC *input, size_t size, luaL_Buffer *buffer); |
41 | static size_t qpencode(UC c, UC *input, size_t size, | 38 | static size_t qpencode(UC c, UC *input, size_t size, |
@@ -58,17 +55,111 @@ static luaL_Reg func[] = { | |||
58 | /*-------------------------------------------------------------------------*\ | 55 | /*-------------------------------------------------------------------------*\ |
59 | * Quoted-printable globals | 56 | * Quoted-printable globals |
60 | \*-------------------------------------------------------------------------*/ | 57 | \*-------------------------------------------------------------------------*/ |
61 | static UC qpclass[256]; | ||
62 | static UC qpbase[] = "0123456789ABCDEF"; | ||
63 | static UC qpunbase[256]; | ||
64 | enum {QP_PLAIN, QP_QUOTED, QP_CR, QP_IF_LAST}; | 58 | enum {QP_PLAIN, QP_QUOTED, QP_CR, QP_IF_LAST}; |
65 | 59 | ||
60 | static const UC qpclass[] = { | ||
61 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
62 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_IF_LAST, QP_QUOTED, QP_QUOTED, | ||
63 | QP_QUOTED, QP_CR, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
64 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
65 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
66 | QP_QUOTED, QP_QUOTED, QP_IF_LAST, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
67 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
68 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
69 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
70 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
71 | QP_PLAIN, QP_QUOTED, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
72 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
73 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
74 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
75 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
76 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
77 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
78 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
79 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
80 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
81 | QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, QP_PLAIN, | ||
82 | QP_PLAIN, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
83 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
84 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
85 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
86 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
87 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
88 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
89 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
90 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
91 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
92 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
93 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
94 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
95 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
96 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
97 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
98 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
99 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
100 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
101 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
102 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED, | ||
103 | QP_QUOTED, QP_QUOTED, QP_QUOTED, QP_QUOTED | ||
104 | }; | ||
105 | |||
106 | static const UC qpbase[] = "0123456789ABCDEF"; | ||
107 | |||
108 | static const UC qpunbase[] = { | ||
109 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
110 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
111 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
112 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
113 | 255, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255, | ||
114 | 255, 255, 255, 255, 255, 255, 10, 11, 12, 13, 14, 15, | ||
115 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
116 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
117 | 255, 255, 255, 255, 10, 11, 12, 13, 14, 15, 255, 255, | ||
118 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
119 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
120 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
121 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
122 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
123 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
124 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
125 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
126 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
127 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
128 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
129 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
130 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
131 | 255, 255, 255, 255, 255, 255, 255, 255 | ||
132 | }; | ||
133 | |||
66 | /*-------------------------------------------------------------------------*\ | 134 | /*-------------------------------------------------------------------------*\ |
67 | * Base64 globals | 135 | * Base64 globals |
68 | \*-------------------------------------------------------------------------*/ | 136 | \*-------------------------------------------------------------------------*/ |
69 | static const UC b64base[] = | 137 | static const UC b64base[] = |
70 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | 138 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; |
71 | static UC b64unbase[256]; | 139 | |
140 | static const UC b64unbase[] = { | ||
141 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
142 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
143 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
144 | 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63, | ||
145 | 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 0, | ||
146 | 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, | ||
147 | 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, | ||
148 | 255, 255, 255, 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, | ||
149 | 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, | ||
150 | 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
151 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
152 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
153 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
154 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
155 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
156 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
157 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
158 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
159 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
160 | 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||
161 | 255, 255 | ||
162 | }; | ||
72 | 163 | ||
73 | /*=========================================================================*\ | 164 | /*=========================================================================*\ |
74 | * Exported functions | 165 | * Exported functions |
@@ -76,7 +167,7 @@ static UC b64unbase[256]; | |||
76 | /*-------------------------------------------------------------------------*\ | 167 | /*-------------------------------------------------------------------------*\ |
77 | * Initializes module | 168 | * Initializes module |
78 | \*-------------------------------------------------------------------------*/ | 169 | \*-------------------------------------------------------------------------*/ |
79 | MIME_API int luaopen_mime_core(lua_State *L) | 170 | LUASOCKET_API int luaopen_mime_core(lua_State *L) |
80 | { | 171 | { |
81 | lua_newtable(L); | 172 | lua_newtable(L); |
82 | luaL_setfuncs(L, func, 0); | 173 | luaL_setfuncs(L, func, 0); |
@@ -85,8 +176,8 @@ MIME_API int luaopen_mime_core(lua_State *L) | |||
85 | lua_pushstring(L, MIME_VERSION); | 176 | lua_pushstring(L, MIME_VERSION); |
86 | lua_rawset(L, -3); | 177 | lua_rawset(L, -3); |
87 | /* initialize lookup tables */ | 178 | /* initialize lookup tables */ |
88 | qpsetup(qpclass, qpunbase); | 179 | /*qpsetup(qpclass, qpunbase);*/ |
89 | b64setup(b64unbase); | 180 | /*b64setup(b64unbase);*/ |
90 | return 1; | 181 | return 1; |
91 | } | 182 | } |
92 | 183 | ||
@@ -142,6 +233,7 @@ static int mime_global_wrp(lua_State *L) | |||
142 | return 2; | 233 | return 2; |
143 | } | 234 | } |
144 | 235 | ||
236 | #if 0 | ||
145 | /*-------------------------------------------------------------------------*\ | 237 | /*-------------------------------------------------------------------------*\ |
146 | * Fill base64 decode map. | 238 | * Fill base64 decode map. |
147 | \*-------------------------------------------------------------------------*/ | 239 | \*-------------------------------------------------------------------------*/ |
@@ -151,7 +243,14 @@ static void b64setup(UC *unbase) | |||
151 | for (i = 0; i <= 255; i++) unbase[i] = (UC) 255; | 243 | for (i = 0; i <= 255; i++) unbase[i] = (UC) 255; |
152 | for (i = 0; i < 64; i++) unbase[b64base[i]] = (UC) i; | 244 | for (i = 0; i < 64; i++) unbase[b64base[i]] = (UC) i; |
153 | unbase['='] = 0; | 245 | unbase['='] = 0; |
246 | |||
247 | printf("static const UC b64unbase[] = {\n"); | ||
248 | for (int i = 0; i < 256; i++) { | ||
249 | printf("%d, ", unbase[i]); | ||
250 | } | ||
251 | printf("\n}\n;"); | ||
154 | } | 252 | } |
253 | #endif | ||
155 | 254 | ||
156 | /*-------------------------------------------------------------------------*\ | 255 | /*-------------------------------------------------------------------------*\ |
157 | * Acumulates bytes in input buffer until 3 bytes are available. | 256 | * Acumulates bytes in input buffer until 3 bytes are available. |
@@ -345,12 +444,14 @@ static int mime_global_unb64(lua_State *L) | |||
345 | * To encode one byte, we need to see the next two. | 444 | * To encode one byte, we need to see the next two. |
346 | * Worst case is when we see a space, and wonder if a CRLF is comming | 445 | * Worst case is when we see a space, and wonder if a CRLF is comming |
347 | \*-------------------------------------------------------------------------*/ | 446 | \*-------------------------------------------------------------------------*/ |
447 | #if 0 | ||
348 | /*-------------------------------------------------------------------------*\ | 448 | /*-------------------------------------------------------------------------*\ |
349 | * Split quoted-printable characters into classes | 449 | * Split quoted-printable characters into classes |
350 | * Precompute reverse map for encoding | 450 | * Precompute reverse map for encoding |
351 | \*-------------------------------------------------------------------------*/ | 451 | \*-------------------------------------------------------------------------*/ |
352 | static void qpsetup(UC *cl, UC *unbase) | 452 | static void qpsetup(UC *cl, UC *unbase) |
353 | { | 453 | { |
454 | |||
354 | int i; | 455 | int i; |
355 | for (i = 0; i < 256; i++) cl[i] = QP_QUOTED; | 456 | for (i = 0; i < 256; i++) cl[i] = QP_QUOTED; |
356 | for (i = 33; i <= 60; i++) cl[i] = QP_PLAIN; | 457 | for (i = 33; i <= 60; i++) cl[i] = QP_PLAIN; |
@@ -367,7 +468,37 @@ static void qpsetup(UC *cl, UC *unbase) | |||
367 | unbase['c'] = 12; unbase['D'] = 13; unbase['d'] = 13; | 468 | unbase['c'] = 12; unbase['D'] = 13; unbase['d'] = 13; |
368 | unbase['E'] = 14; unbase['e'] = 14; unbase['F'] = 15; | 469 | unbase['E'] = 14; unbase['e'] = 14; unbase['F'] = 15; |
369 | unbase['f'] = 15; | 470 | unbase['f'] = 15; |
471 | |||
472 | printf("static UC qpclass[] = {"); | ||
473 | for (int i = 0; i < 256; i++) { | ||
474 | if (i % 6 == 0) { | ||
475 | printf("\n "); | ||
476 | } | ||
477 | switch(cl[i]) { | ||
478 | case QP_QUOTED: | ||
479 | printf("QP_QUOTED, "); | ||
480 | break; | ||
481 | case QP_PLAIN: | ||
482 | printf("QP_PLAIN, "); | ||
483 | break; | ||
484 | case QP_CR: | ||
485 | printf("QP_CR, "); | ||
486 | break; | ||
487 | case QP_IF_LAST: | ||
488 | printf("QP_IF_LAST, "); | ||
489 | break; | ||
490 | } | ||
491 | } | ||
492 | printf("\n};\n"); | ||
493 | |||
494 | printf("static const UC qpunbase[] = {"); | ||
495 | for (int i = 0; i < 256; i++) { | ||
496 | int c = qpunbase[i]; | ||
497 | printf("%d, ", c); | ||
498 | } | ||
499 | printf("\";\n"); | ||
370 | } | 500 | } |
501 | #endif | ||
371 | 502 | ||
372 | /*-------------------------------------------------------------------------*\ | 503 | /*-------------------------------------------------------------------------*\ |
373 | * Output one character in form =XX | 504 | * Output one character in form =XX |
@@ -447,7 +578,6 @@ static size_t qppad(UC *input, size_t size, luaL_Buffer *buffer) | |||
447 | \*-------------------------------------------------------------------------*/ | 578 | \*-------------------------------------------------------------------------*/ |
448 | static int mime_global_qp(lua_State *L) | 579 | static int mime_global_qp(lua_State *L) |
449 | { | 580 | { |
450 | |||
451 | size_t asize = 0, isize = 0; | 581 | size_t asize = 0, isize = 0; |
452 | UC atom[3]; | 582 | UC atom[3]; |
453 | const UC *input = (const UC *) luaL_optlstring(L, 1, NULL, &isize); | 583 | const UC *input = (const UC *) luaL_optlstring(L, 1, NULL, &isize); |
@@ -654,7 +784,7 @@ static int eolprocess(int c, int last, const char *marker, | |||
654 | \*-------------------------------------------------------------------------*/ | 784 | \*-------------------------------------------------------------------------*/ |
655 | static int mime_global_eol(lua_State *L) | 785 | static int mime_global_eol(lua_State *L) |
656 | { | 786 | { |
657 | int ctx = luaL_checkinteger(L, 1); | 787 | int ctx = (int) luaL_checkinteger(L, 1); |
658 | size_t isize = 0; | 788 | size_t isize = 0; |
659 | const char *input = luaL_optlstring(L, 2, NULL, &isize); | 789 | const char *input = luaL_optlstring(L, 2, NULL, &isize); |
660 | const char *last = input + isize; | 790 | const char *last = input + isize; |
@@ -689,6 +819,7 @@ static size_t dot(int c, size_t state, luaL_Buffer *buffer) | |||
689 | case '.': | 819 | case '.': |
690 | if (state == 2) | 820 | if (state == 2) |
691 | luaL_addchar(buffer, '.'); | 821 | luaL_addchar(buffer, '.'); |
822 | /* Falls through. */ | ||
692 | default: | 823 | default: |
693 | return 0; | 824 | return 0; |
694 | } | 825 | } |