|
Lines 1-4
Link Here
|
| 1 |
/* $Id: mime.c,v 1.47 2005/09/06 02:04:23 relson Exp $ */ |
1 |
/* $Id: mime.c,v 1.55 2005/10/26 00:27:43 relson Exp $ */ |
| 2 |
|
2 |
|
| 3 |
/** |
3 |
/** |
| 4 |
* \file mime.c |
4 |
* \file mime.c |
|
Lines 42-54
Link Here
|
| 42 |
const char *name; /**< prefix of MIME type to match */ |
42 |
const char *name; /**< prefix of MIME type to match */ |
| 43 |
size_t len; /**< length of \a name */ |
43 |
size_t len; /**< length of \a name */ |
| 44 |
} mime_type_table[] = { |
44 |
} mime_type_table[] = { |
| 45 |
{ MIME_TEXT_HTML, "text/html", 9 }, |
45 |
{ MIME_TEXT_HTML, "text/html", 9 }, |
| 46 |
{ MIME_TEXT_PLAIN, "text/plain", 10 }, |
46 |
{ MIME_TEXT_PLAIN, "text/plain", 10 }, |
| 47 |
{ MIME_TEXT, "text", 4 }, /* NON-COMPLIANT; should be "text/" */ |
47 |
{ MIME_TEXT, "text", 4 }, /* NON-COMPLIANT; should be "text/" */ |
| 48 |
{ MIME_APPLICATION, "application/", 12 }, |
48 |
{ MIME_APPLICATION, "application/", 12 }, |
| 49 |
{ MIME_IMAGE, "image/", 6 }, |
49 |
{ MIME_MESSAGE, "message/", 8 }, |
| 50 |
{ MIME_MESSAGE, "message/", 8 }, |
50 |
{ MIME_MULTIPART, "multipart/", 10 }, |
| 51 |
{ MIME_MULTIPART, "multipart/", 10 }, |
51 |
{ MIME_IMAGE, "image/bmp", 9 }, |
|
|
52 |
{ MIME_AUDIO, "audio/", 6 }, |
| 53 |
{ MIME_VIDEO, "video/", 6 }, |
| 52 |
}; |
54 |
}; |
| 53 |
|
55 |
|
| 54 |
/** MIME encodings that we detect. */ |
56 |
/** MIME encodings that we detect. */ |
|
Lines 56-67
Link Here
|
| 56 |
enum mimeencoding encoding; /**< internal representation of encoding */ |
58 |
enum mimeencoding encoding; /**< internal representation of encoding */ |
| 57 |
const char *name; /**< encoding name to match */ |
59 |
const char *name; /**< encoding name to match */ |
| 58 |
} mime_encoding_table[] = { |
60 |
} mime_encoding_table[] = { |
| 59 |
{ MIME_7BIT, "7BIT" }, |
61 |
{ MIME_7BIT, "7BIT" }, |
| 60 |
{ MIME_8BIT, "8BIT" }, |
62 |
{ MIME_8BIT, "8BIT" }, |
| 61 |
{ MIME_BINARY, "BINARY" }, |
63 |
{ MIME_BINARY, "BINARY" }, |
| 62 |
{ MIME_QP, "QUOTED-PRINTABLE" }, |
64 |
{ MIME_QP, "QUOTED-PRINTABLE" }, |
| 63 |
{ MIME_BASE64, "BASE64" }, |
65 |
{ MIME_BASE64, "BASE64" }, |
| 64 |
{ MIME_UUENCODE, "X-UUENCODE" }, |
66 |
{ MIME_UUENCODE, "X-UUENCODE" }, |
| 65 |
}; |
67 |
}; |
| 66 |
|
68 |
|
| 67 |
/** MIME content dispositions that we detect. */ |
69 |
/** MIME content dispositions that we detect. */ |
|
Lines 69-76
Link Here
|
| 69 |
enum mimedisposition disposition; /**< internal representation of disposition */ |
71 |
enum mimedisposition disposition; /**< internal representation of disposition */ |
| 70 |
const char *name; /**< disposition name to match */ |
72 |
const char *name; /**< disposition name to match */ |
| 71 |
} mime_disposition_table[] = { |
73 |
} mime_disposition_table[] = { |
| 72 |
{ MIME_INLINE, "inline" }, |
74 |
{ MIME_INLINE, "inline" }, |
| 73 |
{ MIME_ATTACHMENT, "attachment" }, |
75 |
{ MIME_ATTACHMENT, "attachment" }, |
| 74 |
}; |
76 |
}; |
| 75 |
|
77 |
|
| 76 |
/** properties of a MIME boundary */ |
78 |
/** properties of a MIME boundary */ |
|
Lines 104-147
Link Here
|
| 104 |
} |
106 |
} |
| 105 |
#endif |
107 |
#endif |
| 106 |
|
108 |
|
| 107 |
static const char *str_mime_type(enum mimetype m) { |
109 |
static const char *str_mime_type(enum mimetype m) |
|
|
110 |
{ |
| 108 |
switch (m) { |
111 |
switch (m) { |
| 109 |
case MIME_TYPE_UNKNOWN: |
112 |
case MIME_TYPE_UNKNOWN: return "unknown"; |
| 110 |
return "unknown"; |
113 |
case MIME_MULTIPART: return "multipart/*"; |
| 111 |
case MIME_MULTIPART: |
114 |
case MIME_MESSAGE: return "message/*"; |
| 112 |
return "multipart/*"; |
115 |
case MIME_TEXT: return "text/*"; |
| 113 |
case MIME_MESSAGE: |
116 |
case MIME_TEXT_PLAIN: return "text/plain"; |
| 114 |
return "message/*"; |
117 |
case MIME_TEXT_HTML: return "text/html"; |
| 115 |
case MIME_TEXT: |
118 |
case MIME_APPLICATION: return "application/*"; |
| 116 |
return "text/*"; |
119 |
case MIME_IMAGE: return "image/*"; |
| 117 |
case MIME_TEXT_PLAIN: |
120 |
case MIME_AUDIO: return "audio/*"; |
| 118 |
return "text/plain"; |
121 |
case MIME_VIDEO: return "video/*"; |
| 119 |
case MIME_TEXT_HTML: |
122 |
} |
| 120 |
return "text/html"; |
|
|
| 121 |
case MIME_APPLICATION: |
| 122 |
return "application/*"; |
| 123 |
case MIME_IMAGE: |
| 124 |
return "image/*"; |
| 125 |
} |
| 126 |
return "INTERNAL_ERROR"; |
123 |
return "INTERNAL_ERROR"; |
| 127 |
} |
124 |
} |
| 128 |
|
125 |
|
| 129 |
static const char *str_mime_enc(enum mimeencoding e) { |
126 |
static const char *str_mime_enc(enum mimeencoding e) |
|
|
127 |
{ |
| 130 |
switch (e) { |
128 |
switch (e) { |
| 131 |
case MIME_ENCODING_UNKNOWN: |
129 |
case MIME_ENCODING_UNKNOWN: return "unknown"; |
| 132 |
return "unknown"; |
130 |
case MIME_7BIT: return "7bit"; |
| 133 |
case MIME_7BIT: |
131 |
case MIME_8BIT: return "8bit"; |
| 134 |
return "7bit"; |
132 |
case MIME_BINARY: return "binary"; |
| 135 |
case MIME_8BIT: |
133 |
case MIME_QP: return "quoted-printable"; |
| 136 |
return "8bit"; |
134 |
case MIME_BASE64: return "base64"; |
| 137 |
case MIME_BINARY: |
135 |
case MIME_UUENCODE: return "x-uuencode"; |
| 138 |
return "binary"; |
|
|
| 139 |
case MIME_QP: |
| 140 |
return "quoted-printable"; |
| 141 |
case MIME_BASE64: |
| 142 |
return "base64"; |
| 143 |
case MIME_UUENCODE: |
| 144 |
return "x-uuencode"; |
| 145 |
} |
136 |
} |
| 146 |
return "INTERNAL_ERROR"; |
137 |
return "INTERNAL_ERROR"; |
| 147 |
} |
138 |
} |
|
Lines 155-166
Link Here
|
| 155 |
|
146 |
|
| 156 |
for (ptr = mime_stack_top; ptr != NULL; ptr = ptr->child) |
147 |
for (ptr = mime_stack_top; ptr != NULL; ptr = ptr->child) |
| 157 |
{ |
148 |
{ |
| 158 |
fprintf(dbgout, "**** %3d type %s enc %s bnd %s chr %s\n", |
149 |
fprintf(dbgout, "**** %3d type: %-16s enc: %-16s chr: %-8.8s bnd: %s\n", |
| 159 |
ptr->depth, |
150 |
ptr->depth, |
| 160 |
str_mime_type(ptr->mime_type), |
151 |
str_mime_type(ptr->mime_type), |
| 161 |
str_mime_enc(ptr->mime_encoding), |
152 |
str_mime_enc(ptr->mime_encoding), |
| 162 |
ptr->boundary ? ptr->boundary : "NIL", |
153 |
ptr->charset, |
| 163 |
ptr->charset); |
154 |
ptr->boundary ? ptr->boundary : "NIL"); |
| 164 |
} |
155 |
} |
| 165 |
} |
156 |
} |
| 166 |
#endif |
157 |
#endif |
|
Lines 175-182
Link Here
|
| 175 |
msg_state->charset = xstrdup("US-ASCII"); |
166 |
msg_state->charset = xstrdup("US-ASCII"); |
| 176 |
msg_state->depth = (parent == NULL) ? 0 : msg_state->parent->depth + 1; |
167 |
msg_state->depth = (parent == NULL) ? 0 : msg_state->parent->depth + 1; |
| 177 |
msg_state->child = NULL; |
168 |
msg_state->child = NULL; |
|
|
169 |
msg_state->mime_dont_decode = false; |
| 170 |
|
| 178 |
if (parent) |
171 |
if (parent) |
| 179 |
parent->child = msg_state; |
172 |
parent->child = msg_state; |
|
|
173 |
|
| 180 |
return; |
174 |
return; |
| 181 |
} |
175 |
} |
| 182 |
|
176 |
|
|
Lines 188-193
Link Here
|
| 188 |
if (mime_stack_bot == t) |
182 |
if (mime_stack_bot == t) |
| 189 |
mime_stack_bot = t->parent; |
183 |
mime_stack_bot = t->parent; |
| 190 |
|
184 |
|
|
|
185 |
if (mime_stack_top == t) |
| 186 |
mime_stack_top = NULL; |
| 187 |
|
| 191 |
if (t->boundary) { |
188 |
if (t->boundary) { |
| 192 |
xfree(t->boundary); |
189 |
xfree(t->boundary); |
| 193 |
t->boundary = NULL; |
190 |
t->boundary = NULL; |
|
Lines 221-229
Link Here
|
| 221 |
{ |
218 |
{ |
| 222 |
msg_state = (mime_t *) xmalloc(sizeof(mime_t)); |
219 |
msg_state = (mime_t *) xmalloc(sizeof(mime_t)); |
| 223 |
|
220 |
|
| 224 |
if (parent == NULL) { |
221 |
if (parent == NULL) |
| 225 |
mime_stack_top = msg_state; |
222 |
mime_stack_top = msg_state; |
| 226 |
} |
|
|
| 227 |
|
223 |
|
| 228 |
mime_stack_bot = msg_state; |
224 |
mime_stack_bot = msg_state; |
| 229 |
|
225 |
|
|
Lines 458-467
Link Here
|
| 458 |
break; |
454 |
break; |
| 459 |
} |
455 |
} |
| 460 |
} |
456 |
} |
|
|
457 |
|
| 461 |
if (DEBUG_MIME(0) |
458 |
if (DEBUG_MIME(0) |
| 462 |
&& msg_state->mime_disposition == MIME_DISPOSITION_UNKNOWN) |
459 |
&& msg_state->mime_disposition == MIME_DISPOSITION_UNKNOWN) |
| 463 |
fprintf(stderr, "Unknown mime disposition - '%s'\n", w); |
460 |
fprintf(stderr, "Unknown mime disposition - '%s'\n", w); |
|
|
461 |
|
| 464 |
xfree(w); |
462 |
xfree(w); |
|
|
463 |
|
| 465 |
return; |
464 |
return; |
| 466 |
} |
465 |
} |
| 467 |
|
466 |
|
|
Lines 496-505
Link Here
|
| 496 |
break; |
495 |
break; |
| 497 |
} |
496 |
} |
| 498 |
} |
497 |
} |
|
|
498 |
|
| 499 |
if (DEBUG_MIME(0) |
499 |
if (DEBUG_MIME(0) |
| 500 |
&& msg_state->mime_encoding == MIME_ENCODING_UNKNOWN) |
500 |
&& msg_state->mime_encoding == MIME_ENCODING_UNKNOWN) |
| 501 |
fprintf(stderr, "Unknown mime encoding - '%s'\n", w); |
501 |
fprintf(stderr, "Unknown mime encoding - '%s'\n", w); |
|
|
502 |
|
| 502 |
xfree(w); |
503 |
xfree(w); |
|
|
504 |
|
| 503 |
return; |
505 |
return; |
| 504 |
} |
506 |
} |
| 505 |
|
507 |
|
|
Lines 527-595
Link Here
|
| 527 |
xfree(w); |
529 |
xfree(w); |
| 528 |
|
530 |
|
| 529 |
switch (msg_state->mime_type) { |
531 |
switch (msg_state->mime_type) { |
| 530 |
case MIME_TEXT: |
532 |
case MIME_TEXT: return; /* XXX: read charset */ |
| 531 |
case MIME_TEXT_PLAIN: |
533 |
case MIME_TEXT_PLAIN: return; /* XXX: read charset */ |
| 532 |
/* XXX: read charset */ |
534 |
case MIME_TEXT_HTML: return; |
| 533 |
case MIME_TEXT_HTML: |
535 |
case MIME_TYPE_UNKNOWN: return; |
| 534 |
return; |
536 |
case MIME_MULTIPART: return; /* XXX: read boundary */ |
| 535 |
case MIME_TYPE_UNKNOWN: |
537 |
case MIME_MESSAGE: return; |
| 536 |
return; |
|
|
| 537 |
case MIME_MULTIPART: |
| 538 |
/* XXX: read boundary */ |
| 539 |
return; |
| 540 |
case MIME_MESSAGE: |
| 541 |
return; |
| 542 |
case MIME_APPLICATION: |
538 |
case MIME_APPLICATION: |
| 543 |
return; |
|
|
| 544 |
case MIME_IMAGE: |
539 |
case MIME_IMAGE: |
| 545 |
return; |
540 |
case MIME_AUDIO: |
|
|
541 |
case MIME_VIDEO: msg_state->mime_dont_decode = true; return; |
| 546 |
} |
542 |
} |
| 547 |
return; |
|
|
| 548 |
} |
| 549 |
|
| 550 |
/* to be removed. Used only by bogus hacks in collect.c::collect_words */ |
| 551 |
void mime_type2(word_t * text) |
| 552 |
{ |
| 553 |
byte *w = text->text; |
| 554 |
struct type_s *typ; |
| 555 |
|
543 |
|
| 556 |
if (!w) |
|
|
| 557 |
return; |
| 558 |
|
| 559 |
msg_state->mime_type = MIME_TYPE_UNKNOWN; |
| 560 |
for (typ = mime_type_table; |
| 561 |
typ < mime_type_table + COUNTOF(mime_type_table); typ += 1) { |
| 562 |
if (strncasecmp((const char *)w, typ->name, typ->len) == 0) { |
| 563 |
msg_state->mime_type = typ->type; |
| 564 |
if (DEBUG_MIME(1) || DEBUG_LEXER(1)) |
| 565 |
fprintf(dbgout, "*** mime_type: %s\n", text->text); |
| 566 |
break; |
| 567 |
} |
| 568 |
} |
| 569 |
if (DEBUG_MIME(0) && msg_state->mime_type == MIME_TYPE_UNKNOWN) |
| 570 |
fprintf(stderr, "Unknown mime type - '%s'\n", w); |
| 571 |
#if 0 |
| 572 |
switch (msg_state->mime_type) { |
| 573 |
case MIME_TEXT: |
| 574 |
case MIME_TEXT_HTML: |
| 575 |
case MIME_TEXT_PLAIN: |
| 576 |
/* XXX: read charset */ |
| 577 |
return; |
| 578 |
case MIME_TYPE_UNKNOWN: |
| 579 |
return; |
| 580 |
case MIME_MULTIPART: |
| 581 |
return; |
| 582 |
case MIME_MESSAGE: |
| 583 |
/* XXX: read boundary */ |
| 584 |
return; |
| 585 |
case MIME_APPLICATION: |
| 586 |
/* XXX: read boundary */ |
| 587 |
return; |
| 588 |
case MIME_IMAGE: |
| 589 |
/* XXX: read boundary */ |
| 590 |
return; |
| 591 |
} |
| 592 |
#endif |
| 593 |
return; |
544 |
return; |
| 594 |
} |
545 |
} |
| 595 |
|
546 |
|