mirror of
https://github.com/pocket-id/pocket-id.git
synced 2025-12-20 17:25:43 +03:00
fix: use ldapAttributeUserUsername for finding group members (#565)
Co-authored-by: Elias Schneider <login@eliasschneider.com>
This commit is contained in:
@@ -148,22 +148,44 @@ func (s *LdapService) SyncGroups(ctx context.Context, tx *gorm.DB, client *ldap.
|
|||||||
groupMembers := value.GetAttributeValues(dbConfig.LdapAttributeGroupMember.Value)
|
groupMembers := value.GetAttributeValues(dbConfig.LdapAttributeGroupMember.Value)
|
||||||
membersUserId := make([]string, 0, len(groupMembers))
|
membersUserId := make([]string, 0, len(groupMembers))
|
||||||
for _, member := range groupMembers {
|
for _, member := range groupMembers {
|
||||||
ldapId := getDNProperty("uid", member)
|
username := getDNProperty(dbConfig.LdapAttributeUserUsername.Value, member)
|
||||||
if ldapId == "" {
|
|
||||||
|
// If username extraction fails, try to query LDAP directly for the user
|
||||||
|
if username == "" {
|
||||||
|
// Query LDAP to get the user by their DN
|
||||||
|
userSearchReq := ldap.NewSearchRequest(
|
||||||
|
member,
|
||||||
|
ldap.ScopeBaseObject,
|
||||||
|
0, 0, 0, false,
|
||||||
|
"(objectClass=*)",
|
||||||
|
[]string{dbConfig.LdapAttributeUserUsername.Value, dbConfig.LdapAttributeUserUniqueIdentifier.Value},
|
||||||
|
[]ldap.Control{},
|
||||||
|
)
|
||||||
|
|
||||||
|
userResult, err := client.Search(userSearchReq)
|
||||||
|
if err != nil || len(userResult.Entries) == 0 {
|
||||||
|
log.Printf("Could not resolve group member DN '%s': %v", member, err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
username = userResult.Entries[0].GetAttributeValue(dbConfig.LdapAttributeUserUsername.Value)
|
||||||
|
if username == "" {
|
||||||
|
log.Printf("Could not extract username from group member DN '%s'", member)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var databaseUser model.User
|
var databaseUser model.User
|
||||||
err = tx.
|
err = tx.
|
||||||
WithContext(ctx).
|
WithContext(ctx).
|
||||||
Where("username = ? AND ldap_id IS NOT NULL", ldapId).
|
Where("username = ? AND ldap_id IS NOT NULL", username).
|
||||||
First(&databaseUser).
|
First(&databaseUser).
|
||||||
Error
|
Error
|
||||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
// The user collides with a non-LDAP user, so we skip it
|
// The user collides with a non-LDAP user, so we skip it
|
||||||
continue
|
continue
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
return fmt.Errorf("failed to query for existing user '%s': %w", ldapId, err)
|
return fmt.Errorf("failed to query for existing user '%s': %w", username, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
membersUserId = append(membersUserId, databaseUser.ID)
|
membersUserId = append(membersUserId, databaseUser.ID)
|
||||||
@@ -305,7 +327,7 @@ func (s *LdapService) SyncUsers(ctx context.Context, tx *gorm.DB, client *ldap.C
|
|||||||
// Check if user is admin by checking if they are in the admin group
|
// Check if user is admin by checking if they are in the admin group
|
||||||
isAdmin := false
|
isAdmin := false
|
||||||
for _, group := range value.GetAttributeValues("memberOf") {
|
for _, group := range value.GetAttributeValues("memberOf") {
|
||||||
if getDNProperty("cn", group) == dbConfig.LdapAttributeAdminGroup.Value {
|
if getDNProperty(dbConfig.LdapAttributeGroupName.Value, group) == dbConfig.LdapAttributeAdminGroup.Value {
|
||||||
isAdmin = true
|
isAdmin = true
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user