diff --git a/cmd/admin/static/js/query.js b/cmd/admin/static/js/query.js index b09ebfca..a0d00ad2 100644 --- a/cmd/admin/static/js/query.js +++ b/cmd/admin/static/js/query.js @@ -117,9 +117,23 @@ function confirmDeleteSavedQueries(_names, _url) { $("#confirmModal").modal(); } -function queryResultLink(link, query, url) { - var external_link = ''; - return '' + query + " - " + external_link + " "; +function escapeHTML(value) { + return String(value).replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); +} + +function safeHref(href) { + const s = String(href || "").trim(); + const lower = s.toLowerCase(); + // Allow relative URLs (path, hash, or query only) + if (s.startsWith("/") || s.startsWith("#") || s.startsWith("?")) { + return s; + } + // Allow only http and https absolute URLs + if (lower.startsWith("http://") || lower.startsWith("https://")) { + return s; + } + // Fallback for disallowed or empty URLs + return "#"; } function toggleSaveQuery() { diff --git a/cmd/admin/templates/queries.html b/cmd/admin/templates/queries.html index 3708d5e5..67c5237a 100644 --- a/cmd/admin/templates/queries.html +++ b/cmd/admin/templates/queries.html @@ -1,4 +1,4 @@ - + {{ $metadata := .Metadata }} {{ $leftmeta := .LeftMetadata }} {{ template "page-head" . }} @@ -13,9 +13,11 @@
- On-demand queries in {{ $leftmeta.EnvName }} + + On-demand queries in + {{ $leftmeta.EnvName }}
-
@@ -110,13 +112,24 @@ width: '40%', data: 'query', render: function (data, type, row, meta) { - if (type === 'display') { - return '
' + - queryResultLink(data.link, data.query, "/query/{{ $leftmeta.EnvUUID }}/logs/" + data.name) + - '
'; - } else { - return data; + if (type !== "display") { + return data && data.query ? data.query : ""; } + const logUrl = "/query/{{ $leftmeta.EnvUUID }}/logs/" + encodeURIComponent(String(data.name || "")); + const wrapper = $("
", { + style: "max-width:400px; white-space:normal; word-break:break-word;" + }); + const queryLink = $("", { + href: safeHref(logUrl), + text: String(data.query || "") + }); + const externalLink = $("", { + href: safeHref(data.link), + target: "_blank", + rel: "noopener noreferrer" + }).append($("", { class: "fas fa-external-link-alt" })); + wrapper.append($("", { class: "query-link" }).append(queryLink).append(" - ").append(externalLink)); + return wrapper.prop("outerHTML"); } },{ targets: 2,