mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Alerting: Make shareable alert rule link work if rule name contains forward slashes (#75362)
This commit is contained in:
parent
d0592fce2f
commit
aaaef71337
@ -12,6 +12,7 @@ import { RuleViewerLayout } from './components/rule-viewer/RuleViewerLayout';
|
|||||||
import { useCloudCombinedRulesMatching } from './hooks/useCombinedRule';
|
import { useCloudCombinedRulesMatching } from './hooks/useCombinedRule';
|
||||||
import { getRulesSourceByName } from './utils/datasource';
|
import { getRulesSourceByName } from './utils/datasource';
|
||||||
import { createViewLink } from './utils/misc';
|
import { createViewLink } from './utils/misc';
|
||||||
|
import { unescapePathSeparators } from './utils/rule-id';
|
||||||
|
|
||||||
const pageTitle = 'Find rule';
|
const pageTitle = 'Find rule';
|
||||||
const subUrl = config.appSubUrl;
|
const subUrl = config.appSubUrl;
|
||||||
@ -27,8 +28,7 @@ function useRuleFindParams() {
|
|||||||
|
|
||||||
return useMemo(() => {
|
return useMemo(() => {
|
||||||
const segments = location.pathname?.replace(subUrl, '').split('/') ?? []; // ["", "alerting", "{sourceName}", "{name}]
|
const segments = location.pathname?.replace(subUrl, '').split('/') ?? []; // ["", "alerting", "{sourceName}", "{name}]
|
||||||
|
const name = unescapePathSeparators(decodeURIComponent(unescapePathSeparators(segments[3])));
|
||||||
const name = decodeURIComponent(segments[3]);
|
|
||||||
const sourceName = decodeURIComponent(segments[2]);
|
const sourceName = decodeURIComponent(segments[2]);
|
||||||
|
|
||||||
const searchParams = new URLSearchParams(location.search);
|
const searchParams = new URLSearchParams(location.search);
|
||||||
|
@ -4,6 +4,7 @@ import { UrlQueryMap, Labels, DataSourceInstanceSettings, DataSourceJsonData } f
|
|||||||
import { GrafanaEdition } from '@grafana/data/src/types/config';
|
import { GrafanaEdition } from '@grafana/data/src/types/config';
|
||||||
import { config } from '@grafana/runtime';
|
import { config } from '@grafana/runtime';
|
||||||
import { DataSourceRef } from '@grafana/schema';
|
import { DataSourceRef } from '@grafana/schema';
|
||||||
|
import { escapePathSeparators } from 'app/features/alerting/unified/utils/rule-id';
|
||||||
import { alertInstanceKey } from 'app/features/alerting/unified/utils/rules';
|
import { alertInstanceKey } from 'app/features/alerting/unified/utils/rules';
|
||||||
import { SortOrder } from 'app/plugins/panel/alertlist/types';
|
import { SortOrder } from 'app/plugins/panel/alertlist/types';
|
||||||
import { Alert, CombinedRule, FilterState, RulesSource, SilenceFilterState } from 'app/types/unified-alerting';
|
import { Alert, CombinedRule, FilterState, RulesSource, SilenceFilterState } from 'app/types/unified-alerting';
|
||||||
@ -57,7 +58,9 @@ export function createMuteTimingLink(muteTimingName: string, alertManagerSourceN
|
|||||||
|
|
||||||
export function createShareLink(ruleSource: RulesSource, rule: CombinedRule): string {
|
export function createShareLink(ruleSource: RulesSource, rule: CombinedRule): string {
|
||||||
if (isCloudRulesSource(ruleSource)) {
|
if (isCloudRulesSource(ruleSource)) {
|
||||||
return createAbsoluteUrl(`/alerting/${encodeURIComponent(ruleSource.name)}/${encodeURIComponent(rule.name)}/find`);
|
return createAbsoluteUrl(
|
||||||
|
`/alerting/${encodeURIComponent(ruleSource.name)}/${encodeURIComponent(escapePathSeparators(rule.name))}/find`
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return window.location.href.split('?')[0];
|
return window.location.href.split('?')[0];
|
||||||
|
@ -106,11 +106,11 @@ function unescapeDollars(value: string): string {
|
|||||||
* we'll use some non-printable characters from the ASCII table that will get encoded properly but very unlikely
|
* we'll use some non-printable characters from the ASCII table that will get encoded properly but very unlikely
|
||||||
* to ever be used in a rule name or namespace
|
* to ever be used in a rule name or namespace
|
||||||
*/
|
*/
|
||||||
function escapePathSeparators(value: string): string {
|
export function escapePathSeparators(value: string): string {
|
||||||
return value.replace(/\//g, '\x1f').replace(/\\/g, '\x1e');
|
return value.replace(/\//g, '\x1f').replace(/\\/g, '\x1e');
|
||||||
}
|
}
|
||||||
|
|
||||||
function unescapePathSeparators(value: string): string {
|
export function unescapePathSeparators(value: string): string {
|
||||||
return value.replace(/\x1f/g, '/').replace(/\x1e/g, '\\');
|
return value.replace(/\x1f/g, '/').replace(/\x1e/g, '\\');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user