--- parser3/src/main/untaint.C 2002/08/01 11:26:51 1.103 +++ parser3/src/main/untaint.C 2002/09/16 07:08:49 1.107 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_UNTAINT_C="$Id: untaint.C,v 1.103 2002/08/01 11:26:51 paf Exp $"; +static const char* IDENT_UNTAINT_C="$Date: 2002/09/16 07:08:49 $"; #include "pa_pool.h" #include "pa_string.h" @@ -395,6 +395,7 @@ char *String::store_to(char *dest, Untai break; case UL_MAIL_HEADER: // tainted, untaint language: mail-header + // http://www.ietf.org/rfc/rfc2047.txt if(store_to_charset && store_to_charset_name) { const void *mail_ptr; size_t mail_size; @@ -405,20 +406,48 @@ char *String::store_to(char *dest, Untai // Subject: Re: parser3: =?koi8-r?Q?=D3=C5=CD=C9=CE=C1=D2?= const char *src=(const char *)mail_ptr; bool to_quoted_printable=false; + + //RFC + An 'encoded-word' MUST NOT appear in any portion of an 'addr-spec'. + const char *tail=src+mail_size; + if(*--tail=='>') { + for(int size=mail_size-1; size--; tail--) + if(*tail=='<') + break; + } + const char *stop=*tail=='<'?tail:0; + while(stop>src && stop[-1]==' ') + --stop; + + bool closed=false; for(int size=mail_size; size--; src++) { - if((*src & 0x80) // starting quote-printable-encoding on first 8bit char - || (to_quoted_printable && (*src=='?' || *src=='=')) // additionally encoding '?' and '|' - ) { +/*RFC +(3) 8-bit values which correspond to printable ASCII characters other + than "=", "?", and "_" (underscore), MAY be represented as those + characters. (But see section 5 for restrictions.) In + particular, SPACE and TAB MUST NOT be represented as themselves + within encoded words. +*/ + if(src==stop && to_quoted_printable) { + dest+=sprintf(dest, "?="); + closed=true; + to_quoted_printable=false; + } + if((!stop || src