Merge pull request #5584 from open-webui/dev

fix: node tooltip xss issue
This commit is contained in:
Timothy Jaeryang Baek 2024-09-21 21:44:25 +02:00 committed by GitHub
commit 6b463164f4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 8 additions and 4 deletions

View File

@ -15,6 +15,7 @@
<Tooltip <Tooltip
content={data?.message?.error ? data.message.error.content : data.message.content} content={data?.message?.error ? data.message.error.content : data.message.content}
class="w-full" class="w-full"
allowHTML={false}
> >
{#if data.message.role === 'user'} {#if data.message.role === 'user'}
<div class="flex w-full"> <div class="flex w-full">

View File

@ -1,4 +1,6 @@
<script lang="ts"> <script lang="ts">
import DOMPurify from 'dompurify';
import { onDestroy } from 'svelte'; import { onDestroy } from 'svelte';
import { marked } from 'marked'; import { marked } from 'marked';
@ -10,18 +12,19 @@
export let touch = true; export let touch = true;
export let className = 'flex'; export let className = 'flex';
export let theme = ''; export let theme = '';
export let allowHTML = true;
let tooltipElement; let tooltipElement;
let tooltipInstance; let tooltipInstance;
$: if (tooltipElement && content) { $: if (tooltipElement && content) {
if (tooltipInstance) { if (tooltipInstance) {
tooltipInstance.setContent(content); tooltipInstance.setContent(DOMPurify.sanitize(content));
} else { } else {
tooltipInstance = tippy(tooltipElement, { tooltipInstance = tippy(tooltipElement, {
content: content, content: DOMPurify.sanitize(content),
placement: placement, placement: placement,
allowHTML: true, allowHTML: allowHTML,
touch: touch, touch: touch,
...(theme !== '' ? { theme } : { theme: 'dark' }), ...(theme !== '' ? { theme } : { theme: 'dark' }),
arrow: false, arrow: false,
@ -41,6 +44,6 @@
}); });
</script> </script>
<div bind:this={tooltipElement} aria-label={content} class={className}> <div bind:this={tooltipElement} aria-label={DOMPurify.sanitize(content)} class={className}>
<slot /> <slot />
</div> </div>