size_t bbb_len;
int multipart_hunting = 0;
char multipart_prefix[128];
+ char encoding[256];
if (!cret) return -1;
if (!mret) return -1;
if (!*mret) return -1;
if (!msgnum) return -1;
+ strcpy(encoding, "");
strcpy(mret[0]->content_type, "");
sprintf(aaa, "MSG%d %ld|%d", as_mime, msgnum, headers);
ret = CtdlIPCGenericCommand(ipc, aaa, NULL, 0, &bbb, &bbb_len, cret);
strcpy(mret[0]->mime_chosen, &mret[0]->mime_chosen[23]);
striplt(mret[0]->mime_chosen);
}
+ if (!strncasecmp(bbb, "Content-transfer-encoding:", 26)) {
+ extract_token(encoding, bbb, 0, '\n', sizeof encoding);
+ strcpy(encoding, &encoding[26]);
+ striplt(encoding);
+ }
remove_token(bbb, 0, '\n');
} while ((bbb[0] != 0) && (bbb[0] != '\n'));
remove_token(bbb, 0, '\n');
}
if (strlen(bbb)) {
+
+ if ( (!strcasecmp(encoding, "base64")) || (!strcasecmp(encoding, "quoted-printable")) ) {
+ char *ccc = NULL;
+ int bytes_decoded = 0;
+ ccc = malloc(strlen(bbb) + 32768);
+ if (!strcasecmp(encoding, "base64")) {
+ bytes_decoded = CtdlDecodeBase64(ccc, bbb, strlen(bbb));
+ }
+ else if (!strcasecmp(encoding, "quoted-printable")) {
+ bytes_decoded = CtdlDecodeQuotedPrintable(ccc, bbb, strlen(bbb));
+ }
+ ccc[bytes_decoded] = 0;
+ free(bbb);
+ bbb = ccc;
+ }
+
/* FIXME: Strip trailing whitespace */
bbb = (char *)realloc(bbb, (size_t)(strlen(bbb) + 1));
+
} else {
bbb = (char *)realloc(bbb, 1);
*bbb = '\0';
-/*
- * Convert "quoted-printable" to binary. Returns number of bytes decoded.
- * according to RFC2045 section 6.7
- */
-int CtdlDecodeQuotedPrintable(char *decoded, char *encoded, int sourcelen) {
- unsigned int ch;
- int decoded_length = 0;
- int pos = 0;
-
- while (pos < sourcelen)
- {
- if (!strncmp(&encoded[pos], "=\r\n", 3))
- {
- pos += 3;
- }
- else if (!strncmp(&encoded[pos], "=\n", 2))
- {
- pos += 2;
- }
- else if (encoded[pos] == '=')
- {
- ch = 0;
- sscanf(&encoded[pos+1], "%02x", &ch);
- pos += 3;
- decoded[decoded_length++] = ch;
- }
- else
- {
- decoded[decoded_length++] = encoded[pos];
- pos += 1;
- }
- }
- decoded[decoded_length] = 0;
- return(decoded_length);
-}
-
-
/*
* Given a message or message-part body and a length, handle any necessary
* decoding and pass the request up the stack.
}
}
+/*
+ * Convert "quoted-printable" to binary. Returns number of bytes decoded.
+ * according to RFC2045 section 6.7
+ */
+int CtdlDecodeQuotedPrintable(char *decoded, char *encoded, int sourcelen) {
+ unsigned int ch;
+ int decoded_length = 0;
+ int pos = 0;
+
+ while (pos < sourcelen)
+ {
+ if (!strncmp(&encoded[pos], "=\r\n", 3))
+ {
+ pos += 3;
+ }
+ else if (!strncmp(&encoded[pos], "=\n", 2))
+ {
+ pos += 2;
+ }
+ else if (encoded[pos] == '=')
+ {
+ ch = 0;
+ sscanf(&encoded[pos+1], "%02x", &ch);
+ pos += 3;
+ decoded[decoded_length++] = ch;
+ }
+ else
+ {
+ decoded[decoded_length++] = encoded[pos];
+ pos += 1;
+ }
+ }
+ decoded[decoded_length] = 0;
+ return(decoded_length);
+}
+
+
/*
* if we send out non ascii subjects, we encode it this way.
*/
void CtdlInitBase64Table(void);
void CtdlEncodeBase64(char *dest, const char *source, size_t sourcelen);
int CtdlDecodeBase64(char *dest, const char *source, size_t length);
+int CtdlDecodeQuotedPrintable(char *decoded, char *encoded, int sourcelen);
void striplt(char *);
int haschar(const char *st, int ch);
void remove_token(char *source, int parmnum, char separator);
-/*
- * Convert "quoted-printable" to binary. Returns number of bytes decoded.
- * according to RFC2045 section 6.7
- */
-int CtdlDecodeQuotedPrintable(char *decoded, char *encoded, int sourcelen) {
- unsigned int ch;
- int decoded_length = 0;
- int pos = 0;
-
- while (pos < sourcelen)
- {
- if (!strncmp(&encoded[pos], "=\r\n", 3))
- {
- pos += 3;
- }
- else if (!strncmp(&encoded[pos], "=\n", 2))
- {
- pos += 2;
- }
- else if (encoded[pos] == '=')
- {
- ch = 0;
- sscanf(&encoded[pos+1], "%02x", &ch);
- pos += 3;
- decoded[decoded_length++] = ch;
- }
- else
- {
- decoded[decoded_length++] = encoded[pos];
- pos += 1;
- }
- }
- decoded[decoded_length] = 0;
- return(decoded_length);
-}
-
-
/*
* Given a message or message-part body and a length, handle any necessary
* decoding and pass the request up the stack.
}
+/*
+ * Convert "quoted-printable" to binary. Returns number of bytes decoded.
+ * according to RFC2045 section 6.7
+ */
+int CtdlDecodeQuotedPrintable(char *decoded, char *encoded, int sourcelen) {
+ unsigned int ch;
+ int decoded_length = 0;
+ int pos = 0;
+
+ while (pos < sourcelen)
+ {
+ if (!strncmp(&encoded[pos], "=\r\n", 3))
+ {
+ pos += 3;
+ }
+ else if (!strncmp(&encoded[pos], "=\n", 2))
+ {
+ pos += 2;
+ }
+ else if (encoded[pos] == '=')
+ {
+ ch = 0;
+ sscanf(&encoded[pos+1], "%02x", &ch);
+ pos += 3;
+ decoded[decoded_length++] = ch;
+ }
+ else
+ {
+ decoded[decoded_length++] = encoded[pos];
+ pos += 1;
+ }
+ }
+ decoded[decoded_length] = 0;
+ return(decoded_length);
+}
+
+
/**
* \brief Local replacement for controversial C library function that generates
* names for temporary files. Included to shut up compiler warnings.
int load_msg_ptrs(char *servcmd, int with_headers);
size_t CtdlEncodeBase64(char **dest, const char *source, size_t sourcelen, size_t *destlen, int linebreaks);
int CtdlDecodeBase64(char *dest, const char *source, size_t length);
+int CtdlDecodeQuotedPrintable(char *decoded, char *encoded, int sourcelen);
void free_attachments(struct wcsession *sess);
void free_march_list(struct wcsession *wcf);
void set_room_policy(void);