Diff for /parser3/src/main/untaint.C between versions 1.115.2.12.2.23 and 1.117.2.1

version 1.115.2.12.2.23, 2003/04/08 08:27:34 version 1.117.2.1, 2003/08/15 11:40:45
Line 81  inline bool need_file_encode(unsigned ch Line 81  inline bool need_file_encode(unsigned ch
         return strchr(          return strchr(
                           "*?'\"<>|"                            "*?'\"<>|"
 #ifndef WIN32  #ifndef WIN32
                           ":\\~"                            ":\\"
 #endif  #endif
                           , c)!=0;                            , c)!=0;
 }  }
Line 183  String& String::append_to(String& dest, Line 183  String& String::append_to(String& dest,
   
         // next: fragment infos          // next: fragment infos
                   
         if(lang==L_PASS_APPENDED) // without language-chage string?          if(lang==L_PASS_APPENDED) // without language-change?
                 dest.fragments.append(fragments);                  dest.fragments.append(fragments);
         else if(forced) //forcing passed lang?          else if(forced) //forcing passed lang?
                 dest.fragments+=Fragment(lang, length());                  dest.fragments+=Fragment(lang, length());
         else if(lang&L_OPTIMIZE_BIT) {          else if(lang&L_OPTIMIZE_BIT) {
                 Array_iterator<ArrayFragment::element_type> i(fragments);                  for(Array_iterator<ArrayFragment::element_type> i(fragments); i.has_next(); ) {
                 while(i.has_next()) {  
                         const Fragment fragment=i.next();                          const Fragment fragment=i.next();
                         // main idea here:                          // main idea here:
                         // tainted piece would get OPTIMIZED bit from 'lang'                          // tainted piece would get OPTIMIZED bit from 'lang'
Line 202  String& String::append_to(String& dest, Line 201  String& String::append_to(String& dest,
                                 fragment.length);                                  fragment.length);
                 }                  }
         } else { // The core idea: tainted pieces got marked with context's lang          } else { // The core idea: tainted pieces got marked with context's lang
                 Array_iterator<ArrayFragment::element_type> i(fragments);                  for(Array_iterator<ArrayFragment::element_type> i(fragments); i.has_next(); ) {
                 while(i.has_next()) {  
                         const Fragment fragment=i.next();                          const Fragment fragment=i.next();
                         dest.fragments+=Fragment(                          dest.fragments+=Fragment(
                                 fragment.lang==L_TAINTED?lang:fragment.lang,                                  fragment.lang==L_TAINTED?lang:fragment.lang,
Line 211  String& String::append_to(String& dest, Line 209  String& String::append_to(String& dest,
                 }                  }
         }          }
   
           ASSERT_STRING_INVARIANT(dest);
         return dest;          return dest;
 }  }
   
Line 247  inline bool mail_header_char_valid_withi Line 246  inline bool mail_header_char_valid_withi
                 || c>='0' && c<='9'                  || c>='0' && c<='9'
                 || strchr("!*+-/", c);                  || strchr("!*+-/", c);
 }  }
   inline bool addr_spec_soon(const char *src) {
           for(char c; c=*src; src++)
                   if(c=='<')
                           return true;
                   else if(!(c==' ' || c=='\t'))
                           return false;
           return false;
   }
 /**  /**
         RFC           RFC 
         Upper case should be used for hexadecimal digits "A" through "F"          Upper case should be used for hexadecimal digits "A" through "F"
Line 316  StringBody String::cstr_to_string_body(L Line 323  StringBody String::cstr_to_string_body(L
                         // tainted, untaint language: file [name]                          // tainted, untaint language: file [name]
                         escape(                          escape(
                                 // Macintosh has problems with small Russian letter 'r'                                  // Macintosh has problems with small Russian letter 'r'
                                 if( c=='\xF0' && charsets && charsets->source().name()=="windows-1251" ) {                                  if( c=='\xF0' && charsets && charsets->source().NAME()=="WINDOWS-1251" ) {
                                         // fixing that letter for most common charset                                          // fixing that letter for most common charset
                                         to_char('p');                                          to_char('p');
                                 } else // fallback to default                                  } else // fallback to default
Line 329  StringBody String::cstr_to_string_body(L Line 336  StringBody String::cstr_to_string_body(L
                                 const char *fragment_str=body.mid(fragment_begin, fragment_length).cstr();                                  const char *fragment_str=body.mid(fragment_begin, fragment_length).cstr();
                                 // skip source [we use recoded version]                                  // skip source [we use recoded version]
                                 pa_CORD_pos_advance(pos, fragment_length);                                  pa_CORD_pos_advance(pos, fragment_length);
                                 const void *client_ptr;                                  String::C output(fragment_str, fragment_length);
                                 size_t client_size;  
                                 if(charsets)                                   if(charsets) 
                                         Charset::transcode(                                          output=Charset::transcode(output, 
                                                 charsets->source(), fragment_str, fragment_length,                                                  charsets->source(), 
                                                 charsets->client(), client_ptr, client_size);                                                  charsets->client());
                                 else {  
                                         client_ptr=fragment_str;   
                                         client_size=fragment_length;  
                                 }  
   
                                 char c;                                  char c;
                                 for(const char* src=(const char* )client_ptr; c=*src++; )                                   for(const char* src=output.str; c=*src++; ) 
                                         encode(need_uri_encode, '%', c);                                          encode(need_uri_encode, '%', c);
                         }                          }
                         break;                          break;
Line 361  StringBody String::cstr_to_string_body(L Line 363  StringBody String::cstr_to_string_body(L
                                 // skip source [we use recoded version]                                  // skip source [we use recoded version]
                                 pa_CORD_pos_advance(pos, mail_size);                                  pa_CORD_pos_advance(pos, mail_size);
   
                                 const char* charset_name=charsets->mail().name().cstr();                                  const char* charset_name=charsets->mail().NAME().cstr();
   
                                 // Subject: Re: parser3: =?koi8-r?Q?=D3=C5=CD=C9=CE=C1=D2?=                                  // Subject: Re: parser3: =?koi8-r?Q?=D3=C5=CD=C9=CE=C1=D2?=
                                 bool to_quoted_printable=false;                                  bool to_quoted_printable=false;
Line 370  StringBody String::cstr_to_string_body(L Line 372  StringBody String::cstr_to_string_body(L
                                 uchar c;                                  uchar c;
                                 for(const char* src=mail_ptr; c=(uchar)*src++; ) {                                  for(const char* src=mail_ptr; c=(uchar)*src++; ) {
                                         //RFC   + An 'encoded-word' MUST NOT appear in any portion of an 'addr-spec'.                                          //RFC   + An 'encoded-word' MUST NOT appear in any portion of an 'addr-spec'.
                                         if(to_quoted_printable && (c==',' || c=='<')) {                                          if(to_quoted_printable && (c==',' || addr_spec_soon(src) || c == '"')) {
                                                 email=c=='<';                                                  email=c=='<';
                                                 to_string("?=");                                                  to_string("?=");
                                                 to_quoted_printable=false;                                                  to_quoted_printable=false;

Removed from v.1.115.2.12.2.23  
changed lines
  Added in v.1.117.2.1


E-mail: