From d8e59a32eed15808ab3179cd480ea33b926881eb Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Tue, 6 Feb 2024 21:27:24 -0500 Subject: [PATCH] fix: Relative links in document HTML should become absolute in emailed snippets closes #6480 --- .../templates/DocumentPublishedOrUpdatedEmail.tsx | 1 + server/models/helpers/DocumentHelper.tsx | 3 +++ server/models/helpers/ProsemirrorHelper.tsx | 12 ++++++++++++ 3 files changed, 16 insertions(+) diff --git a/server/emails/templates/DocumentPublishedOrUpdatedEmail.tsx b/server/emails/templates/DocumentPublishedOrUpdatedEmail.tsx index ce215a1b1..9578f3b64 100644 --- a/server/emails/templates/DocumentPublishedOrUpdatedEmail.tsx +++ b/server/emails/templates/DocumentPublishedOrUpdatedEmail.tsx @@ -69,6 +69,7 @@ export default class DocumentPublishedOrUpdatedEmail extends BaseEmail< includeTitle: false, centered: false, signedUrls: (4 * Day) / 1000, + baseUrl: props.teamUrl, }); // inline all css so that it works in as many email providers as possible. diff --git a/server/models/helpers/DocumentHelper.tsx b/server/models/helpers/DocumentHelper.tsx index 38e159086..21153f862 100644 --- a/server/models/helpers/DocumentHelper.tsx +++ b/server/models/helpers/DocumentHelper.tsx @@ -30,6 +30,8 @@ type HTMLOptions = { * number then the urls will be signed for that many seconds. (defaults to false) */ signedUrls?: boolean | number; + /** The base URL to use for relative links */ + baseUrl?: string; }; @trace() @@ -111,6 +113,7 @@ export default class DocumentHelper { includeStyles: options?.includeStyles, includeMermaid: options?.includeMermaid, centered: options?.centered, + baseUrl: options?.baseUrl, }); addTags({ diff --git a/server/models/helpers/ProsemirrorHelper.tsx b/server/models/helpers/ProsemirrorHelper.tsx index 57437d102..e1f3895a7 100644 --- a/server/models/helpers/ProsemirrorHelper.tsx +++ b/server/models/helpers/ProsemirrorHelper.tsx @@ -23,6 +23,8 @@ export type HTMLOptions = { includeMermaid?: boolean; /** Whether to include styles to center diff (defaults to true) */ centered?: boolean; + /** The base URL to use for relative links */ + baseUrl?: string; }; type MentionAttrs = { @@ -217,6 +219,16 @@ export default class ProsemirrorHelper { target ); + // Convert relative urls to absolute + if (options?.baseUrl) { + const elements = doc.querySelectorAll("a[href]"); + for (const el of elements) { + if ("href" in el && (el.href as string).startsWith("/")) { + el.href = new URL(el.href as string, options.baseUrl).toString(); + } + } + } + // Inject mermaidjs scripts if the document contains mermaid diagrams if (options?.includeMermaid) { const mermaidElements = dom.window.document.querySelectorAll(