From 529686620a0a0dc952d584ea9b66e8caa415c724 Mon Sep 17 00:00:00 2001 From: Timo K Date: Mon, 17 Jan 2022 15:36:32 +0100 Subject: [PATCH 01/10] make pill @ and matrix.to links behave the same --- src/HtmlUtils.tsx | 4 ++-- src/components/views/elements/Pill.js | 4 ++-- src/linkify-matrix.ts | 3 +++ src/utils/permalinks/Permalinks.ts | 3 +++ src/utils/pillify.tsx | 4 ++-- 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/HtmlUtils.tsx b/src/HtmlUtils.tsx index 0b94cfd8917..ff658a69950 100644 --- a/src/HtmlUtils.tsx +++ b/src/HtmlUtils.tsx @@ -29,7 +29,7 @@ import { IContent } from 'matrix-js-sdk/src/models/event'; import { _linkifyElement, _linkifyString } from './linkify-matrix'; import { IExtendedSanitizeOptions } from './@types/sanitize-html'; import SettingsStore from './settings/SettingsStore'; -import { tryTransformPermalinkToLocalHref } from "./utils/permalinks/Permalinks"; +import { tryTransformEntityToPermalink } from "./utils/permalinks/Permalinks"; import { getEmojiFromUnicode } from "./emoji"; import ReplyChain from "./components/views/elements/ReplyChain"; import { mediaFromMxc } from "./customisations/Media"; @@ -175,7 +175,7 @@ const transformTags: IExtendedSanitizeOptions["transformTags"] = { // custom to if (attribs.href) { attribs.target = '_blank'; // by default - const transformed = tryTransformPermalinkToLocalHref(attribs.href); + const transformed = tryTransformEntityToPermalink(attribs.href); if (transformed !== attribs.href || attribs.href.match(ELEMENT_URL_PATTERN)) { attribs.href = transformed; delete attribs.target; diff --git a/src/components/views/elements/Pill.js b/src/components/views/elements/Pill.js index 2e99a0c57f2..9bb67840d01 100644 --- a/src/components/views/elements/Pill.js +++ b/src/components/views/elements/Pill.js @@ -24,7 +24,7 @@ import * as sdk from '../../../index'; import dis from '../../../dispatcher/dispatcher'; import { MatrixClientPeg } from '../../../MatrixClientPeg'; import FlairStore from "../../../stores/FlairStore"; -import { getPrimaryPermalinkEntity, parseAppLocalLink } from "../../../utils/permalinks/Permalinks"; +import { getPrimaryPermalinkEntity, parsePermalink } from "../../../utils/permalinks/Permalinks"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import { Action } from "../../../dispatcher/actions"; import { mediaFromMxc } from "../../../customisations/Media"; @@ -85,7 +85,7 @@ class Pill extends React.Component { if (nextProps.url) { if (nextProps.inMessage) { - const parts = parseAppLocalLink(nextProps.url); + const parts = parsePermalink(nextProps.url); resourceId = parts.primaryEntityId; // The room/user ID prefix = parts.sigil; // The first character of prefix } else { diff --git a/src/linkify-matrix.ts b/src/linkify-matrix.ts index bd3e6f3be57..fa932ed0bc1 100644 --- a/src/linkify-matrix.ts +++ b/src/linkify-matrix.ts @@ -107,6 +107,7 @@ function parseFreeformMatrixLinks(linkify, token: MatrixLinkInitialToken, type: } function onUserClick(event: MouseEvent, userId: string) { + event.preventDefault(); const member = new RoomMember(null, userId); if (!member) { return; } dis.dispatch({ @@ -114,6 +115,7 @@ function onUserClick(event: MouseEvent, userId: string) { member: member, }); } + function onAliasClick(event: MouseEvent, roomAlias: string) { event.preventDefault(); dis.dispatch({ @@ -121,6 +123,7 @@ function onAliasClick(event: MouseEvent, roomAlias: string) { room_alias: roomAlias, }); } + function onGroupClick(event: MouseEvent, groupId: string) { event.preventDefault(); dis.dispatch({ action: 'view_group', group_id: groupId }); diff --git a/src/utils/permalinks/Permalinks.ts b/src/utils/permalinks/Permalinks.ts index 3a9200259f6..272e35bd7cb 100644 --- a/src/utils/permalinks/Permalinks.ts +++ b/src/utils/permalinks/Permalinks.ts @@ -331,6 +331,9 @@ export function tryTransformEntityToPermalink(entity: string): string { if (entity[0] === '@') return makeUserPermalink(entity); if (entity[0] === '+') return makeGroupPermalink(entity); + // does not need conversion + return entity; + // Then try and merge it into a permalink return tryTransformPermalinkToLocalHref(entity); } diff --git a/src/utils/pillify.tsx b/src/utils/pillify.tsx index 22240fcda52..396ddd5dbf9 100644 --- a/src/utils/pillify.tsx +++ b/src/utils/pillify.tsx @@ -22,7 +22,7 @@ import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { MatrixClientPeg } from '../MatrixClientPeg'; import SettingsStore from "../settings/SettingsStore"; import Pill from "../components/views/elements/Pill"; -import { parseAppLocalLink } from "./permalinks/Permalinks"; +import { parsePermalink } from "./permalinks/Permalinks"; /** * Recurses depth-first through a DOM tree, converting matrix.to links @@ -46,7 +46,7 @@ export function pillifyLinks(nodes: ArrayLike, mxEvent: MatrixEvent, pi if (node.tagName === "A" && node.getAttribute("href")) { const href = node.getAttribute("href"); - const parts = parseAppLocalLink(href); + const parts = parsePermalink(href); // If the link is a (localised) matrix.to link, replace it with a pill // We don't want to pill event permalinks, so those are ignored. if (parts && !parts.eventId) { From 3985653dc7afb7e44d6b8d6a1e2a2ad330148ca1 Mon Sep 17 00:00:00 2001 From: Timo K Date: Mon, 17 Jan 2022 16:28:33 +0100 Subject: [PATCH 02/10] remove local conversion on permalink conversion --- src/utils/permalinks/Permalinks.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/utils/permalinks/Permalinks.ts b/src/utils/permalinks/Permalinks.ts index 272e35bd7cb..4f3284dca4e 100644 --- a/src/utils/permalinks/Permalinks.ts +++ b/src/utils/permalinks/Permalinks.ts @@ -333,9 +333,6 @@ export function tryTransformEntityToPermalink(entity: string): string { // does not need conversion return entity; - - // Then try and merge it into a permalink - return tryTransformPermalinkToLocalHref(entity); } /** From 80c315a4eefad2802523959b286b278b27422fb2 Mon Sep 17 00:00:00 2001 From: Timo K Date: Tue, 18 Jan 2022 19:40:33 +0100 Subject: [PATCH 03/10] make tryTransformEntityToPermalink doc conforment --- src/utils/permalinks/Permalinks.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/utils/permalinks/Permalinks.ts b/src/utils/permalinks/Permalinks.ts index 4f3284dca4e..1204f263265 100644 --- a/src/utils/permalinks/Permalinks.ts +++ b/src/utils/permalinks/Permalinks.ts @@ -318,21 +318,23 @@ export function isPermalinkHost(host: string): boolean { /** * Transforms an entity (permalink, room alias, user ID, etc) into a local URL - * if possible. If the given entity is not found to be valid enough to be converted - * then a null value will be returned. + * if possible. If the given entity is not found to be valid enough to be + * converted then a null value will be returned. If it is already a permalink + * (matrix.to) it gets returned unchanged. * @param {string} entity The entity to transform. * @returns {string|null} The transformed permalink or null if unable. */ export function tryTransformEntityToPermalink(entity: string): string { if (!entity) return null; - // Check to see if it is a bare entity for starters + // Check if it is a bare entity for starters if (entity[0] === '#' || entity[0] === '!') return makeRoomPermalink(entity); if (entity[0] === '@') return makeUserPermalink(entity); if (entity[0] === '+') return makeGroupPermalink(entity); + // Check if it is already a permalink + if (entity.includes("matrix.to")) return entity; - // does not need conversion - return entity; + return null; } /** From a792eee1ff2d4ba92126eaf3b7d3897ec53eb9ae Mon Sep 17 00:00:00 2001 From: Timo K Date: Tue, 18 Jan 2022 19:53:55 +0100 Subject: [PATCH 04/10] turns tryTransformEntityToPermalink needs to return the link at least that is what is expected by the tests --- src/utils/permalinks/Permalinks.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/utils/permalinks/Permalinks.ts b/src/utils/permalinks/Permalinks.ts index 1204f263265..3ed2efcb62c 100644 --- a/src/utils/permalinks/Permalinks.ts +++ b/src/utils/permalinks/Permalinks.ts @@ -318,9 +318,8 @@ export function isPermalinkHost(host: string): boolean { /** * Transforms an entity (permalink, room alias, user ID, etc) into a local URL - * if possible. If the given entity is not found to be valid enough to be - * converted then a null value will be returned. If it is already a permalink - * (matrix.to) it gets returned unchanged. + * if possible. If it is already a permalink (matrix.to) it gets returned + * unchanged. * @param {string} entity The entity to transform. * @returns {string|null} The transformed permalink or null if unable. */ @@ -331,10 +330,8 @@ export function tryTransformEntityToPermalink(entity: string): string { if (entity[0] === '#' || entity[0] === '!') return makeRoomPermalink(entity); if (entity[0] === '@') return makeUserPermalink(entity); if (entity[0] === '+') return makeGroupPermalink(entity); - // Check if it is already a permalink - if (entity.includes("matrix.to")) return entity; - return null; + return entity; } /** From cbd8b066f1c7a6d694e49846480a03c174318484 Mon Sep 17 00:00:00 2001 From: Timo K Date: Tue, 18 Jan 2022 19:57:15 +0100 Subject: [PATCH 05/10] adapt tests --- test/components/views/messages/TextualBody-test.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/components/views/messages/TextualBody-test.js b/test/components/views/messages/TextualBody-test.js index 9a83a63efe5..fa4bdf70dc1 100644 --- a/test/components/views/messages/TextualBody-test.js +++ b/test/components/views/messages/TextualBody-test.js @@ -245,7 +245,7 @@ describe("", () => { const content = wrapper.find(".mx_EventTile_body"); expect(content.html()).toBe( '' + - 'An event link with text', ); @@ -274,7 +274,8 @@ describe("", () => { const content = wrapper.find(".mx_EventTile_body"); expect(content.html()).toBe( '' + - 'A Date: Tue, 18 Jan 2022 20:12:20 +0100 Subject: [PATCH 06/10] fix tests --- test/components/views/messages/TextualBody-test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/components/views/messages/TextualBody-test.js b/test/components/views/messages/TextualBody-test.js index fa4bdf70dc1..6bfc47e1de4 100644 --- a/test/components/views/messages/TextualBody-test.js +++ b/test/components/views/messages/TextualBody-test.js @@ -245,8 +245,8 @@ describe("", () => { const content = wrapper.find(".mx_EventTile_body"); expect(content.html()).toBe( '' + - 'An event link with text', ); }); @@ -275,7 +275,7 @@ describe("", () => { expect(content.html()).toBe( '' + 'A Date: Tue, 18 Jan 2022 20:12:44 +0100 Subject: [PATCH 07/10] remove (now) unused function --- src/utils/permalinks/Permalinks.ts | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/utils/permalinks/Permalinks.ts b/src/utils/permalinks/Permalinks.ts index 3ed2efcb62c..bcf0ce17b8d 100644 --- a/src/utils/permalinks/Permalinks.ts +++ b/src/utils/permalinks/Permalinks.ts @@ -424,23 +424,6 @@ export function parsePermalink(fullUrl: string): PermalinkParts { return null; // not a permalink we can handle } -/** - * Parses an app local link (`#/(user|room|group)/identifer`) to a Matrix entity - * (room, user, group). Such links are produced by `HtmlUtils` when encountering - * links, which calls `tryTransformPermalinkToLocalHref` in this module. - * @param {string} localLink The app local link - * @returns {PermalinkParts} - */ -export function parseAppLocalLink(localLink: string): PermalinkParts { - try { - const segments = localLink.replace("#/", ""); - return ElementPermalinkConstructor.parseAppRoute(segments); - } catch (e) { - // Ignore failures - } - return null; -} - function getServerName(userId: string): string { return userId.split(":").splice(1).join(":"); } From 13c7aadca022e4410094af5b57238001b105103d Mon Sep 17 00:00:00 2001 From: Timo K Date: Tue, 18 Jan 2022 20:13:15 +0100 Subject: [PATCH 08/10] update target condition --- src/linkify-matrix.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linkify-matrix.ts b/src/linkify-matrix.ts index 65fc325f876..6c7d0fb22d4 100644 --- a/src/linkify-matrix.ts +++ b/src/linkify-matrix.ts @@ -221,7 +221,7 @@ export const options = { target: function(href: string, type: Type | string): string { if (type === Type.URL) { try { - const transformed = tryTransformPermalinkToLocalHref(href); + const transformed = tryTransformEntityToPermalink(href); if (transformed !== href || decodeURIComponent(href).match(ELEMENT_URL_PATTERN)) { return null; } else { From 3479cbb9bbfc85729a4a5b8e7b58497ff8b90467 Mon Sep 17 00:00:00 2001 From: Timo K Date: Tue, 18 Jan 2022 20:33:54 +0100 Subject: [PATCH 09/10] improove target check --- src/HtmlUtils.tsx | 7 +++++-- src/linkify-matrix.ts | 5 ++++- test/components/views/messages/TextualBody-test.js | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/HtmlUtils.tsx b/src/HtmlUtils.tsx index ff658a69950..88018f548c6 100644 --- a/src/HtmlUtils.tsx +++ b/src/HtmlUtils.tsx @@ -26,7 +26,7 @@ import katex from 'katex'; import { AllHtmlEntities } from 'html-entities'; import { IContent } from 'matrix-js-sdk/src/models/event'; -import { _linkifyElement, _linkifyString } from './linkify-matrix'; +import { MATRIXTO_URL_PATTERN, _linkifyElement, _linkifyString } from './linkify-matrix'; import { IExtendedSanitizeOptions } from './@types/sanitize-html'; import SettingsStore from './settings/SettingsStore'; import { tryTransformEntityToPermalink } from "./utils/permalinks/Permalinks"; @@ -176,7 +176,10 @@ const transformTags: IExtendedSanitizeOptions["transformTags"] = { // custom to attribs.target = '_blank'; // by default const transformed = tryTransformEntityToPermalink(attribs.href); - if (transformed !== attribs.href || attribs.href.match(ELEMENT_URL_PATTERN)) { + if (transformed !== attribs.href || // for matrix symbols e.g. @user:server.tdl + attribs.href.match(ELEMENT_URL_PATTERN) || // for https:vector|riot... + attribs.href.match(MATRIXTO_URL_PATTERN) // for matrix.to + ) { attribs.href = transformed; delete attribs.target; } diff --git a/src/linkify-matrix.ts b/src/linkify-matrix.ts index 6c7d0fb22d4..0a8fa85d127 100644 --- a/src/linkify-matrix.ts +++ b/src/linkify-matrix.ts @@ -222,7 +222,10 @@ export const options = { if (type === Type.URL) { try { const transformed = tryTransformEntityToPermalink(href); - if (transformed !== href || decodeURIComponent(href).match(ELEMENT_URL_PATTERN)) { + if (transformed !== href || // for matrix symbols e.g. @user:server.tdl + decodeURIComponent(href).match(ELEMENT_URL_PATTERN) || // for https:vector|riot... + decodeURIComponent(href).match(MATRIXTO_URL_PATTERN) // for matrix.to + ) { return null; } else { return '_blank'; diff --git a/test/components/views/messages/TextualBody-test.js b/test/components/views/messages/TextualBody-test.js index 6bfc47e1de4..48ab8ed2445 100644 --- a/test/components/views/messages/TextualBody-test.js +++ b/test/components/views/messages/TextualBody-test.js @@ -246,7 +246,7 @@ describe("", () => { expect(content.html()).toBe( '' + 'An event link with text', ); }); From 44802a0af8a9505a34bbbb0d03a678f457a9ea55 Mon Sep 17 00:00:00 2001 From: Timo K Date: Tue, 18 Jan 2022 20:42:28 +0100 Subject: [PATCH 10/10] linter (oh we only need the local permalinks for the widgets now) That is doing proper rounting. everytning else is just navigation with the dispatcher --- src/linkify-matrix.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/linkify-matrix.ts b/src/linkify-matrix.ts index 0a8fa85d127..43ef2e380f6 100644 --- a/src/linkify-matrix.ts +++ b/src/linkify-matrix.ts @@ -25,7 +25,6 @@ import { baseUrl } from "./utils/permalinks/SpecPermalinkConstructor"; import { parsePermalink, tryTransformEntityToPermalink, - tryTransformPermalinkToLocalHref, } from "./utils/permalinks/Permalinks"; import dis from './dispatcher/dispatcher'; import { Action } from './dispatcher/actions';