15
15
# limitations under the License.
16
16
17
17
import string
18
- from typing import Iterable , Optional , Type
18
+ from typing import Iterable , Optional , Tuple , Type
19
19
20
20
import attr
21
21
@@ -280,8 +280,8 @@ def _parse_oidc_provider_configs(config: JsonDict) -> Iterable["OidcProviderConf
280
280
"""
281
281
validate_config (MAIN_CONFIG_SCHEMA , config , ())
282
282
283
- for p in config .get ("oidc_providers" ) or []:
284
- yield _parse_oidc_config_dict (p )
283
+ for i , p in enumerate ( config .get ("oidc_providers" ) or []) :
284
+ yield _parse_oidc_config_dict (p , ( "oidc_providers" , "<item %i>" % ( i ,)) )
285
285
286
286
# for backwards-compatibility, it is also possible to provide a single "oidc_config"
287
287
# object with an "enabled: True" property.
@@ -291,10 +291,12 @@ def _parse_oidc_provider_configs(config: JsonDict) -> Iterable["OidcProviderConf
291
291
# it matches OIDC_PROVIDER_CONFIG_SCHEMA (see the comments on OIDC_CONFIG_SCHEMA
292
292
# above), so now we need to validate it.
293
293
validate_config (OIDC_PROVIDER_CONFIG_SCHEMA , oidc_config , ("oidc_config" ,))
294
- yield _parse_oidc_config_dict (oidc_config )
294
+ yield _parse_oidc_config_dict (oidc_config , ( "oidc_config" ,) )
295
295
296
296
297
- def _parse_oidc_config_dict (oidc_config : JsonDict ) -> "OidcProviderConfig" :
297
+ def _parse_oidc_config_dict (
298
+ oidc_config : JsonDict , config_path : Tuple [str , ...]
299
+ ) -> "OidcProviderConfig" :
298
300
"""Take the configuration dict and parse it into an OidcProviderConfig
299
301
300
302
Raises:
@@ -305,7 +307,7 @@ def _parse_oidc_config_dict(oidc_config: JsonDict) -> "OidcProviderConfig":
305
307
ump_config .setdefault ("config" , {})
306
308
307
309
(user_mapping_provider_class , user_mapping_provider_config ,) = load_module (
308
- ump_config , ( "oidc_config" , " user_mapping_provider" )
310
+ ump_config , config_path + ( " user_mapping_provider", )
309
311
)
310
312
311
313
# Ensure loaded user mapping module has defined all necessary methods
@@ -320,9 +322,9 @@ def _parse_oidc_config_dict(oidc_config: JsonDict) -> "OidcProviderConfig":
320
322
]
321
323
if missing_methods :
322
324
raise ConfigError (
323
- "Class specified by oidc_config. "
324
- "user_mapping_provider.module is missing required "
325
- "methods: %s" % ( " , ". join ( missing_methods ),)
325
+ "Class %s is missing required "
326
+ "methods: %s" % ( user_mapping_provider_class , ", " . join ( missing_methods ),),
327
+ config_path + ( "user_mapping_provider" , "module" ),
326
328
)
327
329
328
330
# MSC2858 will appy certain limits in what can be used as an IdP id, so let's
@@ -331,7 +333,10 @@ def _parse_oidc_config_dict(oidc_config: JsonDict) -> "OidcProviderConfig":
331
333
valid_idp_chars = set (string .ascii_letters + string .digits + "-._~" )
332
334
333
335
if any (c not in valid_idp_chars for c in idp_id ):
334
- raise ConfigError ('idp_id may only contain A-Z, a-z, 0-9, "-", ".", "_", "~"' )
336
+ raise ConfigError (
337
+ 'idp_id may only contain A-Z, a-z, 0-9, "-", ".", "_", "~"' ,
338
+ config_path + ("idp_id" ,),
339
+ )
335
340
336
341
return OidcProviderConfig (
337
342
idp_id = idp_id ,
0 commit comments