Skip to content

Commit 6d3d7c2

Browse files
authored
1 parent c4d4bb8 commit 6d3d7c2

File tree

3 files changed

+26
-4
lines changed

3 files changed

+26
-4
lines changed

static/app/components/events/aiSuggestedSolution/suggestion.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import type {Event, Project} from 'sentry/types';
1717
import {trackAnalytics} from 'sentry/utils/analytics';
1818
import {getAnalyticsDataForEvent} from 'sentry/utils/events';
1919
import {isActiveSuperuser} from 'sentry/utils/isActiveSuperuser';
20-
import marked from 'sentry/utils/marked';
20+
import {limitedMarked} from 'sentry/utils/marked';
2121
import {useApiQuery} from 'sentry/utils/queryClient';
2222
import {useIsSentryEmployee} from 'sentry/utils/useIsSentryEmployee';
2323
import useOrganization from 'sentry/utils/useOrganization';
@@ -182,7 +182,7 @@ export function Suggestion({onHideSuggestion, projectSlug, event}: Props) {
182182
) : (
183183
<Content
184184
dangerouslySetInnerHTML={{
185-
__html: marked(data.suggestion, {
185+
__html: limitedMarked(data.suggestion, {
186186
gfm: true,
187187
breaks: true,
188188
}),

static/app/utils/marked.spec.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* eslint no-script-url:0 */
22

3-
import marked from 'sentry/utils/marked';
3+
import marked, {limitedMarked} from 'sentry/utils/marked';
44

55
function expectMarkdown(test) {
66
expect(marked(test[0])).toEqual('<p>' + test[1] + '</p>\n');
@@ -58,4 +58,13 @@ describe('marked', function () {
5858
],
5959
].forEach(expectMarkdown);
6060
});
61+
62+
it('limited renderer does not render images and hyperlinks as html', function () {
63+
for (const test of [
64+
['![alt](http://example.com/rick.gif)', 'http://example.com/rick.gif'],
65+
['[click me](http://example.com)', 'http://example.com'],
66+
]) {
67+
expect(limitedMarked(test[0])).toEqual('<p>' + test[1] + '</p>\n');
68+
}
69+
});
6170
});

static/app/utils/marked.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,16 @@ class SafeRenderer extends marked.Renderer {
4343
}
4444
}
4545

46+
class LimitedRenderer extends marked.Renderer {
47+
link(href: string) {
48+
return href;
49+
}
50+
51+
image(href: string) {
52+
return href;
53+
}
54+
}
55+
4656
class NoParagraphRenderer extends SafeRenderer {
4757
paragraph(text: string) {
4858
return text;
@@ -81,12 +91,15 @@ marked.setOptions({
8191
silent: NODE_ENV === 'test',
8292
});
8393

94+
const limitedMarked = (text: string, options: MarkedOptions = {}) =>
95+
sanitizedMarked(text, {...options, renderer: new LimitedRenderer()});
96+
8497
const sanitizedMarked = (src: string, options?: MarkedOptions) => {
8598
return dompurify.sanitize(marked(src, options));
8699
};
87100

88101
const singleLineRenderer = (text: string, options: MarkedOptions = {}) =>
89102
sanitizedMarked(text, {...options, renderer: new NoParagraphRenderer()});
90103

91-
export {singleLineRenderer};
104+
export {singleLineRenderer, limitedMarked};
92105
export default sanitizedMarked;

0 commit comments

Comments
 (0)