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