Handle all permitted url schemes in linkify (#11215)
* Handle all permitted url schemes in linkify * Correctly handle optional slash protocols * Iteratepull/28217/head
parent
58710d129d
commit
186497a67d
|
@ -42,6 +42,7 @@ import { tryTransformPermalinkToLocalHref } from "./utils/permalinks/Permalinks"
|
||||||
import { getEmojiFromUnicode } from "./emoji";
|
import { getEmojiFromUnicode } from "./emoji";
|
||||||
import { mediaFromMxc } from "./customisations/Media";
|
import { mediaFromMxc } from "./customisations/Media";
|
||||||
import { stripHTMLReply, stripPlainReply } from "./utils/Reply";
|
import { stripHTMLReply, stripPlainReply } from "./utils/Reply";
|
||||||
|
import { PERMITTED_URL_SCHEMES } from "./utils/UrlUtils";
|
||||||
|
|
||||||
// Anything outside the basic multilingual plane will be a surrogate pair
|
// Anything outside the basic multilingual plane will be a surrogate pair
|
||||||
const SURROGATE_PAIR_PATTERN = /([\ud800-\udbff])([\udc00-\udfff])/;
|
const SURROGATE_PAIR_PATTERN = /([\ud800-\udbff])([\udc00-\udfff])/;
|
||||||
|
@ -58,34 +59,6 @@ const BIGEMOJI_REGEX = new RegExp(`^(${EMOJIBASE_REGEX.source})+$`, "i");
|
||||||
|
|
||||||
const COLOR_REGEX = /^#[0-9a-fA-F]{6}$/;
|
const COLOR_REGEX = /^#[0-9a-fA-F]{6}$/;
|
||||||
|
|
||||||
export const PERMITTED_URL_SCHEMES = [
|
|
||||||
"bitcoin",
|
|
||||||
"ftp",
|
|
||||||
"geo",
|
|
||||||
"http",
|
|
||||||
"https",
|
|
||||||
"im",
|
|
||||||
"irc",
|
|
||||||
"ircs",
|
|
||||||
"magnet",
|
|
||||||
"mailto",
|
|
||||||
"matrix",
|
|
||||||
"mms",
|
|
||||||
"news",
|
|
||||||
"nntp",
|
|
||||||
"openpgp4fpr",
|
|
||||||
"sip",
|
|
||||||
"sftp",
|
|
||||||
"sms",
|
|
||||||
"smsto",
|
|
||||||
"ssh",
|
|
||||||
"tel",
|
|
||||||
"urn",
|
|
||||||
"webcal",
|
|
||||||
"wtai",
|
|
||||||
"xmpp",
|
|
||||||
];
|
|
||||||
|
|
||||||
const MEDIA_API_MXC_REGEX = /\/_matrix\/media\/r0\/(?:download|thumbnail)\/(.+?)\/(.+?)(?:[?/]|$)/;
|
const MEDIA_API_MXC_REGEX = /\/_matrix\/media\/r0\/(?:download|thumbnail)\/(.+?)\/(.+?)(?:[?/]|$)/;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -31,6 +31,7 @@ import { Action } from "./dispatcher/actions";
|
||||||
import { ViewUserPayload } from "./dispatcher/payloads/ViewUserPayload";
|
import { ViewUserPayload } from "./dispatcher/payloads/ViewUserPayload";
|
||||||
import { ViewRoomPayload } from "./dispatcher/payloads/ViewRoomPayload";
|
import { ViewRoomPayload } from "./dispatcher/payloads/ViewRoomPayload";
|
||||||
import { MatrixClientPeg } from "./MatrixClientPeg";
|
import { MatrixClientPeg } from "./MatrixClientPeg";
|
||||||
|
import { PERMITTED_URL_SCHEMES } from "./utils/UrlUtils";
|
||||||
|
|
||||||
export enum Type {
|
export enum Type {
|
||||||
URL = "url",
|
URL = "url",
|
||||||
|
@ -242,7 +243,32 @@ registerPlugin(Type.UserId, ({ scanner, parser }) => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
registerCustomProtocol("matrix", true);
|
// Linkify supports some common protocols but not others, register all permitted url schemes if unsupported
|
||||||
|
// https://github.com/Hypercontext/linkifyjs/blob/f4fad9df1870259622992bbfba38bfe3d0515609/packages/linkifyjs/src/scanner.js#L133-L141
|
||||||
|
// This also handles registering the `matrix:` protocol scheme
|
||||||
|
const linkifySupportedProtocols = ["file", "mailto", "http", "https", "ftp", "ftps"];
|
||||||
|
const optionalSlashProtocols = [
|
||||||
|
"bitcoin",
|
||||||
|
"geo",
|
||||||
|
"im",
|
||||||
|
"magnet",
|
||||||
|
"mailto",
|
||||||
|
"matrix",
|
||||||
|
"news",
|
||||||
|
"openpgp4fpr",
|
||||||
|
"sip",
|
||||||
|
"sms",
|
||||||
|
"smsto",
|
||||||
|
"tel",
|
||||||
|
"urn",
|
||||||
|
"xmpp",
|
||||||
|
];
|
||||||
|
|
||||||
|
PERMITTED_URL_SCHEMES.forEach((scheme) => {
|
||||||
|
if (!linkifySupportedProtocols.includes(scheme)) {
|
||||||
|
registerCustomProtocol(scheme, optionalSlashProtocols.includes(scheme));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
export const linkify = linkifyjs;
|
export const linkify = linkifyjs;
|
||||||
export const _linkifyElement = linkifyElement;
|
export const _linkifyElement = linkifyElement;
|
||||||
|
|
|
@ -24,7 +24,7 @@ import { M_BEACON_INFO } from "matrix-js-sdk/src/@types/beacon";
|
||||||
import { M_POLL_END, M_POLL_START } from "matrix-js-sdk/src/@types/polls";
|
import { M_POLL_END, M_POLL_START } from "matrix-js-sdk/src/@types/polls";
|
||||||
import { PollStartEvent } from "matrix-js-sdk/src/extensible_events_v1/PollStartEvent";
|
import { PollStartEvent } from "matrix-js-sdk/src/extensible_events_v1/PollStartEvent";
|
||||||
|
|
||||||
import { PERMITTED_URL_SCHEMES } from "../HtmlUtils";
|
import { PERMITTED_URL_SCHEMES } from "./UrlUtils";
|
||||||
import { makeUserPermalink, RoomPermalinkCreator } from "./permalinks/Permalinks";
|
import { makeUserPermalink, RoomPermalinkCreator } from "./permalinks/Permalinks";
|
||||||
import { isSelfLocation } from "./location";
|
import { isSelfLocation } from "./location";
|
||||||
|
|
||||||
|
|
|
@ -57,3 +57,31 @@ export function parseUrl(u: string): URL {
|
||||||
}
|
}
|
||||||
return new URL(u);
|
return new URL(u);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const PERMITTED_URL_SCHEMES = [
|
||||||
|
"bitcoin",
|
||||||
|
"ftp",
|
||||||
|
"geo",
|
||||||
|
"http",
|
||||||
|
"https",
|
||||||
|
"im",
|
||||||
|
"irc",
|
||||||
|
"ircs",
|
||||||
|
"magnet",
|
||||||
|
"mailto",
|
||||||
|
"matrix",
|
||||||
|
"mms",
|
||||||
|
"news",
|
||||||
|
"nntp",
|
||||||
|
"openpgp4fpr",
|
||||||
|
"sip",
|
||||||
|
"sftp",
|
||||||
|
"sms",
|
||||||
|
"smsto",
|
||||||
|
"ssh",
|
||||||
|
"tel",
|
||||||
|
"urn",
|
||||||
|
"webcal",
|
||||||
|
"wtai",
|
||||||
|
"xmpp",
|
||||||
|
];
|
||||||
|
|
Loading…
Reference in New Issue