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>
* UI/MainUI/SOGoRootPage.m (-cookieUsername)

View File

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

View File

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

View File

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