]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/imap/imap_fetch.c
* Blank out the Envelope-to: header when reading messages via POP or IMAP. Resolves...
[citadel.git] / citadel / modules / imap / imap_fetch.c
index bff79381e14cc6283a77c013ae0a3756a474f29c..1adac79a59f40ff814dd91efc416436cddee10f0 100644 (file)
@@ -174,8 +174,9 @@ void imap_fetch_rfc822(long msgnum, char *whichfmt) {
                CC->redirect_len = 0;
                CC->redirect_alloc = SIZ;
                CtdlOutputMsg(msgnum, MT_RFC822,
-                       (need_body ? HEADERS_ALL : HEADERS_ONLY),
-                       0, 1, NULL);
+                       (need_body ? HEADERS_ALL : HEADERS_FAST),
+                       0, 1, NULL, SUPPRESS_ENV_TO
+               );
                if (!need_body) cprintf("\r\n");        /* extra trailing newline */
                IMAP->cached_rfc822_data = CC->redirect_buffer;
                IMAP->cached_rfc822_len = CC->redirect_len;
@@ -261,7 +262,7 @@ void imap_fetch_rfc822(long msgnum, char *whichfmt) {
  */
 void imap_load_part(char *name, char *filename, char *partnum, char *disp,
                    void *content, char *cbtype, char *cbcharset, size_t length, char *encoding,
-                   void *cbuserdata)
+                   char *cbid, void *cbuserdata)
 {
        char mbuf2[SIZ];
        char *desired_section;
@@ -348,7 +349,7 @@ void imap_output_envelope_from(struct CtdlMessage *msg) {
 
 /*
  * Output an envelope address (or set of addresses) in the official,
- * convuluted, braindead format.  (Note that we can't use this for
+ * convoluted, braindead format.  (Note that we can't use this for
  * the "From" address because its data may come from a number of different
  * fields.  But we can use it for "To" and possibly others.
  */
@@ -530,7 +531,8 @@ void imap_strip_headers(char *section) {
 
        ptr = CC->redirect_buffer;
        ok = 0;
-       while ( (done_headers == 0) && (ptr = memreadline(ptr, buf, sizeof buf), *ptr != 0) ) {
+       do {
+               ptr = memreadline(ptr, buf, sizeof buf);
                if (!isspace(buf[0])) {
                        ok = 0;
                        if (doing_headers == 0) ok = 1;
@@ -556,7 +558,8 @@ void imap_strip_headers(char *section) {
                if (IsEmptyStr(buf)) done_headers = 1;
                if (buf[0]=='\r') done_headers = 1;
                if (buf[0]=='\n') done_headers = 1;
-       }
+               if (*ptr == 0) done_headers = 1;
+       } while (!done_headers);
 
        strcat(boiled_headers, "\r\n");
 
@@ -591,19 +594,6 @@ void imap_fetch_body(long msgnum, char *item, int is_peek) {
                section, 
                IsEmptyStr(section) ? "(empty)" : "");
 
-       /*
-        * We used to have this great optimization in place that would avoid
-        * fetching the entire RFC822 message from disk if the client was only
-        * asking for the headers.  Unfortunately, fetching only the Citadel
-        * headers omits "Content-type:" and this behavior breaks the iPhone
-        * email client.  So we have to fetch the whole message from disk.  The
-        *
-        *      if (!strncasecmp(section, "HEADER", 6)) {
-        *              need_body = 0;
-        *      }
-        *
-        */
-
        /* Burn the cache if we don't have the same section of the 
         * same message again.
         */
@@ -651,11 +641,11 @@ void imap_fetch_body(long msgnum, char *item, int is_peek) {
        }
 
        else if ( (!strcmp(section, "1")) && (msg->cm_format_type != 4) ) {
-               CtdlOutputPreLoadedMsg(msg, MT_RFC822, HEADERS_NONE, 0, 1);
+               CtdlOutputPreLoadedMsg(msg, MT_RFC822, HEADERS_NONE, 0, 1, SUPPRESS_ENV_TO);
        }
 
        else if (!strcmp(section, "")) {
-               CtdlOutputPreLoadedMsg(msg, MT_RFC822, HEADERS_ALL, 0, 1);
+               CtdlOutputPreLoadedMsg(msg, MT_RFC822, HEADERS_ALL, 0, 1, SUPPRESS_ENV_TO);
        }
 
        /*
@@ -663,7 +653,11 @@ void imap_fetch_body(long msgnum, char *item, int is_peek) {
         * fields, strip it down.
         */
        else if (!strncasecmp(section, "HEADER", 6)) {
-               CtdlOutputPreLoadedMsg(msg, MT_RFC822, HEADERS_ONLY, 0, 1);
+               /* This used to work with HEADERS_FAST, but then Apple got stupid with their
+                * IMAP library and this broke Mail.App and iPhone Mail, so we had to change it
+                * to HEADERS_ONLY so the trendy hipsters with their iPhones can read mail.
+                */
+               CtdlOutputPreLoadedMsg(msg, MT_RFC822, HEADERS_ONLY, 0, 1, SUPPRESS_ENV_TO);
                imap_strip_headers(section);
        }
 
@@ -671,7 +665,7 @@ void imap_fetch_body(long msgnum, char *item, int is_peek) {
         * Strip it down if the client asked for everything _except_ headers.
         */
        else if (!strncasecmp(section, "TEXT", 4)) {
-               CtdlOutputPreLoadedMsg(msg, MT_RFC822, HEADERS_NONE, 0, 1);
+               CtdlOutputPreLoadedMsg(msg, MT_RFC822, HEADERS_NONE, 0, 1, SUPPRESS_ENV_TO);
        }
 
        /*
@@ -728,7 +722,7 @@ void imap_fetch_body(long msgnum, char *item, int is_peek) {
 void imap_fetch_bodystructure_pre(
                char *name, char *filename, char *partnum, char *disp,
                void *content, char *cbtype, char *cbcharset, size_t length, char *encoding,
-               void *cbuserdata
+               char *cbid, void *cbuserdata
                ) {
 
        cprintf("(");
@@ -742,7 +736,7 @@ void imap_fetch_bodystructure_pre(
 void imap_fetch_bodystructure_post(
                char *name, char *filename, char *partnum, char *disp,
                void *content, char *cbtype, char *cbcharset, size_t length, char *encoding,
-               void *cbuserdata
+               char *cbid, void *cbuserdata
                ) {
 
        char subtype[128];
@@ -768,7 +762,7 @@ void imap_fetch_bodystructure_post(
 void imap_fetch_bodystructure_part(
                char *name, char *filename, char *partnum, char *disp,
                void *content, char *cbtype, char *cbcharset, size_t length, char *encoding,
-               void *cbuserdata
+               char *cbid, void *cbuserdata
                ) {
 
        int have_cbtype = 0;
@@ -846,12 +840,11 @@ void imap_fetch_bodystructure_part(
        /* More gratuitous complexity */
        if ((!strcasecmp(cbmaintype, "MESSAGE"))
           && (!strcasecmp(cbsubtype, "RFC822"))) {
-               /* FIXME
-                     A body type of type MESSAGE and subtype RFC822
-                     contains, immediately after the basic fields, the
-                     envelope structure, body structure, and size in
-                     text lines of the encapsulated message.
-               */
+               /* FIXME: message/rfc822 also needs to output the envelope structure,
+                * body structure, and line count of the encapsulated message.  Fortunately
+                * there are not yet any clients depending on this, so we can get away
+                * with not implementing it for now.
+                */
        }
 
        /* MD5 value of body part; we can get away with NIL'ing this */
@@ -916,7 +909,7 @@ void imap_fetch_bodystructure (long msgnum, char *item,
                CC->redirect_buffer = malloc(SIZ);
                CC->redirect_len = 0;
                CC->redirect_alloc = SIZ;
-               CtdlOutputPreLoadedMsg(msg, MT_RFC822, 0, 0, 1);
+               CtdlOutputPreLoadedMsg(msg, MT_RFC822, 0, 0, 1, SUPPRESS_ENV_TO);
                rfc822 = CC->redirect_buffer;
                rfc822_len = CC->redirect_len;
                CC->redirect_buffer = NULL;
@@ -924,12 +917,13 @@ void imap_fetch_bodystructure (long msgnum, char *item,
                CC->redirect_alloc = 0;
 
                ptr = rfc822;
-               while (ptr = memreadline(ptr, buf, sizeof buf), *ptr != 0) {
+               do {
+                       ptr = memreadline(ptr, buf, sizeof buf);
                        ++lines;
                        if ((IsEmptyStr(buf)) && (rfc822_body == NULL)) {
                                rfc822_body = ptr;
                        }
-               }
+               } while (*ptr != 0);
 
                rfc822_headers_len = rfc822_body - rfc822;
                rfc822_body_len = rfc822_len - rfc822_headers_len;