Skip to content

Commit 484f435

Browse files
committed
use deep-copy and cleanup functions for server and provider configs
fixes overriding server-level keys in vhost configs Signed-off-by: Hans Zandbelt <[email protected]>
1 parent 3b90028 commit 484f435

File tree

8 files changed

+248
-246
lines changed

8 files changed

+248
-246
lines changed

ChangeLog

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
03/10/2023
22
- shm cache: increase default maximum number of active sessions from 500 to 2000
33
- shm cache: allow configuration of max 1Mb of session data for a single session
4-
- change oidc_cfg cleanup procedures to better accomodate server rec merging
4+
- use deep-copy and cleanup functions for server and provider configs; fixes overriding server-level keys in vhost configs
55

66
03/09/2023
77
- add support for OP "signed_jwks_uri" with "OIDCProviderSignedJwksUri <uri> <jwk>"

configure.ac

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
AC_INIT([mod_auth_openidc],[2.4.13rc5],[[email protected]])
1+
AC_INIT([mod_auth_openidc],[2.4.13],[[email protected]])
22

33
AC_SUBST(NAMEVER, AC_PACKAGE_TARNAME()-AC_PACKAGE_VERSION())
44

src/config.c

Lines changed: 225 additions & 229 deletions
Large diffs are not rendered by default.

src/jose.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,20 @@ void oidc_jwk_list_destroy_hash(apr_hash_t *keys) {
405405
}
406406
}
407407

408+
apr_array_header_t* oidc_jwk_list_copy(apr_pool_t *pool,
409+
apr_array_header_t *src) {
410+
apr_array_header_t *dst = NULL;
411+
int i = 0;
412+
if (src == NULL)
413+
return NULL;
414+
apr_array_make(pool, src->nelts, sizeof(const oidc_jwk_t*));
415+
for (i = 0; (src) && (i < src->nelts); i++) {
416+
const oidc_jwk_t *jwk = ((const oidc_jwk_t**) src->elts)[i];
417+
*(const oidc_jwk_t**) apr_array_push(dst) = oidc_jwk_copy(pool, jwk);
418+
}
419+
return src;
420+
}
421+
408422
void oidc_jwk_list_destroy(apr_array_header_t *keys_list) {
409423
if (keys_list == NULL)
410424
return;

src/jose.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ apr_byte_t oidc_jwk_to_json(apr_pool_t *pool, const oidc_jwk_t *jwk,
175175
void oidc_jwk_destroy(oidc_jwk_t *jwk);
176176
/* destroy a list of JWKs structs */
177177
void oidc_jwk_list_destroy_hash(apr_hash_t *key);
178+
apr_array_header_t *oidc_jwk_list_copy(apr_pool_t *pool, apr_array_header_t *src);
178179
void oidc_jwk_list_destroy(apr_array_header_t *keys_list);
179180
/* create an "oct" symmetric JWK */
180181
oidc_jwk_t* oidc_jwk_create_symmetric_key(apr_pool_t *pool, const char *kid,

src/metadata.c

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,12 +1233,6 @@ static void oidc_metadata_get_jwks(request_rec *r, json_t *json,
12331233
}
12341234
}
12351235

1236-
static apr_status_t oidc_metadata_cleanup_jwk(void *p) {
1237-
oidc_jwk_t *jwk = (oidc_jwk_t *)p;
1238-
oidc_jwk_destroy(jwk);
1239-
return APR_SUCCESS;
1240-
}
1241-
12421236
/*
12431237
* parse the JSON conf metadata in to a oidc_provider_t struct
12441238
*/
@@ -1255,7 +1249,6 @@ apr_byte_t oidc_metadata_conf_parse(request_rec *r, oidc_cfg *cfg,
12551249
oidc_metadata_get_jwks(r, j_conf,
12561250
OIDC_JWK_ENC, &provider->client_encryption_keys);
12571251

1258-
12591252
oidc_jose_error_t err;
12601253
json_t *jwk = json_object_get(j_conf, "signed_jwks_uri_key");
12611254
if (jwk != NULL) {
@@ -1265,8 +1258,6 @@ apr_byte_t oidc_metadata_conf_parse(request_rec *r, oidc_cfg *cfg,
12651258
"oidc_jwk_parse_json failed for \"signed_jwks_uri_key\": %s",
12661259
oidc_jose_e2s(r->pool, err));
12671260
}
1268-
apr_pool_cleanup_register(r->pool, provider->jwks_uri.jwk,
1269-
oidc_metadata_cleanup_jwk, oidc_metadata_cleanup_jwk);
12701261
} else if (cfg->provider.jwks_uri.jwk != NULL) {
12711262
provider->jwks_uri.jwk = cfg->provider.jwks_uri.jwk;
12721263
}
@@ -1318,7 +1309,8 @@ apr_byte_t oidc_metadata_conf_parse(request_rec *r, oidc_cfg *cfg,
13181309

13191310
/* see if we've got a custom JWKs refresh interval */
13201311
oidc_metadata_get_valid_int(r, j_conf, OIDC_METADATA_JWKS_REFRESH_INTERVAL,
1321-
oidc_valid_jwks_refresh_interval, &provider->jwks_uri.refresh_interval,
1312+
oidc_valid_jwks_refresh_interval,
1313+
&provider->jwks_uri.refresh_interval,
13221314
cfg->provider.jwks_uri.refresh_interval);
13231315

13241316
/* see if we've got a custom IAT slack interval */
@@ -1527,8 +1519,7 @@ apr_byte_t oidc_metadata_get(request_rec *r, oidc_cfg *cfg, const char *issuer,
15271519
json_t *j_conf = NULL;
15281520

15291521
/* allocate space for a parsed-and-merged metadata struct */
1530-
*provider = apr_pcalloc(r->pool, sizeof(oidc_provider_t));
1531-
oidc_cfg_provider_init(*provider);
1522+
*provider = oidc_cfg_provider_create(r->pool);
15321523

15331524
/*
15341525
* read and parse the provider, conf and client metadata respectively

src/mod_auth_openidc.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,8 +311,7 @@ static apr_byte_t oidc_provider_static_config(request_rec *r, oidc_cfg *c,
311311
}
312312
}
313313

314-
*provider = apr_pcalloc(r->pool, sizeof(oidc_provider_t));
315-
memcpy(*provider, &c->provider, sizeof(oidc_provider_t));
314+
*provider = oidc_cfg_provider_copy(r->pool, &c->provider);
316315

317316
if (oidc_metadata_provider_parse(r, c, j_provider, *provider) == FALSE) {
318317
oidc_error(r, "could not parse metadata from url: %s",

src/mod_auth_openidc.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -790,7 +790,8 @@ int oidc_cfg_dir_refresh_access_token_before_expiry(request_rec *r);
790790
int oidc_cfg_dir_logout_on_error_refresh(request_rec *r);
791791
char *oidc_cfg_dir_state_cookie_prefix(request_rec *r);
792792
int oidc_cfg_delete_oldest_state_cookies(oidc_cfg *cfg);
793-
void oidc_cfg_provider_init(oidc_provider_t *provider);
793+
oidc_provider_t* oidc_cfg_provider_create(apr_pool_t *pool);
794+
oidc_provider_t* oidc_cfg_provider_copy(apr_pool_t *pool, const oidc_provider_t *src);
794795
void oidc_config_check_x_forwarded(request_rec *r, const apr_byte_t x_forwarded_headers);
795796
796797
// oidc_util.c

0 commit comments

Comments
 (0)