8686#define OIDC_METADATA_ID_TOKEN_ENCRYPTED_RESPONSE_ALG "id_token_encrypted_response_alg"
8787#define OIDC_METADATA_ID_TOKEN_ENCRYPTED_RESPONSE_ENC "id_token_encrypted_response_enc"
8888#define OIDC_METADATA_ID_TOKEN_AUD_VALUES "id_token_aud_values"
89+ #define OIDC_METADATA_PROFILE "profile"
8990#define OIDC_METADATA_USERINFO_SIGNED_RESPONSE_ALG "userinfo_signed_response_alg"
9091#define OIDC_METADATA_USERINFO_ENCRYPTED_RESPONSE_ALG "userinfo_encrypted_response_alg"
9192#define OIDC_METADATA_USERINFO_ENCRYPTED_RESPONSE_ENC "userinfo_encrypted_response_enc"
@@ -1003,7 +1004,7 @@ static void oidc_metadata_parse_url(request_rec *r, const char *type, const char
10031004 oidc_error(r, "oidc_cfg_provider_%s_set: %s", TOSTRING(member), rv); \
10041005 }
10051006
1006- #define OIDC_METADATA_PROVIDER_SET_INT (member , ivalue , rv ) \
1007+ #define OIDC_METADATA_PROVIDER_SET_INT (provider , member , ivalue , rv ) \
10071008 if (ivalue != OIDC_CONFIG_POS_INT_UNSET) { \
10081009 rv = oidc_cfg_provider_##member##_set(r->pool, provider, ivalue); \
10091010 if (rv != NULL) \
@@ -1094,7 +1095,7 @@ apr_byte_t oidc_metadata_provider_parse(request_rec *r, oidc_cfg_t *cfg, json_t
10941095 // provided
10951096 oidc_metadata_parse_boolean (r , j_provider , OIDC_METADATA_BACKCHANNEL_LOGOUT_SUPPORTED , & ivalue ,
10961097 oidc_cfg_provider_backchannel_logout_supported_get (provider ));
1097- OIDC_METADATA_PROVIDER_SET_INT (backchannel_logout_supported , ivalue , rv )
1098+ OIDC_METADATA_PROVIDER_SET_INT (provider , backchannel_logout_supported , ivalue , rv )
10981099
10991100 if (oidc_cfg_provider_token_endpoint_auth_get (provider ) == NULL ) {
11001101 if (oidc_metadata_valid_string_in_array (r -> pool , j_provider ,
@@ -1230,6 +1231,17 @@ apr_byte_t oidc_metadata_conf_parse(request_rec *r, oidc_cfg_t *cfg, json_t *j_c
12301231 int ivalue = OIDC_CONFIG_POS_INT_UNSET ;
12311232 apr_array_header_t * keys = NULL , * auds = NULL ;
12321233
1234+ // NB: need this first so the profile - if explicitly configured - will override
1235+ // potentially non-conformant / insecure settings
1236+ oidc_util_json_object_get_string (r -> pool , j_conf , OIDC_METADATA_PROFILE , & value , NULL );
1237+ if (value ) {
1238+ rv = oidc_cfg_provider_profile_set (r -> pool , provider , value );
1239+ if (rv != NULL )
1240+ oidc_error (r , "oidc_cfg_provider_profile_set: %s" , rv );
1241+ } else {
1242+ oidc_cfg_provider_profile_int_set (provider , oidc_cfg_provider_profile_get (oidc_cfg_provider_get (cfg )));
1243+ }
1244+
12331245 oidc_util_json_object_get_string (r -> pool , j_conf , OIDC_METADATA_CLIENT_JWKS_URI , & value ,
12341246 oidc_cfg_provider_client_jwks_uri_get (oidc_cfg_provider_get (cfg )));
12351247 OIDC_METADATA_PROVIDER_SET (client_jwks_uri , value , rv )
@@ -1263,8 +1275,9 @@ apr_byte_t oidc_metadata_conf_parse(request_rec *r, oidc_cfg_t *cfg, json_t *j_c
12631275 oidc_cfg_provider_id_token_encrypted_response_enc_get (oidc_cfg_provider_get (cfg )));
12641276 OIDC_METADATA_PROVIDER_SET (id_token_encrypted_response_enc , value , rv )
12651277
1266- oidc_util_json_object_get_string_array (r -> pool , j_conf , OIDC_METADATA_ID_TOKEN_AUD_VALUES , & auds ,
1267- oidc_cfg_provider_id_token_aud_values_get (oidc_cfg_provider_get (cfg )));
1278+ oidc_util_json_object_get_string_array (
1279+ r -> pool , j_conf , OIDC_METADATA_ID_TOKEN_AUD_VALUES , & auds ,
1280+ oidc_proto_profile_id_token_aud_values_get (r -> pool , oidc_cfg_provider_get (cfg )));
12681281 if (auds != NULL ) {
12691282 rv = oidc_cfg_provider_id_token_aud_values_set_str_list (r -> pool , provider , auds );
12701283 if (rv != NULL )
@@ -1291,11 +1304,11 @@ apr_byte_t oidc_metadata_conf_parse(request_rec *r, oidc_cfg_t *cfg, json_t *j_c
12911304 * for this provider */
12921305 oidc_metadata_parse_boolean (r , j_conf , OIDC_METADATA_SSL_VALIDATE_SERVER , & ivalue ,
12931306 oidc_cfg_provider_ssl_validate_server_get (oidc_cfg_provider_get (cfg )));
1294- OIDC_METADATA_PROVIDER_SET_INT (ssl_validate_server , ivalue , rv )
1307+ OIDC_METADATA_PROVIDER_SET_INT (provider , ssl_validate_server , ivalue , rv )
12951308
12961309 oidc_metadata_parse_boolean (r , j_conf , OIDC_METADATA_VALIDATE_ISSUER , & ivalue ,
12971310 oidc_cfg_provider_validate_issuer_get (oidc_cfg_provider_get (cfg )));
1298- OIDC_METADATA_PROVIDER_SET_INT (validate_issuer , ivalue , rv )
1311+ OIDC_METADATA_PROVIDER_SET_INT (provider , validate_issuer , ivalue , rv )
12991312
13001313 /* find out what scopes we should be requesting from this provider */
13011314 // TODO: use the provider "scopes_supported" to mix-and-match with what we've configured for the client
@@ -1307,17 +1320,17 @@ apr_byte_t oidc_metadata_conf_parse(request_rec *r, oidc_cfg_t *cfg, json_t *j_c
13071320 /* see if we've got a custom JWKs refresh interval */
13081321 oidc_util_json_object_get_int (j_conf , OIDC_METADATA_JWKS_REFRESH_INTERVAL , & ivalue ,
13091322 oidc_cfg_provider_jwks_uri_refresh_interval_get (oidc_cfg_provider_get (cfg )));
1310- OIDC_METADATA_PROVIDER_SET_INT (jwks_uri_refresh_interval , ivalue , rv )
1323+ OIDC_METADATA_PROVIDER_SET_INT (provider , jwks_uri_refresh_interval , ivalue , rv )
13111324
13121325 /* see if we've got a custom IAT slack interval */
13131326 oidc_util_json_object_get_int (j_conf , OIDC_METADATA_IDTOKEN_IAT_SLACK , & ivalue ,
13141327 oidc_cfg_provider_idtoken_iat_slack_get (oidc_cfg_provider_get (cfg )));
1315- OIDC_METADATA_PROVIDER_SET_INT (idtoken_iat_slack , ivalue , rv )
1328+ OIDC_METADATA_PROVIDER_SET_INT (provider , idtoken_iat_slack , ivalue , rv )
13161329
13171330 /* see if we've got a custom max session duration */
13181331 oidc_util_json_object_get_int (j_conf , OIDC_METADATA_SESSION_MAX_DURATION , & ivalue ,
13191332 oidc_cfg_provider_session_max_duration_get (oidc_cfg_provider_get (cfg )));
1320- OIDC_METADATA_PROVIDER_SET_INT (session_max_duration , ivalue , rv )
1333+ OIDC_METADATA_PROVIDER_SET_INT (provider , session_max_duration , ivalue , rv )
13211334
13221335 /* see if we've got custom authentication request parameter values */
13231336 oidc_util_json_object_get_string (r -> pool , j_conf , OIDC_METADATA_AUTH_REQUEST_PARAMS , & value ,
@@ -1341,7 +1354,7 @@ apr_byte_t oidc_metadata_conf_parse(request_rec *r, oidc_cfg_t *cfg, json_t *j_c
13411354
13421355 /* get the PKCE method to use */
13431356 oidc_util_json_object_get_string (r -> pool , j_conf , OIDC_METADATA_PKCE_METHOD , & value ,
1344- oidc_cfg_provider_pkce_get ( oidc_cfg_provider_get ( cfg ) )-> method );
1357+ oidc_proto_profile_pkce_get ( provider )-> method );
13451358 OIDC_METADATA_PROVIDER_SET (pkce , value , rv )
13461359
13471360 /* see if we've got a custom DPoP mode */
@@ -1351,8 +1364,7 @@ apr_byte_t oidc_metadata_conf_parse(request_rec *r, oidc_cfg_t *cfg, json_t *j_c
13511364 if (rv != NULL )
13521365 oidc_error (r , "oidc_cfg_provider_dpop_mode_set: %s" , rv );
13531366 } else {
1354- oidc_cfg_provider_dpop_mode_int_set (provider ,
1355- oidc_cfg_provider_dpop_mode_get (oidc_cfg_provider_get (cfg )));
1367+ oidc_cfg_provider_dpop_mode_int_set (provider , oidc_proto_profile_dpop_mode_get (provider ));
13561368 }
13571369
13581370 /* get the client name */
@@ -1392,7 +1404,7 @@ apr_byte_t oidc_metadata_conf_parse(request_rec *r, oidc_cfg_t *cfg, json_t *j_c
13921404 /* see if we've got a custom user info refresh interval */
13931405 oidc_util_json_object_get_int (j_conf , OIDC_METADATA_USERINFO_REFRESH_INTERVAL , & ivalue ,
13941406 oidc_cfg_provider_userinfo_refresh_interval_get (oidc_cfg_provider_get (cfg )));
1395- OIDC_METADATA_PROVIDER_SET_INT (userinfo_refresh_interval , ivalue , rv )
1407+ OIDC_METADATA_PROVIDER_SET_INT (provider , userinfo_refresh_interval , ivalue , rv )
13961408
13971409 /* TLS client cert auth settings */
13981410 oidc_util_json_object_get_string (
@@ -1432,14 +1444,14 @@ apr_byte_t oidc_metadata_conf_parse(request_rec *r, oidc_cfg_t *cfg, json_t *j_c
14321444 if (rv != NULL )
14331445 oidc_error (r , "oidc_cfg_provider_auth_request_method_set: %s" , rv );
14341446 } else {
1435- oidc_cfg_provider_auth_request_method_int_set (
1436- provider , oidc_cfg_provider_auth_request_method_get ( oidc_cfg_provider_get ( cfg ) ));
1447+ oidc_cfg_provider_auth_request_method_int_set (provider ,
1448+ oidc_proto_profile_auth_request_method_get ( provider ));
14371449 }
14381450
14391451 /* get the issuer specific redirect URI option */
14401452 oidc_metadata_parse_boolean (r , j_conf , OIDC_METADATA_RESPONSE_REQUIRE_ISS , & ivalue ,
1441- oidc_cfg_provider_response_require_iss_get ( oidc_cfg_provider_get ( cfg ) ));
1442- OIDC_METADATA_PROVIDER_SET_INT (response_require_iss , ivalue , rv )
1453+ oidc_proto_profile_response_require_iss_get ( provider ));
1454+ OIDC_METADATA_PROVIDER_SET_INT (provider , response_require_iss , ivalue , rv )
14431455
14441456 return TRUE;
14451457}
0 commit comments