Re: [evolution-patches] fix for bug #62771 (User-Agent doesn't get decoded in mail view)



actually this isn't right either, since it will un-escape quoted-pairs
outside comments as well, but I don't care anymore.

Jeff

On Wed, 2004-08-11 at 12:49 -0400, Jeffrey Stedfast wrote:
> 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);
> Plain text document attachment (62771-mailer.patch)
> ? 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")) {
> Plain text document attachment (62771-camel.patch)
> ? 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);
>  
-- 
Jeffrey Stedfast
Evolution Hacker - Novell, Inc.
fejj ximian com  - www.novell.com

Attachment: smime.p7s
Description: S/MIME cryptographic signature



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]