aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camel/ChangeLog12
-rw-r--r--camel/camel-mime-utils.c48
-rw-r--r--camel/camel-mime-utils.h3
3 files changed, 56 insertions, 7 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index c4c1bf546c..c11eb08c67 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,3 +1,15 @@
+2004-08-11 Jeffrey Stedfast <fejj@novell.com>
+
+ Fix for bug #62771
+
+ * camel-mime-utils.c (append_quoted_pair): New function to append
+ a string of text that may contain quoted-pairs.
+ (header_decode_text): Now takes a ctext argument specifying
+ whether or not to expect comments and to handle them.
+ (camel_header_decode_string): Pass FALSE as ctext argument.
+ (camel_header_format_ctext): New function to format text|comment
+ header field bodies.
+
2004-08-10 Not Zed <NotZed@Ximian.com>
* providers/groupwise/camel-gw-listener.c
diff --git a/camel/camel-mime-utils.c b/camel/camel-mime-utils.c
index 798da0d3fd..314359c654 100644
--- a/camel/camel-mime-utils.c
+++ b/camel/camel-mime-utils.c
@@ -1118,16 +1118,42 @@ append_8bit (GString *out, const char *inbuf, size_t inlen, const char *charset)
}
+static void
+append_quoted_pair (GString *str, const char *in, int inlen)
+{
+ register const char *inptr = in;
+ const char *inend = in + inlen;
+ char c;
+
+ while (inptr < inend) {
+ c = *inptr++;
+ if (c == '\\' && inptr < inend)
+ g_string_append_c (str, *inptr++);
+ else
+ g_string_append_c (str, c);
+ }
+}
+
/* decodes a simple text, rfc822 + rfc2047 */
static char *
-header_decode_text (const char *in, size_t inlen, const char *default_charset)
+header_decode_text (const char *in, size_t inlen, int ctext, const char *default_charset)
{
GString *out;
const char *inptr, *inend, *start, *chunk, *locale_charset;
+ void (* append) (GString *, const char *, int);
char *dword = NULL;
+ guint32 mask;
locale_charset = e_iconv_locale_charset ();
+ if (ctext) {
+ mask = (CAMEL_MIME_IS_SPECIAL | CAMEL_MIME_IS_SPACE | CAMEL_MIME_IS_CTRL);
+ append = append_quoted_pair;
+ } else {
+ mask = (CAMEL_MIME_IS_LWSP);
+ append = g_string_append;
+ }
+
out = g_string_new ("");
inptr = in;
inend = inptr + inlen;
@@ -1135,20 +1161,20 @@ header_decode_text (const char *in, size_t inlen, const char *default_charset)
while (inptr < inend) {
start = inptr;
- while (inptr < inend && camel_mime_is_lwsp(*inptr))
+ while (inptr < inend && camel_mime_is_type (*inptr, mask))
inptr++;
if (inptr == inend) {
- g_string_append_len(out, start, inptr-start);
+ append (out, start, inptr - start);
break;
} else if (dword == NULL) {
- g_string_append_len(out, start, inptr-start);
+ append (out, start, inptr - start);
} else {
chunk = start;
}
start = inptr;
- while (inptr < inend && !camel_mime_is_lwsp(*inptr))
+ while (inptr < inend && !camel_mime_is_type (*inptr, mask))
inptr++;
dword = rfc2047_decode_word(start, inptr-start);
@@ -1178,7 +1204,15 @@ camel_header_decode_string (const char *in, const char *default_charset)
{
if (in == NULL)
return NULL;
- return header_decode_text (in, strlen (in), default_charset);
+ return header_decode_text (in, strlen (in), FALSE, default_charset);
+}
+
+char *
+camel_header_format_ctext (const char *in, const char *default_charset)
+{
+ if (in == NULL)
+ return NULL;
+ return header_decode_text (in, strlen (in), TRUE, default_charset);
}
/* how long a sequence of pre-encoded words should be less than, to attempt to
@@ -2830,7 +2864,7 @@ header_append_param(struct _camel_header_param *last, char *name, char *value)
node->next = NULL;
node->name = name;
if (strncmp(value, "=?", 2) == 0
- && (node->value = header_decode_text(value, strlen(value), NULL))) {
+ && (node->value = header_decode_text(value, strlen(value), FALSE, NULL))) {
g_free(value);
} else if (!g_utf8_validate(value, -1, NULL)) {
const char * charset = e_iconv_locale_charset();
diff --git a/camel/camel-mime-utils.h b/camel/camel-mime-utils.h
index 23987a5c16..c75b8461c5 100644
--- a/camel/camel-mime-utils.h
+++ b/camel/camel-mime-utils.h
@@ -194,6 +194,9 @@ int camel_header_decode_int (const char **in);
char *camel_header_decode_string (const char *in, const char *default_charset);
char *camel_header_encode_string (const unsigned char *in);
+/* decode (text | comment) - a one-way op */
+char *camel_header_format_ctext (const char *in, const char *default_charset);
+
/* encode a phrase, like the real name of an address */
char *camel_header_encode_phrase (const unsigned char *in);