diff --git a/docs/plugins/errors.md b/docs/plugins/errors.md index 25f1210aeafb1852777856d94544782ab1bb3246..9958a801c236704ab1ea5157068b2d0e5b988857 100644 --- a/docs/plugins/errors.md +++ b/docs/plugins/errors.md @@ -47,3 +47,5 @@ ## Plugin Errors - **Plugin "..." has crashed. Please contact the plugin developer for assistance**: This error occurs when a plugin encounters an unexpected error and crashes. Users are advised to contact the plugin developer for assistance. + +- **The URL specified in the plugin script does not match the actual script URL provided during the registration or loading process**: This error occurs when the URL specified in the plugin script does not match the script URL provided during the registration or loading process. diff --git a/src/services/pluginsManager/errorMessages.ts b/src/services/pluginsManager/errorMessages.ts index 029b14e0e9f0f6256aca438d65b7e1914b219ff0..4dc1839ea0fd756e1b81ba36e6eb5a5342305bcb 100644 --- a/src/services/pluginsManager/errorMessages.ts +++ b/src/services/pluginsManager/errorMessages.ts @@ -15,3 +15,5 @@ export const ERROR_INVALID_MODEL_ID_TYPE_FOR_RETRIEVAL = export const ERROR_INVALID_EVENT_TYPE = (type: string): string => `Invalid event type: ${type}`; export const ERROR_PLUGIN_CRASH = (pluginName: string): string => `Plugin "${pluginName}" has crashed. Please contact the plugin developer for assistance`; +export const ERROR_PLUGIN_URL_MISMATCH = + 'The URL specified in the plugin script does not match the actual script URL provided during the registration or loading process'; diff --git a/src/services/pluginsManager/pluginsManager.test.ts b/src/services/pluginsManager/pluginsManager.test.ts index f6ef08cecd05c2bcfc9bee92b4af7a5129d7c554..e7908afce0f63f192d9d070be8c323bfdfbfde1e 100644 --- a/src/services/pluginsManager/pluginsManager.test.ts +++ b/src/services/pluginsManager/pluginsManager.test.ts @@ -5,6 +5,7 @@ import { configurationFixture } from '@/models/fixtures/configurationFixture'; import { store } from '@/redux/store'; import { PluginsManager } from './pluginsManager'; import { configurationMapper } from './pluginsManager.utils'; +import { ERROR_PLUGIN_URL_MISMATCH } from './errorMessages'; jest.mock('../../redux/store'); @@ -34,6 +35,7 @@ describe('PluginsManager', () => { afterEach(() => { global.window = originalWindow; + PluginsManager.hashedPlugins = {}; }); afterEach(() => { @@ -84,6 +86,9 @@ describe('PluginsManager', () => { const pluginName = 'TestPlugin'; const pluginVersion = '1.0.0'; const pluginUrl = 'https://example.com/test-plugin.js'; + const pluginScript = 'console.log("Hello, Plugin!");'; + + PluginsManager.setHashedPlugin({ pluginUrl, pluginScript }); const result = PluginsManager.registerPlugin({ pluginName, pluginVersion, pluginUrl }); @@ -126,4 +131,22 @@ describe('PluginsManager', () => { expect(wrapper?.childElementCount).toEqual(ZERO); }); + it('should throw error if plugin url from script does not match actual script url', () => { + const pluginName = 'TestPlugin'; + const pluginVersion = '1.0.0'; + const pluginUrl = 'https://example.com/test-plugin.js'; + const scriptPluginUrl = 'https://example.com/test-plugin.js?param_x'; + const hash = '128ce10ae1b46ec4bc6d7c07278b5c9e'; + PluginsManager.hashedPlugins = { + [pluginUrl]: hash, + }; + + expect(() => + PluginsManager.registerPlugin({ + pluginName, + pluginVersion, + pluginUrl: scriptPluginUrl, + }), + ).toThrow(ERROR_PLUGIN_URL_MISMATCH); + }); }); diff --git a/src/services/pluginsManager/pluginsManager.ts b/src/services/pluginsManager/pluginsManager.ts index bb42708664d32c5d9119619c242337d20839c7d6..03d06d80cb1cf4b086937f1ad647d7f354a1b2c2 100644 --- a/src/services/pluginsManager/pluginsManager.ts +++ b/src/services/pluginsManager/pluginsManager.ts @@ -35,6 +35,7 @@ import { fitBounds } from './map/fitBounds'; import { getOpenMapId } from './map/getOpenMapId'; import { setLegend } from './legend/setLegend'; import { removeLegend } from './legend/removeLegend'; +import { ERROR_PLUGIN_URL_MISMATCH } from './errorMessages'; export const PluginsManager: PluginsManagerType = { hashedPlugins: {}, @@ -115,6 +116,10 @@ export const PluginsManager: PluginsManagerType = { registerPlugin({ pluginName, pluginVersion, pluginUrl }) { const hash = PluginsManager.hashedPlugins[pluginUrl]; + if (!hash) { + throw new Error(ERROR_PLUGIN_URL_MISMATCH); + } + store.dispatch( registerPlugin({ hash,