@admin-layout/tailwind-chat-pro 12.2.5-alpha.20 → 12.2.5-alpha.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/lib/components/messages-container-ui/ModernMessageGroup.d.ts.map +1 -1
- package/lib/components/messages-container-ui/ModernMessageGroup.js +10 -44
- package/lib/components/messages-container-ui/ModernMessageGroup.js.map +1 -1
- package/lib/components/messages-container-ui/sanitizeChatHtml.d.ts +2 -0
- package/lib/components/messages-container-ui/sanitizeChatHtml.d.ts.map +1 -0
- package/lib/components/messages-container-ui/sanitizeChatHtml.js +50 -0
- package/lib/components/messages-container-ui/sanitizeChatHtml.js.map +1 -0
- package/package.json +6 -5
- package/src/components/messages-container-ui/ModernMessageGroup.tsx +11 -59
- package/src/components/messages-container-ui/__tests__/sanitizeChatHtml.test.tsx +88 -0
- package/src/components/messages-container-ui/sanitizeChatHtml.ts +62 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,16 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [12.2.5-alpha.23](https://github.com/CDEBase/admin-layout/compare/v12.2.5-alpha.22...v12.2.5-alpha.23) (2026-10-20)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
- **tailwind-chat-pro:** chat HTML is formatting only - no frames, forms, inputs or styles ([3789b2f](https://github.com/CDEBase/admin-layout/commit/3789b2f5cc7543958bf147ef429629424c5eaab0))
|
|
11
|
+
|
|
12
|
+
## [12.2.5-alpha.22](https://github.com/CDEBase/admin-layout/compare/v12.2.5-alpha.21...v12.2.5-alpha.22) (2026-10-20)
|
|
13
|
+
|
|
14
|
+
**Note:** Version bump only for package @admin-layout/tailwind-chat-pro
|
|
15
|
+
|
|
6
16
|
## [12.2.5-alpha.20](https://github.com/CDEBase/admin-layout/compare/v12.2.5-alpha.19...v12.2.5-alpha.20) (2026-10-14)
|
|
7
17
|
|
|
8
18
|
### Bug Fixes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModernMessageGroup.d.ts","sourceRoot":"","sources":["../../../src/components/messages-container-ui/ModernMessageGroup.tsx"],"names":[],"mappings":"AACA,OAAO,EAAsB,SAAS,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAG9D,OAAO,KAAuC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ModernMessageGroup.d.ts","sourceRoot":"","sources":["../../../src/components/messages-container-ui/ModernMessageGroup.tsx"],"names":[],"mappings":"AACA,OAAO,EAAsB,SAAS,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAG9D,OAAO,KAAuC,MAAM,OAAO,CAAC;AAiC5D,wBAAgB,wBAAwB,CAAC,EACrC,QAAQ,EACR,eAAe,GAClB,EAAE;IACC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B,2CAUA;AAGD,eAAO,MAAM,iBAAiB,i+eA6Y7B,CAAC;AA4BF,UAAU,uBAAuB;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClB,WAAW,EAAE,SAAS,CAAC;IACvB,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,cAAc,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IACrC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,iGAAiG;IACjG,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACzC;AAiBD,eAAO,MAAM,0BAA0B,GAAI,UAAU,KAAK,EAAE,EAAE,6BAAwB,KAAG,KAAK,EAAE,EAgC/F,CAAC;AAGF,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,KAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,MAyDhF,CAAC;AAsTF,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC7B,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB,CA8DA,CAAC;AAGF,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC7B,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACzC,CAsTA,CAAC;AA+CF,yEAAyE;AACzE,eAAO,MAAM,mBAAmB,GAAI,eAAe,OAAO,EAAE,eAAe,OAAO,2DACQ,CAAC;AAue3F,eAAO,MAAM,2BAA2B,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA0DzE,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {Slot}from'@common-stack/components-pro';import {AiAgentMessageRole}from'common';import {format,differenceInMinutes}from'date-fns';import {marked}from'marked';import React,{useMemo,useEffect,useState}from'react';import ReactMarkdown from'react-markdown';import remarkBreaks from'remark-breaks';import remarkGfm from'remark-gfm';import {MessengerSlotFillNameEnum}from'./messenger-slot-fill-name-enum.js';import {FilesList}from'./FilesList.js';import {ErrorFixCard}from'./ErrorFixCard.js';import {useBubbleEntrance}from'./useBubbleEntrance.js';import {wrapTables,TABLE_SCROLL_CLASS,TABLE_STYLES}from'./markdownTables.js';// Configure marked for better markdown rendering
|
|
1
|
+
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {Slot}from'@common-stack/components-pro';import {AiAgentMessageRole}from'common';import {format,differenceInMinutes}from'date-fns';import {marked}from'marked';import React,{useMemo,useEffect,useState}from'react';import ReactMarkdown from'react-markdown';import remarkBreaks from'remark-breaks';import remarkGfm from'remark-gfm';import {MessengerSlotFillNameEnum}from'./messenger-slot-fill-name-enum.js';import {FilesList}from'./FilesList.js';import {ErrorFixCard}from'./ErrorFixCard.js';import {useBubbleEntrance}from'./useBubbleEntrance.js';import {wrapTables,TABLE_SCROLL_CLASS,TABLE_STYLES}from'./markdownTables.js';import {sanitizeChatHtml}from'./sanitizeChatHtml.js';// Configure marked for better markdown rendering
|
|
2
2
|
marked.setOptions({
|
|
3
3
|
breaks: true,
|
|
4
4
|
// Convert line breaks to <br>
|
|
@@ -565,41 +565,6 @@ const getMessageSlotName = type => {
|
|
|
565
565
|
if (t === 'RESUME') return MessengerSlotFillNameEnum.RESUME_NAME;
|
|
566
566
|
return null;
|
|
567
567
|
};
|
|
568
|
-
// Enhanced sanitizer that allows most HTML tags while maintaining security
|
|
569
|
-
const sanitizeHtml = html => {
|
|
570
|
-
try {
|
|
571
|
-
if (typeof window === 'undefined' || typeof window.DOMParser === 'undefined') {
|
|
572
|
-
return html.replace(/<script[\s\S]*?>[\s\S]*?<\/script>/gi, '').replace(/<style[\s\S]*?>[\s\S]*?<\/style>/gi, '').replace(/on\w+\s*=\s*"[^"]*"/gi, '').replace(/on\w+\s*=\s*'[^']*'/gi, '').replace(/on\w+\s*=\s*[^\s>]+/gi, '').replace(/javascript:/gi, '').replace(/data:text\/html/gi, '');
|
|
573
|
-
}
|
|
574
|
-
const parser = new window.DOMParser();
|
|
575
|
-
const doc = parser.parseFromString(html, 'text/html');
|
|
576
|
-
// Only remove the most dangerous tags
|
|
577
|
-
const dangerousTags = ['script', 'style'];
|
|
578
|
-
dangerousTags.forEach(tag => {
|
|
579
|
-
doc.querySelectorAll(tag).forEach(el => el.remove());
|
|
580
|
-
});
|
|
581
|
-
const walker = doc.createTreeWalker(doc.body, NodeFilter.SHOW_ELEMENT);
|
|
582
|
-
let node = walker.nextNode();
|
|
583
|
-
while (node) {
|
|
584
|
-
Array.from(node.attributes).forEach(attr => {
|
|
585
|
-
const name = attr.name.toLowerCase();
|
|
586
|
-
const value = (attr.value || '').toLowerCase();
|
|
587
|
-
// Remove event handlers and javascript protocols
|
|
588
|
-
if (name.startsWith('on') || value.startsWith('javascript:')) {
|
|
589
|
-
node?.removeAttribute(attr.name);
|
|
590
|
-
}
|
|
591
|
-
// Allow most attributes but validate URLs for src/href
|
|
592
|
-
if ((name === 'src' || name === 'href') && !/^https?:|^\/.*/.test(attr.value)) {
|
|
593
|
-
node?.removeAttribute(attr.name);
|
|
594
|
-
}
|
|
595
|
-
});
|
|
596
|
-
node = walker.nextNode();
|
|
597
|
-
}
|
|
598
|
-
return doc.body.innerHTML;
|
|
599
|
-
} catch (e) {
|
|
600
|
-
return html.replace(/<script[\s\S]*?>[\s\S]*?<\/script>/gi, '');
|
|
601
|
-
}
|
|
602
|
-
};
|
|
603
568
|
// Function to prettify HTML content
|
|
604
569
|
const prettifyHtmlContent = htmlContent => {
|
|
605
570
|
// Add semantic classes for better styling
|
|
@@ -636,7 +601,7 @@ const BuilderLikeRenderer = ({
|
|
|
636
601
|
const type = block?.['@type'] || block?.type;
|
|
637
602
|
if (!type) return null;
|
|
638
603
|
if (/text/i.test(type)) {
|
|
639
|
-
const html =
|
|
604
|
+
const html = sanitizeChatHtml(block?.text || block?.data?.text || '');
|
|
640
605
|
return jsx("div", {
|
|
641
606
|
className: "max-w-none text-gray-800",
|
|
642
607
|
dangerouslySetInnerHTML: {
|
|
@@ -944,8 +909,9 @@ const FormattedMessageContent = ({
|
|
|
944
909
|
});
|
|
945
910
|
// Only return if parsing actually produced HTML (not just the same text)
|
|
946
911
|
if (parsed && parsed.trim() !== trimmed && parsed.includes('<')) {
|
|
912
|
+
// marked passes raw HTML in the text straight through, so its output is sanitized like any HTML.
|
|
947
913
|
return {
|
|
948
|
-
htmlContent: wrapTables(parsed),
|
|
914
|
+
htmlContent: sanitizeChatHtml(wrapTables(parsed)),
|
|
949
915
|
markdownSource: trimmed
|
|
950
916
|
};
|
|
951
917
|
}
|
|
@@ -1418,16 +1384,16 @@ const ModernMessageBubble = ({
|
|
|
1418
1384
|
children: jsx("div", {
|
|
1419
1385
|
className: getAssistantResponseClasses('min-w-0'),
|
|
1420
1386
|
dangerouslySetInnerHTML: {
|
|
1421
|
-
__html: prettifyHtmlContent(
|
|
1387
|
+
__html: prettifyHtmlContent(sanitizeChatHtml(message.message))
|
|
1422
1388
|
}
|
|
1423
1389
|
})
|
|
1424
1390
|
});
|
|
1425
1391
|
}
|
|
1392
|
+
// A person's own message reads as they typed it: markup in it is text,
|
|
1393
|
+
// never part of the page.
|
|
1426
1394
|
return jsx("div", {
|
|
1427
|
-
className: "text-foreground
|
|
1428
|
-
|
|
1429
|
-
__html: prettifyHtmlContent(sanitizeHtml(message.message))
|
|
1430
|
-
}
|
|
1395
|
+
className: "text-foreground whitespace-pre-wrap break-words",
|
|
1396
|
+
children: message.message
|
|
1431
1397
|
});
|
|
1432
1398
|
} else {
|
|
1433
1399
|
return jsx(FormattedMessageContent, {
|
|
@@ -1536,7 +1502,7 @@ const ModernMessageBubble = ({
|
|
|
1536
1502
|
children: jsx("div", {
|
|
1537
1503
|
className: getAssistantResponseClasses('min-w-0 relative max-w-full w-full'),
|
|
1538
1504
|
dangerouslySetInnerHTML: {
|
|
1539
|
-
__html: prettifyHtmlContent(
|
|
1505
|
+
__html: prettifyHtmlContent(sanitizeChatHtml(message.message))
|
|
1540
1506
|
}
|
|
1541
1507
|
})
|
|
1542
1508
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModernMessageGroup.js","sources":["../../../src/components/messages-container-ui/ModernMessageGroup.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ModernMessageGroup.js","sources":["../../../src/components/messages-container-ui/ModernMessageGroup.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitizeChatHtml.d.ts","sourceRoot":"","sources":["../../../src/components/messages-container-ui/sanitizeChatHtml.ts"],"names":[],"mappings":"AA2DA,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import {getDefaultWhiteList,FilterXSS}from'xss';import {TABLE_SCROLL_CLASS}from'./markdownTables.js';/**
|
|
2
|
+
* The one way chat HTML reaches the page: every message a bubble renders as HTML - an agent reply, markdown parsed to
|
|
3
|
+
* HTML, a builder text block - goes through here first.
|
|
4
|
+
*
|
|
5
|
+
* Chat text is written by people and by the agent, and the agent repeats what web pages say, so it is treated as
|
|
6
|
+
* hostile. Formatting survives (headings, lists, tables, code, links, images); nothing that runs, embeds a document,
|
|
7
|
+
* takes input or restyles the page does. The hand-rolled sanitizer this replaces kept `<iframe srcdoc>` (a document in
|
|
8
|
+
* the app's own origin, so its script could read the app's storage), forms and inputs, and inline styles (a message's
|
|
9
|
+
* `position: fixed` markup was laid over the whole app).
|
|
10
|
+
*
|
|
11
|
+
* A whitelist filter that parses the string itself, so the server render and the browser produce the same markup and
|
|
12
|
+
* hydration matches. Tags off the list are dropped (their text stays); script, style and frame bodies go entirely.
|
|
13
|
+
*/
|
|
14
|
+
const ALLOWED_URI = /^(?:https?:|mailto:|tel:|#|\/(?!\/))/i;
|
|
15
|
+
// Classes are page styling: the app's utility classes would do what an inline style does (`fixed inset-0`), so only
|
|
16
|
+
// the ones this renderer puts there itself survive.
|
|
17
|
+
const ALLOWED_CLASS = (tag, value) => value.split(/\s+/).filter(c => tag === 'div' && c === TABLE_SCROLL_CLASS || tag === 'code' && /^language-[\w-]+$/.test(c)).join(' ');
|
|
18
|
+
const whiteList = (() => {
|
|
19
|
+
const list = getDefaultWhiteList();
|
|
20
|
+
// Media players and image maps are not chat formatting.
|
|
21
|
+
for (const tag of ['audio', 'video', 'source', 'track', 'area', 'map']) delete list[tag];
|
|
22
|
+
list.a = ['href', 'title', 'target'];
|
|
23
|
+
list.div = [...(list.div ?? []), 'class'];
|
|
24
|
+
list.code = [...(list.code ?? []), 'class'];
|
|
25
|
+
return list;
|
|
26
|
+
})();
|
|
27
|
+
const filter = new FilterXSS({
|
|
28
|
+
whiteList,
|
|
29
|
+
stripIgnoreTag: true,
|
|
30
|
+
// Elements whose content is not text to show. Void tags (embed, frame) have none and are dropped with the rest.
|
|
31
|
+
stripIgnoreTagBody: ['script', 'style', 'iframe', 'object', 'noscript', 'template', 'textarea'],
|
|
32
|
+
css: false,
|
|
33
|
+
onTagAttr(tag, name, value) {
|
|
34
|
+
if (name === 'class') {
|
|
35
|
+
const kept = ALLOWED_CLASS(tag, value);
|
|
36
|
+
return kept ? `class="${kept}"` : '';
|
|
37
|
+
}
|
|
38
|
+
// A link that opens a new tab must not hand that tab a handle back to the app.
|
|
39
|
+
if (tag === 'a' && name === 'target') return 'target="_blank" rel="noopener noreferrer"';
|
|
40
|
+
return undefined;
|
|
41
|
+
},
|
|
42
|
+
safeAttrValue(_tag, name, value) {
|
|
43
|
+
const v = value.trim();
|
|
44
|
+
if (name === 'href' || name === 'src' || name === 'cite') return ALLOWED_URI.test(v) ? v.replace(/"/g, '"') : '';
|
|
45
|
+
return v.replace(/"/g, '"');
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
function sanitizeChatHtml(html) {
|
|
49
|
+
return filter.process(html);
|
|
50
|
+
}export{sanitizeChatHtml};//# sourceMappingURL=sanitizeChatHtml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitizeChatHtml.js","sources":["../../../src/components/messages-container-ui/sanitizeChatHtml.ts"],"sourcesContent":[null],"names":[],"mappings":"qGAGA;;;;;;;;;;;;AAYG;AACH,MAAM,WAAW,GAAG,uCAAuC;AAE3D;AACA;AACA,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,KAAa,KAC7C,KAAK,CAAA,KAAA,CAAA,KAAA,CAAA,CAAA,MAAA,CAAA,CAAA,IAAA,GAAA,KAAA,KAAA,IAAA,CAAA,KAAA,kBAAA,IAAA,GAAA,KAAA,MAAA,IAAA,mBAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,GAAA,CAAA;MACA,YAAY,CAAA,MAAA;AACZ,EAAA,MAAA,IAAO,GAAE,mBAAmB,EAAA;;AAGrC,EAAA,KAAM,MAAA,GAAS,IAAgB,CAAA,OAAK,EAAA,OAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAAA,OAAA,IAAA,CAAA,GAAA,CAAA;AAChC,EAAA,IAAA,CAAA,CAAA,GAAM,CAAA,MAAO,EAAA,OAAA,EAAA,QAAmB,CAAE;MAClC,CAAA,GAAA,GAAA,CAAA,IAAA,IAAA,CAAA,GAAA,IAAA,EAAA,CAAA,EAAA,OAAA,CAAA;AACA,EAAA,IAAA,CAAA,IAAK,GAAA,CAAM,IAAG,IAAK,SAAS,EAAA,CAAA,EAAA,OAAS,CAAA;AAAmC,EAAA,OAAA,IAAA;IACxE;AACA,MAAA,MAAQ,GAAG,IAAI,SAAS;AACxB,EAAA,SAAK;AACL,EAAA,cAAY,EAAA,IAAA;AAChB;AAEA,EAAA,kBAAmB,EAAA,CAAA,QAAU,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,CAAA;KACzB,EAAA,KAAA;AACA,EAAA,SAAA,CAAA,GAAA,EAAA,IAAgB,EAAA,KAAI,EAAA;IACpB,IAAA,IAAA,KAAA,OAAA,EAAA;AACA,MAAA,MAAA,IAAA,GAAA,aAAqB,CAAQ,UAAS,CAAE;AACxC,MAAA,OAAK,IAAK,GAAA,CAAA,OAAA,EAAA,IAAA,CAAA,CAAA,CAAA,GAAA,EAAA;AACV,IAAA;AACI;gBACI,GAAM,QAAO,KAAA,UAAiB,OAAO,2CAAE;oBAChC;;eAEX,CAAA,IAAA,EAAA,IAAA,EAAA,KAAA,EAAA;AACA,IAAA,MAAA,CAAA,QAAO,CAAK,IAAG,EAAA;AAAuB,IAAA,IAAA,IAAA,KAAA,6CAAkD,OAAC,WAAA,CAAA,IAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,OAAA,CAAA,IAAA,EAAA,QAAA,CAAA,GAAA,EAAA;AACzF,IAAA,OAAA,CAAA,CAAA,YAAiB,EAAA,QAAA,CAAA;;AAErB,CAAA,CAAA;AACI,SAAO,gBAAgB,CAAA,IAAA,EAAA;SACvB,MAAI,CAAI,OAAK,CAAA,IAAM,CAAA;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@admin-layout/tailwind-chat-pro",
|
|
3
|
-
"version": "12.2.5-alpha.
|
|
3
|
+
"version": "12.2.5-alpha.23",
|
|
4
4
|
"description": "Customizable base chat / messages container UI (plan mode). The message renderer is injectable, so consumers plug in their own message-group component.",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -19,20 +19,21 @@
|
|
|
19
19
|
"watch": "yarn build:lib:watch"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@admin-layout/tailwind-ui": "12.2.5-alpha.
|
|
22
|
+
"@admin-layout/tailwind-ui": "12.2.5-alpha.22",
|
|
23
23
|
"clsx": "^2.1.1",
|
|
24
24
|
"date-fns": "^4.1.0",
|
|
25
25
|
"marked": "7.0.5",
|
|
26
26
|
"react-markdown": "^10.1.0",
|
|
27
27
|
"remark-breaks": "^4.0.0",
|
|
28
|
-
"remark-gfm": "^4.0.1"
|
|
28
|
+
"remark-gfm": "^4.0.1",
|
|
29
|
+
"xss": "^1.0.6"
|
|
29
30
|
},
|
|
30
31
|
"devDependencies": {
|
|
31
32
|
"common": "12.2.5-alpha.2",
|
|
32
33
|
"vitest": "^3.0.4"
|
|
33
34
|
},
|
|
34
35
|
"peerDependencies": {
|
|
35
|
-
"@admin-layout/tailwind-ui": "12.2.5-alpha.
|
|
36
|
+
"@admin-layout/tailwind-ui": "12.2.5-alpha.22",
|
|
36
37
|
"@common-stack/components-pro": "*",
|
|
37
38
|
"common": "12.2.5-alpha.2",
|
|
38
39
|
"react": ">=18"
|
|
@@ -43,5 +44,5 @@
|
|
|
43
44
|
"typescript": {
|
|
44
45
|
"definition": "lib/index.d.ts"
|
|
45
46
|
},
|
|
46
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "342a66871ec3ef60095779d738e110317df12144"
|
|
47
48
|
}
|
|
@@ -11,6 +11,7 @@ import { FilesList } from './FilesList';
|
|
|
11
11
|
import { ErrorFixCard } from './ErrorFixCard';
|
|
12
12
|
import { useBubbleEntrance } from './useBubbleEntrance';
|
|
13
13
|
import { TABLE_SCROLL_CLASS, TABLE_STYLES, wrapTables } from './markdownTables';
|
|
14
|
+
import { sanitizeChatHtml } from './sanitizeChatHtml';
|
|
14
15
|
|
|
15
16
|
// Configure marked for better markdown rendering
|
|
16
17
|
marked.setOptions({
|
|
@@ -636,55 +637,6 @@ const getMessageSlotName = (type: string | undefined): string | null => {
|
|
|
636
637
|
return null;
|
|
637
638
|
};
|
|
638
639
|
|
|
639
|
-
// Enhanced sanitizer that allows most HTML tags while maintaining security
|
|
640
|
-
const sanitizeHtml = (html: string): string => {
|
|
641
|
-
try {
|
|
642
|
-
if (typeof window === 'undefined' || typeof window.DOMParser === 'undefined') {
|
|
643
|
-
return html
|
|
644
|
-
.replace(/<script[\s\S]*?>[\s\S]*?<\/script>/gi, '')
|
|
645
|
-
.replace(/<style[\s\S]*?>[\s\S]*?<\/style>/gi, '')
|
|
646
|
-
.replace(/on\w+\s*=\s*"[^"]*"/gi, '')
|
|
647
|
-
.replace(/on\w+\s*=\s*'[^']*'/gi, '')
|
|
648
|
-
.replace(/on\w+\s*=\s*[^\s>]+/gi, '')
|
|
649
|
-
.replace(/javascript:/gi, '')
|
|
650
|
-
.replace(/data:text\/html/gi, '');
|
|
651
|
-
}
|
|
652
|
-
|
|
653
|
-
const parser = new window.DOMParser();
|
|
654
|
-
const doc = parser.parseFromString(html, 'text/html');
|
|
655
|
-
|
|
656
|
-
// Only remove the most dangerous tags
|
|
657
|
-
const dangerousTags = ['script', 'style'];
|
|
658
|
-
dangerousTags.forEach((tag) => {
|
|
659
|
-
doc.querySelectorAll(tag).forEach((el) => el.remove());
|
|
660
|
-
});
|
|
661
|
-
|
|
662
|
-
const walker = doc.createTreeWalker(doc.body, (NodeFilter as any).SHOW_ELEMENT);
|
|
663
|
-
let node = walker.nextNode() as Element | null;
|
|
664
|
-
while (node) {
|
|
665
|
-
Array.from(node.attributes).forEach((attr) => {
|
|
666
|
-
const name = attr.name.toLowerCase();
|
|
667
|
-
const value = (attr.value || '').toLowerCase();
|
|
668
|
-
|
|
669
|
-
// Remove event handlers and javascript protocols
|
|
670
|
-
if (name.startsWith('on') || value.startsWith('javascript:')) {
|
|
671
|
-
node?.removeAttribute(attr.name);
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
// Allow most attributes but validate URLs for src/href
|
|
675
|
-
if ((name === 'src' || name === 'href') && !/^https?:|^\/.*/.test(attr.value)) {
|
|
676
|
-
node?.removeAttribute(attr.name);
|
|
677
|
-
}
|
|
678
|
-
});
|
|
679
|
-
node = walker.nextNode() as Element | null;
|
|
680
|
-
}
|
|
681
|
-
|
|
682
|
-
return doc.body.innerHTML;
|
|
683
|
-
} catch (e) {
|
|
684
|
-
return html.replace(/<script[\s\S]*?>[\s\S]*?<\/script>/gi, '');
|
|
685
|
-
}
|
|
686
|
-
};
|
|
687
|
-
|
|
688
640
|
// Function to prettify HTML content
|
|
689
641
|
const prettifyHtmlContent = (htmlContent: string): string => {
|
|
690
642
|
// Add semantic classes for better styling
|
|
@@ -733,7 +685,7 @@ const BuilderLikeRenderer: React.FC<{ blocks?: any[] }> = ({ blocks }) => {
|
|
|
733
685
|
if (!type) return null;
|
|
734
686
|
|
|
735
687
|
if (/text/i.test(type)) {
|
|
736
|
-
const html =
|
|
688
|
+
const html = sanitizeChatHtml(block?.text || block?.data?.text || '');
|
|
737
689
|
return (
|
|
738
690
|
<div
|
|
739
691
|
key={idx}
|
|
@@ -1080,7 +1032,8 @@ export const FormattedMessageContent: React.FC<{
|
|
|
1080
1032
|
const parsed = marked.parse(trimmed, { async: false }) as string;
|
|
1081
1033
|
// Only return if parsing actually produced HTML (not just the same text)
|
|
1082
1034
|
if (parsed && parsed.trim() !== trimmed && parsed.includes('<')) {
|
|
1083
|
-
|
|
1035
|
+
// marked passes raw HTML in the text straight through, so its output is sanitized like any HTML.
|
|
1036
|
+
return { htmlContent: sanitizeChatHtml(wrapTables(parsed)), markdownSource: trimmed as string };
|
|
1084
1037
|
}
|
|
1085
1038
|
}
|
|
1086
1039
|
|
|
@@ -1644,7 +1597,7 @@ const ModernMessageBubble: React.FC<ModernMessageBubbleProps> = ({
|
|
|
1644
1597
|
className={getAssistantResponseClasses('min-w-0')}
|
|
1645
1598
|
dangerouslySetInnerHTML={{
|
|
1646
1599
|
__html: prettifyHtmlContent(
|
|
1647
|
-
|
|
1600
|
+
sanitizeChatHtml(message.message),
|
|
1648
1601
|
),
|
|
1649
1602
|
}}
|
|
1650
1603
|
/>
|
|
@@ -1652,13 +1605,12 @@ const ModernMessageBubble: React.FC<ModernMessageBubbleProps> = ({
|
|
|
1652
1605
|
);
|
|
1653
1606
|
}
|
|
1654
1607
|
|
|
1608
|
+
// A person's own message reads as they typed it: markup in it is text,
|
|
1609
|
+
// never part of the page.
|
|
1655
1610
|
return (
|
|
1656
|
-
<div
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
__html: prettifyHtmlContent(sanitizeHtml(message.message)),
|
|
1660
|
-
}}
|
|
1661
|
-
/>
|
|
1611
|
+
<div className="text-foreground whitespace-pre-wrap break-words">
|
|
1612
|
+
{message.message}
|
|
1613
|
+
</div>
|
|
1662
1614
|
);
|
|
1663
1615
|
} else {
|
|
1664
1616
|
return (
|
|
@@ -1806,7 +1758,7 @@ const ModernMessageBubble: React.FC<ModernMessageBubbleProps> = ({
|
|
|
1806
1758
|
'min-w-0 relative max-w-full w-full',
|
|
1807
1759
|
)}
|
|
1808
1760
|
dangerouslySetInnerHTML={{
|
|
1809
|
-
__html: prettifyHtmlContent(
|
|
1761
|
+
__html: prettifyHtmlContent(sanitizeChatHtml(message.message)),
|
|
1810
1762
|
}}
|
|
1811
1763
|
/>
|
|
1812
1764
|
</AssistantResponseWrapper>
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { renderToStaticMarkup } from 'react-dom/server';
|
|
3
|
+
import { describe, expect, it } from 'vitest';
|
|
4
|
+
import { TABLE_SCROLL_CLASS } from '../markdownTables';
|
|
5
|
+
import { FormattedMessageContent } from '../ModernMessageGroup';
|
|
6
|
+
import { sanitizeChatHtml } from '../sanitizeChatHtml';
|
|
7
|
+
|
|
8
|
+
// What reached the page through the old sanitizer, from a chat message (a person's, or an agent repeating a page).
|
|
9
|
+
describe('sanitizeChatHtml drops what runs, embeds, takes input or restyles the page', () => {
|
|
10
|
+
it('drops an iframe whose srcdoc ran script in the app origin', () => {
|
|
11
|
+
const out = sanitizeChatHtml(`<p>hi</p><iframe srcdoc="<script>parent.steal()</script>"></iframe>`);
|
|
12
|
+
expect(out).toBe('<p>hi</p>');
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('drops forms, inputs and buttons, keeping their text', () => {
|
|
16
|
+
const out = sanitizeChatHtml(
|
|
17
|
+
`<form action="https://collect.example/x"><label>Password</label><input name=pw><button>Sign in</button></form>`,
|
|
18
|
+
);
|
|
19
|
+
expect(out).not.toMatch(/<form|<input|<button|action=/i);
|
|
20
|
+
expect(out).toContain('Password');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('drops inline styles and the app classes that would do the same', () => {
|
|
24
|
+
const out = sanitizeChatHtml(
|
|
25
|
+
`<div style="position:fixed;inset:0" class="fixed inset-0 z-50">cover</div><p style="color:red">x</p>`,
|
|
26
|
+
);
|
|
27
|
+
expect(out).toBe('<div>cover</div><p>x</p>');
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('drops script and style bodies, handlers and unsafe URLs', () => {
|
|
31
|
+
expect(sanitizeChatHtml(`a<script>alert(1)</script>b<style>body{display:none}</style>c`)).toBe('abc');
|
|
32
|
+
expect(sanitizeChatHtml(`<img src="https://x.example/a.png" onerror="alert(1)">`)).toBe(
|
|
33
|
+
'<img src="https://x.example/a.png">',
|
|
34
|
+
);
|
|
35
|
+
expect(sanitizeChatHtml(`<a href="javascript:alert(1)">x</a>`)).toBe('<a href>x</a>');
|
|
36
|
+
expect(sanitizeChatHtml(`<a href=" JaVaScRiPt:alert(1)">x</a>`)).toBe('<a href>x</a>');
|
|
37
|
+
expect(sanitizeChatHtml(`<a href="//evil.example/">x</a>`)).toBe('<a href>x</a>');
|
|
38
|
+
expect(sanitizeChatHtml(`<img src="data:image/svg+xml,<svg onload=alert(1)>">`)).toBe('<img src>');
|
|
39
|
+
expect(sanitizeChatHtml(`<svg><animate onbegin="alert(1)"/></svg>ok`)).toBe('ok');
|
|
40
|
+
expect(
|
|
41
|
+
sanitizeChatHtml(`<object data="https://x.example/a.swf"></object><embed src="https://x.example/b">ok`),
|
|
42
|
+
).toBe('ok');
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('keeps a new-tab link from reaching back into the app', () => {
|
|
46
|
+
expect(sanitizeChatHtml(`<a href="https://example.com" target="_top">site</a>`)).toBe(
|
|
47
|
+
'<a href="https://example.com" target="_blank" rel="noopener noreferrer">site</a>',
|
|
48
|
+
);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
describe('sanitizeChatHtml keeps formatting', () => {
|
|
53
|
+
it('keeps headings, emphasis, lists, code, quotes and links on this site or the web', () => {
|
|
54
|
+
const html =
|
|
55
|
+
'<h2>Plan</h2><p><strong>Bold</strong> and <em>soft</em></p><ul><li>one</li></ul>' +
|
|
56
|
+
'<pre><code class="language-ts">const a = 1;</code></pre><blockquote>said</blockquote>' +
|
|
57
|
+
'<a href="https://example.com">web</a> <a href="/?artifact=x">here</a> <a href="mailto:a@b.co">mail</a>';
|
|
58
|
+
expect(sanitizeChatHtml(html)).toBe(html);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("keeps a table and this renderer's own scroll box", () => {
|
|
62
|
+
const html = `<div class="${TABLE_SCROLL_CLASS}"><table><thead><tr><th>A</th></tr></thead><tbody><tr><td>1</td></tr></tbody></table></div>`;
|
|
63
|
+
expect(sanitizeChatHtml(html)).toBe(html);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('gives the server render and the browser the same markup (no DOM needed)', () => {
|
|
67
|
+
expect(typeof window).toBe('undefined');
|
|
68
|
+
expect(sanitizeChatHtml('<p>same <b>everywhere</b></p>')).toBe('<p>same <b>everywhere</b></p>');
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// marked passes raw HTML in markdown straight through, so the markdown path is sanitized too.
|
|
73
|
+
describe('FormattedMessageContent', () => {
|
|
74
|
+
it('renders markdown with raw HTML in it without the HTML that runs or covers the page', () => {
|
|
75
|
+
const md = [
|
|
76
|
+
'## Results',
|
|
77
|
+
'',
|
|
78
|
+
'- **one**',
|
|
79
|
+
'- two',
|
|
80
|
+
'',
|
|
81
|
+
'<iframe srcdoc="<script>parent.steal()</script>"></iframe>',
|
|
82
|
+
'<input id="pw" style="position:fixed;top:0">',
|
|
83
|
+
].join('\n');
|
|
84
|
+
const out = renderToStaticMarkup(<FormattedMessageContent content={md} />);
|
|
85
|
+
expect(out).toContain('<strong>one</strong>');
|
|
86
|
+
expect(out).not.toMatch(/<iframe|srcdoc|<input|position:\s*fixed/i);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { FilterXSS, getDefaultWhiteList, type IWhiteList } from 'xss';
|
|
2
|
+
import { TABLE_SCROLL_CLASS } from './markdownTables';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The one way chat HTML reaches the page: every message a bubble renders as HTML - an agent reply, markdown parsed to
|
|
6
|
+
* HTML, a builder text block - goes through here first.
|
|
7
|
+
*
|
|
8
|
+
* Chat text is written by people and by the agent, and the agent repeats what web pages say, so it is treated as
|
|
9
|
+
* hostile. Formatting survives (headings, lists, tables, code, links, images); nothing that runs, embeds a document,
|
|
10
|
+
* takes input or restyles the page does. The hand-rolled sanitizer this replaces kept `<iframe srcdoc>` (a document in
|
|
11
|
+
* the app's own origin, so its script could read the app's storage), forms and inputs, and inline styles (a message's
|
|
12
|
+
* `position: fixed` markup was laid over the whole app).
|
|
13
|
+
*
|
|
14
|
+
* A whitelist filter that parses the string itself, so the server render and the browser produce the same markup and
|
|
15
|
+
* hydration matches. Tags off the list are dropped (their text stays); script, style and frame bodies go entirely.
|
|
16
|
+
*/
|
|
17
|
+
const ALLOWED_URI = /^(?:https?:|mailto:|tel:|#|\/(?!\/))/i;
|
|
18
|
+
|
|
19
|
+
// Classes are page styling: the app's utility classes would do what an inline style does (`fixed inset-0`), so only
|
|
20
|
+
// the ones this renderer puts there itself survive.
|
|
21
|
+
const ALLOWED_CLASS = (tag: string, value: string): string =>
|
|
22
|
+
value
|
|
23
|
+
.split(/\s+/)
|
|
24
|
+
.filter((c) => (tag === 'div' && c === TABLE_SCROLL_CLASS) || (tag === 'code' && /^language-[\w-]+$/.test(c)))
|
|
25
|
+
.join(' ');
|
|
26
|
+
|
|
27
|
+
const whiteList: IWhiteList = (() => {
|
|
28
|
+
const list = getDefaultWhiteList();
|
|
29
|
+
// Media players and image maps are not chat formatting.
|
|
30
|
+
for (const tag of ['audio', 'video', 'source', 'track', 'area', 'map']) delete list[tag];
|
|
31
|
+
list.a = ['href', 'title', 'target'];
|
|
32
|
+
list.div = [...(list.div ?? []), 'class'];
|
|
33
|
+
list.code = [...(list.code ?? []), 'class'];
|
|
34
|
+
return list;
|
|
35
|
+
})();
|
|
36
|
+
|
|
37
|
+
const filter = new FilterXSS({
|
|
38
|
+
whiteList,
|
|
39
|
+
stripIgnoreTag: true,
|
|
40
|
+
// Elements whose content is not text to show. Void tags (embed, frame) have none and are dropped with the rest.
|
|
41
|
+
stripIgnoreTagBody: ['script', 'style', 'iframe', 'object', 'noscript', 'template', 'textarea'],
|
|
42
|
+
css: false,
|
|
43
|
+
onTagAttr(tag, name, value) {
|
|
44
|
+
if (name === 'class') {
|
|
45
|
+
const kept = ALLOWED_CLASS(tag, value);
|
|
46
|
+
return kept ? `class="${kept}"` : '';
|
|
47
|
+
}
|
|
48
|
+
// A link that opens a new tab must not hand that tab a handle back to the app.
|
|
49
|
+
if (tag === 'a' && name === 'target') return 'target="_blank" rel="noopener noreferrer"';
|
|
50
|
+
return undefined;
|
|
51
|
+
},
|
|
52
|
+
safeAttrValue(_tag, name, value) {
|
|
53
|
+
const v = value.trim();
|
|
54
|
+
if (name === 'href' || name === 'src' || name === 'cite')
|
|
55
|
+
return ALLOWED_URI.test(v) ? v.replace(/"/g, '"') : '';
|
|
56
|
+
return v.replace(/"/g, '"');
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
export function sanitizeChatHtml(html: string): string {
|
|
61
|
+
return filter.process(html);
|
|
62
|
+
}
|