@@ -119,6 +119,12 @@ func addAuthSourceLDAP(t *testing.T, sshKeyAttribute string) {
119
119
"attribute_ssh_public_key" : sshKeyAttribute ,
120
120
"is_sync_enabled" : "on" ,
121
121
"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\" ]}}" ,
122
128
})
123
129
session .MakeRequest (t , req , http .StatusFound )
124
130
}
@@ -240,3 +246,131 @@ func TestLDAPUserSSHKeySync(t *testing.T) {
240
246
assert .ElementsMatch (t , u .SSHKeys , syncedKeys , "Unequal number of keys synchronized for user: %s" , u .UserName )
241
247
}
242
248
}
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
+ }
0 commit comments