now possible to configure objectClass names for LDAP groups using GroupObjectClasses (#1499)

pull/75/merge
Ludovic Marcotte 2015-03-24 08:40:13 -04:00
parent d75fb0722a
commit 097d5c2333
6 changed files with 45 additions and 17 deletions

View File

@ -1048,6 +1048,11 @@ of supported attributes.
user addressbooks (see _abOU_ below), this list of object classes will user addressbooks (see _abOU_ below), this list of object classes will
be applied to new records as they are created. be applied to new records as they are created.
|GroupObjectClasses
|A list (array) of names identifying groups within the LDAP source. If not
set, SOGo will use `group`, `groupofnames`, `groupofuniquenames`
and `posixgroup`.
|modifiers |modifiers
|A list (array) of usernames that are authorized to perform |A list (array) of usernames that are authorized to perform
modifications to the address book defined by this LDAP source. modifications to the address book defined by this LDAP source.

1
NEWS
View File

@ -6,6 +6,7 @@ Enhancements
- immediately delete mails from EAS clients when they are marked as deleted on the IMAP server - immediately delete mails from EAS clients when they are marked as deleted on the IMAP server
- now favor login@domain as the default email address if multiple mail: fields are specified - now favor login@domain as the default email address if multiple mail: fields are specified
- enable by default HTML mails support using EAS on Windows and BB phones - enable by default HTML mails support using EAS on Windows and BB phones
- now possible to configure objectClass names for LDAP groups using GroupObjectClasses (#1499)
Bug fixes Bug fixes
- fixed login issue after password change (#2601) - fixed login issue after password change (#2601)

View File

@ -72,6 +72,7 @@
NSDictionary *contactMapping; NSDictionary *contactMapping;
NSArray *contactObjectClasses; NSArray *contactObjectClasses;
NSArray *groupObjectClasses;
NSDictionary *modulesConstraints; NSDictionary *modulesConstraints;
@ -106,6 +107,7 @@
UIDField: (NSString *) newUIDField UIDField: (NSString *) newUIDField
mailFields: (NSArray *) newMailFields mailFields: (NSArray *) newMailFields
searchFields: (NSArray *) newSearchFields searchFields: (NSArray *) newSearchFields
groupObjectClasses: (NSArray *) newGroupObjectClasses
IMAPHostField: (NSString *) newIMAPHostField IMAPHostField: (NSString *) newIMAPHostField
IMAPLoginField: (NSString *) newIMAPLoginField IMAPLoginField: (NSString *) newIMAPLoginField
SieveHostField: (NSString *) newSieveHostField SieveHostField: (NSString *) newSieveHostField

View File

@ -101,6 +101,8 @@ static Class NSStringK;
contactMapping = nil; contactMapping = nil;
searchFields = [NSArray arrayWithObjects: @"sn", @"displayname", @"telephonenumber", nil]; searchFields = [NSArray arrayWithObjects: @"sn", @"displayname", @"telephonenumber", nil];
[searchFields retain]; [searchFields retain];
groupObjectClasses = [NSArray arrayWithObjects: @"group", @"groupofnames", @"groupofuniquenames", @"posixgroup", nil];
[groupObjectClasses retain];
IMAPHostField = nil; IMAPHostField = nil;
IMAPLoginField = nil; IMAPLoginField = nil;
SieveHostField = nil; SieveHostField = nil;
@ -144,6 +146,7 @@ static Class NSStringK;
[contactMapping release]; [contactMapping release];
[mailFields release]; [mailFields release];
[searchFields release]; [searchFields release];
[groupObjectClasses release];
[IMAPHostField release]; [IMAPHostField release];
[IMAPLoginField release]; [IMAPLoginField release];
[SieveHostField release]; [SieveHostField release];
@ -189,6 +192,7 @@ static Class NSStringK;
UIDField: [udSource objectForKey: @"UIDFieldName"] UIDField: [udSource objectForKey: @"UIDFieldName"]
mailFields: [udSource objectForKey: @"MailFieldNames"] mailFields: [udSource objectForKey: @"MailFieldNames"]
searchFields: [udSource objectForKey: @"SearchFieldNames"] searchFields: [udSource objectForKey: @"SearchFieldNames"]
groupObjectClasses: [udSource objectForKey: @"GroupObjectClasses"]
IMAPHostField: [udSource objectForKey: @"IMAPHostFieldName"] IMAPHostField: [udSource objectForKey: @"IMAPHostFieldName"]
IMAPLoginField: [udSource objectForKey: @"IMAPLoginFieldName"] IMAPLoginField: [udSource objectForKey: @"IMAPLoginFieldName"]
SieveHostField: [udSource objectForKey: @"SieveHostFieldName"] SieveHostField: [udSource objectForKey: @"SieveHostFieldName"]
@ -310,6 +314,7 @@ static Class NSStringK;
UIDField: (NSString *) newUIDField UIDField: (NSString *) newUIDField
mailFields: (NSArray *) newMailFields mailFields: (NSArray *) newMailFields
searchFields: (NSArray *) newSearchFields searchFields: (NSArray *) newSearchFields
groupObjectClasses: (NSArray *) newGroupObjectClasses
IMAPHostField: (NSString *) newIMAPHostField IMAPHostField: (NSString *) newIMAPHostField
IMAPLoginField: (NSString *) newIMAPLoginField IMAPLoginField: (NSString *) newIMAPLoginField
SieveHostField: (NSString *) newSieveHostField SieveHostField: (NSString *) newSieveHostField
@ -334,6 +339,8 @@ static Class NSStringK;
ASSIGN(mailFields, newMailFields); ASSIGN(mailFields, newMailFields);
if (newSearchFields) if (newSearchFields)
ASSIGN(searchFields, newSearchFields); ASSIGN(searchFields, newSearchFields);
if (newGroupObjectClasses)
ASSIGN(groupObjectClasses, newGroupObjectClasses);
if (newBindFields) if (newBindFields)
{ {
// Before SOGo v1.2.0, bindFields was a comma-separated list // Before SOGo v1.2.0, bindFields was a comma-separated list
@ -1031,6 +1038,8 @@ static Class NSStringK;
NSString *value; NSString *value;
static NSArray *resourceKinds = nil; static NSArray *resourceKinds = nil;
NSMutableArray *classes; NSMutableArray *classes;
NSEnumerator *gclasses;
NSString *gclass;
id o; id o;
if (!resourceKinds) if (!resourceKinds)
@ -1059,24 +1068,27 @@ static Class NSStringK;
if (classes) if (classes)
{ {
// We check if our entry is a group. If so, we set the
// 'isGroup' custom attribute.
if ([classes containsObject: @"group"] ||
[classes containsObject: @"groupofnames"] ||
[classes containsObject: @"groupofuniquenames"] ||
[classes containsObject: @"posixgroup"])
{
[ldifRecord setObject: [NSNumber numberWithInt: 1]
forKey: @"isGroup"];
}
// We check if our entry is a resource. We also support // We check if our entry is a resource. We also support
// determining resources based on the KindFieldName attribute // determining resources based on the KindFieldName attribute
// value - see below. // value - see below.
else if ([classes containsObject: @"calendarresource"]) if ([classes containsObject: @"calendarresource"])
{ {
[ldifRecord setObject: [NSNumber numberWithInt: 1] [ldifRecord setObject: [NSNumber numberWithInt: 1]
forKey: @"isResource"]; forKey: @"isResource"];
} }
else
{
// We check if our entry is a group. If so, we set the
// 'isGroup' custom attribute.
gclasses = [groupObjectClasses objectEnumerator];
while (gclass = [gclasses nextObject])
if ([classes containsObject: [gclass lowercaseString]])
{
[ldifRecord setObject: [NSNumber numberWithInt: 1]
forKey: @"isGroup"];
break;
}
}
} }
// We check if that entry corresponds to a resource. For this, // We check if that entry corresponds to a resource. For this,
@ -1368,6 +1380,11 @@ static Class NSStringK;
return modifiers; return modifiers;
} }
- (NSArray *) groupObjectClasses
{
return groupObjectClasses;
}
static NSArray * static NSArray *
_convertRecordToLDAPAttributes (LDAPSourceSchema *schema, NSDictionary *ldifRecord) _convertRecordToLDAPAttributes (LDAPSourceSchema *schema, NSDictionary *ldifRecord)
{ {
@ -1683,6 +1700,7 @@ _makeLDAPChanges (NGLdapConnection *ldapConnection,
UIDField: @"cn" UIDField: @"cn"
mailFields: nil mailFields: nil
searchFields: nil searchFields: nil
groupObjectClasses: nil
IMAPHostField: nil IMAPHostField: nil
IMAPLoginField: nil IMAPLoginField: nil
SieveHostField: nil SieveHostField: nil

View File

@ -137,6 +137,8 @@
NGLdapEntry *entry; NGLdapEntry *entry;
NSObject <SOGoSource> *source; NSObject <SOGoSource> *source;
id o; id o;
NSEnumerator *gclasses;
NSString *gclass;
int i; int i;
@ -194,12 +196,11 @@
} }
} }
// Found a group, let's return it. gclasses = [[source groupObjectClasses] objectEnumerator];
if ([classes containsObject: @"group"] || while (gclass = [gclasses nextObject])
[classes containsObject: @"groupofnames"] || if ([classes containsObject: gclass])
[classes containsObject: @"groupofuniquenames"] || {
[classes containsObject: @"posixgroup"]) // Found a group, let's return it.
{
o = [[self alloc] initWithIdentifier: theValue o = [[self alloc] initWithIdentifier: theValue
domain: domain domain: domain
source: source source: source

View File

@ -110,6 +110,7 @@
- (NSString *) baseDN; - (NSString *) baseDN;
- (NSString *) MSExchangeHostname; - (NSString *) MSExchangeHostname;
- (NSArray *) groupObjectClasses;
@end @end
#endif /* SOGOSOURCE_H */ #endif /* SOGOSOURCE_H */