Coverage Report

Created: 2026-09-03 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/mod_auth_openidc/src/metadata/conf.c
Line
Count
Source
1
/*
2
 * Licensed to the Apache Software Foundation (ASF) under one
3
 * or more contributor license agreements.  See the NOTICE file
4
 * distributed with this work for additional information
5
 * regarding copyright ownership.  The ASF licenses this file
6
 * to you under the Apache License, Version 2.0 (the
7
 * "License"); you may not use this file except in compliance
8
 * with the License.  You may obtain a copy of the License at
9
 *
10
 *   http://www.apache.org/licenses/LICENSE-2.0
11
 *
12
 * Unless required by applicable law or agreed to in writing,
13
 * software distributed under the License is distributed on an
14
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
 * KIND, either express or implied.  See the License for the
16
 * specific language governing permissions and limitations
17
 * under the License.
18
 */
19
20
/***************************************************************************
21
 * Copyright (C) 2017-2026 ZmartZone Holding BV
22
 * Copyright (C) 2013-2017 Ping Identity Corporation
23
 * All rights reserved.
24
 *
25
 * Per-issuer .conf overrides — read from disk, validate JOSE algorithms,
26
 * and apply each section onto a partially-built oidc_provider_t.
27
 *
28
 * @Author: Hans Zandbelt - hans.zandbelt@openidc.com
29
 */
30
31
#include "metadata/internal.h"
32
33
#include "cfg/parse.h"
34
#include "proto/proto.h"
35
#include "util/util.h"
36
37
#include <apr_file_io.h>
38
39
/*
40
 * check is a specified JOSE feature is supported
41
 */
42
static apr_byte_t oidc_metadata_conf_jose_is_supported(request_rec *r, const oidc_json_t *j_conf, const char *issuer,
43
0
                   const char *key, oidc_valid_function_t valid_function) {
44
0
  char *s_value = NULL;
45
0
  oidc_json_object_get_string(r->pool, j_conf, key, &s_value, NULL);
46
0
  if (s_value == NULL)
47
0
    return TRUE;
48
0
  const char *rv = valid_function(r->pool, s_value);
49
0
  if (rv != NULL) {
50
0
    oidc_error(r,
51
0
         "(%s) JSON conf data has \"%s\" entry but it contains an unsupported algorithm or "
52
0
         "encryption type: \"%s\" (%s)",
53
0
         issuer, key, s_value, rv);
54
0
    return FALSE;
55
0
  }
56
0
  return TRUE;
57
0
}
58
59
/*
60
 * check to see if JSON configuration data is valid
61
 */
62
0
static apr_byte_t oidc_metadata_conf_is_valid(request_rec *r, const oidc_json_t *j_conf, const char *issuer) {
63
64
0
  if (oidc_metadata_conf_jose_is_supported(r, j_conf, issuer, OIDC_METADATA_ID_TOKEN_SIGNED_RESPONSE_ALG,
65
0
             oidc_cfg_parse_is_valid_signed_response_alg) == FALSE)
66
0
    return FALSE;
67
0
  if (oidc_metadata_conf_jose_is_supported(r, j_conf, issuer, OIDC_METADATA_ID_TOKEN_ENCRYPTED_RESPONSE_ALG,
68
0
             oidc_cfg_parse_is_valid_encrypted_response_alg) == FALSE)
69
0
    return FALSE;
70
0
  if (oidc_metadata_conf_jose_is_supported(r, j_conf, issuer, OIDC_METADATA_ID_TOKEN_ENCRYPTED_RESPONSE_ENC,
71
0
             oidc_cfg_parse_is_valid_encrypted_response_enc) == FALSE)
72
0
    return FALSE;
73
0
  if (oidc_metadata_conf_jose_is_supported(r, j_conf, issuer, OIDC_METADATA_USERINFO_SIGNED_RESPONSE_ALG,
74
0
             oidc_cfg_parse_is_valid_signed_response_alg) == FALSE)
75
0
    return FALSE;
76
0
  if (oidc_metadata_conf_jose_is_supported(r, j_conf, issuer, OIDC_METADATA_USERINFO_ENCRYPTED_RESPONSE_ALG,
77
0
             oidc_cfg_parse_is_valid_encrypted_response_alg) == FALSE)
78
0
    return FALSE;
79
0
  if (oidc_metadata_conf_jose_is_supported(r, j_conf, issuer, OIDC_METADATA_USERINFO_ENCRYPTED_RESPONSE_ENC,
80
0
             oidc_cfg_parse_is_valid_encrypted_response_enc) == FALSE)
81
0
    return FALSE;
82
83
0
  return TRUE;
84
0
}
85
86
/*
87
 * see if we have config metadata
88
 */
89
0
apr_byte_t oidc_metadata_conf_get(request_rec *r, const char *issuer, oidc_json_t **j_conf) {
90
91
  /* get the full file path to the conf metadata for this issuer */
92
0
  const char *conf_path = oidc_metadata_conf_path(r, issuer);
93
94
  /* the .conf file is optional */
95
0
  apr_finfo_t fi;
96
0
  if (apr_stat(&fi, conf_path, APR_FINFO_MTIME, r->pool) != APR_SUCCESS)
97
0
    return TRUE;
98
99
  /* see if we have valid metadata already, if so, return it */
100
0
  if (oidc_metadata_file_read_json(r, conf_path, j_conf) == TRUE) {
101
102
    /* return the validation result */
103
0
    return oidc_metadata_conf_is_valid(r, *j_conf, issuer);
104
0
  }
105
106
0
  return FALSE;
107
0
}
108
109
/*
110
 * apply the conf profile; must run first so it can override potentially non-conformant / insecure settings
111
 */
112
static void oidc_metadata_conf_parse_profile(request_rec *r, oidc_cfg_t *cfg, const oidc_json_t *j_conf,
113
4.68k
               oidc_provider_t *provider) {
114
4.68k
  const char *rv = NULL;
115
4.68k
  char *value = NULL;
116
117
4.68k
  oidc_json_object_get_string(r->pool, j_conf, OIDC_METADATA_PROFILE, &value, NULL);
118
4.68k
  if (value) {
119
55
    rv = oidc_cfg_provider_profile_set(r->pool, provider, value);
120
55
    if (rv != NULL)
121
55
      oidc_error(r, "oidc_cfg_provider_profile_set: %s", rv);
122
4.63k
  } else {
123
4.63k
    oidc_cfg_provider_profile_int_set(provider, oidc_cfg_provider_profile_get(oidc_cfg_provider_get(cfg)));
124
4.63k
  }
125
4.68k
}
126
127
/*
128
 * release the heap cjose keys wrapped in a JWK list; registered as a request-pool cleanup because the
129
 * per-request provider built by oidc_metadata_get() is never oidc_cfg_provider_destroy'd
130
 */
131
1
static apr_status_t oidc_metadata_conf_jwk_list_cleanup(void *data) {
132
1
  oidc_jwk_list_destroy((apr_array_header_t *)data);
133
1
  return APR_SUCCESS;
134
1
}
135
136
/*
137
 * apply the client JWKS settings: jwks_uri, inline keys and signed-jwks-uri verification keys
138
 */
139
static void oidc_metadata_conf_parse_keys(request_rec *r, oidc_cfg_t *cfg, const oidc_json_t *j_conf,
140
4.68k
            oidc_provider_t *provider) {
141
4.68k
  const char *rv = NULL;
142
4.68k
  apr_array_header_t *keys = NULL;
143
144
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_CLIENT_JWKS_URI, client_jwks_uri);
145
146
4.68k
  oidc_metadata_get_jwks(r, j_conf, &keys);
147
4.68k
  if (keys != NULL) {
148
0
    rv = oidc_cfg_provider_client_keys_set_keys(r->pool, provider, keys);
149
0
    if (rv != NULL)
150
0
      oidc_error(r, "oidc_cfg_provider_client_keys_set: %s", rv);
151
    /* the inline .conf "keys" are freshly parsed and owned by this per-request provider, so free
152
     * them when the request pool is destroyed rather than leaking one cjose key set per
153
     * authentication */
154
0
    apr_pool_cleanup_register(r->pool, keys, oidc_metadata_conf_jwk_list_cleanup, apr_pool_cleanup_null);
155
0
  }
156
157
4.68k
  rv = oidc_cfg_provider_signed_jwks_uri_keys_set(
158
4.68k
      r->pool, provider, oidc_json_object_get(j_conf, "signed_jwks_uri_key"),
159
4.68k
      oidc_cfg_provider_signed_jwks_uri_keys_get(oidc_cfg_provider_get(cfg)));
160
4.68k
  if (rv != NULL)
161
4.68k
    oidc_error(r, "oidc_cfg_provider_signed_jwks_uri_keys_set: %s", rv);
162
  /* the signed-JWKs verification keys are now uniformly owned by this per-request provider -- a
163
   * freshly parsed .conf "signed_jwks_uri_key" or a copy of the global keys -- so release them with
164
   * the request pool like the inline "keys" above rather than leaking them per authentication */
165
4.68k
  if (oidc_cfg_provider_signed_jwks_uri_keys_get(provider) != NULL)
166
1
    apr_pool_cleanup_register(r->pool, oidc_cfg_provider_signed_jwks_uri_keys_get(provider),
167
1
            oidc_metadata_conf_jwk_list_cleanup, apr_pool_cleanup_null);
168
4.68k
}
169
170
/*
171
 * apply the id_token signing & encryption settings and the audience override
172
 */
173
static void oidc_metadata_conf_parse_id_token(request_rec *r, oidc_cfg_t *cfg, const oidc_json_t *j_conf,
174
4.68k
                oidc_provider_t *provider) {
175
4.68k
  const char *rv = NULL;
176
4.68k
  apr_array_header_t *auds = NULL;
177
178
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_ID_TOKEN_SIGNED_RESPONSE_ALG, id_token_signed_response_alg);
179
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_ID_TOKEN_ENCRYPTED_RESPONSE_ALG, id_token_encrypted_response_alg);
180
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_ID_TOKEN_ENCRYPTED_RESPONSE_ENC, id_token_encrypted_response_enc);
181
182
4.68k
  oidc_json_object_get_string_array(
183
4.68k
      r->pool, j_conf, OIDC_METADATA_ID_TOKEN_AUD_VALUES, &auds,
184
4.68k
      oidc_proto_profile_id_token_aud_values_get(r->pool, oidc_cfg_provider_get(cfg)));
185
4.68k
  if (auds != NULL) {
186
34
    rv = oidc_cfg_provider_id_token_aud_values_set_str_list(r->pool, provider, auds);
187
34
    if (rv != NULL)
188
34
      oidc_error(r, "oidc_cfg_provider_aud_values_set: %s", rv);
189
34
  }
190
4.68k
}
191
192
/*
193
 * apply the userinfo signing & encryption settings, refresh interval and token presentation method
194
 */
195
static void oidc_metadata_conf_parse_userinfo(request_rec *r, oidc_cfg_t *cfg, const oidc_json_t *j_conf,
196
4.68k
                oidc_provider_t *provider) {
197
4.68k
  const char *rv = NULL;
198
4.68k
  char *value = NULL;
199
200
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_USERINFO_SIGNED_RESPONSE_ALG, userinfo_signed_response_alg);
201
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_USERINFO_ENCRYPTED_RESPONSE_ALG, userinfo_encrypted_response_alg);
202
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_USERINFO_ENCRYPTED_RESPONSE_ENC, userinfo_encrypted_response_enc);
203
4.68k
  OIDC_METADATA_CONF_INT(j_conf, OIDC_METADATA_USERINFO_REFRESH_INTERVAL, userinfo_refresh_interval);
204
205
4.68k
  oidc_json_object_get_string(r->pool, j_conf, OIDC_METADATA_USERINFO_TOKEN_METHOD, &value, NULL);
206
4.68k
  if (value) {
207
28
    rv = oidc_cfg_provider_userinfo_token_method_set(r->pool, provider, value);
208
28
    if (rv != NULL)
209
28
      oidc_error(r, "oidc_cfg_provider_userinfo_token_method_set: %s", rv);
210
4.65k
  } else {
211
4.65k
    oidc_cfg_provider_userinfo_token_method_int_set(
212
4.65k
        provider, oidc_cfg_provider_userinfo_token_method_get(oidc_cfg_provider_get(cfg)));
213
4.65k
  }
214
4.68k
}
215
216
/*
217
 * apply SSL/issuer validation flags and session-related interval overrides
218
 */
219
static void oidc_metadata_conf_parse_session(request_rec *r, oidc_cfg_t *cfg, const oidc_json_t *j_conf,
220
4.68k
               oidc_provider_t *provider) {
221
4.68k
  OIDC_METADATA_CONF_BOOL(j_conf, OIDC_METADATA_SSL_VALIDATE_SERVER, ssl_validate_server);
222
4.68k
  OIDC_METADATA_CONF_BOOL(j_conf, OIDC_METADATA_VALIDATE_ISSUER, validate_issuer);
223
4.68k
  OIDC_METADATA_CONF_INT(j_conf, OIDC_METADATA_JWKS_REFRESH_INTERVAL, jwks_uri_refresh_interval);
224
4.68k
  OIDC_METADATA_CONF_INT(j_conf, OIDC_METADATA_IDTOKEN_IAT_SLACK, idtoken_iat_slack);
225
4.68k
  OIDC_METADATA_CONF_INT(j_conf, OIDC_METADATA_SESSION_MAX_DURATION, session_max_duration);
226
4.68k
}
227
228
/*
229
 * apply the scope, the various request-parameter overrides and the request_object setting
230
 */
231
static void oidc_metadata_conf_parse_request_params(request_rec *r, oidc_cfg_t *cfg, const oidc_json_t *j_conf,
232
4.68k
                oidc_provider_t *provider) {
233
  // NB: the configured client scopes are used as-is; they are not intersected with the provider's
234
  // "scopes_supported"
235
  /* NB: a missing "openid" value in the configured scopes is warned about at authentication-request
236
   * time in oidc_proto_request_auth_scope_set(), which covers this .conf path, the OIDCScope
237
   * directive and the per-path scopes alike */
238
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_SCOPE, scope);
239
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_AUTH_REQUEST_PARAMS, auth_request_params);
240
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_LOGOUT_REQUEST_PARAMS, logout_request_params);
241
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_TOKEN_ENDPOINT_PARAMS, token_endpoint_params);
242
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_REQUEST_OBJECT, request_object);
243
4.68k
}
244
245
/*
246
 * apply the response/PKCE settings
247
 */
248
static void oidc_metadata_conf_parse_response(request_rec *r, oidc_cfg_t *cfg, const oidc_json_t *j_conf,
249
4.68k
                oidc_provider_t *provider) {
250
4.68k
  char *value = NULL;
251
4.68k
  int ivalue = OIDC_CONFIG_POS_INT_UNSET;
252
253
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_RESPONSE_MODE, response_mode);
254
255
  /* pkce default uses the proto-profile default, not the global config */
256
4.68k
  oidc_json_object_get_string(r->pool, j_conf, OIDC_METADATA_PKCE_METHOD, &value,
257
4.68k
            oidc_proto_profile_pkce_get(provider)->method);
258
4.68k
  OIDC_METADATA_PROVIDER_SET(pkce, value);
259
260
  /* Preserve an absent response_type so client parsing can prefer the first advertised value. */
261
4.68k
  oidc_json_object_get_string(r->pool, j_conf, OIDC_METADATA_RESPONSE_TYPE, &value, NULL);
262
4.68k
  OIDC_METADATA_PROVIDER_SET(response_type, value);
263
264
4.68k
  oidc_metadata_parse_boolean(r, j_conf, OIDC_METADATA_RESPONSE_REQUIRE_ISS, &ivalue,
265
4.68k
            oidc_proto_profile_response_require_iss_get(provider));
266
4.68k
  OIDC_METADATA_PROVIDER_SET_INT(response_require_iss, ivalue);
267
4.68k
}
268
269
/*
270
 * apply the client name/contact and dynamic registration metadata overrides
271
 */
272
static void oidc_metadata_conf_parse_client(request_rec *r, oidc_cfg_t *cfg, const oidc_json_t *j_conf,
273
4.68k
              oidc_provider_t *provider) {
274
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_CLIENT_NAME, client_name);
275
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_CLIENT_CONTACT, client_contact);
276
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_REGISTRATION_TOKEN, registration_token);
277
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_REGISTRATION_ENDPOINT_JSON, registration_endpoint_json);
278
4.68k
}
279
280
/*
281
 * apply the token endpoint authentication method
282
 */
283
static void oidc_metadata_conf_parse_endpoint_auth(request_rec *r, oidc_cfg_t *cfg, const oidc_json_t *j_conf,
284
4.68k
               oidc_provider_t *provider) {
285
4.68k
  const char *rv = NULL;
286
4.68k
  char *value = NULL;
287
4.68k
  const oidc_provider_t *primary = oidc_cfg_provider_get(cfg);
288
4.68k
  const char *global_auth = oidc_cfg_provider_token_endpoint_auth_get(primary);
289
4.68k
  const char *global_alg = oidc_cfg_provider_token_endpoint_auth_alg_get(primary);
290
291
  /* Recombine the global method and algorithm so the fallback inherits both. */
292
4.68k
  const char *fallback = global_auth;
293
4.68k
  if ((global_auth != NULL) && (global_alg != NULL))
294
0
    fallback = apr_psprintf(r->pool, "%s:%s", global_auth, global_alg);
295
296
4.68k
  oidc_json_object_get_string(r->pool, j_conf, OIDC_METADATA_TOKEN_ENDPOINT_AUTH, &value, fallback);
297
4.68k
  if (value != NULL) {
298
132
    rv = oidc_cfg_provider_token_endpoint_auth_set(r->pool, cfg, provider, value);
299
132
    if (rv != NULL)
300
132
      oidc_error(r, "oidc_cfg_provider_token_endpoint_auth_set: %s", rv);
301
132
  }
302
4.68k
}
303
304
/*
305
 * apply the TLS client certificate auth settings for the token endpoint
306
 */
307
static void oidc_metadata_conf_parse_tls_client(request_rec *r, oidc_cfg_t *cfg, const oidc_json_t *j_conf,
308
4.68k
            oidc_provider_t *provider) {
309
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_TOKEN_ENDPOINT_TLS_CLIENT_CERT, token_endpoint_tls_client_cert);
310
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_TOKEN_ENDPOINT_TLS_CLIENT_KEY, token_endpoint_tls_client_key);
311
4.68k
  OIDC_METADATA_CONF_STR(j_conf, OIDC_METADATA_TOKEN_ENDPOINT_TLS_CLIENT_KEY_PWD,
312
4.68k
             token_endpoint_tls_client_key_pwd);
313
4.68k
}
314
315
/*
316
 * apply the DPoP mode
317
 */
318
4.68k
static void oidc_metadata_conf_parse_dpop_mode(request_rec *r, const oidc_json_t *j_conf, oidc_provider_t *provider) {
319
4.68k
  const char *rv = NULL;
320
4.68k
  char *value = NULL;
321
322
4.68k
  oidc_json_object_get_string(r->pool, j_conf, OIDC_METADATA_DPOP_MODE, &value, NULL);
323
4.68k
  if (value) {
324
26
    rv = oidc_cfg_provider_dpop_mode_set(r->pool, provider, value);
325
26
    if (rv != NULL)
326
26
      oidc_error(r, "oidc_cfg_provider_dpop_mode_set: %s", rv);
327
4.65k
  } else {
328
4.65k
    oidc_cfg_provider_dpop_mode_int_set(provider, oidc_proto_profile_dpop_mode_get(provider));
329
4.65k
  }
330
4.68k
}
331
332
/*
333
 * apply the RFC 8705 certificate-bound access tokens mode
334
 */
335
static void oidc_metadata_conf_parse_cert_bound_tokens(request_rec *r, oidc_cfg_t *cfg, const oidc_json_t *j_conf,
336
0
                   oidc_provider_t *provider) {
337
0
  const char *rv = NULL;
338
0
  char *value = NULL;
339
340
0
  oidc_json_object_get_string(r->pool, j_conf, OIDC_METADATA_CERT_BOUND_TOKENS, &value, NULL);
341
0
  if (value) {
342
0
    rv = oidc_cfg_provider_cert_bound_tokens_set(r->pool, provider, value);
343
0
    if (rv != NULL)
344
0
      oidc_error(r, "oidc_cfg_provider_cert_bound_tokens_set: %s", rv);
345
0
  } else {
346
0
    oidc_cfg_provider_cert_bound_tokens_int_set(
347
0
        provider, oidc_cfg_provider_cert_bound_tokens_get(oidc_cfg_provider_get(cfg)));
348
0
  }
349
0
}
350
351
/*
352
 * apply the HTTP method used to deliver the authentication request
353
 */
354
static void oidc_metadata_conf_parse_auth_request_method(request_rec *r, const oidc_json_t *j_conf,
355
4.68k
               oidc_provider_t *provider) {
356
4.68k
  const char *rv = NULL;
357
4.68k
  char *value = NULL;
358
359
4.68k
  oidc_json_object_get_string(r->pool, j_conf, OIDC_METADATA_AUTH_REQUEST_METHOD, &value, NULL);
360
4.68k
  if (value) {
361
10
    rv = oidc_cfg_provider_auth_request_method_set(r->pool, provider, value);
362
10
    if (rv != NULL)
363
10
      oidc_error(r, "oidc_cfg_provider_auth_request_method_set: %s", rv);
364
4.67k
  } else {
365
4.67k
    oidc_cfg_provider_auth_request_method_int_set(provider,
366
4.67k
                    oidc_proto_profile_auth_request_method_get(provider));
367
4.67k
  }
368
4.68k
}
369
370
/*
371
 * Apply profile, authentication, and certificate overrides before provider parsing because its
372
 * RFC 8705 decisions depend on them. The full conf parse applies them again later.
373
 */
374
void oidc_metadata_conf_parse_pre_provider(request_rec *r, oidc_cfg_t *cfg, const oidc_json_t *j_conf,
375
0
             oidc_provider_t *provider) {
376
0
  oidc_metadata_conf_parse_profile(r, cfg, j_conf, provider);
377
0
  oidc_metadata_conf_parse_endpoint_auth(r, cfg, j_conf, provider);
378
0
  oidc_metadata_conf_parse_tls_client(r, cfg, j_conf, provider);
379
0
  oidc_metadata_conf_parse_cert_bound_tokens(r, cfg, j_conf, provider);
380
0
}
381
382
/*
383
 * parse the JSON conf metadata in to a oidc_provider_t struct
384
 */
385
apr_byte_t oidc_metadata_conf_parse(request_rec *r, oidc_cfg_t *cfg, const oidc_json_t *j_conf,
386
4.68k
            oidc_provider_t *provider) {
387
4.68k
  oidc_metadata_conf_parse_profile(r, cfg, j_conf, provider);
388
4.68k
  oidc_metadata_conf_parse_keys(r, cfg, j_conf, provider);
389
4.68k
  oidc_metadata_conf_parse_id_token(r, cfg, j_conf, provider);
390
4.68k
  oidc_metadata_conf_parse_userinfo(r, cfg, j_conf, provider);
391
4.68k
  oidc_metadata_conf_parse_session(r, cfg, j_conf, provider);
392
4.68k
  oidc_metadata_conf_parse_request_params(r, cfg, j_conf, provider);
393
4.68k
  oidc_metadata_conf_parse_response(r, cfg, j_conf, provider);
394
4.68k
  oidc_metadata_conf_parse_client(r, cfg, j_conf, provider);
395
4.68k
  oidc_metadata_conf_parse_endpoint_auth(r, cfg, j_conf, provider);
396
4.68k
  oidc_metadata_conf_parse_tls_client(r, cfg, j_conf, provider);
397
  /* NB: no oidc_metadata_conf_parse_cert_bound_tokens() here: it is applied by
398
   *     oidc_metadata_conf_parse_pre_provider() only, since oidc_metadata_provider_parse() has
399
   *     resolved the setting into a definitive "on"/"off" on the provider by now and re-applying
400
   *     the configured (possibly "auto") value would discard that outcome */
401
4.68k
  oidc_metadata_conf_parse_dpop_mode(r, j_conf, provider);
402
4.68k
  oidc_metadata_conf_parse_auth_request_method(r, j_conf, provider);
403
4.68k
  return TRUE;
404
4.68k
}