]> err.no Git - scalable-opengroupware.org/commitdiff
optimized IMAP4 selects
authorhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Tue, 8 Feb 2005 19:05:35 +0000 (19:05 +0000)
committerhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Tue, 8 Feb 2005 19:05:35 +0000 (19:05 +0000)
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@535 d1b88da0-ebda-0310-925b-ed51d893ca5b

SOGo/SoObjects/Mailer/ChangeLog
SOGo/SoObjects/Mailer/SOGoMailAccount.m
SOGo/SoObjects/Mailer/SOGoMailAccounts.m
SOGo/SoObjects/Mailer/SOGoMailBaseObject.h
SOGo/SoObjects/Mailer/SOGoMailBaseObject.m
SOGo/SoObjects/Mailer/SOGoMailManager.m
SOGo/SoObjects/Mailer/Version

index e5807252bd484375380e0724b0e5d141a2586266..eb33a83738c70322d1043c275e78d8c6ec454139 100644 (file)
@@ -1,5 +1,14 @@
 2005-02-08  Helge Hess  <helge.hess@opengroupware.org>
 
+       * v0.9.70
+       
+       * SOGoMailManager.m: only perform IMAP4 select if the folder changes
+         (gives a major speed boost), can be disabled with the
+         'SOGoAlwaysSelectIMAP4Folder' default
+       
+       * SOGoMailAccount.m: added code to take the IMAP4 login from the
+         HTTP request
+
        * v0.9.69
        
        * reworked for new NGImap4 v4.5.210 API
index 68c6ca8e348125137f3394eab2fbd86f95e0ca04..1ff8084b96657a4924d1dea7c26d98b5fc6c88cb 100644 (file)
@@ -23,6 +23,7 @@
 #include "SOGoMailFolder.h"
 #include "SOGoMailManager.h"
 #include "SOGoDraftsFolder.h"
+#include <NGObjWeb/SoHTTPAuthenticator.h>
 #include "common.h"
 
 @implementation SOGoMailAccount
@@ -78,19 +79,49 @@ static NSString *sieveFolderName  = @"Filters";
   return NO;
 }
 
+- (NSString *)imap4LoginFromHTTP {
+  WORequest *rq;
+  NSString  *s;
+  NSArray   *creds;
+  
+  rq = [[(WOApplication *)[WOApplication application] context] request];
+  
+  s = [rq headerForKey:@"x-webobjects-remote-user"];
+  if ([s length] > 0)
+    return s;
+  
+  if ((s = [rq headerForKey:@"authorization"]) == nil) {
+    /* no basic auth */
+    return nil;
+  }
+  
+  creds = [SoHTTPAuthenticator parseCredentials:s];
+  if ([creds count] < 2)
+    /* somehow invalid */
+    return nil;
+  
+  return [creds objectAtIndex:0]; /* the user */
+}
+
 - (NSURL *)imap4URL {
   /* imap://agenortest@mail.opengroupware.org/INBOX/withsubdirs/subdir1 */
   NSString *s;
   NSRange  r;
-
+  
   if (self->imap4URL != nil)
     return self->imap4URL;
   
   s = [self nameInContainer];
   r = [s rangeOfString:@"@"];
   if (r.length == 0) {
-    [self errorWithFormat:@"missing login in account folder name: %@", s];
-    return nil;
+    NSString *u;
+    
+    u = [self imap4LoginFromHTTP];
+    if ([u length] == 0) {
+      [self errorWithFormat:@"missing login in account folder name: %@", s];
+      return nil;
+    }
+    s = [[u stringByAppendingString:@"@"] stringByAppendingString:s];
   }
   if ([s hasSuffix:@":80"]) { // HACK
     [self logWithFormat:@"WARNING: incorrect value for IMAP4 URL: '%@'", s];
@@ -104,6 +135,10 @@ static NSString *sieveFolderName  = @"Filters";
   return self->imap4URL;
 }
 
+- (NSString *)imap4Login {
+  return [[self imap4URL] user];
+}
+
 /* name lookup */
 
 - (id)lookupFolder:(NSString *)_key ofClassNamed:(NSString *)_cn
index 3f1c24e9ee6dd53d07ea508f7e962f82a123d5a9..6c9e7c0dfa49d3d4796a0a04479ff8363da3ecd3 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2004 SKYRIX Software AG
+  Copyright (C) 2004-2005 SKYRIX Software AG
 
   This file is part of OpenGroupware.org.
 
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id: SOGoMailAccounts.m 274 2004-08-26 13:10:49Z znek $
 
 #include "SOGoMailAccounts.h"
 #include "common.h"
 - (NSArray *)toManyRelationshipKeys {
   static AgenorUserManager *um = nil;
   NSString *uid, *account;
-
-  if(!um)
-    um = [AgenorUserManager sharedUserManager];
-  uid = [[self container] davDisplayName];
+  
+  if (um == nil)
+    um = [[AgenorUserManager sharedUserManager] retain];
+  
+  uid     = [[self container] davDisplayName];
   account = [um getIMAPAccountStringForUID:uid];
-  if(!account)
-    return nil;
-  return [NSArray arrayWithObject:account];
+  
+  return account ? [NSArray arrayWithObject:account] : nil;
 }
 
 /* name lookup */
index ee8455e92cf6e678178d0cb0bc2af67b196487ff..77951f9cd2db363ef176d00e67fe84f254d12cc7 100644 (file)
@@ -58,6 +58,7 @@
 
 - (SOGoMailManager *)mailManager;
 - (NSURL *)imap4URL;
+- (NSString *)imap4Login;
 - (NSString *)imap4Password;
 - (NSString *)imap4FolderName;
 - (NGImap4Client *)imap4Client;
index 344ec6b740882d5160f6ad7413e76bc2bb3dfaa2..07c4537148b743b714a0924d88018210da9b5897 100644 (file)
@@ -105,6 +105,12 @@ static BOOL debugOn = YES;
   return [[self mailManager] imap4FolderNameForURL:[self imap4URL]];
 }
 
+- (NSString *)imap4Login {
+  if (![[self container] respondsToSelector:_cmd])
+    return nil;
+  
+  return [[self container] imap4Login];
+}
 - (NSString *)imap4Password {
   /*
     Extract password from basic authentication.
index d92c2000f8c5afb35d4c3da7f3873ed8386f0b7a..eb27b40260d4b3e8c94356db83519ca1009dacaa 100644 (file)
@@ -37,18 +37,23 @@ static BOOL           debugOn    = NO;
 static BOOL           debugCache = NO;
 static BOOL           debugKeys  = NO;
 static BOOL           poolingOff = NO;
+static BOOL           alwaysSelect = NO;
 static NSTimeInterval PoolScanInterval = 5 * 60;
 static NSString       *imap4Separator  = nil;
 
 + (void)initialize {
   NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
   
-  debugOn    = [ud boolForKey:@"SOGoEnableIMAP4Debug"];
-  debugCache = [ud boolForKey:@"SOGoEnableIMAP4CacheDebug"];
-  poolingOff = [ud boolForKey:@"SOGoDisableIMAP4Pooling"];
-
+  debugOn      = [ud boolForKey:@"SOGoEnableIMAP4Debug"];
+  debugCache   = [ud boolForKey:@"SOGoEnableIMAP4CacheDebug"];
+  poolingOff   = [ud boolForKey:@"SOGoDisableIMAP4Pooling"];
+  alwaysSelect = [ud boolForKey:@"SOGoAlwaysSelectIMAP4Folder"];
+  
   if (debugOn)    NSLog(@"Note: SOGoEnableIMAP4Debug is enabled!");
   if (poolingOff) NSLog(@"WARNING: IMAP4 connection pooling is disabled!");
+
+  if (alwaysSelect)
+    NSLog(@"WARNING: 'SOGoAlwaysSelectIMAP4Folder' enabled (slow down)");
   
   imap4Separator = [[ud stringForKey:@"SOGoIMAP4StringSeparator"] copy];
   if ([imap4Separator length] == 0)
@@ -212,6 +217,28 @@ static NSString       *imap4Separator  = nil;
   [entry flushMailCaches];
 }
 
+- (BOOL)selectFolder:(id)_url inClient:(NGImap4Client *)_client {
+  NSDictionary *result;
+  NSString     *newFolder;
+  
+  newFolder = [_url isKindOfClass:[NSURL class]]
+    ? [self imap4FolderNameForURL:_url]
+    : _url;
+  
+  if (!alwaysSelect) {
+    if ([[_client selectedFolderName] isEqualToString:newFolder])
+      return YES;
+  }
+  
+  result = [_client select:newFolder];
+  if (![[result valueForKey:@"result"] boolValue]) {
+    [self errorWithFormat:@"could not select URL: %@: %@", _url, result];
+    return NO;
+  }
+
+  return YES;
+}
+
 /* folder hierarchy */
 
 - (NSArray *)_getDirectChildren:(NSArray *)_array folderName:(NSString *)_fn {
@@ -439,11 +466,8 @@ static NSString       *imap4Separator  = nil;
   
   /* select folder and fetch */
   
-  result = [[entry client] select:[self imap4FolderNameForURL:_url]];
-  if (![[result valueForKey:@"result"] boolValue]) {
-    [self errorWithFormat:@"could not select URL: %@: %@", _url, result];
+  if (![self selectFolder:_url inClient:[entry client]])
     return nil;
-  }
   
   result = [[entry client] sort:_so qualifier:_qualifier encoding:@"UTF-8"];
   if (![[result valueForKey:@"result"] boolValue]) {
@@ -493,12 +517,9 @@ static NSString       *imap4Separator  = nil;
     return nil;
 
   /* select folder */
-  
-  result = [client select:[self imap4FolderNameForURL:_url]];
-  if (![[result valueForKey:@"result"] boolValue]) {
-    [self errorWithFormat:@"could not select URL: %@: %@", _url, result];
+
+  if (![self selectFolder:_url inClient:client])
     return nil;
-  }
   
   /* fetch parts */
   
@@ -529,12 +550,9 @@ static NSString       *imap4Separator  = nil;
   /* select folder */
   
   p = [self imap4FolderNameForURL:_url removeFileName:NO];
-  result = [client select:p];
-  if (![[result valueForKey:@"result"] boolValue]) {
-    [self errorWithFormat:@"could not select URL: %@: %@", _url, result];
+  if (![self selectFolder:p inClient:client])
     return nil;
-  }
-
+  
   /* expunge */
   
   result = [client expunge];
@@ -560,12 +578,9 @@ static NSString       *imap4Separator  = nil;
   
   /* select folder */
   
-  result = [client select:[self imap4FolderNameForURL:_url
-                               removeFileName:YES]];
-  if (![[result valueForKey:@"result"] boolValue]) {
-    [self errorWithFormat:@"could not select URL: %@: %@", _url, result];
+  if (![self selectFolder:[self imap4FolderNameForURL:_url removeFileName:YES]
+            inClient:client])
     return nil;
-  }
   
   /* fetch parts */
   
index 4a26ace74ea17bd9ac90c286ac146045f2507ef3..49a931925db8973c258ed557b1ef2c4b80ca5ed8 100644 (file)
@@ -1,6 +1,6 @@
 # Version file
 
-SUBMINOR_VERSION:=69
+SUBMINOR_VERSION:=70
 
 # v0.9.69 requires libNGMime       v4.5.210
 # v0.9.55 requires libNGExtensions v4.5.136