This commit renames all secure_media related settings to secure_uploads_* along with the associated functionality. This is being done because "media" does not really cover it, we aren't just doing this for images and videos etc. but for all uploads in the site. Additionally, in future we want to secure more types of uploads, and enable a kind of "mixed mode" where some uploads are secure and some are not, so keeping media in the name is just confusing. This also keeps compatibility with the `secure-media-uploads` path, and changes new secure URLs to be `secure-uploads`. Deprecated settings: * secure_media -> secure_uploads * secure_media_allow_embed_images_in_emails -> secure_uploads_allow_embed_images_in_emails * secure_media_max_email_embed_image_size_kb -> secure_uploads_max_email_embed_image_size_kb
164 lines
4.7 KiB
JavaScript
164 lines
4.7 KiB
JavaScript
import DiscourseURL, {
|
|
getCategoryAndTagUrl,
|
|
prefixProtocol,
|
|
userPath,
|
|
} from "discourse/lib/url";
|
|
import { module, test } from "qunit";
|
|
import User from "discourse/models/user";
|
|
import { logIn } from "discourse/tests/helpers/qunit-helpers";
|
|
import { setPrefix } from "discourse-common/lib/get-url";
|
|
import sinon from "sinon";
|
|
|
|
module("Unit | Utility | url", function () {
|
|
test("isInternal with a HTTP url", function (assert) {
|
|
sinon.stub(DiscourseURL, "origin").returns("http://eviltrout.com");
|
|
|
|
assert.notOk(DiscourseURL.isInternal(null), "a blank URL is not internal");
|
|
assert.ok(DiscourseURL.isInternal("/test"), "relative URLs are internal");
|
|
assert.ok(
|
|
DiscourseURL.isInternal("//eviltrout.com"),
|
|
"a url on the same host is internal (protocol-less)"
|
|
);
|
|
assert.ok(
|
|
DiscourseURL.isInternal("http://eviltrout.com/tophat"),
|
|
"a url on the same host is internal"
|
|
);
|
|
assert.ok(
|
|
DiscourseURL.isInternal("https://eviltrout.com/moustache"),
|
|
"a url on a HTTPS of the same host is internal"
|
|
);
|
|
assert.notOk(
|
|
DiscourseURL.isInternal("//twitter.com.com"),
|
|
"a different host is not internal (protocol-less)"
|
|
);
|
|
assert.notOk(
|
|
DiscourseURL.isInternal("http://twitter.com"),
|
|
"a different host is not internal"
|
|
);
|
|
});
|
|
|
|
test("isInternal with a HTTPS url", function (assert) {
|
|
sinon.stub(DiscourseURL, "origin").returns("https://eviltrout.com");
|
|
assert.ok(
|
|
DiscourseURL.isInternal("http://eviltrout.com/monocle"),
|
|
"HTTPS urls match HTTP urls"
|
|
);
|
|
});
|
|
|
|
test("isInternal on subfolder install", function (assert) {
|
|
sinon.stub(DiscourseURL, "origin").returns("http://eviltrout.com/forum");
|
|
assert.notOk(
|
|
DiscourseURL.isInternal("http://eviltrout.com"),
|
|
"the host root is not internal"
|
|
);
|
|
assert.notOk(
|
|
DiscourseURL.isInternal("http://eviltrout.com/tophat"),
|
|
"a url on the same host but on a different folder is not internal"
|
|
);
|
|
assert.ok(
|
|
DiscourseURL.isInternal("http://eviltrout.com/forum/moustache"),
|
|
"a url on the same host and on the same folder is internal"
|
|
);
|
|
});
|
|
|
|
test("userPath", function (assert) {
|
|
assert.strictEqual(userPath(), "/u");
|
|
assert.strictEqual(userPath("eviltrout"), "/u/eviltrout");
|
|
});
|
|
|
|
test("userPath with prefix", function (assert) {
|
|
setPrefix("/forum");
|
|
assert.strictEqual(userPath(), "/forum/u");
|
|
assert.strictEqual(userPath("eviltrout"), "/forum/u/eviltrout");
|
|
});
|
|
|
|
test("routeTo with prefix", async function (assert) {
|
|
setPrefix("/forum");
|
|
logIn();
|
|
const user = User.current();
|
|
|
|
sinon.stub(DiscourseURL, "router").get(() => {
|
|
return {
|
|
currentURL: "/forum",
|
|
};
|
|
});
|
|
sinon.stub(DiscourseURL, "handleURL");
|
|
DiscourseURL.routeTo("/my/messages");
|
|
assert.ok(
|
|
DiscourseURL.handleURL.calledWith(`/u/${user.username}/messages`),
|
|
"it should navigate to the messages page"
|
|
);
|
|
});
|
|
|
|
test("prefixProtocol", async function (assert) {
|
|
assert.strictEqual(
|
|
prefixProtocol("mailto:mr-beaver@aol.com"),
|
|
"mailto:mr-beaver@aol.com"
|
|
);
|
|
assert.strictEqual(
|
|
prefixProtocol("discourse.org"),
|
|
"https://discourse.org"
|
|
);
|
|
assert.strictEqual(
|
|
prefixProtocol("www.discourse.org"),
|
|
"https://www.discourse.org"
|
|
);
|
|
assert.strictEqual(
|
|
prefixProtocol("www.discourse.org/mailto:foo"),
|
|
"https://www.discourse.org/mailto:foo"
|
|
);
|
|
});
|
|
|
|
test("getCategoryAndTagUrl", function (assert) {
|
|
assert.strictEqual(
|
|
getCategoryAndTagUrl(
|
|
{ path: "/c/foo/1", default_list_filter: "all" },
|
|
true
|
|
),
|
|
"/c/foo/1"
|
|
);
|
|
|
|
assert.strictEqual(
|
|
getCategoryAndTagUrl(
|
|
{ path: "/c/foo/1", default_list_filter: "all" },
|
|
false
|
|
),
|
|
"/c/foo/1/none"
|
|
);
|
|
|
|
assert.strictEqual(
|
|
getCategoryAndTagUrl(
|
|
{ path: "/c/foo/1", default_list_filter: "none" },
|
|
true
|
|
),
|
|
"/c/foo/1/all"
|
|
);
|
|
|
|
assert.strictEqual(
|
|
getCategoryAndTagUrl(
|
|
{ path: "/c/foo/1", default_list_filter: "none" },
|
|
false
|
|
),
|
|
"/c/foo/1"
|
|
);
|
|
});
|
|
|
|
test("routeTo redirects secure uploads URLS because they are server side only", async function (assert) {
|
|
sinon.stub(DiscourseURL, "redirectTo");
|
|
sinon.stub(DiscourseURL, "handleURL");
|
|
DiscourseURL.routeTo("/secure-uploads/original/1X/test.pdf");
|
|
assert.ok(
|
|
DiscourseURL.redirectTo.calledWith("/secure-uploads/original/1X/test.pdf")
|
|
);
|
|
});
|
|
|
|
test("anchor handling", async function (assert) {
|
|
sinon.stub(DiscourseURL, "jumpToElement");
|
|
DiscourseURL.routeTo("#heading1");
|
|
assert.ok(
|
|
DiscourseURL.jumpToElement.calledWith("heading1"),
|
|
"in-page anchors call jumpToElement"
|
|
);
|
|
});
|
|
});
|