MLMMJ Mailing List Manager
 help / color / mirror / Atom feed
From: Jakob Hirsch <jh@plonk.de>
To: mlmmj@mlmmj.org
Subject: Re: Fw: footer isn't appended to multipart messages (part II: reality
Date: Sat, 16 Jul 2005 13:12:56 +0000	[thread overview]
Message-ID: <42D907D8.6070102@plonk.de> (raw)
In-Reply-To: <200507052130.02825.lists@seattleserver.com>

[-- Attachment #1: Type: text/plain, Size: 184 bytes --]

Mads Martin Joergensen wrote:

> Thanks for the patch!

de nada.
But better take the attached one. :)

> I'll have a look next week, when I'm back from vacation.

Have a nice holiday!

[-- Attachment #2: mlmmj-footer-mime2.patch --]
[-- Type: text/plain, Size: 4712 bytes --]

--- mlmmj-1.2.8/src/do_all_the_voodo_here.c	2005-05-09 14:50:15.000000000 +0200
+++ mlmmj-1.2.8-jh1/src/do_all_the_voodo_here.c	2005-07-16 13:53:00.000000000 +0200
@@ -82,6 +82,9 @@
 	char *hdrline, *subject, *unqp;
 	int hdrsadded = 0;
 	int subject_present = 0;
+	int mime = 0;
+	char *content_orig = NULL;  /* original content-type header */
+	char *boundary = NULL;
 
 	allhdrs->count = 0;
 	allhdrs->strs = NULL;
@@ -160,6 +163,55 @@
 			}
 		}
 		
+		/* Content-Type */
+		if(footfd>=0 && !mime && !strncasecmp(hdrline, "Content-Type:", 13)) {
+			char* p;
+			int len;
+			/* search first non-LWSP */
+			for (p = hdrline+13; *p==' ' || *p=='\t'; p++);
+
+			if (!strncasecmp(p, "multipart/mixed", 15)) {
+				mime = 1;
+                
+				/* get boundary string */
+				p = index(p, ';');
+				if (p != NULL)
+					p = strstr(p, "boundary");
+				if (p != NULL)
+					p = index(p, '=');
+				if (p != NULL)
+					p = index(p, '"') + 1;
+				if (p == NULL) {
+	                log_error(LOG_ARGS, "MIME multipart but no boundary");
+	                mime = 0;
+				} else {
+					/* find closing quote */
+					for(len=0; p[len]!='"' && p[len]!=0; ++len);
+					if(p[len] == 0) {
+	                    log_error(LOG_ARGS, "no closing quote in boundary");
+	                    mime = 0;
+					} else {
+						boundary = mymalloc(len + 1);
+						strncpy(boundary, p, len);
+						boundary[len] = 0;
+					}
+				}
+			} else if (!strncasecmp(p, "multipart/alternative", 21)) {
+				mime = 2;
+
+				/* create new boundary for MIME-encapsulation */
+				boundary = random_str();
+				
+				/* save for later use */
+				content_orig = hdrline; 
+				/* and create new content-type header */
+				hdrline = concatstr(3,
+					"Content-Type: multipart/mixed; boundary=\"", 
+				    boundary, "\"\n");
+
+			}
+		}
+
 		/* Should it be stripped? */
 		if(delhdrs) {
 			if(!findit(hdrline, delhdrs))
@@ -171,18 +223,101 @@
 		myfree(hdrline);
 	}
 
-	/* Just print the rest of the mail */
-	if(dumpfd2fd(infd, outfd) < 0) {
-		log_error(LOG_ARGS, "Error when dumping rest of mail");
-		return -1;
-	}
+    /* MIME-Handling */
+	switch (mime) {
+		char* s;
+		unsigned int i;
+		
+		case 0 : /* no MIME, plain message */
+			/* Just print the rest of the mail */
+			if(dumpfd2fd(infd, outfd) < 0) {
+				log_error(LOG_ARGS, "Error when dumping rest of mail");
+				return -1;
+			}
 
-	/* No more, lets add the footer if one */
-	if(footfd >= 0)
-		if(dumpfd2fd(footfd, outfd) < 0) {
-			log_error(LOG_ARGS, "Error when adding footer");
-			return -1;
-		}
+			/* No more, lets add the footer if one */
+			if(footfd >= 0)
+				if(dumpfd2fd(footfd, outfd) < 0) {
+					log_error(LOG_ARGS, "Error when adding footer");
+					return -1;
+				}
+				
+			break;
+			
+		case 1 : /* multipart/mixed */
+
+			if(dumpfd2fd(infd, outfd) < 0) {
+				log_error(LOG_ARGS, "Error when dumping rest of mail");
+				return -1;
+			}
+
+			/* seek back to the end of the close-delimiter to kill
+			  the last two hyphens. hopefully nobody puts too
+			  much garbage in the epilogue or else this will fail... */
+			i = 2 * strlen(boundary) - 1;
+			lseek(outfd, -i, SEEK_END);
+			s = mymalloc(i+1);
+			read(outfd, s, i);
+			s[i] = 0;
+			i -= strstr(s, boundary) - s + strlen(boundary);
+			myfree(s);
+			if (i>2*strlen(boundary)) {
+				log_error(LOG_ARGS, "Error seeking MIME close-delimiter");
+			} else {
+				lseek(outfd, -i, SEEK_END);
+
+				s = concatstr(2, "\nContent-Type: text/plain\n",
+					"Content-Disposition: inline\n\n");
+				writen(outfd, s, strlen(s));
+				myfree(s);
+
+				if(dumpfd2fd(footfd, outfd) < 0) {
+					log_error(LOG_ARGS, "Error when adding footer");
+					myfree(boundary);
+					return -1;
+				}
+
+				s = concatstr(3, "\n--", boundary, "--\n");
+				writen(outfd, s, strlen(s));
+				myfree(s);
+			}
+			myfree(boundary);
+
+			break;
+
+		case 2 : /* multipart/alternative */
+			s = concatstr(5,
+				"This is a multi-part message in MIME format.\n\n--",
+				boundary, "\n",
+				content_orig, "\n");
+			myfree(content_orig);
+			writen(outfd, s, strlen(s));
+			myfree(s);
+
+			if(dumpfd2fd(infd, outfd) < 0) {
+				log_error(LOG_ARGS, "Error when dumping rest of mail");
+				return -1;
+			}
+
+		    s = concatstr(4,
+		        "\n--", boundary,
+		        "\nContent-Type: text/plain\n",
+		        "Content-Disposition: inline\n\n");
+			writen(outfd, s, strlen(s));
+			myfree(s);
+			
+			if(dumpfd2fd(footfd, outfd) < 0) {
+				log_error(LOG_ARGS, "Error when adding footer");
+				return -1;
+			}
+
+			s = concatstr(3, "\n--", boundary, "--\n");
+			myfree(boundary);
+			writen(outfd, s, strlen(s));
+			myfree(s);
+
+			break;
+	}
 
 	fsync(outfd);
 

  parent reply	other threads:[~2005-07-16 13:12 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-07-05 21:30 footer isn't appended to multipart messages Casey Allen Shobe
2005-07-05 22:09 ` Sven 'Darkman' Michels
2005-07-05 23:32 ` footer isn't appended to multipart messages (part II: reality check!) Patrick Bennett
2005-07-06  2:38 ` Casey Allen Shobe
2005-07-06  6:17 ` Fw: " Patrick Bennett
2005-07-06  8:05 ` footer isn't appended to multipart messages Mads Martin Joergensen
2005-07-06  8:12 ` footer isn't appended to multipart messages (part II: reality check!) Mads Martin Joergensen
2005-07-06  8:15 ` Mads Martin Joergensen
2005-07-06 13:00 ` Fw: " Morten K. Poulsen
2005-07-07 15:31 ` Fw: footer isn't appended to multipart messages (part II: reality Jakob Hirsch
2005-07-07 16:07 ` Fw: footer isn't appended to multipart messages (part II: reality check!) Mads Martin Joergensen
2005-07-09 18:10 ` Fw: footer isn't appended to multipart messages (part II: reality Jakob Hirsch
2005-07-15 14:29 ` Fw: footer isn't appended to multipart messages (part II: reality check!) Mads Martin Joergensen
2005-07-16 13:12 ` Jakob Hirsch [this message]
2005-07-16 14:52 ` Mads Martin Joergensen
2005-07-18  9:49 ` Fw: footer isn't appended to multipart messages (part II: reality Jakob Hirsch
2005-07-18 18:12 ` Fw: footer isn't appended to multipart messages (part II: reality check!) Mads Martin Joergensen
2005-07-18 23:26 ` Fw: footer isn't appended to multipart messages (part II: reality Jakob Hirsch
2005-07-19  7:25 ` Fw: footer isn't appended to multipart messages (part II: reality check!) Mads Martin Joergensen
2005-07-19  7:59 ` Fw: footer isn't appended to multipart messages (part II: reality Jakob Hirsch
2005-07-19  8:05 ` Fw: footer isn't appended to multipart messages (part II: reality check!) Mads Martin Joergensen
2005-07-19 18:44 ` Fw: footer isn't appended to multipart messages (part II: reality Jakob Hirsch
2005-07-19 22:09 ` Jakob Hirsch
2005-07-20  6:18 ` Fw: footer isn't appended to multipart messages (part II: reality check!) Mads Martin Joergensen
2005-10-10  5:28 ` Mads Martin Joergensen
2005-10-10 21:41 ` Fw: footer isn't appended to multipart messages (part II: reality Jakob Hirsch
2005-10-10 21:47 ` Fw: footer isn't appended to multipart messages (part II: reality check!) Neale Pickett
2005-10-10 22:08 ` Fw: footer isn't appended to multipart messages (part II: reality Jakob Hirsch
2005-10-11  0:15 ` Fw: footer isn't appended to multipart messages (part II: reality check!) Mads Martin Joergensen
2005-10-11  3:06 ` Neale Pickett
2005-10-11  7:52 ` Fw: footer isn't appended to multipart messages (part II: Jakob Hirsch
2005-10-11  8:52 ` Fw: footer isn't appended to multipart messages (part II: reality check!) Mads Martin Joergensen
2005-10-11  9:30 ` Fw: footer isn't appended to multipart messages (part II: Jakob Hirsch
2005-10-11 12:24 ` Fw: footer isn't appended to multipart messages (part II: reality check!) Mads Martin Joergensen
2005-10-11 12:55 ` Neale Pickett

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=42D907D8.6070102@plonk.de \
    --to=jh@plonk.de \
    --cc=mlmmj@mlmmj.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox