diff --git a/packages/core/PluginLoader.ts b/packages/core/PluginLoader.ts index 8770cfc65bd..f2bbecc9c99 100644 --- a/packages/core/PluginLoader.ts +++ b/packages/core/PluginLoader.ts @@ -122,20 +122,33 @@ export interface LoadedPlugin { default: PluginConstructor } -export function pluginDescriptionString(pluginDefinition: PluginDefinition) { - if (isUMDPluginDefinition(pluginDefinition)) { - return `UMD plugin ${pluginDefinition.name}` - } - if (isESMPluginDefinition(pluginDefinition)) { +export function pluginDescriptionString(d: PluginDefinition) { + if (isUMDPluginDefinition(d)) { + return `UMD plugin ${d.name}` + } else if (isESMPluginDefinition(d)) { return `ESM plugin ${ - (pluginDefinition as ESMUrlPluginDefinition).esmUrl || - (pluginDefinition as ESMLocPluginDefinition).esmLoc.uri + (d as ESMUrlPluginDefinition).esmUrl || + (d as ESMLocPluginDefinition).esmLoc.uri }` + } else if (isCJSPluginDefinition(d)) { + return `CJS plugin ${d.cjsUrl}` + } else { + return 'unknown plugin' } - if (isCJSPluginDefinition(pluginDefinition)) { - return `CJS plugin ${pluginDefinition.cjsUrl}` +} +export function pluginUrl(d: PluginDefinition) { + if (isUMDPluginDefinition(d)) { + // @ts-expect-error + return d.url ?? d.esmLoc.uri ?? d.umdUrl + } else if (isESMPluginDefinition(d)) { + // @ts-expect-error + return d.esmUrl ?? d.esmUri + } else if (isCJSPluginDefinition(d)) { + // @ts-expect-error + return d.cjsUrl || d.cjsLoc.uri + } else { + return 'unknown url' } - return 'unknown plugin' } function isInWebWorker() { diff --git a/products/jbrowse-web/src/components/ConfigWarningDialog.tsx b/products/jbrowse-web/src/components/ConfigWarningDialog.tsx index 3bd6d98cb2e..cff863aa52e 100644 --- a/products/jbrowse-web/src/components/ConfigWarningDialog.tsx +++ b/products/jbrowse-web/src/components/ConfigWarningDialog.tsx @@ -1,12 +1,8 @@ -import { pluginDescriptionString } from '@jbrowse/core/PluginLoader' +import { useState } from 'react' + +import { pluginDescriptionString, pluginUrl } from '@jbrowse/core/PluginLoader' import { Dialog } from '@jbrowse/core/ui' -import WarningIcon from '@mui/icons-material/Warning' -import { - Button, - DialogActions, - DialogContent, - DialogContentText, -} from '@mui/material' +import { Alert, Button, DialogActions, DialogContent } from '@mui/material' import type { PluginDefinition } from '@jbrowse/core/PluginLoader' @@ -19,20 +15,31 @@ export default function ConfigWarningDialog({ onCancel: () => void reason: PluginDefinition[] }) { + const [show, setShow] = useState(false) return ( - - + This link contains a cross origin config that has the following unknown plugins:
    {reason.map(r => ( -
  • {pluginDescriptionString(r)}
  • +
  • + {pluginDescriptionString(r)} - ({pluginUrl(r)}) +
  • ))}
- Please ensure you trust the source of this link. -
+ Please ensure you trust the source of this link.{' '} + + {show ? ( +
+ Config files can load arbitrary javascript files via plugins. For + security purposes, we display this message when a cross-origin + config is detected to be loading plugins that are not in our + plugin store +
+ ) : null} +
+ {show ? ( +
+ Sessions can load arbitrary javascript files via session plugins. + For security purposes, we display this message when sessions + contain plugins that are not from our plugin store +
+ ) : null} +