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