Skip to content

Commit 058b72f

Browse files
authored
fix(email): prevent organization invite autolinks (#4088)
* fix(email): prevent organization invite autolinks * fix(orgs): restrict organization name characters * fix(orgs): allow existing organization name formats * test(orgs): remove unrelated invite autolink assertion * fix(email): simplify autolink neutralization
1 parent c7ebbe6 commit 058b72f

2 files changed

Lines changed: 18 additions & 1 deletion

File tree

apps/web/src/lib/email.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { renderNonAutolinkedText } from '@/lib/email';
2+
3+
describe('email rendering helpers', () => {
4+
it('escapes HTML while neutralizing URL autolinking', () => {
5+
const rendered = renderNonAutolinkedText(
6+
'<b>https://evil.example</b> www.bad.example acme.com'
7+
);
8+
9+
expect(rendered.html).toBe(
10+
'&lt;b&gt;https:/&#8203;/&#8203;evil.&#8203;example&lt;/&#8203;b&gt; www.&#8203;bad.&#8203;example acme.&#8203;com'
11+
);
12+
});
13+
});

apps/web/src/lib/email.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ export class RawHtml {
7979

8080
type TemplateVars = Record<string, string | RawHtml>;
8181

82+
export function renderNonAutolinkedText(str: string): RawHtml {
83+
return new RawHtml(escapeHtml(str).replace(/[/.]/g, '$&&#8203;'));
84+
}
85+
8286
export function renderTemplate(name: string, vars: TemplateVars): string {
8387
const templatePath = path.join(process.cwd(), 'src', 'emails', `${name}.html`);
8488
const html = fs.readFileSync(templatePath, 'utf-8');
@@ -203,7 +207,7 @@ export async function sendOrganizationInviteEmail(
203207
to: data.to,
204208
templateName: 'orgInvitation',
205209
templateVars: {
206-
organization_name: data.organizationName,
210+
organization_name: renderNonAutolinkedText(data.organizationName),
207211
inviter_name: data.inviterName,
208212
accept_invite_url: data.acceptInviteUrl,
209213
},

0 commit comments

Comments
 (0)