Skip to content

Commit 3ea0d56

Browse files
committed
Add support for multiple group admin assignments
(sign sync)
1 parent 067d469 commit 3ea0d56

File tree

3 files changed

+48
-10
lines changed

3 files changed

+48
-10
lines changed

examples/sign/sign-sync-config.yml

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,26 @@ user_management:
4242
sign_group: Group 1
4343
group_admin: False
4444

45-
# Example 2 - group admin assignment
46-
- directory_group: Sign Group Admins 1
45+
# Example 2 - group admin assignment (single group mode)
46+
- directory_group: Sign Users (Admin)
4747
sign_group: primary::Group 2
4848
group_admin: True
4949

50-
# Example 3 - account admin assignment
50+
# Example 3 - group admin assignment (UMG)
51+
- directory_group: Sign Users (Admin)
52+
sign_group:
53+
- Sign Users
54+
group_admin: True
55+
# if UMG enabled, then admin_groups must be specified if group_admin is True
56+
admin_groups:
57+
- Sign Users
58+
59+
# Example 4 - account admin assignment
5160
# - directory_group: Sign Admins
5261
# sign_group: secondary::Group 3
5362
# group_admin: False
54-
# account_admin: True
5563

56-
# Example 4 - create user if `create_users` is `True`, otherwise do nothing
64+
# Example 5 - create user if `create_users` is `True`, otherwise do nothing
5765
# - directory_group: Sign Normal Users
5866
# sign_group: tertiary::Group 4
5967
# group_admin: True

tests/fixture/sign-sync-config.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,14 @@ user_management:
4848
- directory_group: Sign Group Admins 1
4949
sign_group: primary::Group 2
5050
group_admin: True
51+
# Example 3 - group admin assignment (UMG)
52+
- directory_group: Sign Users (Admin)
53+
sign_group:
54+
- Sign Users
55+
group_admin: True
56+
# if UMG enabled, then admin_groups must be specified if group_admin is True
57+
admin_groups:
58+
- Sign Users
5159

5260
# Logging options
5361
logging:

user_sync/config/sign_sync.py

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ def config_schema() -> Schema:
3838
'directory_group': Or(None, And(str, len)),
3939
Optional('sign_group', default=None): Or(None, list, And(str, len)),
4040
Optional('group_admin', default=False): Or(bool, None),
41+
Optional('admin_groups'): Or(None, [And(str, len)]),
4142
Optional('account_admin', default=False): Or(bool, None)
4243
}],
4344
Optional('account_admin_groups'): list,
@@ -219,20 +220,22 @@ def load_account_admin_groups(self):
219220
account_admin_groups.add(group)
220221
return list(account_admin_groups)
221222

222-
def load_group_admin_mappings(self):
223+
def load_group_admin_mappings(self, umg):
223224
group_admin_mappings = {}
224225
group_config = self.main_config.get_list_config('user_management', True)
225226
for mapping in group_config.iter_dict_configs():
226227
dir_group = mapping.get_string('directory_group')
227228
sign_group = mapping.get_list('sign_group', True)
228229

229230
group_admin = mapping.get_bool('group_admin', True)
230-
if sign_group is None or not len(sign_group):
231+
if (sign_group is None or not len(sign_group)) and group_admin:
231232
# if there is no Sign group, add the directory group anyway
232233
# in case we're non-UMG, in which case the group admin status is
233234
# applied to the user's currently-assigned group
234-
if group_admin:
235+
if not umg:
235236
group_admin_mappings[dir_group] = set()
237+
else:
238+
raise AssertionException("If UMG is enabled, then at least one Sign group is required in a mapping that enables group admin")
236239
continue
237240

238241
group = AdobeGroup.create(sign_group[0])
@@ -241,10 +244,29 @@ def load_group_admin_mappings(self):
241244
if group.umapi_name is None:
242245
group.umapi_name = self.DEFAULT_ORG_NAME
243246

244-
if group_admin:
247+
admin_groups = mapping.get_list('admin_groups', True)
248+
using_admin_groups = admin_groups is not None and len(admin_groups)
249+
250+
if group_admin and not using_admin_groups:
245251
if dir_group not in group_admin_mappings:
246252
group_admin_mappings[dir_group] = set()
247253
group_admin_mappings[dir_group].add(group)
254+
255+
if not using_admin_groups:
256+
continue
257+
258+
if not umg:
259+
self.logger.warn("Ignoring 'admin_groups' list because 'umg' mode is disabled")
260+
continue
261+
262+
for ag in admin_groups:
263+
if ag not in sign_group:
264+
self.logger.warn("Skipping admin group '%s' because it isn't specified in 'sign_group'", ag)
265+
continue
266+
if dir_group not in group_admin_mappings:
267+
group_admin_mappings[dir_group] = set()
268+
group_admin_mappings[dir_group].add(ag)
269+
248270
return group_admin_mappings
249271

250272
def get_directory_connector_module_name(self) -> str:
@@ -292,7 +314,7 @@ def get_engine_options(self) -> dict:
292314
options['directory_group_filter'] = set(self.directory_groups.keys())
293315
options['cache'] = self.main_config.get_dict('cache')
294316
options['account_admin_groups'] = self.load_account_admin_groups()
295-
options['group_admin_mappings'] = self.load_group_admin_mappings()
317+
options['group_admin_mappings'] = self.load_group_admin_mappings(options['user_sync']['umg'])
296318
return options
297319

298320
def check_unused_config_keys(self):

0 commit comments

Comments
 (0)