From 359bbbe617d679b9677174753700b2fe043ea982 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Fri, 17 Jan 2025 11:26:28 +0100 Subject: [PATCH] FIX: relative links in the insert hyperlink modal (#30842) When trying to insert schemaless or relative links using the "insert hyperlink modal" in the composer, the resulting link would be wrongly prefixed with "https://" --- .../javascripts/discourse/app/lib/url.js | 18 +++++++++++++++--- .../discourse/tests/unit/lib/url-test.js | 9 +++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/app/lib/url.js b/app/assets/javascripts/discourse/app/lib/url.js index be9e058e7bb..452ea699235 100644 --- a/app/assets/javascripts/discourse/app/lib/url.js +++ b/app/assets/javascripts/discourse/app/lib/url.js @@ -483,9 +483,21 @@ export function setURLContainer(container) { } export function prefixProtocol(url) { - return !url.includes("://") && !url.startsWith("mailto:") - ? "https://" + url - : url; + if (!url || typeof url !== "string") { + return url; + } + + url = url.trim(); + + if (url.startsWith("//")) { + return `https:${url}`; + } + + if (url.startsWith("/") || url.includes("://") || url.startsWith("mailto:")) { + return url; + } + + return `https://${url}`; } export function getCategoryAndTagUrl(category, subcategories, tag) { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/url-test.js b/app/assets/javascripts/discourse/tests/unit/lib/url-test.js index 87bf991e732..ef3056cb4d9 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/url-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/url-test.js @@ -184,6 +184,15 @@ module("Unit | Utility | url", function (hooks) { prefixProtocol("www.discourse.org/mailto:foo"), "https://www.discourse.org/mailto:foo" ); + assert.strictEqual( + prefixProtocol("http://www.discourse.org"), + "http://www.discourse.org" + ); + assert.strictEqual( + prefixProtocol("ftp://www.discourse.org"), + "ftp://www.discourse.org" + ); + assert.strictEqual(prefixProtocol("/my/preferences"), "/my/preferences"); }); test("getCategoryAndTagUrl", function (assert) {