mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-02-04 07:13:25 +08:00
Merge pull request #4933 from REVERB283/bug/4716_fix_target_blank_getting_sanitized
fix: target blank removed from anchor tag
This commit is contained in:
commit
ee49c4b660
@ -501,4 +501,16 @@ describe('Class diagram', () => {
|
|||||||
B : -methods()
|
B : -methods()
|
||||||
`);
|
`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should handle notes with anchor tag having target attribute', () => {
|
||||||
|
renderGraph(
|
||||||
|
`classDiagram
|
||||||
|
class test { }
|
||||||
|
note for test "<a href='https://mermaid.js.org/' target="_blank"><code>note about mermaid</code></a>"`
|
||||||
|
);
|
||||||
|
|
||||||
|
cy.get('svg').then((svg) => {
|
||||||
|
cy.get('a').should('have.attr', 'target', '_blank').should('have.attr', 'rel', 'noopener');
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -38,6 +38,20 @@ describe('when securityLevel is antiscript, all script must be removed', () => {
|
|||||||
compareRemoveScript(`<img onerror="alert('hello');">`, `<img>`);
|
compareRemoveScript(`<img onerror="alert('hello');">`, `<img>`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should detect unsecured target attribute, if value is _blank then generate a secured link', () => {
|
||||||
|
compareRemoveScript(
|
||||||
|
`<a href="https://mermaid.js.org/" target="_blank">note about mermaid</a>`,
|
||||||
|
`<a href="https://mermaid.js.org/" target="_blank" rel="noopener">note about mermaid</a>`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should detect unsecured target attribute from links', () => {
|
||||||
|
compareRemoveScript(
|
||||||
|
`<a href="https://mermaid.js.org/" target="_self">note about mermaid</a>`,
|
||||||
|
`<a href="https://mermaid.js.org/" target="_self">note about mermaid</a>`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
it('should detect iframes', () => {
|
it('should detect iframes', () => {
|
||||||
compareRemoveScript(
|
compareRemoveScript(
|
||||||
`<iframe src="http://abc.com/script1.js"></iframe>
|
`<iframe src="http://abc.com/script1.js"></iframe>
|
||||||
|
@ -25,7 +25,27 @@ export const getRows = (s?: string): string[] => {
|
|||||||
* @returns The safer text
|
* @returns The safer text
|
||||||
*/
|
*/
|
||||||
export const removeScript = (txt: string): string => {
|
export const removeScript = (txt: string): string => {
|
||||||
return DOMPurify.sanitize(txt);
|
const TEMPORARY_ATTRIBUTE = 'data-temp-href-target';
|
||||||
|
|
||||||
|
DOMPurify.addHook('beforeSanitizeAttributes', (node: Element) => {
|
||||||
|
if (node.tagName === 'A' && node.hasAttribute('target')) {
|
||||||
|
node.setAttribute(TEMPORARY_ATTRIBUTE, node.getAttribute('target') || '');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const sanitizedText = DOMPurify.sanitize(txt);
|
||||||
|
|
||||||
|
DOMPurify.addHook('afterSanitizeAttributes', (node: Element) => {
|
||||||
|
if (node.tagName === 'A' && node.hasAttribute(TEMPORARY_ATTRIBUTE)) {
|
||||||
|
node.setAttribute('target', node.getAttribute(TEMPORARY_ATTRIBUTE) || '');
|
||||||
|
node.removeAttribute(TEMPORARY_ATTRIBUTE);
|
||||||
|
if (node.getAttribute('target') === '_blank') {
|
||||||
|
node.setAttribute('rel', 'noopener');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return sanitizedText;
|
||||||
};
|
};
|
||||||
|
|
||||||
const sanitizeMore = (text: string, config: MermaidConfig) => {
|
const sanitizeMore = (text: string, config: MermaidConfig) => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user