--- parser3/src/main/untaint.C 2002/08/01 11:41:19 1.104 +++ parser3/src/main/untaint.C 2002/09/24 10:24:23 1.108 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_UNTAINT_C="$Date: 2002/08/01 11:41:19 $"; +static const char* IDENT_UNTAINT_C="$Date: 2002/09/24 10:24:23 $"; #include "pa_pool.h" #include "pa_string.h" @@ -47,20 +47,14 @@ ulong string_string_shortcut_economy=0; dest+=bsize; \ inline bool need_file_encode(unsigned char c){ - // theoretical problem with, for instance, "_2B" and "." fragments, - // they would yield the same - // because need_file_encode('_')=false - // but we need to delete such files somehow, getting names from ^index - - if((c>='0') &&(c<='9') ||(c>='A') &&(c<='Z') ||(c>='a') &&(c<='z')) - return false; - - return !strchr( - " _./()-" -#ifdef WIN32 - ":\\~" + // russian letters and space ENABLED + // encoding only these... + return strchr( + "*?'\"<>|" +#ifndef WIN32 + ":\\~" #endif - , c); + , c)!=0; } inline bool need_uri_encode(unsigned char c){ if((c>='0') &&(c<='9') ||(c>='A') &&(c<='Z') ||(c>='a') &&(c<='z')) @@ -380,21 +374,18 @@ char *String::store_to(char *dest, Untai { const char *src=(const char *)client_ptr; for(int size=client_size; size--; src++) - switch(*src) { - case ' ': to_char('+'); break; - default: encode(need_uri_encode, '%'); - }; + encode(need_uri_encode, '%'); } break; case UL_HTTP_HEADER: // tainted, untaint language: http-field-content-text - escape(switch(*src) { - case ' ': to_char('+'); break; - default: encode(need_uri_encode, '%'); - }); + escape( + encode(need_uri_encode, '%'); + ); 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 +396,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