@@ -11,11 +11,13 @@ import (
11
11
"github.com/gravitl/netmaker/logger"
12
12
"github.com/gravitl/netmaker/logic"
13
13
"github.com/gravitl/netmaker/models"
14
+ "github.com/gravitl/netmaker/mq"
14
15
"github.com/gravitl/netmaker/pro/idp"
15
16
"github.com/gravitl/netmaker/pro/idp/azure"
16
17
"github.com/gravitl/netmaker/pro/idp/google"
17
18
"github.com/gravitl/netmaker/pro/idp/okta"
18
19
proLogic "github.com/gravitl/netmaker/pro/logic"
20
+ "github.com/gravitl/netmaker/servercfg"
19
21
)
20
22
21
23
var (
@@ -149,7 +151,8 @@ func syncUsers(idpUsers []idp.User) error {
149
151
for _ , user := range idpUsers {
150
152
if user .AccountArchived {
151
153
// delete the user if it has been archived.
152
- _ = logic .DeleteUser (user .Username )
154
+ user := dbUsersMap [user .Username ]
155
+ _ = deleteAndCleanUpUser (& user )
153
156
continue
154
157
}
155
158
@@ -209,14 +212,14 @@ func syncUsers(idpUsers []idp.User) error {
209
212
}
210
213
211
214
for _ , user := range dbUsersMap {
212
- if user .ExternalIdentityProviderID = = "" {
213
- continue
214
- }
215
- if _ , ok := idpUsersMap [ user . UserName ]; ! ok {
216
- // delete the user if it has been deleted on idp.
217
- err = logic . DeleteUser ( user . UserName )
218
- if err != nil {
219
- return err
215
+ if user .ExternalIdentityProviderID ! = "" {
216
+ if _ , ok := idpUsersMap [ user . UserName ]; ! ok {
217
+ // delete the user if it has been deleted on idp
218
+ // or is filtered out.
219
+ err = deleteAndCleanUpUser ( & user )
220
+ if err != nil {
221
+ return err
222
+ }
220
223
}
221
224
}
222
225
}
@@ -277,7 +280,11 @@ func syncGroups(idpGroups []idp.Group) error {
277
280
dbGroup .ExternalIdentityProviderID = group .ID
278
281
dbGroup .Name = group .Name
279
282
dbGroup .Default = false
280
- dbGroup .NetworkRoles = make (map [models.NetworkID ]map [models.UserRoleID ]struct {})
283
+ dbGroup .NetworkRoles = map [models.NetworkID ]map [models.UserRoleID ]struct {}{
284
+ models .AllNetworks : {
285
+ proLogic .GetDefaultGlobalUserRoleID (): {},
286
+ },
287
+ }
281
288
err := proLogic .CreateUserGroup (& dbGroup )
282
289
if err != nil {
283
290
return err
@@ -324,8 +331,9 @@ func syncGroups(idpGroups []idp.Group) error {
324
331
for _ , group := range dbGroups {
325
332
if group .ExternalIdentityProviderID != "" {
326
333
if _ , ok := idpGroupsMap [group .ExternalIdentityProviderID ]; ! ok {
327
- // delete the group if it has been deleted on idp.
328
- err = proLogic .DeleteUserGroup (group .ID )
334
+ // delete the group if it has been deleted on idp
335
+ // or is filtered out.
336
+ err = proLogic .DeleteAndCleanUpGroup (& group )
329
337
if err != nil {
330
338
return err
331
339
}
@@ -355,6 +363,7 @@ func GetIDPSyncStatus() models.IDPSyncStatus {
355
363
}
356
364
}
357
365
}
366
+
358
367
func filterUsersByGroupMembership (idpUsers []idp.User , idpGroups []idp.Group ) []idp.User {
359
368
usersMap := make (map [string ]int )
360
369
for i , user := range idpUsers {
@@ -395,14 +404,14 @@ func filterGroupsByMembers(idpGroups []idp.Group, idpUsers []idp.User) []idp.Gro
395
404
if _ , ok := usersMap [member ]; ok {
396
405
members = append (members , member )
397
406
}
407
+ }
398
408
399
- if len (members ) > 0 {
400
- // the group at index `i` has members from the `idpUsers` list,
401
- // so we keep it.
402
- filteredGroupsMap [i ] = true
403
- // filter out members that were not provided in the `idpUsers` list.
404
- idpGroups [i ].Members = members
405
- }
409
+ if len (members ) > 0 {
410
+ // the group at index `i` has members from the `idpUsers` list,
411
+ // so we keep it.
412
+ filteredGroupsMap [i ] = true
413
+ // filter out members that were not provided in the `idpUsers` list.
414
+ idpGroups [i ].Members = members
406
415
}
407
416
}
408
417
@@ -415,3 +424,37 @@ func filterGroupsByMembers(idpGroups []idp.Group, idpUsers []idp.User) []idp.Gro
415
424
416
425
return filteredGroups
417
426
}
427
+
428
+ // TODO: deduplicate
429
+ // The cyclic import between the package logic and mq requires this
430
+ // function to be duplicated in multiple places.
431
+ func deleteAndCleanUpUser (user * models.User ) error {
432
+ err := logic .DeleteUser (user .UserName )
433
+ if err != nil {
434
+ return err
435
+ }
436
+
437
+ // check and delete extclient with this ownerID
438
+ go func () {
439
+ extclients , err := logic .GetAllExtClients ()
440
+ if err != nil {
441
+ return
442
+ }
443
+ for _ , extclient := range extclients {
444
+ if extclient .OwnerID == user .UserName {
445
+ err = logic .DeleteExtClientAndCleanup (extclient )
446
+ if err == nil {
447
+ _ = mq .PublishDeletedClientPeerUpdate (& extclient )
448
+ }
449
+ }
450
+ }
451
+
452
+ go logic .DeleteUserInvite (user .UserName )
453
+ go mq .PublishPeerUpdate (false )
454
+ if servercfg .IsDNSMode () {
455
+ go logic .SetDNS ()
456
+ }
457
+ }()
458
+
459
+ return nil
460
+ }
0 commit comments