Skip to content

Commit 6f9aed1

Browse files
committed
pass JSON real claims without trailing zeros; use 8 digits precision
complete util/appinfo.c test coverage Signed-off-by: Hans Zandbelt <[email protected]>
1 parent 630122d commit 6f9aed1

File tree

4 files changed

+78
-42
lines changed

4 files changed

+78
-42
lines changed

ChangeLog

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
08/31/2025
2+
- pass JSON real claims without trailing zeros, use 8 digits precision instead of 6
3+
- test: complete util/appinfo.c coverage
4+
15
08/27/2025
26
- improve Redis (and Metrics) performance on process MPMs by using
37
apr_thread_mutex_t (instead of apr_proc_mutex_t) for locking; see #1340

src/util/appinfo.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,13 +111,15 @@ void oidc_util_appinfo_set(request_rec *r, const char *s_key, const char *s_valu
111111
}
112112
}
113113

114+
#define OIDC_JSON_MAX_INT_STR_LEN 64
115+
114116
/*
115117
* set the user/claims information from the session in HTTP headers passed on to the application
116118
*/
117119
void oidc_util_appinfo_set_all(request_rec *r, json_t *j_attrs, const char *claim_prefix, const char *claim_delimiter,
118120
oidc_appinfo_pass_in_t pass_in, oidc_appinfo_encoding_t encoding) {
119121

120-
char s_int[255];
122+
char s_int[OIDC_JSON_MAX_INT_STR_LEN];
121123
json_t *j_value = NULL;
122124
const char *s_key = NULL;
123125

@@ -150,18 +152,16 @@ void oidc_util_appinfo_set_all(request_rec *r, json_t *j_attrs, const char *clai
150152

151153
} else if (json_is_integer(j_value)) {
152154

153-
if (snprintf(s_int, 255, "%ld", (long)json_integer_value(j_value)) > 0) {
155+
if (snprintf(s_int, OIDC_JSON_MAX_INT_STR_LEN, "%ld", (long)json_integer_value(j_value)) > 0) {
154156
/* set long value in the application header whose name is based on the key and the
155157
* prefix */
156158
oidc_util_appinfo_set(r, s_key, s_int, claim_prefix, pass_in, encoding);
157-
} else {
158-
oidc_warn(r, "could not convert JSON number to string (> 255 characters?), skipping");
159159
}
160160

161161
} else if (json_is_real(j_value)) {
162162

163163
/* set float value in the application header whose name is based on the key and the prefix */
164-
oidc_util_appinfo_set(r, s_key, apr_psprintf(r->pool, "%lf", json_real_value(j_value)),
164+
oidc_util_appinfo_set(r, s_key, apr_psprintf(r->pool, "%.8g", json_real_value(j_value)),
165165
claim_prefix, pass_in, encoding);
166166

167167
} else if (json_is_object(j_value)) {

test/test.c

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1736,41 +1736,6 @@ static char *test_open_redirect(request_rec *r) {
17361736
return 0;
17371737
}
17381738

1739-
static char *test_set_app_infos(request_rec *r) {
1740-
apr_byte_t rc = FALSE;
1741-
json_t *claims = NULL;
1742-
1743-
rc = oidc_util_json_decode_object(r,
1744-
"{"
1745-
"\"simple\":\"hans\","
1746-
"\"name\": \"GÜnther\","
1747-
"\"dagger\": \"D†gger\""
1748-
"}",
1749-
&claims);
1750-
TST_ASSERT("valid JSON", rc == TRUE);
1751-
1752-
oidc_util_appinfo_set_all(r, claims, "OIDC_CLAIM_", ",", OIDC_APPINFO_PASS_HEADERS, OIDC_APPINFO_ENCODING_NONE);
1753-
TST_ASSERT_STR("header plain simple", apr_table_get(r->headers_in, "OIDC_CLAIM_simple"), "hans");
1754-
TST_ASSERT_STR("header plain name", apr_table_get(r->headers_in, "OIDC_CLAIM_name"), "G\u00DCnther");
1755-
TST_ASSERT_STR("header plain dagger", apr_table_get(r->headers_in, "OIDC_CLAIM_dagger"), "D\u2020gger");
1756-
1757-
oidc_util_appinfo_set_all(r, claims, "OIDC_CLAIM_", ",", OIDC_APPINFO_PASS_HEADERS,
1758-
OIDC_APPINFO_ENCODING_BASE64URL);
1759-
TST_ASSERT_STR("header base64url simple", apr_table_get(r->headers_in, "OIDC_CLAIM_simple"), "aGFucw");
1760-
TST_ASSERT_STR("header base64url name", apr_table_get(r->headers_in, "OIDC_CLAIM_name"), "R8OcbnRoZXI");
1761-
TST_ASSERT_STR("header base64url dagger", apr_table_get(r->headers_in, "OIDC_CLAIM_dagger"), "ROKAoGdnZXI");
1762-
1763-
oidc_util_appinfo_set_all(r, claims, "OIDC_CLAIM_", ",", OIDC_APPINFO_PASS_HEADERS,
1764-
OIDC_APPINFO_ENCODING_LATIN1);
1765-
TST_ASSERT_STR("header latin1 simple", apr_table_get(r->headers_in, "OIDC_CLAIM_simple"), "hans");
1766-
TST_ASSERT_STR("header latin1 name", apr_table_get(r->headers_in, "OIDC_CLAIM_name"), "G\xDCnther");
1767-
TST_ASSERT_STR("header latin1 dagger", apr_table_get(r->headers_in, "OIDC_CLAIM_dagger"), "D?gger");
1768-
1769-
json_decref(claims);
1770-
1771-
return 0;
1772-
}
1773-
17741739
static char *test_check_cookie_domain(request_rec *r) {
17751740
apr_byte_t rv = FALSE;
17761741
oidc_cfg_t *c = ap_get_module_config(r->server->module_config, &auth_openidc_module);
@@ -1838,7 +1803,6 @@ static char *all_tests(apr_pool_t *pool, request_rec *r) {
18381803
TST_RUN(test_remote_user, r);
18391804
TST_RUN(test_is_auth_capable_request, r);
18401805
TST_RUN(test_open_redirect, r);
1841-
TST_RUN(test_set_app_infos, r);
18421806

18431807
#if HAVE_APACHE_24
18441808
TST_RUN(test_authz_worker, r);

test/test_util.c

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,72 @@ START_TEST(test_util_base64url_decode) {
8787
}
8888
END_TEST
8989

90+
START_TEST(test_util_appinfo_set) {
91+
apr_byte_t rc = FALSE;
92+
json_t *claims = NULL;
93+
request_rec *r = oidc_test_request_get();
94+
95+
rc = oidc_util_json_decode_object(r,
96+
"{"
97+
"\"simple\":\"hans\","
98+
"\"name\": \"GÜnther\","
99+
"\"dagger\": \"D†gÿger\","
100+
"\"anarr\" : [ false, \"hans\", \"piet\", true, {} ],"
101+
"\"names\" : [ \"hans\", \"piet\" ],"
102+
"\"abool\": true,"
103+
"\"anint\": 5,"
104+
"\"lint\": 111111111111111,"
105+
"\"areal\": 1.5,"
106+
"\"anobj\" : { \"hans\": \"piet\", \"abool\": false },"
107+
"\"anull\": null"
108+
"}",
109+
&claims);
110+
ck_assert_int_eq(rc, TRUE);
111+
112+
oidc_util_appinfo_set_all(r, NULL, "OIDC_CLAIM_", ",", OIDC_APPINFO_PASS_HEADERS, OIDC_APPINFO_ENCODING_NONE);
113+
114+
oidc_util_appinfo_set_all(r, claims, "OIDC_CLAIM_", ",", OIDC_APPINFO_PASS_HEADERS, OIDC_APPINFO_ENCODING_NONE);
115+
ck_assert_str_eq(apr_table_get(r->headers_in, "OIDC_CLAIM_simple"), "hans");
116+
ck_assert_str_eq(apr_table_get(r->headers_in, "OIDC_CLAIM_name"), "G\u00DCnther");
117+
ck_assert_str_eq(apr_table_get(r->headers_in, "OIDC_CLAIM_dagger"), "D\u2020gÿger");
118+
ck_assert_str_eq(apr_table_get(r->headers_in, "OIDC_CLAIM_anarr"), "0,hans,piet,1");
119+
ck_assert_str_eq(apr_table_get(r->headers_in, "OIDC_CLAIM_names"), "hans,piet");
120+
ck_assert_str_eq(apr_table_get(r->headers_in, "OIDC_CLAIM_abool"), "1");
121+
ck_assert_str_eq(apr_table_get(r->headers_in, "OIDC_CLAIM_anint"), "5");
122+
ck_assert_str_eq(apr_table_get(r->headers_in, "OIDC_CLAIM_lint"), "111111111111111");
123+
ck_assert_str_eq(apr_table_get(r->headers_in, "OIDC_CLAIM_areal"), "1.5");
124+
ck_assert_str_eq(apr_table_get(r->headers_in, "OIDC_CLAIM_anobj"), "{\"hans\":\"piet\",\"abool\":false}");
125+
126+
ck_assert_ptr_null(apr_table_get(r->headers_in, "OIDC_CLAIM_anull"));
127+
ck_assert_ptr_null(apr_table_get(r->subprocess_env, "OIDC_CLAIM_names"));
128+
129+
oidc_util_appinfo_set_all(r, claims, "MYPREFIX_", "#", OIDC_APPINFO_PASS_HEADERS | OIDC_APPINFO_PASS_ENVVARS,
130+
OIDC_APPINFO_ENCODING_NONE);
131+
ck_assert_str_eq(apr_table_get(r->headers_in, "MYPREFIX_simple"), "hans");
132+
ck_assert_str_eq(apr_table_get(r->headers_in, "MYPREFIX_name"), "G\u00DCnther");
133+
ck_assert_str_eq(apr_table_get(r->headers_in, "MYPREFIX_dagger"), "D\u2020gÿger");
134+
ck_assert_str_eq(apr_table_get(r->headers_in, "MYPREFIX_anarr"), "0#hans#piet#1");
135+
136+
ck_assert_ptr_null(apr_table_get(r->subprocess_env, "OIDC_CLAIM_names"));
137+
ck_assert_str_eq(apr_table_get(r->subprocess_env, "MYPREFIX_anarr"), "0#hans#piet#1");
138+
139+
oidc_util_appinfo_set_all(r, claims, "OIDC_CLAIM_", ",", OIDC_APPINFO_PASS_HEADERS,
140+
OIDC_APPINFO_ENCODING_BASE64URL);
141+
ck_assert_str_eq(apr_table_get(r->headers_in, "OIDC_CLAIM_simple"), "aGFucw");
142+
ck_assert_str_eq(apr_table_get(r->headers_in, "OIDC_CLAIM_name"), "R8OcbnRoZXI");
143+
ck_assert_str_eq(apr_table_get(r->headers_in, "OIDC_CLAIM_dagger"), "ROKAoGfDv2dlcg");
144+
ck_assert_str_eq(apr_table_get(r->headers_in, "OIDC_CLAIM_anarr"), "MCxoYW5zLHBpZXQsMQ");
145+
146+
oidc_util_appinfo_set_all(r, claims, "OIDC_CLAIM_", ",", OIDC_APPINFO_PASS_HEADERS,
147+
OIDC_APPINFO_ENCODING_LATIN1);
148+
ck_assert_str_eq(apr_table_get(r->headers_in, "OIDC_CLAIM_simple"), "hans");
149+
ck_assert_str_eq(apr_table_get(r->headers_in, "OIDC_CLAIM_name"), "G\xDCnther");
150+
ck_assert_str_eq(apr_table_get(r->headers_in, "OIDC_CLAIM_dagger"), "D?g\xFFger");
151+
152+
json_decref(claims);
153+
}
154+
END_TEST
155+
90156
int main(void) {
91157
TCase *core = tcase_create("base64");
92158
tcase_add_checked_fixture(core, oidc_test_setup, oidc_test_teardown);
@@ -95,7 +161,9 @@ int main(void) {
95161
tcase_add_test(core, test_util_base64_decode);
96162
tcase_add_test(core, test_util_base64url_decode);
97163

98-
Suite *s = suite_create("metadata");
164+
tcase_add_test(core, test_util_appinfo_set);
165+
166+
Suite *s = suite_create("util");
99167
suite_add_tcase(s, core);
100168

101169
return oidc_test_suite_run(s);

0 commit comments

Comments
 (0)