mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-08-19 21:53:19 +00:00
Added support for the parameter "IMAPLoginMailField" for SQL/LDAP sources, and the parameter "authenticationFilter" for SQL sources. See ChangeLog.
Monotone-Parent: 1cdaff22cdbdb961e1937dc8f1ac1936bd06dc99 Monotone-Revision: 36439821e42cfcb830bfff9081d7e1318f1e92ab Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2011-04-14T18:41:10 Monotone-Branch: ca.inverse.sogo
This commit is contained in:
+88
-23
@@ -2,7 +2,8 @@
|
||||
*
|
||||
* Copyright (C) 2009-2011 Inverse inc.
|
||||
*
|
||||
* Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
* Authors: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
* Francis Lachapelle <flachapelle@inverse.ca>
|
||||
*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -31,9 +32,8 @@
|
||||
|
||||
#import <GDLContentStore/GCSChannelManager.h>
|
||||
#import <GDLContentStore/NSURL+GCS.h>
|
||||
#import <GDLContentStore/EOQualifier+GCS.h>
|
||||
#import <GDLAccess/EOAdaptorChannel.h>
|
||||
#import <GDLAccess/EOAdaptorContext.h>
|
||||
#import <GDLAccess/EOAttribute.h>
|
||||
|
||||
#import "SOGoConstants.h"
|
||||
#import "NSString+Utilities.h"
|
||||
@@ -79,6 +79,7 @@
|
||||
if ((self = [super init]))
|
||||
{
|
||||
_sourceID = nil;
|
||||
_authenticationFilter = nil;
|
||||
_mailFields = nil;
|
||||
_userPasswordAlgorithm = nil;
|
||||
_viewURL = nil;
|
||||
@@ -90,6 +91,7 @@
|
||||
- (void) dealloc
|
||||
{
|
||||
[_sourceID release];
|
||||
[_authenticationFilter release];
|
||||
[_mailFields release];
|
||||
[_userPasswordAlgorithm release];
|
||||
[_viewURL release];
|
||||
@@ -103,8 +105,10 @@
|
||||
self = [self init];
|
||||
|
||||
ASSIGN(_sourceID, [udSource objectForKey: @"id"]);
|
||||
ASSIGN(_authenticationFilter, [udSource objectForKey: @"authenticationFilter"]);
|
||||
ASSIGN(_mailFields, [udSource objectForKey: @"MailFieldNames"]);
|
||||
ASSIGN(_userPasswordAlgorithm, [udSource objectForKey: @"userPasswordAlgorithm"]);
|
||||
ASSIGN(_imapLoginField, [udSource objectForKey: @"IMAPLoginFieldName"]);
|
||||
|
||||
if (!_userPasswordAlgorithm)
|
||||
_userPasswordAlgorithm = @"none";
|
||||
@@ -203,9 +207,10 @@
|
||||
grace: (int *) _grace
|
||||
{
|
||||
EOAdaptorChannel *channel;
|
||||
EOQualifier *qualifier;
|
||||
GCSChannelManager *cm;
|
||||
NSException *ex;
|
||||
NSString *sql;
|
||||
NSMutableString *sql;
|
||||
BOOL rc;
|
||||
|
||||
rc = NO;
|
||||
@@ -214,12 +219,25 @@
|
||||
cm = [GCSChannelManager defaultChannelManager];
|
||||
channel = [cm acquireOpenChannelForURL: _viewURL];
|
||||
if (channel)
|
||||
{
|
||||
sql = [NSString stringWithFormat: (@"SELECT c_password"
|
||||
@" FROM %@"
|
||||
@" WHERE c_uid = '%@'"),
|
||||
[_viewURL gcsTableName], _login];
|
||||
|
||||
{
|
||||
qualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_uid"
|
||||
operatorSelector: EOQualifierOperatorEqual
|
||||
value: _login];
|
||||
[qualifier autorelease];
|
||||
sql = [NSMutableString stringWithFormat: @"SELECT c_password"
|
||||
@" FROM %@"
|
||||
@" WHERE ",
|
||||
[_viewURL gcsTableName]];
|
||||
if (_authenticationFilter)
|
||||
{
|
||||
qualifier = [[EOAndQualifier alloc] initWithQualifiers:
|
||||
qualifier,
|
||||
[EOQualifier qualifierWithQualifierFormat: _authenticationFilter],
|
||||
nil];
|
||||
[qualifier autorelease];
|
||||
}
|
||||
[qualifier _gcsAppendToString: sql];
|
||||
|
||||
ex = [channel evaluateExpressionX: sql];
|
||||
if (!ex)
|
||||
{
|
||||
@@ -235,7 +253,8 @@
|
||||
[channel cancelFetch];
|
||||
}
|
||||
else
|
||||
[self errorWithFormat: @"could not run SQL '%@': %@", sql, ex];
|
||||
[self errorWithFormat: @"could not run SQL '%@': %@", qualifier, ex];
|
||||
|
||||
[cm releaseChannel: channel];
|
||||
}
|
||||
else
|
||||
@@ -328,8 +347,10 @@
|
||||
{
|
||||
NSMutableDictionary *response;
|
||||
EOAdaptorChannel *channel;
|
||||
EOQualifier *qualifier;
|
||||
GCSChannelManager *cm;
|
||||
NSString *sql, *value;
|
||||
NSMutableString *sql;
|
||||
NSString *value;
|
||||
NSException *ex;
|
||||
|
||||
response = nil;
|
||||
@@ -340,21 +361,21 @@
|
||||
if (channel)
|
||||
{
|
||||
if (!b)
|
||||
sql = [NSString stringWithFormat: (@"SELECT *"
|
||||
@" FROM %@"
|
||||
@" WHERE c_uid = '%@'"),
|
||||
[_viewURL gcsTableName], theID];
|
||||
sql = [NSMutableString stringWithFormat: (@"SELECT *"
|
||||
@" FROM %@"
|
||||
@" WHERE c_uid = '%@'"),
|
||||
[_viewURL gcsTableName], theID];
|
||||
else
|
||||
{
|
||||
sql = [NSString stringWithFormat: (@"SELECT *"
|
||||
@" FROM %@"
|
||||
@" WHERE c_uid = '%@' OR"
|
||||
@" LOWER(mail) = '%@'"),
|
||||
[_viewURL gcsTableName], theID, [theID lowercaseString]];
|
||||
|
||||
sql = [NSMutableString stringWithFormat: (@"SELECT *"
|
||||
@" FROM %@"
|
||||
@" WHERE c_uid = '%@' OR"
|
||||
@" LOWER(mail) = '%@'"),
|
||||
[_viewURL gcsTableName], theID, [theID lowercaseString]];
|
||||
|
||||
if (_mailFields && [_mailFields count] > 0)
|
||||
{
|
||||
sql = [sql stringByAppendingString: [self _whereClauseFromArray: _mailFields value: [theID lowercaseString] exact: YES]];
|
||||
[sql appendString: [self _whereClauseFromArray: _mailFields value: [theID lowercaseString] exact: YES]];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -397,6 +418,50 @@
|
||||
}
|
||||
|
||||
[response setObject: emails forKey: @"c_emails"];
|
||||
|
||||
// We check if the user can authenticate
|
||||
if (_authenticationFilter)
|
||||
{
|
||||
EOQualifier *q_uid, *q_auth;
|
||||
|
||||
sql = [NSMutableString stringWithFormat: @"SELECT c_uid"
|
||||
@" FROM %@"
|
||||
@" WHERE ",
|
||||
[_viewURL gcsTableName]];
|
||||
|
||||
q_auth = [EOQualifier qualifierWithQualifierFormat: _authenticationFilter];
|
||||
|
||||
q_uid = [[EOKeyValueQualifier alloc] initWithKey: @"c_uid"
|
||||
operatorSelector: EOQualifierOperatorEqual
|
||||
value: theID];
|
||||
[q_uid autorelease];
|
||||
|
||||
qualifier = [[EOAndQualifier alloc] initWithQualifiers: q_uid, q_auth, nil];
|
||||
[qualifier autorelease];
|
||||
[qualifier _gcsAppendToString: sql];
|
||||
|
||||
ex = [channel evaluateExpressionX: sql];
|
||||
if (!ex)
|
||||
{
|
||||
NSDictionary *authResponse;
|
||||
|
||||
authResponse = [channel fetchAttributes: [channel describeResults: NO] withZone: NULL];
|
||||
[response setObject: [NSNumber numberWithBool: [authResponse count] > 0] forKey: @"canAuthenticate"];
|
||||
[channel cancelFetch];
|
||||
}
|
||||
else
|
||||
[self errorWithFormat: @"could not run SQL '%@': %@", sql, ex];
|
||||
}
|
||||
else
|
||||
[response setObject: [NSNumber numberWithBool: YES] forKey: @"canAuthenticate"];
|
||||
|
||||
// We check if we should use a different login for IMAP
|
||||
if (_imapLoginField)
|
||||
{
|
||||
if ([response objectForKey: _imapLoginField])
|
||||
[response setObject: [response objectForKey: _imapLoginField] forKey: @"c_imaplogin"];
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
[self errorWithFormat: @"could not run SQL '%@': %@", sql, ex];
|
||||
|
||||
Reference in New Issue
Block a user