All of lore.kernel.org
 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, 09 Jul 2005 18:10:48 +0000	[thread overview]
Message-ID: <42D01328.3010606@plonk.de> (raw)
In-Reply-To: <200507052130.02825.lists@seattleserver.com>

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

Mads Martin Joergensen wrote:

>>Mads, would you accept a patch?
> Of course :-)

Hah, I was not so sure, the patch is somewhat invasive and I'm not
totally happy with all the things, but it works and I think it takes
measures not to break things. Corrections and suggestions welcome.

[-- Attachment #2: mlmmj-footer-mime.patch --]
[-- Type: text/plain, Size: 4723 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-09 19:57:43.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,51 @@
 			}
 		}
 		
+		/* Content-Type */
+		if(footfd>=0 && !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 = strstr(p, "boundary");
+				p = index(p, '=');
+				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); */
+					len = index(p, '"') - p;
+					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 +219,102 @@
 		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 */
+            log_error(LOG_ARGS, "no MIME, plain message"); /* debug */
+			/* 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-09 18:10 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 ` Jakob Hirsch [this message]
2005-07-15 14:29 ` Mads Martin Joergensen
2005-07-16 13:12 ` Fw: footer isn't appended to multipart messages (part II: reality Jakob Hirsch
2005-07-16 14:52 ` Fw: footer isn't appended to multipart messages (part II: reality check!) 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=42D01328.3010606@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.