See ChangeLog.

Monotone-Parent: 9622fc005299a8ed3c143c177667be6f33df9523
Monotone-Revision: d03d3ac4770756bf4494d9e20e9768b28e5ff0cb

Monotone-Author: flachapelle@inverse.ca
Monotone-Date: 2011-10-26T15:25:49
maint-2.0.2
Francis Lachapelle 2011-10-26 15:25:49 +00:00
parent d437ca0540
commit fafcd1aaab
4 changed files with 98 additions and 22 deletions

View File

@ -1,3 +1,11 @@
2011-10-26 Francis Lachapelle <flachapelle@inverse.ca>
* SoObjects/SOGo/SQLSource.m
(-checkLogin:password:perr:expire:grace:): authentication can be
performed against any database column defined in the new
LoginFieldNames defaults parameter.
(-_lookupContactEntry:considerEmail:): idem.
2011-10-25 Francis Lachapelle <flachapelle@inverse.ca> 2011-10-25 Francis Lachapelle <flachapelle@inverse.ca>
* UI/MainUI/SOGoRootPage.m (-cookieUsername) * UI/MainUI/SOGoRootPage.m (-cookieUsername)

View File

@ -761,7 +761,7 @@
else else
cacheUid = aUID; cacheUid = aUID;
jsonUser = [[SOGoCache sharedCache] userAttributesForLogin: cacheUid]; jsonUser = [[SOGoCache sharedCache] userAttributesForLogin: cacheUid];
currentUser = [jsonUser objectFromJSONString]; currentUser = [jsonUser objectFromJSONString];
if (!([currentUser objectForKey: @"emails"] if (!([currentUser objectForKey: @"emails"]
&& [currentUser objectForKey: @"cn"])) && [currentUser objectForKey: @"cn"]))
{ {

View File

@ -38,6 +38,7 @@
NSString *_sourceID; NSString *_sourceID;
NSString *_domain; NSString *_domain;
NSString *_authenticationFilter; NSString *_authenticationFilter;
NSArray *_loginFields;
NSArray *_mailFields; NSArray *_mailFields;
NSString *_imapLoginField; NSString *_imapLoginField;
NSString *_userPasswordAlgorithm; NSString *_userPasswordAlgorithm;

View File

@ -81,6 +81,7 @@
{ {
_sourceID = nil; _sourceID = nil;
_authenticationFilter = nil; _authenticationFilter = nil;
_loginFields = nil;
_mailFields = nil; _mailFields = nil;
_userPasswordAlgorithm = nil; _userPasswordAlgorithm = nil;
_viewURL = nil; _viewURL = nil;
@ -95,6 +96,7 @@
{ {
[_sourceID release]; [_sourceID release];
[_authenticationFilter release]; [_authenticationFilter release];
[_loginFields release];
[_mailFields release]; [_mailFields release];
[_userPasswordAlgorithm release]; [_userPasswordAlgorithm release];
[_viewURL release]; [_viewURL release];
@ -111,6 +113,7 @@
ASSIGN(_sourceID, [udSource objectForKey: @"id"]); ASSIGN(_sourceID, [udSource objectForKey: @"id"]);
ASSIGN(_authenticationFilter, [udSource objectForKey: @"authenticationFilter"]); ASSIGN(_authenticationFilter, [udSource objectForKey: @"authenticationFilter"]);
ASSIGN(_loginFields, [udSource objectForKey: @"LoginFieldNames"]);
ASSIGN(_mailFields, [udSource objectForKey: @"MailFieldNames"]); ASSIGN(_mailFields, [udSource objectForKey: @"MailFieldNames"]);
ASSIGN(_userPasswordAlgorithm, [udSource objectForKey: @"userPasswordAlgorithm"]); ASSIGN(_userPasswordAlgorithm, [udSource objectForKey: @"userPasswordAlgorithm"]);
ASSIGN(_imapLoginField, [udSource objectForKey: @"IMAPLoginFieldName"]); ASSIGN(_imapLoginField, [udSource objectForKey: @"IMAPLoginFieldName"]);
@ -227,9 +230,31 @@
channel = [cm acquireOpenChannelForURL: _viewURL]; channel = [cm acquireOpenChannelForURL: _viewURL];
if (channel) if (channel)
{ {
qualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_uid" if (_loginFields)
operatorSelector: EOQualifierOperatorEqual {
value: _login]; NSMutableArray *qualifiers;
NSString *field;
EOQualifier *loginQualifier;
int i;
qualifiers = [NSMutableArray arrayWithCapacity: [_loginFields count]];
for (i = 0; i < [_loginFields count]; i++)
{
field = [_loginFields objectAtIndex: i];
loginQualifier = [[EOKeyValueQualifier alloc] initWithKey: field
operatorSelector: EOQualifierOperatorEqual
value: _login];
[loginQualifier autorelease];
[qualifiers addObject: loginQualifier];
}
qualifier = [[EOOrQualifier alloc] initWithQualifierArray: qualifiers];
}
else
{
qualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_uid"
operatorSelector: EOQualifierOperatorEqual
value: _login];
}
[qualifier autorelease]; [qualifier autorelease];
sql = [NSMutableString stringWithFormat: @"SELECT c_password" sql = [NSMutableString stringWithFormat: @"SELECT c_password"
@" FROM %@" @" FROM %@"
@ -353,12 +378,14 @@
considerEmail: (BOOL) b considerEmail: (BOOL) b
{ {
NSMutableDictionary *response; NSMutableDictionary *response;
NSMutableArray *qualifiers;
EOAdaptorChannel *channel; EOAdaptorChannel *channel;
EOQualifier *qualifier; EOQualifier *loginQualifier, *qualifier;
GCSChannelManager *cm; GCSChannelManager *cm;
NSMutableString *sql; NSMutableString *sql;
NSString *value; NSString *value, *field;
NSException *ex; NSException *ex;
int i;
response = nil; response = nil;
@ -367,25 +394,65 @@
channel = [cm acquireOpenChannelForURL: _viewURL]; channel = [cm acquireOpenChannelForURL: _viewURL];
if (channel) if (channel)
{ {
if (!b) qualifiers = [NSMutableArray arrayWithCapacity: [_loginFields count] + 1];
sql = [NSMutableString stringWithFormat: (@"SELECT *"
@" FROM %@" // Always compare against the c_uid field
@" WHERE c_uid = '%@'"), loginQualifier = [[EOKeyValueQualifier alloc] initWithKey: @"c_uid"
[_viewURL gcsTableName], theID]; operatorSelector: EOQualifierOperatorEqual
else value: theID];
{ [loginQualifier autorelease];
sql = [NSMutableString stringWithFormat: (@"SELECT *" [qualifiers addObject: loginQualifier];
@" FROM %@"
@" WHERE c_uid = '%@' OR" if (_loginFields)
@" LOWER(mail) = '%@'"), {
[_viewURL gcsTableName], theID, [theID lowercaseString]]; for (i = 0; i < [_loginFields count]; i++)
{
field = [_loginFields objectAtIndex: i];
if ([field caseInsensitiveCompare: @"c_uid"] != NSOrderedSame)
{
loginQualifier = [[EOKeyValueQualifier alloc] initWithKey: field
operatorSelector: EOQualifierOperatorEqual
value: theID];
[loginQualifier autorelease];
[qualifiers addObject: loginQualifier];
}
}
}
if (b)
{
// Always compare againts the mail field
loginQualifier = [[EOKeyValueQualifier alloc] initWithKey: @"mail"
operatorSelector: EOQualifierOperatorEqual
value: [theID lowercaseString]];
[loginQualifier autorelease];
[qualifiers addObject: loginQualifier];
if (_mailFields && [_mailFields count] > 0) if (_mailFields)
{ {
[sql appendString: [self _whereClauseFromArray: _mailFields value: [theID lowercaseString] exact: YES]]; for (i = 0; i < [_mailFields count]; i++)
} {
field = [_mailFields objectAtIndex: i];
if ([field caseInsensitiveCompare: @"mail"] != NSOrderedSame
&& ![_loginFields containsObject: field])
{
loginQualifier = [[EOKeyValueQualifier alloc] initWithKey: field
operatorSelector: EOQualifierOperatorEqual
value: [theID lowercaseString]];
[loginQualifier autorelease];
[qualifiers addObject: loginQualifier];
}
}
}
} }
sql = [NSMutableString stringWithFormat: @"SELECT *"
@" FROM %@"
@" WHERE ",
[_viewURL gcsTableName]];
qualifier = [[EOOrQualifier alloc] initWithQualifierArray: qualifiers];
[qualifier _gcsAppendToString: sql];
ex = [channel evaluateExpressionX: sql]; ex = [channel evaluateExpressionX: sql];
if (!ex) if (!ex)
{ {