@@ -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