150 lines
4.8 KiB
Diff
150 lines
4.8 KiB
Diff
From 93b81054d4d1ece64a6799cc50a65b0daeabf4d1 Mon Sep 17 00:00:00 2001
|
|
From: AIMOTO NORIHITO <aimoto@osstech.co.jp>
|
|
Date: Mon, 28 Jun 2021 13:05:52 +0900
|
|
Subject: [PATCH 3/3] Add a function to escape Javascript characters
|
|
|
|
---
|
|
src/mod_auth_openidc.c | 6 ++--
|
|
src/mod_auth_openidc.h | 1 +
|
|
src/util.c | 81 ++++++++++++++++++++++++++++++++++++++++++
|
|
3 files changed, 85 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/src/mod_auth_openidc.c b/src/mod_auth_openidc.c
|
|
index ea84e5e..37743b3 100644
|
|
--- a/src/mod_auth_openidc.c
|
|
+++ b/src/mod_auth_openidc.c
|
|
@@ -474,7 +474,7 @@ apr_byte_t oidc_post_preserve_javascript(request_rec *r, const char *location,
|
|
" </script>\n", jmethod, json,
|
|
location ?
|
|
apr_psprintf(r->pool, "window.location='%s';\n",
|
|
- location) :
|
|
+ oidc_util_javascript_escape(r->pool, location)) :
|
|
"");
|
|
if (location == NULL) {
|
|
if (javascript_method)
|
|
@@ -522,7 +522,7 @@ static int oidc_request_post_preserved_restore(request_rec *r,
|
|
" document.forms[0].action = \"%s\";\n"
|
|
" document.forms[0].submit();\n"
|
|
" }\n"
|
|
- " </script>\n", method, original_url);
|
|
+ " </script>\n", method, oidc_util_javascript_escape(r->pool, original_url));
|
|
|
|
const char *body = " <p>Restoring...</p>\n"
|
|
" <form method=\"post\"></form>\n";
|
|
@@ -1626,7 +1626,7 @@ static int oidc_session_redirect_parent_window_to_logout(request_rec *r,
|
|
char *java_script = apr_psprintf(r->pool,
|
|
" <script type=\"text/javascript\">\n"
|
|
" window.top.location.href = '%s?session=logout';\n"
|
|
- " </script>\n", oidc_get_redirect_uri(r, c));
|
|
+ " </script>\n", oidc_util_javascript_escape(r->pool, oidc_get_redirect_uri(r, c)));
|
|
|
|
return oidc_util_html_send(r, "Redirecting...", java_script, NULL, NULL,
|
|
DONE);
|
|
diff --git a/src/mod_auth_openidc.h b/src/mod_auth_openidc.h
|
|
index ea79e6b..b88937a 100644
|
|
--- a/src/mod_auth_openidc.h
|
|
+++ b/src/mod_auth_openidc.h
|
|
@@ -747,6 +747,7 @@ apr_byte_t oidc_json_object_get_string(apr_pool_t *pool, json_t *json, const cha
|
|
apr_byte_t oidc_json_object_get_int(apr_pool_t *pool, json_t *json, const char *name, int *value, const int default_value);
|
|
apr_byte_t oidc_json_object_get_bool(apr_pool_t *pool, json_t *json, const char *name, int *value, const int default_value);
|
|
char *oidc_util_html_escape(apr_pool_t *pool, const char *input);
|
|
+char *oidc_util_javascript_escape(apr_pool_t *pool, const char *input);
|
|
void oidc_util_table_add_query_encoded_params(apr_pool_t *pool, apr_table_t *table, const char *params);
|
|
apr_hash_t * oidc_util_merge_key_sets(apr_pool_t *pool, apr_hash_t *k1, apr_hash_t *k2);
|
|
apr_byte_t oidc_util_regexp_substitute(apr_pool_t *pool, const char *input, const char *regexp, const char *replace, char **output, char **error_str);
|
|
diff --git a/src/util.c b/src/util.c
|
|
index 4b4e16b..f98c824 100644
|
|
--- a/src/util.c
|
|
+++ b/src/util.c
|
|
@@ -369,6 +369,87 @@ char *oidc_util_html_escape(apr_pool_t *pool, const char *s) {
|
|
return apr_pstrdup(pool, r);
|
|
}
|
|
|
|
+/*
|
|
+ * JavaScript escape a string
|
|
+ */
|
|
+char* oidc_util_javascript_escape(apr_pool_t *pool, const char *s) {
|
|
+ const char *cp;
|
|
+ char *output;
|
|
+ size_t outputlen;
|
|
+ int i;
|
|
+
|
|
+ if (s == NULL) {
|
|
+ return NULL;
|
|
+ }
|
|
+
|
|
+ outputlen = 0;
|
|
+ for (cp = s; *cp; cp++) {
|
|
+ switch (*cp) {
|
|
+ case '\'':
|
|
+ case '"':
|
|
+ case '\\':
|
|
+ case '/':
|
|
+ case 0x0D:
|
|
+ case 0x0A:
|
|
+ outputlen += 2;
|
|
+ break;
|
|
+ case '<':
|
|
+ case '>':
|
|
+ outputlen += 4;
|
|
+ break;
|
|
+ default:
|
|
+ outputlen += 1;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ i = 0;
|
|
+ output = apr_palloc(pool, outputlen + 1);
|
|
+ for (cp = s; *cp; cp++) {
|
|
+ switch (*cp) {
|
|
+ case '\'':
|
|
+ (void)strcpy(&output[i], "\\'");
|
|
+ i += 2;
|
|
+ break;
|
|
+ case '"':
|
|
+ (void)strcpy(&output[i], "\\\"");
|
|
+ i += 2;
|
|
+ break;
|
|
+ case '\\':
|
|
+ (void)strcpy(&output[i], "\\\\");
|
|
+ i += 2;
|
|
+ break;
|
|
+ case '/':
|
|
+ (void)strcpy(&output[i], "\\/");
|
|
+ i += 2;
|
|
+ break;
|
|
+ case 0x0D:
|
|
+ (void)strcpy(&output[i], "\\r");
|
|
+ i += 2;
|
|
+ break;
|
|
+ case 0x0A:
|
|
+ (void)strcpy(&output[i], "\\n");
|
|
+ i += 2;
|
|
+ break;
|
|
+ case '<':
|
|
+ (void)strcpy(&output[i], "\\x3c");
|
|
+ i += 4;
|
|
+ break;
|
|
+ case '>':
|
|
+ (void)strcpy(&output[i], "\\x3e");
|
|
+ i += 4;
|
|
+ break;
|
|
+ default:
|
|
+ output[i] = *cp;
|
|
+ i += 1;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ output[i] = '\0';
|
|
+ return output;
|
|
+}
|
|
+
|
|
+
|
|
/*
|
|
* get the URL scheme that is currently being accessed
|
|
*/
|
|
--
|
|
2.27.0
|
|
|