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
#include "SOGoMailFolder.h"
#include "SOGoMailManager.h"
#include "SOGoDraftsFolder.h"
+#include <NGObjWeb/SoHTTPAuthenticator.h>
#include "common.h"
@implementation SOGoMailAccount
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];
return self->imap4URL;
}
+- (NSString *)imap4Login {
+ return [[self imap4URL] user];
+}
+
/* name lookup */
- (id)lookupFolder:(NSString *)_key ofClassNamed:(NSString *)_cn
/*
- Copyright (C) 2004 SKYRIX Software AG
+ Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
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 */
- (SOGoMailManager *)mailManager;
- (NSURL *)imap4URL;
+- (NSString *)imap4Login;
- (NSString *)imap4Password;
- (NSString *)imap4FolderName;
- (NGImap4Client *)imap4Client;
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.
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)
[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 {
/* 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]) {
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 */
/* 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];
/* 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 */
# Version file
-SUBMINOR_VERSION:=69
+SUBMINOR_VERSION:=70
# v0.9.69 requires libNGMime v4.5.210
# v0.9.55 requires libNGExtensions v4.5.136