aboutsummaryrefslogtreecommitdiff
path: root/src/mime.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-x[-rw-r--r--]src/mime.c165
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);
30static int mime_global_dot(lua_State *L); 27static int mime_global_dot(lua_State *L);
31 28
32static size_t dot(int c, size_t state, luaL_Buffer *buffer); 29static size_t dot(int c, size_t state, luaL_Buffer *buffer);
33static void b64setup(UC *base); 30/*static void b64setup(UC *base);*/
34static size_t b64encode(UC c, UC *input, size_t size, luaL_Buffer *buffer); 31static size_t b64encode(UC c, UC *input, size_t size, luaL_Buffer *buffer);
35static size_t b64pad(const UC *input, size_t size, luaL_Buffer *buffer); 32static size_t b64pad(const UC *input, size_t size, luaL_Buffer *buffer);
36static size_t b64decode(UC c, UC *input, size_t size, luaL_Buffer *buffer); 33static size_t b64decode(UC c, UC *input, size_t size, luaL_Buffer *buffer);
37 34
38static void qpsetup(UC *class, UC *unbase); 35/*static void qpsetup(UC *class, UC *unbase);*/
39static void qpquote(UC c, luaL_Buffer *buffer); 36static void qpquote(UC c, luaL_Buffer *buffer);
40static size_t qpdecode(UC c, UC *input, size_t size, luaL_Buffer *buffer); 37static size_t qpdecode(UC c, UC *input, size_t size, luaL_Buffer *buffer);
41static size_t qpencode(UC c, UC *input, size_t size, 38static 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\*-------------------------------------------------------------------------*/
61static UC qpclass[256];
62static UC qpbase[] = "0123456789ABCDEF";
63static UC qpunbase[256];
64enum {QP_PLAIN, QP_QUOTED, QP_CR, QP_IF_LAST}; 58enum {QP_PLAIN, QP_QUOTED, QP_CR, QP_IF_LAST};
65 59
60static 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
106static const UC qpbase[] = "0123456789ABCDEF";
107
108static 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\*-------------------------------------------------------------------------*/
69static const UC b64base[] = 137static const UC b64base[] =
70 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 138 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
71static UC b64unbase[256]; 139
140static 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\*-------------------------------------------------------------------------*/
79MIME_API int luaopen_mime_core(lua_State *L) 170LUASOCKET_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\*-------------------------------------------------------------------------*/
352static void qpsetup(UC *cl, UC *unbase) 452static 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
472printf("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 }
492printf("\n};\n");
493
494printf("static const UC qpunbase[] = {");
495 for (int i = 0; i < 256; i++) {
496 int c = qpunbase[i];
497 printf("%d, ", c);
498 }
499printf("\";\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\*-------------------------------------------------------------------------*/
448static int mime_global_qp(lua_State *L) 579static 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\*-------------------------------------------------------------------------*/
655static int mime_global_eol(lua_State *L) 785static 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 }