Files
grafana/public/app/features/plugins/pluginSettings.ts
Kristian Bremberg b30f501bff backendsrv: Implement optional URL path fetch sanitize (#106540)
* feat: Implement optional URL path sanitization in BackendSrv methods

* add comment

* revert

* remove namespace import from backendsrv

* change method to validatePath, remove query params and fragments

* Moved validatePath call into fetch and make it throw an error instead

* update pluginSettings tests

* prettier

* Update public/app/features/plugins/pluginSettings.ts

Co-authored-by: Hugo Häggmark <hugo.haggmark@gmail.com>

* change name to validatePath

* fix other tests

* rename property in backend_srv tests

* rename to validatePath in backend_srv, add extra tests

* Move path validation into parseUrlFromOptions

* fix

* Add additional check

* Add test

---------

Co-authored-by: joshhunt <josh.hunt@grafana.com>
Co-authored-by: Hugo Häggmark <hugo.haggmark@gmail.com>
2025-06-20 11:27:53 +01:00

39 lines
1.1 KiB
TypeScript

import { PluginMeta } from '@grafana/data';
import { BackendSrvRequest, getBackendSrv } from '@grafana/runtime';
type PluginCache = {
[key: string]: PluginMeta;
};
const pluginInfoCache: PluginCache = {};
export function getPluginSettings(pluginId: string, options?: Partial<BackendSrvRequest>): Promise<PluginMeta> {
const v = pluginInfoCache[pluginId];
if (v) {
return Promise.resolve(v);
}
return getBackendSrv()
.get(`/api/plugins/${pluginId}/settings`, undefined, undefined, { ...options, validatePath: true })
.then((settings) => {
pluginInfoCache[pluginId] = settings;
return settings;
})
.catch((e) => {
// User does not have access to plugin
if (typeof e === 'object' && e !== null && 'status' in e && e.status === 403) {
e.isHandled = true;
return Promise.reject(e);
}
return Promise.reject(new Error('Unknown Plugin'));
});
}
export const clearPluginSettingsCache = (pluginId?: string) => {
if (pluginId) {
return delete pluginInfoCache[pluginId];
}
// clear all
return Object.keys(pluginInfoCache).forEach((key) => delete pluginInfoCache[key]);
};