From a97f45d00ea2121660c883b5785dde87e7bd2ae6 Mon Sep 17 00:00:00 2001 From: Elmar Ludwig <elmar.ludwig@uni-osnabrueck.de> Date: Mon, 15 Aug 2022 11:04:05 +0000 Subject: [PATCH] completely replace JS URLHelper implementation, fixes #1395 Closes #1395 Merge request studip/studip!852 --- .../assets/javascripts/lib/url_helper.js | 61 ++++++------------- templates/start/_jstemplates.php | 2 +- 2 files changed, 19 insertions(+), 44 deletions(-) diff --git a/resources/assets/javascripts/lib/url_helper.js b/resources/assets/javascripts/lib/url_helper.js index c6c56605079..0aa08c3539c 100644 --- a/resources/assets/javascripts/lib/url_helper.js +++ b/resources/assets/javascripts/lib/url_helper.js @@ -21,22 +21,6 @@ class URLHelper { this.parameters = parameters; } - /** - * method to extend short URLs like "dispatch.php/profile" to "http://.../dispatch.php/profile" - */ - resolveURL(url) { - if (!_.isString(this.base_url) || url.match(/^[a-zA-Z][a-zA-Z0-9+-.]*:/) !== null || url.charAt(0) === '?') { - //this method cannot do any more: - return url; - } - var base_url = this.base_url; - if (url.charAt(0) === '/') { - var host = this.base_url.match(/^[a-zA-Z][a-zA-Z0-9+-.]*:\/\/[\w:.-]+/); - base_url = host ? host[0] : ''; - } - return base_url + url; - } - /** * returns a readily encoded URL with the mandatory parameters and additionally passed * parameters. @@ -47,40 +31,31 @@ class URLHelper { * @return: url with all necessary and additional parameters, encoded */ getURL(url, param_object, ignore_params) { - var params = _.defaults(param_object || {}, ignore_params ? {} : this.parameters), - tmp, - fragment, - query; + let result; - tmp = url.split('#'); - url = tmp[0]; - fragment = tmp[1]; - - tmp = url.split('?'); - url = tmp[0]; - query = tmp[1] || ''; - - if (url !== '') { - url = this.resolveURL(url); + if (url === '' || url.match(/^[?#]/)) { + result = new URL(url, location.href.replace(/\?.*/, '')); + } else { + result = new URL(url, this.base_url); } - query = decodeURIComponent(query); - // split query string and merge with param_object - _.each((query && query.split('&')) || [], function(e) { - var pair = e.split('='); - if (!(pair[0] in params)) { - params[pair[0]] = pair[1]; - } - }); - if (_.keys(params).length || url === '') { - url += '?' + jQuery.param(params); + if (!ignore_params) { + for (let key in this.parameters) { + if (!result.searchParams.has(key)) { + result.searchParams.set(key, this.parameters[key]); + } + } } - if (fragment) { - url += '#' + fragment; + for (let key in param_object) { + if (param_object[key] !== null) { + result.searchParams.set(key, param_object[key]); + } else { + result.searchParams.delete(key); + } } - return url; + return result.href; } } diff --git a/templates/start/_jstemplates.php b/templates/start/_jstemplates.php index 7bccfe3e3af..740b05a3462 100644 --- a/templates/start/_jstemplates.php +++ b/templates/start/_jstemplates.php @@ -56,7 +56,7 @@ </span> <div class="activity-heading"> <% if (activity.actor.type !== 'anonymous') { %> - <a href="<%- STUDIP.URLHelper.resolveURL('dispatch.php/profile?username=' + activity.actor.details.name.username) %>"> + <a href="<%- STUDIP.URLHelper.getURL('dispatch.php/profile?username=' + activity.actor.details.name.username) %>"> <img src="<%- activity.actor.details.avatar_medium %>" class="activity-avatar"> </a> <% } %> -- GitLab