1 #include <stdlib.h>
2 #include <string.h>
3 #include <sys/types.h>
4 #include <sys/stat.h>
5
6 #include "pantomime.h"
7
MIME_HANDLER(mimehandle_html)8 MIME_HANDLER(mimehandle_html)
9 {
10 FILE *outfile;
11 char filename[BIG_BUF];
12
13 if (strcasecmp(LMAPI->mime_fieldval(header,"Content-type"),
14 "text/html") != 0) {
15 /* We should NOT have been here */
16 return MIME_HANDLE_FAIL;
17 }
18
19 if (!LMAPI->get_bool("humanize-html")) {
20 if (!LMAPI->get_bool("unmime-first-level")) {
21 LMAPI->unlink_file(mimefile);
22 if (!LMAPI->get_bool("unmime-quiet")) {
23 if ((outfile = LMAPI->open_file(mimefile,"w")) != NULL) {
24 LMAPI->write_file(outfile,"-- HTML file stripped by %s --\n\n",
25 SERVICE_NAME_MC);
26 LMAPI->close_file(outfile);
27 }
28 }
29 return MIME_HANDLE_OK;
30 }
31 }
32
33 LMAPI->buffer_printf(filename, sizeof(filename) - 1, "%s.dehtml", mimefile);
34 if (!LMAPI->unhtml_file(mimefile,filename)) {
35 LMAPI->unlink_file(filename);
36 if (!LMAPI->get_bool("unmime-quiet")) {
37 if ((outfile = LMAPI->open_file(mimefile,"w")) != NULL) {
38 LMAPI->write_file(outfile,"-- Unable to decode HTML file!! --\n\n");
39 LMAPI->close_file(outfile);
40 } else LMAPI->unlink_file(mimefile);
41 } else LMAPI->unlink_file(mimefile);
42
43 return MIME_HANDLE_FAIL;
44 }
45
46 if ((outfile = LMAPI->open_file(mimefile,"w")) != NULL) {
47 FILE *infile;
48 char buffer[BIG_BUF];
49
50 if ((infile = LMAPI->open_file(filename,"r")) == NULL) {
51 LMAPI->close_file(outfile);
52 LMAPI->unlink_file(mimefile);
53 return MIME_HANDLE_FAIL;
54 }
55
56 if (!LMAPI->get_bool("unmime-quiet") && !LMAPI->get_bool("unmime-first-level")) {
57 const char *temp;
58
59 LMAPI->write_file(outfile,"-- HTML Attachment decoded to text by %s --\n",
60 SERVICE_NAME_MC);
61
62 temp = LMAPI->mime_parameter(header,"content-type","name");
63 if (temp) {
64 LMAPI->write_file(outfile,"-- File: %s\n", temp);
65 free((char *)temp);
66 }
67 temp = LMAPI->mime_fieldval(header,"content-description");
68 if (temp) {
69 if (*temp)
70 LMAPI->write_file(outfile,"-- Desc: %s\n", temp);
71 }
72
73 LMAPI->write_file(outfile,"\n");
74 }
75 while(LMAPI->read_file(buffer, sizeof(buffer), infile)) {
76 LMAPI->write_file(outfile,"%s",buffer);
77 }
78 LMAPI->close_file(outfile);
79 LMAPI->close_file(infile);
80 LMAPI->unlink_file(filename);
81
82 return MIME_HANDLE_OK;
83 } else {
84 LMAPI->unlink_file(mimefile);
85 return MIME_HANDLE_FAIL;
86 }
87
88 return MIME_HANDLE_OK;
89 }
90
MIME_HANDLER(mimehandle_pantomime_binary)91 MIME_HANDLER(mimehandle_pantomime_binary)
92 {
93 FILE *tempfile;
94 const char *temp, *filename;
95 int old_umask;
96
97 LMAPI->clean_var("unmime-first-level", VAR_TEMP);
98
99 filename = LMAPI->mime_parameter(header,"content-type","name");
100
101 if (!filename)
102 filename = LMAPI->mime_parameter(header,"content-disposition","filename");
103
104 if (strcasecmp(LMAPI->get_string("mode"),"bounce") == 0) {
105 if ((tempfile = LMAPI->open_file(mimefile,"w")) == NULL) {
106 return MIME_HANDLE_OK;
107 }
108 LMAPI->write_file(tempfile,"-- Binary attachments are not handled in bounces --\n");
109 LMAPI->close_file(tempfile);
110 if (filename) free((char *)filename);
111 return MIME_HANDLE_OK;
112 }
113
114 old_umask = 022;
115
116 #ifndef WIN32
117 old_umask = umask(022);
118 #endif
119
120 if (!LMAPI->get_var("pantomime-dir") || !LMAPI->get_var("pantomime-url")
121 || !filename) {
122 if ((tempfile = LMAPI->open_file(mimefile,"w")) == NULL) {
123 if(filename) free((char *)filename);
124 return MIME_HANDLE_FAIL;
125 }
126
127 if (!LMAPI->get_bool("unmime-quiet")) {
128 LMAPI->write_file(tempfile,"-- Binary/unsupported file stripped by %s --\n",
129 SERVICE_NAME_MC);
130
131 if (!filename)
132 LMAPI->write_file(tempfile,"-- Err : No filename to use for decode, file stripped.\n");
133
134 temp = LMAPI->mime_fieldval(header,"content-type");
135 if (temp) {
136 LMAPI->write_file(tempfile,"-- Type: %s\n", temp);
137 }
138
139 if (filename) {
140 LMAPI->write_file(tempfile,"-- File: %s\n", filename);
141 }
142
143 temp = LMAPI->mime_fieldval(header,"content-description");
144 if (temp) {
145 if (*temp) LMAPI->write_file(tempfile,"-- Desc: %s\n", temp);
146 }
147 LMAPI->write_file(tempfile,"\n");
148 }
149
150 LMAPI->close_file(tempfile);
151 } else {
152 char tempfilename[HUGE_BUF];
153 char movetofile[HUGE_BUF];
154 char *tptr;
155 int wroteit, count;
156 struct stat fst;
157
158 wroteit = 1;
159
160 LMAPI->buffer_printf(tempfilename, sizeof(tempfilename) - 1, "%s", filename);
161
162 tptr = strrchr(tempfilename,'/');
163 if (!tptr) tptr = strrchr(tempfilename,'\\');
164
165 if (tptr) tptr++; else tptr = &tempfilename[0];
166
167 LMAPI->buffer_printf(movetofile, sizeof(movetofile) - 1, "%s/%s", LMAPI->get_string("pantomime-dir"),
168 tptr);
169
170 count = 2;
171
172 while(LMAPI->exists_file(movetofile) && (count < 99)) {
173 LMAPI->buffer_printf(movetofile, sizeof(movetofile) - 1, "%s/%.2d-%s",
174 LMAPI->get_string("pantomime-dir"),count,tptr);
175 count++;
176 }
177
178 if (LMAPI->exists_file(movetofile)) {
179 LMAPI->log_printf(5,"Pantomime: Reverting to queuefile-based name.\n");
180 LMAPI->buffer_printf(tempfilename, sizeof(tempfilename) - 1, "%s-%s",
181 LMAPI->get_string("queuefile"),filename);
182
183 tptr = strrchr(tempfilename,'/');
184 if (!tptr) tptr = strrchr(tempfilename,'\\');
185
186 if (tptr) tptr++; else tptr = &tempfilename[0];
187
188 LMAPI->buffer_printf(movetofile, sizeof(movetofile) - 1, "%s/%s",
189 LMAPI->get_string("pantomime-dir"), tptr);
190 } else {
191 tptr = strrchr(movetofile,'/');
192 if (!tptr) tptr = strrchr(movetofile,'\\');
193 if (tptr) tptr++; else tptr = &movetofile[0];
194 }
195
196 LMAPI->log_printf(9,"PantoMIME: %s -> %s\n", mimefile, movetofile);
197
198 LMAPI->mkdirs(movetofile);
199
200 if (LMAPI->replace_file(mimefile,movetofile)) {
201 LMAPI->log_printf(9,"PantoMIME: Unable to move file!\n");
202 wroteit = 0;
203 }
204
205 LMAPI->public_file(movetofile);
206
207 if ((tempfile = LMAPI->open_file(mimefile,"w")) != NULL) {
208 LMAPI->write_file(tempfile, "-- Attached file removed by %s and put at URL below --\n", SERVICE_NAME_MC);
209
210 temp = LMAPI->mime_fieldval(header,"content-type");
211 if (temp) {
212 LMAPI->write_file(tempfile,"-- Type: %s\n", temp);
213 }
214
215 temp = LMAPI->mime_fieldval(header,"content-description");
216 if (temp) {
217 if (*temp) LMAPI->write_file(tempfile,"-- Desc: %s\n", temp);
218 }
219 if (wroteit) {
220 char finalurl[SMALL_BUF];
221 char tempurl[SMALL_BUF/2];
222
223 if (stat(movetofile,&fst) == 0) {
224 int filesize;
225
226 filesize = fst.st_size;
227
228 if (filesize > 1024) {
229 int ksize;
230 ksize = filesize / 1024;
231 LMAPI->write_file(tempfile,"-- Size: %dk (%d bytes)\n",
232 ksize, filesize);
233 } else {
234 LMAPI->write_file(tempfile,"-- Size: %d bytes\n",
235 filesize);
236 }
237 }
238 LMAPI->buffer_printf(tempurl, sizeof(tempurl)/2 - 1, "%s/%s",
239 LMAPI->get_string("pantomime-url"),tptr);
240 LMAPI->strreplace(finalurl, sizeof(finalurl) - 1,tempurl," ","%20");
241 LMAPI->write_file(tempfile,"-- URL : %s\n\n", finalurl);
242 } else {
243 LMAPI->write_file(tempfile,"-- URL : Unable to write to web directory!\n\n");
244 }
245 LMAPI->close_file(tempfile);
246 }
247 }
248
249 if(filename) free((char *)filename);
250
251 #ifndef WIN32
252 umask(old_umask);
253 #endif
254
255 return MIME_HANDLE_OK;
256 }
257