]> err.no Git - scalable-opengroupware.org/commitdiff
improved handling of headers
authorhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Wed, 20 Jul 2005 12:01:11 +0000 (12:01 +0000)
committerhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Wed, 20 Jul 2005 12:01:11 +0000 (12:01 +0000)
added some mail classification

git-svn-id: http://svn.opengroupware.org/SOGo/trunk@843 d1b88da0-ebda-0310-925b-ed51d893ca5b

SOGo/SoObjects/Mailer/ChangeLog
SOGo/SoObjects/Mailer/SOGoMailObject.h
SOGo/SoObjects/Mailer/SOGoMailObject.m
SOGo/SoObjects/Mailer/Version

index fed53ccb899cdb37853dd4f3cdbdc94b77b1edb9..7116760f531e02acaa809af42662905678ab4d9a 100644 (file)
@@ -1,3 +1,7 @@
+2005-07-20  Helge Hess  <helge.hess@opengroupware.org>
+
+       * SOGoMailObject.m: added handling for some specific headers (v0.9.114)
+
 2005-07-19  Helge Hess  <helge.hess@opengroupware.org>
 
        * SOGoMailObject.m: changed to fetch and parse the full mail header,
index db7ab4ac003496ca7c351f804cb118b5e3b64fd7..d82a14cf1dea94420111a69fbc57bbf607f33620 100644 (file)
@@ -44,6 +44,7 @@
 {
   id coreInfos;
   id headerPart;
+  NSDictionary *headers;
 }
 
 /* message */
index d93688d7bfd0543c9661db046d13d7a3a6a24536..cd50bbed6549a9751150819ee05987919b743449 100644 (file)
@@ -74,6 +74,7 @@ static BOOL debugSoParts       = NO;
 }
 
 - (void)dealloc {
+  [self->headers    release];
   [self->headerPart release];
   [self->coreInfos  release];
   [super dealloc];
@@ -216,8 +217,7 @@ static BOOL debugSoParts       = NO;
   return [[self mailHeaderData] length] > 0 ? YES : NO;
 }
 
-- (NSDictionary *)mailHeader {
-  // TODO: cache
+- (id)mailHeaderPart {
   NGMimeMessageParser *parser;
   NSData *data;
   
@@ -238,6 +238,11 @@ static BOOL debugSoParts       = NO;
   }
   return self->headerPart;
 }
+- (NSDictionary *)mailHeaders {
+  if (self->headers == nil)
+    self->headers = [[[self mailHeaderPart] headers] copy];
+  return self->headers;
+}
 
 - (id)lookupInfoForBodyPart:(id)_path {
   NSEnumerator *pe;
@@ -758,6 +763,91 @@ static BOOL debugSoParts       = NO;
   return [NSNumber numberWithBool:YES]; /* delete was successful */
 }
 
+/* some mail classification */
+
+- (BOOL)isMailingListMail {
+  NSDictionary *h;
+  
+  if ((h = [self mailHeaders]) == nil)
+    return NO;
+  
+  return [[h objectForKey:@"list-id"] isNotEmpty];
+}
+
+- (BOOL)isVirusScanned {
+  NSDictionary *h;
+  
+  if ((h = [self mailHeaders]) == nil)
+    return NO;
+  
+  if (![[h objectForKey:@"x-virus-status"]  isNotEmpty]) return NO;
+  if (![[h objectForKey:@"x-virus-scanned"] isNotEmpty]) return NO;
+  return YES;
+}
+
+- (NSString *)scanListHeaderValue:(id)_value
+  forFieldWithPrefix:(NSString *)_prefix
+{
+  /* Note: not very tolerant on embedded commands and <> */
+  // TODO: does not really belong here, should be a header-field-parser
+  NSRange r;
+  
+  if (![_value isNotEmpty])
+    return nil;
+  
+  if ([_value isKindOfClass:[NSArray class]]) {
+    NSEnumerator *e;
+    id value;
+
+    e = [_value objectEnumerator];
+    while ((value = [e nextObject]) != nil) {
+      value = [self scanListHeaderValue:value forFieldWithPrefix:_prefix];
+      if (value != nil) return value;
+    }
+    return nil;
+  }
+  
+  if (![_value isKindOfClass:[NSString class]])
+    return nil;
+  
+  /* check for commas in string values */
+  r = [_value rangeOfString:@","];
+  if (r.length > 0) {
+    return [self scanListHeaderValue:[_value componentsSeparatedByString:@","]
+                forFieldWithPrefix:_prefix];
+  }
+
+  /* value qualifies */
+  if (![(NSString *)_value hasPrefix:_prefix])
+    return nil;
+  
+  /* unquote */
+  if ([_value characterAtIndex:0] == '<') {
+    r = [_value rangeOfString:@">"];
+    _value = (r.length == 0)
+      ? [_value substringFromIndex:1]
+      : [_value substringWithRange:NSMakeRange(1, r.location - 2)];
+  }
+
+  return _value;
+}
+
+- (NSString *)mailingListArchiveURL {
+  return [self scanListHeaderValue:
+                [[self mailHeaders] objectForKey:@"list-archive"]
+              forFieldWithPrefix:@"<http://"];
+}
+- (NSString *)mailingListSubscribeURL {
+  return [self scanListHeaderValue:
+                [[self mailHeaders] objectForKey:@"list-subscribe"]
+              forFieldWithPrefix:@"<http://"];
+}
+- (NSString *)mailingListUnsubscribeURL {
+  return [self scanListHeaderValue:
+                [[self mailHeaders] objectForKey:@"list-unsubscribe"]
+              forFieldWithPrefix:@"<http://"];
+}
+
 /* debugging */
 
 - (BOOL)isDebuggingEnabled {
index 66083a11241013b00acf2affa10dd4025ae0207e..0a1f65146c9692a6dea8da9a1ec203d7beba8df3 100644 (file)
@@ -1,7 +1,9 @@
 # Version file
 
-SUBMINOR_VERSION:=113
+SUBMINOR_VERSION:=114
 
+# v0.9.114 requires libNGMime       v4.5.229
+# v0.9.114 requires libNGExtensions v4.5.165
 # v0.9.111 requires libNGExtensions v4.5.163
 # v0.9.96  requires libNGMime       v4.5.223
 # v0.9.91  requires libNGMime       v4.5.222