]> err.no Git - sope/commitdiff
added quoted printable envelope decoding
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Sat, 2 Oct 2004 15:39:10 +0000 (15:39 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Sat, 2 Oct 2004 15:39:10 +0000 (15:39 +0000)
git-svn-id: http://svn.opengroupware.org/SOPE/trunk@216 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

12 files changed:
sope-mime/ChangeLog
sope-mime/NGImap4/ChangeLog
sope-mime/NGImap4/NGImap4EnvelopeAddress.h
sope-mime/NGImap4/NGImap4ResponseParser.m
sope-mime/NGMail/NGMimeMessageGenerator.m
sope-mime/NGMail/NGMimeMessageParser.m
sope-mime/NGMime/ChangeLog
sope-mime/NGMime/NGMimeAddressHeaderFieldGenerator.m
sope-mime/NGMime/NGMimeContentDispositionHeaderFieldGenerator.m
sope-mime/NGMime/NGMimeContentTypeHeaderFieldGenerator.m
sope-mime/NGMime/NGMimeUtilities.h
sope-mime/Version

index 737d468c732c12f1538c35c2f9b3d0b367f7c846..eb66ddc049c1432e0e286796456804bc63ab5c57 100644 (file)
@@ -1,5 +1,11 @@
 2004-10-02  Helge Hess  <helge.hess@opengroupware.org>
 
+       * v4.3.187
+
+       * NGMime, NGMail: minor cleanups
+
+       * NGImap4: decode quoted printable subjects and addresses
+
        * NGImap4: fixed long subject envelope processing (v4.3.186)
 
        * NGImap4: improved processing of envelope responses (v4.3.185)
index b3bf7ba59294cc9f2246d9d6f7ec8fa641880af6..8b10394d732e5158e46b113a644dccd4a18d4665 100644 (file)
@@ -1,5 +1,9 @@
 2004-10-02  Helge Hess  <helge.hess@opengroupware.org>
 
+       * NGImap4ResponseParser.m: decode quoted printable in personal names
+         of envelope addresses and in the subject, fixed a memory leak in the
+         envelope parser (v4.3.187)
+
        * NGImap4ResponseParser.m: support data-style subjects in envelopes
          (v4.3.186)
 
index 923faf9aef9acc29e8a7f59282818477656400df..6d4b54182cd36b1fce39f715bb1fc70ec525bbc9 100644 (file)
@@ -54,8 +54,8 @@
 
 /* derived accessors */
 
-- (NSString *)baseEMail;
-- (NSString *)email;
+- (NSString *)baseEMail; /* returns just: mailbox@host */
+- (NSString *)email;     /* returns: personalName <mailbox@host> */
 
 @end
 
index 6914756eefcd3d07e315806d793f1651e4018e40..f40d8cd106b6e666b5703918187ac604e5a22476 100644 (file)
@@ -127,8 +127,9 @@ static unsigned         Imap4MMDataBoundary = 0;
 static BOOL             debugOn             = NO;
 static BOOL             debugDataOn         = NO;
 static NSStringEncoding encoding;
-static Class            StrClass = Nil;
-static Class            NumClass      = Nil;
+static Class            StrClass  = Nil;
+static Class            NumClass  = Nil;
+static Class            DataClass = Nil;
 static NSStringEncoding defCStringEncoding;
 static NSNumber         *YesNum = nil;
 static NSNumber         *NoNum  = nil;
@@ -154,10 +155,11 @@ static NSNull           *null   = nil;
     /* Note: this should be larger than a usual header size! */
     Imap4MMDataBoundary = 2 * LaSize;
   
-  StrClass = [NSString class];
-  NumClass      = [NSNumber class];
-  YesNum        = [[NumClass numberWithBool:YES] retain];
-  NoNum         = [[NumClass numberWithBool:NO]  retain];
+  StrClass  = [NSString class];
+  NumClass  = [NSNumber class];
+  DataClass = [NSData class];
+  YesNum    = [[NumClass numberWithBool:YES] retain];
+  NoNum     = [[NumClass numberWithBool:NO]  retain];
 }
 
 + (id)parserWithStream:(id<NGActiveSocket>)_stream {
@@ -389,7 +391,7 @@ static void _parseSieveRespone(NGImap4ResponseParser *self,
   
   [stream close];
   [stream release]; stream = nil;
-  result = [NSData dataWithContentsOfMappedFile:path];
+  result = [DataClass dataWithContentsOfMappedFile:path];
   [[NSFileManager defaultManager] removeFileAtPath:path handler:nil];
 
   return result;
@@ -430,7 +432,7 @@ static void _parseSieveRespone(NGImap4ResponseParser *self,
     cnt++;
   }
     
-  result = [NSData dataWithBytesNoCopy:tmpBuf length:tmpBufCnt];
+  result = [DataClass dataWithBytesNoCopy:tmpBuf length:tmpBufCnt];
     
   if (buf != NULL) free(buf); buf = NULL;
   return result;
@@ -972,6 +974,38 @@ static BOOL _parseThreadResponse(NGImap4ResponseParser *self,
   return nil;
 }
 
+- (id)_decodeQP:(id)_string headerField:(NSString *)_field {
+  if (![_string isNotNull])
+    return _string;
+  
+  if ([_string isKindOfClass:DataClass])
+    return [_string decodeQuotedPrintableValueOfMIMEHeaderField:_field];
+  
+  if ([_string isKindOfClass:StrClass]) {
+    if ([_string length] <= 6 /* minimum size */)
+      return _string;
+    if ([_string characterAtIndex:0] == '=' &&
+       [_string characterAtIndex:1] == '?') {
+      NSData *data;
+      
+      if (debugOn)
+       [self debugWithFormat:@"WARNING: string with quoted printable info!"];
+      
+      // TODO: this is really expensive ...
+      data = [_string dataUsingEncoding:NSUTF8StringEncoding];
+      if (data != nil) {
+       NSData *qpData;
+       
+       qpData = [data decodeQuotedPrintableValueOfMIMEHeaderField:_field];
+       if (qpData != data) return qpData;
+      }
+    }
+    return _string;
+  }
+  
+  return _string;
+}
+
 - (NGImap4EnvelopeAddress *)_parseEnvelopeAddressStructure {
   /* 
      Note: returns retained object!
@@ -995,11 +1029,18 @@ static BOOL _parseThreadResponse(NGImap4ResponseParser *self,
     return nil;
   }
   _consume(self, 1); // '('
+
+  /* parse personal name, can be with quoted printable encoding! */
+  
+  pname = [self _parseQuotedStringOrNIL];
+  if ([pname isNotNull])
+    pname = [self _decodeQP:pname headerField:@"subject"];
+  [self _consumeOptionalSpace];
   
-  pname = [[self _parseQuotedStringOrNIL] copy]; [self _consumeOptionalSpace];
-  route = [[self _parseQuotedStringOrNIL] copy]; [self _consumeOptionalSpace];
-  mailbox = [[self _parseQuotedStringOrNIL] copy];[self _consumeOptionalSpace];
-  host  = [[self _parseQuotedStringOrNIL] copy]; [self _consumeOptionalSpace];
+  // TODO: I think those forbid QP encoding?
+  route   = [self _parseQuotedStringOrNIL]; [self _consumeOptionalSpace];
+  mailbox = [self _parseQuotedStringOrNIL]; [self _consumeOptionalSpace];
+  host    = [self _parseQuotedStringOrNIL]; [self _consumeOptionalSpace];
   
   if (_la(self, 0) != ')') {
     [self logWithFormat:@"WARNING: IMAP4 envelope "
@@ -1092,11 +1133,13 @@ static BOOL _parseThreadResponse(NGImap4ResponseParser *self,
   
   /* parse subject */
   
-  if ((tmp = [self _parseQuotedStringOrDataOrNIL])) {
+  if ((tmp = [self _parseQuotedStringOrDataOrNIL]) != nil) {
     // TODO: that one is an issue, the client does know the requested charset
     //       but doesn't pass it down to the parser? Requiring the client to
     //       deal with NSData's is a bit overkill?
-    env->subject = [tmp isNotNull] ? [tmp copy] : nil;
+    env->subject = [tmp isNotNull] 
+      ? [[self _decodeQP:tmp headerField:@"subject"] copy]
+      : nil;
     [self _consumeOptionalSpace];
   }
   else {
@@ -1412,7 +1455,7 @@ static NSString *_parseBodyDecodeString(NGImap4ResponseParser *self,
 static NSString *_parseBodyString(NGImap4ResponseParser *self,
                                   BOOL _convertString)
 {
-  return _parseBodyDecodeString(self, _convertString, NO);
+  return _parseBodyDecodeString(self, _convertString, NO /* no decode */);
 }
 
 static NSDictionary *_parseBodyParameterList(NGImap4ResponseParser *self)
index 4f4928aa1afa3aec2c1ca37b8a62bf70058fe2a2..6e61755faf726374f6ee164acb5171e8e125e819 100644 (file)
@@ -18,7 +18,7 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
+// $Id: NGMimeMessageGenerator.m 11 2004-08-20 19:20:03Z helge $
 
 #include "NGMimeMessageGenerator.h"
 #include "NGMimeMessage.h"
@@ -142,7 +142,7 @@ _base64Encoding(NGMimeBodyGenerator *self,
       }
       cnt++;
     }
-    if (doEnc == YES) {
+    if (doEnc) {
       char        iso[]     = "=?iso-8859-15?q?";
       unsigned    isoLen    = 16;
       char        isoEnd[]  = "?=";
index f3c68b95a1688478270c7aafcdeac86df996f6f4..ace9611e8f00a8f7c7e2691e4d6e2dfa0a803163 100644 (file)
@@ -1,7 +1,7 @@
 /*
-  Copyright (C) 2000-2003 SKYRIX Software AG
+  Copyright (C) 2000-2004 SKYRIX Software AG
 
-  This file is part of OGo
+  This file is part of OpenGroupware.org.
 
   OGo is free software; you can redistribute it and/or modify it under
   the terms of the GNU Lesser General Public License as published by the
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #include "NGMimeMessageParser.h"
 #include "NGMimeMessage.h"
@@ -166,7 +165,7 @@ static Class NSStringClass = Nil;
     int           cnt, tmp;
     unsigned char encoding;
     
-    buffer = calloc(sizeof(unichar), length + 13);
+    buffer = calloc(length + 13, sizeof(unichar));
     
     maxBufLen             = length + 3;
     buffer[maxBufLen - 1] = '\0';
index 3d47c3a238b477f438aa79e14f09b183d49725af..eaf949a38ebc16247175595c948b0538211f3b5b 100644 (file)
@@ -1,5 +1,7 @@
 2004-09-30  Helge Hess  <helge.hess@skyrix.com>
 
+       * NGMime: minor cleanups (v4.3.187)
+
        * NGMimePartParser.m: fixed an issue with unlimited length parsing,
          fixes OGo bug #936 (v4.3.182)
 
index e1aea78e06a6a5bfa51c66963de7d4b587cf5382..25082e47e2ca9de49beb47b9bc80b7771d5557c2 100644 (file)
@@ -18,7 +18,7 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
+// $Id: NGMimeAddressHeaderFieldGenerator.m 1 2004-08-20 10:08:27Z znek $
 
 #include "NGMimeHeaderFieldGenerator.h"
 #include "NGMimeHeaderFields.h"
@@ -107,7 +107,7 @@ static int UseLFSeperatedAddressEntries = -1;
       unsigned      desLen;
       unsigned char *des;
       
-      free(buffer);
+      if (buffer) free(buffer);
       {
         NSData *data;
 
@@ -118,7 +118,7 @@ static int UseLFSeperatedAddressEntries = -1;
 #endif
 
         bufLen  = [data length];
-        buffer =  malloc(bufLen+1);
+        buffer =  malloc(bufLen + 10);
         [data getBytes:buffer];  buffer[bufLen] = '\0';
       }
           
index c7421fb227cf2a97d3f16ca65c41ca613c1625df..e8e7597f08a5c1a90fa165f77486ca5aa6d34374 100644 (file)
@@ -18,7 +18,7 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
+// $Id: NGMimeContentDispositionHeaderFieldGenerator.m 1 2004-08-20 10:08:27Z znek $
 
 #include "NGMimeHeaderFieldGenerator.h"
 #include "NGMimeHeaderFields.h"
@@ -82,7 +82,7 @@
         unsigned    desLen;
         char        *des;
       
-        free(ctmp);
+        if (ctmp) free(ctmp);
         {
           NSData *data;
 
index 6a2545db3d9773a9ed9e5b18ce3d3efb89860d9b..e7e9a49aa7aa0f9ba2eecffa91bb5e8c01b43f4e 100644 (file)
@@ -18,7 +18,7 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
+// $Id: NGMimeContentTypeHeaderFieldGenerator.m 1 2004-08-20 10:08:27Z znek $
 
 #include "NGMimeHeaderFieldGenerator.h"
 #include "NGMimeHeaderFields.h"
 #endif
 
             len  = [data length];
-            ctmp =  malloc(len+1);
+            ctmp =  malloc(len + 10);
             [data getBytes:ctmp];  ctmp[len] = '\0';
           }
           
index 78c50890a314581196020948d3721b1b43910390..29e10c1126dc06615bba22f9f78d6c361e2f55dd 100644 (file)
@@ -1,7 +1,7 @@
 /*
-  Copyright (C) 2000-2003 SKYRIX Software AG
+  Copyright (C) 2000-2004 SKYRIX Software AG
 
-  This file is part of OGo
+  This file is part of OpenGroupware.org.
 
   OGo is free software; you can redistribute it and/or modify it under
   the terms of the GNU Lesser General Public License as published by the
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #ifndef __NGMime_NGMimeUtilities_H__
 #define __NGMime_NGMimeUtilities_H__
index 9033d0e8151711ac48a39632ae388c3604435cbb..b223b20be585987ffc94137fc50fc2d5029605c1 100644 (file)
@@ -2,6 +2,6 @@
 
 MAJOR_VERSION:=4
 MINOR_VERSION:=3
-SUBMINOR_VERSION:=186
+SUBMINOR_VERSION:=187
 
 # v4.2.149 requires libNGStreams v4.2.34