Properly generate new DN.

This fixes issue #5581 by properly parsing the old DN and replacing the
first part with the new DN.
This commit is contained in:
Daniël Franke
2023-02-16 11:42:36 +01:00
committed by Ralf Haferkamp
parent 92923f6801
commit 92f4d60a06
2 changed files with 41 additions and 11 deletions

View File

@@ -493,7 +493,17 @@ func (i *LDAP) changeUserName(ctx context.Context, dn, originalUserName, newUser
return nil, err
}
u, err := i.getUserByDN(fmt.Sprintf("%s,%s", newDN, i.userBaseDN))
parsed, err := ldap.ParseDN(dn)
if err != nil {
return nil, err
}
newFullDN, err := replaceDN(parsed, newDN)
if err != nil {
return nil, err
}
u, err := i.getUserByDN(newFullDN)
if err != nil {
return nil, err
}
@@ -730,3 +740,19 @@ func (i *LDAP) expandLDAPAttributeEntries(ctx context.Context, e *ldap.Entry, at
return result, nil
}
func replaceDN(fullDN *ldap.DN, newDN string) (string, error) {
if len(fullDN.RDNs) == 0 {
return "", fmt.Errorf("Can't operate on an empty dn")
}
if len(fullDN.RDNs) == 1 {
return newDN, nil
}
for _, part := range fullDN.RDNs[1:] {
newDN += "," + part.String()
}
return newDN, nil
}

View File

@@ -634,20 +634,24 @@ func TestUpdateUser(t *testing.T) {
&ldap.SearchResult{
Entries: []*ldap.Entry{
{
DN: "uid=oldName",
DN: "uid=oldName,ou=people,dc=test,dc=net",
Attributes: []*ldap.EntryAttribute{
{
Name: "displayname",
Name: lconfig.UserDisplayNameAttribute,
Values: []string{"testUser"},
},
{
Name: "entryUUID",
Name: lconfig.UserIDAttribute,
Values: []string{"testUser"},
},
{
Name: "mail",
Name: lconfig.UserEmailAttribute,
Values: []string{"testuser@example.org"},
},
{
Name: lconfig.UserNameAttribute,
Values: []string{"oldName"},
},
},
},
},
@@ -662,7 +666,7 @@ func TestUpdateUser(t *testing.T) {
BaseDN: "ou=groups,dc=test",
Scope: 2, DerefAliases: 0, SizeLimit: 0, TimeLimit: 0,
TypesOnly: false,
Filter: "(&(objectClass=groupOfNames)(member=uid=oldName))",
Filter: "(&(objectClass=groupOfNames)(member=uid=oldName,ou=people,dc=test,dc=net))",
Attributes: []string{"cn", "entryUUID"},
Controls: []ldap.Control(nil),
},
@@ -692,7 +696,7 @@ func TestUpdateUser(t *testing.T) {
funcName: "ModifyDN",
args: []interface{}{
&ldap.ModifyDNRequest{
DN: "uid=oldName",
DN: "uid=oldName,ou=people,dc=test,dc=net",
NewRDN: "uid=newName",
DeleteOldRDN: true,
NewSuperior: "",
@@ -707,7 +711,7 @@ func TestUpdateUser(t *testing.T) {
funcName: "Search",
args: []interface{}{
&ldap.SearchRequest{
BaseDN: "uid=newName,ou=people,dc=test",
BaseDN: "uid=newName,ou=people,dc=test,dc=net",
Scope: 0,
DerefAliases: 0,
SizeLimit: 1,
@@ -722,7 +726,7 @@ func TestUpdateUser(t *testing.T) {
&ldap.SearchResult{
Entries: []*ldap.Entry{
{
DN: "uid=newName,ou=people,dc=test",
DN: "uid=newName,ou=people,dc=test,dc=net",
Attributes: []*ldap.EntryAttribute{
{
Name: lconfig.UserIDAttribute,
@@ -757,14 +761,14 @@ func TestUpdateUser(t *testing.T) {
Operation: 0x1,
Modification: ldap.PartialAttribute{
Type: "member",
Vals: []string{"uid=oldName"},
Vals: []string{"uid=oldName,ou=people,dc=test,dc=net"},
},
},
{
Operation: 0x0,
Modification: ldap.PartialAttribute{
Type: "member",
Vals: []string{"uid=newName,ou=people,dc=test"},
Vals: []string{"uid=newName,ou=people,dc=test,dc=net"},
},
},
},