Index: ldapgroups.module =================================================================== --- ldapgroups.module (revision 244) +++ ldapgroups.module (revision 245) @@ -226,7 +226,30 @@ } } +/** + * Find groups the user is in in LDAP. + * + * This hook allows modules to provide groups a user is in. + * Useful for awkward LDAP layouts that can't be catered by the 3 provided strategies. + * + * @param $ldap + * An open LDAPInterface + * @param $user + * The user objects. $user->ldap_dn will be of particular interest. + * @return + * Array of groupnames the user is in. + */ +function hook_detect_ldapgroups($ldap, $user) { + $rv = array(); + $gid = $ldap->retrieveAttribute($user->ldap_dn, 'gidNumber'); + $gid = int($gid); + $entries = $ldap->search('ou=Group,dc=example,dc=com', "(gidNumber=$gid)"); + foreach ($entries as $entry) + $rv[] = $entry['dn']; + return $rv; +} + /********************************* * 2. Delegate functions * *********************************/ @@ -386,8 +409,11 @@ } } + // Strategy 4: Custom strategies defined in hooks + $hook_groups = module_invoke_all('detect_ldapgroups', $ldapgroups_ldap, $user); + $ldapgroups_ldap->disconnect(); - return array_merge($dn_groups, $attrib_groups, $entries_groups); + return array_merge($dn_groups, $attrib_groups, $entries_groups, $hook_groups); } function _ldapgroups_grant_role($user, $rolename) {