diff --git a/src/lib/util/fileLoaders/loader.ts b/src/lib/util/fileLoaders/loader.ts index 70f7664f..ca6cb996 100644 --- a/src/lib/util/fileLoaders/loader.ts +++ b/src/lib/util/fileLoaders/loader.ts @@ -1,5 +1,5 @@ import type { Loader, State } from '$lib/types'; -import { defaultState, updateCodeStore } from '$lib/util/state'; +import { defaultState, sanitizeConfig, updateCodeStore } from '$lib/util/state'; import { fetchText } from '$lib/util/util'; import { loadGistData } from './gist'; @@ -50,6 +50,7 @@ export const loadDataFromUrl = async (): Promise => { } } if (loaded) { + state.mermaid = sanitizeConfig(state.mermaid || defaultState.mermaid); updateCodeStore({ ...state, updateDiagram: true diff --git a/tests/loadSite.spec.ts b/tests/loadSite.spec.ts index 1e78791f..913ce5ed 100644 --- a/tests/loadSite.spec.ts +++ b/tests/loadSite.spec.ts @@ -1,3 +1,5 @@ +import type { State } from '$/types'; +import assert from 'node:assert'; import { expect, test } from './test'; test.describe('Site Loads', () => { @@ -67,6 +69,38 @@ test.describe('Site Loads', () => { }); }); + test('should prompt user to scrub unsafe config', async ({ editPage, page }) => { + let dialogAccepted = false; + page.on('dialog', async (dialog) => { + expect(dialog.type()).toBe('confirm'); + expect(dialog.message()).toContain('from the config for safety'); + await dialog.accept(); + dialogAccepted = true; + }); + await editPage.start( + `/edit?${new URLSearchParams({ + code: `data:application/vnd.mermaid,${encodeURIComponent('flowchart TD\nHello-->World')}`, + config: `data:application/json,${encodeURIComponent( + JSON.stringify({ + someOtherSetting: 'Test value', + securityLevel: 'loose' + }) + )}` + }).toString()}` + ); + await editPage.checkTextInView('Hello'); + await expect.poll(() => dialogAccepted).toBeTruthy(); + const codeStore = await page.evaluate(() => localStorage.getItem('codeStore')); + assert(codeStore); + const parsedStore = JSON.parse(codeStore) as State; + const parsedConfig = JSON.parse(parsedStore.mermaid) as Record; + expect(parsedConfig).toEqual({ + someOtherSetting: 'Test value' + }); + // should scrub unsafe securityLevel but keep other settings + expect(parsedConfig.securityLevel).toBeUndefined(); + }); + test('should show troubleshooting steps if loading fails', async ({ editPage, page }) => { await editPage.start('/#/edit/eyJjb2RlIjoiZ3JhcGggVERcbiAg'); await page.reload({ waitUntil: 'networkidle' });