On Wed, 2004-08-11 at 12:09 -0400, Jeffrey Stedfast wrote:
> On Wed, 2004-08-11 at 11:06 +0800, Not Zed wrote:
> >
> > Don't like this, it just duplicates a bunch of code. See attached
> > (totally untested but i think the logic is right).
> >
> > I don't really like it as a ctext decoder anyway, it isn't actually
> > decoding to the rfc, it is just a simplistic scanner which will
> > 'probably work in most cases'. e.g. it doesn't handle \ properly in
> > comments. Then again, this is hardly a major issue.
> >
> > The other problem is that it is necessarily a one-way conversion (you
> > will have to lose the comment structure), perhaps it should be called
> > _format rather than _decode, to match the rest of the api (i put this
> > in the patch).
> >
>
> yea, I apparently overlooked 'quoted-pair', but I'm thinking we should
> handle it before committing a fix. if we're gonna do it, might as well
> do it right, etc.
>
> I do agree that _format() might be a better name and as I mentioned in
> my original patch mail, I figured we should merge it into
> header_decode_text() as well.
>
> I'll send an updated patch when I finish it.
>
> Jeff
>
> >
> > Plain text document attachment (62771.b.diff)
> > Index: camel/camel-mime-utils.c
> > ===================================================================
> > RCS file: /cvs/gnome/evolution/camel/camel-mime-utils.c,v
> > retrieving revision 1.212
> > diff -u -3 -r1.212 camel-mime-utils.c
> > --- camel/camel-mime-utils.c 30 Jul 2004 15:30:38 -0000 1.212
> > +++ camel/camel-mime-utils.c 11 Aug 2004 03:03:33 -0000
> > @@ -57,6 +57,9 @@
> > #include "broken-date-parser.h"
> > #endif
> >
> > +/* syntactic helper for more direct table lookups */
> > +#define cm_is_mask(x, m) ((camel_mime_special_table[(unsigned char)(x)] & (m)) == 0)
> > +
> > #if 0
> > int strdup_count = 0;
> > int malloc_count = 0;
> > @@ -1119,13 +1122,15 @@
> > }
> >
> > /* decodes a simple text, rfc822 + rfc2047 */
> > +/* If ctext is set, look for rfc2047 encoded words not separated by whitespace */
> > static char *
> > -header_decode_text (const char *in, size_t inlen, const char *default_charset)
> > +header_decode_text (const char *in, size_t inlen, const char *default_charset, int ctext)
> > {
> > GString *out;
> > const char *inptr, *inend, *start, *chunk, *locale_charset;
> > char *dword = NULL;
> > -
> > + int mask;
> > +
> > locale_charset = e_iconv_locale_charset ();
> >
> > out = g_string_new ("");
> > @@ -1133,9 +1138,14 @@
> > inend = inptr + inlen;
> > chunk = NULL;
> >
> > + if (ctext)
> > + mask = (CAMEL_MIME_IS_SPECIAL|CAMEL_MIME_IS_SPACE|CAMEL_MIME_IS_CTRL);
> > + else
> > + mask = (CAMEL_MIME_IS_LWSP);
> > +
> > while (inptr < inend) {
> > start = inptr;
> > - while (inptr < inend && camel_mime_is_lwsp(*inptr))
> > + while (inptr < inend && !cm_is_mask(*inptr, mask))
> > inptr++;
> >
> > if (inptr == inend) {
> > @@ -1148,7 +1158,7 @@
> > }
> >
> > start = inptr;
> > - while (inptr < inend && !camel_mime_is_lwsp(*inptr))
> > + while (inptr < inend && cm_is_mask(*inptr, mask))
> > inptr++;
> >
> > dword = rfc2047_decode_word(start, inptr-start);
> > @@ -1178,7 +1188,15 @@
> > {
> > if (in == NULL)
> > return NULL;
> > - return header_decode_text (in, strlen (in), default_charset);
> > + return header_decode_text (in, strlen (in), default_charset, FALSE);
> > +}
> > +
> > +char *
> > +camel_header_format_ctext(const char *in, const char *default_charset)
> > +{
> > + if (in == NULL)
> > + return NULL;
> > + return header_decode_text (in, strlen (in), default_charset, TRUE);
> > }
> >
> > /* how long a sequence of pre-encoded words should be less than, to attempt to
> > @@ -2830,7 +2848,7 @@
> > 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), NULL, FALSE))) {
> > g_free(value);
> > } else if (!g_utf8_validate(value, -1, NULL)) {
> > const char * charset = e_iconv_locale_charset();
> > Index: camel/camel-mime-utils.h
> > ===================================================================
> > RCS file: /cvs/gnome/evolution/camel/camel-mime-utils.h,v
> > retrieving revision 1.56
> > diff -u -3 -r1.56 camel-mime-utils.h
> > --- camel/camel-mime-utils.h 18 Jun 2004 20:07:09 -0000 1.56
> > +++ camel/camel-mime-utils.h 11 Aug 2004 03:03:33 -0000
> > @@ -193,6 +193,8 @@
> > /* decode/encode a string type, like a subject line */
> > char *camel_header_decode_string (const char *in, const char *default_charset);
> > char *camel_header_encode_string (const unsigned char *in);
> > +/* decode ( text | comment ), this is 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);
--
Jeffrey Stedfast
Evolution Hacker - Novell, Inc.
fejj ximian com - www.novell.com
? 55303-2.patch
? 55303.patch
? 62377.patch
? 62771-mailer.patch
? mail-session.diff
? ms.c
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/mail/ChangeLog,v
retrieving revision 1.3430
diff -u -r1.3430 ChangeLog
--- ChangeLog 10 Aug 2004 19:10:06 -0000 1.3430
+++ ChangeLog 11 Aug 2004 16:48:52 -0000
@@ -1,3 +1,12 @@
+2004-08-10 Jeffrey Stedfast <fejj novell com>
+
+ Partial fix for bug #62771
+
+ * em-format-quote.c (emfq_format_header): Same.
+
+ * em-format-html.c (efh_format_header): Decode the
+ X-Mailer/User-Agent headers.
+
2004-08-06 Jeffrey Stedfast <fejj novell com>
* em-folder-tree-model.c (em_folder_tree_model_get_selected):
Index: em-format-html.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/em-format-html.c,v
retrieving revision 1.62
diff -u -r1.62 em-format-html.c
--- em-format-html.c 10 Jul 2004 01:31:04 -0000 1.62
+++ em-format-html.c 11 Aug 2004 16:48:53 -0000
@@ -1552,7 +1552,7 @@
} else if (!strcmp(name, "x-evolution-mailer")) {
/* pseudo-header */
label = _("Mailer");
- txt = header->value;
+ txt = value = camel_header_format_ctext (header->value, charset);
flags |= EM_FORMAT_HEADER_BOLD;
} else if (!strcmp(name, "date") || !strcmp(name, "resent-date")) {
int msg_offset, local_tz;
Index: em-format-quote.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/em-format-quote.c,v
retrieving revision 1.12
diff -u -r1.12 em-format-quote.c
--- em-format-quote.c 10 Jul 2004 01:31:04 -0000 1.12
+++ em-format-quote.c 11 Aug 2004 16:48:53 -0000
@@ -309,6 +309,8 @@
if (!(txt = camel_medium_get_header (part, "user-agent")))
return;
+ txt = value = camel_header_format_ctext (txt, charset);
+
label = _("Mailer");
flags |= EM_FORMAT_HEADER_BOLD;
} else if (!strcmp (name, "date") || !strcmp (name, "resent-date")) {
? 24026.patch
? 62136.patch
? 62771-camel.patch
? body
? body.c
? body.txt
? body2.txt
? build.patch
? charset-map.c
? charset-map.diff
? class.sh
? cmsutil.c
? date.patch
? flags
? foo
? foo.txt
? foo2.txt
? gw-body.txt
? iso
? iso.c
? lang.patch
? namespace.sh
? smime
? providers/imap4/reconnect.patch
? tests/data/camel-mime-tests.tar.gz
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/camel/ChangeLog,v
retrieving revision 1.2237
diff -u -r1.2237 ChangeLog
--- ChangeLog 6 Aug 2004 19:24:03 -0000 1.2237
+++ ChangeLog 11 Aug 2004 16:45:26 -0000
@@ -1,3 +1,15 @@
+2004-08-11 Jeffrey Stedfast <fejj novell com>
+
+ Fix for bug #62771
+
+ * camel-mime-utils.c (string_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-06 Jeffrey Stedfast <fejj novell com>
* providers/imap4/camel-imap4-summary.c (untagged_fetch_all): Call
Index: camel-mime-utils.c
===================================================================
RCS file: /cvs/gnome/evolution/camel/camel-mime-utils.c,v
retrieving revision 1.212
diff -u -r1.212 camel-mime-utils.c
--- camel-mime-utils.c 30 Jul 2004 15:30:38 -0000 1.212
+++ camel-mime-utils.c 11 Aug 2004 16:45:26 -0000
@@ -1118,39 +1118,71 @@
}
+static void
+string_append_quoted_pair (GString *str, const char *in, int inlen)
+{
+ register const char *inptr = in;
+ const char *inend = in + inlen;
+ const char *start;
+
+ while (inptr < inend) {
+ start = inptr;
+ while (inptr < inend && *inptr != '\\')
+ inptr++;
+
+ g_string_append_len (str, start, inptr - start);
+ inptr++;
+
+ if (inptr < inend)
+ g_string_append_c (str, *inptr++);
+ }
+}
+
/* 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;
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);
+ else
+ mask = (CAMEL_MIME_IS_LWSP);
+
out = g_string_new ("");
inptr = in;
inend = inptr + inlen;
chunk = NULL;
-
+
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);
+ if (ctext)
+ string_append_quoted_pair (out, start, inptr - start);
+ else
+ g_string_append_len (out, start, inptr - start);
break;
} else if (dword == NULL) {
- g_string_append_len(out, start, inptr-start);
+ if (ctext)
+ string_append_quoted_pair (out, start, inptr - start);
+ else
+ g_string_append_len (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);
if (dword) {
g_string_append(out, dword);
@@ -1178,7 +1210,15 @@
{
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 +2870,7 @@
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();
Index: camel-mime-utils.h
===================================================================
RCS file: /cvs/gnome/evolution/camel/camel-mime-utils.h,v
retrieving revision 1.56
diff -u -r1.56 camel-mime-utils.h
--- camel-mime-utils.h 18 Jun 2004 20:07:09 -0000 1.56
+++ camel-mime-utils.h 11 Aug 2004 16:45:26 -0000
@@ -194,6 +194,9 @@
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);
Attachment:
smime.p7s
Description: S/MIME cryptographic signature