/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 | } |