Skip to content

Commit 57b2eaa

Browse files
committed
Add support for multiple group admin assignments
(sign sync)
1 parent 5425937 commit 57b2eaa

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,
@@ -206,20 +207,22 @@ def load_account_admin_groups(self):
206207
account_admin_groups.add(group)
207208
return list(account_admin_groups)
208209

209-
def load_group_admin_mappings(self):
210+
def load_group_admin_mappings(self, umg):
210211
group_admin_mappings = {}
211212
group_config = self.main_config.get_list_config('user_management', True)
212213
for mapping in group_config.iter_dict_configs():
213214
dir_group = mapping.get_string('directory_group')
214215
sign_group = mapping.get_list('sign_group', True)
215216

216217
group_admin = mapping.get_bool('group_admin', True)
217-
if sign_group is None or not len(sign_group):
218+
if (sign_group is None or not len(sign_group)) and group_admin:
218219
# if there is no Sign group, add the directory group anyway
219220
# in case we're non-UMG, in which case the group admin status is
220221
# applied to the user's currently-assigned group
221-
if group_admin:
222+
if not umg:
222223
group_admin_mappings[dir_group] = set()
224+
else:
225+
raise AssertionException("If UMG is enabled, then at least one Sign group is required in a mapping that enables group admin")
223226
continue
224227

225228
group = AdobeGroup.create(sign_group[0])
@@ -228,10 +231,29 @@ def load_group_admin_mappings(self):
228231
if group.umapi_name is None:
229232
group.umapi_name = self.DEFAULT_ORG_NAME
230233

231-
if group_admin:
234+
admin_groups = mapping.get_list('admin_groups', True)
235+
using_admin_groups = admin_groups is not None and len(admin_groups)
236+
237+
if group_admin and not using_admin_groups:
232238
if dir_group not in group_admin_mappings:
233239
group_admin_mappings[dir_group] = set()
234240
group_admin_mappings[dir_group].add(group)
241+
242+
if not using_admin_groups:
243+
continue
244+
245+
if not umg:
246+
self.logger.warn("Ignoring 'admin_groups' list because 'umg' mode is disabled")
247+
continue
248+
249+
for ag in admin_groups:
250+
if ag not in sign_group:
251+
self.logger.warn("Skipping admin group '%s' because it isn't specified in 'sign_group'", ag)
252+
continue
253+
if dir_group not in group_admin_mappings:
254+
group_admin_mappings[dir_group] = set()
255+
group_admin_mappings[dir_group].add(ag)
256+
235257
return group_admin_mappings
236258

237259
def get_directory_connector_module_name(self) -> str:
@@ -276,7 +298,7 @@ def get_engine_options(self) -> dict:
276298
options['directory_group_filter'] = set(self.directory_groups.keys())
277299
options['cache'] = self.main_config.get_dict('cache')
278300
options['account_admin_groups'] = self.load_account_admin_groups()
279-
options['group_admin_mappings'] = self.load_group_admin_mappings()
301+
options['group_admin_mappings'] = self.load_group_admin_mappings(options['user_sync']['umg'])
280302
return options
281303

282304
def check_unused_config_keys(self):

0 commit comments

Comments
 (0)