resolves https://github.com/elastic/kibana/issues/79371 resolves https://github.com/elastic/kibana/issues/62928 In this PR, we allow action types to determine how to escape the variables used in their parameters, when rendered as mustache templates. Prior to this, action parameters were recursively rendered as mustache templates using the default mustache templating, by the alerts library. The default mustache templating used html escaping. Action types opt-in to the new capability via a new optional method in the action type, `renderParameterTemplates()`. If not provided, the previous recursive rendering is done, but now with no escaping at all. For #62928, changed the mustache template rendering to be replaced with the error message, if an error occurred, so at least you can now see that an error occurred. Useful to diagnose problems with invalid mustache templates.
67 lines
2.2 KiB
TypeScript
67 lines
2.2 KiB
TypeScript
/*
|
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
* or more contributor license agreements. Licensed under the Elastic License;
|
|
* you may not use this file except in compliance with the Elastic License.
|
|
*/
|
|
|
|
import { actionsClientMock } from './actions_client.mock';
|
|
import { PluginSetupContract, PluginStartContract, renderActionParameterTemplates } from './plugin';
|
|
import { Services } from './types';
|
|
import {
|
|
elasticsearchServiceMock,
|
|
savedObjectsClientMock,
|
|
} from '../../../../src/core/server/mocks';
|
|
import { actionsAuthorizationMock } from './authorization/actions_authorization.mock';
|
|
export { actionsAuthorizationMock };
|
|
export { actionsClientMock };
|
|
|
|
const createSetupMock = () => {
|
|
const mock: jest.Mocked<PluginSetupContract> = {
|
|
registerType: jest.fn(),
|
|
};
|
|
return mock;
|
|
};
|
|
|
|
const createStartMock = () => {
|
|
const mock: jest.Mocked<PluginStartContract> = {
|
|
isActionTypeEnabled: jest.fn(),
|
|
isActionExecutable: jest.fn(),
|
|
getActionsClientWithRequest: jest.fn().mockResolvedValue(actionsClientMock.create()),
|
|
getActionsAuthorizationWithRequest: jest
|
|
.fn()
|
|
.mockReturnValue(actionsAuthorizationMock.create()),
|
|
preconfiguredActions: [],
|
|
renderActionParameterTemplates: jest.fn(),
|
|
};
|
|
return mock;
|
|
};
|
|
|
|
// this is a default renderer that escapes nothing
|
|
export function renderActionParameterTemplatesDefault<RecordType>(
|
|
actionTypeId: string,
|
|
params: Record<string, unknown>,
|
|
variables: Record<string, unknown>
|
|
) {
|
|
return renderActionParameterTemplates(undefined, actionTypeId, params, variables);
|
|
}
|
|
|
|
const createServicesMock = () => {
|
|
const mock: jest.Mocked<
|
|
Services & {
|
|
savedObjectsClient: ReturnType<typeof savedObjectsClientMock.create>;
|
|
}
|
|
> = {
|
|
callCluster: elasticsearchServiceMock.createLegacyScopedClusterClient().callAsCurrentUser,
|
|
getLegacyScopedClusterClient: jest.fn(),
|
|
savedObjectsClient: savedObjectsClientMock.create(),
|
|
scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient().asCurrentUser,
|
|
};
|
|
return mock;
|
|
};
|
|
|
|
export const actionsMock = {
|
|
createServices: createServicesMock,
|
|
createSetup: createSetupMock,
|
|
createStart: createStartMock,
|
|
};
|