Skip to content

Commit 673df99

Browse files
melegiulsvenseeberg
andcommitted
Add tests to LDAP group sync
* Adding and removing team members. * Sync not existing LDAP group. * Login with broken group map JSON. Co-authored-by: Giuliano Mele <[email protected]> Co-authored-by: Sven Seeberg <[email protected]>
1 parent 136c628 commit 673df99

File tree

2 files changed

+135
-1
lines changed

2 files changed

+135
-1
lines changed

integrations/auth_ldap_test.go

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,12 @@ func addAuthSourceLDAP(t *testing.T, sshKeyAttribute string) {
119119
"attribute_ssh_public_key": sshKeyAttribute,
120120
"is_sync_enabled": "on",
121121
"is_active": "on",
122+
"team_group_map_enabled": "on",
123+
"team_group_map_removal": "on",
124+
"group_dn": "ou=people,dc=planetexpress,dc=com",
125+
"group_member_uid": "member",
126+
"user_uid": "DN",
127+
"team_group_map": "{\"cn=ship_crew,ou=people,dc=planetexpress,dc=com\": {\"org26\": [\"team11\"]},\"cn=admin_staff,ou=people,dc=planetexpress,dc=com\": {\"non-existent\": [\"non-existent\"]},\"cn=non-existent,ou=people,dc=planetexpress,dc=com\": {\"non-existent\": [\"non-existent\"]}}",
122128
})
123129
session.MakeRequest(t, req, http.StatusFound)
124130
}
@@ -240,3 +246,131 @@ func TestLDAPUserSSHKeySync(t *testing.T) {
240246
assert.ElementsMatch(t, u.SSHKeys, syncedKeys, "Unequal number of keys synchronized for user: %s", u.UserName)
241247
}
242248
}
249+
250+
func TestLDAPGroupTeamSyncAddMember(t *testing.T) {
251+
if skipLDAPTests() {
252+
t.Skip()
253+
return
254+
}
255+
defer prepareTestEnv(t)()
256+
addAuthSourceLDAP(t, "")
257+
org, err := models.GetOrgByName("org26")
258+
assert.NoError(t, err)
259+
team, err := models.GetTeam(org.ID, "team11")
260+
assert.NoError(t, err)
261+
models.SyncExternalUsers(context.Background(), true)
262+
for _, gitLDAPUser := range gitLDAPUsers {
263+
user := models.AssertExistsAndLoadBean(t, &models.User{
264+
Name: gitLDAPUser.UserName,
265+
}).(*models.User)
266+
usersOrgs, err := models.GetOrgsByUserID(user.ID, true)
267+
assert.NoError(t, err)
268+
allOrgTeams, err := models.GetUserOrgTeams(org.ID, user.ID)
269+
assert.NoError(t, err)
270+
if user.Name == "fry" || user.Name == "leela" || user.Name == "bender" {
271+
// assert members of LDAP group "cn=ship_crew" are added to mapped teams
272+
assert.Equal(t, len(usersOrgs), 1, "User should be member of one organization")
273+
assert.Equal(t, usersOrgs[0].Name, "org26", "Membership should be added to the right organization")
274+
isMember, err := models.IsTeamMember(usersOrgs[0].ID, team.ID, user.ID)
275+
assert.NoError(t, err)
276+
assert.True(t, isMember, "Membership should be added to the right team")
277+
err = team.RemoveMember(user.ID)
278+
assert.NoError(t, err)
279+
} else {
280+
// assert members of LDAP group "cn=admin_staff" keep initial team membership since mapped team does not exist
281+
assert.Empty(t, usersOrgs, "User should be member of no organization")
282+
isMember, err := models.IsTeamMember(org.ID, team.ID, user.ID)
283+
assert.NoError(t, err)
284+
assert.False(t, isMember, "User should no be added to this team")
285+
assert.Empty(t, allOrgTeams, "User should not be added to any team")
286+
}
287+
}
288+
}
289+
290+
func TestLDAPGroupTeamSyncRemoveMember(t *testing.T) {
291+
if skipLDAPTests() {
292+
t.Skip()
293+
return
294+
}
295+
defer prepareTestEnv(t)()
296+
addAuthSourceLDAP(t, "")
297+
models.SyncExternalUsers(context.Background(), true)
298+
org, err := models.GetOrgByName("org26")
299+
assert.NoError(t, err)
300+
team, err := models.GetTeam(org.ID, "team11")
301+
assert.NoError(t, err)
302+
user, err := models.GetUserByName("professor")
303+
assert.NoError(t, err)
304+
err = org.AddMember(user.ID)
305+
assert.NoError(t, err)
306+
err = team.AddMember(user.ID)
307+
assert.NoError(t, err)
308+
isMember, err := models.IsOrganizationMember(org.ID, user.ID)
309+
assert.NoError(t, err)
310+
assert.True(t, isMember, "User should be member of this organization")
311+
isMember, err = models.IsTeamMember(org.ID, team.ID, user.ID)
312+
assert.NoError(t, err)
313+
assert.True(t, isMember, "User should be member of this team")
314+
// assert team member "professor" gets removed from "team11"
315+
models.SyncExternalUsers(context.Background(), true)
316+
isMember, err = models.IsOrganizationMember(org.ID, user.ID)
317+
assert.NoError(t, err)
318+
assert.False(t, isMember, "User membership should have been removed from organization")
319+
isMember, err = models.IsTeamMember(org.ID, team.ID, user.ID)
320+
assert.NoError(t, err)
321+
assert.False(t, isMember, "User membership should have been removed from team")
322+
}
323+
324+
func addBrokenLDAPMapAuthSource(t *testing.T, sshKeyAttribute string) {
325+
session := loginUser(t, "user1")
326+
csrf := GetCSRF(t, session, "/admin/auths/new")
327+
req := NewRequestWithValues(t, "POST", "/admin/auths/new", map[string]string{
328+
"_csrf": csrf,
329+
"type": "2",
330+
"name": "ldap",
331+
"host": getLDAPServerHost(),
332+
"port": "389",
333+
"bind_dn": "uid=gitea,ou=service,dc=planetexpress,dc=com",
334+
"bind_password": "password",
335+
"user_base": "ou=people,dc=planetexpress,dc=com",
336+
"filter": "(&(objectClass=inetOrgPerson)(memberOf=cn=git,ou=people,dc=planetexpress,dc=com)(uid=%s))",
337+
"admin_filter": "(memberOf=cn=admin_staff,ou=people,dc=planetexpress,dc=com)",
338+
"restricted_filter": "(uid=leela)",
339+
"attribute_username": "uid",
340+
"attribute_name": "givenName",
341+
"attribute_surname": "sn",
342+
"attribute_mail": "mail",
343+
"attribute_ssh_public_key": sshKeyAttribute,
344+
"is_sync_enabled": "on",
345+
"is_active": "on",
346+
"team_group_map_enabled": "on",
347+
"team_group_map_removal": "on",
348+
"group_dn": "ou=people,dc=planetexpress,dc=com",
349+
"group_member_uid": "member",
350+
"user_uid": "DN",
351+
"team_group_map": "{\"NOT_A_VALID_JSON\"[\"MISSING_DOUBLE_POINT\"]}",
352+
})
353+
session.MakeRequest(t, req, http.StatusFound)
354+
}
355+
356+
// Login should work even if Team Group Map contains a broken JSON
357+
func TestBrokenLDAPMapUserSignin(t *testing.T) {
358+
if skipLDAPTests() {
359+
t.Skip()
360+
return
361+
}
362+
defer prepareTestEnv(t)()
363+
addBrokenLDAPMapAuthSource(t, "")
364+
365+
u := gitLDAPUsers[0]
366+
367+
session := loginUserWithPassword(t, u.UserName, u.Password)
368+
req := NewRequest(t, "GET", "/user/settings")
369+
resp := session.MakeRequest(t, req, http.StatusOK)
370+
371+
htmlDoc := NewHTMLParser(t, resp.Body)
372+
373+
assert.Equal(t, u.UserName, htmlDoc.GetInputValueByName("name"))
374+
assert.Equal(t, u.FullName, htmlDoc.GetInputValueByName("full_name"))
375+
assert.Equal(t, u.Email, htmlDoc.Find(`label[for="email"]`).Siblings().First().Text())
376+
}

modules/auth/ldap/ldap.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ func (ls *Source) mapLdapGroupsToTeams() map[string]map[string][]string {
274274
err := json.Unmarshal([]byte(ls.TeamGroupMap), &ldapGroupsToTeams)
275275
if err != nil {
276276
log.Debug("Failed to unmarshall LDAP teams map: %v", err)
277-
return nil
277+
return ldapGroupsToTeams
278278
}
279279
return ldapGroupsToTeams
280280
}

0 commit comments

Comments
 (0)