From 38dbce7cec8979a6c46fef7f48788664a0fafbc5 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Sun, 2 Feb 2020 18:33:48 -0600 Subject: [PATCH 01/39] Route all our server setup through the plugin Next we'll be trimming down ServerFacade to the final few dependencies, and using our plugin dependencies for the rest. --- x-pack/legacy/plugins/siem/index.ts | 5 +---- x-pack/legacy/plugins/siem/server/plugin.ts | 5 ++++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/x-pack/legacy/plugins/siem/index.ts b/x-pack/legacy/plugins/siem/index.ts index 0a3e447ac64a1..f20ed46e88638 100644 --- a/x-pack/legacy/plugins/siem/index.ts +++ b/x-pack/legacy/plugins/siem/index.ts @@ -32,7 +32,6 @@ import { SIGNALS_INDEX_KEY, } from './common/constants'; import { defaultIndexPattern } from './default_index_pattern'; -import { initServerWithKibana } from './server/kibana.index'; import { DEFAULT_APP_CATEGORIES } from '../../../../src/core/utils'; // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -169,9 +168,7 @@ export const siem = (kibana: any) => { route: route.bind(server), }; // @ts-ignore-next-line: setup.plugins is too loosely typed - plugin(initializerContext).setup(setup.core, setup.plugins); - - initServerWithKibana(initializerContext, serverFacade); + plugin(initializerContext).setup(setup.core, setup.plugins, serverFacade); }, config(Joi: Root) { // See x-pack/plugins/siem/server/config.ts if you're adding another diff --git a/x-pack/legacy/plugins/siem/server/plugin.ts b/x-pack/legacy/plugins/siem/server/plugin.ts index 94314367be59c..340d6ee11faa3 100644 --- a/x-pack/legacy/plugins/siem/server/plugin.ts +++ b/x-pack/legacy/plugins/siem/server/plugin.ts @@ -10,12 +10,14 @@ import { SecurityPluginSetup } from '../../../../plugins/security/server'; import { PluginSetupContract as FeaturesSetupContract } from '../../../../plugins/features/server'; import { initServer } from './init_server'; import { compose } from './lib/compose/kibana'; +import { initServerWithKibana } from './kibana.index'; import { noteSavedObjectType, pinnedEventSavedObjectType, timelineSavedObjectType, ruleStatusSavedObjectType, } from './saved_objects'; +import { ServerFacade } from './types'; export type SiemPluginSecurity = Pick; @@ -36,7 +38,7 @@ export class Plugin { this.logger.debug('Shim plugin initialized'); } - public setup(core: CoreSetup, plugins: PluginsSetup) { + public setup(core: CoreSetup, plugins: PluginsSetup, __legacy: ServerFacade) { this.logger.debug('Shim plugin setup'); plugins.features.registerFeature({ id: this.name, @@ -100,5 +102,6 @@ export class Plugin { const libs = compose(core, plugins, this.context.env); initServer(libs); + initServerWithKibana(this.context, __legacy); } } From b8a7000e4b0bb03f455c6354e0879b758eab8998 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Sun, 2 Feb 2020 21:11:25 -0600 Subject: [PATCH 02/39] Clean up server plugin exports For now, let's try to simplify our typings by exporting our plugin's dependencies from the plugin itself, since we know it already knows about them. --- .../plugins/siem/server/lib/compose/kibana.ts | 5 ++--- .../lib/framework/kibana_framework_adapter.ts | 8 +++----- x-pack/legacy/plugins/siem/server/plugin.ts | 14 +++++++------- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/compose/kibana.ts b/x-pack/legacy/plugins/siem/server/lib/compose/kibana.ts index 30fdf7520a3ed..6d1d31b59051d 100644 --- a/x-pack/legacy/plugins/siem/server/lib/compose/kibana.ts +++ b/x-pack/legacy/plugins/siem/server/lib/compose/kibana.ts @@ -4,8 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { CoreSetup, PluginInitializerContext } from '../../../../../../../src/core/server'; -import { PluginsSetup } from '../../plugin'; +import { CoreSetup, PluginInitializerContext, SetupPlugins } from '../../plugin'; import { Anomalies } from '../anomalies'; import { ElasticsearchAnomaliesAdapter } from '../anomalies/elasticsearch_adapter'; @@ -37,7 +36,7 @@ import { Alerts, ElasticsearchAlertsAdapter } from '../alerts'; export function compose( core: CoreSetup, - plugins: PluginsSetup, + plugins: SetupPlugins, env: PluginInitializerContext['env'] ): AppBackendLibs { const framework = new KibanaBackendFrameworkAdapter(core, plugins, env); diff --git a/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts b/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts index 39f75e6ea36c3..6dcff634681e9 100644 --- a/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts +++ b/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts @@ -9,15 +9,14 @@ import { GraphQLSchema } from 'graphql'; import { runHttpQuery } from 'apollo-server-core'; import { schema as configSchema } from '@kbn/config-schema'; import { - CoreSetup, IRouter, KibanaResponseFactory, RequestHandlerContext, - PluginInitializerContext, KibanaRequest, } from '../../../../../../../src/core/server'; import { IndexPatternsFetcher } from '../../../../../../../src/plugins/data/server'; import { AuthenticatedUser } from '../../../../../../plugins/security/common/model'; +import { CoreSetup, SetupPlugins, PluginInitializerContext } from '../../plugin'; import { RequestFacade } from '../../types'; import { @@ -27,15 +26,14 @@ import { internalFrameworkRequest, WrappableRequest, } from './types'; -import { SiemPluginSecurity, PluginsSetup } from '../../plugin'; export class KibanaBackendFrameworkAdapter implements FrameworkAdapter { public version: string; private isProductionMode: boolean; private router: IRouter; - private security: SiemPluginSecurity; + private security: SetupPlugins['security']; - constructor(core: CoreSetup, plugins: PluginsSetup, env: PluginInitializerContext['env']) { + constructor(core: CoreSetup, plugins: SetupPlugins, env: PluginInitializerContext['env']) { this.version = env.packageInfo.version; this.isProductionMode = env.mode.prod; this.router = core.http.createRouter(); diff --git a/x-pack/legacy/plugins/siem/server/plugin.ts b/x-pack/legacy/plugins/siem/server/plugin.ts index 340d6ee11faa3..2426549980592 100644 --- a/x-pack/legacy/plugins/siem/server/plugin.ts +++ b/x-pack/legacy/plugins/siem/server/plugin.ts @@ -6,8 +6,8 @@ import { i18n } from '@kbn/i18n'; import { CoreSetup, PluginInitializerContext, Logger } from 'src/core/server'; -import { SecurityPluginSetup } from '../../../../plugins/security/server'; -import { PluginSetupContract as FeaturesSetupContract } from '../../../../plugins/features/server'; +import { SecurityPluginSetup as SecuritySetup } from '../../../../plugins/security/server'; +import { PluginSetupContract as FeaturesSetup } from '../../../../plugins/features/server'; import { initServer } from './init_server'; import { compose } from './lib/compose/kibana'; import { initServerWithKibana } from './kibana.index'; @@ -19,11 +19,11 @@ import { } from './saved_objects'; import { ServerFacade } from './types'; -export type SiemPluginSecurity = Pick; +export { CoreSetup, Logger, PluginInitializerContext, ServerFacade }; -export interface PluginsSetup { - features: FeaturesSetupContract; - security: SiemPluginSecurity; +export interface SetupPlugins { + features: FeaturesSetup; + security: SecuritySetup; } export class Plugin { @@ -38,7 +38,7 @@ export class Plugin { this.logger.debug('Shim plugin initialized'); } - public setup(core: CoreSetup, plugins: PluginsSetup, __legacy: ServerFacade) { + public setup(core: CoreSetup, plugins: SetupPlugins, __legacy: ServerFacade) { this.logger.debug('Shim plugin setup'); plugins.features.registerFeature({ id: this.name, From 3d2369090713052c6589354ef5d861a88d53ee3c Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Sun, 2 Feb 2020 21:47:28 -0600 Subject: [PATCH 03/39] Move DE Routes to to conventional location I'm throwing the alerting registration in the plugin for now, too. --- .../plugins/siem/server/kibana.index.ts | 82 ------------------- x-pack/legacy/plugins/siem/server/plugin.ts | 17 +++- .../plugins/siem/server/routes/index.ts | 67 +++++++++++++++ 3 files changed, 82 insertions(+), 84 deletions(-) delete mode 100644 x-pack/legacy/plugins/siem/server/kibana.index.ts create mode 100644 x-pack/legacy/plugins/siem/server/routes/index.ts diff --git a/x-pack/legacy/plugins/siem/server/kibana.index.ts b/x-pack/legacy/plugins/siem/server/kibana.index.ts deleted file mode 100644 index a488db3f0c3d7..0000000000000 --- a/x-pack/legacy/plugins/siem/server/kibana.index.ts +++ /dev/null @@ -1,82 +0,0 @@ -/* - * 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 { PluginInitializerContext } from 'src/core/server'; - -import { signalRulesAlertType } from './lib/detection_engine/signals/signal_rule_alert_type'; -import { createRulesRoute } from './lib/detection_engine/routes/rules/create_rules_route'; -import { createIndexRoute } from './lib/detection_engine/routes/index/create_index_route'; -import { readIndexRoute } from './lib/detection_engine/routes/index/read_index_route'; -import { readRulesRoute } from './lib/detection_engine/routes/rules/read_rules_route'; -import { findRulesRoute } from './lib/detection_engine/routes/rules/find_rules_route'; -import { deleteRulesRoute } from './lib/detection_engine/routes/rules/delete_rules_route'; -import { updateRulesRoute } from './lib/detection_engine/routes/rules/update_rules_route'; -import { setSignalsStatusRoute } from './lib/detection_engine/routes/signals/open_close_signals_route'; -import { querySignalsRoute } from './lib/detection_engine/routes/signals/query_signals_route'; -import { ServerFacade } from './types'; -import { deleteIndexRoute } from './lib/detection_engine/routes/index/delete_index_route'; -import { isAlertExecutor } from './lib/detection_engine/signals/types'; -import { readTagsRoute } from './lib/detection_engine/routes/tags/read_tags_route'; -import { readPrivilegesRoute } from './lib/detection_engine/routes/privileges/read_privileges_route'; -import { addPrepackedRulesRoute } from './lib/detection_engine/routes/rules/add_prepackaged_rules_route'; -import { createRulesBulkRoute } from './lib/detection_engine/routes/rules/create_rules_bulk_route'; -import { updateRulesBulkRoute } from './lib/detection_engine/routes/rules/update_rules_bulk_route'; -import { deleteRulesBulkRoute } from './lib/detection_engine/routes/rules/delete_rules_bulk_route'; -import { importRulesRoute } from './lib/detection_engine/routes/rules/import_rules_route'; -import { exportRulesRoute } from './lib/detection_engine/routes/rules/export_rules_route'; -import { findRulesStatusesRoute } from './lib/detection_engine/routes/rules/find_rules_status_route'; -import { getPrepackagedRulesStatusRoute } from './lib/detection_engine/routes/rules/get_prepackaged_rules_status_route'; - -const APP_ID = 'siem'; - -export const initServerWithKibana = (context: PluginInitializerContext, __legacy: ServerFacade) => { - const logger = context.logger.get('plugins', APP_ID); - const version = context.env.packageInfo.version; - - if (__legacy.plugins.alerting != null) { - const type = signalRulesAlertType({ logger, version }); - if (isAlertExecutor(type)) { - __legacy.plugins.alerting.setup.registerType(type); - } - } - - // Detection Engine Rule routes that have the REST endpoints of /api/detection_engine/rules - // All REST rule creation, deletion, updating, etc... - createRulesRoute(__legacy); - readRulesRoute(__legacy); - updateRulesRoute(__legacy); - deleteRulesRoute(__legacy); - findRulesRoute(__legacy); - - addPrepackedRulesRoute(__legacy); - getPrepackagedRulesStatusRoute(__legacy); - createRulesBulkRoute(__legacy); - updateRulesBulkRoute(__legacy); - deleteRulesBulkRoute(__legacy); - - importRulesRoute(__legacy); - exportRulesRoute(__legacy); - - findRulesStatusesRoute(__legacy); - - // Detection Engine Signals routes that have the REST endpoints of /api/detection_engine/signals - // POST /api/detection_engine/signals/status - // Example usage can be found in siem/server/lib/detection_engine/scripts/signals - setSignalsStatusRoute(__legacy); - querySignalsRoute(__legacy); - - // Detection Engine index routes that have the REST endpoints of /api/detection_engine/index - // All REST index creation, policy management for spaces - createIndexRoute(__legacy); - readIndexRoute(__legacy); - deleteIndexRoute(__legacy); - - // Detection Engine tags routes that have the REST endpoints of /api/detection_engine/tags - readTagsRoute(__legacy); - - // Privileges API to get the generic user privileges - readPrivilegesRoute(__legacy); -}; diff --git a/x-pack/legacy/plugins/siem/server/plugin.ts b/x-pack/legacy/plugins/siem/server/plugin.ts index 2426549980592..4e9e6284ce5d4 100644 --- a/x-pack/legacy/plugins/siem/server/plugin.ts +++ b/x-pack/legacy/plugins/siem/server/plugin.ts @@ -10,7 +10,9 @@ import { SecurityPluginSetup as SecuritySetup } from '../../../../plugins/securi import { PluginSetupContract as FeaturesSetup } from '../../../../plugins/features/server'; import { initServer } from './init_server'; import { compose } from './lib/compose/kibana'; -import { initServerWithKibana } from './kibana.index'; +import { initRoutes } from './routes'; +import { isAlertExecutor } from './lib/detection_engine/signals/types'; +import { signalRulesAlertType } from './lib/detection_engine/signals/signal_rule_alert_type'; import { noteSavedObjectType, pinnedEventSavedObjectType, @@ -40,6 +42,7 @@ export class Plugin { public setup(core: CoreSetup, plugins: SetupPlugins, __legacy: ServerFacade) { this.logger.debug('Shim plugin setup'); + plugins.features.registerFeature({ id: this.name, name: i18n.translate('xpack.siem.featureRegistry.linkSiemTitle', { @@ -100,8 +103,18 @@ export class Plugin { }, }); + if (__legacy.plugins.alerting != null) { + const type = signalRulesAlertType({ + logger: this.logger, + version: this.context.env.packageInfo.version, + }); + if (isAlertExecutor(type)) { + __legacy.plugins.alerting.setup.registerType(type); + } + } + const libs = compose(core, plugins, this.context.env); initServer(libs); - initServerWithKibana(this.context, __legacy); + initRoutes(core, plugins, __legacy); } } diff --git a/x-pack/legacy/plugins/siem/server/routes/index.ts b/x-pack/legacy/plugins/siem/server/routes/index.ts new file mode 100644 index 0000000000000..b04e65ae802c7 --- /dev/null +++ b/x-pack/legacy/plugins/siem/server/routes/index.ts @@ -0,0 +1,67 @@ +/* + * 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 { CoreSetup, SetupPlugins, ServerFacade } from '../plugin'; + +import { createRulesRoute } from '../lib/detection_engine/routes/rules/create_rules_route'; +import { createIndexRoute } from '../lib/detection_engine/routes/index/create_index_route'; +import { readIndexRoute } from '../lib/detection_engine/routes/index/read_index_route'; +import { readRulesRoute } from '../lib/detection_engine/routes/rules/read_rules_route'; +import { findRulesRoute } from '../lib/detection_engine/routes/rules/find_rules_route'; +import { deleteRulesRoute } from '../lib/detection_engine/routes/rules/delete_rules_route'; +import { updateRulesRoute } from '../lib/detection_engine/routes/rules/update_rules_route'; +import { setSignalsStatusRoute } from '../lib/detection_engine/routes/signals/open_close_signals_route'; +import { querySignalsRoute } from '../lib/detection_engine/routes/signals/query_signals_route'; +import { deleteIndexRoute } from '../lib/detection_engine/routes/index/delete_index_route'; +import { readTagsRoute } from '../lib/detection_engine/routes/tags/read_tags_route'; +import { readPrivilegesRoute } from '../lib/detection_engine/routes/privileges/read_privileges_route'; +import { addPrepackedRulesRoute } from '../lib/detection_engine/routes/rules/add_prepackaged_rules_route'; +import { createRulesBulkRoute } from '../lib/detection_engine/routes/rules/create_rules_bulk_route'; +import { updateRulesBulkRoute } from '../lib/detection_engine/routes/rules/update_rules_bulk_route'; +import { deleteRulesBulkRoute } from '../lib/detection_engine/routes/rules/delete_rules_bulk_route'; +import { importRulesRoute } from '../lib/detection_engine/routes/rules/import_rules_route'; +import { exportRulesRoute } from '../lib/detection_engine/routes/rules/export_rules_route'; +import { findRulesStatusesRoute } from '../lib/detection_engine/routes/rules/find_rules_status_route'; +import { getPrepackagedRulesStatusRoute } from '../lib/detection_engine/routes/rules/get_prepackaged_rules_status_route'; + +export const initRoutes = (core: CoreSetup, plugins: SetupPlugins, __legacy: ServerFacade) => { + // Detection Engine Rule routes that have the REST endpoints of /api/detection_engine/rules + // All REST rule creation, deletion, updating, etc...... + createRulesRoute(__legacy); + readRulesRoute(__legacy); + updateRulesRoute(__legacy); + deleteRulesRoute(__legacy); + findRulesRoute(__legacy); + + addPrepackedRulesRoute(__legacy); + getPrepackagedRulesStatusRoute(__legacy); + createRulesBulkRoute(__legacy); + updateRulesBulkRoute(__legacy); + deleteRulesBulkRoute(__legacy); + + importRulesRoute(__legacy); + exportRulesRoute(__legacy); + + findRulesStatusesRoute(__legacy); + + // Detection Engine Signals routes that have the REST endpoints of /api/detection_engine/signals + // POST /api/detection_engine/signals/status + // Example usage can be found in siem/server/lib/detection_engine/scripts/signals + setSignalsStatusRoute(__legacy); + querySignalsRoute(__legacy); + + // Detection Engine index routes that have the REST endpoints of /api/detection_engine/index + // All REST index creation, policy management for spaces + createIndexRoute(__legacy); + readIndexRoute(__legacy); + deleteIndexRoute(__legacy); + + // Detection Engine tags routes that have the REST endpoints of /api/detection_engine/tags + readTagsRoute(__legacy); + + // Privileges API to get the generic user privileges + readPrivilegesRoute(__legacy); +}; From 2e284c523fd3500db1bf9e3f55165c2b4597a65c Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Mon, 3 Feb 2020 19:19:37 -0600 Subject: [PATCH 04/39] Loosen up our RequestFacade Now that we've audited our use of request objects, we can switch to the more friendly LegacyRequest that all our utilities are expecting. LegacyRequest doesn't have plugins, either, so our only remaining errant usage is retrieving clients from it, which we call out explicitly. --- x-pack/legacy/plugins/siem/server/types.ts | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/types.ts b/x-pack/legacy/plugins/siem/server/types.ts index 7c07e63404eaa..554d51a54365a 100644 --- a/x-pack/legacy/plugins/siem/server/types.ts +++ b/x-pack/legacy/plugins/siem/server/types.ts @@ -5,6 +5,7 @@ */ import { Legacy } from 'kibana'; +import { LegacyRequest } from '../../../../../src/core/server'; export interface ServerFacade { config: Legacy.Server['config']; @@ -20,14 +21,9 @@ export interface ServerFacade { route: Legacy.Server['route']; } -export interface RequestFacade { - auth: Legacy.Request['auth']; - getAlertsClient?: Legacy.Request['getAlertsClient']; - getActionsClient?: Legacy.Request['getActionsClient']; - getSavedObjectsClient?: Legacy.Request['getSavedObjectsClient']; - headers: Legacy.Request['headers']; - method: Legacy.Request['method']; - params: Legacy.Request['params']; - payload: unknown; - query: Legacy.Request['query']; +export interface RequestFacade + extends Omit { + getAlertsClient?: LegacyRequest['getAlertsClient']; + getActionsClient?: LegacyRequest['getActionsClient']; + getSavedObjectsClient?: LegacyRequest['getSavedObjectsClient']; } From 7a35eac8ece7c19dcf5df87f56e80d3a0b88ed66 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Mon, 3 Feb 2020 23:07:21 -0600 Subject: [PATCH 05/39] Remove uses of 'src' alias This just threw an error on startup, so I'm fixing all of them to be safe. --- x-pack/legacy/plugins/siem/server/index.ts | 2 +- x-pack/legacy/plugins/siem/server/plugin.ts | 2 +- x-pack/plugins/siem/server/config.ts | 2 +- x-pack/plugins/siem/server/index.ts | 2 +- x-pack/plugins/siem/server/plugin.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/index.ts b/x-pack/legacy/plugins/siem/server/index.ts index 882475390ae98..8513f871cb6c1 100644 --- a/x-pack/legacy/plugins/siem/server/index.ts +++ b/x-pack/legacy/plugins/siem/server/index.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { PluginInitializerContext } from 'src/core/server'; +import { PluginInitializerContext } from '../../../../../src/core/server'; import { Plugin } from './plugin'; export const plugin = (context: PluginInitializerContext) => { diff --git a/x-pack/legacy/plugins/siem/server/plugin.ts b/x-pack/legacy/plugins/siem/server/plugin.ts index 4e9e6284ce5d4..0ea7f1a9be21f 100644 --- a/x-pack/legacy/plugins/siem/server/plugin.ts +++ b/x-pack/legacy/plugins/siem/server/plugin.ts @@ -5,7 +5,7 @@ */ import { i18n } from '@kbn/i18n'; -import { CoreSetup, PluginInitializerContext, Logger } from 'src/core/server'; +import { CoreSetup, PluginInitializerContext, Logger } from '../../../../../src/core/server'; import { SecurityPluginSetup as SecuritySetup } from '../../../../plugins/security/server'; import { PluginSetupContract as FeaturesSetup } from '../../../../plugins/features/server'; import { initServer } from './init_server'; diff --git a/x-pack/plugins/siem/server/config.ts b/x-pack/plugins/siem/server/config.ts index 456646cc825f3..224043c0c6fe5 100644 --- a/x-pack/plugins/siem/server/config.ts +++ b/x-pack/plugins/siem/server/config.ts @@ -6,7 +6,7 @@ import { Observable } from 'rxjs'; import { schema, TypeOf } from '@kbn/config-schema'; -import { PluginInitializerContext } from 'src/core/server'; +import { PluginInitializerContext } from '../../../../src/core/server'; import { SIGNALS_INDEX_KEY, DEFAULT_SIGNALS_INDEX, diff --git a/x-pack/plugins/siem/server/index.ts b/x-pack/plugins/siem/server/index.ts index c675be691b47e..83e2f900a3b90 100644 --- a/x-pack/plugins/siem/server/index.ts +++ b/x-pack/plugins/siem/server/index.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { PluginInitializerContext } from 'src/core/server'; +import { PluginInitializerContext } from '../../../../src/core/server'; import { Plugin } from './plugin'; import { configSchema, ConfigType } from './config'; diff --git a/x-pack/plugins/siem/server/plugin.ts b/x-pack/plugins/siem/server/plugin.ts index 866f4d7575e2f..ccc6aef1452b2 100644 --- a/x-pack/plugins/siem/server/plugin.ts +++ b/x-pack/plugins/siem/server/plugin.ts @@ -6,7 +6,7 @@ import { Observable } from 'rxjs'; -import { CoreSetup, PluginInitializerContext, Logger } from 'src/core/server'; +import { CoreSetup, PluginInitializerContext, Logger } from '../../../../src/core/server'; import { createConfig$, ConfigType } from './config'; export class Plugin { From 5360a875486d52240a3e16fae2715c51fb9fee21 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Mon, 3 Feb 2020 23:26:13 -0600 Subject: [PATCH 06/39] Fix types of our GraphQL requests These come through as new KibanaRequests and not as the LegacyRequest that I had incorrectly typed them as. I'm only caring about the `body` property right now, since that's all we really deal with, and in testing it was all that was populated in our actual requests, too. --- .../plugins/siem/server/lib/events/mock.ts | 3 +-- .../lib/framework/kibana_framework_adapter.ts | 21 +++++++------------ .../siem/server/lib/framework/types.ts | 20 +++--------------- .../plugins/siem/server/lib/hosts/mock.ts | 12 +++-------- .../plugins/siem/server/lib/kpi_hosts/mock.ts | 8 ++----- .../siem/server/lib/kpi_network/mock.ts | 4 +--- .../plugins/siem/server/lib/network/mock.ts | 9 ++++---- .../plugins/siem/server/lib/overview/mock.ts | 8 ++----- .../plugins/siem/server/lib/tls/mock.ts | 4 +--- .../legacy/plugins/siem/server/lib/types.ts | 5 +++++ 10 files changed, 29 insertions(+), 65 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/events/mock.ts b/x-pack/legacy/plugins/siem/server/lib/events/mock.ts index 195c0cd674af5..3eb841cbad411 100644 --- a/x-pack/legacy/plugins/siem/server/lib/events/mock.ts +++ b/x-pack/legacy/plugins/siem/server/lib/events/mock.ts @@ -189,8 +189,7 @@ export const mockOptions: RequestDetailsOptions = { }; export const mockRequest = { - params: {}, - payload: { + body: { operationName: 'GetNetworkTopNFlowQuery', variables: { indexName: 'auditbeat-8.0.0-2019.03.29-000003', diff --git a/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts b/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts index 6dcff634681e9..32a74d25c64cd 100644 --- a/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts +++ b/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts @@ -17,14 +17,12 @@ import { import { IndexPatternsFetcher } from '../../../../../../../src/plugins/data/server'; import { AuthenticatedUser } from '../../../../../../plugins/security/common/model'; import { CoreSetup, SetupPlugins, PluginInitializerContext } from '../../plugin'; -import { RequestFacade } from '../../types'; import { FrameworkAdapter, FrameworkIndexPatternsService, FrameworkRequest, internalFrameworkRequest, - WrappableRequest, } from './types'; export class KibanaBackendFrameworkAdapter implements FrameworkAdapter { @@ -82,7 +80,7 @@ export class KibanaBackendFrameworkAdapter implements FrameworkAdapter { const user = await this.getCurrentUserInfo(request); const gqlResponse = await runHttpQuery([request], { method: 'POST', - options: (req: RequestFacade) => ({ + options: (req: KibanaRequest) => ({ context: { req: wrapRequest(req, context, user) }, schema, }), @@ -116,7 +114,7 @@ export class KibanaBackendFrameworkAdapter implements FrameworkAdapter { const { query } = request; const gqlResponse = await runHttpQuery([request], { method: 'GET', - options: (req: RequestFacade) => ({ + options: (req: KibanaRequest) => ({ context: { req: wrapRequest(req, context, user) }, schema, }), @@ -206,20 +204,15 @@ export class KibanaBackendFrameworkAdapter implements FrameworkAdapter { } } -export function wrapRequest( - req: InternalRequest, +export function wrapRequest( + request: KibanaRequest, context: RequestHandlerContext, user: AuthenticatedUser | null -): FrameworkRequest { - const { auth, params, payload, query } = req; - +): FrameworkRequest { return { - [internalFrameworkRequest]: req, - auth, + [internalFrameworkRequest]: request, + body: request.body, context, - params, - payload, - query, user, }; } diff --git a/x-pack/legacy/plugins/siem/server/lib/framework/types.ts b/x-pack/legacy/plugins/siem/server/lib/framework/types.ts index 67861ce0dcf28..5798e8e40c803 100644 --- a/x-pack/legacy/plugins/siem/server/lib/framework/types.ts +++ b/x-pack/legacy/plugins/siem/server/lib/framework/types.ts @@ -6,9 +6,8 @@ import { IndicesGetMappingParams } from 'elasticsearch'; import { GraphQLSchema } from 'graphql'; -import { RequestAuth } from 'hapi'; -import { RequestHandlerContext } from '../../../../../../../src/core/server'; +import { RequestHandlerContext, KibanaRequest } from '../../../../../../../src/core/server'; import { AuthenticatedUser } from '../../../../../../plugins/security/common/model'; import { ESQuery } from '../../../common/typed_json'; import { @@ -19,7 +18,6 @@ import { TimerangeInput, Maybe, } from '../../graphql/types'; -import { RequestFacade } from '../../types'; export * from '../../utils/typed_resolvers'; @@ -46,24 +44,12 @@ export interface FrameworkAdapter { getIndexPatternsService(req: FrameworkRequest): FrameworkIndexPatternsService; } -export interface FrameworkRequest { - [internalFrameworkRequest]: InternalRequest; +export interface FrameworkRequest extends Pick { + [internalFrameworkRequest]: KibanaRequest; context: RequestHandlerContext; - payload: InternalRequest['payload']; - params: InternalRequest['params']; - query: InternalRequest['query']; - auth: InternalRequest['auth']; user: AuthenticatedUser | null; } -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export interface WrappableRequest { - payload: Payload; - params: Params; - query: Query; - auth: RequestAuth; -} - export interface DatabaseResponse { took: number; timeout: boolean; diff --git a/x-pack/legacy/plugins/siem/server/lib/hosts/mock.ts b/x-pack/legacy/plugins/siem/server/lib/hosts/mock.ts index 66b73742cc45e..6b72c4a5a2843 100644 --- a/x-pack/legacy/plugins/siem/server/lib/hosts/mock.ts +++ b/x-pack/legacy/plugins/siem/server/lib/hosts/mock.ts @@ -49,8 +49,7 @@ export const mockGetHostsOptions: HostsRequestOptions = { }; export const mockGetHostsRequest = { - params: {}, - payload: { + body: { operationName: 'GetHostsTableQuery', variables: { sourceId: 'default', @@ -67,7 +66,6 @@ export const mockGetHostsRequest = { query: 'query GetHostsTableQuery($sourceId: ID!, $timerange: TimerangeInput!, $pagination: PaginationInput!, $sort: HostsSortField!, $filterQuery: String) {\n source(id: $sourceId) {\n id\n Hosts(timerange: $timerange, pagination: $pagination, sort: $sort, filterQuery: $filterQuery) {\n totalCount\n edges {\n node {\n _id\n host {\n id\n name\n os {\n name\n version\n __typename\n }\n __typename\n }\n __typename\n }\n cursor {\n value\n __typename\n }\n __typename\n }\n pageInfo {\n endCursor {\n value\n __typename\n }\n hasNextPage\n __typename\n }\n __typename\n }\n __typename\n }\n}\n', }, - query: {}, }; export const mockGetHostsResponse = { @@ -327,14 +325,12 @@ export const mockGetHostOverviewOptions: HostOverviewRequestOptions = { }; export const mockGetHostOverviewRequest = { - params: {}, - payload: { + body: { operationName: 'GetHostOverviewQuery', variables: { sourceId: 'default', hostName: 'siem-es' }, query: 'query GetHostOverviewQuery($sourceId: ID!, $hostName: String!, $timerange: TimerangeInput!) {\n source(id: $sourceId) {\n id\n HostOverview(hostName: $hostName, timerange: $timerange) {\n _id\n host {\n architecture\n id\n ip\n mac\n name\n os {\n family\n name\n platform\n version\n __typename\n }\n type\n __typename\n }\n cloud {\n instance {\n id\n __typename\n }\n machine {\n type\n __typename\n }\n provider\n region\n __typename\n }\n __typename\n }\n __typename\n }\n}\n', }, - query: {}, }; export const mockGetHostOverviewResponse = { @@ -520,14 +516,12 @@ export const mockGetHostLastFirstSeenOptions: HostLastFirstSeenRequestOptions = }; export const mockGetHostLastFirstSeenRequest = { - params: {}, - payload: { + body: { operationName: 'GetHostLastFirstSeenQuery', variables: { sourceId: 'default', hostName: 'siem-es' }, query: 'query GetHostLastFirstSeenQuery($sourceId: ID!, $hostName: String!) {\n source(id: $sourceId) {\n id\n HostLastFirstSeen(hostName: $hostName) {\n firstSeen\n lastSeen\n __typename\n }\n __typename\n }\n}\n', }, - query: {}, }; export const mockGetHostLastFirstSeenResponse = { diff --git a/x-pack/legacy/plugins/siem/server/lib/kpi_hosts/mock.ts b/x-pack/legacy/plugins/siem/server/lib/kpi_hosts/mock.ts index a1962067f9bec..b82a540900bd0 100644 --- a/x-pack/legacy/plugins/siem/server/lib/kpi_hosts/mock.ts +++ b/x-pack/legacy/plugins/siem/server/lib/kpi_hosts/mock.ts @@ -43,8 +43,7 @@ export const mockKpiHostDetailsOptions: RequestBasicOptions = { }; export const mockKpiHostsRequest = { - params: {}, - payload: { + body: { operationName: 'GetKpiHostsQuery', variables: { sourceId: 'default', @@ -54,12 +53,10 @@ export const mockKpiHostsRequest = { query: 'fragment KpiHostChartFields on KpiHostHistogramData {\n x\n y\n __typename\n}\n\nquery GetKpiHostsQuery($sourceId: ID!, $timerange: TimerangeInput!, $filterQuery: String, $defaultIndex: [String!]!) {\n source(id: $sourceId) {\n id\n KpiHosts(timerange: $timerange, filterQuery: $filterQuery, defaultIndex: $defaultIndex) {\n hosts\n hostsHistogram {\n ...KpiHostChartFields\n __typename\n }\n authSuccess\n authSuccessHistogram {\n ...KpiHostChartFields\n __typename\n }\n authFailure\n authFailureHistogram {\n ...KpiHostChartFields\n __typename\n }\n uniqueSourceIps\n uniqueSourceIpsHistogram {\n ...KpiHostChartFields\n __typename\n }\n uniqueDestinationIps\n uniqueDestinationIpsHistogram {\n ...KpiHostChartFields\n __typename\n }\n __typename\n }\n __typename\n }\n}\n', }, - query: {}, }; export const mockKpiHostDetailsRequest = { - params: {}, - payload: { + body: { operationName: 'GetKpiHostDetailsQuery', variables: { sourceId: 'default', @@ -69,7 +66,6 @@ export const mockKpiHostDetailsRequest = { query: 'fragment KpiHostDetailsChartFields on KpiHostHistogramData {\n x\n y\n __typename\n}\n\nquery GetKpiHostDetailsQuery($sourceId: ID!, $timerange: TimerangeInput!, $filterQuery: String, $defaultIndex: [String!]!, $hostName: String!) {\n source(id: $sourceId) {\n id\n KpiHostDetails(timerange: $timerange, filterQuery: $filterQuery, defaultIndex: $defaultIndex, hostName: $hostName) {\n authSuccess\n authSuccessHistogram {\n ...KpiHostDetailsChartFields\n __typename\n }\n authFailure\n authFailureHistogram {\n ...KpiHostDetailsChartFields\n __typename\n }\n uniqueSourceIps\n uniqueSourceIpsHistogram {\n ...KpiHostDetailsChartFields\n __typename\n }\n uniqueDestinationIps\n uniqueDestinationIpsHistogram {\n ...KpiHostDetailsChartFields\n __typename\n }\n __typename\n }\n __typename\n }\n}\n', }, - query: {}, }; const mockUniqueIpsResponse = { diff --git a/x-pack/legacy/plugins/siem/server/lib/kpi_network/mock.ts b/x-pack/legacy/plugins/siem/server/lib/kpi_network/mock.ts index 5b0601b88c779..7d86769de09f1 100644 --- a/x-pack/legacy/plugins/siem/server/lib/kpi_network/mock.ts +++ b/x-pack/legacy/plugins/siem/server/lib/kpi_network/mock.ts @@ -24,8 +24,7 @@ export const mockOptions: RequestBasicOptions = { }; export const mockRequest = { - params: {}, - payload: { + body: { operationName: 'GetKpiNetworkQuery', variables: { sourceId: 'default', @@ -35,7 +34,6 @@ export const mockRequest = { query: 'fragment KpiNetworkChartFields on KpiNetworkHistogramData {\n x\n y\n __typename\n}\n\nquery GetKpiNetworkQuery($sourceId: ID!, $timerange: TimerangeInput!, $filterQuery: String, $defaultIndex: [String!]!) {\n source(id: $sourceId) {\n id\n KpiNetwork(timerange: $timerange, filterQuery: $filterQuery, defaultIndex: $defaultIndex) {\n networkEvents\n uniqueFlowId\n uniqueSourcePrivateIps\n uniqueSourcePrivateIpsHistogram {\n ...KpiNetworkChartFields\n __typename\n }\n uniqueDestinationPrivateIps\n uniqueDestinationPrivateIpsHistogram {\n ...KpiNetworkChartFields\n __typename\n }\n dnsQueries\n tlsHandshakes\n __typename\n }\n __typename\n }\n}\n', }, - query: {}, }; export const mockResponse = { diff --git a/x-pack/legacy/plugins/siem/server/lib/network/mock.ts b/x-pack/legacy/plugins/siem/server/lib/network/mock.ts index 21b00bf188d20..7ea692f27ef04 100644 --- a/x-pack/legacy/plugins/siem/server/lib/network/mock.ts +++ b/x-pack/legacy/plugins/siem/server/lib/network/mock.ts @@ -59,8 +59,7 @@ export const mockOptions: NetworkTopNFlowRequestOptions = { }; export const mockRequest = { - params: {}, - payload: { + body: { operationName: 'GetNetworkTopNFlowQuery', variables: { filterQuery: '', @@ -1507,10 +1506,10 @@ export const mockOptionsIp: NetworkTopNFlowRequestOptions = { export const mockRequestIp = { ...mockRequest, - payload: { - ...mockRequest.payload, + body: { + ...mockRequest.body, variables: { - ...mockRequest.payload.variables, + ...mockRequest.body.variables, ip: '1.1.1.1', }, }, diff --git a/x-pack/legacy/plugins/siem/server/lib/overview/mock.ts b/x-pack/legacy/plugins/siem/server/lib/overview/mock.ts index 6196f45029313..410b4d90b1e78 100644 --- a/x-pack/legacy/plugins/siem/server/lib/overview/mock.ts +++ b/x-pack/legacy/plugins/siem/server/lib/overview/mock.ts @@ -24,8 +24,7 @@ export const mockOptionsNetwork: RequestBasicOptions = { }; export const mockRequestNetwork = { - params: {}, - payload: { + body: { operationName: 'GetOverviewNetworkQuery', variables: { sourceId: 'default', @@ -35,7 +34,6 @@ export const mockRequestNetwork = { query: 'query GetOverviewNetworkQuery(\n $sourceId: ID!\n $timerange: TimerangeInput!\n $filterQuery: String\n ) {\n source(id: $sourceId) {\n id\n OverviewNetwork(timerange: $timerange, filterQuery: $filterQuery) {\n packetbeatFlow\n packetbeatDNS\n filebeatSuricata\n filebeatZeek\n auditbeatSocket\n }\n }\n }', }, - query: {}, }; export const mockResponseNetwork = { @@ -97,8 +95,7 @@ export const mockOptionsHost: RequestBasicOptions = { }; export const mockRequestHost = { - params: {}, - payload: { + body: { operationName: 'GetOverviewHostQuery', variables: { sourceId: 'default', @@ -108,7 +105,6 @@ export const mockRequestHost = { query: 'query GetOverviewHostQuery(\n $sourceId: ID!\n $timerange: TimerangeInput!\n $filterQuery: String\n ) {\n source(id: $sourceId) {\n id\n OverviewHost(timerange: $timerange, filterQuery: $filterQuery) {\n auditbeatAuditd\n auditbeatFIM\n auditbeatLogin\n auditbeatPackage\n auditbeatProcess\n auditbeatUser\n }\n }\n }', }, - query: {}, }; export const mockResponseHost = { diff --git a/x-pack/legacy/plugins/siem/server/lib/tls/mock.ts b/x-pack/legacy/plugins/siem/server/lib/tls/mock.ts index a81862b6e7e90..4b27d541ec992 100644 --- a/x-pack/legacy/plugins/siem/server/lib/tls/mock.ts +++ b/x-pack/legacy/plugins/siem/server/lib/tls/mock.ts @@ -212,8 +212,7 @@ export const expectedTlsEdges = [ ]; export const mockRequest = { - params: {}, - payload: { + body: { operationName: 'GetTlsQuery', variables: { defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], @@ -229,7 +228,6 @@ export const mockRequest = { query: 'query GetTlsQuery($sourceId: ID!, $filterQuery: String, $flowTarget: FlowTarget!, $ip: String!, $pagination: PaginationInputPaginated!, $sort: TlsSortField!, $timerange: TimerangeInput!, $defaultIndex: [String!]!, $inspect: Boolean!) {\n source(id: $sourceId) {\n id\n Tls(filterQuery: $filterQuery, flowTarget: $flowTarget, ip: $ip, pagination: $pagination, sort: $sort, timerange: $timerange, defaultIndex: $defaultIndex) {\n totalCount\n edges {\n node {\n _id\n alternativeNames\n commonNames\n ja3\n issuerNames\n notAfter\n __typename\n }\n cursor {\n value\n __typename\n }\n __typename\n }\n pageInfo {\n activePage\n fakeTotalCount\n showMorePagesIndicator\n __typename\n }\n inspect @include(if: $inspect) {\n dsl\n response\n __typename\n }\n __typename\n }\n __typename\n }\n}\n', }, - query: {}, }; export const mockResponse = { diff --git a/x-pack/legacy/plugins/siem/server/lib/types.ts b/x-pack/legacy/plugins/siem/server/lib/types.ts index 9034ab4e6af83..34a50cf962412 100644 --- a/x-pack/legacy/plugins/siem/server/lib/types.ts +++ b/x-pack/legacy/plugins/siem/server/lib/types.ts @@ -4,7 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ +import { AuthenticatedUser } from '../../../../../plugins/security/public'; +import { RequestHandlerContext } from '../../../../../../src/core/server'; export { ConfigType as Configuration } from '../../../../../plugins/siem/server'; + import { Anomalies } from './anomalies'; import { Authentications } from './authentications'; import { Events } from './events'; @@ -54,6 +57,8 @@ export interface AppBackendLibs extends AppDomainLibs { export interface SiemContext { req: FrameworkRequest; + context: RequestHandlerContext; + user: AuthenticatedUser | null; } export interface TotalValue { From e41d618c10873b1cf9664dbe234fff5cef4c55c1 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 4 Feb 2020 02:27:52 -0600 Subject: [PATCH 07/39] Initialize our routes with SetupServices We're using the legacy version for now, but ServerFacade will be gone by the end of the migration. --- x-pack/legacy/plugins/siem/server/plugin.ts | 7 ++- .../plugins/siem/server/routes/index.ts | 44 +++++++++---------- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/plugin.ts b/x-pack/legacy/plugins/siem/server/plugin.ts index 0ea7f1a9be21f..29724a7730bfa 100644 --- a/x-pack/legacy/plugins/siem/server/plugin.ts +++ b/x-pack/legacy/plugins/siem/server/plugin.ts @@ -21,13 +21,16 @@ import { } from './saved_objects'; import { ServerFacade } from './types'; -export { CoreSetup, Logger, PluginInitializerContext, ServerFacade }; +export { CoreSetup, Logger, PluginInitializerContext }; export interface SetupPlugins { features: FeaturesSetup; security: SecuritySetup; } +export type SetupServices = CoreSetup & SetupPlugins; +export type LegacySetupServices = SetupServices & ServerFacade; + export class Plugin { readonly name = 'siem'; private readonly logger: Logger; @@ -115,6 +118,6 @@ export class Plugin { const libs = compose(core, plugins, this.context.env); initServer(libs); - initRoutes(core, plugins, __legacy); + initRoutes({ ...core, ...plugins, ...__legacy }); } } diff --git a/x-pack/legacy/plugins/siem/server/routes/index.ts b/x-pack/legacy/plugins/siem/server/routes/index.ts index b04e65ae802c7..3793f6ffdc1e7 100644 --- a/x-pack/legacy/plugins/siem/server/routes/index.ts +++ b/x-pack/legacy/plugins/siem/server/routes/index.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { CoreSetup, SetupPlugins, ServerFacade } from '../plugin'; +import { LegacySetupServices } from '../plugin'; import { createRulesRoute } from '../lib/detection_engine/routes/rules/create_rules_route'; import { createIndexRoute } from '../lib/detection_engine/routes/index/create_index_route'; @@ -27,41 +27,41 @@ import { exportRulesRoute } from '../lib/detection_engine/routes/rules/export_ru import { findRulesStatusesRoute } from '../lib/detection_engine/routes/rules/find_rules_status_route'; import { getPrepackagedRulesStatusRoute } from '../lib/detection_engine/routes/rules/get_prepackaged_rules_status_route'; -export const initRoutes = (core: CoreSetup, plugins: SetupPlugins, __legacy: ServerFacade) => { +export const initRoutes = (services: LegacySetupServices) => { // Detection Engine Rule routes that have the REST endpoints of /api/detection_engine/rules // All REST rule creation, deletion, updating, etc...... - createRulesRoute(__legacy); - readRulesRoute(__legacy); - updateRulesRoute(__legacy); - deleteRulesRoute(__legacy); - findRulesRoute(__legacy); + createRulesRoute(services); + readRulesRoute(services); + updateRulesRoute(services); + deleteRulesRoute(services); + findRulesRoute(services); - addPrepackedRulesRoute(__legacy); - getPrepackagedRulesStatusRoute(__legacy); - createRulesBulkRoute(__legacy); - updateRulesBulkRoute(__legacy); - deleteRulesBulkRoute(__legacy); + addPrepackedRulesRoute(services); + getPrepackagedRulesStatusRoute(services); + createRulesBulkRoute(services); + updateRulesBulkRoute(services); + deleteRulesBulkRoute(services); - importRulesRoute(__legacy); - exportRulesRoute(__legacy); + importRulesRoute(services); + exportRulesRoute(services); - findRulesStatusesRoute(__legacy); + findRulesStatusesRoute(services); // Detection Engine Signals routes that have the REST endpoints of /api/detection_engine/signals // POST /api/detection_engine/signals/status // Example usage can be found in siem/server/lib/detection_engine/scripts/signals - setSignalsStatusRoute(__legacy); - querySignalsRoute(__legacy); + setSignalsStatusRoute(services); + querySignalsRoute(services); // Detection Engine index routes that have the REST endpoints of /api/detection_engine/index // All REST index creation, policy management for spaces - createIndexRoute(__legacy); - readIndexRoute(__legacy); - deleteIndexRoute(__legacy); + createIndexRoute(services); + readIndexRoute(services); + deleteIndexRoute(services); // Detection Engine tags routes that have the REST endpoints of /api/detection_engine/tags - readTagsRoute(__legacy); + readTagsRoute(services); // Privileges API to get the generic user privileges - readPrivilegesRoute(__legacy); + readPrivilegesRoute(services); }; From faf8f77324d65f66777e9b288442efbe55c5b6f0 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 4 Feb 2020 02:42:44 -0600 Subject: [PATCH 08/39] Swap legacy spaces plugin for NP This changes the signature of getIndex, which is used in quite a few places. We'll see how bad that looks in the next commit. --- x-pack/legacy/plugins/siem/index.ts | 1 - .../siem/server/lib/detection_engine/routes/utils.ts | 10 ++++------ x-pack/legacy/plugins/siem/server/plugin.ts | 2 ++ x-pack/legacy/plugins/siem/server/types.ts | 1 - 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/x-pack/legacy/plugins/siem/index.ts b/x-pack/legacy/plugins/siem/index.ts index f20ed46e88638..b6fee25aa129c 100644 --- a/x-pack/legacy/plugins/siem/index.ts +++ b/x-pack/legacy/plugins/siem/index.ts @@ -162,7 +162,6 @@ export const siem = (kibana: any) => { alerting: plugins.alerting, actions: newPlatform.start.plugins.actions, elasticsearch: plugins.elasticsearch, - spaces: plugins.spaces, savedObjects: server.savedObjects.SavedObjectsClient, }, route: route.bind(server), diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts index 416c76b5d4eb5..3557b718912ac 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts @@ -7,6 +7,7 @@ import Boom from 'boom'; import { APP_ID, SIGNALS_INDEX_KEY } from '../../../../common/constants'; import { ServerFacade, RequestFacade } from '../../../types'; +import { LegacySetupServices } from '../../../plugin'; export const transformError = (err: Error & { statusCode?: number }) => { if (Boom.isBoom(err)) { @@ -157,12 +158,9 @@ export const transformBulkError = ( } }; -export const getIndex = ( - request: RequestFacade | Omit, - server: ServerFacade -): string => { - const spaceId = server.plugins.spaces.getSpaceId(request); - const signalsIndex = server.config().get(`xpack.${APP_ID}.${SIGNALS_INDEX_KEY}`); +export const getIndex = (request: RequestFacade, services: LegacySetupServices): string => { + const spaceId = services.spaces.spacesService.getSpaceId(request); + const signalsIndex = services.config().get(`xpack.${APP_ID}.${SIGNALS_INDEX_KEY}`); return `${signalsIndex}-${spaceId}`; }; diff --git a/x-pack/legacy/plugins/siem/server/plugin.ts b/x-pack/legacy/plugins/siem/server/plugin.ts index 29724a7730bfa..0027f16d2c020 100644 --- a/x-pack/legacy/plugins/siem/server/plugin.ts +++ b/x-pack/legacy/plugins/siem/server/plugin.ts @@ -8,6 +8,7 @@ import { i18n } from '@kbn/i18n'; import { CoreSetup, PluginInitializerContext, Logger } from '../../../../../src/core/server'; import { SecurityPluginSetup as SecuritySetup } from '../../../../plugins/security/server'; import { PluginSetupContract as FeaturesSetup } from '../../../../plugins/features/server'; +import { SpacesPluginSetup as SpacesSetup } from '../../../../plugins/spaces/server'; import { initServer } from './init_server'; import { compose } from './lib/compose/kibana'; import { initRoutes } from './routes'; @@ -26,6 +27,7 @@ export { CoreSetup, Logger, PluginInitializerContext }; export interface SetupPlugins { features: FeaturesSetup; security: SecuritySetup; + spaces: SpacesSetup; } export type SetupServices = CoreSetup & SetupPlugins; diff --git a/x-pack/legacy/plugins/siem/server/types.ts b/x-pack/legacy/plugins/siem/server/types.ts index 554d51a54365a..d7e1625ee81bb 100644 --- a/x-pack/legacy/plugins/siem/server/types.ts +++ b/x-pack/legacy/plugins/siem/server/types.ts @@ -15,7 +15,6 @@ export interface ServerFacade { actions: any; // We have to do this at the moment because the types are not compatible alerting?: Legacy.Server['plugins']['alerting']; elasticsearch: Legacy.Server['plugins']['elasticsearch']; - spaces: Legacy.Server['plugins']['spaces']; savedObjects: Legacy.Server['savedObjects']['SavedObjectsClient']; }; route: Legacy.Server['route']; From 9418447da38f4288afcd3ff3d1d90c572c9feb16 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 4 Feb 2020 02:44:13 -0600 Subject: [PATCH 09/39] Remove unneeded typing We're already ignoring another portion of the platform shim due to it being incompatibly typed, so we might as well remove this. --- x-pack/legacy/plugins/siem/index.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/x-pack/legacy/plugins/siem/index.ts b/x-pack/legacy/plugins/siem/index.ts index b6fee25aa129c..b4c5e3a98f61d 100644 --- a/x-pack/legacy/plugins/siem/index.ts +++ b/x-pack/legacy/plugins/siem/index.ts @@ -10,7 +10,6 @@ import { resolve } from 'path'; import { Server } from 'hapi'; import { Root } from 'joi'; -import { PluginInitializerContext } from '../../../../src/core/server'; import { plugin } from './server'; import { savedObjectMappings } from './server/saved_objects'; @@ -152,7 +151,7 @@ export const siem = (kibana: any) => { init(server: Server) { const { config, newPlatform, plugins, route } = server; const { coreContext, env, setup } = newPlatform; - const initializerContext = { ...coreContext, env } as PluginInitializerContext; + const initializerContext = { ...coreContext, env }; const serverFacade = { config, usingEphemeralEncryptionKey: @@ -166,7 +165,7 @@ export const siem = (kibana: any) => { }, route: route.bind(server), }; - // @ts-ignore-next-line: setup.plugins is too loosely typed + // @ts-ignore-next-line: NewPlatform shim is too loosely typed plugin(initializerContext).setup(setup.core, setup.plugins, serverFacade); }, config(Joi: Root) { From 80c58264a6d27cb7adad40394a29474f7f84e246 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 4 Feb 2020 15:24:25 -0600 Subject: [PATCH 10/39] WIP: Converting our DE routes to use consolidated services This contains our legacy stuff for now. Eventually, it will only be our NP services. This breaks a few tests due to the way createMockServer works, but I'll clean that up momentarily. --- .../routes/__mocks__/_mock_server.ts | 14 +++++++---- .../routes/index/create_index_route.ts | 12 +++++----- .../routes/index/delete_index_route.ts | 12 +++++----- .../routes/index/read_index_route.ts | 12 +++++----- .../privileges/read_privileges_route.ts | 14 +++++------ .../rules/add_prepackaged_rules_route.ts | 16 ++++++------- .../routes/rules/create_rules_bulk_route.ts | 16 ++++++------- .../routes/rules/create_rules_route.ts | 16 ++++++------- .../routes/rules/delete_rules_bulk_route.ts | 12 +++++----- .../routes/rules/delete_rules_route.ts | 14 +++++------ .../routes/rules/export_rules_route.ts | 10 ++++---- .../routes/rules/find_rules_route.ts | 6 ++--- .../routes/rules/find_rules_status_route.ts | 8 +++---- .../get_prepackaged_rules_status_route.ts | 6 ++--- .../routes/rules/import_rules_route.ts | 23 ++++++++++--------- .../routes/rules/read_rules_route.ts | 6 ++--- .../routes/rules/update_rules_bulk_route.ts | 12 +++++----- .../routes/rules/update_rules_route.ts | 12 +++++----- .../signals/open_close_signals_route.ts | 12 +++++----- .../routes/signals/query_signals_route.ts | 12 +++++----- .../routes/tags/read_tags_route.ts | 6 ++--- x-pack/legacy/plugins/siem/server/plugin.ts | 4 ++-- x-pack/legacy/plugins/siem/server/types.ts | 7 +----- 23 files changed, 132 insertions(+), 130 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts index 5b85012fd9f08..6f177424804dd 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts @@ -10,8 +10,10 @@ import { ElasticsearchPlugin } from 'src/legacy/core_plugins/elasticsearch'; import { savedObjectsClientMock } from '../../../../../../../../../src/core/server/mocks'; import { alertsClientMock } from '../../../../../../alerting/server/alerts_client.mock'; import { actionsClientMock } from '../../../../../../../../plugins/actions/server/mocks'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { spacesServiceMock } from '../../../../../../../../plugins/spaces/server/spaces_service/spaces_service.mock'; import { APP_ID, SIGNALS_INDEX_KEY } from '../../../../../common/constants'; -import { ServerFacade } from '../../../../types'; +import { LegacySetupServices } from '../../../../plugin'; const defaultConfig = { 'kibana.index': '.kibana', @@ -52,6 +54,7 @@ export const createMockServer = (config: Record = defaultConfig) const actionsClient = actionsClientMock.create(); const alertsClient = alertsClientMock.create(); const savedObjectsClient = savedObjectsClientMock.create(); + const spaces = spacesServiceMock.createSetupContract(); const elasticsearch = { getCluster: jest.fn().mockImplementation(() => ({ callWithRequest: jest.fn(), @@ -59,14 +62,15 @@ export const createMockServer = (config: Record = defaultConfig) }; server.decorate('request', 'getAlertsClient', () => alertsClient); server.plugins.elasticsearch = (elasticsearch as unknown) as ElasticsearchPlugin; - server.plugins.spaces = { getSpaceId: () => 'default' }; server.plugins.actions = { getActionsClientWithRequest: () => actionsClient, // eslint-disable-next-line @typescript-eslint/no-explicit-any } as any; // The types have really bad conflicts at the moment so I have to use any server.decorate('request', 'getSavedObjectsClient', () => savedObjectsClient); + return { - server: server as ServerFacade & Hapi.Server, + server, + spaces, alertsClient, actionsClient, elasticsearch, @@ -90,10 +94,12 @@ export const createMockServerWithoutAlertClientDecoration = ( } as any; // The types have really bad conflicts at the moment so I have to use any const actionsClient = actionsClientMock.create(); + const spaces = spacesServiceMock.createSetupContract(); return { - serverWithoutAlertClient: serverWithoutAlertClient as ServerFacade & Hapi.Server, + serverWithoutAlertClient, actionsClient, + spaces, }; }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts index 0eb090179b192..20def83e8e7b2 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts @@ -9,7 +9,7 @@ import Boom from 'boom'; import { DETECTION_ENGINE_INDEX_URL } from '../../../../../common/constants'; import signalsPolicy from './signals_policy.json'; -import { ServerFacade, RequestFacade } from '../../../../types'; +import { LegacySetupServices, RequestFacade } from '../../../../plugin'; import { transformError, getIndex, callWithRequestFactory } from '../utils'; import { getIndexExists } from '../../index/get_index_exists'; import { getPolicyExists } from '../../index/get_policy_exists'; @@ -19,7 +19,7 @@ import { getSignalsTemplate } from './get_signals_template'; import { getTemplateExists } from '../../index/get_template_exists'; import { createBootstrapIndex } from '../../index/create_bootstrap_index'; -export const createCreateIndexRoute = (server: ServerFacade): Hapi.ServerRoute => { +export const createCreateIndexRoute = (services: LegacySetupServices): Hapi.ServerRoute => { return { method: 'POST', path: DETECTION_ENGINE_INDEX_URL, @@ -33,8 +33,8 @@ export const createCreateIndexRoute = (server: ServerFacade): Hapi.ServerRoute = }, async handler(request: RequestFacade) { try { - const index = getIndex(request, server); - const callWithRequest = callWithRequestFactory(request, server); + const index = getIndex(request, services); + const callWithRequest = callWithRequestFactory(request, services); const indexExists = await getIndexExists(callWithRequest, index); if (indexExists) { return new Boom(`index: "${index}" already exists`, { statusCode: 409 }); @@ -58,6 +58,6 @@ export const createCreateIndexRoute = (server: ServerFacade): Hapi.ServerRoute = }; }; -export const createIndexRoute = (server: ServerFacade) => { - server.route(createCreateIndexRoute(server)); +export const createIndexRoute = (services: LegacySetupServices) => { + services.route(createCreateIndexRoute(services)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts index 82fe0f55215fb..8dc283ef45f5c 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts @@ -8,7 +8,7 @@ import Hapi from 'hapi'; import Boom from 'boom'; import { DETECTION_ENGINE_INDEX_URL } from '../../../../../common/constants'; -import { ServerFacade, RequestFacade } from '../../../../types'; +import { LegacySetupServices, RequestFacade } from '../../../../plugin'; import { transformError, getIndex, callWithRequestFactory } from '../utils'; import { getIndexExists } from '../../index/get_index_exists'; import { getPolicyExists } from '../../index/get_policy_exists'; @@ -27,7 +27,7 @@ import { deleteTemplate } from '../../index/delete_template'; * * And ensuring they're all gone */ -export const createDeleteIndexRoute = (server: ServerFacade): Hapi.ServerRoute => { +export const createDeleteIndexRoute = (services: LegacySetupServices): Hapi.ServerRoute => { return { method: 'DELETE', path: DETECTION_ENGINE_INDEX_URL, @@ -41,8 +41,8 @@ export const createDeleteIndexRoute = (server: ServerFacade): Hapi.ServerRoute = }, async handler(request: RequestFacade) { try { - const index = getIndex(request, server); - const callWithRequest = callWithRequestFactory(request, server); + const index = getIndex(request, services); + const callWithRequest = callWithRequestFactory(request, services); const indexExists = await getIndexExists(callWithRequest, index); if (!indexExists) { return new Boom(`index: "${index}" does not exist`, { statusCode: 404 }); @@ -65,6 +65,6 @@ export const createDeleteIndexRoute = (server: ServerFacade): Hapi.ServerRoute = }; }; -export const deleteIndexRoute = (server: ServerFacade) => { - server.route(createDeleteIndexRoute(server)); +export const deleteIndexRoute = (services: LegacySetupServices) => { + services.route(createDeleteIndexRoute(services)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts index a8c4b7407c448..5fa7fa01c5a4b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts @@ -8,11 +8,11 @@ import Hapi from 'hapi'; import Boom from 'boom'; import { DETECTION_ENGINE_INDEX_URL } from '../../../../../common/constants'; -import { ServerFacade, RequestFacade } from '../../../../types'; +import { LegacySetupServices, RequestFacade } from '../../../../plugin'; import { transformError, getIndex, callWithRequestFactory } from '../utils'; import { getIndexExists } from '../../index/get_index_exists'; -export const createReadIndexRoute = (server: ServerFacade): Hapi.ServerRoute => { +export const createReadIndexRoute = (services: LegacySetupServices): Hapi.ServerRoute => { return { method: 'GET', path: DETECTION_ENGINE_INDEX_URL, @@ -26,8 +26,8 @@ export const createReadIndexRoute = (server: ServerFacade): Hapi.ServerRoute => }, async handler(request: RequestFacade, headers) { try { - const index = getIndex(request, server); - const callWithRequest = callWithRequestFactory(request, server); + const index = getIndex(request, services); + const callWithRequest = callWithRequestFactory(request, services); const indexExists = await getIndexExists(callWithRequest, index); if (indexExists) { // head request is used for if you want to get if the index exists @@ -52,6 +52,6 @@ export const createReadIndexRoute = (server: ServerFacade): Hapi.ServerRoute => }; }; -export const readIndexRoute = (server: ServerFacade) => { - server.route(createReadIndexRoute(server)); +export const readIndexRoute = (services: LegacySetupServices) => { + services.route(createReadIndexRoute(services)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts index 5ea4dc7595b2b..637bc9c10b7f0 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts @@ -8,11 +8,11 @@ import Hapi from 'hapi'; import { merge } from 'lodash/fp'; import { DETECTION_ENGINE_PRIVILEGES_URL } from '../../../../../common/constants'; import { RulesRequest } from '../../rules/types'; -import { ServerFacade } from '../../../../types'; +import { LegacySetupServices } from '../../../../plugin'; import { callWithRequestFactory, transformError, getIndex } from '../utils'; import { readPrivileges } from '../../privileges/read_privileges'; -export const createReadPrivilegesRulesRoute = (server: ServerFacade): Hapi.ServerRoute => { +export const createReadPrivilegesRulesRoute = (services: LegacySetupServices): Hapi.ServerRoute => { return { method: 'GET', path: DETECTION_ENGINE_PRIVILEGES_URL, @@ -26,10 +26,10 @@ export const createReadPrivilegesRulesRoute = (server: ServerFacade): Hapi.Serve }, async handler(request: RulesRequest) { try { - const callWithRequest = callWithRequestFactory(request, server); - const index = getIndex(request, server); + const callWithRequest = callWithRequestFactory(request, services); + const index = getIndex(request, services); const permissions = await readPrivileges(callWithRequest, index); - const usingEphemeralEncryptionKey = server.usingEphemeralEncryptionKey; + const usingEphemeralEncryptionKey = services.usingEphemeralEncryptionKey; return merge(permissions, { is_authenticated: request?.auth?.isAuthenticated ?? false, has_encryption_key: !usingEphemeralEncryptionKey, @@ -41,6 +41,6 @@ export const createReadPrivilegesRulesRoute = (server: ServerFacade): Hapi.Serve }; }; -export const readPrivilegesRoute = (server: ServerFacade): void => { - server.route(createReadPrivilegesRulesRoute(server)); +export const readPrivilegesRoute = (services: LegacySetupServices): void => { + services.route(createReadPrivilegesRulesRoute(services)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts index 28af530272bc7..38076aad59f43 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts @@ -9,7 +9,7 @@ import { isFunction } from 'lodash/fp'; import Boom from 'boom'; import { DETECTION_ENGINE_PREPACKAGED_URL } from '../../../../../common/constants'; -import { ServerFacade, RequestFacade } from '../../../../types'; +import { LegacySetupServices, RequestFacade } from '../../../../plugin'; import { getIndexExists } from '../../index/get_index_exists'; import { callWithRequestFactory, getIndex, transformError } from '../utils'; import { getPrepackagedRules } from '../../rules/get_prepackaged_rules'; @@ -20,7 +20,7 @@ import { getRulesToUpdate } from '../../rules/get_rules_to_update'; import { getExistingPrepackagedRules } from '../../rules/get_existing_prepackaged_rules'; import { KibanaRequest } from '../../../../../../../../../src/core/server'; -export const createAddPrepackedRulesRoute = (server: ServerFacade): Hapi.ServerRoute => { +export const createAddPrepackedRulesRoute = (services: LegacySetupServices): Hapi.ServerRoute => { return { method: 'PUT', path: DETECTION_ENGINE_PREPACKAGED_URL, @@ -34,8 +34,8 @@ export const createAddPrepackedRulesRoute = (server: ServerFacade): Hapi.ServerR }, async handler(request: RequestFacade, headers) { const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const actionsClient = await server.plugins.actions.getActionsClientWithRequest( - KibanaRequest.from((request as unknown) as Hapi.Request) + const actionsClient = await services.plugins.actions.getActionsClientWithRequest( + KibanaRequest.from(request) ); const savedObjectsClient = isFunction(request.getSavedObjectsClient) ? request.getSavedObjectsClient() @@ -45,14 +45,14 @@ export const createAddPrepackedRulesRoute = (server: ServerFacade): Hapi.ServerR } try { - const callWithRequest = callWithRequestFactory(request, server); + const callWithRequest = callWithRequestFactory(request, services); const rulesFromFileSystem = getPrepackagedRules(); const prepackagedRules = await getExistingPrepackagedRules({ alertsClient }); const rulesToInstall = getRulesToInstall(rulesFromFileSystem, prepackagedRules); const rulesToUpdate = getRulesToUpdate(rulesFromFileSystem, prepackagedRules); - const spaceIndex = getIndex(request, server); + const spaceIndex = getIndex(request, services); if (rulesToInstall.length !== 0 || rulesToUpdate.length !== 0) { const spaceIndexExists = await getIndexExists(callWithRequest, spaceIndex); if (!spaceIndexExists) { @@ -82,6 +82,6 @@ export const createAddPrepackedRulesRoute = (server: ServerFacade): Hapi.ServerR }; }; -export const addPrepackedRulesRoute = (server: ServerFacade): void => { - server.route(createAddPrepackedRulesRoute(server)); +export const addPrepackedRulesRoute = (services: LegacySetupServices): void => { + services.route(createAddPrepackedRulesRoute(services)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts index 0ffa61e2e2bed..994216ac799ab 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts @@ -10,7 +10,7 @@ import uuid from 'uuid'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { createRules } from '../../rules/create_rules'; import { BulkRulesRequest } from '../../rules/types'; -import { ServerFacade } from '../../../../types'; +import { LegacySetupServices } from '../../../../plugin'; import { readRules } from '../../rules/read_rules'; import { transformOrBulkError } from './utils'; import { getIndexExists } from '../../index/get_index_exists'; @@ -23,7 +23,7 @@ import { import { createRulesBulkSchema } from '../schemas/create_rules_bulk_schema'; import { KibanaRequest } from '../../../../../../../../../src/core/server'; -export const createCreateRulesBulkRoute = (server: ServerFacade): Hapi.ServerRoute => { +export const createCreateRulesBulkRoute = (services: LegacySetupServices): Hapi.ServerRoute => { return { method: 'POST', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_create`, @@ -38,8 +38,8 @@ export const createCreateRulesBulkRoute = (server: ServerFacade): Hapi.ServerRou }, async handler(request: BulkRulesRequest, headers) { const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const actionsClient = await server.plugins.actions.getActionsClientWithRequest( - KibanaRequest.from((request as unknown) as Hapi.Request) + const actionsClient = await services.plugins.actions.getActionsClientWithRequest( + KibanaRequest.from(request) ); const savedObjectsClient = isFunction(request.getSavedObjectsClient) ? request.getSavedObjectsClient() @@ -79,8 +79,8 @@ export const createCreateRulesBulkRoute = (server: ServerFacade): Hapi.ServerRou } = payloadRule; const ruleIdOrUuid = ruleId ?? uuid.v4(); try { - const finalIndex = outputIndex != null ? outputIndex : getIndex(request, server); - const callWithRequest = callWithRequestFactory(request, server); + const finalIndex = outputIndex != null ? outputIndex : getIndex(request, services); + const callWithRequest = callWithRequestFactory(request, services); const indexExists = await getIndexExists(callWithRequest, finalIndex); if (!indexExists) { return createBulkErrorObject({ @@ -140,6 +140,6 @@ export const createCreateRulesBulkRoute = (server: ServerFacade): Hapi.ServerRou }; }; -export const createRulesBulkRoute = (server: ServerFacade): void => { - server.route(createCreateRulesBulkRoute(server)); +export const createRulesBulkRoute = (services: LegacySetupServices): void => { + services.route(createCreateRulesBulkRoute(services)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts index ec1df238f9483..ea8f7a00f2afd 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts @@ -12,7 +12,7 @@ import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { createRules } from '../../rules/create_rules'; import { RulesRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { createRulesSchema } from '../schemas/create_rules_schema'; -import { ServerFacade } from '../../../../types'; +import { LegacySetupServices } from '../../../../plugin'; import { readRules } from '../../rules/read_rules'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { transformOrError } from './utils'; @@ -20,7 +20,7 @@ import { getIndexExists } from '../../index/get_index_exists'; import { callWithRequestFactory, getIndex, transformError } from '../utils'; import { KibanaRequest } from '../../../../../../../../../src/core/server'; -export const createCreateRulesRoute = (server: ServerFacade): Hapi.ServerRoute => { +export const createCreateRulesRoute = (services: LegacySetupServices): Hapi.ServerRoute => { return { method: 'POST', path: DETECTION_ENGINE_RULES_URL, @@ -61,8 +61,8 @@ export const createCreateRulesRoute = (server: ServerFacade): Hapi.ServerRoute = references, } = request.payload; const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const actionsClient = await server.plugins.actions.getActionsClientWithRequest( - KibanaRequest.from((request as unknown) as Hapi.Request) + const actionsClient = await services.plugins.actions.getActionsClientWithRequest( + KibanaRequest.from(request) ); const savedObjectsClient = isFunction(request.getSavedObjectsClient) ? request.getSavedObjectsClient() @@ -72,8 +72,8 @@ export const createCreateRulesRoute = (server: ServerFacade): Hapi.ServerRoute = } try { - const finalIndex = outputIndex != null ? outputIndex : getIndex(request, server); - const callWithRequest = callWithRequestFactory(request, server); + const finalIndex = outputIndex != null ? outputIndex : getIndex(request, services); + const callWithRequest = callWithRequestFactory(request, services); const indexExists = await getIndexExists(callWithRequest, finalIndex); if (!indexExists) { return Boom.badRequest( @@ -134,6 +134,6 @@ export const createCreateRulesRoute = (server: ServerFacade): Hapi.ServerRoute = }; }; -export const createRulesRoute = (server: ServerFacade): void => { - server.route(createCreateRulesRoute(server)); +export const createRulesRoute = (services: LegacySetupServices): void => { + services.route(createCreateRulesRoute(services)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts index c2b5576c09183..3ffb931cb8419 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts @@ -9,7 +9,7 @@ import { isFunction } from 'lodash/fp'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { deleteRules } from '../../rules/delete_rules'; -import { ServerFacade } from '../../../../types'; +import { LegacySetupServices } from '../../../../plugin'; import { queryRulesBulkSchema } from '../schemas/query_rules_bulk_schema'; import { transformOrBulkError, getIdBulkError } from './utils'; import { transformBulkError } from '../utils'; @@ -17,7 +17,7 @@ import { QueryBulkRequest, IRuleSavedAttributesSavedObjectAttributes } from '../ import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { KibanaRequest } from '../../../../../../../../../src/core/server'; -export const createDeleteRulesBulkRoute = (server: ServerFacade): Hapi.ServerRoute => { +export const createDeleteRulesBulkRoute = (services: LegacySetupServices): Hapi.ServerRoute => { return { method: ['POST', 'DELETE'], // allow both POST and DELETE in case their client does not support bodies in DELETE path: `${DETECTION_ENGINE_RULES_URL}/_bulk_delete`, @@ -32,8 +32,8 @@ export const createDeleteRulesBulkRoute = (server: ServerFacade): Hapi.ServerRou }, async handler(request: QueryBulkRequest, headers) { const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const actionsClient = await server.plugins.actions.getActionsClientWithRequest( - KibanaRequest.from((request as unknown) as Hapi.Request) + const actionsClient = await services.plugins.actions.getActionsClientWithRequest( + KibanaRequest.from(request) ); const savedObjectsClient = isFunction(request.getSavedObjectsClient) ? request.getSavedObjectsClient() @@ -78,6 +78,6 @@ export const createDeleteRulesBulkRoute = (server: ServerFacade): Hapi.ServerRou }; }; -export const deleteRulesBulkRoute = (server: ServerFacade): void => { - server.route(createDeleteRulesBulkRoute(server)); +export const deleteRulesBulkRoute = (services: LegacySetupServices): void => { + services.route(createDeleteRulesBulkRoute(services)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts index 33f181cfbb5a5..3d16519e98cbb 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts @@ -9,15 +9,15 @@ import { isFunction } from 'lodash/fp'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { deleteRules } from '../../rules/delete_rules'; -import { ServerFacade } from '../../../../types'; +import { LegacySetupServices } from '../../../../plugin'; import { queryRulesSchema } from '../schemas/query_rules_schema'; import { getIdError, transformOrError } from './utils'; import { transformError } from '../utils'; import { QueryRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; -import { KibanaRequest } from '../../../../../../../../../src/core/server'; +import { KibanaRequest, LegacyRequest } from '../../../../../../../../../src/core/server'; -export const createDeleteRulesRoute = (server: ServerFacade): Hapi.ServerRoute => { +export const createDeleteRulesRoute = (services: LegacySetupServices): Hapi.ServerRoute => { return { method: 'DELETE', path: DETECTION_ENGINE_RULES_URL, @@ -33,8 +33,8 @@ export const createDeleteRulesRoute = (server: ServerFacade): Hapi.ServerRoute = async handler(request: QueryRequest, headers) { const { id, rule_id: ruleId } = request.query; const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const actionsClient = await server.plugins.actions.getActionsClientWithRequest( - KibanaRequest.from((request as unknown) as Hapi.Request) + const actionsClient = await services.plugins.actions.getActionsClientWithRequest( + KibanaRequest.from((request as unknown) as LegacyRequest) ); const savedObjectsClient = isFunction(request.getSavedObjectsClient) ? request.getSavedObjectsClient() @@ -73,6 +73,6 @@ export const createDeleteRulesRoute = (server: ServerFacade): Hapi.ServerRoute = }; }; -export const deleteRulesRoute = (server: ServerFacade): void => { - server.route(createDeleteRulesRoute(server)); +export const deleteRulesRoute = (services: LegacySetupServices): void => { + services.route(createDeleteRulesRoute(services)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts index ce62469342883..b2b677370be97 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts @@ -9,13 +9,13 @@ import Hapi from 'hapi'; import { isFunction } from 'lodash/fp'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { ExportRulesRequest } from '../../rules/types'; -import { ServerFacade } from '../../../../types'; +import { LegacySetupServices } from '../../../../plugin'; import { getNonPackagedRulesCount } from '../../rules/get_existing_prepackaged_rules'; import { exportRulesSchema, exportRulesQuerySchema } from '../schemas/export_rules_schema'; import { getExportByObjectIds } from '../../rules/get_export_by_object_ids'; import { getExportAll } from '../../rules/get_export_all'; -export const createExportRulesRoute = (server: ServerFacade): Hapi.ServerRoute => { +export const createExportRulesRoute = (services: LegacySetupServices): Hapi.ServerRoute => { return { method: 'POST', path: `${DETECTION_ENGINE_RULES_URL}/_export`, @@ -37,7 +37,7 @@ export const createExportRulesRoute = (server: ServerFacade): Hapi.ServerRoute = } try { - const exportSizeLimit = server.config().get('savedObjects.maxImportExportSize'); + const exportSizeLimit = services.config().get('savedObjects.maxImportExportSize'); if (request.payload?.objects != null && request.payload.objects.length > exportSizeLimit) { return Boom.badRequest(`Can't export more than ${exportSizeLimit} rules`); } else { @@ -66,6 +66,6 @@ export const createExportRulesRoute = (server: ServerFacade): Hapi.ServerRoute = }; }; -export const exportRulesRoute = (server: ServerFacade): void => { - server.route(createExportRulesRoute(server)); +export const exportRulesRoute = (services: LegacySetupServices): void => { + services.route(createExportRulesRoute(services)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts index 5b12703590407..befa27028cccd 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts @@ -10,7 +10,7 @@ import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { findRules } from '../../rules/find_rules'; import { FindRulesRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { findRulesSchema } from '../schemas/find_rules_schema'; -import { ServerFacade } from '../../../../types'; +import { LegacySetupServices } from '../../../../plugin'; import { transformFindAlertsOrError } from './utils'; import { transformError } from '../utils'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; @@ -70,6 +70,6 @@ export const createFindRulesRoute = (): Hapi.ServerRoute => { }; }; -export const findRulesRoute = (server: ServerFacade) => { - server.route(createFindRulesRoute()); +export const findRulesRoute = (services: LegacySetupServices) => { + services.route(createFindRulesRoute()); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts index 8b3113a044b5a..bbb34f0a0e0cc 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts @@ -8,7 +8,7 @@ import Hapi from 'hapi'; import { isFunction, snakeCase } from 'lodash/fp'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { ServerFacade } from '../../../../types'; +import { LegacySetupServices } from '../../../../plugin'; import { findRulesStatusesSchema } from '../schemas/find_rules_statuses_schema'; import { FindRulesStatusesRequest, @@ -53,7 +53,7 @@ export const createFindRulesStatusRoute: Hapi.ServerRoute = { // build return object with ids as keys and errors as values. /* looks like this - { + { "someAlertId": [{"myerrorobject": "some error value"}, etc..], "anotherAlertId": ... } @@ -88,6 +88,6 @@ export const createFindRulesStatusRoute: Hapi.ServerRoute = { }, }; -export const findRulesStatusesRoute = (server: ServerFacade): void => { - server.route(createFindRulesStatusRoute); +export const findRulesStatusesRoute = (services: LegacySetupServices): void => { + services.route(createFindRulesStatusRoute); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts index ab6ee8e97a70f..6777a612cc3fc 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts @@ -8,7 +8,7 @@ import Hapi from 'hapi'; import { isFunction } from 'lodash/fp'; import { DETECTION_ENGINE_PREPACKAGED_URL } from '../../../../../common/constants'; -import { ServerFacade, RequestFacade } from '../../../../types'; +import { LegacySetupServices, RequestFacade } from '../../../../plugin'; import { transformError } from '../utils'; import { getPrepackagedRules } from '../../rules/get_prepackaged_rules'; import { getRulesToInstall } from '../../rules/get_rules_to_install'; @@ -61,6 +61,6 @@ export const createGetPrepackagedRulesStatusRoute = (): Hapi.ServerRoute => { }; }; -export const getPrepackagedRulesStatusRoute = (server: ServerFacade): void => { - server.route(createGetPrepackagedRulesStatusRoute()); +export const getPrepackagedRulesStatusRoute = (services: LegacySetupServices): void => { + services.route(createGetPrepackagedRulesStatusRoute()); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts index 0d57f5739fc15..b6bcb3133a0b7 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts @@ -9,11 +9,13 @@ import Hapi from 'hapi'; import { chunk, isEmpty, isFunction } from 'lodash/fp'; import { extname } from 'path'; import uuid from 'uuid'; + +import { KibanaRequest } from '../../../../../../../../../src/core/server'; import { createPromiseFromStreams } from '../../../../../../../../../src/legacy/utils/streams'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { LegacySetupServices, RequestFacade } from '../../../../plugin'; import { createRules } from '../../rules/create_rules'; import { ImportRulesRequest } from '../../rules/types'; -import { ServerFacade } from '../../../../types'; import { readRules } from '../../rules/read_rules'; import { getIndexExists } from '../../index/get_index_exists'; import { @@ -26,7 +28,6 @@ import { createRulesStreamFromNdJson } from '../../rules/create_rules_stream_fro import { ImportRuleAlertRest } from '../../types'; import { updateRules } from '../../rules/update_rules'; import { importRulesQuerySchema, importRulesPayloadSchema } from '../schemas/import_rules_schema'; -import { KibanaRequest } from '../../../../../../../../../src/core/server'; type PromiseFromStreams = ImportRuleAlertRest | Error; @@ -38,14 +39,14 @@ type PromiseFromStreams = ImportRuleAlertRest | Error; */ const CHUNK_PARSED_OBJECT_SIZE = 10; -export const createImportRulesRoute = (server: ServerFacade): Hapi.ServerRoute => { +export const createImportRulesRoute = (services: LegacySetupServices): Hapi.ServerRoute => { return { method: 'POST', path: `${DETECTION_ENGINE_RULES_URL}/_import`, options: { tags: ['access:siem'], payload: { - maxBytes: server.config().get('savedObjects.maxImportPayloadBytes'), + maxBytes: services.config().get('savedObjects.maxImportPayloadBytes'), output: 'stream', allow: 'multipart/form-data', }, @@ -59,8 +60,8 @@ export const createImportRulesRoute = (server: ServerFacade): Hapi.ServerRoute = }, async handler(request: ImportRulesRequest, headers) { const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const actionsClient = await server.plugins.actions.getActionsClientWithRequest( - KibanaRequest.from((request as unknown) as Hapi.Request) + const actionsClient = await services.plugins.actions.getActionsClientWithRequest( + KibanaRequest.from((request as unknown) as RequestFacade) ); const savedObjectsClient = isFunction(request.getSavedObjectsClient) ? request.getSavedObjectsClient() @@ -74,7 +75,7 @@ export const createImportRulesRoute = (server: ServerFacade): Hapi.ServerRoute = return Boom.badRequest(`Invalid file extension ${fileExtension}`); } - const objectLimit = server.config().get('savedObjects.maxImportExportSize'); + const objectLimit = services.config().get('savedObjects.maxImportExportSize'); const readStream = createRulesStreamFromNdJson(request.payload.file, objectLimit); const parsedObjects = await createPromiseFromStreams([readStream]); @@ -148,8 +149,8 @@ export const createImportRulesRoute = (server: ServerFacade): Hapi.ServerRoute = version, } = parsedRule; try { - const finalIndex = getIndex(request, server); - const callWithRequest = callWithRequestFactory(request, server); + const finalIndex = getIndex((request as unknown) as RequestFacade, services); + const callWithRequest = callWithRequestFactory(request, services); const indexExists = await getIndexExists(callWithRequest, finalIndex); if (!indexExists) { resolve( @@ -263,6 +264,6 @@ export const createImportRulesRoute = (server: ServerFacade): Hapi.ServerRoute = }; }; -export const importRulesRoute = (server: ServerFacade): void => { - server.route(createImportRulesRoute(server)); +export const importRulesRoute = (services: LegacySetupServices): void => { + services.route(createImportRulesRoute(services)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts index 55fecdc14f755..ecf797f2c8860 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts @@ -11,7 +11,7 @@ import { getIdError, transformOrError } from './utils'; import { transformError } from '../utils'; import { readRules } from '../../rules/read_rules'; -import { ServerFacade } from '../../../../types'; +import { LegacySetupServices } from '../../../../plugin'; import { queryRulesSchema } from '../schemas/query_rules_schema'; import { QueryRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; @@ -64,6 +64,6 @@ export const createReadRulesRoute: Hapi.ServerRoute = { }, }; -export const readRulesRoute = (server: ServerFacade) => { - server.route(createReadRulesRoute); +export const readRulesRoute = (services: LegacySetupServices) => { + services.route(createReadRulesRoute); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts index 8c7558d6d4fb5..1ac65901a8265 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts @@ -11,7 +11,7 @@ import { BulkUpdateRulesRequest, IRuleSavedAttributesSavedObjectAttributes, } from '../../rules/types'; -import { ServerFacade } from '../../../../types'; +import { LegacySetupServices } from '../../../../plugin'; import { transformOrBulkError, getIdBulkError } from './utils'; import { transformBulkError } from '../utils'; import { updateRulesBulkSchema } from '../schemas/update_rules_bulk_schema'; @@ -19,7 +19,7 @@ import { updateRules } from '../../rules/update_rules'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { KibanaRequest } from '../../../../../../../../../src/core/server'; -export const createUpdateRulesBulkRoute = (server: ServerFacade): Hapi.ServerRoute => { +export const createUpdateRulesBulkRoute = (services: LegacySetupServices): Hapi.ServerRoute => { return { method: 'PUT', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, @@ -34,8 +34,8 @@ export const createUpdateRulesBulkRoute = (server: ServerFacade): Hapi.ServerRou }, async handler(request: BulkUpdateRulesRequest, headers) { const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const actionsClient = await server.plugins.actions.getActionsClientWithRequest( - KibanaRequest.from((request as unknown) as Hapi.Request) + const actionsClient = await services.plugins.actions.getActionsClientWithRequest( + KibanaRequest.from(request) ); const savedObjectsClient = isFunction(request.getSavedObjectsClient) ? request.getSavedObjectsClient() @@ -132,6 +132,6 @@ export const createUpdateRulesBulkRoute = (server: ServerFacade): Hapi.ServerRou }; }; -export const updateRulesBulkRoute = (server: ServerFacade): void => { - server.route(createUpdateRulesBulkRoute(server)); +export const updateRulesBulkRoute = (services: LegacySetupServices): void => { + services.route(createUpdateRulesBulkRoute(services)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts index 590307e06a26a..94a9ca763a8fe 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts @@ -10,13 +10,13 @@ import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { updateRules } from '../../rules/update_rules'; import { UpdateRulesRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { updateRulesSchema } from '../schemas/update_rules_schema'; -import { ServerFacade } from '../../../../types'; +import { LegacySetupServices } from '../../../../plugin'; import { getIdError, transformOrError } from './utils'; import { transformError } from '../utils'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { KibanaRequest } from '../../../../../../../../../src/core/server'; -export const createUpdateRulesRoute = (server: ServerFacade): Hapi.ServerRoute => { +export const createUpdateRulesRoute = (services: LegacySetupServices): Hapi.ServerRoute => { return { method: 'PUT', path: DETECTION_ENGINE_RULES_URL, @@ -60,8 +60,8 @@ export const createUpdateRulesRoute = (server: ServerFacade): Hapi.ServerRoute = } = request.payload; const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const actionsClient = await server.plugins.actions.getActionsClientWithRequest( - KibanaRequest.from((request as unknown) as Hapi.Request) + const actionsClient = await services.plugins.actions.getActionsClientWithRequest( + KibanaRequest.from(request) ); const savedObjectsClient = isFunction(request.getSavedObjectsClient) ? request.getSavedObjectsClient() @@ -124,6 +124,6 @@ export const createUpdateRulesRoute = (server: ServerFacade): Hapi.ServerRoute = }; }; -export const updateRulesRoute = (server: ServerFacade) => { - server.route(createUpdateRulesRoute(server)); +export const updateRulesRoute = (services: LegacySetupServices) => { + services.route(createUpdateRulesRoute(services)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts index 4755869c3d908..a2cb0940a8d15 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts @@ -8,10 +8,10 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_SIGNALS_STATUS_URL } from '../../../../../common/constants'; import { SignalsStatusRequest } from '../../signals/types'; import { setSignalsStatusSchema } from '../schemas/set_signal_status_schema'; -import { ServerFacade } from '../../../../types'; +import { LegacySetupServices } from '../../../../plugin'; import { transformError, getIndex } from '../utils'; -export const setSignalsStatusRouteDef = (server: ServerFacade): Hapi.ServerRoute => { +export const setSignalsStatusRouteDef = (services: LegacySetupServices): Hapi.ServerRoute => { return { method: 'POST', path: DETECTION_ENGINE_SIGNALS_STATUS_URL, @@ -26,8 +26,8 @@ export const setSignalsStatusRouteDef = (server: ServerFacade): Hapi.ServerRoute }, async handler(request: SignalsStatusRequest) { const { signal_ids: signalIds, query, status } = request.payload; - const index = getIndex(request, server); - const { callWithRequest } = server.plugins.elasticsearch.getCluster('data'); + const index = getIndex(request, services); + const { callWithRequest } = services.plugins.elasticsearch.getCluster('data'); let queryObject; if (signalIds) { queryObject = { ids: { values: signalIds } }; @@ -58,6 +58,6 @@ export const setSignalsStatusRouteDef = (server: ServerFacade): Hapi.ServerRoute }; }; -export const setSignalsStatusRoute = (server: ServerFacade) => { - server.route(setSignalsStatusRouteDef(server)); +export const setSignalsStatusRoute = (services: LegacySetupServices) => { + services.route(setSignalsStatusRouteDef(services)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts index 6d1896b1a8171..fffa0e730fd7e 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts @@ -8,10 +8,10 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_QUERY_SIGNALS_URL } from '../../../../../common/constants'; import { SignalsQueryRequest } from '../../signals/types'; import { querySignalsSchema } from '../schemas/query_signals_index_schema'; -import { ServerFacade } from '../../../../types'; +import { LegacySetupServices } from '../../../../plugin'; import { transformError, getIndex } from '../utils'; -export const querySignalsRouteDef = (server: ServerFacade): Hapi.ServerRoute => { +export const querySignalsRouteDef = (services: LegacySetupServices): Hapi.ServerRoute => { return { method: 'POST', path: DETECTION_ENGINE_QUERY_SIGNALS_URL, @@ -26,8 +26,8 @@ export const querySignalsRouteDef = (server: ServerFacade): Hapi.ServerRoute => }, async handler(request: SignalsQueryRequest) { const { query, aggs, _source, track_total_hits, size } = request.payload; - const index = getIndex(request, server); - const { callWithRequest } = server.plugins.elasticsearch.getCluster('data'); + const index = getIndex(request, services); + const { callWithRequest } = services.plugins.elasticsearch.getCluster('data'); try { return callWithRequest(request, 'search', { @@ -42,6 +42,6 @@ export const querySignalsRouteDef = (server: ServerFacade): Hapi.ServerRoute => }; }; -export const querySignalsRoute = (server: ServerFacade) => { - server.route(querySignalsRouteDef(server)); +export const querySignalsRoute = (services: LegacySetupServices) => { + services.route(querySignalsRouteDef(services)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts index c598e22ff596c..b506a1feaf886 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts @@ -7,7 +7,7 @@ import Hapi from 'hapi'; import { isFunction } from 'lodash/fp'; import { DETECTION_ENGINE_TAGS_URL } from '../../../../../common/constants'; -import { ServerFacade, RequestFacade } from '../../../../types'; +import { LegacySetupServices, RequestFacade } from '../../../../plugin'; import { transformError } from '../utils'; import { readTags } from '../../tags/read_tags'; @@ -39,6 +39,6 @@ export const createReadTagsRoute: Hapi.ServerRoute = { }, }; -export const readTagsRoute = (server: ServerFacade) => { - server.route(createReadTagsRoute); +export const readTagsRoute = (services: LegacySetupServices) => { + services.route(createReadTagsRoute); }; diff --git a/x-pack/legacy/plugins/siem/server/plugin.ts b/x-pack/legacy/plugins/siem/server/plugin.ts index 0027f16d2c020..8490f65adc7a2 100644 --- a/x-pack/legacy/plugins/siem/server/plugin.ts +++ b/x-pack/legacy/plugins/siem/server/plugin.ts @@ -20,9 +20,9 @@ import { timelineSavedObjectType, ruleStatusSavedObjectType, } from './saved_objects'; -import { ServerFacade } from './types'; +import { RequestFacade, ServerFacade } from './types'; -export { CoreSetup, Logger, PluginInitializerContext }; +export { CoreSetup, Logger, PluginInitializerContext, RequestFacade }; export interface SetupPlugins { features: FeaturesSetup; diff --git a/x-pack/legacy/plugins/siem/server/types.ts b/x-pack/legacy/plugins/siem/server/types.ts index d7e1625ee81bb..5deaee4ec90f3 100644 --- a/x-pack/legacy/plugins/siem/server/types.ts +++ b/x-pack/legacy/plugins/siem/server/types.ts @@ -20,9 +20,4 @@ export interface ServerFacade { route: Legacy.Server['route']; } -export interface RequestFacade - extends Omit { - getAlertsClient?: LegacyRequest['getAlertsClient']; - getActionsClient?: LegacyRequest['getActionsClient']; - getSavedObjectsClient?: LegacyRequest['getSavedObjectsClient']; -} +export type RequestFacade = LegacyRequest; From b0a7f9363d70ed7596d00c7c05b7ff5a4feb4ec7 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 4 Feb 2020 17:14:28 -0600 Subject: [PATCH 11/39] Fix DE routing tests following refactor The createMockServer helper does a few things differently: * returns mocked LegacyServices that can be passed to our route factories * does not return a server object as we don't need it, except for: * returns an inject function that we can use to execute a request We're casting our services because we're only mocking a subset of what LegacySetupServices entails. Mainly, this allows me to continue moving things off of ServerFacade without significant refactoring of tests. --- .../routes/__mocks__/_mock_server.ts | 68 +++++++------------ .../privileges/read_privileges_route.test.ts | 10 +-- .../rules/add_prepackaged_rules_route.test.ts | 21 +++--- .../rules/create_rules_bulk_route.test.ts | 28 ++++---- .../routes/rules/create_rules_route.test.ts | 25 +++---- .../rules/delete_rules_bulk_route.test.ts | 31 ++++----- .../routes/rules/delete_rules_route.test.ts | 25 +++---- .../routes/rules/find_rules_route.test.ts | 23 +++---- .../get_prepackaged_rule_status_route.test.ts | 26 +++---- .../routes/rules/read_rules_route.test.ts | 21 +++--- .../routes/rules/update_rules_bulk.test.ts | 33 ++++----- .../routes/rules/update_rules_route.test.ts | 29 ++++---- .../routes/signals/open_close_signals.test.ts | 22 +++--- .../signals/query_signals_route.test.ts | 22 +++--- 14 files changed, 169 insertions(+), 215 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts index 6f177424804dd..477079c55b37c 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts @@ -6,7 +6,6 @@ import Hapi from 'hapi'; import { KibanaConfig } from 'src/legacy/server/kbn_server'; -import { ElasticsearchPlugin } from 'src/legacy/core_plugins/elasticsearch'; import { savedObjectsClientMock } from '../../../../../../../../../src/core/server/mocks'; import { alertsClientMock } from '../../../../../../alerting/server/alerts_client.mock'; import { actionsClientMock } from '../../../../../../../../plugins/actions/server/mocks'; @@ -28,7 +27,7 @@ const assertNever = (): never => { throw new Error('Unexpected object'); }; -const createMockKibanaConfig = (config: Record): KibanaConfig => { +const createMockKibanaConfig = (config: Record = defaultConfig): KibanaConfig => { const returnConfig = { get(key: string) { return config[key]; @@ -44,33 +43,41 @@ const createMockKibanaConfig = (config: Record): KibanaConfig => } }; -export const createMockServer = (config: Record = defaultConfig) => { - const server = new Hapi.Server({ - port: 0, - }); - - server.config = () => createMockKibanaConfig(config); - +export const createMockServer = (hasAlertsClient = true) => { const actionsClient = actionsClientMock.create(); const alertsClient = alertsClientMock.create(); const savedObjectsClient = savedObjectsClientMock.create(); - const spaces = spacesServiceMock.createSetupContract(); + const spacesService = spacesServiceMock.createSetupContract(); const elasticsearch = { getCluster: jest.fn().mockImplementation(() => ({ callWithRequest: jest.fn(), })), }; - server.decorate('request', 'getAlertsClient', () => alertsClient); - server.plugins.elasticsearch = (elasticsearch as unknown) as ElasticsearchPlugin; - server.plugins.actions = { - getActionsClientWithRequest: () => actionsClient, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } as any; // The types have really bad conflicts at the moment so I have to use any + + const server = new Hapi.Server({ port: 0 }); + server.decorate('request', 'getSavedObjectsClient', () => savedObjectsClient); + if (hasAlertsClient) server.decorate('request', 'getAlertsClient', () => alertsClient); + + const npServices = { spaces: { spacesService } }; + const legacyServices = { + config: createMockKibanaConfig, + plugins: { + elasticsearch, + actions: { + getActionsClientWithRequest: () => actionsClient, + }, + }, + route: server.route.bind(server), + }; + const services = ({ + ...npServices, + ...legacyServices, + } as unknown) as LegacySetupServices; return { - server, - spaces, + inject: server.inject.bind(server), + services, alertsClient, actionsClient, elasticsearch, @@ -78,31 +85,6 @@ export const createMockServer = (config: Record = defaultConfig) }; }; -export const createMockServerWithoutAlertClientDecoration = ( - config: Record = defaultConfig -) => { - const serverWithoutAlertClient = new Hapi.Server({ - port: 0, - }); - - const savedObjectsClient = savedObjectsClientMock.create(); - serverWithoutAlertClient.config = () => createMockKibanaConfig(config); - serverWithoutAlertClient.decorate('request', 'getSavedObjectsClient', () => savedObjectsClient); - serverWithoutAlertClient.plugins.actions = { - getActionsClientWithRequest: () => actionsClient, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } as any; // The types have really bad conflicts at the moment so I have to use any - - const actionsClient = actionsClientMock.create(); - const spaces = spacesServiceMock.createSetupContract(); - - return { - serverWithoutAlertClient, - actionsClient, - spaces, - }; -}; - export const getMockIndexName = () => jest.fn().mockImplementation(() => ({ callWithRequest: jest.fn().mockImplementationOnce(() => 'index-name'), diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.test.ts index 1ea681afb7949..97f1593c6eb5b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.test.ts @@ -10,15 +10,15 @@ import { readPrivilegesRoute } from './read_privileges_route'; import * as myUtils from '../utils'; describe('read_privileges', () => { - let { server, elasticsearch } = createMockServer(); + let { inject, services, elasticsearch } = createMockServer(); beforeEach(() => { jest.spyOn(myUtils, 'getIndex').mockReturnValue('fakeindex'); - ({ server, elasticsearch } = createMockServer()); + ({ inject, services, elasticsearch } = createMockServer()); elasticsearch.getCluster = jest.fn(() => ({ callWithRequest: jest.fn(() => getMockPrivileges()), })); - readPrivilegesRoute(server); + readPrivilegesRoute(services); }); afterEach(() => { @@ -27,12 +27,12 @@ describe('read_privileges', () => { describe('normal status codes', () => { test('returns 200 when doing a normal request', async () => { - const { statusCode } = await server.inject(getPrivilegeRequest()); + const { statusCode } = await inject(getPrivilegeRequest()); expect(statusCode).toBe(200); }); test('returns the payload when doing a normal request', async () => { - const { payload } = await server.inject(getPrivilegeRequest()); + const { payload } = await inject(getPrivilegeRequest()); expect(JSON.parse(payload)).toEqual(getMockPrivileges()); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts index e4f612a14832b..e7c6a4863da4a 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts @@ -6,7 +6,6 @@ import { createMockServer, - createMockServerWithoutAlertClientDecoration, getMockEmptyIndex, getMockNonEmptyIndex, } from '../__mocks__/_mock_server'; @@ -48,14 +47,14 @@ import { addPrepackedRulesRoute } from './add_prepackaged_rules_route'; import { PrepackagedRules } from '../../types'; describe('add_prepackaged_rules_route', () => { - let { server, alertsClient, actionsClient, elasticsearch } = createMockServer(); + let { services, inject, alertsClient, actionsClient, elasticsearch } = createMockServer(); beforeEach(() => { jest.resetAllMocks(); - ({ server, alertsClient, actionsClient, elasticsearch } = createMockServer()); + ({ services, inject, alertsClient, actionsClient, elasticsearch } = createMockServer()); elasticsearch.getCluster = getMockNonEmptyIndex(); - addPrepackedRulesRoute(server); + addPrepackedRulesRoute(services); }); describe('status codes with actionClient and alertClient', () => { @@ -64,14 +63,14 @@ describe('add_prepackaged_rules_route', () => { alertsClient.get.mockResolvedValue(getResult()); actionsClient.create.mockResolvedValue(createActionResult()); alertsClient.create.mockResolvedValue(getResult()); - const { statusCode } = await server.inject(addPrepackagedRulesRequest()); + const { statusCode } = await inject(addPrepackagedRulesRequest()); expect(statusCode).toBe(200); }); test('returns 404 if alertClient is not available on the route', async () => { - const { serverWithoutAlertClient } = createMockServerWithoutAlertClientDecoration(); - createRulesRoute(serverWithoutAlertClient); - const { statusCode } = await serverWithoutAlertClient.inject(addPrepackagedRulesRequest()); + const { services: _services, inject: _inject } = createMockServer(false); + createRulesRoute(_services); + const { statusCode } = await _inject(addPrepackagedRulesRequest()); expect(statusCode).toBe(404); }); }); @@ -83,7 +82,7 @@ describe('add_prepackaged_rules_route', () => { alertsClient.get.mockResolvedValue(getResult()); actionsClient.create.mockResolvedValue(createActionResult()); alertsClient.create.mockResolvedValue(getResult()); - const { payload } = await server.inject(addPrepackagedRulesRequest()); + const { payload } = await inject(addPrepackagedRulesRequest()); expect(JSON.parse(payload)).toEqual({ error: 'Bad Request', message: @@ -99,7 +98,7 @@ describe('add_prepackaged_rules_route', () => { alertsClient.get.mockResolvedValue(getResult()); actionsClient.create.mockResolvedValue(createActionResult()); alertsClient.create.mockResolvedValue(getResult()); - const { payload } = await server.inject(addPrepackagedRulesRequest()); + const { payload } = await inject(addPrepackagedRulesRequest()); expect(JSON.parse(payload)).toEqual({ rules_installed: 1, rules_updated: 0, @@ -111,7 +110,7 @@ describe('add_prepackaged_rules_route', () => { alertsClient.get.mockResolvedValue(getResult()); actionsClient.create.mockResolvedValue(createActionResult()); alertsClient.create.mockResolvedValue(getResult()); - const { payload } = await server.inject(addPrepackagedRulesRequest()); + const { payload } = await inject(addPrepackagedRulesRequest()); expect(JSON.parse(payload)).toEqual({ rules_installed: 0, rules_updated: 1, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts index 5cf6d8955d8b2..3c008f20dea74 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts @@ -4,11 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - createMockServer, - createMockServerWithoutAlertClientDecoration, - getMockEmptyIndex, -} from '../__mocks__/_mock_server'; +import { createMockServer, getMockEmptyIndex } from '../__mocks__/_mock_server'; import { createRulesRoute } from './create_rules_route'; import { ServerInjectOptions } from 'hapi'; import { @@ -22,12 +18,12 @@ import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { createRulesBulkRoute } from './create_rules_bulk_route'; describe('create_rules_bulk', () => { - let { server, alertsClient, actionsClient, elasticsearch } = createMockServer(); + let { services, inject, alertsClient, actionsClient, elasticsearch } = createMockServer(); beforeEach(() => { jest.resetAllMocks(); - ({ server, alertsClient, actionsClient, elasticsearch } = createMockServer()); - createRulesBulkRoute(server); + ({ services, inject, alertsClient, actionsClient, elasticsearch } = createMockServer()); + createRulesBulkRoute(services); }); describe('status codes with actionClient and alertClient', () => { @@ -36,14 +32,14 @@ describe('create_rules_bulk', () => { alertsClient.get.mockResolvedValue(getResult()); actionsClient.create.mockResolvedValue(createActionResult()); alertsClient.create.mockResolvedValue(getResult()); - const { statusCode } = await server.inject(getReadBulkRequest()); + const { statusCode } = await inject(getReadBulkRequest()); expect(statusCode).toBe(200); }); test('returns 404 if alertClient is not available on the route', async () => { - const { serverWithoutAlertClient } = createMockServerWithoutAlertClientDecoration(); - createRulesRoute(serverWithoutAlertClient); - const { statusCode } = await serverWithoutAlertClient.inject(getReadBulkRequest()); + const { services: _services, inject: _inject } = createMockServer(false); + createRulesRoute(_services); + const { statusCode } = await _inject(getReadBulkRequest()); expect(statusCode).toBe(404); }); }); @@ -55,7 +51,7 @@ describe('create_rules_bulk', () => { alertsClient.get.mockResolvedValue(getResult()); actionsClient.create.mockResolvedValue(createActionResult()); alertsClient.create.mockResolvedValue(getResult()); - const { payload } = await server.inject(getReadBulkRequest()); + const { payload } = await inject(getReadBulkRequest()); expect(JSON.parse(payload)).toEqual([ { error: { @@ -80,7 +76,7 @@ describe('create_rules_bulk', () => { url: `${DETECTION_ENGINE_RULES_URL}/_bulk_create`, payload: [noRuleId], }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(200); }); @@ -100,7 +96,7 @@ describe('create_rules_bulk', () => { }, ], }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(200); }); @@ -120,7 +116,7 @@ describe('create_rules_bulk', () => { }, ], }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(400); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts index 27575fb264f7b..5c8ffdb3071d9 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts @@ -6,7 +6,6 @@ import { createMockServer, - createMockServerWithoutAlertClientDecoration, getMockNonEmptyIndex, getMockEmptyIndex, } from '../__mocks__/_mock_server'; @@ -25,7 +24,8 @@ import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; describe('create_rules', () => { let { - server, + services, + inject, alertsClient, actionsClient, elasticsearch, @@ -35,14 +35,15 @@ describe('create_rules', () => { beforeEach(() => { jest.resetAllMocks(); ({ - server, + services, + inject, alertsClient, actionsClient, elasticsearch, savedObjectsClient, } = createMockServer()); elasticsearch.getCluster = getMockNonEmptyIndex(); - createRulesRoute(server); + createRulesRoute(services); }); describe('status codes with actionClient and alertClient', () => { @@ -52,14 +53,14 @@ describe('create_rules', () => { actionsClient.create.mockResolvedValue(createActionResult()); alertsClient.create.mockResolvedValue(getResult()); savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); - const { statusCode } = await server.inject(getCreateRequest()); + const { statusCode } = await inject(getCreateRequest()); expect(statusCode).toBe(200); }); test('returns 404 if alertClient is not available on the route', async () => { - const { serverWithoutAlertClient } = createMockServerWithoutAlertClientDecoration(); - createRulesRoute(serverWithoutAlertClient); - const { statusCode } = await serverWithoutAlertClient.inject(getCreateRequest()); + const { services: _services, inject: _inject } = createMockServer(false); + createRulesRoute(_services); + const { statusCode } = await _inject(getCreateRequest()); expect(statusCode).toBe(404); }); }); @@ -71,7 +72,7 @@ describe('create_rules', () => { alertsClient.get.mockResolvedValue(getResult()); actionsClient.create.mockResolvedValue(createActionResult()); alertsClient.create.mockResolvedValue(getResult()); - const { payload } = await server.inject(getCreateRequest()); + const { payload } = await inject(getCreateRequest()); expect(JSON.parse(payload)).toEqual({ error: 'Bad Request', message: 'To create a rule, the index must exist first. Index .siem-signals does not exist', @@ -92,7 +93,7 @@ describe('create_rules', () => { url: DETECTION_ENGINE_RULES_URL, payload: noRuleId, }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(200); }); @@ -111,7 +112,7 @@ describe('create_rules', () => { type: 'query', }, }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(200); }); @@ -130,7 +131,7 @@ describe('create_rules', () => { type: 'something-made-up', }, }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(400); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts index e66fc765c08bf..b1e9800c015e3 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts @@ -4,10 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - createMockServer, - createMockServerWithoutAlertClientDecoration, -} from '../__mocks__/_mock_server'; +import { createMockServer } from '../__mocks__/_mock_server'; import { ServerInjectOptions } from 'hapi'; import { @@ -26,11 +23,11 @@ import { deleteRulesBulkRoute } from './delete_rules_bulk_route'; import { BulkError } from '../utils'; describe('delete_rules', () => { - let { server, alertsClient, savedObjectsClient } = createMockServer(); + let { services, inject, alertsClient, savedObjectsClient } = createMockServer(); beforeEach(() => { - ({ server, alertsClient, savedObjectsClient } = createMockServer()); - deleteRulesBulkRoute(server); + ({ services, inject, alertsClient, savedObjectsClient } = createMockServer()); + deleteRulesBulkRoute(services); }); afterEach(() => { @@ -42,7 +39,7 @@ describe('delete_rules', () => { alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); alertsClient.get.mockResolvedValue(getResult()); alertsClient.delete.mockResolvedValue({}); - const { statusCode } = await server.inject(getDeleteBulkRequest()); + const { statusCode } = await inject(getDeleteBulkRequest()); expect(statusCode).toBe(200); }); @@ -50,7 +47,7 @@ describe('delete_rules', () => { alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); alertsClient.get.mockResolvedValue(getResult()); alertsClient.delete.mockResolvedValue({}); - const { statusCode } = await server.inject(getDeleteAsPostBulkRequest()); + const { statusCode } = await inject(getDeleteAsPostBulkRequest()); expect(statusCode).toBe(200); }); @@ -58,7 +55,7 @@ describe('delete_rules', () => { alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); alertsClient.get.mockResolvedValue(getResult()); alertsClient.delete.mockResolvedValue({}); - const { statusCode } = await server.inject(getDeleteBulkRequestById()); + const { statusCode } = await inject(getDeleteBulkRequestById()); expect(statusCode).toBe(200); }); @@ -66,7 +63,7 @@ describe('delete_rules', () => { alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); alertsClient.get.mockResolvedValue(getResult()); alertsClient.delete.mockResolvedValue({}); - const { statusCode } = await server.inject(getDeleteAsPostBulkRequestById()); + const { statusCode } = await inject(getDeleteAsPostBulkRequestById()); expect(statusCode).toBe(200); }); @@ -74,7 +71,7 @@ describe('delete_rules', () => { alertsClient.find.mockResolvedValue(getFindResult()); alertsClient.get.mockResolvedValue(getResult()); alertsClient.delete.mockResolvedValue({}); - const { statusCode } = await server.inject(getDeleteBulkRequest()); + const { statusCode } = await inject(getDeleteBulkRequest()); expect(statusCode).toBe(200); }); @@ -84,7 +81,7 @@ describe('delete_rules', () => { alertsClient.delete.mockResolvedValue({}); savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); savedObjectsClient.delete.mockResolvedValue({}); - const { payload } = await server.inject(getDeleteBulkRequest()); + const { payload } = await inject(getDeleteBulkRequest()); const parsed: BulkError[] = JSON.parse(payload); const expected: BulkError[] = [ { @@ -96,9 +93,9 @@ describe('delete_rules', () => { }); test('returns 404 if alertClient is not available on the route', async () => { - const { serverWithoutAlertClient } = createMockServerWithoutAlertClientDecoration(); - deleteRulesBulkRoute(serverWithoutAlertClient); - const { statusCode } = await serverWithoutAlertClient.inject(getDeleteBulkRequest()); + const { services: _services, inject: _inject } = createMockServer(false); + deleteRulesBulkRoute(_services); + const { statusCode } = await _inject(getDeleteBulkRequest()); expect(statusCode).toBe(404); }); }); @@ -112,7 +109,7 @@ describe('delete_rules', () => { method: 'DELETE', url: `${DETECTION_ENGINE_RULES_URL}/_bulk_delete`, }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(400); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts index 0aa60d3bbd922..080b50d6bcddc 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts @@ -4,10 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - createMockServer, - createMockServerWithoutAlertClientDecoration, -} from '../__mocks__/_mock_server'; +import { createMockServer } from '../__mocks__/_mock_server'; import { deleteRulesRoute } from './delete_rules_route'; import { ServerInjectOptions } from 'hapi'; @@ -23,11 +20,11 @@ import { import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; describe('delete_rules', () => { - let { server, alertsClient, savedObjectsClient } = createMockServer(); + let { services, inject, alertsClient, savedObjectsClient } = createMockServer(); beforeEach(() => { - ({ server, alertsClient, savedObjectsClient } = createMockServer()); - deleteRulesRoute(server); + ({ services, inject, alertsClient, savedObjectsClient } = createMockServer()); + deleteRulesRoute(services); }); afterEach(() => { @@ -41,7 +38,7 @@ describe('delete_rules', () => { alertsClient.delete.mockResolvedValue({}); savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); savedObjectsClient.delete.mockResolvedValue({}); - const { statusCode } = await server.inject(getDeleteRequest()); + const { statusCode } = await inject(getDeleteRequest()); expect(statusCode).toBe(200); }); @@ -51,7 +48,7 @@ describe('delete_rules', () => { alertsClient.delete.mockResolvedValue({}); savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); savedObjectsClient.delete.mockResolvedValue({}); - const { statusCode } = await server.inject(getDeleteRequestById()); + const { statusCode } = await inject(getDeleteRequestById()); expect(statusCode).toBe(200); }); @@ -61,14 +58,14 @@ describe('delete_rules', () => { alertsClient.delete.mockResolvedValue({}); savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); savedObjectsClient.delete.mockResolvedValue({}); - const { statusCode } = await server.inject(getDeleteRequest()); + const { statusCode } = await inject(getDeleteRequest()); expect(statusCode).toBe(404); }); test('returns 404 if alertClient is not available on the route', async () => { - const { serverWithoutAlertClient } = createMockServerWithoutAlertClientDecoration(); - deleteRulesRoute(serverWithoutAlertClient); - const { statusCode } = await serverWithoutAlertClient.inject(getDeleteRequest()); + const { services: _services, inject: _inject } = createMockServer(false); + deleteRulesRoute(_services); + const { statusCode } = await _inject(getDeleteRequest()); expect(statusCode).toBe(404); }); }); @@ -82,7 +79,7 @@ describe('delete_rules', () => { method: 'DELETE', url: DETECTION_ENGINE_RULES_URL, }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(400); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.test.ts index 62c9f44da1e33..d804adb1d89a4 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.test.ts @@ -4,10 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - createMockServer, - createMockServerWithoutAlertClientDecoration, -} from '../__mocks__/_mock_server'; +import { createMockServer } from '../__mocks__/_mock_server'; import { findRulesRoute } from './find_rules_route'; import { ServerInjectOptions } from 'hapi'; @@ -16,11 +13,11 @@ import { getFindResult, getResult, getFindRequest } from '../__mocks__/request_r import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; describe('find_rules', () => { - let { server, alertsClient, actionsClient } = createMockServer(); + let { services, inject, alertsClient, actionsClient } = createMockServer(); beforeEach(() => { - ({ server, alertsClient, actionsClient } = createMockServer()); - findRulesRoute(server); + ({ services, inject, alertsClient, actionsClient } = createMockServer()); + findRulesRoute(services); }); afterEach(() => { @@ -37,14 +34,14 @@ describe('find_rules', () => { data: [], }); alertsClient.get.mockResolvedValue(getResult()); - const { statusCode } = await server.inject(getFindRequest()); + const { statusCode } = await inject(getFindRequest()); expect(statusCode).toBe(200); }); test('returns 404 if alertClient is not available on the route', async () => { - const { serverWithoutAlertClient } = createMockServerWithoutAlertClientDecoration(); - findRulesRoute(serverWithoutAlertClient); - const { statusCode } = await serverWithoutAlertClient.inject(getFindRequest()); + const { services: _services, inject: _inject } = createMockServer(false); + findRulesRoute(_services); + const { statusCode } = await _inject(getFindRequest()); expect(statusCode).toBe(404); }); }); @@ -57,7 +54,7 @@ describe('find_rules', () => { method: 'GET', url: `${DETECTION_ENGINE_RULES_URL}/_find?invalid_value=500`, }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(400); }); @@ -68,7 +65,7 @@ describe('find_rules', () => { method: 'GET', url: `${DETECTION_ENGINE_RULES_URL}/_find?page=2&per_page=20&sort_field=timestamp&fields=["field-1","field-2","field-3]`, }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(200); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rule_status_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rule_status_route.test.ts index de7f0fe26cc74..fe322d7e8e708 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rule_status_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rule_status_route.test.ts @@ -4,11 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - createMockServer, - createMockServerWithoutAlertClientDecoration, - getMockNonEmptyIndex, -} from '../__mocks__/_mock_server'; +import { createMockServer, getMockNonEmptyIndex } from '../__mocks__/_mock_server'; import { createRulesRoute } from './create_rules_route'; import { getFindResult, @@ -44,13 +40,13 @@ jest.mock('../../rules/get_prepackaged_rules', () => { import { getPrepackagedRulesStatusRoute } from './get_prepackaged_rules_status_route'; describe('get_prepackaged_rule_status_route', () => { - let { server, alertsClient, actionsClient, elasticsearch } = createMockServer(); + let { services, inject, alertsClient, actionsClient, elasticsearch } = createMockServer(); beforeEach(() => { jest.resetAllMocks(); - ({ server, alertsClient, actionsClient, elasticsearch } = createMockServer()); + ({ services, inject, alertsClient, actionsClient, elasticsearch } = createMockServer()); elasticsearch.getCluster = getMockNonEmptyIndex(); - getPrepackagedRulesStatusRoute(server); + getPrepackagedRulesStatusRoute(services); }); describe('status codes with actionClient and alertClient', () => { @@ -59,16 +55,14 @@ describe('get_prepackaged_rule_status_route', () => { alertsClient.get.mockResolvedValue(getResult()); actionsClient.create.mockResolvedValue(createActionResult()); alertsClient.create.mockResolvedValue(getResult()); - const { statusCode } = await server.inject(getPrepackagedRulesStatusRequest()); + const { statusCode } = await inject(getPrepackagedRulesStatusRequest()); expect(statusCode).toBe(200); }); test('returns 404 if alertClient is not available on the route', async () => { - const { serverWithoutAlertClient } = createMockServerWithoutAlertClientDecoration(); - createRulesRoute(serverWithoutAlertClient); - const { statusCode } = await serverWithoutAlertClient.inject( - getPrepackagedRulesStatusRequest() - ); + const { services: _services, inject: _inject } = createMockServer(false); + createRulesRoute(_services); + const { statusCode } = await _inject(getPrepackagedRulesStatusRequest()); expect(statusCode).toBe(404); }); }); @@ -79,7 +73,7 @@ describe('get_prepackaged_rule_status_route', () => { alertsClient.get.mockResolvedValue(getResult()); actionsClient.create.mockResolvedValue(createActionResult()); alertsClient.create.mockResolvedValue(getResult()); - const { payload } = await server.inject(getPrepackagedRulesStatusRequest()); + const { payload } = await inject(getPrepackagedRulesStatusRequest()); expect(JSON.parse(payload)).toEqual({ rules_custom_installed: 0, rules_installed: 0, @@ -93,7 +87,7 @@ describe('get_prepackaged_rule_status_route', () => { alertsClient.get.mockResolvedValue(getResult()); actionsClient.create.mockResolvedValue(createActionResult()); alertsClient.create.mockResolvedValue(getResult()); - const { payload } = await server.inject(getPrepackagedRulesStatusRequest()); + const { payload } = await inject(getPrepackagedRulesStatusRequest()); expect(JSON.parse(payload)).toEqual({ rules_custom_installed: 1, rules_installed: 1, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.test.ts index 000cd29af8ba9..532803b397481 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.test.ts @@ -4,10 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - createMockServer, - createMockServerWithoutAlertClientDecoration, -} from '../__mocks__/_mock_server'; +import { createMockServer } from '../__mocks__/_mock_server'; import { readRulesRoute } from './read_rules_route'; import { ServerInjectOptions } from 'hapi'; @@ -22,11 +19,11 @@ import { import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; describe('read_signals', () => { - let { server, alertsClient, savedObjectsClient } = createMockServer(); + let { services, inject, alertsClient, savedObjectsClient } = createMockServer(); beforeEach(() => { - ({ server, alertsClient, savedObjectsClient } = createMockServer()); - readRulesRoute(server); + ({ services, inject, alertsClient, savedObjectsClient } = createMockServer()); + readRulesRoute(services); }); afterEach(() => { @@ -38,14 +35,14 @@ describe('read_signals', () => { alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); alertsClient.get.mockResolvedValue(getResult()); savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); - const { statusCode } = await server.inject(getReadRequest()); + const { statusCode } = await inject(getReadRequest()); expect(statusCode).toBe(200); }); test('returns 404 if alertClient is not available on the route', async () => { - const { serverWithoutAlertClient } = createMockServerWithoutAlertClientDecoration(); - readRulesRoute(serverWithoutAlertClient); - const { statusCode } = await serverWithoutAlertClient.inject(getReadRequest()); + const { services: _services, inject: _inject } = createMockServer(false); + readRulesRoute(_services); + const { statusCode } = await _inject(getReadRequest()); expect(statusCode).toBe(404); }); }); @@ -60,7 +57,7 @@ describe('read_signals', () => { method: 'GET', url: DETECTION_ENGINE_RULES_URL, }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(400); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk.test.ts index 81b6444f38603..8135e75ab0ca9 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk.test.ts @@ -4,10 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - createMockServer, - createMockServerWithoutAlertClientDecoration, -} from '../__mocks__/_mock_server'; +import { createMockServer } from '../__mocks__/_mock_server'; import { updateRulesRoute } from './update_rules_route'; import { ServerInjectOptions } from 'hapi'; @@ -25,12 +22,12 @@ import { updateRulesBulkRoute } from './update_rules_bulk_route'; import { BulkError } from '../utils'; describe('update_rules_bulk', () => { - let { server, alertsClient, actionsClient } = createMockServer(); + let { services, inject, alertsClient, actionsClient } = createMockServer(); beforeEach(() => { jest.resetAllMocks(); - ({ server, alertsClient, actionsClient } = createMockServer()); - updateRulesBulkRoute(server); + ({ services, inject, alertsClient, actionsClient } = createMockServer()); + updateRulesBulkRoute(services); }); describe('status codes with actionClient and alertClient', () => { @@ -39,7 +36,7 @@ describe('update_rules_bulk', () => { alertsClient.get.mockResolvedValue(getResult()); actionsClient.update.mockResolvedValue(updateActionResult()); alertsClient.update.mockResolvedValue(getResult()); - const { statusCode } = await server.inject(getUpdateBulkRequest()); + const { statusCode } = await inject(getUpdateBulkRequest()); expect(statusCode).toBe(200); }); @@ -48,7 +45,7 @@ describe('update_rules_bulk', () => { alertsClient.get.mockResolvedValue(getResult()); actionsClient.update.mockResolvedValue(updateActionResult()); alertsClient.update.mockResolvedValue(getResult()); - const { statusCode } = await server.inject(getUpdateBulkRequest()); + const { statusCode } = await inject(getUpdateBulkRequest()); expect(statusCode).toBe(200); }); @@ -57,7 +54,7 @@ describe('update_rules_bulk', () => { alertsClient.get.mockResolvedValue(getResult()); actionsClient.update.mockResolvedValue(updateActionResult()); alertsClient.update.mockResolvedValue(getResult()); - const { payload } = await server.inject(getUpdateBulkRequest()); + const { payload } = await inject(getUpdateBulkRequest()); const parsed: BulkError[] = JSON.parse(payload); const expected: BulkError[] = [ { @@ -69,9 +66,9 @@ describe('update_rules_bulk', () => { }); test('returns 404 if alertClient is not available on the route', async () => { - const { serverWithoutAlertClient } = createMockServerWithoutAlertClientDecoration(); - updateRulesRoute(serverWithoutAlertClient); - const { statusCode } = await serverWithoutAlertClient.inject(getUpdateBulkRequest()); + const { services: _services, inject: _inject } = createMockServer(false); + updateRulesRoute(_services); + const { statusCode } = await _inject(getUpdateBulkRequest()); expect(statusCode).toBe(404); }); }); @@ -86,7 +83,7 @@ describe('update_rules_bulk', () => { url: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, payload: [noId], }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(400); }); @@ -99,7 +96,7 @@ describe('update_rules_bulk', () => { url: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, payload: [typicalPayload()], }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toEqual(200); }); @@ -112,7 +109,7 @@ describe('update_rules_bulk', () => { url: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, payload: [typicalPayload()], }; - const { payload } = await server.inject(request); + const { payload } = await inject(request); const parsed: BulkError[] = JSON.parse(payload); const expected: BulkError[] = [ { @@ -133,7 +130,7 @@ describe('update_rules_bulk', () => { url: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, payload: [typicalPayload()], }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(200); }); @@ -153,7 +150,7 @@ describe('update_rules_bulk', () => { }, ], }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(400); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.test.ts index c4f10d7a20327..86fd7b6550173 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.test.ts @@ -4,10 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - createMockServer, - createMockServerWithoutAlertClientDecoration, -} from '../__mocks__/_mock_server'; +import { createMockServer } from '../__mocks__/_mock_server'; import { updateRulesRoute } from './update_rules_route'; import { ServerInjectOptions } from 'hapi'; @@ -24,12 +21,12 @@ import { import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; describe('update_rules', () => { - let { server, alertsClient, actionsClient, savedObjectsClient } = createMockServer(); + let { services, inject, alertsClient, actionsClient, savedObjectsClient } = createMockServer(); beforeEach(() => { jest.resetAllMocks(); - ({ server, alertsClient, actionsClient, savedObjectsClient } = createMockServer()); - updateRulesRoute(server); + ({ services, inject, alertsClient, actionsClient, savedObjectsClient } = createMockServer()); + updateRulesRoute(services); }); describe('status codes with actionClient and alertClient', () => { @@ -39,7 +36,7 @@ describe('update_rules', () => { actionsClient.update.mockResolvedValue(updateActionResult()); alertsClient.update.mockResolvedValue(getResult()); savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); - const { statusCode } = await server.inject(getUpdateRequest()); + const { statusCode } = await inject(getUpdateRequest()); expect(statusCode).toBe(200); }); @@ -49,14 +46,14 @@ describe('update_rules', () => { actionsClient.update.mockResolvedValue(updateActionResult()); alertsClient.update.mockResolvedValue(getResult()); savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); - const { statusCode } = await server.inject(getUpdateRequest()); + const { statusCode } = await inject(getUpdateRequest()); expect(statusCode).toBe(404); }); test('returns 404 if alertClient is not available on the route', async () => { - const { serverWithoutAlertClient } = createMockServerWithoutAlertClientDecoration(); - updateRulesRoute(serverWithoutAlertClient); - const { statusCode } = await serverWithoutAlertClient.inject(getUpdateRequest()); + const { services: _services, inject: _inject } = createMockServer(false); + updateRulesRoute(_services); + const { statusCode } = await _inject(getUpdateRequest()); expect(statusCode).toBe(404); }); }); @@ -74,7 +71,7 @@ describe('update_rules', () => { payload: noId, }, }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(400); }); @@ -88,7 +85,7 @@ describe('update_rules', () => { url: DETECTION_ENGINE_RULES_URL, payload: typicalPayload(), }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(404); }); @@ -103,7 +100,7 @@ describe('update_rules', () => { url: DETECTION_ENGINE_RULES_URL, payload: typicalPayload(), }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(200); }); @@ -122,7 +119,7 @@ describe('update_rules', () => { type: 'something-made-up', }, }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(400); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals.test.ts index 35e1e5933af64..49e7509c83c86 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals.test.ts @@ -19,27 +19,27 @@ import { import { DETECTION_ENGINE_SIGNALS_STATUS_URL } from '../../../../../common/constants'; describe('set signal status', () => { - let { server, elasticsearch } = createMockServer(); + let { inject, services, elasticsearch } = createMockServer(); beforeEach(() => { jest.resetAllMocks(); jest.spyOn(myUtils, 'getIndex').mockReturnValue('fakeindex'); - ({ server, elasticsearch } = createMockServer()); + ({ inject, services, elasticsearch } = createMockServer()); elasticsearch.getCluster = jest.fn(() => ({ callWithRequest: jest.fn(() => true), })); - setSignalsStatusRoute(server); + setSignalsStatusRoute(services); }); describe('status on signal', () => { test('returns 200 when setting a status on a signal by ids', async () => { - const { statusCode } = await server.inject(getSetSignalStatusByIdsRequest()); + const { statusCode } = await inject(getSetSignalStatusByIdsRequest()); expect(statusCode).toBe(200); expect(myUtils.getIndex).toHaveReturnedWith('fakeindex'); }); test('returns 200 when setting a status on a signal by query', async () => { - const { statusCode } = await server.inject(getSetSignalStatusByQueryRequest()); + const { statusCode } = await inject(getSetSignalStatusByQueryRequest()); expect(statusCode).toBe(200); }); }); @@ -51,7 +51,7 @@ describe('set signal status', () => { url: DETECTION_ENGINE_SIGNALS_STATUS_URL, payload: typicalSetStatusSignalByIdsPayload(), }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(200); }); @@ -61,7 +61,7 @@ describe('set signal status', () => { url: DETECTION_ENGINE_SIGNALS_STATUS_URL, payload: typicalSetStatusSignalByQueryPayload(), }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(200); }); @@ -71,7 +71,7 @@ describe('set signal status', () => { url: DETECTION_ENGINE_SIGNALS_STATUS_URL, payload: setStatusSignalMissingIdsAndQueryPayload(), }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(400); }); @@ -82,7 +82,7 @@ describe('set signal status', () => { url: DETECTION_ENGINE_SIGNALS_STATUS_URL, payload: justIds, }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(400); }); @@ -93,7 +93,7 @@ describe('set signal status', () => { url: DETECTION_ENGINE_SIGNALS_STATUS_URL, payload: justTheQuery, }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(400); }); @@ -108,7 +108,7 @@ describe('set signal status', () => { url: DETECTION_ENGINE_SIGNALS_STATUS_URL, payload: queryAndSignalIdsNoStatus, }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(400); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.test.ts index 5b86d0a4b36c0..669e6723ae009 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.test.ts @@ -18,16 +18,16 @@ import { import { DETECTION_ENGINE_QUERY_SIGNALS_URL } from '../../../../../common/constants'; describe('query for signal', () => { - let { server, elasticsearch } = createMockServer(); + let { inject, services, elasticsearch } = createMockServer(); beforeEach(() => { jest.resetAllMocks(); jest.spyOn(myUtils, 'getIndex').mockReturnValue('fakeindex'); - ({ server, elasticsearch } = createMockServer()); + ({ inject, services, elasticsearch } = createMockServer()); elasticsearch.getCluster = jest.fn(() => ({ callWithRequest: jest.fn(() => true), })); - querySignalsRoute(server); + querySignalsRoute(services); }); describe('query and agg on signals index', () => { @@ -40,7 +40,7 @@ describe('query for signal', () => { } ), })); - const { statusCode } = await server.inject(getSignalsAggsQueryRequest()); + const { statusCode } = await inject(getSignalsAggsQueryRequest()); expect(statusCode).toBe(200); expect(myUtils.getIndex).toHaveReturnedWith('fakeindex'); }); @@ -54,7 +54,7 @@ describe('query for signal', () => { } ), })); - const { statusCode } = await server.inject(getSignalsAggsQueryRequest()); + const { statusCode } = await inject(getSignalsAggsQueryRequest()); expect(statusCode).toBe(200); expect(myUtils.getIndex).toHaveReturnedWith('fakeindex'); }); @@ -73,7 +73,7 @@ describe('query for signal', () => { } ), })); - const { statusCode } = await server.inject(allTogether); + const { statusCode } = await inject(allTogether); expect(statusCode).toBe(200); expect(myUtils.getIndex).toHaveReturnedWith('fakeindex'); }); @@ -81,7 +81,7 @@ describe('query for signal', () => { test('returns 400 when missing aggs and query', async () => { const allTogether = getSignalsQueryRequest(); allTogether.payload = {}; - const { statusCode } = await server.inject(allTogether); + const { statusCode } = await inject(allTogether); expect(statusCode).toBe(400); }); }); @@ -93,7 +93,7 @@ describe('query for signal', () => { url: DETECTION_ENGINE_QUERY_SIGNALS_URL, payload: typicalSignalsQuery(), }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(200); }); @@ -103,7 +103,7 @@ describe('query for signal', () => { url: DETECTION_ENGINE_QUERY_SIGNALS_URL, payload: typicalSignalsQueryAggs(), }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(200); }); @@ -113,7 +113,7 @@ describe('query for signal', () => { url: DETECTION_ENGINE_QUERY_SIGNALS_URL, payload: { ...typicalSignalsQueryAggs(), ...typicalSignalsQuery() }, }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(200); }); @@ -123,7 +123,7 @@ describe('query for signal', () => { url: DETECTION_ENGINE_QUERY_SIGNALS_URL, payload: {}, }; - const { statusCode } = await server.inject(request); + const { statusCode } = await inject(request); expect(statusCode).toBe(400); }); }); From aa7ae34eae0ef336dc39bdec57ca902a47b3aab3 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 4 Feb 2020 17:54:59 -0600 Subject: [PATCH 12/39] Fix incompatible request types Unfortunately, LegacyRequest does not allow a request's `query` values to be anything other than a string or string[]. However, in practice they can (and are) objects, booleans, etc. Our request types (e.g. QueryRequest) are correct, but because service functions are LegacyRequest's implementation of `query`, we need to cast them lest a type error occur. For now, the easiest solution is to do this in the request handler: intersecting with our RequestFacade (LegacyRequest) allows us to both a) pluck our query params off the request and b) pass the request to NP services. --- .../routes/rules/delete_rules_route.ts | 8 ++++---- .../routes/rules/import_rules_route.ts | 6 +++--- .../siem/server/lib/detection_engine/routes/utils.ts | 10 +++------- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts index 3d16519e98cbb..2a0be43717ac9 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts @@ -7,15 +7,15 @@ import Hapi from 'hapi'; import { isFunction } from 'lodash/fp'; +import { KibanaRequest } from '../../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { deleteRules } from '../../rules/delete_rules'; -import { LegacySetupServices } from '../../../../plugin'; +import { LegacySetupServices, RequestFacade } from '../../../../plugin'; import { queryRulesSchema } from '../schemas/query_rules_schema'; import { getIdError, transformOrError } from './utils'; import { transformError } from '../utils'; import { QueryRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; -import { KibanaRequest, LegacyRequest } from '../../../../../../../../../src/core/server'; export const createDeleteRulesRoute = (services: LegacySetupServices): Hapi.ServerRoute => { return { @@ -30,11 +30,11 @@ export const createDeleteRulesRoute = (services: LegacySetupServices): Hapi.Serv query: queryRulesSchema, }, }, - async handler(request: QueryRequest, headers) { + async handler(request: QueryRequest & RequestFacade, headers) { const { id, rule_id: ruleId } = request.query; const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; const actionsClient = await services.plugins.actions.getActionsClientWithRequest( - KibanaRequest.from((request as unknown) as LegacyRequest) + KibanaRequest.from(request) ); const savedObjectsClient = isFunction(request.getSavedObjectsClient) ? request.getSavedObjectsClient() diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts index b6bcb3133a0b7..f8d281d746508 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts @@ -58,10 +58,10 @@ export const createImportRulesRoute = (services: LegacySetupServices): Hapi.Serv payload: importRulesPayloadSchema, }, }, - async handler(request: ImportRulesRequest, headers) { + async handler(request: ImportRulesRequest & RequestFacade, headers) { const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; const actionsClient = await services.plugins.actions.getActionsClientWithRequest( - KibanaRequest.from((request as unknown) as RequestFacade) + KibanaRequest.from(request) ); const savedObjectsClient = isFunction(request.getSavedObjectsClient) ? request.getSavedObjectsClient() @@ -149,7 +149,7 @@ export const createImportRulesRoute = (services: LegacySetupServices): Hapi.Serv version, } = parsedRule; try { - const finalIndex = getIndex((request as unknown) as RequestFacade, services); + const finalIndex = getIndex(request, services); const callWithRequest = callWithRequestFactory(request, services); const indexExists = await getIndexExists(callWithRequest, finalIndex); if (!indexExists) { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts index 3557b718912ac..47f2026665042 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts @@ -6,8 +6,7 @@ import Boom from 'boom'; import { APP_ID, SIGNALS_INDEX_KEY } from '../../../../common/constants'; -import { ServerFacade, RequestFacade } from '../../../types'; -import { LegacySetupServices } from '../../../plugin'; +import { LegacySetupServices, RequestFacade } from '../../../plugin'; export const transformError = (err: Error & { statusCode?: number }) => { if (Boom.isBoom(err)) { @@ -164,11 +163,8 @@ export const getIndex = (request: RequestFacade, services: LegacySetupServices): return `${signalsIndex}-${spaceId}`; }; -export const callWithRequestFactory = ( - request: RequestFacade | Omit, - server: ServerFacade -) => { - const { callWithRequest } = server.plugins.elasticsearch.getCluster('data'); +export const callWithRequestFactory = (request: RequestFacade, services: LegacySetupServices) => { + const { callWithRequest } = services.plugins.elasticsearch.getCluster('data'); return (endpoint: string, params: T, options?: U) => { return callWithRequest(request, endpoint, params, options); }; From b54235dddc9d815602c91ef00fc67893849fe78b Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Wed, 5 Feb 2020 13:28:28 -0600 Subject: [PATCH 13/39] Move our use of encryptedSavedObjects to NP We're just retrieving a boolean from it right now, which is also guarded against the plugin being unavailable. If this usage becomes more widespread, we'll make this available at a higher level, probably in redux. --- x-pack/legacy/plugins/siem/index.ts | 4 ---- .../routes/privileges/read_privileges_route.ts | 3 ++- x-pack/legacy/plugins/siem/server/plugin.ts | 2 ++ x-pack/legacy/plugins/siem/server/types.ts | 1 - 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/x-pack/legacy/plugins/siem/index.ts b/x-pack/legacy/plugins/siem/index.ts index b4c5e3a98f61d..ad189bd02c362 100644 --- a/x-pack/legacy/plugins/siem/index.ts +++ b/x-pack/legacy/plugins/siem/index.ts @@ -5,7 +5,6 @@ */ import { i18n } from '@kbn/i18n'; -import { get } from 'lodash/fp'; import { resolve } from 'path'; import { Server } from 'hapi'; import { Root } from 'joi'; @@ -154,9 +153,6 @@ export const siem = (kibana: any) => { const initializerContext = { ...coreContext, env }; const serverFacade = { config, - usingEphemeralEncryptionKey: - get('usingEphemeralEncryptionKey', newPlatform.setup.plugins.encryptedSavedObjects) ?? - false, plugins: { alerting: plugins.alerting, actions: newPlatform.start.plugins.actions, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts index 637bc9c10b7f0..1ad463cfb4edf 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts @@ -29,7 +29,8 @@ export const createReadPrivilegesRulesRoute = (services: LegacySetupServices): H const callWithRequest = callWithRequestFactory(request, services); const index = getIndex(request, services); const permissions = await readPrivileges(callWithRequest, index); - const usingEphemeralEncryptionKey = services.usingEphemeralEncryptionKey; + const usingEphemeralEncryptionKey = + services.encryptedSavedObjects?.usingEphemeralEncryptionKey ?? false; return merge(permissions, { is_authenticated: request?.auth?.isAuthenticated ?? false, has_encryption_key: !usingEphemeralEncryptionKey, diff --git a/x-pack/legacy/plugins/siem/server/plugin.ts b/x-pack/legacy/plugins/siem/server/plugin.ts index 8490f65adc7a2..eb7a405523dfd 100644 --- a/x-pack/legacy/plugins/siem/server/plugin.ts +++ b/x-pack/legacy/plugins/siem/server/plugin.ts @@ -8,6 +8,7 @@ import { i18n } from '@kbn/i18n'; import { CoreSetup, PluginInitializerContext, Logger } from '../../../../../src/core/server'; import { SecurityPluginSetup as SecuritySetup } from '../../../../plugins/security/server'; import { PluginSetupContract as FeaturesSetup } from '../../../../plugins/features/server'; +import { EncryptedSavedObjectsPluginSetup as EncryptedSavedObjectsSetup } from '../../../../plugins/encrypted_saved_objects/server'; import { SpacesPluginSetup as SpacesSetup } from '../../../../plugins/spaces/server'; import { initServer } from './init_server'; import { compose } from './lib/compose/kibana'; @@ -25,6 +26,7 @@ import { RequestFacade, ServerFacade } from './types'; export { CoreSetup, Logger, PluginInitializerContext, RequestFacade }; export interface SetupPlugins { + encryptedSavedObjects: EncryptedSavedObjectsSetup; features: FeaturesSetup; security: SecuritySetup; spaces: SpacesSetup; diff --git a/x-pack/legacy/plugins/siem/server/types.ts b/x-pack/legacy/plugins/siem/server/types.ts index 5deaee4ec90f3..ed16b1e501137 100644 --- a/x-pack/legacy/plugins/siem/server/types.ts +++ b/x-pack/legacy/plugins/siem/server/types.ts @@ -9,7 +9,6 @@ import { LegacyRequest } from '../../../../../src/core/server'; export interface ServerFacade { config: Legacy.Server['config']; - usingEphemeralEncryptionKey: boolean; plugins: { // eslint-disable-next-line @typescript-eslint/no-explicit-any actions: any; // We have to do this at the moment because the types are not compatible From 3742670305cee3eaa24e868cb3cf53814486a47a Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Wed, 5 Feb 2020 15:59:47 -0600 Subject: [PATCH 14/39] Use NP elasticsearch client * Simplifies our generic type to accept two arguments: params and the return value * Options is fixed and we were never specifying anything meaningful there * Updates all DE cluster calls to use callWithRequestFactory --- x-pack/legacy/plugins/siem/index.ts | 1 - .../lib/detection_engine/index/create_bootstrap_index.ts | 7 +------ .../lib/detection_engine/index/delete_all_index.ts | 3 +-- .../server/lib/detection_engine/index/delete_policy.ts | 2 +- .../server/lib/detection_engine/index/delete_template.ts | 3 +-- .../lib/detection_engine/index/get_index_exists.ts | 1 - .../lib/detection_engine/index/get_policy_exists.ts | 2 +- .../lib/detection_engine/index/get_template_exists.ts | 3 +-- .../siem/server/lib/detection_engine/index/read_index.ts | 3 +-- .../siem/server/lib/detection_engine/index/set_policy.ts | 2 +- .../server/lib/detection_engine/index/set_template.ts | 3 +-- .../lib/detection_engine/privileges/read_privileges.ts | 2 +- .../routes/signals/open_close_signals_route.ts | 6 +++--- .../routes/signals/query_signals_route.ts | 6 +++--- .../siem/server/lib/detection_engine/routes/utils.ts | 9 +++++---- .../plugins/siem/server/lib/detection_engine/types.ts | 8 +++++++- x-pack/legacy/plugins/siem/server/types.ts | 1 - 17 files changed, 28 insertions(+), 34 deletions(-) diff --git a/x-pack/legacy/plugins/siem/index.ts b/x-pack/legacy/plugins/siem/index.ts index ad189bd02c362..4ba983ad6d82c 100644 --- a/x-pack/legacy/plugins/siem/index.ts +++ b/x-pack/legacy/plugins/siem/index.ts @@ -156,7 +156,6 @@ export const siem = (kibana: any) => { plugins: { alerting: plugins.alerting, actions: newPlatform.start.plugins.actions, - elasticsearch: plugins.elasticsearch, savedObjects: server.savedObjects.SavedObjectsClient, }, route: route.bind(server), diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/create_bootstrap_index.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/create_bootstrap_index.ts index dff6e7136bff2..253bccad2e9f8 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/create_bootstrap_index.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/create_bootstrap_index.ts @@ -4,18 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { CallClusterOptions } from 'src/legacy/core_plugins/elasticsearch'; import { CallWithRequest } from '../types'; // See the reference(s) below on explanations about why -000001 was chosen and // why the is_write_index is true as well as the bootstrapping step which is needed. // Ref: https://www.elastic.co/guide/en/elasticsearch/reference/current/applying-policy-to-template.html export const createBootstrapIndex = async ( - callWithRequest: CallWithRequest< - { path: string; method: 'PUT'; body: unknown }, - CallClusterOptions, - boolean - >, + callWithRequest: CallWithRequest<{ path: string; method: 'PUT'; body: unknown }, boolean>, index: string ): Promise => { return callWithRequest('transport.request', { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/delete_all_index.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/delete_all_index.ts index b1d8f994615ae..d165bf69f1da1 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/delete_all_index.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/delete_all_index.ts @@ -5,11 +5,10 @@ */ import { IndicesDeleteParams } from 'elasticsearch'; -import { CallClusterOptions } from 'src/legacy/core_plugins/elasticsearch'; import { CallWithRequest } from '../types'; export const deleteAllIndex = async ( - callWithRequest: CallWithRequest, + callWithRequest: CallWithRequest, index: string ): Promise => { return callWithRequest('indices.delete', { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/delete_policy.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/delete_policy.ts index aa31c427ec84f..00213e271c7e8 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/delete_policy.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/delete_policy.ts @@ -7,7 +7,7 @@ import { CallWithRequest } from '../types'; export const deletePolicy = async ( - callWithRequest: CallWithRequest<{ path: string; method: 'DELETE' }, {}, unknown>, + callWithRequest: CallWithRequest<{ path: string; method: 'DELETE' }, unknown>, policy: string ): Promise => { return callWithRequest('transport.request', { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/delete_template.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/delete_template.ts index 63c32d13ccb8d..3402c25fb1ab1 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/delete_template.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/delete_template.ts @@ -5,11 +5,10 @@ */ import { IndicesDeleteTemplateParams } from 'elasticsearch'; -import { CallClusterOptions } from 'src/legacy/core_plugins/elasticsearch'; import { CallWithRequest } from '../types'; export const deleteTemplate = async ( - callWithRequest: CallWithRequest, + callWithRequest: CallWithRequest, name: string ): Promise => { return callWithRequest('indices.deleteTemplate', { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/get_index_exists.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/get_index_exists.ts index 705f542b50124..d81f23a283451 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/get_index_exists.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/get_index_exists.ts @@ -9,7 +9,6 @@ import { CallWithRequest } from '../types'; export const getIndexExists = async ( callWithRequest: CallWithRequest< { index: string; size: number; terminate_after: number; allow_no_indices: boolean }, - {}, { _shards: { total: number } } >, index: string diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/get_policy_exists.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/get_policy_exists.ts index d5ab1a10180c0..8a54ceac8ab78 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/get_policy_exists.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/get_policy_exists.ts @@ -7,7 +7,7 @@ import { CallWithRequest } from '../types'; export const getPolicyExists = async ( - callWithRequest: CallWithRequest<{ path: string; method: 'GET' }, {}, unknown>, + callWithRequest: CallWithRequest<{ path: string; method: 'GET' }, unknown>, policy: string ): Promise => { try { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/get_template_exists.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/get_template_exists.ts index fac402155619e..fd5eec8db4140 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/get_template_exists.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/get_template_exists.ts @@ -5,11 +5,10 @@ */ import { IndicesExistsTemplateParams } from 'elasticsearch'; -import { CallClusterOptions } from 'src/legacy/core_plugins/elasticsearch'; import { CallWithRequest } from '../types'; export const getTemplateExists = async ( - callWithRequest: CallWithRequest, + callWithRequest: CallWithRequest, template: string ): Promise => { return callWithRequest('indices.existsTemplate', { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/read_index.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/read_index.ts index 0abe2b992b780..ca987f85c446c 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/read_index.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/read_index.ts @@ -5,11 +5,10 @@ */ import { IndicesGetSettingsParams } from 'elasticsearch'; -import { CallClusterOptions } from 'src/legacy/core_plugins/elasticsearch'; import { CallWithRequest } from '../types'; export const readIndex = async ( - callWithRequest: CallWithRequest, + callWithRequest: CallWithRequest, index: string ): Promise => { return callWithRequest('indices.get', { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/set_policy.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/set_policy.ts index fae28bab749ca..90d5bf9a9871b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/set_policy.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/set_policy.ts @@ -7,7 +7,7 @@ import { CallWithRequest } from '../types'; export const setPolicy = async ( - callWithRequest: CallWithRequest<{ path: string; method: 'PUT'; body: unknown }, {}, unknown>, + callWithRequest: CallWithRequest<{ path: string; method: 'PUT'; body: unknown }, unknown>, policy: string, body: unknown ): Promise => { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/set_template.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/set_template.ts index dc9ad5dda9f7d..0894f930feffb 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/set_template.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/index/set_template.ts @@ -5,11 +5,10 @@ */ import { IndicesPutTemplateParams } from 'elasticsearch'; -import { CallClusterOptions } from 'src/legacy/core_plugins/elasticsearch'; import { CallWithRequest } from '../types'; export const setTemplate = async ( - callWithRequest: CallWithRequest, + callWithRequest: CallWithRequest, name: string, body: unknown ): Promise => { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/privileges/read_privileges.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/privileges/read_privileges.ts index a93be40738e57..01819eb4703fb 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/privileges/read_privileges.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/privileges/read_privileges.ts @@ -7,7 +7,7 @@ import { CallWithRequest } from '../types'; export const readPrivileges = async ( - callWithRequest: CallWithRequest, + callWithRequest: CallWithRequest<{}, unknown>, index: string ): Promise => { return callWithRequest('transport.request', { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts index a2cb0940a8d15..9482d74daca9a 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts @@ -9,7 +9,7 @@ import { DETECTION_ENGINE_SIGNALS_STATUS_URL } from '../../../../../common/const import { SignalsStatusRequest } from '../../signals/types'; import { setSignalsStatusSchema } from '../schemas/set_signal_status_schema'; import { LegacySetupServices } from '../../../../plugin'; -import { transformError, getIndex } from '../utils'; +import { transformError, getIndex, callWithRequestFactory } from '../utils'; export const setSignalsStatusRouteDef = (services: LegacySetupServices): Hapi.ServerRoute => { return { @@ -27,7 +27,7 @@ export const setSignalsStatusRouteDef = (services: LegacySetupServices): Hapi.Se async handler(request: SignalsStatusRequest) { const { signal_ids: signalIds, query, status } = request.payload; const index = getIndex(request, services); - const { callWithRequest } = services.plugins.elasticsearch.getCluster('data'); + const callWithRequest = callWithRequestFactory(request, services); let queryObject; if (signalIds) { queryObject = { ids: { values: signalIds } }; @@ -40,7 +40,7 @@ export const setSignalsStatusRouteDef = (services: LegacySetupServices): Hapi.Se }; } try { - return callWithRequest(request, 'updateByQuery', { + return callWithRequest('updateByQuery', { index, body: { script: { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts index fffa0e730fd7e..d91aa4c5901e7 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts @@ -9,7 +9,7 @@ import { DETECTION_ENGINE_QUERY_SIGNALS_URL } from '../../../../../common/consta import { SignalsQueryRequest } from '../../signals/types'; import { querySignalsSchema } from '../schemas/query_signals_index_schema'; import { LegacySetupServices } from '../../../../plugin'; -import { transformError, getIndex } from '../utils'; +import { transformError, getIndex, callWithRequestFactory } from '../utils'; export const querySignalsRouteDef = (services: LegacySetupServices): Hapi.ServerRoute => { return { @@ -27,10 +27,10 @@ export const querySignalsRouteDef = (services: LegacySetupServices): Hapi.Server async handler(request: SignalsQueryRequest) { const { query, aggs, _source, track_total_hits, size } = request.payload; const index = getIndex(request, services); - const { callWithRequest } = services.plugins.elasticsearch.getCluster('data'); + const callWithRequest = callWithRequestFactory(request, services); try { - return callWithRequest(request, 'search', { + return callWithRequest('search', { index, body: { query, aggs, _source, track_total_hits, size }, }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts index 47f2026665042..e2daa2e1e6825 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts @@ -5,6 +5,7 @@ */ import Boom from 'boom'; +import { CallAPIOptions } from '../../../../../../../../src/core/server'; import { APP_ID, SIGNALS_INDEX_KEY } from '../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../plugin'; @@ -164,8 +165,8 @@ export const getIndex = (request: RequestFacade, services: LegacySetupServices): }; export const callWithRequestFactory = (request: RequestFacade, services: LegacySetupServices) => { - const { callWithRequest } = services.plugins.elasticsearch.getCluster('data'); - return (endpoint: string, params: T, options?: U) => { - return callWithRequest(request, endpoint, params, options); - }; + const { callAsCurrentUser } = services.elasticsearch.dataClient.asScoped(request); + + return (endpoint: string, params: T, options?: CallAPIOptions): Promise => + callAsCurrentUser(endpoint, params, options); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/types.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/types.ts index e1069db98c8fc..65c0b222c09d0 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/types.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/types.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import { CallAPIOptions } from '../../../../../../../src/core/server'; import { esFilters } from '../../../../../../../src/plugins/data/server'; import { IRuleStatusAttributes } from './rules/types'; @@ -117,4 +118,9 @@ export type PrepackagedRules = Omit< | 'created_at' > & { rule_id: string; immutable: boolean }; -export type CallWithRequest = (endpoint: string, params: T, options?: U) => Promise; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type CallWithRequest, V> = ( + endpoint: string, + params: T, + options?: CallAPIOptions +) => Promise; diff --git a/x-pack/legacy/plugins/siem/server/types.ts b/x-pack/legacy/plugins/siem/server/types.ts index ed16b1e501137..b5d3871c0a20c 100644 --- a/x-pack/legacy/plugins/siem/server/types.ts +++ b/x-pack/legacy/plugins/siem/server/types.ts @@ -13,7 +13,6 @@ export interface ServerFacade { // eslint-disable-next-line @typescript-eslint/no-explicit-any actions: any; // We have to do this at the moment because the types are not compatible alerting?: Legacy.Server['plugins']['alerting']; - elasticsearch: Legacy.Server['plugins']['elasticsearch']; savedObjects: Legacy.Server['savedObjects']['SavedObjectsClient']; }; route: Legacy.Server['route']; From 8ccaf4b8e135b676e76f3114bcad7984ff682bd8 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Wed, 5 Feb 2020 17:33:30 -0600 Subject: [PATCH 15/39] Update DE mocks with NP elasticsearch * createMockServer now returns the callCluster mock, so that you can easily mock a client response without needing to know the details of how we define that function --- .../routes/__mocks__/_mock_server.ts | 35 +++++------- .../routes/__mocks__/request_responses.ts | 9 +++ .../privileges/read_privileges_route.test.ts | 8 +-- .../rules/add_prepackaged_rules_route.test.ts | 16 +++--- .../rules/create_rules_bulk_route.test.ts | 9 +-- .../routes/rules/create_rules_route.test.ts | 16 +++--- .../get_prepackaged_rule_status_route.test.ts | 9 +-- .../routes/signals/open_close_signals.test.ts | 8 +-- .../signals/query_signals_route.test.ts | 56 ++++++++----------- 9 files changed, 77 insertions(+), 89 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts index 477079c55b37c..78a2185cbab04 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts @@ -6,7 +6,10 @@ import Hapi from 'hapi'; import { KibanaConfig } from 'src/legacy/server/kbn_server'; -import { savedObjectsClientMock } from '../../../../../../../../../src/core/server/mocks'; +import { + elasticsearchServiceMock, + savedObjectsClientMock, +} from '../../../../../../../../../src/core/server/mocks'; import { alertsClientMock } from '../../../../../../alerting/server/alerts_client.mock'; import { actionsClientMock } from '../../../../../../../../plugins/actions/server/mocks'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths @@ -46,24 +49,19 @@ const createMockKibanaConfig = (config: Record = defaultConfig): export const createMockServer = (hasAlertsClient = true) => { const actionsClient = actionsClientMock.create(); const alertsClient = alertsClientMock.create(); + const elasticsearch = elasticsearchServiceMock.createSetup(); const savedObjectsClient = savedObjectsClientMock.create(); const spacesService = spacesServiceMock.createSetupContract(); - const elasticsearch = { - getCluster: jest.fn().mockImplementation(() => ({ - callWithRequest: jest.fn(), - })), - }; const server = new Hapi.Server({ port: 0 }); server.decorate('request', 'getSavedObjectsClient', () => savedObjectsClient); if (hasAlertsClient) server.decorate('request', 'getAlertsClient', () => alertsClient); - const npServices = { spaces: { spacesService } }; + const npServices = { elasticsearch, spaces: { spacesService } }; const legacyServices = { config: createMockKibanaConfig, plugins: { - elasticsearch, actions: { getActionsClientWithRequest: () => actionsClient, }, @@ -78,24 +76,19 @@ export const createMockServer = (hasAlertsClient = true) => { return { inject: server.inject.bind(server), services, + callClusterMock: createCallClusterMock(elasticsearch), alertsClient, actionsClient, - elasticsearch, savedObjectsClient, }; }; -export const getMockIndexName = () => - jest.fn().mockImplementation(() => ({ - callWithRequest: jest.fn().mockImplementationOnce(() => 'index-name'), - })); - -export const getMockEmptyIndex = () => - jest.fn().mockImplementation(() => ({ - callWithRequest: jest.fn().mockImplementation(() => ({ _shards: { total: 0 } })), +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const createCallClusterMock = (elasticMock: any) => { + const mock = jest.fn(); + elasticMock.dataClient.asScoped.mockImplementation(() => ({ + callAsCurrentUser: mock, })); -export const getMockNonEmptyIndex = () => - jest.fn().mockImplementation(() => ({ - callWithRequest: jest.fn().mockImplementation(() => ({ _shards: { total: 1 } })), - })); + return mock; +}; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_responses.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_responses.ts index 19c4279e06b03..b10b01bdea923 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_responses.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_responses.ts @@ -17,6 +17,7 @@ import { INTERNAL_IMMUTABLE_KEY, DETECTION_ENGINE_PREPACKAGED_URL, } from '../../../../../common/constants'; +import { ShardsResponse } from '../../../types'; import { RuleAlertType, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { RuleAlertParamsRest, PrepackagedRules } from '../../types'; @@ -399,3 +400,11 @@ export const getFindResultStatus = (): SavedObjectsFindResponse 'index-name'; +export const getEmptyIndex = (): { _shards: Partial } => ({ + _shards: { total: 0 }, +}); +export const getNonEmptyIndex = (): { _shards: Partial } => ({ + _shards: { total: 1 }, +}); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.test.ts index 97f1593c6eb5b..4867dcd2037d8 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.test.ts @@ -10,14 +10,12 @@ import { readPrivilegesRoute } from './read_privileges_route'; import * as myUtils from '../utils'; describe('read_privileges', () => { - let { inject, services, elasticsearch } = createMockServer(); + let { inject, services, callClusterMock } = createMockServer(); beforeEach(() => { jest.spyOn(myUtils, 'getIndex').mockReturnValue('fakeindex'); - ({ inject, services, elasticsearch } = createMockServer()); - elasticsearch.getCluster = jest.fn(() => ({ - callWithRequest: jest.fn(() => getMockPrivileges()), - })); + ({ inject, services, callClusterMock } = createMockServer()); + callClusterMock.mockImplementation(getMockPrivileges); readPrivilegesRoute(services); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts index e7c6a4863da4a..ef97a92f355b9 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts @@ -4,11 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - createMockServer, - getMockEmptyIndex, - getMockNonEmptyIndex, -} from '../__mocks__/_mock_server'; +import { createMockServer } from '../__mocks__/_mock_server'; import { createRulesRoute } from './create_rules_route'; import { getFindResult, @@ -16,6 +12,8 @@ import { createActionResult, addPrepackagedRulesRequest, getFindResultWithSingleHit, + getEmptyIndex, + getNonEmptyIndex, } from '../__mocks__/request_responses'; jest.mock('../../rules/get_prepackaged_rules', () => { @@ -47,12 +45,12 @@ import { addPrepackedRulesRoute } from './add_prepackaged_rules_route'; import { PrepackagedRules } from '../../types'; describe('add_prepackaged_rules_route', () => { - let { services, inject, alertsClient, actionsClient, elasticsearch } = createMockServer(); + let { services, inject, alertsClient, actionsClient, callClusterMock } = createMockServer(); beforeEach(() => { jest.resetAllMocks(); - ({ services, inject, alertsClient, actionsClient, elasticsearch } = createMockServer()); - elasticsearch.getCluster = getMockNonEmptyIndex(); + ({ services, inject, alertsClient, actionsClient, callClusterMock } = createMockServer()); + callClusterMock.mockImplementation(getNonEmptyIndex); addPrepackedRulesRoute(services); }); @@ -77,7 +75,7 @@ describe('add_prepackaged_rules_route', () => { describe('validation', () => { test('it returns a 400 if the index does not exist', async () => { - elasticsearch.getCluster = getMockEmptyIndex(); + callClusterMock.mockImplementation(getEmptyIndex); alertsClient.find.mockResolvedValue(getFindResult()); alertsClient.get.mockResolvedValue(getResult()); actionsClient.create.mockResolvedValue(createActionResult()); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts index 3c008f20dea74..244c25b8004af 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createMockServer, getMockEmptyIndex } from '../__mocks__/_mock_server'; +import { createMockServer } from '../__mocks__/_mock_server'; import { createRulesRoute } from './create_rules_route'; import { ServerInjectOptions } from 'hapi'; import { @@ -13,16 +13,17 @@ import { createActionResult, typicalPayload, getReadBulkRequest, + getEmptyIndex, } from '../__mocks__/request_responses'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { createRulesBulkRoute } from './create_rules_bulk_route'; describe('create_rules_bulk', () => { - let { services, inject, alertsClient, actionsClient, elasticsearch } = createMockServer(); + let { services, inject, alertsClient, actionsClient, callClusterMock } = createMockServer(); beforeEach(() => { jest.resetAllMocks(); - ({ services, inject, alertsClient, actionsClient, elasticsearch } = createMockServer()); + ({ services, inject, alertsClient, actionsClient, callClusterMock } = createMockServer()); createRulesBulkRoute(services); }); @@ -46,7 +47,7 @@ describe('create_rules_bulk', () => { describe('validation', () => { test('it gets a 409 if the index does not exist', async () => { - elasticsearch.getCluster = getMockEmptyIndex(); + callClusterMock.mockImplementation(getEmptyIndex); alertsClient.find.mockResolvedValue(getFindResult()); alertsClient.get.mockResolvedValue(getResult()); actionsClient.create.mockResolvedValue(createActionResult()); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts index 5c8ffdb3071d9..9139b167915dd 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts @@ -4,11 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - createMockServer, - getMockNonEmptyIndex, - getMockEmptyIndex, -} from '../__mocks__/_mock_server'; +import { createMockServer } from '../__mocks__/_mock_server'; import { createRulesRoute } from './create_rules_route'; import { ServerInjectOptions } from 'hapi'; @@ -19,6 +15,8 @@ import { getCreateRequest, typicalPayload, getFindResultStatus, + getNonEmptyIndex, + getEmptyIndex, } from '../__mocks__/request_responses'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; @@ -28,7 +26,7 @@ describe('create_rules', () => { inject, alertsClient, actionsClient, - elasticsearch, + callClusterMock, savedObjectsClient, } = createMockServer(); @@ -39,10 +37,10 @@ describe('create_rules', () => { inject, alertsClient, actionsClient, - elasticsearch, + callClusterMock, savedObjectsClient, } = createMockServer()); - elasticsearch.getCluster = getMockNonEmptyIndex(); + callClusterMock.mockImplementation(getNonEmptyIndex); createRulesRoute(services); }); @@ -67,7 +65,7 @@ describe('create_rules', () => { describe('validation', () => { test('it returns a 400 if the index does not exist', async () => { - elasticsearch.getCluster = getMockEmptyIndex(); + callClusterMock.mockImplementation(getEmptyIndex); alertsClient.find.mockResolvedValue(getFindResult()); alertsClient.get.mockResolvedValue(getResult()); actionsClient.create.mockResolvedValue(createActionResult()); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rule_status_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rule_status_route.test.ts index fe322d7e8e708..380d5bdbfc949 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rule_status_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rule_status_route.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createMockServer, getMockNonEmptyIndex } from '../__mocks__/_mock_server'; +import { createMockServer } from '../__mocks__/_mock_server'; import { createRulesRoute } from './create_rules_route'; import { getFindResult, @@ -12,6 +12,7 @@ import { createActionResult, getFindResultWithSingleHit, getPrepackagedRulesStatusRequest, + getNonEmptyIndex, } from '../__mocks__/request_responses'; jest.mock('../../rules/get_prepackaged_rules', () => { @@ -40,12 +41,12 @@ jest.mock('../../rules/get_prepackaged_rules', () => { import { getPrepackagedRulesStatusRoute } from './get_prepackaged_rules_status_route'; describe('get_prepackaged_rule_status_route', () => { - let { services, inject, alertsClient, actionsClient, elasticsearch } = createMockServer(); + let { services, inject, alertsClient, actionsClient, callClusterMock } = createMockServer(); beforeEach(() => { jest.resetAllMocks(); - ({ services, inject, alertsClient, actionsClient, elasticsearch } = createMockServer()); - elasticsearch.getCluster = getMockNonEmptyIndex(); + ({ services, inject, alertsClient, actionsClient, callClusterMock } = createMockServer()); + callClusterMock.mockImplementation(getNonEmptyIndex); getPrepackagedRulesStatusRoute(services); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals.test.ts index 49e7509c83c86..049a04205d94d 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals.test.ts @@ -19,15 +19,13 @@ import { import { DETECTION_ENGINE_SIGNALS_STATUS_URL } from '../../../../../common/constants'; describe('set signal status', () => { - let { inject, services, elasticsearch } = createMockServer(); + let { inject, services, callClusterMock } = createMockServer(); beforeEach(() => { jest.resetAllMocks(); jest.spyOn(myUtils, 'getIndex').mockReturnValue('fakeindex'); - ({ inject, services, elasticsearch } = createMockServer()); - elasticsearch.getCluster = jest.fn(() => ({ - callWithRequest: jest.fn(() => true), - })); + ({ inject, services, callClusterMock } = createMockServer()); + callClusterMock.mockImplementation(() => true); setSignalsStatusRoute(services); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.test.ts index 669e6723ae009..8d1f97c1ab76f 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.test.ts @@ -18,42 +18,36 @@ import { import { DETECTION_ENGINE_QUERY_SIGNALS_URL } from '../../../../../common/constants'; describe('query for signal', () => { - let { inject, services, elasticsearch } = createMockServer(); + let { inject, services, callClusterMock } = createMockServer(); beforeEach(() => { jest.resetAllMocks(); jest.spyOn(myUtils, 'getIndex').mockReturnValue('fakeindex'); - ({ inject, services, elasticsearch } = createMockServer()); - elasticsearch.getCluster = jest.fn(() => ({ - callWithRequest: jest.fn(() => true), - })); + ({ inject, services, callClusterMock } = createMockServer()); + callClusterMock.mockImplementation(() => true); querySignalsRoute(services); }); describe('query and agg on signals index', () => { test('returns 200 when using single query', async () => { - elasticsearch.getCluster = jest.fn(() => ({ - callWithRequest: jest.fn( - (_req, _type: string, queryBody: { index: string; body: object }) => { - expect(queryBody.body).toMatchObject({ ...typicalSignalsQueryAggs() }); - return true; - } - ), - })); + callClusterMock.mockImplementation( + (endpoint: string, params: { index: string; body: object }) => { + expect(params.body).toMatchObject({ ...typicalSignalsQueryAggs() }); + return true; + } + ); const { statusCode } = await inject(getSignalsAggsQueryRequest()); expect(statusCode).toBe(200); expect(myUtils.getIndex).toHaveReturnedWith('fakeindex'); }); test('returns 200 when using single agg', async () => { - elasticsearch.getCluster = jest.fn(() => ({ - callWithRequest: jest.fn( - (_req, _type: string, queryBody: { index: string; body: object }) => { - expect(queryBody.body).toMatchObject({ ...typicalSignalsQueryAggs() }); - return true; - } - ), - })); + callClusterMock.mockImplementation( + (endpoint: string, params: { index: string; body: object }) => { + expect(params.body).toMatchObject({ ...typicalSignalsQueryAggs() }); + return true; + } + ); const { statusCode } = await inject(getSignalsAggsQueryRequest()); expect(statusCode).toBe(200); expect(myUtils.getIndex).toHaveReturnedWith('fakeindex'); @@ -62,17 +56,15 @@ describe('query for signal', () => { test('returns 200 when using aggs and query together', async () => { const allTogether = getSignalsQueryRequest(); allTogether.payload = { ...typicalSignalsQueryAggs(), ...typicalSignalsQuery() }; - elasticsearch.getCluster = jest.fn(() => ({ - callWithRequest: jest.fn( - (_req, _type: string, queryBody: { index: string; body: object }) => { - expect(queryBody.body).toMatchObject({ - ...typicalSignalsQueryAggs(), - ...typicalSignalsQuery(), - }); - return true; - } - ), - })); + callClusterMock.mockImplementation( + (endpoint: string, params: { index: string; body: object }) => { + expect(params.body).toMatchObject({ + ...typicalSignalsQueryAggs(), + ...typicalSignalsQuery(), + }); + return true; + } + ); const { statusCode } = await inject(allTogether); expect(statusCode).toBe(200); expect(myUtils.getIndex).toHaveReturnedWith('fakeindex'); From 98d56b8b21f7bdf04e11e4b53bfc6aa6085008b0 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Wed, 5 Feb 2020 17:46:38 -0600 Subject: [PATCH 16/39] Remove savedObjects dependency from our legacy dependencies This was added during a refactor, but we were never actually using this code. We always retrieve the client from the request via getSavedObjectsClient. I think that the NP client has a slightly different interface, so we're going to create a helper to retrieve it from the request, same as we do with the elastic client. In the future, both of these will be available on the request context, and we can remove the helpers entirely. --- x-pack/legacy/plugins/siem/index.ts | 1 - x-pack/legacy/plugins/siem/server/types.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/x-pack/legacy/plugins/siem/index.ts b/x-pack/legacy/plugins/siem/index.ts index 4ba983ad6d82c..a3ed4cc4897a3 100644 --- a/x-pack/legacy/plugins/siem/index.ts +++ b/x-pack/legacy/plugins/siem/index.ts @@ -156,7 +156,6 @@ export const siem = (kibana: any) => { plugins: { alerting: plugins.alerting, actions: newPlatform.start.plugins.actions, - savedObjects: server.savedObjects.SavedObjectsClient, }, route: route.bind(server), }; diff --git a/x-pack/legacy/plugins/siem/server/types.ts b/x-pack/legacy/plugins/siem/server/types.ts index b5d3871c0a20c..32ccd0444768d 100644 --- a/x-pack/legacy/plugins/siem/server/types.ts +++ b/x-pack/legacy/plugins/siem/server/types.ts @@ -13,7 +13,6 @@ export interface ServerFacade { // eslint-disable-next-line @typescript-eslint/no-explicit-any actions: any; // We have to do this at the moment because the types are not compatible alerting?: Legacy.Server['plugins']['alerting']; - savedObjects: Legacy.Server['savedObjects']['SavedObjectsClient']; }; route: Legacy.Server['route']; } From 00d089d40bc3af6e7cf3131c716db6361f95b383 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Thu, 6 Feb 2020 13:11:49 -0600 Subject: [PATCH 17/39] WIP: Convert services to stateful object In trying to migrate over the savedObjectsClient, I realized that it is not available during setup in the same way that the ES client is. Since our routes need pieces from both setup and start phases, I've added a Services class to accumulate/transform these services and expose scoped clients when given a legacy request. In New Platform, these clients will be available upon the request context and we should be able to remove getScopedServicesFactory for our routes. A subset of Services' functionality may still be useful, we'll see. --- x-pack/legacy/plugins/siem/index.ts | 9 ++- .../routes/rules/create_rules_route.ts | 44 ++++++------ .../lib/detection_engine/routes/utils.ts | 17 ++--- .../lib/detection_engine/rules/types.ts | 2 +- x-pack/legacy/plugins/siem/server/plugin.ts | 35 +++++++-- .../plugins/siem/server/routes/index.ts | 11 ++- x-pack/legacy/plugins/siem/server/services.ts | 71 +++++++++++++++++++ 7 files changed, 148 insertions(+), 41 deletions(-) create mode 100644 x-pack/legacy/plugins/siem/server/services.ts diff --git a/x-pack/legacy/plugins/siem/index.ts b/x-pack/legacy/plugins/siem/index.ts index a3ed4cc4897a3..659742c8bc783 100644 --- a/x-pack/legacy/plugins/siem/index.ts +++ b/x-pack/legacy/plugins/siem/index.ts @@ -149,18 +149,21 @@ export const siem = (kibana: any) => { }, init(server: Server) { const { config, newPlatform, plugins, route } = server; - const { coreContext, env, setup } = newPlatform; + const { coreContext, env, setup, start } = newPlatform; const initializerContext = { ...coreContext, env }; const serverFacade = { config, plugins: { alerting: plugins.alerting, - actions: newPlatform.start.plugins.actions, }, route: route.bind(server), }; // @ts-ignore-next-line: NewPlatform shim is too loosely typed - plugin(initializerContext).setup(setup.core, setup.plugins, serverFacade); + const pluginInstance = plugin(initializerContext); + // @ts-ignore-next-line: NewPlatform shim is too loosely typed + pluginInstance.setup(setup.core, setup.plugins, serverFacade); + // @ts-ignore-next-line: NewPlatform shim is too loosely typed + pluginInstance.start(start.core, start.plugins); }, config(Joi: Root) { // See x-pack/plugins/siem/server/config.ts if you're adding another diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts index ea8f7a00f2afd..d7a85f65dc6ba 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts @@ -5,10 +5,11 @@ */ import Hapi from 'hapi'; -import { isFunction } from 'lodash/fp'; import Boom from 'boom'; import uuid from 'uuid'; + import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { LegacyGetScopedServices } from '../../../../services'; import { createRules } from '../../rules/create_rules'; import { RulesRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { createRulesSchema } from '../schemas/create_rules_schema'; @@ -17,10 +18,9 @@ import { readRules } from '../../rules/read_rules'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { transformOrError } from './utils'; import { getIndexExists } from '../../index/get_index_exists'; -import { callWithRequestFactory, getIndex, transformError } from '../utils'; -import { KibanaRequest } from '../../../../../../../../../src/core/server'; +import { getIndex, transformError } from '../utils'; -export const createCreateRulesRoute = (services: LegacySetupServices): Hapi.ServerRoute => { +export const createCreateRulesRoute = (getServices: LegacyGetScopedServices): Hapi.ServerRoute => { return { method: 'POST', path: DETECTION_ENGINE_RULES_URL, @@ -60,21 +60,22 @@ export const createCreateRulesRoute = (services: LegacySetupServices): Hapi.Serv type, references, } = request.payload; - const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const actionsClient = await services.plugins.actions.getActionsClientWithRequest( - KibanaRequest.from(request) - ); - const savedObjectsClient = isFunction(request.getSavedObjectsClient) - ? request.getSavedObjectsClient() - : null; - if (!alertsClient || !savedObjectsClient) { - return headers.response().code(404); - } - try { - const finalIndex = outputIndex != null ? outputIndex : getIndex(request, services); - const callWithRequest = callWithRequestFactory(request, services); - const indexExists = await getIndexExists(callWithRequest, finalIndex); + const { + alertsClient, + actionsClient, + config, + callCluster, + getSpaceId, + savedObjectsClient, + } = await getServices(request); + + if (!alertsClient || !savedObjectsClient) { + return headers.response().code(404); + } + + const finalIndex = outputIndex != null ? outputIndex : getIndex(getSpaceId, config); + const indexExists = await getIndexExists(callCluster, finalIndex); if (!indexExists) { return Boom.badRequest( `To create a rule, the index must exist first. Index ${finalIndex} does not exist` @@ -134,6 +135,9 @@ export const createCreateRulesRoute = (services: LegacySetupServices): Hapi.Serv }; }; -export const createRulesRoute = (services: LegacySetupServices): void => { - services.route(createCreateRulesRoute(services)); +export const createRulesRoute = ( + route: LegacySetupServices['route'], + getServices: LegacyGetScopedServices +): void => { + route(createCreateRulesRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts index e2daa2e1e6825..9a02bc28a272f 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts @@ -8,6 +8,7 @@ import Boom from 'boom'; import { CallAPIOptions } from '../../../../../../../../src/core/server'; import { APP_ID, SIGNALS_INDEX_KEY } from '../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../plugin'; +import { ScopedServices } from '../../../services'; export const transformError = (err: Error & { statusCode?: number }) => { if (Boom.isBoom(err)) { @@ -158,15 +159,11 @@ export const transformBulkError = ( } }; -export const getIndex = (request: RequestFacade, services: LegacySetupServices): string => { - const spaceId = services.spaces.spacesService.getSpaceId(request); - const signalsIndex = services.config().get(`xpack.${APP_ID}.${SIGNALS_INDEX_KEY}`); +export const getIndex = ( + getSpaceId: ScopedServices['getSpaceId'], + config: ScopedServices['config'] +): string => { + const spaceId = getSpaceId(); + const signalsIndex = config().get(`xpack.${APP_ID}.${SIGNALS_INDEX_KEY}`); return `${signalsIndex}-${spaceId}`; }; - -export const callWithRequestFactory = (request: RequestFacade, services: LegacySetupServices) => { - const { callAsCurrentUser } = services.elasticsearch.dataClient.asScoped(request); - - return (endpoint: string, params: T, options?: CallAPIOptions): Promise => - callAsCurrentUser(endpoint, params, options); -}; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/types.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/types.ts index 1d423c8b375d1..0e0f6c2ab053b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/types.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/types.ts @@ -150,7 +150,7 @@ export interface FindRulesStatusesRequest extends Omit { export interface Clients { alertsClient: AlertsClient; - actionsClient: ActionsClient; + actionsClient: ActionsClient | null | undefined; } export type UpdateRuleParams = Partial & { diff --git a/x-pack/legacy/plugins/siem/server/plugin.ts b/x-pack/legacy/plugins/siem/server/plugin.ts index eb7a405523dfd..fc5efbbc993d6 100644 --- a/x-pack/legacy/plugins/siem/server/plugin.ts +++ b/x-pack/legacy/plugins/siem/server/plugin.ts @@ -5,14 +5,20 @@ */ import { i18n } from '@kbn/i18n'; -import { CoreSetup, PluginInitializerContext, Logger } from '../../../../../src/core/server'; +import { + CoreSetup, + CoreStart, + PluginInitializerContext, + Logger, +} from '../../../../../src/core/server'; import { SecurityPluginSetup as SecuritySetup } from '../../../../plugins/security/server'; import { PluginSetupContract as FeaturesSetup } from '../../../../plugins/features/server'; import { EncryptedSavedObjectsPluginSetup as EncryptedSavedObjectsSetup } from '../../../../plugins/encrypted_saved_objects/server'; import { SpacesPluginSetup as SpacesSetup } from '../../../../plugins/spaces/server'; +import { PluginStartContract as ActionsStart } from '../../../../plugins/actions/server'; import { initServer } from './init_server'; import { compose } from './lib/compose/kibana'; -import { initRoutes } from './routes'; +import { initRoutes, LegacyInitRoutes } from './routes'; import { isAlertExecutor } from './lib/detection_engine/signals/types'; import { signalRulesAlertType } from './lib/detection_engine/signals/signal_rule_alert_type'; import { @@ -22,8 +28,9 @@ import { ruleStatusSavedObjectType, } from './saved_objects'; import { RequestFacade, ServerFacade } from './types'; +import { Services } from './services'; -export { CoreSetup, Logger, PluginInitializerContext, RequestFacade }; +export { CoreSetup, CoreStart, Logger, PluginInitializerContext, RequestFacade }; export interface SetupPlugins { encryptedSavedObjects: EncryptedSavedObjectsSetup; @@ -35,14 +42,21 @@ export interface SetupPlugins { export type SetupServices = CoreSetup & SetupPlugins; export type LegacySetupServices = SetupServices & ServerFacade; +export interface StartPlugins { + actions: ActionsStart; +} + export class Plugin { readonly name = 'siem'; private readonly logger: Logger; private context: PluginInitializerContext; + private services: Services; + private legacyInitRoutes?: LegacyInitRoutes; constructor(context: PluginInitializerContext) { this.context = context; this.logger = context.logger.get('plugins', this.name); + this.services = new Services(); this.logger.debug('Shim plugin initialized'); } @@ -50,6 +64,14 @@ export class Plugin { public setup(core: CoreSetup, plugins: SetupPlugins, __legacy: ServerFacade) { this.logger.debug('Shim plugin setup'); + this.services.setup( + core.elasticsearch.dataClient, + plugins.spaces.spacesService, + __legacy.config + ); + + this.legacyInitRoutes = initRoutes(__legacy.route); + plugins.features.registerFeature({ id: this.name, name: i18n.translate('xpack.siem.featureRegistry.linkSiemTitle', { @@ -122,6 +144,11 @@ export class Plugin { const libs = compose(core, plugins, this.context.env); initServer(libs); - initRoutes({ ...core, ...plugins, ...__legacy }); + } + + public start(core: CoreStart, plugins: StartPlugins) { + this.services.start(core.savedObjects, plugins.actions); + + this.legacyInitRoutes!(this.services.getScopedServicesFactory()); } } diff --git a/x-pack/legacy/plugins/siem/server/routes/index.ts b/x-pack/legacy/plugins/siem/server/routes/index.ts index 3793f6ffdc1e7..10c862d256271 100644 --- a/x-pack/legacy/plugins/siem/server/routes/index.ts +++ b/x-pack/legacy/plugins/siem/server/routes/index.ts @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { LegacySetupServices } from '../plugin'; +import { ServerFacade } from '../types'; +import { LegacyGetScopedServices } from '../services'; import { createRulesRoute } from '../lib/detection_engine/routes/rules/create_rules_route'; import { createIndexRoute } from '../lib/detection_engine/routes/index/create_index_route'; @@ -27,10 +28,14 @@ import { exportRulesRoute } from '../lib/detection_engine/routes/rules/export_ru import { findRulesStatusesRoute } from '../lib/detection_engine/routes/rules/find_rules_status_route'; import { getPrepackagedRulesStatusRoute } from '../lib/detection_engine/routes/rules/get_prepackaged_rules_status_route'; -export const initRoutes = (services: LegacySetupServices) => { +export type LegacyInitRoutes = (getServices: LegacyGetScopedServices) => void; + +export const initRoutes = (route: ServerFacade['route']) => ( + getServices: LegacyGetScopedServices +): void => { // Detection Engine Rule routes that have the REST endpoints of /api/detection_engine/rules // All REST rule creation, deletion, updating, etc...... - createRulesRoute(services); + createRulesRoute(route, getServices); readRulesRoute(services); updateRulesRoute(services); deleteRulesRoute(services); diff --git a/x-pack/legacy/plugins/siem/server/services.ts b/x-pack/legacy/plugins/siem/server/services.ts new file mode 100644 index 0000000000000..e1f062a766ff1 --- /dev/null +++ b/x-pack/legacy/plugins/siem/server/services.ts @@ -0,0 +1,71 @@ +/* + * 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 { + IClusterClient, + IScopedClusterClient, + KibanaRequest, + LegacyRequest, + SavedObjectsClientContract, +} from '../../../../../src/core/server'; +import { ActionsClient } from '../../../../plugins/actions/server'; +import { AlertsClient } from '../../../../legacy/plugins/alerting/server'; +import { CoreStart, LegacySetupServices, StartPlugins, SetupPlugins } from './plugin'; + +export interface SiemServices { + actionsClient?: ActionsClient; + callCluster: IScopedClusterClient['callAsCurrentUser']; + getSpaceId: () => string | undefined; + savedObjectsClient: SavedObjectsClientContract; +} +interface LegacySiemServices { + alertsClient?: AlertsClient; + config: LegacySetupServices['config']; +} +export type ScopedServices = SiemServices & LegacySiemServices; +export type LegacyGetScopedServices = (request: LegacyRequest) => Promise; + +export class Services { + private actions?: StartPlugins['actions']; + private clusterClient?: IClusterClient; + private config?: LegacySetupServices['config']; + private savedObjects?: CoreStart['savedObjects']; + private spacesService?: SetupPlugins['spaces']['spacesService']; + + public setup( + clusterClient: IClusterClient, + spacesService: SetupPlugins['spaces']['spacesService'], + config: LegacySetupServices['config'] + ) { + this.clusterClient = clusterClient; + this.spacesService = spacesService; + this.config = config; + } + + public start(savedObjects: CoreStart['savedObjects'], actions: StartPlugins['actions']) { + this.savedObjects = savedObjects; + this.actions = actions; + } + + public getScopedServicesFactory(): LegacyGetScopedServices { + if (!this.clusterClient || !this.savedObjects) { + throw new Error('Services not initialized'); + } + + return async (request: LegacyRequest) => { + const kibanaRequest = KibanaRequest.from(request); + + return { + alertsClient: request.getAlertsClient?.(), + actionsClient: await this.actions?.getActionsClientWithRequest?.(kibanaRequest), + callCluster: this.clusterClient!.asScoped(kibanaRequest).callAsCurrentUser, + config: this.config!, + getSpaceId: () => this.spacesService?.getSpaceId?.(kibanaRequest), + savedObjectsClient: this.savedObjects!.getScopedClient(kibanaRequest), + }; + }; + } +} From 35bfc0b4f2f032084af04b2dc35c7ac95ac0694f Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Thu, 6 Feb 2020 16:21:01 -0600 Subject: [PATCH 18/39] WIP: Converting routes to use Services factory I decided that config shouldn't live in here, as this is only client-related stuff. Probably going to rename this ClientsService. Things are still very much broken. --- .../routes/index/create_index_route.ts | 35 ++++++++----- .../routes/index/delete_index_route.ts | 33 +++++++----- .../routes/index/read_index_route.ts | 24 ++++++--- .../privileges/read_privileges_route.ts | 28 ++++++---- .../rules/add_prepackaged_rules_route.ts | 46 +++++++++-------- .../routes/rules/create_rules_bulk_route.ts | 47 +++++++++-------- .../routes/rules/create_rules_route.ts | 11 ++-- .../routes/rules/delete_rules_bulk_route.ts | 28 +++++----- .../routes/rules/delete_rules_route.ts | 28 +++++----- .../routes/rules/export_rules_route.ts | 24 ++++++--- .../routes/rules/find_rules_route.ts | 28 +++++----- .../routes/rules/find_rules_status_route.ts | 26 ++++++---- .../get_prepackaged_rules_status_route.ts | 15 ++++-- .../routes/rules/import_rules_route.ts | 51 ++++++++++--------- .../routes/rules/read_rules_route.ts | 30 ++++++----- .../routes/rules/update_rules_bulk_route.ts | 26 +++++----- .../routes/rules/update_rules_route.ts | 29 +++++------ .../signals/open_close_signals_route.ts | 23 ++++++--- .../routes/signals/query_signals_route.ts | 23 ++++++--- .../routes/tags/read_tags_route.ts | 17 ++++--- .../lib/detection_engine/routes/utils.ts | 1 - .../lib/detection_engine/rules/types.ts | 2 +- x-pack/legacy/plugins/siem/server/plugin.ts | 12 ++--- .../plugins/siem/server/routes/index.ts | 48 ++++++++--------- x-pack/legacy/plugins/siem/server/services.ts | 9 +--- 25 files changed, 365 insertions(+), 279 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts index 20def83e8e7b2..37f34879e3770 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts @@ -8,9 +8,9 @@ import Hapi from 'hapi'; import Boom from 'boom'; import { DETECTION_ENGINE_INDEX_URL } from '../../../../../common/constants'; -import signalsPolicy from './signals_policy.json'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { transformError, getIndex, callWithRequestFactory } from '../utils'; +import { LegacyGetScopedServices } from '../../../../services'; +import { transformError, getIndex } from '../utils'; import { getIndexExists } from '../../index/get_index_exists'; import { getPolicyExists } from '../../index/get_policy_exists'; import { setPolicy } from '../../index/set_policy'; @@ -18,8 +18,12 @@ import { setTemplate } from '../../index/set_template'; import { getSignalsTemplate } from './get_signals_template'; import { getTemplateExists } from '../../index/get_template_exists'; import { createBootstrapIndex } from '../../index/create_bootstrap_index'; +import signalsPolicy from './signals_policy.json'; -export const createCreateIndexRoute = (services: LegacySetupServices): Hapi.ServerRoute => { +export const createCreateIndexRoute = ( + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +): Hapi.ServerRoute => { return { method: 'POST', path: DETECTION_ENGINE_INDEX_URL, @@ -33,22 +37,23 @@ export const createCreateIndexRoute = (services: LegacySetupServices): Hapi.Serv }, async handler(request: RequestFacade) { try { - const index = getIndex(request, services); - const callWithRequest = callWithRequestFactory(request, services); - const indexExists = await getIndexExists(callWithRequest, index); + const { callCluster, getSpaceId } = await getServices(request); + + const index = getIndex(getSpaceId, config); + const indexExists = await getIndexExists(callCluster, index); if (indexExists) { return new Boom(`index: "${index}" already exists`, { statusCode: 409 }); } else { - const policyExists = await getPolicyExists(callWithRequest, index); + const policyExists = await getPolicyExists(callCluster, index); if (!policyExists) { - await setPolicy(callWithRequest, index, signalsPolicy); + await setPolicy(callCluster, index, signalsPolicy); } - const templateExists = await getTemplateExists(callWithRequest, index); + const templateExists = await getTemplateExists(callCluster, index); if (!templateExists) { const template = getSignalsTemplate(index); - await setTemplate(callWithRequest, index, template); + await setTemplate(callCluster, index, template); } - await createBootstrapIndex(callWithRequest, index); + await createBootstrapIndex(callCluster, index); return { acknowledged: true }; } } catch (err) { @@ -58,6 +63,10 @@ export const createCreateIndexRoute = (services: LegacySetupServices): Hapi.Serv }; }; -export const createIndexRoute = (services: LegacySetupServices) => { - services.route(createCreateIndexRoute(services)); +export const createIndexRoute = ( + route: LegacySetupServices['route'], + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +) => { + route(createCreateIndexRoute(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts index 8dc283ef45f5c..824d27957100e 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts @@ -9,7 +9,8 @@ import Boom from 'boom'; import { DETECTION_ENGINE_INDEX_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { transformError, getIndex, callWithRequestFactory } from '../utils'; +import { LegacyGetScopedServices } from '../../../../services'; +import { transformError, getIndex } from '../utils'; import { getIndexExists } from '../../index/get_index_exists'; import { getPolicyExists } from '../../index/get_policy_exists'; import { deletePolicy } from '../../index/delete_policy'; @@ -27,7 +28,10 @@ import { deleteTemplate } from '../../index/delete_template'; * * And ensuring they're all gone */ -export const createDeleteIndexRoute = (services: LegacySetupServices): Hapi.ServerRoute => { +export const createDeleteIndexRoute = ( + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +): Hapi.ServerRoute => { return { method: 'DELETE', path: DETECTION_ENGINE_INDEX_URL, @@ -41,20 +45,21 @@ export const createDeleteIndexRoute = (services: LegacySetupServices): Hapi.Serv }, async handler(request: RequestFacade) { try { - const index = getIndex(request, services); - const callWithRequest = callWithRequestFactory(request, services); - const indexExists = await getIndexExists(callWithRequest, index); + const { callCluster, getSpaceId } = await getServices(request); + + const index = getIndex(getSpaceId, config); + const indexExists = await getIndexExists(callCluster, index); if (!indexExists) { return new Boom(`index: "${index}" does not exist`, { statusCode: 404 }); } else { - await deleteAllIndex(callWithRequest, `${index}-*`); - const policyExists = await getPolicyExists(callWithRequest, index); + await deleteAllIndex(callCluster, `${index}-*`); + const policyExists = await getPolicyExists(callCluster, index); if (policyExists) { - await deletePolicy(callWithRequest, index); + await deletePolicy(callCluster, index); } - const templateExists = await getTemplateExists(callWithRequest, index); + const templateExists = await getTemplateExists(callCluster, index); if (templateExists) { - await deleteTemplate(callWithRequest, index); + await deleteTemplate(callCluster, index); } return { acknowledged: true }; } @@ -65,6 +70,10 @@ export const createDeleteIndexRoute = (services: LegacySetupServices): Hapi.Serv }; }; -export const deleteIndexRoute = (services: LegacySetupServices) => { - services.route(createDeleteIndexRoute(services)); +export const deleteIndexRoute = ( + route: LegacySetupServices['route'], + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +) => { + route(createDeleteIndexRoute(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts index 5fa7fa01c5a4b..111c0528cfdf0 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts @@ -9,10 +9,14 @@ import Boom from 'boom'; import { DETECTION_ENGINE_INDEX_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { transformError, getIndex, callWithRequestFactory } from '../utils'; +import { LegacyGetScopedServices } from '../../../../services'; +import { transformError, getIndex } from '../utils'; import { getIndexExists } from '../../index/get_index_exists'; -export const createReadIndexRoute = (services: LegacySetupServices): Hapi.ServerRoute => { +export const createReadIndexRoute = ( + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +): Hapi.ServerRoute => { return { method: 'GET', path: DETECTION_ENGINE_INDEX_URL, @@ -26,9 +30,11 @@ export const createReadIndexRoute = (services: LegacySetupServices): Hapi.Server }, async handler(request: RequestFacade, headers) { try { - const index = getIndex(request, services); - const callWithRequest = callWithRequestFactory(request, services); - const indexExists = await getIndexExists(callWithRequest, index); + const { callCluster, getSpaceId } = await getServices(request); + + const index = getIndex(getSpaceId, config); + const indexExists = await getIndexExists(callCluster, index); + if (indexExists) { // head request is used for if you want to get if the index exists // or not and it will return a content-length: 0 along with either a 200 or 404 @@ -52,6 +58,10 @@ export const createReadIndexRoute = (services: LegacySetupServices): Hapi.Server }; }; -export const readIndexRoute = (services: LegacySetupServices) => { - services.route(createReadIndexRoute(services)); +export const readIndexRoute = ( + route: LegacySetupServices['route'], + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +) => { + route(createReadIndexRoute(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts index 1ad463cfb4edf..b4f0418bc1f13 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts @@ -6,13 +6,19 @@ import Hapi from 'hapi'; import { merge } from 'lodash/fp'; + import { DETECTION_ENGINE_PRIVILEGES_URL } from '../../../../../common/constants'; import { RulesRequest } from '../../rules/types'; import { LegacySetupServices } from '../../../../plugin'; -import { callWithRequestFactory, transformError, getIndex } from '../utils'; +import { LegacyGetScopedServices } from '../../../../services'; +import { transformError, getIndex } from '../utils'; import { readPrivileges } from '../../privileges/read_privileges'; -export const createReadPrivilegesRulesRoute = (services: LegacySetupServices): Hapi.ServerRoute => { +export const createReadPrivilegesRulesRoute = ( + config: LegacySetupServices['config'], + usingEphemeralEncryptionKey: boolean, + getServices: LegacyGetScopedServices +): Hapi.ServerRoute => { return { method: 'GET', path: DETECTION_ENGINE_PRIVILEGES_URL, @@ -26,11 +32,10 @@ export const createReadPrivilegesRulesRoute = (services: LegacySetupServices): H }, async handler(request: RulesRequest) { try { - const callWithRequest = callWithRequestFactory(request, services); - const index = getIndex(request, services); - const permissions = await readPrivileges(callWithRequest, index); - const usingEphemeralEncryptionKey = - services.encryptedSavedObjects?.usingEphemeralEncryptionKey ?? false; + const { callCluster, getSpaceId } = await getServices(request); + + const index = getIndex(getSpaceId, config); + const permissions = await readPrivileges(callCluster, index); return merge(permissions, { is_authenticated: request?.auth?.isAuthenticated ?? false, has_encryption_key: !usingEphemeralEncryptionKey, @@ -42,6 +47,11 @@ export const createReadPrivilegesRulesRoute = (services: LegacySetupServices): H }; }; -export const readPrivilegesRoute = (services: LegacySetupServices): void => { - services.route(createReadPrivilegesRulesRoute(services)); +export const readPrivilegesRoute = ( + route: LegacySetupServices['route'], + config: LegacySetupServices['config'], + usingEphemeralEncryptionKey: boolean, + getServices: LegacyGetScopedServices +) => { + route(createReadPrivilegesRulesRoute(config, usingEphemeralEncryptionKey, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts index 38076aad59f43..6dbfa8ede1dd9 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts @@ -5,22 +5,24 @@ */ import Hapi from 'hapi'; -import { isFunction } from 'lodash/fp'; import Boom from 'boom'; import { DETECTION_ENGINE_PREPACKAGED_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; +import { LegacyGetScopedServices } from '../../../../services'; import { getIndexExists } from '../../index/get_index_exists'; -import { callWithRequestFactory, getIndex, transformError } from '../utils'; +import { getIndex, transformError } from '../utils'; import { getPrepackagedRules } from '../../rules/get_prepackaged_rules'; import { installPrepackagedRules } from '../../rules/install_prepacked_rules'; import { updatePrepackagedRules } from '../../rules/update_prepacked_rules'; import { getRulesToInstall } from '../../rules/get_rules_to_install'; import { getRulesToUpdate } from '../../rules/get_rules_to_update'; import { getExistingPrepackagedRules } from '../../rules/get_existing_prepackaged_rules'; -import { KibanaRequest } from '../../../../../../../../../src/core/server'; -export const createAddPrepackedRulesRoute = (services: LegacySetupServices): Hapi.ServerRoute => { +export const createAddPrepackedRulesRoute = ( + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +): Hapi.ServerRoute => { return { method: 'PUT', path: DETECTION_ENGINE_PREPACKAGED_URL, @@ -33,28 +35,28 @@ export const createAddPrepackedRulesRoute = (services: LegacySetupServices): Hap }, }, async handler(request: RequestFacade, headers) { - const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const actionsClient = await services.plugins.actions.getActionsClientWithRequest( - KibanaRequest.from(request) - ); - const savedObjectsClient = isFunction(request.getSavedObjectsClient) - ? request.getSavedObjectsClient() - : null; - if (!alertsClient || !savedObjectsClient) { - return headers.response().code(404); - } - try { - const callWithRequest = callWithRequestFactory(request, services); + const { + actionsClient, + alertsClient, + callCluster, + getSpaceId, + savedObjectsClient, + } = await getServices(request); + + if (!actionsClient || !alertsClient || !savedObjectsClient) { + return headers.response().code(404); + } + const rulesFromFileSystem = getPrepackagedRules(); const prepackagedRules = await getExistingPrepackagedRules({ alertsClient }); const rulesToInstall = getRulesToInstall(rulesFromFileSystem, prepackagedRules); const rulesToUpdate = getRulesToUpdate(rulesFromFileSystem, prepackagedRules); - const spaceIndex = getIndex(request, services); + const spaceIndex = getIndex(getSpaceId, config); if (rulesToInstall.length !== 0 || rulesToUpdate.length !== 0) { - const spaceIndexExists = await getIndexExists(callWithRequest, spaceIndex); + const spaceIndexExists = await getIndexExists(callCluster, spaceIndex); if (!spaceIndexExists) { return Boom.badRequest( `Pre-packaged rules cannot be installed until the space index is created: ${spaceIndex}` @@ -82,6 +84,10 @@ export const createAddPrepackedRulesRoute = (services: LegacySetupServices): Hap }; }; -export const addPrepackedRulesRoute = (services: LegacySetupServices): void => { - services.route(createAddPrepackedRulesRoute(services)); +export const addPrepackedRulesRoute = ( + route: LegacySetupServices['route'], + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +): void => { + route(createAddPrepackedRulesRoute(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts index 994216ac799ab..0ba66d1d700d3 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts @@ -5,25 +5,23 @@ */ import Hapi from 'hapi'; -import { isFunction } from 'lodash/fp'; import uuid from 'uuid'; + import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { LegacyGetScopedServices } from '../../../../services'; import { createRules } from '../../rules/create_rules'; import { BulkRulesRequest } from '../../rules/types'; import { LegacySetupServices } from '../../../../plugin'; import { readRules } from '../../rules/read_rules'; import { transformOrBulkError } from './utils'; import { getIndexExists } from '../../index/get_index_exists'; -import { - callWithRequestFactory, - getIndex, - transformBulkError, - createBulkErrorObject, -} from '../utils'; +import { getIndex, transformBulkError, createBulkErrorObject } from '../utils'; import { createRulesBulkSchema } from '../schemas/create_rules_bulk_schema'; -import { KibanaRequest } from '../../../../../../../../../src/core/server'; -export const createCreateRulesBulkRoute = (services: LegacySetupServices): Hapi.ServerRoute => { +export const createCreateRulesBulkRoute = ( + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +): Hapi.ServerRoute => { return { method: 'POST', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_create`, @@ -37,14 +35,15 @@ export const createCreateRulesBulkRoute = (services: LegacySetupServices): Hapi. }, }, async handler(request: BulkRulesRequest, headers) { - const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const actionsClient = await services.plugins.actions.getActionsClientWithRequest( - KibanaRequest.from(request) - ); - const savedObjectsClient = isFunction(request.getSavedObjectsClient) - ? request.getSavedObjectsClient() - : null; - if (!alertsClient || !savedObjectsClient) { + const { + actionsClient, + alertsClient, + callCluster, + getSpaceId, + savedObjectsClient, + } = await getServices(request); + + if (!actionsClient || !alertsClient || !savedObjectsClient) { return headers.response().code(404); } @@ -78,10 +77,10 @@ export const createCreateRulesBulkRoute = (services: LegacySetupServices): Hapi. version, } = payloadRule; const ruleIdOrUuid = ruleId ?? uuid.v4(); + try { - const finalIndex = outputIndex != null ? outputIndex : getIndex(request, services); - const callWithRequest = callWithRequestFactory(request, services); - const indexExists = await getIndexExists(callWithRequest, finalIndex); + const finalIndex = outputIndex != null ? outputIndex : getIndex(getSpaceId, config); + const indexExists = await getIndexExists(callCluster, finalIndex); if (!indexExists) { return createBulkErrorObject({ ruleId: ruleIdOrUuid, @@ -140,6 +139,10 @@ export const createCreateRulesBulkRoute = (services: LegacySetupServices): Hapi. }; }; -export const createRulesBulkRoute = (services: LegacySetupServices): void => { - services.route(createCreateRulesBulkRoute(services)); +export const createRulesBulkRoute = ( + route: LegacySetupServices['route'], + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +): void => { + route(createCreateRulesBulkRoute(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts index d7a85f65dc6ba..9df9fb1f3496f 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts @@ -20,7 +20,10 @@ import { transformOrError } from './utils'; import { getIndexExists } from '../../index/get_index_exists'; import { getIndex, transformError } from '../utils'; -export const createCreateRulesRoute = (getServices: LegacyGetScopedServices): Hapi.ServerRoute => { +export const createCreateRulesRoute = ( + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +): Hapi.ServerRoute => { return { method: 'POST', path: DETECTION_ENGINE_RULES_URL, @@ -64,13 +67,12 @@ export const createCreateRulesRoute = (getServices: LegacyGetScopedServices): Ha const { alertsClient, actionsClient, - config, callCluster, getSpaceId, savedObjectsClient, } = await getServices(request); - if (!alertsClient || !savedObjectsClient) { + if (!actionsClient || !alertsClient || !savedObjectsClient) { return headers.response().code(404); } @@ -137,7 +139,8 @@ export const createCreateRulesRoute = (getServices: LegacyGetScopedServices): Ha export const createRulesRoute = ( route: LegacySetupServices['route'], + config: LegacySetupServices['config'], getServices: LegacyGetScopedServices ): void => { - route(createCreateRulesRoute(getServices)); + route(createCreateRulesRoute(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts index 3ffb931cb8419..05390e173dbf9 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts @@ -5,19 +5,20 @@ */ import Hapi from 'hapi'; -import { isFunction } from 'lodash/fp'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { deleteRules } from '../../rules/delete_rules'; import { LegacySetupServices } from '../../../../plugin'; +import { LegacyGetScopedServices } from '../../../../services'; import { queryRulesBulkSchema } from '../schemas/query_rules_bulk_schema'; import { transformOrBulkError, getIdBulkError } from './utils'; import { transformBulkError } from '../utils'; import { QueryBulkRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; +import { deleteRules } from '../../rules/delete_rules'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; -import { KibanaRequest } from '../../../../../../../../../src/core/server'; -export const createDeleteRulesBulkRoute = (services: LegacySetupServices): Hapi.ServerRoute => { +export const createDeleteRulesBulkRoute = ( + getServices: LegacyGetScopedServices +): Hapi.ServerRoute => { return { method: ['POST', 'DELETE'], // allow both POST and DELETE in case their client does not support bodies in DELETE path: `${DETECTION_ENGINE_RULES_URL}/_bulk_delete`, @@ -31,16 +32,12 @@ export const createDeleteRulesBulkRoute = (services: LegacySetupServices): Hapi. }, }, async handler(request: QueryBulkRequest, headers) { - const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const actionsClient = await services.plugins.actions.getActionsClientWithRequest( - KibanaRequest.from(request) - ); - const savedObjectsClient = isFunction(request.getSavedObjectsClient) - ? request.getSavedObjectsClient() - : null; - if (!alertsClient || !savedObjectsClient) { + const { actionsClient, alertsClient, savedObjectsClient } = await getServices(request); + + if (!actionsClient || !alertsClient || !savedObjectsClient) { return headers.response().code(404); } + const rules = Promise.all( request.payload.map(async payloadRule => { const { id, rule_id: ruleId } = payloadRule; @@ -78,6 +75,9 @@ export const createDeleteRulesBulkRoute = (services: LegacySetupServices): Hapi. }; }; -export const deleteRulesBulkRoute = (services: LegacySetupServices): void => { - services.route(createDeleteRulesBulkRoute(services)); +export const deleteRulesBulkRoute = ( + route: LegacySetupServices['route'], + getServices: LegacyGetScopedServices +): void => { + route(createDeleteRulesBulkRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts index 2a0be43717ac9..51d316f2dcb2b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts @@ -5,19 +5,18 @@ */ import Hapi from 'hapi'; -import { isFunction } from 'lodash/fp'; -import { KibanaRequest } from '../../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { deleteRules } from '../../rules/delete_rules'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; +import { LegacyGetScopedServices } from '../../../../services'; import { queryRulesSchema } from '../schemas/query_rules_schema'; import { getIdError, transformOrError } from './utils'; import { transformError } from '../utils'; import { QueryRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; -export const createDeleteRulesRoute = (services: LegacySetupServices): Hapi.ServerRoute => { +export const createDeleteRulesRoute = (getServices: LegacyGetScopedServices): Hapi.ServerRoute => { return { method: 'DELETE', path: DETECTION_ENGINE_RULES_URL, @@ -32,18 +31,14 @@ export const createDeleteRulesRoute = (services: LegacySetupServices): Hapi.Serv }, async handler(request: QueryRequest & RequestFacade, headers) { const { id, rule_id: ruleId } = request.query; - const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const actionsClient = await services.plugins.actions.getActionsClientWithRequest( - KibanaRequest.from(request) - ); - const savedObjectsClient = isFunction(request.getSavedObjectsClient) - ? request.getSavedObjectsClient() - : null; - if (!alertsClient || !savedObjectsClient) { - return headers.response().code(404); - } try { + const { actionsClient, alertsClient, savedObjectsClient } = await getServices(request); + + if (!actionsClient || !alertsClient || !savedObjectsClient) { + return headers.response().code(404); + } + const rule = await deleteRules({ actionsClient, alertsClient, @@ -73,6 +68,9 @@ export const createDeleteRulesRoute = (services: LegacySetupServices): Hapi.Serv }; }; -export const deleteRulesRoute = (services: LegacySetupServices): void => { - services.route(createDeleteRulesRoute(services)); +export const deleteRulesRoute = ( + route: LegacySetupServices['route'], + getServices: LegacyGetScopedServices +): void => { + route(createDeleteRulesRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts index b2b677370be97..eea4a6a6f9f7f 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts @@ -6,16 +6,20 @@ import Boom from 'boom'; import Hapi from 'hapi'; -import { isFunction } from 'lodash/fp'; + import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { LegacySetupServices, RequestFacade } from '../../../../plugin'; +import { LegacyGetScopedServices } from '../../../../services'; import { ExportRulesRequest } from '../../rules/types'; -import { LegacySetupServices } from '../../../../plugin'; import { getNonPackagedRulesCount } from '../../rules/get_existing_prepackaged_rules'; import { exportRulesSchema, exportRulesQuerySchema } from '../schemas/export_rules_schema'; import { getExportByObjectIds } from '../../rules/get_export_by_object_ids'; import { getExportAll } from '../../rules/get_export_all'; -export const createExportRulesRoute = (services: LegacySetupServices): Hapi.ServerRoute => { +export const createExportRulesRoute = ( + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +): Hapi.ServerRoute => { return { method: 'POST', path: `${DETECTION_ENGINE_RULES_URL}/_export`, @@ -29,15 +33,15 @@ export const createExportRulesRoute = (services: LegacySetupServices): Hapi.Serv query: exportRulesQuerySchema, }, }, - async handler(request: ExportRulesRequest, headers) { - const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; + async handler(request: ExportRulesRequest & RequestFacade, headers) { + const { alertsClient } = await getServices(request); if (!alertsClient) { return headers.response().code(404); } try { - const exportSizeLimit = services.config().get('savedObjects.maxImportExportSize'); + const exportSizeLimit = config().get('savedObjects.maxImportExportSize'); if (request.payload?.objects != null && request.payload.objects.length > exportSizeLimit) { return Boom.badRequest(`Can't export more than ${exportSizeLimit} rules`); } else { @@ -66,6 +70,10 @@ export const createExportRulesRoute = (services: LegacySetupServices): Hapi.Serv }; }; -export const exportRulesRoute = (services: LegacySetupServices): void => { - services.route(createExportRulesRoute(services)); +export const exportRulesRoute = ( + route: LegacySetupServices['route'], + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +): void => { + route(createExportRulesRoute(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts index befa27028cccd..70790c5dc913c 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts @@ -5,17 +5,17 @@ */ import Hapi from 'hapi'; -import { isFunction } from 'lodash/fp'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { LegacySetupServices, RequestFacade } from '../../../../plugin'; +import { LegacyGetScopedServices } from '../../../../services'; import { findRules } from '../../rules/find_rules'; import { FindRulesRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { findRulesSchema } from '../schemas/find_rules_schema'; -import { LegacySetupServices } from '../../../../plugin'; import { transformFindAlertsOrError } from './utils'; import { transformError } from '../utils'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; -export const createFindRulesRoute = (): Hapi.ServerRoute => { +export const createFindRulesRoute = (getServices: LegacyGetScopedServices): Hapi.ServerRoute => { return { method: 'GET', path: `${DETECTION_ENGINE_RULES_URL}/_find`, @@ -28,17 +28,14 @@ export const createFindRulesRoute = (): Hapi.ServerRoute => { query: findRulesSchema, }, }, - async handler(request: FindRulesRequest, headers) { + async handler(request: FindRulesRequest & RequestFacade, headers) { const { query } = request; - const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const savedObjectsClient = isFunction(request.getSavedObjectsClient) - ? request.getSavedObjectsClient() - : null; - if (!alertsClient || !savedObjectsClient) { - return headers.response().code(404); - } - try { + const { alertsClient, savedObjectsClient } = await getServices(request); + if (!alertsClient || !savedObjectsClient) { + return headers.response().code(404); + } + const rules = await findRules({ alertsClient, perPage: query.per_page, @@ -70,6 +67,9 @@ export const createFindRulesRoute = (): Hapi.ServerRoute => { }; }; -export const findRulesRoute = (services: LegacySetupServices) => { - services.route(createFindRulesRoute()); +export const findRulesRoute = ( + route: LegacySetupServices['route'], + getServices: LegacyGetScopedServices +) => { + route(createFindRulesRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts index bbb34f0a0e0cc..d0ebbb3f0cfc2 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts @@ -5,10 +5,11 @@ */ import Hapi from 'hapi'; -import { isFunction, snakeCase } from 'lodash/fp'; +import { snakeCase } from 'lodash/fp'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { LegacySetupServices } from '../../../../plugin'; +import { LegacySetupServices, RequestFacade } from '../../../../plugin'; +import { LegacyGetScopedServices } from '../../../../services'; import { findRulesStatusesSchema } from '../schemas/find_rules_statuses_schema'; import { FindRulesStatusesRequest, @@ -29,7 +30,9 @@ const convertToSnakeCase = >(obj: T): Partial | }, {}); }; -export const createFindRulesStatusRoute: Hapi.ServerRoute = { +export const createFindRulesStatusRoute = ( + getServices: LegacyGetScopedServices +): Hapi.ServerRoute => ({ method: 'GET', path: `${DETECTION_ENGINE_RULES_URL}/_find_statuses`, options: { @@ -41,12 +44,10 @@ export const createFindRulesStatusRoute: Hapi.ServerRoute = { query: findRulesStatusesSchema, }, }, - async handler(request: FindRulesStatusesRequest, headers) { + async handler(request: FindRulesStatusesRequest & RequestFacade, headers) { const { query } = request; - const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const savedObjectsClient = isFunction(request.getSavedObjectsClient) - ? request.getSavedObjectsClient() - : null; + const { alertsClient, savedObjectsClient } = await getServices(request); + if (!alertsClient || !savedObjectsClient) { return headers.response().code(404); } @@ -86,8 +87,11 @@ export const createFindRulesStatusRoute: Hapi.ServerRoute = { }, Promise.resolve({})); return statuses; }, -}; +}); -export const findRulesStatusesRoute = (services: LegacySetupServices): void => { - services.route(createFindRulesStatusRoute); +export const findRulesStatusesRoute = ( + route: LegacySetupServices['route'], + getServices: LegacyGetScopedServices +): void => { + route(createFindRulesStatusRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts index 6777a612cc3fc..698d8fb9a8206 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts @@ -5,10 +5,10 @@ */ import Hapi from 'hapi'; -import { isFunction } from 'lodash/fp'; import { DETECTION_ENGINE_PREPACKAGED_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; +import { LegacyGetScopedServices } from '../../../../services'; import { transformError } from '../utils'; import { getPrepackagedRules } from '../../rules/get_prepackaged_rules'; import { getRulesToInstall } from '../../rules/get_rules_to_install'; @@ -16,7 +16,9 @@ import { getRulesToUpdate } from '../../rules/get_rules_to_update'; import { findRules } from '../../rules/find_rules'; import { getExistingPrepackagedRules } from '../../rules/get_existing_prepackaged_rules'; -export const createGetPrepackagedRulesStatusRoute = (): Hapi.ServerRoute => { +export const createGetPrepackagedRulesStatusRoute = ( + getServices: LegacyGetScopedServices +): Hapi.ServerRoute => { return { method: 'GET', path: `${DETECTION_ENGINE_PREPACKAGED_URL}/_status`, @@ -29,7 +31,7 @@ export const createGetPrepackagedRulesStatusRoute = (): Hapi.ServerRoute => { }, }, async handler(request: RequestFacade, headers) { - const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; + const { alertsClient } = await getServices(request); if (!alertsClient) { return headers.response().code(404); @@ -61,6 +63,9 @@ export const createGetPrepackagedRulesStatusRoute = (): Hapi.ServerRoute => { }; }; -export const getPrepackagedRulesStatusRoute = (services: LegacySetupServices): void => { - services.route(createGetPrepackagedRulesStatusRoute()); +export const getPrepackagedRulesStatusRoute = ( + route: LegacySetupServices['route'], + getServices: LegacyGetScopedServices +): void => { + route(createGetPrepackagedRulesStatusRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts index f8d281d746508..b097653e79e59 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts @@ -6,11 +6,10 @@ import Boom from 'boom'; import Hapi from 'hapi'; -import { chunk, isEmpty, isFunction } from 'lodash/fp'; +import { chunk, isEmpty } from 'lodash/fp'; import { extname } from 'path'; import uuid from 'uuid'; -import { KibanaRequest } from '../../../../../../../../../src/core/server'; import { createPromiseFromStreams } from '../../../../../../../../../src/legacy/utils/streams'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; @@ -18,16 +17,12 @@ import { createRules } from '../../rules/create_rules'; import { ImportRulesRequest } from '../../rules/types'; import { readRules } from '../../rules/read_rules'; import { getIndexExists } from '../../index/get_index_exists'; -import { - callWithRequestFactory, - getIndex, - createBulkErrorObject, - ImportRuleResponse, -} from '../utils'; +import { getIndex, createBulkErrorObject, ImportRuleResponse } from '../utils'; import { createRulesStreamFromNdJson } from '../../rules/create_rules_stream_from_ndjson'; import { ImportRuleAlertRest } from '../../types'; import { updateRules } from '../../rules/update_rules'; import { importRulesQuerySchema, importRulesPayloadSchema } from '../schemas/import_rules_schema'; +import { LegacyGetScopedServices } from '../../../../services'; type PromiseFromStreams = ImportRuleAlertRest | Error; @@ -39,14 +34,17 @@ type PromiseFromStreams = ImportRuleAlertRest | Error; */ const CHUNK_PARSED_OBJECT_SIZE = 10; -export const createImportRulesRoute = (services: LegacySetupServices): Hapi.ServerRoute => { +export const createImportRulesRoute = ( + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +): Hapi.ServerRoute => { return { method: 'POST', path: `${DETECTION_ENGINE_RULES_URL}/_import`, options: { tags: ['access:siem'], payload: { - maxBytes: services.config().get('savedObjects.maxImportPayloadBytes'), + maxBytes: config().get('savedObjects.maxImportPayloadBytes'), output: 'stream', allow: 'multipart/form-data', }, @@ -59,23 +57,25 @@ export const createImportRulesRoute = (services: LegacySetupServices): Hapi.Serv }, }, async handler(request: ImportRulesRequest & RequestFacade, headers) { - const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const actionsClient = await services.plugins.actions.getActionsClientWithRequest( - KibanaRequest.from(request) - ); - const savedObjectsClient = isFunction(request.getSavedObjectsClient) - ? request.getSavedObjectsClient() - : null; - if (!alertsClient || !savedObjectsClient) { + const { + actionsClient, + alertsClient, + callCluster, + getSpaceId, + savedObjectsClient, + } = await getServices(request); + + if (!actionsClient || !alertsClient || !savedObjectsClient) { return headers.response().code(404); } + const { filename } = request.payload.file.hapi; const fileExtension = extname(filename).toLowerCase(); if (fileExtension !== '.ndjson') { return Boom.badRequest(`Invalid file extension ${fileExtension}`); } - const objectLimit = services.config().get('savedObjects.maxImportExportSize'); + const objectLimit = config().get('savedObjects.maxImportExportSize'); const readStream = createRulesStreamFromNdJson(request.payload.file, objectLimit); const parsedObjects = await createPromiseFromStreams([readStream]); @@ -149,9 +149,8 @@ export const createImportRulesRoute = (services: LegacySetupServices): Hapi.Serv version, } = parsedRule; try { - const finalIndex = getIndex(request, services); - const callWithRequest = callWithRequestFactory(request, services); - const indexExists = await getIndexExists(callWithRequest, finalIndex); + const finalIndex = getIndex(getSpaceId, config); + const indexExists = await getIndexExists(callCluster, finalIndex); if (!indexExists) { resolve( createBulkErrorObject({ @@ -264,6 +263,10 @@ export const createImportRulesRoute = (services: LegacySetupServices): Hapi.Serv }; }; -export const importRulesRoute = (services: LegacySetupServices): void => { - services.route(createImportRulesRoute(services)); +export const importRulesRoute = ( + route: LegacySetupServices['route'], + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +): void => { + route(createImportRulesRoute(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts index ecf797f2c8860..2afd6987246a9 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts @@ -5,18 +5,18 @@ */ import Hapi from 'hapi'; -import { isFunction } from 'lodash/fp'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { getIdError, transformOrError } from './utils'; import { transformError } from '../utils'; import { readRules } from '../../rules/read_rules'; -import { LegacySetupServices } from '../../../../plugin'; +import { LegacySetupServices, RequestFacade } from '../../../../plugin'; import { queryRulesSchema } from '../schemas/query_rules_schema'; import { QueryRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; +import { LegacyGetScopedServices } from '../../../../services'; -export const createReadRulesRoute: Hapi.ServerRoute = { +export const createReadRulesRoute = (getServices: LegacyGetScopedServices): Hapi.ServerRoute => ({ method: 'GET', path: DETECTION_ENGINE_RULES_URL, options: { @@ -28,16 +28,15 @@ export const createReadRulesRoute: Hapi.ServerRoute = { query: queryRulesSchema, }, }, - async handler(request: QueryRequest, headers) { + async handler(request: QueryRequest & RequestFacade, headers) { const { id, rule_id: ruleId } = request.query; - const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const savedObjectsClient = isFunction(request.getSavedObjectsClient) - ? request.getSavedObjectsClient() - : null; - if (!alertsClient || !savedObjectsClient) { - return headers.response().code(404); - } + try { + const { alertsClient, savedObjectsClient } = await getServices(request); + if (!alertsClient || !savedObjectsClient) { + return headers.response().code(404); + } + const rule = await readRules({ alertsClient, id, @@ -62,8 +61,11 @@ export const createReadRulesRoute: Hapi.ServerRoute = { return transformError(err); } }, -}; +}); -export const readRulesRoute = (services: LegacySetupServices) => { - services.route(createReadRulesRoute); +export const readRulesRoute = ( + route: LegacySetupServices['route'], + getServices: LegacyGetScopedServices +) => { + route(createReadRulesRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts index 1ac65901a8265..54142f9311244 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts @@ -5,21 +5,23 @@ */ import Hapi from 'hapi'; -import { isFunction } from 'lodash/fp'; + import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { BulkUpdateRulesRequest, IRuleSavedAttributesSavedObjectAttributes, } from '../../rules/types'; import { LegacySetupServices } from '../../../../plugin'; +import { LegacyGetScopedServices } from '../../../../services'; import { transformOrBulkError, getIdBulkError } from './utils'; import { transformBulkError } from '../utils'; import { updateRulesBulkSchema } from '../schemas/update_rules_bulk_schema'; import { updateRules } from '../../rules/update_rules'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; -import { KibanaRequest } from '../../../../../../../../../src/core/server'; -export const createUpdateRulesBulkRoute = (services: LegacySetupServices): Hapi.ServerRoute => { +export const createUpdateRulesBulkRoute = ( + getServices: LegacyGetScopedServices +): Hapi.ServerRoute => { return { method: 'PUT', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, @@ -33,14 +35,9 @@ export const createUpdateRulesBulkRoute = (services: LegacySetupServices): Hapi. }, }, async handler(request: BulkUpdateRulesRequest, headers) { - const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const actionsClient = await services.plugins.actions.getActionsClientWithRequest( - KibanaRequest.from(request) - ); - const savedObjectsClient = isFunction(request.getSavedObjectsClient) - ? request.getSavedObjectsClient() - : null; - if (!alertsClient || !savedObjectsClient) { + const { actionsClient, alertsClient, savedObjectsClient } = await getServices(request); + + if (!actionsClient || !alertsClient || !savedObjectsClient) { return headers.response().code(404); } @@ -132,6 +129,9 @@ export const createUpdateRulesBulkRoute = (services: LegacySetupServices): Hapi. }; }; -export const updateRulesBulkRoute = (services: LegacySetupServices): void => { - services.route(createUpdateRulesBulkRoute(services)); +export const updateRulesBulkRoute = ( + route: LegacySetupServices['route'], + getServices: LegacyGetScopedServices +): void => { + route(createUpdateRulesBulkRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts index 94a9ca763a8fe..81e5dc1cf92a7 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts @@ -5,7 +5,6 @@ */ import Hapi from 'hapi'; -import { isFunction } from 'lodash/fp'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { updateRules } from '../../rules/update_rules'; import { UpdateRulesRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; @@ -14,9 +13,9 @@ import { LegacySetupServices } from '../../../../plugin'; import { getIdError, transformOrError } from './utils'; import { transformError } from '../utils'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; -import { KibanaRequest } from '../../../../../../../../../src/core/server'; +import { LegacyGetScopedServices } from '../../../../services'; -export const createUpdateRulesRoute = (services: LegacySetupServices): Hapi.ServerRoute => { +export const createUpdateRulesRoute = (getServices: LegacyGetScopedServices): Hapi.ServerRoute => { return { method: 'PUT', path: DETECTION_ENGINE_RULES_URL, @@ -59,18 +58,13 @@ export const createUpdateRulesRoute = (services: LegacySetupServices): Hapi.Serv version, } = request.payload; - const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; - const actionsClient = await services.plugins.actions.getActionsClientWithRequest( - KibanaRequest.from(request) - ); - const savedObjectsClient = isFunction(request.getSavedObjectsClient) - ? request.getSavedObjectsClient() - : null; - if (!alertsClient || !savedObjectsClient) { - return headers.response().code(404); - } - try { + const { alertsClient, actionsClient, savedObjectsClient } = await getServices(request); + + if (!actionsClient || !alertsClient || !savedObjectsClient) { + return headers.response().code(404); + } + const rule = await updateRules({ alertsClient, actionsClient, @@ -124,6 +118,9 @@ export const createUpdateRulesRoute = (services: LegacySetupServices): Hapi.Serv }; }; -export const updateRulesRoute = (services: LegacySetupServices) => { - services.route(createUpdateRulesRoute(services)); +export const updateRulesRoute = ( + route: LegacySetupServices['route'], + getServices: LegacyGetScopedServices +) => { + route(createUpdateRulesRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts index 9482d74daca9a..b28f79d2697ff 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts @@ -9,9 +9,13 @@ import { DETECTION_ENGINE_SIGNALS_STATUS_URL } from '../../../../../common/const import { SignalsStatusRequest } from '../../signals/types'; import { setSignalsStatusSchema } from '../schemas/set_signal_status_schema'; import { LegacySetupServices } from '../../../../plugin'; -import { transformError, getIndex, callWithRequestFactory } from '../utils'; +import { transformError, getIndex } from '../utils'; +import { LegacyGetScopedServices } from '../../../../services'; -export const setSignalsStatusRouteDef = (services: LegacySetupServices): Hapi.ServerRoute => { +export const setSignalsStatusRouteDef = ( + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +): Hapi.ServerRoute => { return { method: 'POST', path: DETECTION_ENGINE_SIGNALS_STATUS_URL, @@ -26,8 +30,9 @@ export const setSignalsStatusRouteDef = (services: LegacySetupServices): Hapi.Se }, async handler(request: SignalsStatusRequest) { const { signal_ids: signalIds, query, status } = request.payload; - const index = getIndex(request, services); - const callWithRequest = callWithRequestFactory(request, services); + const { callCluster, getSpaceId } = await getServices(request); + const index = getIndex(getSpaceId, config); + let queryObject; if (signalIds) { queryObject = { ids: { values: signalIds } }; @@ -40,7 +45,7 @@ export const setSignalsStatusRouteDef = (services: LegacySetupServices): Hapi.Se }; } try { - return callWithRequest('updateByQuery', { + return callCluster('updateByQuery', { index, body: { script: { @@ -58,6 +63,10 @@ export const setSignalsStatusRouteDef = (services: LegacySetupServices): Hapi.Se }; }; -export const setSignalsStatusRoute = (services: LegacySetupServices) => { - services.route(setSignalsStatusRouteDef(services)); +export const setSignalsStatusRoute = ( + route: LegacySetupServices['route'], + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +) => { + route(setSignalsStatusRouteDef(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts index d91aa4c5901e7..a0013da5990e7 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts @@ -6,12 +6,16 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_QUERY_SIGNALS_URL } from '../../../../../common/constants'; +import { LegacyGetScopedServices } from '../../../../services'; import { SignalsQueryRequest } from '../../signals/types'; import { querySignalsSchema } from '../schemas/query_signals_index_schema'; import { LegacySetupServices } from '../../../../plugin'; -import { transformError, getIndex, callWithRequestFactory } from '../utils'; +import { transformError, getIndex } from '../utils'; -export const querySignalsRouteDef = (services: LegacySetupServices): Hapi.ServerRoute => { +export const querySignalsRouteDef = ( + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +): Hapi.ServerRoute => { return { method: 'POST', path: DETECTION_ENGINE_QUERY_SIGNALS_URL, @@ -26,11 +30,12 @@ export const querySignalsRouteDef = (services: LegacySetupServices): Hapi.Server }, async handler(request: SignalsQueryRequest) { const { query, aggs, _source, track_total_hits, size } = request.payload; - const index = getIndex(request, services); - const callWithRequest = callWithRequestFactory(request, services); + const { callCluster, getSpaceId } = await getServices(request); + + const index = getIndex(getSpaceId, config); try { - return callWithRequest('search', { + return callCluster('search', { index, body: { query, aggs, _source, track_total_hits, size }, }); @@ -42,6 +47,10 @@ export const querySignalsRouteDef = (services: LegacySetupServices): Hapi.Server }; }; -export const querySignalsRoute = (services: LegacySetupServices) => { - services.route(querySignalsRouteDef(services)); +export const querySignalsRoute = ( + route: LegacySetupServices['route'], + config: LegacySetupServices['config'], + getServices: LegacyGetScopedServices +) => { + route(querySignalsRouteDef(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts index b506a1feaf886..99b5e44c379fc 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts @@ -5,13 +5,14 @@ */ import Hapi from 'hapi'; -import { isFunction } from 'lodash/fp'; + import { DETECTION_ENGINE_TAGS_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; import { transformError } from '../utils'; import { readTags } from '../../tags/read_tags'; +import { LegacyGetScopedServices } from '../../../../services'; -export const createReadTagsRoute: Hapi.ServerRoute = { +export const createReadTagsRoute = (getServices: LegacyGetScopedServices): Hapi.ServerRoute => ({ method: 'GET', path: DETECTION_ENGINE_TAGS_URL, options: { @@ -23,7 +24,8 @@ export const createReadTagsRoute: Hapi.ServerRoute = { }, }, async handler(request: RequestFacade, headers) { - const alertsClient = isFunction(request.getAlertsClient) ? request.getAlertsClient() : null; + const { alertsClient } = await getServices(request); + if (!alertsClient) { return headers.response().code(404); } @@ -37,8 +39,11 @@ export const createReadTagsRoute: Hapi.ServerRoute = { return transformError(err); } }, -}; +}); -export const readTagsRoute = (services: LegacySetupServices) => { - services.route(createReadTagsRoute); +export const readTagsRoute = ( + route: LegacySetupServices['route'], + getServices: LegacyGetScopedServices +) => { + route(createReadTagsRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts index 9a02bc28a272f..3fa9f01f226f9 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts @@ -5,7 +5,6 @@ */ import Boom from 'boom'; -import { CallAPIOptions } from '../../../../../../../../src/core/server'; import { APP_ID, SIGNALS_INDEX_KEY } from '../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../plugin'; import { ScopedServices } from '../../../services'; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/types.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/types.ts index 0e0f6c2ab053b..1d423c8b375d1 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/types.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/types.ts @@ -150,7 +150,7 @@ export interface FindRulesStatusesRequest extends Omit { export interface Clients { alertsClient: AlertsClient; - actionsClient: ActionsClient | null | undefined; + actionsClient: ActionsClient; } export type UpdateRuleParams = Partial & { diff --git a/x-pack/legacy/plugins/siem/server/plugin.ts b/x-pack/legacy/plugins/siem/server/plugin.ts index fc5efbbc993d6..a78865236c203 100644 --- a/x-pack/legacy/plugins/siem/server/plugin.ts +++ b/x-pack/legacy/plugins/siem/server/plugin.ts @@ -64,13 +64,13 @@ export class Plugin { public setup(core: CoreSetup, plugins: SetupPlugins, __legacy: ServerFacade) { this.logger.debug('Shim plugin setup'); - this.services.setup( - core.elasticsearch.dataClient, - plugins.spaces.spacesService, - __legacy.config - ); + this.services.setup(core.elasticsearch.dataClient, plugins.spaces.spacesService); - this.legacyInitRoutes = initRoutes(__legacy.route); + this.legacyInitRoutes = initRoutes( + __legacy.route, + __legacy.config, + plugins.encryptedSavedObjects?.usingEphemeralEncryptionKey ?? false + ); plugins.features.registerFeature({ id: this.name, diff --git a/x-pack/legacy/plugins/siem/server/routes/index.ts b/x-pack/legacy/plugins/siem/server/routes/index.ts index 10c862d256271..886343a716a6e 100644 --- a/x-pack/legacy/plugins/siem/server/routes/index.ts +++ b/x-pack/legacy/plugins/siem/server/routes/index.ts @@ -30,43 +30,45 @@ import { getPrepackagedRulesStatusRoute } from '../lib/detection_engine/routes/r export type LegacyInitRoutes = (getServices: LegacyGetScopedServices) => void; -export const initRoutes = (route: ServerFacade['route']) => ( - getServices: LegacyGetScopedServices -): void => { +export const initRoutes = ( + route: ServerFacade['route'], + config: ServerFacade['config'], + usingEphemeralEncryptionKey: boolean +) => (getServices: LegacyGetScopedServices): void => { // Detection Engine Rule routes that have the REST endpoints of /api/detection_engine/rules // All REST rule creation, deletion, updating, etc...... - createRulesRoute(route, getServices); - readRulesRoute(services); - updateRulesRoute(services); - deleteRulesRoute(services); - findRulesRoute(services); + createRulesRoute(route, config, getServices); + readRulesRoute(route, getServices); + updateRulesRoute(route, getServices); + deleteRulesRoute(route, getServices); + findRulesRoute(route, getServices); - addPrepackedRulesRoute(services); - getPrepackagedRulesStatusRoute(services); - createRulesBulkRoute(services); - updateRulesBulkRoute(services); - deleteRulesBulkRoute(services); + addPrepackedRulesRoute(route, config, getServices); + getPrepackagedRulesStatusRoute(route, getServices); + createRulesBulkRoute(route, config, getServices); + updateRulesBulkRoute(route, getServices); + deleteRulesBulkRoute(route, getServices); - importRulesRoute(services); - exportRulesRoute(services); + importRulesRoute(route, config, getServices); + exportRulesRoute(route, config, getServices); - findRulesStatusesRoute(services); + findRulesStatusesRoute(route, getServices); // Detection Engine Signals routes that have the REST endpoints of /api/detection_engine/signals // POST /api/detection_engine/signals/status // Example usage can be found in siem/server/lib/detection_engine/scripts/signals - setSignalsStatusRoute(services); - querySignalsRoute(services); + setSignalsStatusRoute(route, config, getServices); + querySignalsRoute(route, config, getServices); // Detection Engine index routes that have the REST endpoints of /api/detection_engine/index // All REST index creation, policy management for spaces - createIndexRoute(services); - readIndexRoute(services); - deleteIndexRoute(services); + createIndexRoute(route, config, getServices); + readIndexRoute(route, config, getServices); + deleteIndexRoute(route, config, getServices); // Detection Engine tags routes that have the REST endpoints of /api/detection_engine/tags - readTagsRoute(services); + readTagsRoute(route, getServices); // Privileges API to get the generic user privileges - readPrivilegesRoute(services); + readPrivilegesRoute(route, config, usingEphemeralEncryptionKey, getServices); }; diff --git a/x-pack/legacy/plugins/siem/server/services.ts b/x-pack/legacy/plugins/siem/server/services.ts index e1f062a766ff1..9216cd6ce7a3c 100644 --- a/x-pack/legacy/plugins/siem/server/services.ts +++ b/x-pack/legacy/plugins/siem/server/services.ts @@ -13,7 +13,7 @@ import { } from '../../../../../src/core/server'; import { ActionsClient } from '../../../../plugins/actions/server'; import { AlertsClient } from '../../../../legacy/plugins/alerting/server'; -import { CoreStart, LegacySetupServices, StartPlugins, SetupPlugins } from './plugin'; +import { CoreStart, StartPlugins, SetupPlugins } from './plugin'; export interface SiemServices { actionsClient?: ActionsClient; @@ -23,7 +23,6 @@ export interface SiemServices { } interface LegacySiemServices { alertsClient?: AlertsClient; - config: LegacySetupServices['config']; } export type ScopedServices = SiemServices & LegacySiemServices; export type LegacyGetScopedServices = (request: LegacyRequest) => Promise; @@ -31,18 +30,15 @@ export type LegacyGetScopedServices = (request: LegacyRequest) => Promise this.spacesService?.getSpaceId?.(kibanaRequest), savedObjectsClient: this.savedObjects!.getScopedClient(kibanaRequest), }; From 7e7cd307e7744cb09d770f5989dfcb2fc2e9e9a4 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Thu, 6 Feb 2020 16:42:57 -0600 Subject: [PATCH 19/39] WIP: Qualifying our Service to ClientsService This gets us client-related services (ES, SavedObjects, Alerts), but it is independent of any configuration, which is gonna be another service. --- .../routes/index/create_index_route.ts | 6 +++--- .../routes/index/delete_index_route.ts | 6 +++--- .../routes/index/read_index_route.ts | 6 +++--- .../privileges/read_privileges_route.ts | 6 +++--- .../rules/add_prepackaged_rules_route.ts | 6 +++--- .../routes/rules/create_rules_bulk_route.ts | 6 +++--- .../routes/rules/create_rules_route.ts | 6 +++--- .../routes/rules/delete_rules_bulk_route.ts | 6 +++--- .../routes/rules/delete_rules_route.ts | 6 +++--- .../routes/rules/export_rules_route.ts | 6 +++--- .../routes/rules/find_rules_route.ts | 6 +++--- .../routes/rules/find_rules_status_route.ts | 6 +++--- .../get_prepackaged_rules_status_route.ts | 6 +++--- .../routes/rules/import_rules_route.ts | 6 +++--- .../routes/rules/read_rules_route.ts | 6 +++--- .../routes/rules/update_rules_bulk_route.ts | 6 +++--- .../routes/rules/update_rules_route.ts | 6 +++--- .../signals/open_close_signals_route.ts | 6 +++--- .../routes/signals/query_signals_route.ts | 6 +++--- .../routes/tags/read_tags_route.ts | 6 +++--- x-pack/legacy/plugins/siem/server/plugin.ts | 12 +++++------ .../plugins/siem/server/routes/index.ts | 6 +++--- .../{services.ts => services/clients.ts} | 21 ++++++++++--------- .../plugins/siem/server/services/index.ts | 7 +++++++ 24 files changed, 87 insertions(+), 79 deletions(-) rename x-pack/legacy/plugins/siem/server/{services.ts => services/clients.ts} (76%) create mode 100644 x-pack/legacy/plugins/siem/server/services/index.ts diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts index 37f34879e3770..73db6053087fc 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts @@ -9,7 +9,7 @@ import Boom from 'boom'; import { DETECTION_ENGINE_INDEX_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; import { transformError, getIndex } from '../utils'; import { getIndexExists } from '../../index/get_index_exists'; import { getPolicyExists } from '../../index/get_policy_exists'; @@ -22,7 +22,7 @@ import signalsPolicy from './signals_policy.json'; export const createCreateIndexRoute = ( config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): Hapi.ServerRoute => { return { method: 'POST', @@ -66,7 +66,7 @@ export const createCreateIndexRoute = ( export const createIndexRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ) => { route(createCreateIndexRoute(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts index 824d27957100e..f8e5e1dbb3b5d 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts @@ -9,7 +9,7 @@ import Boom from 'boom'; import { DETECTION_ENGINE_INDEX_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; import { transformError, getIndex } from '../utils'; import { getIndexExists } from '../../index/get_index_exists'; import { getPolicyExists } from '../../index/get_policy_exists'; @@ -30,7 +30,7 @@ import { deleteTemplate } from '../../index/delete_template'; */ export const createDeleteIndexRoute = ( config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): Hapi.ServerRoute => { return { method: 'DELETE', @@ -73,7 +73,7 @@ export const createDeleteIndexRoute = ( export const deleteIndexRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ) => { route(createDeleteIndexRoute(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts index 111c0528cfdf0..53b273ebfd728 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts @@ -9,13 +9,13 @@ import Boom from 'boom'; import { DETECTION_ENGINE_INDEX_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; import { transformError, getIndex } from '../utils'; import { getIndexExists } from '../../index/get_index_exists'; export const createReadIndexRoute = ( config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): Hapi.ServerRoute => { return { method: 'GET', @@ -61,7 +61,7 @@ export const createReadIndexRoute = ( export const readIndexRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ) => { route(createReadIndexRoute(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts index b4f0418bc1f13..032968c0e440f 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts @@ -10,14 +10,14 @@ import { merge } from 'lodash/fp'; import { DETECTION_ENGINE_PRIVILEGES_URL } from '../../../../../common/constants'; import { RulesRequest } from '../../rules/types'; import { LegacySetupServices } from '../../../../plugin'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; import { transformError, getIndex } from '../utils'; import { readPrivileges } from '../../privileges/read_privileges'; export const createReadPrivilegesRulesRoute = ( config: LegacySetupServices['config'], usingEphemeralEncryptionKey: boolean, - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): Hapi.ServerRoute => { return { method: 'GET', @@ -51,7 +51,7 @@ export const readPrivilegesRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], usingEphemeralEncryptionKey: boolean, - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ) => { route(createReadPrivilegesRulesRoute(config, usingEphemeralEncryptionKey, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts index 6dbfa8ede1dd9..2c579095f80fd 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts @@ -9,7 +9,7 @@ import Boom from 'boom'; import { DETECTION_ENGINE_PREPACKAGED_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; import { getIndexExists } from '../../index/get_index_exists'; import { getIndex, transformError } from '../utils'; import { getPrepackagedRules } from '../../rules/get_prepackaged_rules'; @@ -21,7 +21,7 @@ import { getExistingPrepackagedRules } from '../../rules/get_existing_prepackage export const createAddPrepackedRulesRoute = ( config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): Hapi.ServerRoute => { return { method: 'PUT', @@ -87,7 +87,7 @@ export const createAddPrepackedRulesRoute = ( export const addPrepackedRulesRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): void => { route(createAddPrepackedRulesRoute(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts index 0ba66d1d700d3..e5a6ae86a72d8 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts @@ -8,7 +8,7 @@ import Hapi from 'hapi'; import uuid from 'uuid'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; import { createRules } from '../../rules/create_rules'; import { BulkRulesRequest } from '../../rules/types'; import { LegacySetupServices } from '../../../../plugin'; @@ -20,7 +20,7 @@ import { createRulesBulkSchema } from '../schemas/create_rules_bulk_schema'; export const createCreateRulesBulkRoute = ( config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): Hapi.ServerRoute => { return { method: 'POST', @@ -142,7 +142,7 @@ export const createCreateRulesBulkRoute = ( export const createRulesBulkRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): void => { route(createCreateRulesBulkRoute(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts index 9df9fb1f3496f..3ec516950a466 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts @@ -9,7 +9,7 @@ import Boom from 'boom'; import uuid from 'uuid'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; import { createRules } from '../../rules/create_rules'; import { RulesRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { createRulesSchema } from '../schemas/create_rules_schema'; @@ -22,7 +22,7 @@ import { getIndex, transformError } from '../utils'; export const createCreateRulesRoute = ( config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): Hapi.ServerRoute => { return { method: 'POST', @@ -140,7 +140,7 @@ export const createCreateRulesRoute = ( export const createRulesRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): void => { route(createCreateRulesRoute(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts index 05390e173dbf9..a33e9ad98cbac 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts @@ -8,7 +8,7 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { LegacySetupServices } from '../../../../plugin'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; import { queryRulesBulkSchema } from '../schemas/query_rules_bulk_schema'; import { transformOrBulkError, getIdBulkError } from './utils'; import { transformBulkError } from '../utils'; @@ -17,7 +17,7 @@ import { deleteRules } from '../../rules/delete_rules'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; export const createDeleteRulesBulkRoute = ( - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): Hapi.ServerRoute => { return { method: ['POST', 'DELETE'], // allow both POST and DELETE in case their client does not support bodies in DELETE @@ -77,7 +77,7 @@ export const createDeleteRulesBulkRoute = ( export const deleteRulesBulkRoute = ( route: LegacySetupServices['route'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): void => { route(createDeleteRulesBulkRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts index 51d316f2dcb2b..d3bfeebfb4cb1 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts @@ -9,14 +9,14 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { deleteRules } from '../../rules/delete_rules'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; import { queryRulesSchema } from '../schemas/query_rules_schema'; import { getIdError, transformOrError } from './utils'; import { transformError } from '../utils'; import { QueryRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; -export const createDeleteRulesRoute = (getServices: LegacyGetScopedServices): Hapi.ServerRoute => { +export const createDeleteRulesRoute = (getServices: GetScopedClientServices): Hapi.ServerRoute => { return { method: 'DELETE', path: DETECTION_ENGINE_RULES_URL, @@ -70,7 +70,7 @@ export const createDeleteRulesRoute = (getServices: LegacyGetScopedServices): Ha export const deleteRulesRoute = ( route: LegacySetupServices['route'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): void => { route(createDeleteRulesRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts index eea4a6a6f9f7f..b1941ee83fc32 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts @@ -9,7 +9,7 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; import { ExportRulesRequest } from '../../rules/types'; import { getNonPackagedRulesCount } from '../../rules/get_existing_prepackaged_rules'; import { exportRulesSchema, exportRulesQuerySchema } from '../schemas/export_rules_schema'; @@ -18,7 +18,7 @@ import { getExportAll } from '../../rules/get_export_all'; export const createExportRulesRoute = ( config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): Hapi.ServerRoute => { return { method: 'POST', @@ -73,7 +73,7 @@ export const createExportRulesRoute = ( export const exportRulesRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): void => { route(createExportRulesRoute(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts index 70790c5dc913c..bd9835b087f91 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts @@ -7,7 +7,7 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; import { findRules } from '../../rules/find_rules'; import { FindRulesRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { findRulesSchema } from '../schemas/find_rules_schema'; @@ -15,7 +15,7 @@ import { transformFindAlertsOrError } from './utils'; import { transformError } from '../utils'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; -export const createFindRulesRoute = (getServices: LegacyGetScopedServices): Hapi.ServerRoute => { +export const createFindRulesRoute = (getServices: GetScopedClientServices): Hapi.ServerRoute => { return { method: 'GET', path: `${DETECTION_ENGINE_RULES_URL}/_find`, @@ -69,7 +69,7 @@ export const createFindRulesRoute = (getServices: LegacyGetScopedServices): Hapi export const findRulesRoute = ( route: LegacySetupServices['route'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ) => { route(createFindRulesRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts index d0ebbb3f0cfc2..e294e403da962 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts @@ -9,7 +9,7 @@ import { snakeCase } from 'lodash/fp'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; import { findRulesStatusesSchema } from '../schemas/find_rules_statuses_schema'; import { FindRulesStatusesRequest, @@ -31,7 +31,7 @@ const convertToSnakeCase = >(obj: T): Partial | }; export const createFindRulesStatusRoute = ( - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): Hapi.ServerRoute => ({ method: 'GET', path: `${DETECTION_ENGINE_RULES_URL}/_find_statuses`, @@ -91,7 +91,7 @@ export const createFindRulesStatusRoute = ( export const findRulesStatusesRoute = ( route: LegacySetupServices['route'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): void => { route(createFindRulesStatusRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts index 698d8fb9a8206..5cf78280df502 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts @@ -8,7 +8,7 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_PREPACKAGED_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; import { transformError } from '../utils'; import { getPrepackagedRules } from '../../rules/get_prepackaged_rules'; import { getRulesToInstall } from '../../rules/get_rules_to_install'; @@ -17,7 +17,7 @@ import { findRules } from '../../rules/find_rules'; import { getExistingPrepackagedRules } from '../../rules/get_existing_prepackaged_rules'; export const createGetPrepackagedRulesStatusRoute = ( - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): Hapi.ServerRoute => { return { method: 'GET', @@ -65,7 +65,7 @@ export const createGetPrepackagedRulesStatusRoute = ( export const getPrepackagedRulesStatusRoute = ( route: LegacySetupServices['route'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): void => { route(createGetPrepackagedRulesStatusRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts index b097653e79e59..72cc809744adc 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts @@ -22,7 +22,7 @@ import { createRulesStreamFromNdJson } from '../../rules/create_rules_stream_fro import { ImportRuleAlertRest } from '../../types'; import { updateRules } from '../../rules/update_rules'; import { importRulesQuerySchema, importRulesPayloadSchema } from '../schemas/import_rules_schema'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; type PromiseFromStreams = ImportRuleAlertRest | Error; @@ -36,7 +36,7 @@ const CHUNK_PARSED_OBJECT_SIZE = 10; export const createImportRulesRoute = ( config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): Hapi.ServerRoute => { return { method: 'POST', @@ -266,7 +266,7 @@ export const createImportRulesRoute = ( export const importRulesRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): void => { route(createImportRulesRoute(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts index 2afd6987246a9..a41a66cd94e20 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts @@ -14,9 +14,9 @@ import { LegacySetupServices, RequestFacade } from '../../../../plugin'; import { queryRulesSchema } from '../schemas/query_rules_schema'; import { QueryRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; -export const createReadRulesRoute = (getServices: LegacyGetScopedServices): Hapi.ServerRoute => ({ +export const createReadRulesRoute = (getServices: GetScopedClientServices): Hapi.ServerRoute => ({ method: 'GET', path: DETECTION_ENGINE_RULES_URL, options: { @@ -65,7 +65,7 @@ export const createReadRulesRoute = (getServices: LegacyGetScopedServices): Hapi export const readRulesRoute = ( route: LegacySetupServices['route'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ) => { route(createReadRulesRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts index 54142f9311244..06b9301b0978e 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts @@ -12,7 +12,7 @@ import { IRuleSavedAttributesSavedObjectAttributes, } from '../../rules/types'; import { LegacySetupServices } from '../../../../plugin'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; import { transformOrBulkError, getIdBulkError } from './utils'; import { transformBulkError } from '../utils'; import { updateRulesBulkSchema } from '../schemas/update_rules_bulk_schema'; @@ -20,7 +20,7 @@ import { updateRules } from '../../rules/update_rules'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; export const createUpdateRulesBulkRoute = ( - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): Hapi.ServerRoute => { return { method: 'PUT', @@ -131,7 +131,7 @@ export const createUpdateRulesBulkRoute = ( export const updateRulesBulkRoute = ( route: LegacySetupServices['route'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): void => { route(createUpdateRulesBulkRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts index 81e5dc1cf92a7..89f8a92389393 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts @@ -13,9 +13,9 @@ import { LegacySetupServices } from '../../../../plugin'; import { getIdError, transformOrError } from './utils'; import { transformError } from '../utils'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; -export const createUpdateRulesRoute = (getServices: LegacyGetScopedServices): Hapi.ServerRoute => { +export const createUpdateRulesRoute = (getServices: GetScopedClientServices): Hapi.ServerRoute => { return { method: 'PUT', path: DETECTION_ENGINE_RULES_URL, @@ -120,7 +120,7 @@ export const createUpdateRulesRoute = (getServices: LegacyGetScopedServices): Ha export const updateRulesRoute = ( route: LegacySetupServices['route'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ) => { route(createUpdateRulesRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts index b28f79d2697ff..62f110630e6e8 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts @@ -10,11 +10,11 @@ import { SignalsStatusRequest } from '../../signals/types'; import { setSignalsStatusSchema } from '../schemas/set_signal_status_schema'; import { LegacySetupServices } from '../../../../plugin'; import { transformError, getIndex } from '../utils'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; export const setSignalsStatusRouteDef = ( config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): Hapi.ServerRoute => { return { method: 'POST', @@ -66,7 +66,7 @@ export const setSignalsStatusRouteDef = ( export const setSignalsStatusRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ) => { route(setSignalsStatusRouteDef(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts index a0013da5990e7..632624a2442da 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts @@ -6,7 +6,7 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_QUERY_SIGNALS_URL } from '../../../../../common/constants'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; import { SignalsQueryRequest } from '../../signals/types'; import { querySignalsSchema } from '../schemas/query_signals_index_schema'; import { LegacySetupServices } from '../../../../plugin'; @@ -14,7 +14,7 @@ import { transformError, getIndex } from '../utils'; export const querySignalsRouteDef = ( config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ): Hapi.ServerRoute => { return { method: 'POST', @@ -50,7 +50,7 @@ export const querySignalsRouteDef = ( export const querySignalsRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ) => { route(querySignalsRouteDef(config, getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts index 99b5e44c379fc..97875155536ab 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts @@ -10,9 +10,9 @@ import { DETECTION_ENGINE_TAGS_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; import { transformError } from '../utils'; import { readTags } from '../../tags/read_tags'; -import { LegacyGetScopedServices } from '../../../../services'; +import { GetScopedClientServices } from '../../../../services'; -export const createReadTagsRoute = (getServices: LegacyGetScopedServices): Hapi.ServerRoute => ({ +export const createReadTagsRoute = (getServices: GetScopedClientServices): Hapi.ServerRoute => ({ method: 'GET', path: DETECTION_ENGINE_TAGS_URL, options: { @@ -43,7 +43,7 @@ export const createReadTagsRoute = (getServices: LegacyGetScopedServices): Hapi. export const readTagsRoute = ( route: LegacySetupServices['route'], - getServices: LegacyGetScopedServices + getServices: GetScopedClientServices ) => { route(createReadTagsRoute(getServices)); }; diff --git a/x-pack/legacy/plugins/siem/server/plugin.ts b/x-pack/legacy/plugins/siem/server/plugin.ts index a78865236c203..2ca3ae6ef1ea7 100644 --- a/x-pack/legacy/plugins/siem/server/plugin.ts +++ b/x-pack/legacy/plugins/siem/server/plugin.ts @@ -28,7 +28,7 @@ import { ruleStatusSavedObjectType, } from './saved_objects'; import { RequestFacade, ServerFacade } from './types'; -import { Services } from './services'; +import { ClientsService } from './services'; export { CoreSetup, CoreStart, Logger, PluginInitializerContext, RequestFacade }; @@ -50,13 +50,13 @@ export class Plugin { readonly name = 'siem'; private readonly logger: Logger; private context: PluginInitializerContext; - private services: Services; + private clients: ClientsService; private legacyInitRoutes?: LegacyInitRoutes; constructor(context: PluginInitializerContext) { this.context = context; this.logger = context.logger.get('plugins', this.name); - this.services = new Services(); + this.clients = new ClientsService(); this.logger.debug('Shim plugin initialized'); } @@ -64,7 +64,7 @@ export class Plugin { public setup(core: CoreSetup, plugins: SetupPlugins, __legacy: ServerFacade) { this.logger.debug('Shim plugin setup'); - this.services.setup(core.elasticsearch.dataClient, plugins.spaces.spacesService); + this.clients.setup(core.elasticsearch.dataClient, plugins.spaces.spacesService); this.legacyInitRoutes = initRoutes( __legacy.route, @@ -147,8 +147,8 @@ export class Plugin { } public start(core: CoreStart, plugins: StartPlugins) { - this.services.start(core.savedObjects, plugins.actions); + this.clients.start(core.savedObjects, plugins.actions); - this.legacyInitRoutes!(this.services.getScopedServicesFactory()); + this.legacyInitRoutes!(this.clients.getScopedFactory()); } } diff --git a/x-pack/legacy/plugins/siem/server/routes/index.ts b/x-pack/legacy/plugins/siem/server/routes/index.ts index 886343a716a6e..13b2fe4b92e5f 100644 --- a/x-pack/legacy/plugins/siem/server/routes/index.ts +++ b/x-pack/legacy/plugins/siem/server/routes/index.ts @@ -5,7 +5,7 @@ */ import { ServerFacade } from '../types'; -import { LegacyGetScopedServices } from '../services'; +import { GetScopedClientServices } from '../services'; import { createRulesRoute } from '../lib/detection_engine/routes/rules/create_rules_route'; import { createIndexRoute } from '../lib/detection_engine/routes/index/create_index_route'; @@ -28,13 +28,13 @@ import { exportRulesRoute } from '../lib/detection_engine/routes/rules/export_ru import { findRulesStatusesRoute } from '../lib/detection_engine/routes/rules/find_rules_status_route'; import { getPrepackagedRulesStatusRoute } from '../lib/detection_engine/routes/rules/get_prepackaged_rules_status_route'; -export type LegacyInitRoutes = (getServices: LegacyGetScopedServices) => void; +export type LegacyInitRoutes = (getServices: GetScopedClientServices) => void; export const initRoutes = ( route: ServerFacade['route'], config: ServerFacade['config'], usingEphemeralEncryptionKey: boolean -) => (getServices: LegacyGetScopedServices): void => { +) => (getServices: GetScopedClientServices): void => { // Detection Engine Rule routes that have the REST endpoints of /api/detection_engine/rules // All REST rule creation, deletion, updating, etc...... createRulesRoute(route, config, getServices); diff --git a/x-pack/legacy/plugins/siem/server/services.ts b/x-pack/legacy/plugins/siem/server/services/clients.ts similarity index 76% rename from x-pack/legacy/plugins/siem/server/services.ts rename to x-pack/legacy/plugins/siem/server/services/clients.ts index 9216cd6ce7a3c..cfb76d915cdb8 100644 --- a/x-pack/legacy/plugins/siem/server/services.ts +++ b/x-pack/legacy/plugins/siem/server/services/clients.ts @@ -10,24 +10,25 @@ import { KibanaRequest, LegacyRequest, SavedObjectsClientContract, -} from '../../../../../src/core/server'; -import { ActionsClient } from '../../../../plugins/actions/server'; -import { AlertsClient } from '../../../../legacy/plugins/alerting/server'; -import { CoreStart, StartPlugins, SetupPlugins } from './plugin'; +} from '../../../../../../src/core/server'; +import { ActionsClient } from '../../../../../plugins/actions/server'; +import { AlertsClient } from '../../../../../legacy/plugins/alerting/server'; +import { CoreStart, StartPlugins, SetupPlugins } from '../plugin'; -export interface SiemServices { +export interface ClientServices { actionsClient?: ActionsClient; callCluster: IScopedClusterClient['callAsCurrentUser']; getSpaceId: () => string | undefined; savedObjectsClient: SavedObjectsClientContract; } -interface LegacySiemServices { +interface LegacyClientServices { alertsClient?: AlertsClient; } -export type ScopedServices = SiemServices & LegacySiemServices; -export type LegacyGetScopedServices = (request: LegacyRequest) => Promise; +export type GetScopedClientServices = ( + request: LegacyRequest +) => Promise; -export class Services { +export class ClientsService { private actions?: StartPlugins['actions']; private clusterClient?: IClusterClient; private savedObjects?: CoreStart['savedObjects']; @@ -46,7 +47,7 @@ export class Services { this.actions = actions; } - public getScopedServicesFactory(): LegacyGetScopedServices { + public getScopedFactory(): GetScopedClientServices { if (!this.clusterClient || !this.savedObjects) { throw new Error('Services not initialized'); } diff --git a/x-pack/legacy/plugins/siem/server/services/index.ts b/x-pack/legacy/plugins/siem/server/services/index.ts new file mode 100644 index 0000000000000..e6c1f15331e99 --- /dev/null +++ b/x-pack/legacy/plugins/siem/server/services/index.ts @@ -0,0 +1,7 @@ +/* + * 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. + */ + +export { ClientsService, GetScopedClientServices } from './clients'; From c97f1904c2c29df4fa0cb296bc059ed15a1a947f Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Thu, 6 Feb 2020 17:55:58 -0600 Subject: [PATCH 20/39] Fix types on getIndex function This is a weird helper, I'm not really sure where it should go. --- .../siem/server/lib/detection_engine/routes/utils.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts index 3fa9f01f226f9..8b261f89c2b8b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts @@ -6,8 +6,7 @@ import Boom from 'boom'; import { APP_ID, SIGNALS_INDEX_KEY } from '../../../../common/constants'; -import { LegacySetupServices, RequestFacade } from '../../../plugin'; -import { ScopedServices } from '../../../services'; +import { LegacySetupServices } from '../../../plugin'; export const transformError = (err: Error & { statusCode?: number }) => { if (Boom.isBoom(err)) { @@ -159,8 +158,8 @@ export const transformBulkError = ( }; export const getIndex = ( - getSpaceId: ScopedServices['getSpaceId'], - config: ScopedServices['config'] + getSpaceId: () => string | undefined, + config: LegacySetupServices['config'] ): string => { const spaceId = getSpaceId(); const signalsIndex = config().get(`xpack.${APP_ID}.${SIGNALS_INDEX_KEY}`); From 101993f6284f665978861c10a3f80863f5e523f4 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Thu, 6 Feb 2020 18:29:41 -0600 Subject: [PATCH 21/39] Our ClientsService is a clients ... service Return clients, as this is closer to what we'll get in the request context. --- .../routes/index/create_index_route.ts | 13 +++--- .../routes/index/delete_index_route.ts | 13 +++--- .../routes/index/read_index_route.ts | 13 +++--- .../privileges/read_privileges_route.ts | 14 +++--- .../rules/add_prepackaged_rules_route.ts | 21 +++++---- .../routes/rules/create_rules_bulk_route.ts | 19 ++++---- .../routes/rules/create_rules_route.ts | 19 ++++---- .../routes/rules/delete_rules_bulk_route.ts | 12 ++--- .../routes/rules/delete_rules_route.ts | 10 ++-- .../routes/rules/export_rules_route.ts | 10 ++-- .../routes/rules/find_rules_route.ts | 10 ++-- .../routes/rules/find_rules_status_route.ts | 12 ++--- .../get_prepackaged_rules_status_route.ts | 10 ++-- .../routes/rules/import_rules_route.ts | 21 +++++---- .../routes/rules/read_rules_route.ts | 10 ++-- .../routes/rules/update_rules_bulk_route.ts | 12 ++--- .../routes/rules/update_rules_route.ts | 10 ++-- .../signals/open_close_signals_route.ts | 14 +++--- .../routes/signals/query_signals_route.ts | 14 +++--- .../routes/tags/read_tags_route.ts | 10 ++-- .../plugins/siem/server/routes/index.ts | 46 +++++++++---------- .../plugins/siem/server/services/clients.ts | 18 ++++---- .../plugins/siem/server/services/index.ts | 2 +- 23 files changed, 168 insertions(+), 165 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts index 73db6053087fc..9ff609f88d048 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts @@ -9,7 +9,7 @@ import Boom from 'boom'; import { DETECTION_ENGINE_INDEX_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; import { transformError, getIndex } from '../utils'; import { getIndexExists } from '../../index/get_index_exists'; import { getPolicyExists } from '../../index/get_policy_exists'; @@ -22,7 +22,7 @@ import signalsPolicy from './signals_policy.json'; export const createCreateIndexRoute = ( config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): Hapi.ServerRoute => { return { method: 'POST', @@ -37,9 +37,10 @@ export const createCreateIndexRoute = ( }, async handler(request: RequestFacade) { try { - const { callCluster, getSpaceId } = await getServices(request); + const { clusterClient, spacesClient } = await getClients(request); + const callCluster = clusterClient.callAsCurrentUser; - const index = getIndex(getSpaceId, config); + const index = getIndex(spacesClient.getSpaceId, config); const indexExists = await getIndexExists(callCluster, index); if (indexExists) { return new Boom(`index: "${index}" already exists`, { statusCode: 409 }); @@ -66,7 +67,7 @@ export const createCreateIndexRoute = ( export const createIndexRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ) => { - route(createCreateIndexRoute(config, getServices)); + route(createCreateIndexRoute(config, getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts index f8e5e1dbb3b5d..74471958152eb 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts @@ -9,7 +9,7 @@ import Boom from 'boom'; import { DETECTION_ENGINE_INDEX_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; import { transformError, getIndex } from '../utils'; import { getIndexExists } from '../../index/get_index_exists'; import { getPolicyExists } from '../../index/get_policy_exists'; @@ -30,7 +30,7 @@ import { deleteTemplate } from '../../index/delete_template'; */ export const createDeleteIndexRoute = ( config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): Hapi.ServerRoute => { return { method: 'DELETE', @@ -45,9 +45,10 @@ export const createDeleteIndexRoute = ( }, async handler(request: RequestFacade) { try { - const { callCluster, getSpaceId } = await getServices(request); + const { clusterClient, spacesClient } = await getClients(request); + const callCluster = clusterClient.callAsCurrentUser; - const index = getIndex(getSpaceId, config); + const index = getIndex(spacesClient.getSpaceId, config); const indexExists = await getIndexExists(callCluster, index); if (!indexExists) { return new Boom(`index: "${index}" does not exist`, { statusCode: 404 }); @@ -73,7 +74,7 @@ export const createDeleteIndexRoute = ( export const deleteIndexRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ) => { - route(createDeleteIndexRoute(config, getServices)); + route(createDeleteIndexRoute(config, getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts index 53b273ebfd728..7247a6dc509fe 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts @@ -9,13 +9,13 @@ import Boom from 'boom'; import { DETECTION_ENGINE_INDEX_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; import { transformError, getIndex } from '../utils'; import { getIndexExists } from '../../index/get_index_exists'; export const createReadIndexRoute = ( config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): Hapi.ServerRoute => { return { method: 'GET', @@ -30,9 +30,10 @@ export const createReadIndexRoute = ( }, async handler(request: RequestFacade, headers) { try { - const { callCluster, getSpaceId } = await getServices(request); + const { clusterClient, spacesClient } = await getClients(request); + const callCluster = clusterClient.callAsCurrentUser; - const index = getIndex(getSpaceId, config); + const index = getIndex(spacesClient.getSpaceId, config); const indexExists = await getIndexExists(callCluster, index); if (indexExists) { @@ -61,7 +62,7 @@ export const createReadIndexRoute = ( export const readIndexRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ) => { - route(createReadIndexRoute(config, getServices)); + route(createReadIndexRoute(config, getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts index 032968c0e440f..ad3dc76bd544f 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts @@ -10,14 +10,14 @@ import { merge } from 'lodash/fp'; import { DETECTION_ENGINE_PRIVILEGES_URL } from '../../../../../common/constants'; import { RulesRequest } from '../../rules/types'; import { LegacySetupServices } from '../../../../plugin'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; import { transformError, getIndex } from '../utils'; import { readPrivileges } from '../../privileges/read_privileges'; export const createReadPrivilegesRulesRoute = ( config: LegacySetupServices['config'], usingEphemeralEncryptionKey: boolean, - getServices: GetScopedClientServices + getClients: GetScopedClients ): Hapi.ServerRoute => { return { method: 'GET', @@ -32,10 +32,10 @@ export const createReadPrivilegesRulesRoute = ( }, async handler(request: RulesRequest) { try { - const { callCluster, getSpaceId } = await getServices(request); + const { clusterClient, spacesClient } = await getClients(request); - const index = getIndex(getSpaceId, config); - const permissions = await readPrivileges(callCluster, index); + const index = getIndex(spacesClient.getSpaceId, config); + const permissions = await readPrivileges(clusterClient.callAsCurrentUser, index); return merge(permissions, { is_authenticated: request?.auth?.isAuthenticated ?? false, has_encryption_key: !usingEphemeralEncryptionKey, @@ -51,7 +51,7 @@ export const readPrivilegesRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], usingEphemeralEncryptionKey: boolean, - getServices: GetScopedClientServices + getClients: GetScopedClients ) => { - route(createReadPrivilegesRulesRoute(config, usingEphemeralEncryptionKey, getServices)); + route(createReadPrivilegesRulesRoute(config, usingEphemeralEncryptionKey, getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts index 2c579095f80fd..83759e1ab09e5 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts @@ -9,7 +9,7 @@ import Boom from 'boom'; import { DETECTION_ENGINE_PREPACKAGED_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; import { getIndexExists } from '../../index/get_index_exists'; import { getIndex, transformError } from '../utils'; import { getPrepackagedRules } from '../../rules/get_prepackaged_rules'; @@ -21,7 +21,7 @@ import { getExistingPrepackagedRules } from '../../rules/get_existing_prepackage export const createAddPrepackedRulesRoute = ( config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): Hapi.ServerRoute => { return { method: 'PUT', @@ -39,10 +39,10 @@ export const createAddPrepackedRulesRoute = ( const { actionsClient, alertsClient, - callCluster, - getSpaceId, + clusterClient, savedObjectsClient, - } = await getServices(request); + spacesClient, + } = await getClients(request); if (!actionsClient || !alertsClient || !savedObjectsClient) { return headers.response().code(404); @@ -54,9 +54,12 @@ export const createAddPrepackedRulesRoute = ( const rulesToInstall = getRulesToInstall(rulesFromFileSystem, prepackagedRules); const rulesToUpdate = getRulesToUpdate(rulesFromFileSystem, prepackagedRules); - const spaceIndex = getIndex(getSpaceId, config); + const spaceIndex = getIndex(spacesClient.getSpaceId, config); if (rulesToInstall.length !== 0 || rulesToUpdate.length !== 0) { - const spaceIndexExists = await getIndexExists(callCluster, spaceIndex); + const spaceIndexExists = await getIndexExists( + clusterClient.callAsCurrentUser, + spaceIndex + ); if (!spaceIndexExists) { return Boom.badRequest( `Pre-packaged rules cannot be installed until the space index is created: ${spaceIndex}` @@ -87,7 +90,7 @@ export const createAddPrepackedRulesRoute = ( export const addPrepackedRulesRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): void => { - route(createAddPrepackedRulesRoute(config, getServices)); + route(createAddPrepackedRulesRoute(config, getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts index e5a6ae86a72d8..100ff23e1a995 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts @@ -8,7 +8,7 @@ import Hapi from 'hapi'; import uuid from 'uuid'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; import { createRules } from '../../rules/create_rules'; import { BulkRulesRequest } from '../../rules/types'; import { LegacySetupServices } from '../../../../plugin'; @@ -20,7 +20,7 @@ import { createRulesBulkSchema } from '../schemas/create_rules_bulk_schema'; export const createCreateRulesBulkRoute = ( config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): Hapi.ServerRoute => { return { method: 'POST', @@ -38,10 +38,10 @@ export const createCreateRulesBulkRoute = ( const { actionsClient, alertsClient, - callCluster, - getSpaceId, + clusterClient, + spacesClient, savedObjectsClient, - } = await getServices(request); + } = await getClients(request); if (!actionsClient || !alertsClient || !savedObjectsClient) { return headers.response().code(404); @@ -79,8 +79,9 @@ export const createCreateRulesBulkRoute = ( const ruleIdOrUuid = ruleId ?? uuid.v4(); try { - const finalIndex = outputIndex != null ? outputIndex : getIndex(getSpaceId, config); - const indexExists = await getIndexExists(callCluster, finalIndex); + const finalIndex = + outputIndex != null ? outputIndex : getIndex(spacesClient.getSpaceId, config); + const indexExists = await getIndexExists(clusterClient.callAsCurrentUser, finalIndex); if (!indexExists) { return createBulkErrorObject({ ruleId: ruleIdOrUuid, @@ -142,7 +143,7 @@ export const createCreateRulesBulkRoute = ( export const createRulesBulkRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): void => { - route(createCreateRulesBulkRoute(config, getServices)); + route(createCreateRulesBulkRoute(config, getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts index 3ec516950a466..4e2f61afa2ba6 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts @@ -9,7 +9,7 @@ import Boom from 'boom'; import uuid from 'uuid'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; import { createRules } from '../../rules/create_rules'; import { RulesRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { createRulesSchema } from '../schemas/create_rules_schema'; @@ -22,7 +22,7 @@ import { getIndex, transformError } from '../utils'; export const createCreateRulesRoute = ( config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): Hapi.ServerRoute => { return { method: 'POST', @@ -67,17 +67,18 @@ export const createCreateRulesRoute = ( const { alertsClient, actionsClient, - callCluster, - getSpaceId, + clusterClient, savedObjectsClient, - } = await getServices(request); + spacesClient, + } = await getClients(request); if (!actionsClient || !alertsClient || !savedObjectsClient) { return headers.response().code(404); } - const finalIndex = outputIndex != null ? outputIndex : getIndex(getSpaceId, config); - const indexExists = await getIndexExists(callCluster, finalIndex); + const finalIndex = + outputIndex != null ? outputIndex : getIndex(spacesClient.getSpaceId, config); + const indexExists = await getIndexExists(clusterClient.callAsCurrentUser, finalIndex); if (!indexExists) { return Boom.badRequest( `To create a rule, the index must exist first. Index ${finalIndex} does not exist` @@ -140,7 +141,7 @@ export const createCreateRulesRoute = ( export const createRulesRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): void => { - route(createCreateRulesRoute(config, getServices)); + route(createCreateRulesRoute(config, getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts index a33e9ad98cbac..1e11a446d7957 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts @@ -8,7 +8,7 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { LegacySetupServices } from '../../../../plugin'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; import { queryRulesBulkSchema } from '../schemas/query_rules_bulk_schema'; import { transformOrBulkError, getIdBulkError } from './utils'; import { transformBulkError } from '../utils'; @@ -16,9 +16,7 @@ import { QueryBulkRequest, IRuleSavedAttributesSavedObjectAttributes } from '../ import { deleteRules } from '../../rules/delete_rules'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; -export const createDeleteRulesBulkRoute = ( - getServices: GetScopedClientServices -): Hapi.ServerRoute => { +export const createDeleteRulesBulkRoute = (getClients: GetScopedClients): Hapi.ServerRoute => { return { method: ['POST', 'DELETE'], // allow both POST and DELETE in case their client does not support bodies in DELETE path: `${DETECTION_ENGINE_RULES_URL}/_bulk_delete`, @@ -32,7 +30,7 @@ export const createDeleteRulesBulkRoute = ( }, }, async handler(request: QueryBulkRequest, headers) { - const { actionsClient, alertsClient, savedObjectsClient } = await getServices(request); + const { actionsClient, alertsClient, savedObjectsClient } = await getClients(request); if (!actionsClient || !alertsClient || !savedObjectsClient) { return headers.response().code(404); @@ -77,7 +75,7 @@ export const createDeleteRulesBulkRoute = ( export const deleteRulesBulkRoute = ( route: LegacySetupServices['route'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): void => { - route(createDeleteRulesBulkRoute(getServices)); + route(createDeleteRulesBulkRoute(getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts index d3bfeebfb4cb1..81b2fa9a85433 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts @@ -9,14 +9,14 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { deleteRules } from '../../rules/delete_rules'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; import { queryRulesSchema } from '../schemas/query_rules_schema'; import { getIdError, transformOrError } from './utils'; import { transformError } from '../utils'; import { QueryRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; -export const createDeleteRulesRoute = (getServices: GetScopedClientServices): Hapi.ServerRoute => { +export const createDeleteRulesRoute = (getClients: GetScopedClients): Hapi.ServerRoute => { return { method: 'DELETE', path: DETECTION_ENGINE_RULES_URL, @@ -33,7 +33,7 @@ export const createDeleteRulesRoute = (getServices: GetScopedClientServices): Ha const { id, rule_id: ruleId } = request.query; try { - const { actionsClient, alertsClient, savedObjectsClient } = await getServices(request); + const { actionsClient, alertsClient, savedObjectsClient } = await getClients(request); if (!actionsClient || !alertsClient || !savedObjectsClient) { return headers.response().code(404); @@ -70,7 +70,7 @@ export const createDeleteRulesRoute = (getServices: GetScopedClientServices): Ha export const deleteRulesRoute = ( route: LegacySetupServices['route'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): void => { - route(createDeleteRulesRoute(getServices)); + route(createDeleteRulesRoute(getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts index b1941ee83fc32..d55c315d39655 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts @@ -9,7 +9,7 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; import { ExportRulesRequest } from '../../rules/types'; import { getNonPackagedRulesCount } from '../../rules/get_existing_prepackaged_rules'; import { exportRulesSchema, exportRulesQuerySchema } from '../schemas/export_rules_schema'; @@ -18,7 +18,7 @@ import { getExportAll } from '../../rules/get_export_all'; export const createExportRulesRoute = ( config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): Hapi.ServerRoute => { return { method: 'POST', @@ -34,7 +34,7 @@ export const createExportRulesRoute = ( }, }, async handler(request: ExportRulesRequest & RequestFacade, headers) { - const { alertsClient } = await getServices(request); + const { alertsClient } = await getClients(request); if (!alertsClient) { return headers.response().code(404); @@ -73,7 +73,7 @@ export const createExportRulesRoute = ( export const exportRulesRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): void => { - route(createExportRulesRoute(config, getServices)); + route(createExportRulesRoute(config, getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts index bd9835b087f91..4c7624ef9b43c 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts @@ -7,7 +7,7 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; import { findRules } from '../../rules/find_rules'; import { FindRulesRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { findRulesSchema } from '../schemas/find_rules_schema'; @@ -15,7 +15,7 @@ import { transformFindAlertsOrError } from './utils'; import { transformError } from '../utils'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; -export const createFindRulesRoute = (getServices: GetScopedClientServices): Hapi.ServerRoute => { +export const createFindRulesRoute = (getClients: GetScopedClients): Hapi.ServerRoute => { return { method: 'GET', path: `${DETECTION_ENGINE_RULES_URL}/_find`, @@ -31,7 +31,7 @@ export const createFindRulesRoute = (getServices: GetScopedClientServices): Hapi async handler(request: FindRulesRequest & RequestFacade, headers) { const { query } = request; try { - const { alertsClient, savedObjectsClient } = await getServices(request); + const { alertsClient, savedObjectsClient } = await getClients(request); if (!alertsClient || !savedObjectsClient) { return headers.response().code(404); } @@ -69,7 +69,7 @@ export const createFindRulesRoute = (getServices: GetScopedClientServices): Hapi export const findRulesRoute = ( route: LegacySetupServices['route'], - getServices: GetScopedClientServices + getClients: GetScopedClients ) => { - route(createFindRulesRoute(getServices)); + route(createFindRulesRoute(getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts index e294e403da962..2608139ca15c8 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts @@ -9,7 +9,7 @@ import { snakeCase } from 'lodash/fp'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; import { findRulesStatusesSchema } from '../schemas/find_rules_statuses_schema'; import { FindRulesStatusesRequest, @@ -30,9 +30,7 @@ const convertToSnakeCase = >(obj: T): Partial | }, {}); }; -export const createFindRulesStatusRoute = ( - getServices: GetScopedClientServices -): Hapi.ServerRoute => ({ +export const createFindRulesStatusRoute = (getClients: GetScopedClients): Hapi.ServerRoute => ({ method: 'GET', path: `${DETECTION_ENGINE_RULES_URL}/_find_statuses`, options: { @@ -46,7 +44,7 @@ export const createFindRulesStatusRoute = ( }, async handler(request: FindRulesStatusesRequest & RequestFacade, headers) { const { query } = request; - const { alertsClient, savedObjectsClient } = await getServices(request); + const { alertsClient, savedObjectsClient } = await getClients(request); if (!alertsClient || !savedObjectsClient) { return headers.response().code(404); @@ -91,7 +89,7 @@ export const createFindRulesStatusRoute = ( export const findRulesStatusesRoute = ( route: LegacySetupServices['route'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): void => { - route(createFindRulesStatusRoute(getServices)); + route(createFindRulesStatusRoute(getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts index 5cf78280df502..e03c2b29242d6 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts @@ -8,7 +8,7 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_PREPACKAGED_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; import { transformError } from '../utils'; import { getPrepackagedRules } from '../../rules/get_prepackaged_rules'; import { getRulesToInstall } from '../../rules/get_rules_to_install'; @@ -17,7 +17,7 @@ import { findRules } from '../../rules/find_rules'; import { getExistingPrepackagedRules } from '../../rules/get_existing_prepackaged_rules'; export const createGetPrepackagedRulesStatusRoute = ( - getServices: GetScopedClientServices + getClients: GetScopedClients ): Hapi.ServerRoute => { return { method: 'GET', @@ -31,7 +31,7 @@ export const createGetPrepackagedRulesStatusRoute = ( }, }, async handler(request: RequestFacade, headers) { - const { alertsClient } = await getServices(request); + const { alertsClient } = await getClients(request); if (!alertsClient) { return headers.response().code(404); @@ -65,7 +65,7 @@ export const createGetPrepackagedRulesStatusRoute = ( export const getPrepackagedRulesStatusRoute = ( route: LegacySetupServices['route'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): void => { - route(createGetPrepackagedRulesStatusRoute(getServices)); + route(createGetPrepackagedRulesStatusRoute(getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts index 72cc809744adc..1f71f925b1c4a 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts @@ -22,7 +22,7 @@ import { createRulesStreamFromNdJson } from '../../rules/create_rules_stream_fro import { ImportRuleAlertRest } from '../../types'; import { updateRules } from '../../rules/update_rules'; import { importRulesQuerySchema, importRulesPayloadSchema } from '../schemas/import_rules_schema'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; type PromiseFromStreams = ImportRuleAlertRest | Error; @@ -36,7 +36,7 @@ const CHUNK_PARSED_OBJECT_SIZE = 10; export const createImportRulesRoute = ( config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): Hapi.ServerRoute => { return { method: 'POST', @@ -60,10 +60,10 @@ export const createImportRulesRoute = ( const { actionsClient, alertsClient, - callCluster, - getSpaceId, + clusterClient, + spacesClient, savedObjectsClient, - } = await getServices(request); + } = await getClients(request); if (!actionsClient || !alertsClient || !savedObjectsClient) { return headers.response().code(404); @@ -149,8 +149,11 @@ export const createImportRulesRoute = ( version, } = parsedRule; try { - const finalIndex = getIndex(getSpaceId, config); - const indexExists = await getIndexExists(callCluster, finalIndex); + const finalIndex = getIndex(spacesClient.getSpaceId, config); + const indexExists = await getIndexExists( + clusterClient.callAsCurrentUser, + finalIndex + ); if (!indexExists) { resolve( createBulkErrorObject({ @@ -266,7 +269,7 @@ export const createImportRulesRoute = ( export const importRulesRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): void => { - route(createImportRulesRoute(config, getServices)); + route(createImportRulesRoute(config, getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts index a41a66cd94e20..cd1b4188ef42b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts @@ -14,9 +14,9 @@ import { LegacySetupServices, RequestFacade } from '../../../../plugin'; import { queryRulesSchema } from '../schemas/query_rules_schema'; import { QueryRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; -export const createReadRulesRoute = (getServices: GetScopedClientServices): Hapi.ServerRoute => ({ +export const createReadRulesRoute = (getClients: GetScopedClients): Hapi.ServerRoute => ({ method: 'GET', path: DETECTION_ENGINE_RULES_URL, options: { @@ -32,7 +32,7 @@ export const createReadRulesRoute = (getServices: GetScopedClientServices): Hapi const { id, rule_id: ruleId } = request.query; try { - const { alertsClient, savedObjectsClient } = await getServices(request); + const { alertsClient, savedObjectsClient } = await getClients(request); if (!alertsClient || !savedObjectsClient) { return headers.response().code(404); } @@ -65,7 +65,7 @@ export const createReadRulesRoute = (getServices: GetScopedClientServices): Hapi export const readRulesRoute = ( route: LegacySetupServices['route'], - getServices: GetScopedClientServices + getClients: GetScopedClients ) => { - route(createReadRulesRoute(getServices)); + route(createReadRulesRoute(getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts index 06b9301b0978e..d4687d72eb7f3 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts @@ -12,16 +12,14 @@ import { IRuleSavedAttributesSavedObjectAttributes, } from '../../rules/types'; import { LegacySetupServices } from '../../../../plugin'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; import { transformOrBulkError, getIdBulkError } from './utils'; import { transformBulkError } from '../utils'; import { updateRulesBulkSchema } from '../schemas/update_rules_bulk_schema'; import { updateRules } from '../../rules/update_rules'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; -export const createUpdateRulesBulkRoute = ( - getServices: GetScopedClientServices -): Hapi.ServerRoute => { +export const createUpdateRulesBulkRoute = (getClients: GetScopedClients): Hapi.ServerRoute => { return { method: 'PUT', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, @@ -35,7 +33,7 @@ export const createUpdateRulesBulkRoute = ( }, }, async handler(request: BulkUpdateRulesRequest, headers) { - const { actionsClient, alertsClient, savedObjectsClient } = await getServices(request); + const { actionsClient, alertsClient, savedObjectsClient } = await getClients(request); if (!actionsClient || !alertsClient || !savedObjectsClient) { return headers.response().code(404); @@ -131,7 +129,7 @@ export const createUpdateRulesBulkRoute = ( export const updateRulesBulkRoute = ( route: LegacySetupServices['route'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): void => { - route(createUpdateRulesBulkRoute(getServices)); + route(createUpdateRulesBulkRoute(getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts index 89f8a92389393..a47341b9fe3d4 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts @@ -13,9 +13,9 @@ import { LegacySetupServices } from '../../../../plugin'; import { getIdError, transformOrError } from './utils'; import { transformError } from '../utils'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; -export const createUpdateRulesRoute = (getServices: GetScopedClientServices): Hapi.ServerRoute => { +export const createUpdateRulesRoute = (getClients: GetScopedClients): Hapi.ServerRoute => { return { method: 'PUT', path: DETECTION_ENGINE_RULES_URL, @@ -59,7 +59,7 @@ export const createUpdateRulesRoute = (getServices: GetScopedClientServices): Ha } = request.payload; try { - const { alertsClient, actionsClient, savedObjectsClient } = await getServices(request); + const { alertsClient, actionsClient, savedObjectsClient } = await getClients(request); if (!actionsClient || !alertsClient || !savedObjectsClient) { return headers.response().code(404); @@ -120,7 +120,7 @@ export const createUpdateRulesRoute = (getServices: GetScopedClientServices): Ha export const updateRulesRoute = ( route: LegacySetupServices['route'], - getServices: GetScopedClientServices + getClients: GetScopedClients ) => { - route(createUpdateRulesRoute(getServices)); + route(createUpdateRulesRoute(getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts index 62f110630e6e8..8af8e9da6d682 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts @@ -10,11 +10,11 @@ import { SignalsStatusRequest } from '../../signals/types'; import { setSignalsStatusSchema } from '../schemas/set_signal_status_schema'; import { LegacySetupServices } from '../../../../plugin'; import { transformError, getIndex } from '../utils'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; export const setSignalsStatusRouteDef = ( config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): Hapi.ServerRoute => { return { method: 'POST', @@ -30,8 +30,8 @@ export const setSignalsStatusRouteDef = ( }, async handler(request: SignalsStatusRequest) { const { signal_ids: signalIds, query, status } = request.payload; - const { callCluster, getSpaceId } = await getServices(request); - const index = getIndex(getSpaceId, config); + const { clusterClient, spacesClient } = await getClients(request); + const index = getIndex(spacesClient.getSpaceId, config); let queryObject; if (signalIds) { @@ -45,7 +45,7 @@ export const setSignalsStatusRouteDef = ( }; } try { - return callCluster('updateByQuery', { + return clusterClient.callAsCurrentUser('updateByQuery', { index, body: { script: { @@ -66,7 +66,7 @@ export const setSignalsStatusRouteDef = ( export const setSignalsStatusRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ) => { - route(setSignalsStatusRouteDef(config, getServices)); + route(setSignalsStatusRouteDef(config, getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts index 632624a2442da..05e0abfa147f0 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts @@ -6,7 +6,7 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_QUERY_SIGNALS_URL } from '../../../../../common/constants'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; import { SignalsQueryRequest } from '../../signals/types'; import { querySignalsSchema } from '../schemas/query_signals_index_schema'; import { LegacySetupServices } from '../../../../plugin'; @@ -14,7 +14,7 @@ import { transformError, getIndex } from '../utils'; export const querySignalsRouteDef = ( config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ): Hapi.ServerRoute => { return { method: 'POST', @@ -30,12 +30,12 @@ export const querySignalsRouteDef = ( }, async handler(request: SignalsQueryRequest) { const { query, aggs, _source, track_total_hits, size } = request.payload; - const { callCluster, getSpaceId } = await getServices(request); + const { clusterClient, spacesClient } = await getClients(request); - const index = getIndex(getSpaceId, config); + const index = getIndex(spacesClient.getSpaceId, config); try { - return callCluster('search', { + return clusterClient.callAsCurrentUser('search', { index, body: { query, aggs, _source, track_total_hits, size }, }); @@ -50,7 +50,7 @@ export const querySignalsRouteDef = ( export const querySignalsRoute = ( route: LegacySetupServices['route'], config: LegacySetupServices['config'], - getServices: GetScopedClientServices + getClients: GetScopedClients ) => { - route(querySignalsRouteDef(config, getServices)); + route(querySignalsRouteDef(config, getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts index 97875155536ab..b5b2b661eb6ef 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts @@ -10,9 +10,9 @@ import { DETECTION_ENGINE_TAGS_URL } from '../../../../../common/constants'; import { LegacySetupServices, RequestFacade } from '../../../../plugin'; import { transformError } from '../utils'; import { readTags } from '../../tags/read_tags'; -import { GetScopedClientServices } from '../../../../services'; +import { GetScopedClients } from '../../../../services'; -export const createReadTagsRoute = (getServices: GetScopedClientServices): Hapi.ServerRoute => ({ +export const createReadTagsRoute = (getClients: GetScopedClients): Hapi.ServerRoute => ({ method: 'GET', path: DETECTION_ENGINE_TAGS_URL, options: { @@ -24,7 +24,7 @@ export const createReadTagsRoute = (getServices: GetScopedClientServices): Hapi. }, }, async handler(request: RequestFacade, headers) { - const { alertsClient } = await getServices(request); + const { alertsClient } = await getClients(request); if (!alertsClient) { return headers.response().code(404); @@ -43,7 +43,7 @@ export const createReadTagsRoute = (getServices: GetScopedClientServices): Hapi. export const readTagsRoute = ( route: LegacySetupServices['route'], - getServices: GetScopedClientServices + getClients: GetScopedClients ) => { - route(createReadTagsRoute(getServices)); + route(createReadTagsRoute(getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/routes/index.ts b/x-pack/legacy/plugins/siem/server/routes/index.ts index 13b2fe4b92e5f..2d4b8dd5041e7 100644 --- a/x-pack/legacy/plugins/siem/server/routes/index.ts +++ b/x-pack/legacy/plugins/siem/server/routes/index.ts @@ -5,7 +5,7 @@ */ import { ServerFacade } from '../types'; -import { GetScopedClientServices } from '../services'; +import { GetScopedClients } from '../services'; import { createRulesRoute } from '../lib/detection_engine/routes/rules/create_rules_route'; import { createIndexRoute } from '../lib/detection_engine/routes/index/create_index_route'; @@ -28,47 +28,47 @@ import { exportRulesRoute } from '../lib/detection_engine/routes/rules/export_ru import { findRulesStatusesRoute } from '../lib/detection_engine/routes/rules/find_rules_status_route'; import { getPrepackagedRulesStatusRoute } from '../lib/detection_engine/routes/rules/get_prepackaged_rules_status_route'; -export type LegacyInitRoutes = (getServices: GetScopedClientServices) => void; +export type LegacyInitRoutes = (getClients: GetScopedClients) => void; export const initRoutes = ( route: ServerFacade['route'], config: ServerFacade['config'], usingEphemeralEncryptionKey: boolean -) => (getServices: GetScopedClientServices): void => { +) => (getClients: GetScopedClients): void => { // Detection Engine Rule routes that have the REST endpoints of /api/detection_engine/rules // All REST rule creation, deletion, updating, etc...... - createRulesRoute(route, config, getServices); - readRulesRoute(route, getServices); - updateRulesRoute(route, getServices); - deleteRulesRoute(route, getServices); - findRulesRoute(route, getServices); + createRulesRoute(route, config, getClients); + readRulesRoute(route, getClients); + updateRulesRoute(route, getClients); + deleteRulesRoute(route, getClients); + findRulesRoute(route, getClients); - addPrepackedRulesRoute(route, config, getServices); - getPrepackagedRulesStatusRoute(route, getServices); - createRulesBulkRoute(route, config, getServices); - updateRulesBulkRoute(route, getServices); - deleteRulesBulkRoute(route, getServices); + addPrepackedRulesRoute(route, config, getClients); + getPrepackagedRulesStatusRoute(route, getClients); + createRulesBulkRoute(route, config, getClients); + updateRulesBulkRoute(route, getClients); + deleteRulesBulkRoute(route, getClients); - importRulesRoute(route, config, getServices); - exportRulesRoute(route, config, getServices); + importRulesRoute(route, config, getClients); + exportRulesRoute(route, config, getClients); - findRulesStatusesRoute(route, getServices); + findRulesStatusesRoute(route, getClients); // Detection Engine Signals routes that have the REST endpoints of /api/detection_engine/signals // POST /api/detection_engine/signals/status // Example usage can be found in siem/server/lib/detection_engine/scripts/signals - setSignalsStatusRoute(route, config, getServices); - querySignalsRoute(route, config, getServices); + setSignalsStatusRoute(route, config, getClients); + querySignalsRoute(route, config, getClients); // Detection Engine index routes that have the REST endpoints of /api/detection_engine/index // All REST index creation, policy management for spaces - createIndexRoute(route, config, getServices); - readIndexRoute(route, config, getServices); - deleteIndexRoute(route, config, getServices); + createIndexRoute(route, config, getClients); + readIndexRoute(route, config, getClients); + deleteIndexRoute(route, config, getClients); // Detection Engine tags routes that have the REST endpoints of /api/detection_engine/tags - readTagsRoute(route, getServices); + readTagsRoute(route, getClients); // Privileges API to get the generic user privileges - readPrivilegesRoute(route, config, usingEphemeralEncryptionKey, getServices); + readPrivilegesRoute(route, config, usingEphemeralEncryptionKey, getClients); }; diff --git a/x-pack/legacy/plugins/siem/server/services/clients.ts b/x-pack/legacy/plugins/siem/server/services/clients.ts index cfb76d915cdb8..99f052f297360 100644 --- a/x-pack/legacy/plugins/siem/server/services/clients.ts +++ b/x-pack/legacy/plugins/siem/server/services/clients.ts @@ -15,18 +15,16 @@ import { ActionsClient } from '../../../../../plugins/actions/server'; import { AlertsClient } from '../../../../../legacy/plugins/alerting/server'; import { CoreStart, StartPlugins, SetupPlugins } from '../plugin'; -export interface ClientServices { +export interface Clients { actionsClient?: ActionsClient; - callCluster: IScopedClusterClient['callAsCurrentUser']; - getSpaceId: () => string | undefined; + clusterClient: IScopedClusterClient; + spacesClient: { getSpaceId: () => string | undefined }; savedObjectsClient: SavedObjectsClientContract; } -interface LegacyClientServices { +interface LegacyClients { alertsClient?: AlertsClient; } -export type GetScopedClientServices = ( - request: LegacyRequest -) => Promise; +export type GetScopedClients = (request: LegacyRequest) => Promise; export class ClientsService { private actions?: StartPlugins['actions']; @@ -47,7 +45,7 @@ export class ClientsService { this.actions = actions; } - public getScopedFactory(): GetScopedClientServices { + public getScopedFactory(): GetScopedClients { if (!this.clusterClient || !this.savedObjects) { throw new Error('Services not initialized'); } @@ -58,9 +56,9 @@ export class ClientsService { return { alertsClient: request.getAlertsClient?.(), actionsClient: await this.actions?.getActionsClientWithRequest?.(kibanaRequest), - callCluster: this.clusterClient!.asScoped(kibanaRequest).callAsCurrentUser, - getSpaceId: () => this.spacesService?.getSpaceId?.(kibanaRequest), + clusterClient: this.clusterClient!.asScoped(kibanaRequest), savedObjectsClient: this.savedObjects!.getScopedClient(kibanaRequest), + spacesClient: { getSpaceId: () => this.spacesService?.getSpaceId?.(kibanaRequest) }, }; }; } diff --git a/x-pack/legacy/plugins/siem/server/services/index.ts b/x-pack/legacy/plugins/siem/server/services/index.ts index e6c1f15331e99..f4deea2c2a3fd 100644 --- a/x-pack/legacy/plugins/siem/server/services/index.ts +++ b/x-pack/legacy/plugins/siem/server/services/index.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { ClientsService, GetScopedClientServices } from './clients'; +export { ClientsService, GetScopedClients } from './clients'; From f7bb2fb4f2049ce00c6528ef42a672e5973465f9 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Thu, 6 Feb 2020 19:16:30 -0600 Subject: [PATCH 22/39] Clean up our server types * Declare legacy types at top-level file * Don't re-export from the plugin solely for convenience, that's a slippery slope straight to circular dependencies * Remove RequestFacade as it was a facade for LegacyRequest * Rename ServerFacade/LegacySetupServices to just LegacyServices --- x-pack/legacy/plugins/siem/index.ts | 16 ++++++-------- .../routes/__mocks__/_mock_server.ts | 4 ++-- .../routes/index/create_index_route.ts | 10 ++++----- .../routes/index/delete_index_route.ts | 10 ++++----- .../routes/index/read_index_route.ts | 10 ++++----- .../privileges/read_privileges_route.ts | 8 +++---- .../rules/add_prepackaged_rules_route.ts | 10 ++++----- .../routes/rules/create_rules_bulk_route.ts | 8 +++---- .../routes/rules/create_rules_route.ts | 8 +++---- .../routes/rules/delete_rules_bulk_route.ts | 4 ++-- .../routes/rules/delete_rules_route.ts | 6 ++--- .../routes/rules/export_rules_route.ts | 10 ++++----- .../routes/rules/find_rules_route.ts | 9 +++----- .../routes/rules/find_rules_status_route.ts | 6 ++--- .../get_prepackaged_rules_status_route.ts | 6 ++--- .../routes/rules/import_rules_route.ts | 10 ++++----- .../routes/rules/read_rules_route.ts | 9 +++----- .../routes/rules/update_rules_bulk_route.ts | 4 ++-- .../routes/rules/update_rules_route.ts | 7 ++---- .../signals/open_close_signals_route.ts | 10 ++++----- .../routes/signals/query_signals_route.ts | 8 +++---- .../routes/tags/read_tags_route.ts | 9 +++----- .../lib/detection_engine/routes/utils.ts | 4 ++-- .../lib/detection_engine/rules/types.ts | 22 +++++++++---------- .../lib/detection_engine/signals/types.ts | 6 ++--- x-pack/legacy/plugins/siem/server/plugin.ts | 12 +++++----- .../plugins/siem/server/routes/index.ts | 6 ++--- x-pack/legacy/plugins/siem/server/types.ts | 13 ++++------- 28 files changed, 113 insertions(+), 132 deletions(-) diff --git a/x-pack/legacy/plugins/siem/index.ts b/x-pack/legacy/plugins/siem/index.ts index 659742c8bc783..c786dad61c09d 100644 --- a/x-pack/legacy/plugins/siem/index.ts +++ b/x-pack/legacy/plugins/siem/index.ts @@ -148,20 +148,18 @@ export const siem = (kibana: any) => { mappings: savedObjectMappings, }, init(server: Server) { - const { config, newPlatform, plugins, route } = server; - const { coreContext, env, setup, start } = newPlatform; + const { coreContext, env, setup, start } = server.newPlatform; const initializerContext = { ...coreContext, env }; - const serverFacade = { - config, - plugins: { - alerting: plugins.alerting, - }, - route: route.bind(server), + const __legacy = { + config: server.config, + alerting: server.plugins.alerting, + route: server.route.bind(server), }; + // @ts-ignore-next-line: NewPlatform shim is too loosely typed const pluginInstance = plugin(initializerContext); // @ts-ignore-next-line: NewPlatform shim is too loosely typed - pluginInstance.setup(setup.core, setup.plugins, serverFacade); + pluginInstance.setup(setup.core, setup.plugins, __legacy); // @ts-ignore-next-line: NewPlatform shim is too loosely typed pluginInstance.start(start.core, start.plugins); }, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts index 78a2185cbab04..38e5846d64e57 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts @@ -15,7 +15,7 @@ import { actionsClientMock } from '../../../../../../../../plugins/actions/serve // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { spacesServiceMock } from '../../../../../../../../plugins/spaces/server/spaces_service/spaces_service.mock'; import { APP_ID, SIGNALS_INDEX_KEY } from '../../../../../common/constants'; -import { LegacySetupServices } from '../../../../plugin'; +import { LegacyServices } from '../../../../types'; const defaultConfig = { 'kibana.index': '.kibana', @@ -71,7 +71,7 @@ export const createMockServer = (hasAlertsClient = true) => { const services = ({ ...npServices, ...legacyServices, - } as unknown) as LegacySetupServices; + } as unknown) as LegacyServices; return { inject: server.inject.bind(server), diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts index 9ff609f88d048..0105fa8f9d13b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts @@ -8,7 +8,7 @@ import Hapi from 'hapi'; import Boom from 'boom'; import { DETECTION_ENGINE_INDEX_URL } from '../../../../../common/constants'; -import { LegacySetupServices, RequestFacade } from '../../../../plugin'; +import { LegacyServices, LegacyRequest } from '../../../../types'; import { GetScopedClients } from '../../../../services'; import { transformError, getIndex } from '../utils'; import { getIndexExists } from '../../index/get_index_exists'; @@ -21,7 +21,7 @@ import { createBootstrapIndex } from '../../index/create_bootstrap_index'; import signalsPolicy from './signals_policy.json'; export const createCreateIndexRoute = ( - config: LegacySetupServices['config'], + config: LegacyServices['config'], getClients: GetScopedClients ): Hapi.ServerRoute => { return { @@ -35,7 +35,7 @@ export const createCreateIndexRoute = ( }, }, }, - async handler(request: RequestFacade) { + async handler(request: LegacyRequest) { try { const { clusterClient, spacesClient } = await getClients(request); const callCluster = clusterClient.callAsCurrentUser; @@ -65,8 +65,8 @@ export const createCreateIndexRoute = ( }; export const createIndexRoute = ( - route: LegacySetupServices['route'], - config: LegacySetupServices['config'], + route: LegacyServices['route'], + config: LegacyServices['config'], getClients: GetScopedClients ) => { route(createCreateIndexRoute(config, getClients)); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts index 74471958152eb..93cde56c37c39 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts @@ -8,7 +8,7 @@ import Hapi from 'hapi'; import Boom from 'boom'; import { DETECTION_ENGINE_INDEX_URL } from '../../../../../common/constants'; -import { LegacySetupServices, RequestFacade } from '../../../../plugin'; +import { LegacyServices, LegacyRequest } from '../../../../types'; import { GetScopedClients } from '../../../../services'; import { transformError, getIndex } from '../utils'; import { getIndexExists } from '../../index/get_index_exists'; @@ -29,7 +29,7 @@ import { deleteTemplate } from '../../index/delete_template'; * And ensuring they're all gone */ export const createDeleteIndexRoute = ( - config: LegacySetupServices['config'], + config: LegacyServices['config'], getClients: GetScopedClients ): Hapi.ServerRoute => { return { @@ -43,7 +43,7 @@ export const createDeleteIndexRoute = ( }, }, }, - async handler(request: RequestFacade) { + async handler(request: LegacyRequest) { try { const { clusterClient, spacesClient } = await getClients(request); const callCluster = clusterClient.callAsCurrentUser; @@ -72,8 +72,8 @@ export const createDeleteIndexRoute = ( }; export const deleteIndexRoute = ( - route: LegacySetupServices['route'], - config: LegacySetupServices['config'], + route: LegacyServices['route'], + config: LegacyServices['config'], getClients: GetScopedClients ) => { route(createDeleteIndexRoute(config, getClients)); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts index 7247a6dc509fe..fb05d6a09f296 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts @@ -8,13 +8,13 @@ import Hapi from 'hapi'; import Boom from 'boom'; import { DETECTION_ENGINE_INDEX_URL } from '../../../../../common/constants'; -import { LegacySetupServices, RequestFacade } from '../../../../plugin'; +import { LegacyServices, LegacyRequest } from '../../../../types'; import { GetScopedClients } from '../../../../services'; import { transformError, getIndex } from '../utils'; import { getIndexExists } from '../../index/get_index_exists'; export const createReadIndexRoute = ( - config: LegacySetupServices['config'], + config: LegacyServices['config'], getClients: GetScopedClients ): Hapi.ServerRoute => { return { @@ -28,7 +28,7 @@ export const createReadIndexRoute = ( }, }, }, - async handler(request: RequestFacade, headers) { + async handler(request: LegacyRequest, headers) { try { const { clusterClient, spacesClient } = await getClients(request); const callCluster = clusterClient.callAsCurrentUser; @@ -60,8 +60,8 @@ export const createReadIndexRoute = ( }; export const readIndexRoute = ( - route: LegacySetupServices['route'], - config: LegacySetupServices['config'], + route: LegacyServices['route'], + config: LegacyServices['config'], getClients: GetScopedClients ) => { route(createReadIndexRoute(config, getClients)); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts index ad3dc76bd544f..2d3b0ed2242aa 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts @@ -8,14 +8,14 @@ import Hapi from 'hapi'; import { merge } from 'lodash/fp'; import { DETECTION_ENGINE_PRIVILEGES_URL } from '../../../../../common/constants'; +import { LegacyServices } from '../../../../types'; import { RulesRequest } from '../../rules/types'; -import { LegacySetupServices } from '../../../../plugin'; import { GetScopedClients } from '../../../../services'; import { transformError, getIndex } from '../utils'; import { readPrivileges } from '../../privileges/read_privileges'; export const createReadPrivilegesRulesRoute = ( - config: LegacySetupServices['config'], + config: LegacyServices['config'], usingEphemeralEncryptionKey: boolean, getClients: GetScopedClients ): Hapi.ServerRoute => { @@ -48,8 +48,8 @@ export const createReadPrivilegesRulesRoute = ( }; export const readPrivilegesRoute = ( - route: LegacySetupServices['route'], - config: LegacySetupServices['config'], + route: LegacyServices['route'], + config: LegacyServices['config'], usingEphemeralEncryptionKey: boolean, getClients: GetScopedClients ) => { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts index 83759e1ab09e5..771c128992a3b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts @@ -8,7 +8,7 @@ import Hapi from 'hapi'; import Boom from 'boom'; import { DETECTION_ENGINE_PREPACKAGED_URL } from '../../../../../common/constants'; -import { LegacySetupServices, RequestFacade } from '../../../../plugin'; +import { LegacyServices, LegacyRequest } from '../../../../types'; import { GetScopedClients } from '../../../../services'; import { getIndexExists } from '../../index/get_index_exists'; import { getIndex, transformError } from '../utils'; @@ -20,7 +20,7 @@ import { getRulesToUpdate } from '../../rules/get_rules_to_update'; import { getExistingPrepackagedRules } from '../../rules/get_existing_prepackaged_rules'; export const createAddPrepackedRulesRoute = ( - config: LegacySetupServices['config'], + config: LegacyServices['config'], getClients: GetScopedClients ): Hapi.ServerRoute => { return { @@ -34,7 +34,7 @@ export const createAddPrepackedRulesRoute = ( }, }, }, - async handler(request: RequestFacade, headers) { + async handler(request: LegacyRequest, headers) { try { const { actionsClient, @@ -88,8 +88,8 @@ export const createAddPrepackedRulesRoute = ( }; export const addPrepackedRulesRoute = ( - route: LegacySetupServices['route'], - config: LegacySetupServices['config'], + route: LegacyServices['route'], + config: LegacyServices['config'], getClients: GetScopedClients ): void => { route(createAddPrepackedRulesRoute(config, getClients)); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts index 100ff23e1a995..e88b1663abdac 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts @@ -9,9 +9,9 @@ import uuid from 'uuid'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { GetScopedClients } from '../../../../services'; +import { LegacyServices } from '../../../../types'; import { createRules } from '../../rules/create_rules'; import { BulkRulesRequest } from '../../rules/types'; -import { LegacySetupServices } from '../../../../plugin'; import { readRules } from '../../rules/read_rules'; import { transformOrBulkError } from './utils'; import { getIndexExists } from '../../index/get_index_exists'; @@ -19,7 +19,7 @@ import { getIndex, transformBulkError, createBulkErrorObject } from '../utils'; import { createRulesBulkSchema } from '../schemas/create_rules_bulk_schema'; export const createCreateRulesBulkRoute = ( - config: LegacySetupServices['config'], + config: LegacyServices['config'], getClients: GetScopedClients ): Hapi.ServerRoute => { return { @@ -141,8 +141,8 @@ export const createCreateRulesBulkRoute = ( }; export const createRulesBulkRoute = ( - route: LegacySetupServices['route'], - config: LegacySetupServices['config'], + route: LegacyServices['route'], + config: LegacyServices['config'], getClients: GetScopedClients ): void => { route(createCreateRulesBulkRoute(config, getClients)); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts index 4e2f61afa2ba6..2121091879109 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts @@ -10,10 +10,10 @@ import uuid from 'uuid'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { GetScopedClients } from '../../../../services'; +import { LegacyServices } from '../../../../types'; import { createRules } from '../../rules/create_rules'; import { RulesRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { createRulesSchema } from '../schemas/create_rules_schema'; -import { LegacySetupServices } from '../../../../plugin'; import { readRules } from '../../rules/read_rules'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { transformOrError } from './utils'; @@ -21,7 +21,7 @@ import { getIndexExists } from '../../index/get_index_exists'; import { getIndex, transformError } from '../utils'; export const createCreateRulesRoute = ( - config: LegacySetupServices['config'], + config: LegacyServices['config'], getClients: GetScopedClients ): Hapi.ServerRoute => { return { @@ -139,8 +139,8 @@ export const createCreateRulesRoute = ( }; export const createRulesRoute = ( - route: LegacySetupServices['route'], - config: LegacySetupServices['config'], + route: LegacyServices['route'], + config: LegacyServices['config'], getClients: GetScopedClients ): void => { route(createCreateRulesRoute(config, getClients)); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts index 1e11a446d7957..032c62bf3e5ec 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts @@ -7,7 +7,7 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { LegacySetupServices } from '../../../../plugin'; +import { LegacyServices } from '../../../../types'; import { GetScopedClients } from '../../../../services'; import { queryRulesBulkSchema } from '../schemas/query_rules_bulk_schema'; import { transformOrBulkError, getIdBulkError } from './utils'; @@ -74,7 +74,7 @@ export const createDeleteRulesBulkRoute = (getClients: GetScopedClients): Hapi.S }; export const deleteRulesBulkRoute = ( - route: LegacySetupServices['route'], + route: LegacyServices['route'], getClients: GetScopedClients ): void => { route(createDeleteRulesBulkRoute(getClients)); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts index 81b2fa9a85433..ae645d879363b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts @@ -8,7 +8,7 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { deleteRules } from '../../rules/delete_rules'; -import { LegacySetupServices, RequestFacade } from '../../../../plugin'; +import { LegacyServices, LegacyRequest } from '../../../../types'; import { GetScopedClients } from '../../../../services'; import { queryRulesSchema } from '../schemas/query_rules_schema'; import { getIdError, transformOrError } from './utils'; @@ -29,7 +29,7 @@ export const createDeleteRulesRoute = (getClients: GetScopedClients): Hapi.Serve query: queryRulesSchema, }, }, - async handler(request: QueryRequest & RequestFacade, headers) { + async handler(request: QueryRequest & LegacyRequest, headers) { const { id, rule_id: ruleId } = request.query; try { @@ -69,7 +69,7 @@ export const createDeleteRulesRoute = (getClients: GetScopedClients): Hapi.Serve }; export const deleteRulesRoute = ( - route: LegacySetupServices['route'], + route: LegacyServices['route'], getClients: GetScopedClients ): void => { route(createDeleteRulesRoute(getClients)); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts index d55c315d39655..c170260d1f62c 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts @@ -8,7 +8,7 @@ import Boom from 'boom'; import Hapi from 'hapi'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { LegacySetupServices, RequestFacade } from '../../../../plugin'; +import { LegacyServices, LegacyRequest } from '../../../../types'; import { GetScopedClients } from '../../../../services'; import { ExportRulesRequest } from '../../rules/types'; import { getNonPackagedRulesCount } from '../../rules/get_existing_prepackaged_rules'; @@ -17,7 +17,7 @@ import { getExportByObjectIds } from '../../rules/get_export_by_object_ids'; import { getExportAll } from '../../rules/get_export_all'; export const createExportRulesRoute = ( - config: LegacySetupServices['config'], + config: LegacyServices['config'], getClients: GetScopedClients ): Hapi.ServerRoute => { return { @@ -33,7 +33,7 @@ export const createExportRulesRoute = ( query: exportRulesQuerySchema, }, }, - async handler(request: ExportRulesRequest & RequestFacade, headers) { + async handler(request: ExportRulesRequest & LegacyRequest, headers) { const { alertsClient } = await getClients(request); if (!alertsClient) { @@ -71,8 +71,8 @@ export const createExportRulesRoute = ( }; export const exportRulesRoute = ( - route: LegacySetupServices['route'], - config: LegacySetupServices['config'], + route: LegacyServices['route'], + config: LegacyServices['config'], getClients: GetScopedClients ): void => { route(createExportRulesRoute(config, getClients)); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts index 4c7624ef9b43c..2a094c1e693da 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts @@ -6,7 +6,7 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { LegacySetupServices, RequestFacade } from '../../../../plugin'; +import { LegacyServices, LegacyRequest } from '../../../../types'; import { GetScopedClients } from '../../../../services'; import { findRules } from '../../rules/find_rules'; import { FindRulesRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; @@ -28,7 +28,7 @@ export const createFindRulesRoute = (getClients: GetScopedClients): Hapi.ServerR query: findRulesSchema, }, }, - async handler(request: FindRulesRequest & RequestFacade, headers) { + async handler(request: FindRulesRequest & LegacyRequest, headers) { const { query } = request; try { const { alertsClient, savedObjectsClient } = await getClients(request); @@ -67,9 +67,6 @@ export const createFindRulesRoute = (getClients: GetScopedClients): Hapi.ServerR }; }; -export const findRulesRoute = ( - route: LegacySetupServices['route'], - getClients: GetScopedClients -) => { +export const findRulesRoute = (route: LegacyServices['route'], getClients: GetScopedClients) => { route(createFindRulesRoute(getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts index 2608139ca15c8..25d89f65f8e12 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts @@ -8,7 +8,7 @@ import Hapi from 'hapi'; import { snakeCase } from 'lodash/fp'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { LegacySetupServices, RequestFacade } from '../../../../plugin'; +import { LegacyServices, LegacyRequest } from '../../../../types'; import { GetScopedClients } from '../../../../services'; import { findRulesStatusesSchema } from '../schemas/find_rules_statuses_schema'; import { @@ -42,7 +42,7 @@ export const createFindRulesStatusRoute = (getClients: GetScopedClients): Hapi.S query: findRulesStatusesSchema, }, }, - async handler(request: FindRulesStatusesRequest & RequestFacade, headers) { + async handler(request: FindRulesStatusesRequest & LegacyRequest, headers) { const { query } = request; const { alertsClient, savedObjectsClient } = await getClients(request); @@ -88,7 +88,7 @@ export const createFindRulesStatusRoute = (getClients: GetScopedClients): Hapi.S }); export const findRulesStatusesRoute = ( - route: LegacySetupServices['route'], + route: LegacyServices['route'], getClients: GetScopedClients ): void => { route(createFindRulesStatusRoute(getClients)); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts index e03c2b29242d6..5d1baa1aaa0f7 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.ts @@ -7,7 +7,7 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_PREPACKAGED_URL } from '../../../../../common/constants'; -import { LegacySetupServices, RequestFacade } from '../../../../plugin'; +import { LegacyServices, LegacyRequest } from '../../../../types'; import { GetScopedClients } from '../../../../services'; import { transformError } from '../utils'; import { getPrepackagedRules } from '../../rules/get_prepackaged_rules'; @@ -30,7 +30,7 @@ export const createGetPrepackagedRulesStatusRoute = ( }, }, }, - async handler(request: RequestFacade, headers) { + async handler(request: LegacyRequest, headers) { const { alertsClient } = await getClients(request); if (!alertsClient) { @@ -64,7 +64,7 @@ export const createGetPrepackagedRulesStatusRoute = ( }; export const getPrepackagedRulesStatusRoute = ( - route: LegacySetupServices['route'], + route: LegacyServices['route'], getClients: GetScopedClients ): void => { route(createGetPrepackagedRulesStatusRoute(getClients)); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts index 1f71f925b1c4a..b4b8a3528830c 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts @@ -12,7 +12,7 @@ import uuid from 'uuid'; import { createPromiseFromStreams } from '../../../../../../../../../src/legacy/utils/streams'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { LegacySetupServices, RequestFacade } from '../../../../plugin'; +import { LegacyServices, LegacyRequest } from '../../../../types'; import { createRules } from '../../rules/create_rules'; import { ImportRulesRequest } from '../../rules/types'; import { readRules } from '../../rules/read_rules'; @@ -35,7 +35,7 @@ type PromiseFromStreams = ImportRuleAlertRest | Error; const CHUNK_PARSED_OBJECT_SIZE = 10; export const createImportRulesRoute = ( - config: LegacySetupServices['config'], + config: LegacyServices['config'], getClients: GetScopedClients ): Hapi.ServerRoute => { return { @@ -56,7 +56,7 @@ export const createImportRulesRoute = ( payload: importRulesPayloadSchema, }, }, - async handler(request: ImportRulesRequest & RequestFacade, headers) { + async handler(request: ImportRulesRequest & LegacyRequest, headers) { const { actionsClient, alertsClient, @@ -267,8 +267,8 @@ export const createImportRulesRoute = ( }; export const importRulesRoute = ( - route: LegacySetupServices['route'], - config: LegacySetupServices['config'], + route: LegacyServices['route'], + config: LegacyServices['config'], getClients: GetScopedClients ): void => { route(createImportRulesRoute(config, getClients)); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts index cd1b4188ef42b..359b0d24ddc87 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts @@ -10,7 +10,7 @@ import { getIdError, transformOrError } from './utils'; import { transformError } from '../utils'; import { readRules } from '../../rules/read_rules'; -import { LegacySetupServices, RequestFacade } from '../../../../plugin'; +import { LegacyServices, LegacyRequest } from '../../../../types'; import { queryRulesSchema } from '../schemas/query_rules_schema'; import { QueryRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; @@ -28,7 +28,7 @@ export const createReadRulesRoute = (getClients: GetScopedClients): Hapi.ServerR query: queryRulesSchema, }, }, - async handler(request: QueryRequest & RequestFacade, headers) { + async handler(request: QueryRequest & LegacyRequest, headers) { const { id, rule_id: ruleId } = request.query; try { @@ -63,9 +63,6 @@ export const createReadRulesRoute = (getClients: GetScopedClients): Hapi.ServerR }, }); -export const readRulesRoute = ( - route: LegacySetupServices['route'], - getClients: GetScopedClients -) => { +export const readRulesRoute = (route: LegacyServices['route'], getClients: GetScopedClients) => { route(createReadRulesRoute(getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts index d4687d72eb7f3..71ce48dd37148 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts @@ -11,7 +11,7 @@ import { BulkUpdateRulesRequest, IRuleSavedAttributesSavedObjectAttributes, } from '../../rules/types'; -import { LegacySetupServices } from '../../../../plugin'; +import { LegacyServices } from '../../../../types'; import { GetScopedClients } from '../../../../services'; import { transformOrBulkError, getIdBulkError } from './utils'; import { transformBulkError } from '../utils'; @@ -128,7 +128,7 @@ export const createUpdateRulesBulkRoute = (getClients: GetScopedClients): Hapi.S }; export const updateRulesBulkRoute = ( - route: LegacySetupServices['route'], + route: LegacyServices['route'], getClients: GetScopedClients ): void => { route(createUpdateRulesBulkRoute(getClients)); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts index a47341b9fe3d4..7b75b159384fe 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts @@ -9,7 +9,7 @@ import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { updateRules } from '../../rules/update_rules'; import { UpdateRulesRequest, IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { updateRulesSchema } from '../schemas/update_rules_schema'; -import { LegacySetupServices } from '../../../../plugin'; +import { LegacyServices } from '../../../../types'; import { getIdError, transformOrError } from './utils'; import { transformError } from '../utils'; import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; @@ -118,9 +118,6 @@ export const createUpdateRulesRoute = (getClients: GetScopedClients): Hapi.Serve }; }; -export const updateRulesRoute = ( - route: LegacySetupServices['route'], - getClients: GetScopedClients -) => { +export const updateRulesRoute = (route: LegacyServices['route'], getClients: GetScopedClients) => { route(createUpdateRulesRoute(getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts index 8af8e9da6d682..b2b938625180e 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts @@ -6,14 +6,14 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_SIGNALS_STATUS_URL } from '../../../../../common/constants'; +import { LegacyServices } from '../../../../types'; +import { GetScopedClients } from '../../../../services'; import { SignalsStatusRequest } from '../../signals/types'; import { setSignalsStatusSchema } from '../schemas/set_signal_status_schema'; -import { LegacySetupServices } from '../../../../plugin'; import { transformError, getIndex } from '../utils'; -import { GetScopedClients } from '../../../../services'; export const setSignalsStatusRouteDef = ( - config: LegacySetupServices['config'], + config: LegacyServices['config'], getClients: GetScopedClients ): Hapi.ServerRoute => { return { @@ -64,8 +64,8 @@ export const setSignalsStatusRouteDef = ( }; export const setSignalsStatusRoute = ( - route: LegacySetupServices['route'], - config: LegacySetupServices['config'], + route: LegacyServices['route'], + config: LegacyServices['config'], getClients: GetScopedClients ) => { route(setSignalsStatusRouteDef(config, getClients)); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts index 05e0abfa147f0..a3602ffbded41 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts @@ -6,14 +6,14 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_QUERY_SIGNALS_URL } from '../../../../../common/constants'; +import { LegacyServices } from '../../../../types'; import { GetScopedClients } from '../../../../services'; import { SignalsQueryRequest } from '../../signals/types'; import { querySignalsSchema } from '../schemas/query_signals_index_schema'; -import { LegacySetupServices } from '../../../../plugin'; import { transformError, getIndex } from '../utils'; export const querySignalsRouteDef = ( - config: LegacySetupServices['config'], + config: LegacyServices['config'], getClients: GetScopedClients ): Hapi.ServerRoute => { return { @@ -48,8 +48,8 @@ export const querySignalsRouteDef = ( }; export const querySignalsRoute = ( - route: LegacySetupServices['route'], - config: LegacySetupServices['config'], + route: LegacyServices['route'], + config: LegacyServices['config'], getClients: GetScopedClients ) => { route(querySignalsRouteDef(config, getClients)); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts index b5b2b661eb6ef..56910e7560c44 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/tags/read_tags_route.ts @@ -7,7 +7,7 @@ import Hapi from 'hapi'; import { DETECTION_ENGINE_TAGS_URL } from '../../../../../common/constants'; -import { LegacySetupServices, RequestFacade } from '../../../../plugin'; +import { LegacyServices, LegacyRequest } from '../../../../types'; import { transformError } from '../utils'; import { readTags } from '../../tags/read_tags'; import { GetScopedClients } from '../../../../services'; @@ -23,7 +23,7 @@ export const createReadTagsRoute = (getClients: GetScopedClients): Hapi.ServerRo }, }, }, - async handler(request: RequestFacade, headers) { + async handler(request: LegacyRequest, headers) { const { alertsClient } = await getClients(request); if (!alertsClient) { @@ -41,9 +41,6 @@ export const createReadTagsRoute = (getClients: GetScopedClients): Hapi.ServerRo }, }); -export const readTagsRoute = ( - route: LegacySetupServices['route'], - getClients: GetScopedClients -) => { +export const readTagsRoute = (route: LegacyServices['route'], getClients: GetScopedClients) => { route(createReadTagsRoute(getClients)); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts index 8b261f89c2b8b..1e3e5f4ddbb41 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts @@ -6,7 +6,7 @@ import Boom from 'boom'; import { APP_ID, SIGNALS_INDEX_KEY } from '../../../../common/constants'; -import { LegacySetupServices } from '../../../plugin'; +import { LegacyServices } from '../../../types'; export const transformError = (err: Error & { statusCode?: number }) => { if (Boom.isBoom(err)) { @@ -159,7 +159,7 @@ export const transformBulkError = ( export const getIndex = ( getSpaceId: () => string | undefined, - config: LegacySetupServices['config'] + config: LegacyServices['config'] ): string => { const spaceId = getSpaceId(); const signalsIndex = config().get(`xpack.${APP_ID}.${SIGNALS_INDEX_KEY}`); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/types.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/types.ts index 1d423c8b375d1..17ff3bcb38b38 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/types.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/types.ts @@ -14,10 +14,10 @@ import { SavedObjectsClientContract, } from 'kibana/server'; import { SIGNALS_ID } from '../../../../common/constants'; +import { LegacyRequest } from '../../../types'; import { AlertsClient } from '../../../../../alerting/server'; import { ActionsClient } from '../../../../../../../plugins/actions/server'; import { RuleAlertParams, RuleTypeParams, RuleAlertParamsRest } from '../types'; -import { RequestFacade } from '../../../types'; import { Alert } from '../../../../../alerting/server/types'; export type UpdateRuleAlertParamsRest = Partial & { @@ -34,11 +34,11 @@ export interface FindParamsRest { filter: string; } -export interface UpdateRulesRequest extends RequestFacade { +export interface UpdateRulesRequest extends LegacyRequest { payload: UpdateRuleAlertParamsRest; } -export interface BulkUpdateRulesRequest extends RequestFacade { +export interface BulkUpdateRulesRequest extends LegacyRequest { payload: UpdateRuleAlertParamsRest[]; } @@ -86,11 +86,11 @@ export interface IRuleStatusFindType { export type RuleStatusString = 'succeeded' | 'failed' | 'going to run' | 'executing'; -export interface RulesRequest extends RequestFacade { +export interface RulesRequest extends LegacyRequest { payload: RuleAlertParamsRest; } -export interface BulkRulesRequest extends RequestFacade { +export interface BulkRulesRequest extends LegacyRequest { payload: RuleAlertParamsRest[]; } @@ -99,12 +99,12 @@ export interface HapiReadableStream extends Readable { filename: string; }; } -export interface ImportRulesRequest extends Omit { +export interface ImportRulesRequest extends Omit { query: { overwrite: boolean }; payload: { file: HapiReadableStream }; } -export interface ExportRulesRequest extends Omit { +export interface ExportRulesRequest extends Omit { payload: { objects: Array<{ rule_id: string }> | null | undefined }; query: { file_name: string; @@ -112,11 +112,11 @@ export interface ExportRulesRequest extends Omit { }; } -export type QueryRequest = Omit & { +export type QueryRequest = Omit & { query: { id: string | undefined; rule_id: string | undefined }; }; -export interface QueryBulkRequest extends RequestFacade { +export interface QueryBulkRequest extends LegacyRequest { payload: Array; } @@ -130,7 +130,7 @@ export interface FindRuleParams { sortOrder?: 'asc' | 'desc'; } -export interface FindRulesRequest extends Omit { +export interface FindRulesRequest extends Omit { query: { per_page: number; page: number; @@ -142,7 +142,7 @@ export interface FindRulesRequest extends Omit { }; } -export interface FindRulesStatusesRequest extends Omit { +export interface FindRulesStatusesRequest extends Omit { query: { ids: string[]; }; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/types.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/types.ts index 9b7b2b8f1fff9..e9159ab87a0c0 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/types.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/types.ts @@ -6,7 +6,7 @@ import { RuleAlertParams, OutputRuleAlertRest } from '../types'; import { SearchResponse } from '../../types'; -import { RequestFacade } from '../../../types'; +import { LegacyRequest } from '../../../types'; import { AlertType, State, AlertExecutorOptions } from '../../../../../alerting/server/types'; export interface SignalsParams { @@ -35,11 +35,11 @@ export type SignalsStatusRestParams = Omit & { export type SignalsQueryRestParams = SignalQueryParams; -export interface SignalsStatusRequest extends RequestFacade { +export interface SignalsStatusRequest extends LegacyRequest { payload: SignalsStatusRestParams; } -export interface SignalsQueryRequest extends RequestFacade { +export interface SignalsQueryRequest extends LegacyRequest { payload: SignalsQueryRestParams; } diff --git a/x-pack/legacy/plugins/siem/server/plugin.ts b/x-pack/legacy/plugins/siem/server/plugin.ts index 2ca3ae6ef1ea7..1edab9d103ca0 100644 --- a/x-pack/legacy/plugins/siem/server/plugin.ts +++ b/x-pack/legacy/plugins/siem/server/plugin.ts @@ -5,6 +5,7 @@ */ import { i18n } from '@kbn/i18n'; + import { CoreSetup, CoreStart, @@ -16,6 +17,7 @@ import { PluginSetupContract as FeaturesSetup } from '../../../../plugins/featur import { EncryptedSavedObjectsPluginSetup as EncryptedSavedObjectsSetup } from '../../../../plugins/encrypted_saved_objects/server'; import { SpacesPluginSetup as SpacesSetup } from '../../../../plugins/spaces/server'; import { PluginStartContract as ActionsStart } from '../../../../plugins/actions/server'; +import { LegacyServices } from './types'; import { initServer } from './init_server'; import { compose } from './lib/compose/kibana'; import { initRoutes, LegacyInitRoutes } from './routes'; @@ -27,10 +29,9 @@ import { timelineSavedObjectType, ruleStatusSavedObjectType, } from './saved_objects'; -import { RequestFacade, ServerFacade } from './types'; import { ClientsService } from './services'; -export { CoreSetup, CoreStart, Logger, PluginInitializerContext, RequestFacade }; +export { CoreSetup, CoreStart, Logger, PluginInitializerContext }; export interface SetupPlugins { encryptedSavedObjects: EncryptedSavedObjectsSetup; @@ -40,7 +41,6 @@ export interface SetupPlugins { } export type SetupServices = CoreSetup & SetupPlugins; -export type LegacySetupServices = SetupServices & ServerFacade; export interface StartPlugins { actions: ActionsStart; @@ -61,7 +61,7 @@ export class Plugin { this.logger.debug('Shim plugin initialized'); } - public setup(core: CoreSetup, plugins: SetupPlugins, __legacy: ServerFacade) { + public setup(core: CoreSetup, plugins: SetupPlugins, __legacy: LegacyServices) { this.logger.debug('Shim plugin setup'); this.clients.setup(core.elasticsearch.dataClient, plugins.spaces.spacesService); @@ -132,13 +132,13 @@ export class Plugin { }, }); - if (__legacy.plugins.alerting != null) { + if (__legacy.alerting != null) { const type = signalRulesAlertType({ logger: this.logger, version: this.context.env.packageInfo.version, }); if (isAlertExecutor(type)) { - __legacy.plugins.alerting.setup.registerType(type); + __legacy.alerting.setup.registerType(type); } } diff --git a/x-pack/legacy/plugins/siem/server/routes/index.ts b/x-pack/legacy/plugins/siem/server/routes/index.ts index 2d4b8dd5041e7..85cc883adae3e 100644 --- a/x-pack/legacy/plugins/siem/server/routes/index.ts +++ b/x-pack/legacy/plugins/siem/server/routes/index.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ServerFacade } from '../types'; +import { LegacyServices } from '../types'; import { GetScopedClients } from '../services'; import { createRulesRoute } from '../lib/detection_engine/routes/rules/create_rules_route'; @@ -31,8 +31,8 @@ import { getPrepackagedRulesStatusRoute } from '../lib/detection_engine/routes/r export type LegacyInitRoutes = (getClients: GetScopedClients) => void; export const initRoutes = ( - route: ServerFacade['route'], - config: ServerFacade['config'], + route: LegacyServices['route'], + config: LegacyServices['config'], usingEphemeralEncryptionKey: boolean ) => (getClients: GetScopedClients): void => { // Detection Engine Rule routes that have the REST endpoints of /api/detection_engine/rules diff --git a/x-pack/legacy/plugins/siem/server/types.ts b/x-pack/legacy/plugins/siem/server/types.ts index 32ccd0444768d..e7831bb5d0451 100644 --- a/x-pack/legacy/plugins/siem/server/types.ts +++ b/x-pack/legacy/plugins/siem/server/types.ts @@ -5,16 +5,11 @@ */ import { Legacy } from 'kibana'; -import { LegacyRequest } from '../../../../../src/core/server'; -export interface ServerFacade { +export { LegacyRequest } from '../../../../../src/core/server'; + +export interface LegacyServices { + alerting?: Legacy.Server['plugins']['alerting']; config: Legacy.Server['config']; - plugins: { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - actions: any; // We have to do this at the moment because the types are not compatible - alerting?: Legacy.Server['plugins']['alerting']; - }; route: Legacy.Server['route']; } - -export type RequestFacade = LegacyRequest; From 2502698e516104805a2047a895b65a11999f7c54 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Thu, 6 Feb 2020 23:03:52 -0600 Subject: [PATCH 23/39] Refactor mocks for new architecture * Separates config, server, and client mocks, as they're now independent in our system, route-wise. * gets one test working, the rest will follow. --- .../routes/__mocks__/_mock_clients.ts | 29 ++++++ .../routes/__mocks__/_mock_config.ts | 39 ++++++++ .../routes/__mocks__/_mock_server.ts | 82 +--------------- .../routes/rules/create_rules_route.test.ts | 95 +++++++++---------- 4 files changed, 116 insertions(+), 129 deletions(-) create mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_clients.ts create mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_config.ts diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_clients.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_clients.ts new file mode 100644 index 0000000000000..d3a51c7e9c279 --- /dev/null +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_clients.ts @@ -0,0 +1,29 @@ +/* + * 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 { + elasticsearchServiceMock, + savedObjectsClientMock, +} from '../../../../../../../../../src/core/server/mocks'; +import { alertsClientMock } from '../../../../../../alerting/server/alerts_client.mock'; +import { ActionsClient } from '../../../../../../../../plugins/actions/server'; +import { actionsClientMock } from '../../../../../../../../plugins/actions/server/mocks'; +import { GetScopedClients } from '../../../../services'; + +export const createMockClients = () => { + const mockClients = { + actionsClient: actionsClientMock.create() as jest.Mocked, + alertsClient: alertsClientMock.create(), + clusterClient: elasticsearchServiceMock.createScopedClusterClient(), + savedObjectsClient: savedObjectsClientMock.create(), + spacesClient: { getSpaceId: jest.fn() }, + }; + + return { + getClients: jest.fn(() => Promise.resolve(mockClients) as ReturnType), + clients: mockClients, + }; +}; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_config.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_config.ts new file mode 100644 index 0000000000000..b21f7114964ee --- /dev/null +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_config.ts @@ -0,0 +1,39 @@ +/* + * 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 { Legacy } from 'kibana'; +import { APP_ID, SIGNALS_INDEX_KEY } from '../../../../../common/constants'; + +const defaultConfig = { + 'kibana.index': '.kibana', + [`xpack.${APP_ID}.${SIGNALS_INDEX_KEY}`]: '.siem-signals', +}; + +const isKibanaConfig = (config: unknown): config is Legacy.KibanaConfig => + Object.getOwnPropertyDescriptor(config, 'get') != null && + Object.getOwnPropertyDescriptor(config, 'has') != null; + +const assertNever = (): never => { + throw new Error('Unexpected object'); +}; + +export const createMockConfig = ( + config: Record = defaultConfig +): (() => Legacy.KibanaConfig) => () => { + const returnConfig = { + get(key: string) { + return config[key]; + }, + has(key: string) { + return config[key] != null; + }, + }; + if (isKibanaConfig(returnConfig)) { + return returnConfig; + } else { + return assertNever(); + } +}; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts index 38e5846d64e57..67ebb7532c752 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts @@ -5,90 +5,12 @@ */ import Hapi from 'hapi'; -import { KibanaConfig } from 'src/legacy/server/kbn_server'; -import { - elasticsearchServiceMock, - savedObjectsClientMock, -} from '../../../../../../../../../src/core/server/mocks'; -import { alertsClientMock } from '../../../../../../alerting/server/alerts_client.mock'; -import { actionsClientMock } from '../../../../../../../../plugins/actions/server/mocks'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { spacesServiceMock } from '../../../../../../../../plugins/spaces/server/spaces_service/spaces_service.mock'; -import { APP_ID, SIGNALS_INDEX_KEY } from '../../../../../common/constants'; -import { LegacyServices } from '../../../../types'; - -const defaultConfig = { - 'kibana.index': '.kibana', - [`xpack.${APP_ID}.${SIGNALS_INDEX_KEY}`]: '.siem-signals', -}; - -const isKibanaConfig = (config: unknown): config is KibanaConfig => - Object.getOwnPropertyDescriptor(config, 'get') != null && - Object.getOwnPropertyDescriptor(config, 'has') != null; - -const assertNever = (): never => { - throw new Error('Unexpected object'); -}; - -const createMockKibanaConfig = (config: Record = defaultConfig): KibanaConfig => { - const returnConfig = { - get(key: string) { - return config[key]; - }, - has(key: string) { - return config[key] != null; - }, - }; - if (isKibanaConfig(returnConfig)) { - return returnConfig; - } else { - return assertNever(); - } -}; - -export const createMockServer = (hasAlertsClient = true) => { - const actionsClient = actionsClientMock.create(); - const alertsClient = alertsClientMock.create(); - const elasticsearch = elasticsearchServiceMock.createSetup(); - const savedObjectsClient = savedObjectsClientMock.create(); - const spacesService = spacesServiceMock.createSetupContract(); +export const createMockServer = () => { const server = new Hapi.Server({ port: 0 }); - server.decorate('request', 'getSavedObjectsClient', () => savedObjectsClient); - if (hasAlertsClient) server.decorate('request', 'getAlertsClient', () => alertsClient); - - const npServices = { elasticsearch, spaces: { spacesService } }; - const legacyServices = { - config: createMockKibanaConfig, - plugins: { - actions: { - getActionsClientWithRequest: () => actionsClient, - }, - }, - route: server.route.bind(server), - }; - const services = ({ - ...npServices, - ...legacyServices, - } as unknown) as LegacyServices; - return { + route: server.route.bind(server), inject: server.inject.bind(server), - services, - callClusterMock: createCallClusterMock(elasticsearch), - alertsClient, - actionsClient, - savedObjectsClient, }; }; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const createCallClusterMock = (elasticMock: any) => { - const mock = jest.fn(); - elasticMock.dataClient.asScoped.mockImplementation(() => ({ - callAsCurrentUser: mock, - })); - - return mock; -}; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts index 9139b167915dd..8a7b3e3b143b7 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts @@ -4,9 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createMockServer } from '../__mocks__/_mock_server'; -import { createRulesRoute } from './create_rules_route'; import { ServerInjectOptions } from 'hapi'; +import { omit } from 'lodash/fp'; + +import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { createRulesRoute } from './create_rules_route'; import { getFindResult, @@ -18,58 +20,53 @@ import { getNonEmptyIndex, getEmptyIndex, } from '../__mocks__/request_responses'; -import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { createMockServer } from '../__mocks__/_mock_server'; +import { createMockConfig } from '../__mocks__/_mock_config'; +import { createMockClients } from '../__mocks__/_mock_clients'; describe('create_rules', () => { - let { - services, - inject, - alertsClient, - actionsClient, - callClusterMock, - savedObjectsClient, - } = createMockServer(); + let { route, inject } = createMockServer(); + let mockConfig = createMockConfig(); + let { getClients, clients } = createMockClients(); beforeEach(() => { jest.resetAllMocks(); - ({ - services, - inject, - alertsClient, - actionsClient, - callClusterMock, - savedObjectsClient, - } = createMockServer()); - callClusterMock.mockImplementation(getNonEmptyIndex); - createRulesRoute(services); + + ({ route, inject } = createMockServer()); + mockConfig = createMockConfig(); + ({ getClients, clients } = createMockClients()); + + clients.clusterClient.callAsCurrentUser.mockResolvedValue(getNonEmptyIndex()); + createRulesRoute(route, mockConfig, getClients); }); describe('status codes with actionClient and alertClient', () => { test('returns 200 when creating a single rule with a valid actionClient and alertClient', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.create.mockResolvedValue(createActionResult()); - alertsClient.create.mockResolvedValue(getResult()); - savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.create.mockResolvedValue(createActionResult()); + clients.alertsClient.create.mockResolvedValue(getResult()); + clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); const { statusCode } = await inject(getCreateRequest()); expect(statusCode).toBe(200); }); test('returns 404 if alertClient is not available on the route', async () => { - const { services: _services, inject: _inject } = createMockServer(false); - createRulesRoute(_services); - const { statusCode } = await _inject(getCreateRequest()); + getClients.mockResolvedValue(omit('alertsClient', clients)); + const newServer = createMockServer(); + createRulesRoute(newServer.route, mockConfig, getClients); + const { statusCode } = await newServer.inject(getCreateRequest()); expect(statusCode).toBe(404); }); }); describe('validation', () => { test('it returns a 400 if the index does not exist', async () => { - callClusterMock.mockImplementation(getEmptyIndex); - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.create.mockResolvedValue(createActionResult()); - alertsClient.create.mockResolvedValue(getResult()); + clients.clusterClient.callAsCurrentUser.mockResolvedValue(getEmptyIndex()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.create.mockResolvedValue(createActionResult()); + clients.alertsClient.create.mockResolvedValue(getResult()); const { payload } = await inject(getCreateRequest()); expect(JSON.parse(payload)).toEqual({ error: 'Bad Request', @@ -79,11 +76,11 @@ describe('create_rules', () => { }); test('returns 200 if rule_id is not given as the id is auto generated from the alert framework', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.create.mockResolvedValue(createActionResult()); - alertsClient.create.mockResolvedValue(getResult()); - savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.create.mockResolvedValue(createActionResult()); + clients.alertsClient.create.mockResolvedValue(getResult()); + clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); // missing rule_id should return 200 as it will be auto generated if not given const { rule_id, ...noRuleId } = typicalPayload(); const request: ServerInjectOptions = { @@ -96,11 +93,11 @@ describe('create_rules', () => { }); test('returns 200 if type is query', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.create.mockResolvedValue(createActionResult()); - alertsClient.create.mockResolvedValue(getResult()); - savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); + clients.actionsClient.create.mockResolvedValue(createActionResult()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.alertsClient.create.mockResolvedValue(getResult()); + clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); const { type, ...noType } = typicalPayload(); const request: ServerInjectOptions = { method: 'POST', @@ -115,11 +112,11 @@ describe('create_rules', () => { }); test('returns 400 if type is not filter or kql', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.create.mockResolvedValue(createActionResult()); - alertsClient.create.mockResolvedValue(getResult()); - savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); + clients.actionsClient.create.mockResolvedValue(createActionResult()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.alertsClient.create.mockResolvedValue(getResult()); + clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); const { type, ...noType } = typicalPayload(); const request: ServerInjectOptions = { method: 'POST', From 36398bcc93f2a744a91f91a90da06e7c8cd51a38 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Fri, 7 Feb 2020 12:31:30 -0600 Subject: [PATCH 24/39] Simplify our routing mocks * Adds mock for our new clients service * Greatly simplifies both server and mock configs * Renames factory method of client service --- .../routes/__mocks__/_mock_config.ts | 39 ------------------- ...ock_clients.ts => clients_service_mock.ts} | 30 +++++++++----- .../__mocks__/{_mock_server.ts => index.ts} | 5 +++ x-pack/legacy/plugins/siem/server/plugin.ts | 2 +- .../plugins/siem/server/services/clients.ts | 2 +- 5 files changed, 27 insertions(+), 51 deletions(-) delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_config.ts rename x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/{_mock_clients.ts => clients_service_mock.ts} (51%) rename x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/{_mock_server.ts => index.ts} (83%) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_config.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_config.ts deleted file mode 100644 index b21f7114964ee..0000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_config.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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 { Legacy } from 'kibana'; -import { APP_ID, SIGNALS_INDEX_KEY } from '../../../../../common/constants'; - -const defaultConfig = { - 'kibana.index': '.kibana', - [`xpack.${APP_ID}.${SIGNALS_INDEX_KEY}`]: '.siem-signals', -}; - -const isKibanaConfig = (config: unknown): config is Legacy.KibanaConfig => - Object.getOwnPropertyDescriptor(config, 'get') != null && - Object.getOwnPropertyDescriptor(config, 'has') != null; - -const assertNever = (): never => { - throw new Error('Unexpected object'); -}; - -export const createMockConfig = ( - config: Record = defaultConfig -): (() => Legacy.KibanaConfig) => () => { - const returnConfig = { - get(key: string) { - return config[key]; - }, - has(key: string) { - return config[key] != null; - }, - }; - if (isKibanaConfig(returnConfig)) { - return returnConfig; - } else { - return assertNever(); - } -}; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_clients.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/clients_service_mock.ts similarity index 51% rename from x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_clients.ts rename to x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/clients_service_mock.ts index d3a51c7e9c279..1bb4faa579845 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_clients.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/clients_service_mock.ts @@ -13,17 +13,27 @@ import { ActionsClient } from '../../../../../../../../plugins/actions/server'; import { actionsClientMock } from '../../../../../../../../plugins/actions/server/mocks'; import { GetScopedClients } from '../../../../services'; -export const createMockClients = () => { - const mockClients = { - actionsClient: actionsClientMock.create() as jest.Mocked, - alertsClient: alertsClientMock.create(), - clusterClient: elasticsearchServiceMock.createScopedClusterClient(), - savedObjectsClient: savedObjectsClientMock.create(), - spacesClient: { getSpaceId: jest.fn() }, - }; +const createClients = () => ({ + actionsClient: actionsClientMock.create() as jest.Mocked, + alertsClient: alertsClientMock.create(), + clusterClient: elasticsearchServiceMock.createScopedClusterClient(), + savedObjectsClient: savedObjectsClientMock.create(), + spacesClient: { getSpaceId: jest.fn() }, +}); + +const createGetScoped = () => + jest.fn(() => Promise.resolve(createClients()) as ReturnType); +export const createClientsServiceMock = () => { return { - getClients: jest.fn(() => Promise.resolve(mockClients) as ReturnType), - clients: mockClients, + setup: jest.fn(), + start: jest.fn(), + createGetScoped, }; }; + +export const clientsServiceMock = { + create: createClientsServiceMock, + createGetScoped, + createClients, +}; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/index.ts similarity index 83% rename from x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts rename to x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/index.ts index 67ebb7532c752..92e461f9cfe19 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/_mock_server.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/index.ts @@ -14,3 +14,8 @@ export const createMockServer = () => { inject: server.inject.bind(server), }; }; + +export const createMockConfig = () => () => ({ + get: jest.fn(), + has: jest.fn(), +}); diff --git a/x-pack/legacy/plugins/siem/server/plugin.ts b/x-pack/legacy/plugins/siem/server/plugin.ts index 1edab9d103ca0..0fe208b8f7d9b 100644 --- a/x-pack/legacy/plugins/siem/server/plugin.ts +++ b/x-pack/legacy/plugins/siem/server/plugin.ts @@ -149,6 +149,6 @@ export class Plugin { public start(core: CoreStart, plugins: StartPlugins) { this.clients.start(core.savedObjects, plugins.actions); - this.legacyInitRoutes!(this.clients.getScopedFactory()); + this.legacyInitRoutes!(this.clients.createGetScoped()); } } diff --git a/x-pack/legacy/plugins/siem/server/services/clients.ts b/x-pack/legacy/plugins/siem/server/services/clients.ts index 99f052f297360..d76f8e4b68021 100644 --- a/x-pack/legacy/plugins/siem/server/services/clients.ts +++ b/x-pack/legacy/plugins/siem/server/services/clients.ts @@ -45,7 +45,7 @@ export class ClientsService { this.actions = actions; } - public getScopedFactory(): GetScopedClients { + public createGetScoped(): GetScopedClients { if (!this.clusterClient || !this.savedObjects) { throw new Error('Services not initialized'); } From 1e6f106d77277c552819659a52c9130c98c51cd5 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Fri, 7 Feb 2020 14:43:10 -0600 Subject: [PATCH 25/39] Loosen graphQL endpoint validations These work fine in production, but it's graphQL so we don't really need the additional validation of these endpoints, and we weren't leveraging these types anywhere in Typescript land. Additionally, these restrictive validations prevent the initial introspection calls done by graphiQL to get schema information, and without schemae graphiql wasn't very helpful. This is a dev-only problem, but that's the audience of graphiql. --- .../siem/server/lib/framework/kibana_framework_adapter.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts b/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts index 32a74d25c64cd..f5a77be87afd3 100644 --- a/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts +++ b/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts @@ -64,13 +64,7 @@ export class KibanaBackendFrameworkAdapter implements FrameworkAdapter { this.router.post( { path: routePath, - validate: { - body: configSchema.object({ - operationName: configSchema.string(), - query: configSchema.string(), - variables: configSchema.object({}, { allowUnknowns: true }), - }), - }, + validate: { body: configSchema.object({}, { allowUnknowns: true }) }, options: { tags: ['access:siem'], }, From bcff5e1fd1467b99cadbec2a65dcb6380d232ee2 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Fri, 7 Feb 2020 14:46:43 -0600 Subject: [PATCH 26/39] Remove unused graphql endpoint This was only registered in dev mode; I thought that it was needed by graphiql. However, after digging further I realized that graphiQL also only makes POST calls to our real graphQL endpoint, so this route is unnecessary. --- .../lib/framework/kibana_framework_adapter.ts | 33 ------------------- 1 file changed, 33 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts b/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts index f5a77be87afd3..1dcccc4161251 100644 --- a/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts +++ b/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts @@ -94,39 +94,6 @@ export class KibanaBackendFrameworkAdapter implements FrameworkAdapter { ); if (!this.isProductionMode) { - this.router.get( - { - path: routePath, - validate: { query: configSchema.object({}, { allowUnknowns: true }) }, - options: { - tags: ['access:siem'], - }, - }, - async (context, request, response) => { - try { - const user = await this.getCurrentUserInfo(request); - const { query } = request; - const gqlResponse = await runHttpQuery([request], { - method: 'GET', - options: (req: KibanaRequest) => ({ - context: { req: wrapRequest(req, context, user) }, - schema, - }), - query, - }); - - return response.ok({ - body: gqlResponse, - headers: { - 'content-type': 'application/json', - }, - }); - } catch (error) { - return this.handleError(error, response); - } - } - ); - this.router.get( { path: `${routePath}/graphiql`, From f84a3d7eb3646de3ab3fee67aa6346ed1344a824 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Fri, 7 Feb 2020 14:53:36 -0600 Subject: [PATCH 27/39] Reduce our dependence on PluginInitializerContext After a little more introspection I realized our FrameworkAdapter doesn't need the kibana version. It was only used in order to make a dev request via (graphiql), but even that can be performed with a simpler xsrf header. This meant that we really only wanted to know whether we're in production or not, so instead we pass that simple boolean to the constructor. --- .../legacy/plugins/siem/server/lib/compose/kibana.ts | 6 +++--- .../server/lib/framework/kibana_framework_adapter.ts | 10 +++------- x-pack/legacy/plugins/siem/server/plugin.ts | 4 ++-- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/compose/kibana.ts b/x-pack/legacy/plugins/siem/server/lib/compose/kibana.ts index 6d1d31b59051d..0ab6f1a8df779 100644 --- a/x-pack/legacy/plugins/siem/server/lib/compose/kibana.ts +++ b/x-pack/legacy/plugins/siem/server/lib/compose/kibana.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { CoreSetup, PluginInitializerContext, SetupPlugins } from '../../plugin'; +import { CoreSetup, SetupPlugins } from '../../plugin'; import { Anomalies } from '../anomalies'; import { ElasticsearchAnomaliesAdapter } from '../anomalies/elasticsearch_adapter'; @@ -37,9 +37,9 @@ import { Alerts, ElasticsearchAlertsAdapter } from '../alerts'; export function compose( core: CoreSetup, plugins: SetupPlugins, - env: PluginInitializerContext['env'] + isProductionMode: boolean ): AppBackendLibs { - const framework = new KibanaBackendFrameworkAdapter(core, plugins, env); + const framework = new KibanaBackendFrameworkAdapter(core, plugins, isProductionMode); const sources = new Sources(new ConfigurationSourcesAdapter()); const sourceStatus = new SourceStatus(new ElasticsearchSourceStatusAdapter(framework)); diff --git a/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts b/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts index 1dcccc4161251..4cce0b0999257 100644 --- a/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts +++ b/x-pack/legacy/plugins/siem/server/lib/framework/kibana_framework_adapter.ts @@ -16,7 +16,7 @@ import { } from '../../../../../../../src/core/server'; import { IndexPatternsFetcher } from '../../../../../../../src/plugins/data/server'; import { AuthenticatedUser } from '../../../../../../plugins/security/common/model'; -import { CoreSetup, SetupPlugins, PluginInitializerContext } from '../../plugin'; +import { CoreSetup, SetupPlugins } from '../../plugin'; import { FrameworkAdapter, @@ -26,14 +26,10 @@ import { } from './types'; export class KibanaBackendFrameworkAdapter implements FrameworkAdapter { - public version: string; - private isProductionMode: boolean; private router: IRouter; private security: SetupPlugins['security']; - constructor(core: CoreSetup, plugins: SetupPlugins, env: PluginInitializerContext['env']) { - this.version = env.packageInfo.version; - this.isProductionMode = env.mode.prod; + constructor(core: CoreSetup, plugins: SetupPlugins, private isProductionMode: boolean) { this.router = core.http.createRouter(); this.security = plugins.security; } @@ -107,7 +103,7 @@ export class KibanaBackendFrameworkAdapter implements FrameworkAdapter { request.query, { endpointURL: routePath, - passHeader: `'kbn-version': '${this.version}'`, + passHeader: "'kbn-xsrf': 'graphiql'", }, request ); diff --git a/x-pack/legacy/plugins/siem/server/plugin.ts b/x-pack/legacy/plugins/siem/server/plugin.ts index 0fe208b8f7d9b..5c27db2d31af0 100644 --- a/x-pack/legacy/plugins/siem/server/plugin.ts +++ b/x-pack/legacy/plugins/siem/server/plugin.ts @@ -31,7 +31,7 @@ import { } from './saved_objects'; import { ClientsService } from './services'; -export { CoreSetup, CoreStart, Logger, PluginInitializerContext }; +export { CoreSetup, CoreStart }; export interface SetupPlugins { encryptedSavedObjects: EncryptedSavedObjectsSetup; @@ -142,7 +142,7 @@ export class Plugin { } } - const libs = compose(core, plugins, this.context.env); + const libs = compose(core, plugins, this.context.env.mode.prod); initServer(libs); } From 930b89a29572526f8f5b93199a02e230aa70313c Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Fri, 7 Feb 2020 16:14:06 -0600 Subject: [PATCH 28/39] Fix FrameworkAdapter type We no longer need this property. --- .../siem/server/lib/alerts/elasticseatch_adapter.test.ts | 1 - .../siem/server/lib/events/elasticsearch_adapter.test.ts | 1 - x-pack/legacy/plugins/siem/server/lib/framework/types.ts | 1 - .../siem/server/lib/hosts/elasticsearch_adapter.test.ts | 3 --- .../siem/server/lib/kpi_hosts/elasticsearch_adapter.test.ts | 2 -- .../siem/server/lib/kpi_network/elastic_adapter.test.ts | 1 - .../plugins/siem/server/lib/network/elastic_adapter.test.ts | 5 ----- .../plugins/siem/server/lib/overview/elastic_adapter.test.ts | 4 ---- .../siem/server/lib/tls/elasticsearch_adapter.test.ts | 1 - 9 files changed, 19 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/alerts/elasticseatch_adapter.test.ts b/x-pack/legacy/plugins/siem/server/lib/alerts/elasticseatch_adapter.test.ts index 3aefb6c0e1e5f..210c97892e25c 100644 --- a/x-pack/legacy/plugins/siem/server/lib/alerts/elasticseatch_adapter.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/alerts/elasticseatch_adapter.test.ts @@ -29,7 +29,6 @@ describe('alerts elasticsearch_adapter', () => { return mockAlertsHistogramDataResponse; }); const mockFramework: FrameworkAdapter = { - version: 'mock', callWithRequest: mockCallWithRequest, registerGraphQLEndpoint: jest.fn(), getIndexPatternsService: jest.fn(), diff --git a/x-pack/legacy/plugins/siem/server/lib/events/elasticsearch_adapter.test.ts b/x-pack/legacy/plugins/siem/server/lib/events/elasticsearch_adapter.test.ts index b1f0c3c4a3a18..42dc13d84fd98 100644 --- a/x-pack/legacy/plugins/siem/server/lib/events/elasticsearch_adapter.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/events/elasticsearch_adapter.test.ts @@ -519,7 +519,6 @@ describe('events elasticsearch_adapter', () => { return mockResponseMap; }); const mockFramework: FrameworkAdapter = { - version: 'mock', callWithRequest: mockCallWithRequest, registerGraphQLEndpoint: jest.fn(), getIndexPatternsService: jest.fn(), diff --git a/x-pack/legacy/plugins/siem/server/lib/framework/types.ts b/x-pack/legacy/plugins/siem/server/lib/framework/types.ts index 5798e8e40c803..9fc78e6fb84fe 100644 --- a/x-pack/legacy/plugins/siem/server/lib/framework/types.ts +++ b/x-pack/legacy/plugins/siem/server/lib/framework/types.ts @@ -24,7 +24,6 @@ export * from '../../utils/typed_resolvers'; export const internalFrameworkRequest = Symbol('internalFrameworkRequest'); export interface FrameworkAdapter { - version: string; registerGraphQLEndpoint(routePath: string, schema: GraphQLSchema): void; callWithRequest( req: FrameworkRequest, diff --git a/x-pack/legacy/plugins/siem/server/lib/hosts/elasticsearch_adapter.test.ts b/x-pack/legacy/plugins/siem/server/lib/hosts/elasticsearch_adapter.test.ts index 0d698f1e19213..20510e1089f96 100644 --- a/x-pack/legacy/plugins/siem/server/lib/hosts/elasticsearch_adapter.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/hosts/elasticsearch_adapter.test.ts @@ -159,7 +159,6 @@ describe('hosts elasticsearch_adapter', () => { const mockCallWithRequest = jest.fn(); mockCallWithRequest.mockResolvedValue(mockGetHostsResponse); const mockFramework: FrameworkAdapter = { - version: 'mock', callWithRequest: mockCallWithRequest, registerGraphQLEndpoint: jest.fn(), getIndexPatternsService: jest.fn(), @@ -180,7 +179,6 @@ describe('hosts elasticsearch_adapter', () => { const mockCallWithRequest = jest.fn(); mockCallWithRequest.mockResolvedValue(mockGetHostOverviewResponse); const mockFramework: FrameworkAdapter = { - version: 'mock', callWithRequest: mockCallWithRequest, registerGraphQLEndpoint: jest.fn(), getIndexPatternsService: jest.fn(), @@ -201,7 +199,6 @@ describe('hosts elasticsearch_adapter', () => { const mockCallWithRequest = jest.fn(); mockCallWithRequest.mockResolvedValue(mockGetHostLastFirstSeenResponse); const mockFramework: FrameworkAdapter = { - version: 'mock', callWithRequest: mockCallWithRequest, registerGraphQLEndpoint: jest.fn(), getIndexPatternsService: jest.fn(), diff --git a/x-pack/legacy/plugins/siem/server/lib/kpi_hosts/elasticsearch_adapter.test.ts b/x-pack/legacy/plugins/siem/server/lib/kpi_hosts/elasticsearch_adapter.test.ts index 4a179073852b0..059d15220b619 100644 --- a/x-pack/legacy/plugins/siem/server/lib/kpi_hosts/elasticsearch_adapter.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/kpi_hosts/elasticsearch_adapter.test.ts @@ -53,7 +53,6 @@ describe('getKpiHosts', () => { let data: KpiHostsData; const mockCallWithRequest = jest.fn(); const mockFramework: FrameworkAdapter = { - version: 'mock', callWithRequest: mockCallWithRequest, registerGraphQLEndpoint: jest.fn(), getIndexPatternsService: jest.fn(), @@ -167,7 +166,6 @@ describe('getKpiHostDetails', () => { let data: KpiHostDetailsData; const mockCallWithRequest = jest.fn(); const mockFramework: FrameworkAdapter = { - version: 'mock', callWithRequest: mockCallWithRequest, registerGraphQLEndpoint: jest.fn(), getIndexPatternsService: jest.fn(), diff --git a/x-pack/legacy/plugins/siem/server/lib/kpi_network/elastic_adapter.test.ts b/x-pack/legacy/plugins/siem/server/lib/kpi_network/elastic_adapter.test.ts index 11d007f591fac..58ee7c9aa1cf8 100644 --- a/x-pack/legacy/plugins/siem/server/lib/kpi_network/elastic_adapter.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/kpi_network/elastic_adapter.test.ts @@ -48,7 +48,6 @@ describe('Network Kpi elasticsearch_adapter', () => { const mockCallWithRequest = jest.fn(); const mockFramework: FrameworkAdapter = { - version: 'mock', callWithRequest: mockCallWithRequest, registerGraphQLEndpoint: jest.fn(), getIndexPatternsService: jest.fn(), diff --git a/x-pack/legacy/plugins/siem/server/lib/network/elastic_adapter.test.ts b/x-pack/legacy/plugins/siem/server/lib/network/elastic_adapter.test.ts index eeea4bec2fb25..eab461ee07ca7 100644 --- a/x-pack/legacy/plugins/siem/server/lib/network/elastic_adapter.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/network/elastic_adapter.test.ts @@ -35,7 +35,6 @@ describe('Network Top N flow elasticsearch_adapter with FlowTarget=source', () = const mockCallWithRequest = jest.fn(); mockCallWithRequest.mockResolvedValue(mockResponse); const mockFramework: FrameworkAdapter = { - version: 'mock', callWithRequest: mockCallWithRequest, getIndexPatternsService: jest.fn(), registerGraphQLEndpoint: jest.fn(), @@ -61,7 +60,6 @@ describe('Network Top N flow elasticsearch_adapter with FlowTarget=source', () = const mockCallWithRequest = jest.fn(); mockCallWithRequest.mockResolvedValue(mockNoDataResponse); const mockFramework: FrameworkAdapter = { - version: 'mock', callWithRequest: mockCallWithRequest, registerGraphQLEndpoint: jest.fn(), getIndexPatternsService: jest.fn(), @@ -101,7 +99,6 @@ describe('Network Top N flow elasticsearch_adapter with FlowTarget=source', () = ].buckets[0].location.top_geo.hits.hits = []; mockCallWithRequest.mockResolvedValue(mockNoGeoDataResponse); const mockFramework: FrameworkAdapter = { - version: 'mock', callWithRequest: mockCallWithRequest, getIndexPatternsService: jest.fn(), registerGraphQLEndpoint: jest.fn(), @@ -132,7 +129,6 @@ describe('Network Top N flow elasticsearch_adapter with FlowTarget=source', () = const mockCallWithRequest = jest.fn(); mockCallWithRequest.mockResolvedValue(mockNoPaginationResponse); const mockFramework: FrameworkAdapter = { - version: 'mock', callWithRequest: mockCallWithRequest, registerGraphQLEndpoint: jest.fn(), getIndexPatternsService: jest.fn(), @@ -155,7 +151,6 @@ describe('Network Top N flow elasticsearch_adapter with FlowTarget=source', () = const mockCallWithRequest = jest.fn(); mockCallWithRequest.mockResolvedValue(mockResponseIp); const mockFramework: FrameworkAdapter = { - version: 'mock', callWithRequest: mockCallWithRequest, getIndexPatternsService: jest.fn(), registerGraphQLEndpoint: jest.fn(), diff --git a/x-pack/legacy/plugins/siem/server/lib/overview/elastic_adapter.test.ts b/x-pack/legacy/plugins/siem/server/lib/overview/elastic_adapter.test.ts index 29035f4539be8..f421704dffe12 100644 --- a/x-pack/legacy/plugins/siem/server/lib/overview/elastic_adapter.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/overview/elastic_adapter.test.ts @@ -36,7 +36,6 @@ describe('Siem Overview elasticsearch_adapter', () => { const mockCallWithRequest = jest.fn(); mockCallWithRequest.mockResolvedValue(mockResponseNetwork); const mockFramework: FrameworkAdapter = { - version: 'mock', callWithRequest: mockCallWithRequest, registerGraphQLEndpoint: jest.fn(), getIndexPatternsService: jest.fn(), @@ -70,7 +69,6 @@ describe('Siem Overview elasticsearch_adapter', () => { const mockCallWithRequest = jest.fn(); mockCallWithRequest.mockResolvedValue(mockNoDataResponse); const mockFramework: FrameworkAdapter = { - version: 'mock', callWithRequest: mockCallWithRequest, registerGraphQLEndpoint: jest.fn(), getIndexPatternsService: jest.fn(), @@ -108,7 +106,6 @@ describe('Siem Overview elasticsearch_adapter', () => { const mockCallWithRequest = jest.fn(); mockCallWithRequest.mockResolvedValue(mockResponseHost); const mockFramework: FrameworkAdapter = { - version: 'mock', callWithRequest: mockCallWithRequest, registerGraphQLEndpoint: jest.fn(), getIndexPatternsService: jest.fn(), @@ -148,7 +145,6 @@ describe('Siem Overview elasticsearch_adapter', () => { const mockCallWithRequest = jest.fn(); mockCallWithRequest.mockResolvedValue(mockNoDataResponse); const mockFramework: FrameworkAdapter = { - version: 'mock', callWithRequest: mockCallWithRequest, registerGraphQLEndpoint: jest.fn(), getIndexPatternsService: jest.fn(), diff --git a/x-pack/legacy/plugins/siem/server/lib/tls/elasticsearch_adapter.test.ts b/x-pack/legacy/plugins/siem/server/lib/tls/elasticsearch_adapter.test.ts index 32a5c72215dda..428685cbaddb8 100644 --- a/x-pack/legacy/plugins/siem/server/lib/tls/elasticsearch_adapter.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/tls/elasticsearch_adapter.test.ts @@ -22,7 +22,6 @@ describe('elasticsearch_adapter', () => { let data: TlsData; const mockCallWithRequest = jest.fn(); const mockFramework: FrameworkAdapter = { - version: 'mock', callWithRequest: mockCallWithRequest, registerGraphQLEndpoint: jest.fn(), getIndexPatternsService: jest.fn(), From c3c67f1c2b4e1fa34c390c6a5f636814eed33d0e Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Fri, 7 Feb 2020 18:11:11 -0600 Subject: [PATCH 29/39] Update detections route tests Uses the new routes interfaces, and our corresponding new mocks. --- .../routes/__mocks__/clients_service_mock.ts | 2 +- .../routes/__mocks__/index.ts | 2 + .../privileges/read_privileges_route.test.ts | 27 +++--- .../rules/add_prepackaged_rules_route.test.ts | 75 ++++++++------ .../rules/create_rules_bulk_route.test.ts | 77 ++++++++------- .../routes/rules/create_rules_route.test.ts | 38 ++++---- .../rules/delete_rules_bulk_route.test.ts | 86 ++++++++-------- .../routes/rules/delete_rules_route.test.ts | 73 +++++++------- .../routes/rules/find_rules_route.test.ts | 49 ++++++---- .../get_prepackaged_rule_status_route.test.ts | 62 +++++++----- .../routes/rules/read_rules_route.test.ts | 45 +++++---- .../routes/rules/update_rules_bulk.test.ts | 97 ++++++++++--------- .../routes/rules/update_rules_route.test.ts | 92 ++++++++++-------- .../routes/signals/open_close_signals.test.ts | 40 +++++--- .../signals/query_signals_route.test.ts | 76 ++++++++------- 15 files changed, 469 insertions(+), 372 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/clients_service_mock.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/clients_service_mock.ts index 1bb4faa579845..f89e938b8a636 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/clients_service_mock.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/clients_service_mock.ts @@ -24,7 +24,7 @@ const createClients = () => ({ const createGetScoped = () => jest.fn(() => Promise.resolve(createClients()) as ReturnType); -export const createClientsServiceMock = () => { +const createClientsServiceMock = () => { return { setup: jest.fn(), start: jest.fn(), diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/index.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/index.ts index 92e461f9cfe19..250b006814294 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/index.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/__mocks__/index.ts @@ -6,6 +6,8 @@ import Hapi from 'hapi'; +export { clientsServiceMock } from './clients_service_mock'; + export const createMockServer = () => { const server = new Hapi.Server({ port: 0 }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.test.ts index 4867dcd2037d8..308ee95a77e20 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.test.ts @@ -4,23 +4,28 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createMockServer } from '../__mocks__/_mock_server'; -import { getPrivilegeRequest, getMockPrivileges } from '../__mocks__/request_responses'; import { readPrivilegesRoute } from './read_privileges_route'; -import * as myUtils from '../utils'; +import { createMockServer, createMockConfig, clientsServiceMock } from '../__mocks__'; +import { getPrivilegeRequest, getMockPrivileges } from '../__mocks__/request_responses'; describe('read_privileges', () => { - let { inject, services, callClusterMock } = createMockServer(); + let { route, inject } = createMockServer(); + let config = createMockConfig(); + let getClients = clientsServiceMock.createGetScoped(); + let clients = clientsServiceMock.createClients(); beforeEach(() => { - jest.spyOn(myUtils, 'getIndex').mockReturnValue('fakeindex'); - ({ inject, services, callClusterMock } = createMockServer()); - callClusterMock.mockImplementation(getMockPrivileges); - readPrivilegesRoute(services); - }); - - afterEach(() => { jest.resetAllMocks(); + ({ route, inject } = createMockServer()); + + config = createMockConfig(); + getClients = clientsServiceMock.createGetScoped(); + clients = clientsServiceMock.createClients(); + + getClients.mockResolvedValue(clients); + clients.clusterClient.callAsCurrentUser.mockResolvedValue(getMockPrivileges()); + + readPrivilegesRoute(route, config, false, getClients); }); describe('normal status codes', () => { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts index ef97a92f355b9..a85d0e0206cce 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.test.ts @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createMockServer } from '../__mocks__/_mock_server'; +import { omit } from 'lodash/fp'; + import { createRulesRoute } from './create_rules_route'; import { getFindResult, @@ -15,6 +16,7 @@ import { getEmptyIndex, getNonEmptyIndex, } from '../__mocks__/request_responses'; +import { createMockServer, createMockConfig, clientsServiceMock } from '../__mocks__'; jest.mock('../../rules/get_prepackaged_rules', () => { return { @@ -45,46 +47,57 @@ import { addPrepackedRulesRoute } from './add_prepackaged_rules_route'; import { PrepackagedRules } from '../../types'; describe('add_prepackaged_rules_route', () => { - let { services, inject, alertsClient, actionsClient, callClusterMock } = createMockServer(); + let server = createMockServer(); + let config = createMockConfig(); + let getClients = clientsServiceMock.createGetScoped(); + let clients = clientsServiceMock.createClients(); beforeEach(() => { jest.resetAllMocks(); - ({ services, inject, alertsClient, actionsClient, callClusterMock } = createMockServer()); - callClusterMock.mockImplementation(getNonEmptyIndex); - addPrepackedRulesRoute(services); + server = createMockServer(); + config = createMockConfig(); + getClients = clientsServiceMock.createGetScoped(); + clients = clientsServiceMock.createClients(); + + getClients.mockResolvedValue(clients); + clients.clusterClient.callAsCurrentUser.mockResolvedValue(getNonEmptyIndex()); + + addPrepackedRulesRoute(server.route, config, getClients); }); describe('status codes with actionClient and alertClient', () => { test('returns 200 when creating a with a valid actionClient and alertClient', async () => { - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.create.mockResolvedValue(createActionResult()); - alertsClient.create.mockResolvedValue(getResult()); - const { statusCode } = await inject(addPrepackagedRulesRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.create.mockResolvedValue(createActionResult()); + clients.alertsClient.create.mockResolvedValue(getResult()); + const { statusCode } = await server.inject(addPrepackagedRulesRequest()); expect(statusCode).toBe(200); }); test('returns 404 if alertClient is not available on the route', async () => { - const { services: _services, inject: _inject } = createMockServer(false); - createRulesRoute(_services); - const { statusCode } = await _inject(addPrepackagedRulesRequest()); + getClients.mockResolvedValue(omit('alertsClient', clients)); + const { inject, route } = createMockServer(); + createRulesRoute(route, config, getClients); + const { statusCode } = await inject(addPrepackagedRulesRequest()); expect(statusCode).toBe(404); }); }); describe('validation', () => { test('it returns a 400 if the index does not exist', async () => { - callClusterMock.mockImplementation(getEmptyIndex); - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.create.mockResolvedValue(createActionResult()); - alertsClient.create.mockResolvedValue(getResult()); - const { payload } = await inject(addPrepackagedRulesRequest()); + clients.clusterClient.callAsCurrentUser.mockResolvedValue(getEmptyIndex()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.create.mockResolvedValue(createActionResult()); + clients.alertsClient.create.mockResolvedValue(getResult()); + const { payload } = await server.inject(addPrepackagedRulesRequest()); expect(JSON.parse(payload)).toEqual({ error: 'Bad Request', - message: - 'Pre-packaged rules cannot be installed until the space index is created: .siem-signals-default', + message: expect.stringContaining( + 'Pre-packaged rules cannot be installed until the space index is created' + ), statusCode: 400, }); }); @@ -92,11 +105,11 @@ describe('add_prepackaged_rules_route', () => { describe('payload', () => { test('1 rule is installed and 0 are updated when find results are empty', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.create.mockResolvedValue(createActionResult()); - alertsClient.create.mockResolvedValue(getResult()); - const { payload } = await inject(addPrepackagedRulesRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.create.mockResolvedValue(createActionResult()); + clients.alertsClient.create.mockResolvedValue(getResult()); + const { payload } = await server.inject(addPrepackagedRulesRequest()); expect(JSON.parse(payload)).toEqual({ rules_installed: 1, rules_updated: 0, @@ -104,11 +117,11 @@ describe('add_prepackaged_rules_route', () => { }); test('1 rule is updated and 0 are installed when we return a single find and the versions are different', async () => { - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.create.mockResolvedValue(createActionResult()); - alertsClient.create.mockResolvedValue(getResult()); - const { payload } = await inject(addPrepackagedRulesRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.create.mockResolvedValue(createActionResult()); + clients.alertsClient.create.mockResolvedValue(getResult()); + const { payload } = await server.inject(addPrepackagedRulesRequest()); expect(JSON.parse(payload)).toEqual({ rules_installed: 0, rules_updated: 1, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts index 244c25b8004af..c6222b2127cd2 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts @@ -4,8 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createMockServer } from '../__mocks__/_mock_server'; -import { createRulesRoute } from './create_rules_route'; +import { createMockServer, createMockConfig, clientsServiceMock } from '../__mocks__'; import { ServerInjectOptions } from 'hapi'; import { getFindResult, @@ -17,42 +16,52 @@ import { } from '../__mocks__/request_responses'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { createRulesBulkRoute } from './create_rules_bulk_route'; +import { omit } from 'lodash/fp'; describe('create_rules_bulk', () => { - let { services, inject, alertsClient, actionsClient, callClusterMock } = createMockServer(); + let server = createMockServer(); + let config = createMockConfig(); + let getClients = clientsServiceMock.createGetScoped(); + let clients = clientsServiceMock.createClients(); beforeEach(() => { jest.resetAllMocks(); - ({ services, inject, alertsClient, actionsClient, callClusterMock } = createMockServer()); - createRulesBulkRoute(services); + server = createMockServer(); + config = createMockConfig(); + getClients = clientsServiceMock.createGetScoped(); + clients = clientsServiceMock.createClients(); + getClients.mockResolvedValue(clients); + + createRulesBulkRoute(server.route, config, getClients); }); describe('status codes with actionClient and alertClient', () => { test('returns 200 when creating a single rule with a valid actionClient and alertClient', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.create.mockResolvedValue(createActionResult()); - alertsClient.create.mockResolvedValue(getResult()); - const { statusCode } = await inject(getReadBulkRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.create.mockResolvedValue(createActionResult()); + clients.alertsClient.create.mockResolvedValue(getResult()); + const { statusCode } = await server.inject(getReadBulkRequest()); expect(statusCode).toBe(200); }); test('returns 404 if alertClient is not available on the route', async () => { - const { services: _services, inject: _inject } = createMockServer(false); - createRulesRoute(_services); - const { statusCode } = await _inject(getReadBulkRequest()); + getClients.mockResolvedValue(omit('alertsClient', clients)); + const { inject, route } = createMockServer(); + createRulesBulkRoute(route, config, getClients); + const { statusCode } = await inject(getReadBulkRequest()); expect(statusCode).toBe(404); }); }); describe('validation', () => { test('it gets a 409 if the index does not exist', async () => { - callClusterMock.mockImplementation(getEmptyIndex); - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.create.mockResolvedValue(createActionResult()); - alertsClient.create.mockResolvedValue(getResult()); - const { payload } = await inject(getReadBulkRequest()); + clients.clusterClient.callAsCurrentUser.mockResolvedValue(getEmptyIndex()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.create.mockResolvedValue(createActionResult()); + clients.alertsClient.create.mockResolvedValue(getResult()); + const { payload } = await server.inject(getReadBulkRequest()); expect(JSON.parse(payload)).toEqual([ { error: { @@ -66,10 +75,10 @@ describe('create_rules_bulk', () => { }); test('returns 200 if rule_id is not given as the id is auto generated from the alert framework', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.create.mockResolvedValue(createActionResult()); - alertsClient.create.mockResolvedValue(getResult()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.create.mockResolvedValue(createActionResult()); + clients.alertsClient.create.mockResolvedValue(getResult()); // missing rule_id should return 200 as it will be auto generated if not given const { rule_id, ...noRuleId } = typicalPayload(); const request: ServerInjectOptions = { @@ -77,15 +86,15 @@ describe('create_rules_bulk', () => { url: `${DETECTION_ENGINE_RULES_URL}/_bulk_create`, payload: [noRuleId], }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(200); }); test('returns 200 if type is query', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.create.mockResolvedValue(createActionResult()); - alertsClient.create.mockResolvedValue(getResult()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.create.mockResolvedValue(createActionResult()); + clients.alertsClient.create.mockResolvedValue(getResult()); const { type, ...noType } = typicalPayload(); const request: ServerInjectOptions = { method: 'POST', @@ -97,15 +106,15 @@ describe('create_rules_bulk', () => { }, ], }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(200); }); test('returns 400 if type is not filter or kql', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.create.mockResolvedValue(createActionResult()); - alertsClient.create.mockResolvedValue(getResult()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.create.mockResolvedValue(createActionResult()); + clients.alertsClient.create.mockResolvedValue(getResult()); const { type, ...noType } = typicalPayload(); const request: ServerInjectOptions = { method: 'POST', @@ -117,7 +126,7 @@ describe('create_rules_bulk', () => { }, ], }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(400); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts index 8a7b3e3b143b7..16c8d5b7cd624 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts @@ -20,24 +20,26 @@ import { getNonEmptyIndex, getEmptyIndex, } from '../__mocks__/request_responses'; -import { createMockServer } from '../__mocks__/_mock_server'; -import { createMockConfig } from '../__mocks__/_mock_config'; -import { createMockClients } from '../__mocks__/_mock_clients'; +import { createMockServer, createMockConfig, clientsServiceMock } from '../__mocks__'; describe('create_rules', () => { - let { route, inject } = createMockServer(); - let mockConfig = createMockConfig(); - let { getClients, clients } = createMockClients(); + let server = createMockServer(); + let config = createMockConfig(); + let getClients = clientsServiceMock.createGetScoped(); + let clients = clientsServiceMock.createClients(); beforeEach(() => { jest.resetAllMocks(); - ({ route, inject } = createMockServer()); - mockConfig = createMockConfig(); - ({ getClients, clients } = createMockClients()); + server = createMockServer(); + config = createMockConfig(); + getClients = clientsServiceMock.createGetScoped(); + clients = clientsServiceMock.createClients(); + getClients.mockResolvedValue(clients); clients.clusterClient.callAsCurrentUser.mockResolvedValue(getNonEmptyIndex()); - createRulesRoute(route, mockConfig, getClients); + + createRulesRoute(server.route, config, getClients); }); describe('status codes with actionClient and alertClient', () => { @@ -47,15 +49,15 @@ describe('create_rules', () => { clients.actionsClient.create.mockResolvedValue(createActionResult()); clients.alertsClient.create.mockResolvedValue(getResult()); clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); - const { statusCode } = await inject(getCreateRequest()); + const { statusCode } = await server.inject(getCreateRequest()); expect(statusCode).toBe(200); }); test('returns 404 if alertClient is not available on the route', async () => { getClients.mockResolvedValue(omit('alertsClient', clients)); - const newServer = createMockServer(); - createRulesRoute(newServer.route, mockConfig, getClients); - const { statusCode } = await newServer.inject(getCreateRequest()); + const { route, inject } = createMockServer(); + createRulesRoute(route, config, getClients); + const { statusCode } = await inject(getCreateRequest()); expect(statusCode).toBe(404); }); }); @@ -67,7 +69,7 @@ describe('create_rules', () => { clients.alertsClient.get.mockResolvedValue(getResult()); clients.actionsClient.create.mockResolvedValue(createActionResult()); clients.alertsClient.create.mockResolvedValue(getResult()); - const { payload } = await inject(getCreateRequest()); + const { payload } = await server.inject(getCreateRequest()); expect(JSON.parse(payload)).toEqual({ error: 'Bad Request', message: 'To create a rule, the index must exist first. Index .siem-signals does not exist', @@ -88,7 +90,7 @@ describe('create_rules', () => { url: DETECTION_ENGINE_RULES_URL, payload: noRuleId, }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(200); }); @@ -107,7 +109,7 @@ describe('create_rules', () => { type: 'query', }, }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(200); }); @@ -126,7 +128,7 @@ describe('create_rules', () => { type: 'something-made-up', }, }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(400); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts index b1e9800c015e3..855bf7f634c26 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createMockServer } from '../__mocks__/_mock_server'; +import { omit } from 'lodash/fp'; import { ServerInjectOptions } from 'hapi'; import { @@ -17,71 +17,76 @@ import { getDeleteAsPostBulkRequestById, getFindResultStatus, } from '../__mocks__/request_responses'; +import { createMockServer, clientsServiceMock } from '../__mocks__'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { deleteRulesBulkRoute } from './delete_rules_bulk_route'; import { BulkError } from '../utils'; describe('delete_rules', () => { - let { services, inject, alertsClient, savedObjectsClient } = createMockServer(); + let server = createMockServer(); + let getClients = clientsServiceMock.createGetScoped(); + let clients = clientsServiceMock.createClients(); beforeEach(() => { - ({ services, inject, alertsClient, savedObjectsClient } = createMockServer()); - deleteRulesBulkRoute(services); - }); - - afterEach(() => { jest.resetAllMocks(); + + server = createMockServer(); + getClients = clientsServiceMock.createGetScoped(); + clients = clientsServiceMock.createClients(); + + getClients.mockResolvedValue(clients); + deleteRulesBulkRoute(server.route, getClients); }); describe('status codes with actionClient and alertClient', () => { test('returns 200 when deleting a single rule with a valid actionClient and alertClient by alertId', async () => { - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - alertsClient.get.mockResolvedValue(getResult()); - alertsClient.delete.mockResolvedValue({}); - const { statusCode } = await inject(getDeleteBulkRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.alertsClient.delete.mockResolvedValue({}); + const { statusCode } = await server.inject(getDeleteBulkRequest()); expect(statusCode).toBe(200); }); test('returns 200 when deleting a single rule with a valid actionClient and alertClient by alertId using POST', async () => { - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - alertsClient.get.mockResolvedValue(getResult()); - alertsClient.delete.mockResolvedValue({}); - const { statusCode } = await inject(getDeleteAsPostBulkRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.alertsClient.delete.mockResolvedValue({}); + const { statusCode } = await server.inject(getDeleteAsPostBulkRequest()); expect(statusCode).toBe(200); }); test('returns 200 when deleting a single rule with a valid actionClient and alertClient by id', async () => { - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - alertsClient.get.mockResolvedValue(getResult()); - alertsClient.delete.mockResolvedValue({}); - const { statusCode } = await inject(getDeleteBulkRequestById()); + clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.alertsClient.delete.mockResolvedValue({}); + const { statusCode } = await server.inject(getDeleteBulkRequestById()); expect(statusCode).toBe(200); }); test('returns 200 when deleting a single rule with a valid actionClient and alertClient by id using POST', async () => { - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - alertsClient.get.mockResolvedValue(getResult()); - alertsClient.delete.mockResolvedValue({}); - const { statusCode } = await inject(getDeleteAsPostBulkRequestById()); + clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.alertsClient.delete.mockResolvedValue({}); + const { statusCode } = await server.inject(getDeleteAsPostBulkRequestById()); expect(statusCode).toBe(200); }); test('returns 200 because the error is in the payload when deleting a single rule that does not exist with a valid actionClient and alertClient', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - alertsClient.delete.mockResolvedValue({}); - const { statusCode } = await inject(getDeleteBulkRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.alertsClient.delete.mockResolvedValue({}); + const { statusCode } = await server.inject(getDeleteBulkRequest()); expect(statusCode).toBe(200); }); test('returns 404 in the payload when deleting a single rule that does not exist with a valid actionClient and alertClient', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - alertsClient.delete.mockResolvedValue({}); - savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); - savedObjectsClient.delete.mockResolvedValue({}); - const { payload } = await inject(getDeleteBulkRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.alertsClient.delete.mockResolvedValue({}); + clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); + clients.savedObjectsClient.delete.mockResolvedValue({}); + const { payload } = await server.inject(getDeleteBulkRequest()); const parsed: BulkError[] = JSON.parse(payload); const expected: BulkError[] = [ { @@ -93,23 +98,24 @@ describe('delete_rules', () => { }); test('returns 404 if alertClient is not available on the route', async () => { - const { services: _services, inject: _inject } = createMockServer(false); - deleteRulesBulkRoute(_services); - const { statusCode } = await _inject(getDeleteBulkRequest()); + getClients.mockResolvedValue(omit('alertsClient', clients)); + const { route, inject } = createMockServer(); + deleteRulesBulkRoute(route, getClients); + const { statusCode } = await inject(getDeleteBulkRequest()); expect(statusCode).toBe(404); }); }); describe('validation', () => { test('returns 400 if given a non-existent id in the payload', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - alertsClient.delete.mockResolvedValue({}); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.alertsClient.delete.mockResolvedValue({}); const request: ServerInjectOptions = { method: 'DELETE', url: `${DETECTION_ENGINE_RULES_URL}/_bulk_delete`, }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(400); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts index 080b50d6bcddc..a0a6f61223279 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.test.ts @@ -4,10 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createMockServer } from '../__mocks__/_mock_server'; - -import { deleteRulesRoute } from './delete_rules_route'; import { ServerInjectOptions } from 'hapi'; +import { omit } from 'lodash/fp'; +import { deleteRulesRoute } from './delete_rules_route'; import { getFindResult, @@ -17,69 +16,75 @@ import { getDeleteRequestById, getFindResultStatus, } from '../__mocks__/request_responses'; +import { createMockServer, clientsServiceMock } from '../__mocks__'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; describe('delete_rules', () => { - let { services, inject, alertsClient, savedObjectsClient } = createMockServer(); + let server = createMockServer(); + let getClients = clientsServiceMock.createGetScoped(); + let clients = clientsServiceMock.createClients(); beforeEach(() => { - ({ services, inject, alertsClient, savedObjectsClient } = createMockServer()); - deleteRulesRoute(services); - }); - - afterEach(() => { jest.resetAllMocks(); + server = createMockServer(); + getClients = clientsServiceMock.createGetScoped(); + clients = clientsServiceMock.createClients(); + + getClients.mockResolvedValue(clients); + + deleteRulesRoute(server.route, getClients); }); describe('status codes with actionClient and alertClient', () => { test('returns 200 when deleting a single rule with a valid actionClient and alertClient by alertId', async () => { - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - alertsClient.get.mockResolvedValue(getResult()); - alertsClient.delete.mockResolvedValue({}); - savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); - savedObjectsClient.delete.mockResolvedValue({}); - const { statusCode } = await inject(getDeleteRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.alertsClient.delete.mockResolvedValue({}); + clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); + clients.savedObjectsClient.delete.mockResolvedValue({}); + const { statusCode } = await server.inject(getDeleteRequest()); expect(statusCode).toBe(200); }); test('returns 200 when deleting a single rule with a valid actionClient and alertClient by id', async () => { - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - alertsClient.get.mockResolvedValue(getResult()); - alertsClient.delete.mockResolvedValue({}); - savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); - savedObjectsClient.delete.mockResolvedValue({}); - const { statusCode } = await inject(getDeleteRequestById()); + clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.alertsClient.delete.mockResolvedValue({}); + clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); + clients.savedObjectsClient.delete.mockResolvedValue({}); + const { statusCode } = await server.inject(getDeleteRequestById()); expect(statusCode).toBe(200); }); test('returns 404 when deleting a single rule that does not exist with a valid actionClient and alertClient', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - alertsClient.delete.mockResolvedValue({}); - savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); - savedObjectsClient.delete.mockResolvedValue({}); - const { statusCode } = await inject(getDeleteRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.alertsClient.delete.mockResolvedValue({}); + clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); + clients.savedObjectsClient.delete.mockResolvedValue({}); + const { statusCode } = await server.inject(getDeleteRequest()); expect(statusCode).toBe(404); }); test('returns 404 if alertClient is not available on the route', async () => { - const { services: _services, inject: _inject } = createMockServer(false); - deleteRulesRoute(_services); - const { statusCode } = await _inject(getDeleteRequest()); + getClients.mockResolvedValue(omit('alertsClient', clients)); + const { route, inject } = createMockServer(); + deleteRulesRoute(route, getClients); + const { statusCode } = await inject(getDeleteRequest()); expect(statusCode).toBe(404); }); }); describe('validation', () => { test('returns 400 if given a non-existent id', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - alertsClient.delete.mockResolvedValue({}); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.alertsClient.delete.mockResolvedValue({}); const request: ServerInjectOptions = { method: 'DELETE', url: DETECTION_ENGINE_RULES_URL, }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(400); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.test.ts index d804adb1d89a4..5b75f17164acf 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.test.ts @@ -4,7 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createMockServer } from '../__mocks__/_mock_server'; +import { omit } from 'lodash/fp'; + +import { createMockServer } from '../__mocks__'; +import { clientsServiceMock } from '../__mocks__/clients_service_mock'; import { findRulesRoute } from './find_rules_route'; import { ServerInjectOptions } from 'hapi'; @@ -13,59 +16,65 @@ import { getFindResult, getResult, getFindRequest } from '../__mocks__/request_r import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; describe('find_rules', () => { - let { services, inject, alertsClient, actionsClient } = createMockServer(); + let server = createMockServer(); + let getClients = clientsServiceMock.createGetScoped(); + let clients = clientsServiceMock.createClients(); beforeEach(() => { - ({ services, inject, alertsClient, actionsClient } = createMockServer()); - findRulesRoute(services); - }); - - afterEach(() => { jest.resetAllMocks(); + + server = createMockServer(); + getClients = clientsServiceMock.createGetScoped(); + clients = clientsServiceMock.createClients(); + + getClients.mockResolvedValue(clients); + + findRulesRoute(server.route, getClients); }); describe('status codes with actionClient and alertClient', () => { test('returns 200 when finding a single rule with a valid actionClient and alertClient', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - actionsClient.find.mockResolvedValue({ + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.actionsClient.find.mockResolvedValue({ page: 1, perPage: 1, total: 0, data: [], }); - alertsClient.get.mockResolvedValue(getResult()); - const { statusCode } = await inject(getFindRequest()); + clients.alertsClient.get.mockResolvedValue(getResult()); + const { statusCode } = await server.inject(getFindRequest()); expect(statusCode).toBe(200); }); test('returns 404 if alertClient is not available on the route', async () => { - const { services: _services, inject: _inject } = createMockServer(false); - findRulesRoute(_services); - const { statusCode } = await _inject(getFindRequest()); + const { route, inject } = createMockServer(); + getClients.mockResolvedValue(omit('alertsClient', clients)); + findRulesRoute(route, getClients); + const { statusCode } = await inject(getFindRequest()); expect(statusCode).toBe(404); }); }); describe('validation', () => { test('returns 400 if a bad query parameter is given', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); const request: ServerInjectOptions = { method: 'GET', url: `${DETECTION_ENGINE_RULES_URL}/_find?invalid_value=500`, }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(400); }); test('returns 200 if the set of optional query parameters are given', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); const request: ServerInjectOptions = { method: 'GET', url: `${DETECTION_ENGINE_RULES_URL}/_find?page=2&per_page=20&sort_field=timestamp&fields=["field-1","field-2","field-3]`, }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(200); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rule_status_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rule_status_route.test.ts index 380d5bdbfc949..8f27910a7e5e2 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rule_status_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/get_prepackaged_rule_status_route.test.ts @@ -4,8 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createMockServer } from '../__mocks__/_mock_server'; -import { createRulesRoute } from './create_rules_route'; +import { omit } from 'lodash/fp'; + +import { getPrepackagedRulesStatusRoute } from './get_prepackaged_rules_status_route'; + import { getFindResult, getResult, @@ -14,6 +16,7 @@ import { getPrepackagedRulesStatusRequest, getNonEmptyIndex, } from '../__mocks__/request_responses'; +import { createMockServer, clientsServiceMock } from '../__mocks__'; jest.mock('../../rules/get_prepackaged_rules', () => { return { @@ -38,43 +41,50 @@ jest.mock('../../rules/get_prepackaged_rules', () => { }; }); -import { getPrepackagedRulesStatusRoute } from './get_prepackaged_rules_status_route'; - describe('get_prepackaged_rule_status_route', () => { - let { services, inject, alertsClient, actionsClient, callClusterMock } = createMockServer(); + let server = createMockServer(); + let getClients = clientsServiceMock.createGetScoped(); + let clients = clientsServiceMock.createClients(); beforeEach(() => { jest.resetAllMocks(); - ({ services, inject, alertsClient, actionsClient, callClusterMock } = createMockServer()); - callClusterMock.mockImplementation(getNonEmptyIndex); - getPrepackagedRulesStatusRoute(services); + + server = createMockServer(); + getClients = clientsServiceMock.createGetScoped(); + clients = clientsServiceMock.createClients(); + + getClients.mockResolvedValue(clients); + clients.clusterClient.callAsCurrentUser.mockResolvedValue(getNonEmptyIndex()); + + getPrepackagedRulesStatusRoute(server.route, getClients); }); describe('status codes with actionClient and alertClient', () => { test('returns 200 when creating a with a valid actionClient and alertClient', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.create.mockResolvedValue(createActionResult()); - alertsClient.create.mockResolvedValue(getResult()); - const { statusCode } = await inject(getPrepackagedRulesStatusRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.create.mockResolvedValue(createActionResult()); + clients.alertsClient.create.mockResolvedValue(getResult()); + const { statusCode } = await server.inject(getPrepackagedRulesStatusRequest()); expect(statusCode).toBe(200); }); test('returns 404 if alertClient is not available on the route', async () => { - const { services: _services, inject: _inject } = createMockServer(false); - createRulesRoute(_services); - const { statusCode } = await _inject(getPrepackagedRulesStatusRequest()); + getClients.mockResolvedValue(omit('alertsClient', clients)); + const { route, inject } = createMockServer(); + getPrepackagedRulesStatusRoute(route, getClients); + const { statusCode } = await inject(getPrepackagedRulesStatusRequest()); expect(statusCode).toBe(404); }); }); describe('payload', () => { test('0 rules installed, 0 custom rules, 1 rules not installed, and 1 rule not updated', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.create.mockResolvedValue(createActionResult()); - alertsClient.create.mockResolvedValue(getResult()); - const { payload } = await inject(getPrepackagedRulesStatusRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.create.mockResolvedValue(createActionResult()); + clients.alertsClient.create.mockResolvedValue(getResult()); + const { payload } = await server.inject(getPrepackagedRulesStatusRequest()); expect(JSON.parse(payload)).toEqual({ rules_custom_installed: 0, rules_installed: 0, @@ -84,11 +94,11 @@ describe('get_prepackaged_rule_status_route', () => { }); test('1 rule installed, 1 custom rules, 0 rules not installed, and 1 rule to not updated', async () => { - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.create.mockResolvedValue(createActionResult()); - alertsClient.create.mockResolvedValue(getResult()); - const { payload } = await inject(getPrepackagedRulesStatusRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.create.mockResolvedValue(createActionResult()); + clients.alertsClient.create.mockResolvedValue(getResult()); + const { payload } = await server.inject(getPrepackagedRulesStatusRequest()); expect(JSON.parse(payload)).toEqual({ rules_custom_installed: 1, rules_installed: 1, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.test.ts index 532803b397481..6e372c39b2890 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.test.ts @@ -4,11 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createMockServer } from '../__mocks__/_mock_server'; - -import { readRulesRoute } from './read_rules_route'; import { ServerInjectOptions } from 'hapi'; +import { omit } from 'lodash/fp'; +import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { readRulesRoute } from './read_rules_route'; import { getFindResult, getResult, @@ -16,14 +16,20 @@ import { getFindResultWithSingleHit, getFindResultStatus, } from '../__mocks__/request_responses'; -import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { createMockServer, clientsServiceMock } from '../__mocks__'; describe('read_signals', () => { - let { services, inject, alertsClient, savedObjectsClient } = createMockServer(); + let server = createMockServer(); + let getClients = clientsServiceMock.createGetScoped(); + let clients = clientsServiceMock.createClients(); beforeEach(() => { - ({ services, inject, alertsClient, savedObjectsClient } = createMockServer()); - readRulesRoute(services); + server = createMockServer(); + getClients = clientsServiceMock.createGetScoped(); + clients = clientsServiceMock.createClients(); + + getClients.mockResolvedValue(clients); + readRulesRoute(server.route, getClients); }); afterEach(() => { @@ -32,32 +38,33 @@ describe('read_signals', () => { describe('status codes with actionClient and alertClient', () => { test('returns 200 when reading a single rule with a valid actionClient and alertClient', async () => { - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - alertsClient.get.mockResolvedValue(getResult()); - savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); - const { statusCode } = await inject(getReadRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); + const { statusCode } = await server.inject(getReadRequest()); expect(statusCode).toBe(200); }); test('returns 404 if alertClient is not available on the route', async () => { - const { services: _services, inject: _inject } = createMockServer(false); - readRulesRoute(_services); - const { statusCode } = await _inject(getReadRequest()); + getClients.mockResolvedValue(omit('alertsClient', clients)); + const { route, inject } = createMockServer(); + readRulesRoute(route, getClients); + const { statusCode } = await inject(getReadRequest()); expect(statusCode).toBe(404); }); }); describe('validation', () => { test('returns 400 if given a non-existent id', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - alertsClient.delete.mockResolvedValue({}); - savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.alertsClient.delete.mockResolvedValue({}); + clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); const request: ServerInjectOptions = { method: 'GET', url: DETECTION_ENGINE_RULES_URL, }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(400); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk.test.ts index 8135e75ab0ca9..fa27792a92627 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk.test.ts @@ -4,11 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createMockServer } from '../__mocks__/_mock_server'; - -import { updateRulesRoute } from './update_rules_route'; import { ServerInjectOptions } from 'hapi'; +import { omit } from 'lodash/fp'; +import { updateRulesRoute } from './update_rules_route'; import { getFindResult, getResult, @@ -17,44 +16,51 @@ import { getFindResultWithSingleHit, getUpdateBulkRequest, } from '../__mocks__/request_responses'; +import { createMockServer, clientsServiceMock } from '../__mocks__'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { updateRulesBulkRoute } from './update_rules_bulk_route'; import { BulkError } from '../utils'; describe('update_rules_bulk', () => { - let { services, inject, alertsClient, actionsClient } = createMockServer(); + let server = createMockServer(); + let getClients = clientsServiceMock.createGetScoped(); + let clients = clientsServiceMock.createClients(); beforeEach(() => { jest.resetAllMocks(); - ({ services, inject, alertsClient, actionsClient } = createMockServer()); - updateRulesBulkRoute(services); + server = createMockServer(); + getClients = clientsServiceMock.createGetScoped(); + clients = clientsServiceMock.createClients(); + + getClients.mockResolvedValue(clients); + updateRulesBulkRoute(server.route, getClients); }); describe('status codes with actionClient and alertClient', () => { test('returns 200 when updating a single rule with a valid actionClient and alertClient', async () => { - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.update.mockResolvedValue(updateActionResult()); - alertsClient.update.mockResolvedValue(getResult()); - const { statusCode } = await inject(getUpdateBulkRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.update.mockResolvedValue(updateActionResult()); + clients.alertsClient.update.mockResolvedValue(getResult()); + const { statusCode } = await server.inject(getUpdateBulkRequest()); expect(statusCode).toBe(200); }); test('returns 200 as a response when updating a single rule that does not exist', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.update.mockResolvedValue(updateActionResult()); - alertsClient.update.mockResolvedValue(getResult()); - const { statusCode } = await inject(getUpdateBulkRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.update.mockResolvedValue(updateActionResult()); + clients.alertsClient.update.mockResolvedValue(getResult()); + const { statusCode } = await server.inject(getUpdateBulkRequest()); expect(statusCode).toBe(200); }); test('returns 404 within the payload when updating a single rule that does not exist', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.update.mockResolvedValue(updateActionResult()); - alertsClient.update.mockResolvedValue(getResult()); - const { payload } = await inject(getUpdateBulkRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.update.mockResolvedValue(updateActionResult()); + clients.alertsClient.update.mockResolvedValue(getResult()); + const { payload } = await server.inject(getUpdateBulkRequest()); const parsed: BulkError[] = JSON.parse(payload); const expected: BulkError[] = [ { @@ -66,50 +72,51 @@ describe('update_rules_bulk', () => { }); test('returns 404 if alertClient is not available on the route', async () => { - const { services: _services, inject: _inject } = createMockServer(false); - updateRulesRoute(_services); - const { statusCode } = await _inject(getUpdateBulkRequest()); + getClients.mockResolvedValue(omit('alertsClient', clients)); + const { route, inject } = createMockServer(); + updateRulesRoute(route, getClients); + const { statusCode } = await inject(getUpdateBulkRequest()); expect(statusCode).toBe(404); }); }); describe('validation', () => { test('returns 400 if id is not given in either the body or the url', async () => { - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - alertsClient.get.mockResolvedValue(getResult()); + clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); + clients.alertsClient.get.mockResolvedValue(getResult()); const { rule_id, ...noId } = typicalPayload(); const request: ServerInjectOptions = { method: 'PUT', url: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, payload: [noId], }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(400); }); test('returns errors as 200 to just indicate ok something happened', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - actionsClient.update.mockResolvedValue(updateActionResult()); - alertsClient.update.mockResolvedValue(getResult()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.actionsClient.update.mockResolvedValue(updateActionResult()); + clients.alertsClient.update.mockResolvedValue(getResult()); const request: ServerInjectOptions = { method: 'PUT', url: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, payload: [typicalPayload()], }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toEqual(200); }); test('returns 404 in the payload if the record does not exist yet', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - actionsClient.update.mockResolvedValue(updateActionResult()); - alertsClient.update.mockResolvedValue(getResult()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.actionsClient.update.mockResolvedValue(updateActionResult()); + clients.alertsClient.update.mockResolvedValue(getResult()); const request: ServerInjectOptions = { method: 'PUT', url: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, payload: [typicalPayload()], }; - const { payload } = await inject(request); + const { payload } = await server.inject(request); const parsed: BulkError[] = JSON.parse(payload); const expected: BulkError[] = [ { @@ -121,24 +128,24 @@ describe('update_rules_bulk', () => { }); test('returns 200 if type is query', async () => { - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.update.mockResolvedValue(updateActionResult()); - alertsClient.update.mockResolvedValue(getResult()); + clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.update.mockResolvedValue(updateActionResult()); + clients.alertsClient.update.mockResolvedValue(getResult()); const request: ServerInjectOptions = { method: 'PUT', url: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, payload: [typicalPayload()], }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(200); }); test('returns 400 if type is not filter or kql', async () => { - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.update.mockResolvedValue(updateActionResult()); - alertsClient.update.mockResolvedValue(getResult()); + clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.update.mockResolvedValue(updateActionResult()); + clients.alertsClient.update.mockResolvedValue(getResult()); const { type, ...noType } = typicalPayload(); const request: ServerInjectOptions = { method: 'PUT', @@ -150,7 +157,7 @@ describe('update_rules_bulk', () => { }, ], }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(400); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.test.ts index 86fd7b6550173..9399a0c2f84d2 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.test.ts @@ -4,11 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createMockServer } from '../__mocks__/_mock_server'; - -import { updateRulesRoute } from './update_rules_route'; import { ServerInjectOptions } from 'hapi'; +import { omit } from 'lodash/fp'; +import { updateRulesRoute } from './update_rules_route'; import { getFindResult, getFindResultStatus, @@ -18,51 +17,60 @@ import { typicalPayload, getFindResultWithSingleHit, } from '../__mocks__/request_responses'; +import { createMockServer, clientsServiceMock } from '../__mocks__'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; describe('update_rules', () => { - let { services, inject, alertsClient, actionsClient, savedObjectsClient } = createMockServer(); + let server = createMockServer(); + let getClients = clientsServiceMock.createGetScoped(); + let clients = clientsServiceMock.createClients(); beforeEach(() => { jest.resetAllMocks(); - ({ services, inject, alertsClient, actionsClient, savedObjectsClient } = createMockServer()); - updateRulesRoute(services); + + server = createMockServer(); + getClients = clientsServiceMock.createGetScoped(); + clients = clientsServiceMock.createClients(); + + getClients.mockResolvedValue(clients); + updateRulesRoute(server.route, getClients); }); describe('status codes with actionClient and alertClient', () => { test('returns 200 when updating a single rule with a valid actionClient and alertClient', async () => { - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.update.mockResolvedValue(updateActionResult()); - alertsClient.update.mockResolvedValue(getResult()); - savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); - const { statusCode } = await inject(getUpdateRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.update.mockResolvedValue(updateActionResult()); + clients.alertsClient.update.mockResolvedValue(getResult()); + clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); + const { statusCode } = await server.inject(getUpdateRequest()); expect(statusCode).toBe(200); }); test('returns 404 when updating a single rule that does not exist', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.update.mockResolvedValue(updateActionResult()); - alertsClient.update.mockResolvedValue(getResult()); - savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); - const { statusCode } = await inject(getUpdateRequest()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.update.mockResolvedValue(updateActionResult()); + clients.alertsClient.update.mockResolvedValue(getResult()); + clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); + const { statusCode } = await server.inject(getUpdateRequest()); expect(statusCode).toBe(404); }); test('returns 404 if alertClient is not available on the route', async () => { - const { services: _services, inject: _inject } = createMockServer(false); - updateRulesRoute(_services); - const { statusCode } = await _inject(getUpdateRequest()); + getClients.mockResolvedValue(omit('alertsClient', clients)); + const { route, inject } = createMockServer(); + updateRulesRoute(route, getClients); + const { statusCode } = await inject(getUpdateRequest()); expect(statusCode).toBe(404); }); }); describe('validation', () => { test('returns 400 if id is not given in either the body or the url', async () => { - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - alertsClient.get.mockResolvedValue(getResult()); - savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); + clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); const { rule_id, ...noId } = typicalPayload(); const request: ServerInjectOptions = { method: 'PUT', @@ -71,45 +79,45 @@ describe('update_rules', () => { payload: noId, }, }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(400); }); test('returns 404 if the record does not exist yet', async () => { - alertsClient.find.mockResolvedValue(getFindResult()); - actionsClient.update.mockResolvedValue(updateActionResult()); - alertsClient.update.mockResolvedValue(getResult()); - savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); + clients.alertsClient.find.mockResolvedValue(getFindResult()); + clients.actionsClient.update.mockResolvedValue(updateActionResult()); + clients.alertsClient.update.mockResolvedValue(getResult()); + clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); const request: ServerInjectOptions = { method: 'PUT', url: DETECTION_ENGINE_RULES_URL, payload: typicalPayload(), }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(404); }); test('returns 200 if type is query', async () => { - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.update.mockResolvedValue(updateActionResult()); - alertsClient.update.mockResolvedValue(getResult()); - savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); + clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.update.mockResolvedValue(updateActionResult()); + clients.alertsClient.update.mockResolvedValue(getResult()); + clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); const request: ServerInjectOptions = { method: 'PUT', url: DETECTION_ENGINE_RULES_URL, payload: typicalPayload(), }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(200); }); test('returns 400 if type is not filter or kql', async () => { - alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - alertsClient.get.mockResolvedValue(getResult()); - actionsClient.update.mockResolvedValue(updateActionResult()); - alertsClient.update.mockResolvedValue(getResult()); - savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); + clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); + clients.alertsClient.get.mockResolvedValue(getResult()); + clients.actionsClient.update.mockResolvedValue(updateActionResult()); + clients.alertsClient.update.mockResolvedValue(getResult()); + clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); const { type, ...noType } = typicalPayload(); const request: ServerInjectOptions = { method: 'PUT', @@ -119,7 +127,7 @@ describe('update_rules', () => { type: 'something-made-up', }, }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(400); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals.test.ts index 049a04205d94d..3e7ed4de6d8c6 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals.test.ts @@ -4,10 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createMockServer } from '../__mocks__/_mock_server'; +import { ServerInjectOptions } from 'hapi'; +import { DETECTION_ENGINE_SIGNALS_STATUS_URL } from '../../../../../common/constants'; import { setSignalsStatusRoute } from './open_close_signals_route'; import * as myUtils from '../utils'; -import { ServerInjectOptions } from 'hapi'; import { getSetSignalStatusByIdsRequest, @@ -16,28 +16,38 @@ import { typicalSetStatusSignalByQueryPayload, setStatusSignalMissingIdsAndQueryPayload, } from '../__mocks__/request_responses'; -import { DETECTION_ENGINE_SIGNALS_STATUS_URL } from '../../../../../common/constants'; +import { createMockServer, createMockConfig, clientsServiceMock } from '../__mocks__'; describe('set signal status', () => { - let { inject, services, callClusterMock } = createMockServer(); + let server = createMockServer(); + let config = createMockConfig(); + let getClients = clientsServiceMock.createGetScoped(); + let clients = clientsServiceMock.createClients(); beforeEach(() => { jest.resetAllMocks(); jest.spyOn(myUtils, 'getIndex').mockReturnValue('fakeindex'); - ({ inject, services, callClusterMock } = createMockServer()); - callClusterMock.mockImplementation(() => true); - setSignalsStatusRoute(services); + + server = createMockServer(); + config = createMockConfig(); + getClients = clientsServiceMock.createGetScoped(); + clients = clientsServiceMock.createClients(); + + getClients.mockResolvedValue(clients); + clients.clusterClient.callAsCurrentUser.mockResolvedValue(true); + + setSignalsStatusRoute(server.route, config, getClients); }); describe('status on signal', () => { test('returns 200 when setting a status on a signal by ids', async () => { - const { statusCode } = await inject(getSetSignalStatusByIdsRequest()); + const { statusCode } = await server.inject(getSetSignalStatusByIdsRequest()); expect(statusCode).toBe(200); expect(myUtils.getIndex).toHaveReturnedWith('fakeindex'); }); test('returns 200 when setting a status on a signal by query', async () => { - const { statusCode } = await inject(getSetSignalStatusByQueryRequest()); + const { statusCode } = await server.inject(getSetSignalStatusByQueryRequest()); expect(statusCode).toBe(200); }); }); @@ -49,7 +59,7 @@ describe('set signal status', () => { url: DETECTION_ENGINE_SIGNALS_STATUS_URL, payload: typicalSetStatusSignalByIdsPayload(), }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(200); }); @@ -59,7 +69,7 @@ describe('set signal status', () => { url: DETECTION_ENGINE_SIGNALS_STATUS_URL, payload: typicalSetStatusSignalByQueryPayload(), }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(200); }); @@ -69,7 +79,7 @@ describe('set signal status', () => { url: DETECTION_ENGINE_SIGNALS_STATUS_URL, payload: setStatusSignalMissingIdsAndQueryPayload(), }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(400); }); @@ -80,7 +90,7 @@ describe('set signal status', () => { url: DETECTION_ENGINE_SIGNALS_STATUS_URL, payload: justIds, }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(400); }); @@ -91,7 +101,7 @@ describe('set signal status', () => { url: DETECTION_ENGINE_SIGNALS_STATUS_URL, payload: justTheQuery, }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(400); }); @@ -106,7 +116,7 @@ describe('set signal status', () => { url: DETECTION_ENGINE_SIGNALS_STATUS_URL, payload: queryAndSignalIdsNoStatus, }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(400); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.test.ts index 8d1f97c1ab76f..d245d45d30c1e 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.test.ts @@ -4,51 +4,57 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createMockServer } from '../__mocks__/_mock_server'; -import { querySignalsRoute } from './query_signals_route'; -import * as myUtils from '../utils'; import { ServerInjectOptions } from 'hapi'; +import { querySignalsRoute } from './query_signals_route'; +import * as myUtils from '../utils'; import { getSignalsQueryRequest, getSignalsAggsQueryRequest, typicalSignalsQuery, typicalSignalsQueryAggs, } from '../__mocks__/request_responses'; +import { createMockServer, createMockConfig, clientsServiceMock } from '../__mocks__'; import { DETECTION_ENGINE_QUERY_SIGNALS_URL } from '../../../../../common/constants'; describe('query for signal', () => { - let { inject, services, callClusterMock } = createMockServer(); + let server = createMockServer(); + let config = createMockConfig(); + let getClients = clientsServiceMock.createGetScoped(); + let clients = clientsServiceMock.createClients(); beforeEach(() => { jest.resetAllMocks(); jest.spyOn(myUtils, 'getIndex').mockReturnValue('fakeindex'); - ({ inject, services, callClusterMock } = createMockServer()); - callClusterMock.mockImplementation(() => true); - querySignalsRoute(services); + + server = createMockServer(); + config = createMockConfig(); + getClients = clientsServiceMock.createGetScoped(); + clients = clientsServiceMock.createClients(); + + getClients.mockResolvedValue(clients); + clients.clusterClient.callAsCurrentUser.mockResolvedValue(true); + + querySignalsRoute(server.route, config, getClients); }); describe('query and agg on signals index', () => { test('returns 200 when using single query', async () => { - callClusterMock.mockImplementation( - (endpoint: string, params: { index: string; body: object }) => { - expect(params.body).toMatchObject({ ...typicalSignalsQueryAggs() }); - return true; - } - ); - const { statusCode } = await inject(getSignalsAggsQueryRequest()); + clients.clusterClient.callAsCurrentUser.mockImplementation((endpoint, params) => { + expect(params!.body).toMatchObject({ ...typicalSignalsQueryAggs() }); + return Promise.resolve(true); + }); + const { statusCode } = await server.inject(getSignalsAggsQueryRequest()); expect(statusCode).toBe(200); expect(myUtils.getIndex).toHaveReturnedWith('fakeindex'); }); test('returns 200 when using single agg', async () => { - callClusterMock.mockImplementation( - (endpoint: string, params: { index: string; body: object }) => { - expect(params.body).toMatchObject({ ...typicalSignalsQueryAggs() }); - return true; - } - ); - const { statusCode } = await inject(getSignalsAggsQueryRequest()); + clients.clusterClient.callAsCurrentUser.mockImplementation((endpoint, params) => { + expect(params!.body).toMatchObject({ ...typicalSignalsQueryAggs() }); + return Promise.resolve(true); + }); + const { statusCode } = await server.inject(getSignalsAggsQueryRequest()); expect(statusCode).toBe(200); expect(myUtils.getIndex).toHaveReturnedWith('fakeindex'); }); @@ -56,16 +62,14 @@ describe('query for signal', () => { test('returns 200 when using aggs and query together', async () => { const allTogether = getSignalsQueryRequest(); allTogether.payload = { ...typicalSignalsQueryAggs(), ...typicalSignalsQuery() }; - callClusterMock.mockImplementation( - (endpoint: string, params: { index: string; body: object }) => { - expect(params.body).toMatchObject({ - ...typicalSignalsQueryAggs(), - ...typicalSignalsQuery(), - }); - return true; - } - ); - const { statusCode } = await inject(allTogether); + clients.clusterClient.callAsCurrentUser.mockImplementation((endpoint, params) => { + expect(params!.body).toMatchObject({ + ...typicalSignalsQueryAggs(), + ...typicalSignalsQuery(), + }); + return Promise.resolve(true); + }); + const { statusCode } = await server.inject(allTogether); expect(statusCode).toBe(200); expect(myUtils.getIndex).toHaveReturnedWith('fakeindex'); }); @@ -73,7 +77,7 @@ describe('query for signal', () => { test('returns 400 when missing aggs and query', async () => { const allTogether = getSignalsQueryRequest(); allTogether.payload = {}; - const { statusCode } = await inject(allTogether); + const { statusCode } = await server.inject(allTogether); expect(statusCode).toBe(400); }); }); @@ -85,7 +89,7 @@ describe('query for signal', () => { url: DETECTION_ENGINE_QUERY_SIGNALS_URL, payload: typicalSignalsQuery(), }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(200); }); @@ -95,7 +99,7 @@ describe('query for signal', () => { url: DETECTION_ENGINE_QUERY_SIGNALS_URL, payload: typicalSignalsQueryAggs(), }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(200); }); @@ -105,7 +109,7 @@ describe('query for signal', () => { url: DETECTION_ENGINE_QUERY_SIGNALS_URL, payload: { ...typicalSignalsQueryAggs(), ...typicalSignalsQuery() }, }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(200); }); @@ -115,7 +119,7 @@ describe('query for signal', () => { url: DETECTION_ENGINE_QUERY_SIGNALS_URL, payload: {}, }; - const { statusCode } = await inject(request); + const { statusCode } = await server.inject(request); expect(statusCode).toBe(400); }); }); From 79171ff00347097957468aa8e4d15d8c535dc6c2 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Fri, 7 Feb 2020 21:40:39 -0600 Subject: [PATCH 30/39] Remove unnecessary null checks Our savedObjectsClient is always going to be there. --- .../routes/rules/add_prepackaged_rules_route.ts | 2 +- .../detection_engine/routes/rules/create_rules_bulk_route.ts | 2 +- .../lib/detection_engine/routes/rules/create_rules_route.ts | 2 +- .../detection_engine/routes/rules/delete_rules_bulk_route.ts | 2 +- .../lib/detection_engine/routes/rules/delete_rules_route.ts | 2 +- .../lib/detection_engine/routes/rules/find_rules_route.ts | 2 +- .../detection_engine/routes/rules/find_rules_status_route.ts | 2 +- .../lib/detection_engine/routes/rules/import_rules_route.ts | 2 +- .../lib/detection_engine/routes/rules/read_rules_route.ts | 2 +- .../detection_engine/routes/rules/update_rules_bulk_route.ts | 2 +- .../lib/detection_engine/routes/rules/update_rules_route.ts | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts index 771c128992a3b..4dd907f956c9b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts @@ -44,7 +44,7 @@ export const createAddPrepackedRulesRoute = ( spacesClient, } = await getClients(request); - if (!actionsClient || !alertsClient || !savedObjectsClient) { + if (!actionsClient || !alertsClient) { return headers.response().code(404); } diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts index e88b1663abdac..9db3785c97a91 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts @@ -43,7 +43,7 @@ export const createCreateRulesBulkRoute = ( savedObjectsClient, } = await getClients(request); - if (!actionsClient || !alertsClient || !savedObjectsClient) { + if (!actionsClient || !alertsClient) { return headers.response().code(404); } diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts index 2121091879109..d18cda550ad48 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts @@ -72,7 +72,7 @@ export const createCreateRulesRoute = ( spacesClient, } = await getClients(request); - if (!actionsClient || !alertsClient || !savedObjectsClient) { + if (!actionsClient || !alertsClient) { return headers.response().code(404); } diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts index 032c62bf3e5ec..22c306d42314f 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts @@ -32,7 +32,7 @@ export const createDeleteRulesBulkRoute = (getClients: GetScopedClients): Hapi.S async handler(request: QueryBulkRequest, headers) { const { actionsClient, alertsClient, savedObjectsClient } = await getClients(request); - if (!actionsClient || !alertsClient || !savedObjectsClient) { + if (!actionsClient || !alertsClient) { return headers.response().code(404); } diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts index ae645d879363b..fdc68a843fa60 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts @@ -35,7 +35,7 @@ export const createDeleteRulesRoute = (getClients: GetScopedClients): Hapi.Serve try { const { actionsClient, alertsClient, savedObjectsClient } = await getClients(request); - if (!actionsClient || !alertsClient || !savedObjectsClient) { + if (!actionsClient || !alertsClient) { return headers.response().code(404); } diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts index 2a094c1e693da..b30e3fb5bf85c 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts @@ -32,7 +32,7 @@ export const createFindRulesRoute = (getClients: GetScopedClients): Hapi.ServerR const { query } = request; try { const { alertsClient, savedObjectsClient } = await getClients(request); - if (!alertsClient || !savedObjectsClient) { + if (!alertsClient) { return headers.response().code(404); } diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts index 25d89f65f8e12..fe8742ff0b60c 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts @@ -46,7 +46,7 @@ export const createFindRulesStatusRoute = (getClients: GetScopedClients): Hapi.S const { query } = request; const { alertsClient, savedObjectsClient } = await getClients(request); - if (!alertsClient || !savedObjectsClient) { + if (!alertsClient) { return headers.response().code(404); } diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts index b4b8a3528830c..3c6a881f2c45e 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts @@ -65,7 +65,7 @@ export const createImportRulesRoute = ( savedObjectsClient, } = await getClients(request); - if (!actionsClient || !alertsClient || !savedObjectsClient) { + if (!actionsClient || !alertsClient) { return headers.response().code(404); } diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts index 359b0d24ddc87..71036b135c81b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts @@ -33,7 +33,7 @@ export const createReadRulesRoute = (getClients: GetScopedClients): Hapi.ServerR try { const { alertsClient, savedObjectsClient } = await getClients(request); - if (!alertsClient || !savedObjectsClient) { + if (!alertsClient) { return headers.response().code(404); } diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts index 71ce48dd37148..222a3324038d3 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts @@ -35,7 +35,7 @@ export const createUpdateRulesBulkRoute = (getClients: GetScopedClients): Hapi.S async handler(request: BulkUpdateRulesRequest, headers) { const { actionsClient, alertsClient, savedObjectsClient } = await getClients(request); - if (!actionsClient || !alertsClient || !savedObjectsClient) { + if (!actionsClient || !alertsClient) { return headers.response().code(404); } diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts index 7b75b159384fe..c05f4e5e0ae74 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts @@ -61,7 +61,7 @@ export const createUpdateRulesRoute = (getClients: GetScopedClients): Hapi.Serve try { const { alertsClient, actionsClient, savedObjectsClient } = await getClients(request); - if (!actionsClient || !alertsClient || !savedObjectsClient) { + if (!actionsClient || !alertsClient) { return headers.response().code(404); } From 156dd77fa7f522b37cdd7fbe1007aa0cac9f2119 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Fri, 7 Feb 2020 21:46:32 -0600 Subject: [PATCH 31/39] Remove unused type YAGNI --- x-pack/legacy/plugins/siem/server/plugin.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/plugin.ts b/x-pack/legacy/plugins/siem/server/plugin.ts index 5c27db2d31af0..44d9d5dfcfab1 100644 --- a/x-pack/legacy/plugins/siem/server/plugin.ts +++ b/x-pack/legacy/plugins/siem/server/plugin.ts @@ -40,8 +40,6 @@ export interface SetupPlugins { spaces: SpacesSetup; } -export type SetupServices = CoreSetup & SetupPlugins; - export interface StartPlugins { actions: ActionsStart; } From e30900160373bab77fbc4de97e3cad6bc13fb1e1 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Mon, 10 Feb 2020 10:06:35 -0600 Subject: [PATCH 32/39] Remove unused savedObjects client Turns out we were only destructuring this client for the null check. --- .../routes/rules/create_rules_bulk_route.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts index 9db3785c97a91..8df0730e7f2a3 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts @@ -35,13 +35,9 @@ export const createCreateRulesBulkRoute = ( }, }, async handler(request: BulkRulesRequest, headers) { - const { - actionsClient, - alertsClient, - clusterClient, - spacesClient, - savedObjectsClient, - } = await getClients(request); + const { actionsClient, alertsClient, clusterClient, spacesClient } = await getClients( + request + ); if (!actionsClient || !alertsClient) { return headers.response().code(404); From 0816e624d57def7030c7b97343969403823b6bd0 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Mon, 10 Feb 2020 10:06:49 -0600 Subject: [PATCH 33/39] Handle case where spaces is disabled We already null-coalesce properly in the clients service, but this property access was missed. --- x-pack/legacy/plugins/siem/server/plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/legacy/plugins/siem/server/plugin.ts b/x-pack/legacy/plugins/siem/server/plugin.ts index 44d9d5dfcfab1..3221adbf12539 100644 --- a/x-pack/legacy/plugins/siem/server/plugin.ts +++ b/x-pack/legacy/plugins/siem/server/plugin.ts @@ -62,7 +62,7 @@ export class Plugin { public setup(core: CoreSetup, plugins: SetupPlugins, __legacy: LegacyServices) { this.logger.debug('Shim plugin setup'); - this.clients.setup(core.elasticsearch.dataClient, plugins.spaces.spacesService); + this.clients.setup(core.elasticsearch.dataClient, plugins.spaces?.spacesService); this.legacyInitRoutes = initRoutes( __legacy.route, From dfd81cd42251710d1d232d0a96146ba68a3eac57 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Mon, 10 Feb 2020 10:07:02 -0600 Subject: [PATCH 34/39] Return default signals index if spaces are disabled --- .../lib/detection_engine/routes/utils.test.ts | 27 +++++++++++++++++++ .../lib/detection_engine/routes/utils.ts | 5 ++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.test.ts index ffd0c791c5bb6..f2f44a378d76b 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.test.ts @@ -14,7 +14,9 @@ import { ImportSuccessError, createImportErrorObject, transformImportError, + getIndex, } from './utils'; +import { createMockConfig } from './__mocks__'; describe('utils', () => { describe('transformError', () => { @@ -274,4 +276,29 @@ describe('utils', () => { expect(transformed).toEqual(expected); }); }); + + describe('getIndex', () => { + let mockConfig = createMockConfig(); + + beforeEach(() => { + mockConfig = () => ({ + get: jest.fn(() => 'mockSignalsIndex'), + has: jest.fn(), + }); + }); + + it('returns the configured index if spaces are disabled', () => { + const getSpaceId = jest.fn(() => undefined); + const index = getIndex(getSpaceId, mockConfig); + + expect(index).toEqual('mockSignalsIndex'); + }); + + it('appends the space id to the configured index if spaces are enabled', () => { + const getSpaceId = jest.fn(() => 'myspace'); + const index = getIndex(getSpaceId, mockConfig); + + expect(index).toEqual('mockSignalsIndex-myspace'); + }); + }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts index 1e3e5f4ddbb41..bc7e36397d67c 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts @@ -162,6 +162,7 @@ export const getIndex = ( config: LegacyServices['config'] ): string => { const spaceId = getSpaceId(); - const signalsIndex = config().get(`xpack.${APP_ID}.${SIGNALS_INDEX_KEY}`); - return `${signalsIndex}-${spaceId}`; + const signalsIndex = config().get(`xpack.${APP_ID}.${SIGNALS_INDEX_KEY}`); + + return spaceId ? `${signalsIndex}-${spaceId}` : signalsIndex; }; From 11f35815d0c186e300c8fce7ce7710bbc03b2770 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Mon, 10 Feb 2020 12:27:12 -0600 Subject: [PATCH 35/39] Remove unnecessary casting of our alerts client mock I think that this was the result of us importing the wrong AlertsClient type, or perhaps the types were out of sync. Regardless, they work now. --- .../get_existing_prepackaged_rules.test.ts | 49 +++------------ .../rules/get_export_all.test.ts | 7 +-- .../rules/get_export_by_object_ids.test.ts | 16 ++--- .../detection_engine/rules/read_rules.test.ts | 19 ++---- .../detection_engine/tags/read_tags.test.ts | 61 ++++--------------- 5 files changed, 34 insertions(+), 118 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_existing_prepackaged_rules.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_existing_prepackaged_rules.test.ts index 8d00ddb18be6b..25bac383ecf72 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_existing_prepackaged_rules.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_existing_prepackaged_rules.test.ts @@ -5,7 +5,6 @@ */ import { alertsClientMock } from '../../../../../alerting/server/alerts_client.mock'; -import { AlertsClient } from '../../../../../alerting'; import { getResult, getFindResultWithSingleHit, @@ -28,10 +27,7 @@ describe('get_existing_prepackaged_rules', () => { test('should return a single item in a single page', async () => { const alertsClient = alertsClientMock.create(); alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const rules = await getExistingPrepackagedRules({ - alertsClient: unsafeCast, - }); + const rules = await getExistingPrepackagedRules({ alertsClient }); expect(rules).toEqual([getResult()]); }); @@ -70,10 +66,7 @@ describe('get_existing_prepackaged_rules', () => { }) ); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const rules = await getExistingPrepackagedRules({ - alertsClient: unsafeCast, - }); + const rules = await getExistingPrepackagedRules({ alertsClient }); expect(rules).toEqual([result1, result2, result3]); }); }); @@ -82,10 +75,7 @@ describe('get_existing_prepackaged_rules', () => { test('should return a single item in a single page', async () => { const alertsClient = alertsClientMock.create(); alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const rules = await getNonPackagedRules({ - alertsClient: unsafeCast, - }); + const rules = await getNonPackagedRules({ alertsClient }); expect(rules).toEqual([getResult()]); }); @@ -113,10 +103,7 @@ describe('get_existing_prepackaged_rules', () => { getFindResultWithMultiHits({ data: [result1, result2], perPage: 2, page: 1, total: 2 }) ); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const rules = await getNonPackagedRules({ - alertsClient: unsafeCast, - }); + const rules = await getNonPackagedRules({ alertsClient }); expect(rules).toEqual([result1, result2]); }); @@ -152,10 +139,7 @@ describe('get_existing_prepackaged_rules', () => { }) ); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const rules = await getNonPackagedRules({ - alertsClient: unsafeCast, - }); + const rules = await getNonPackagedRules({ alertsClient }); expect(rules).toEqual([result1, result2, result3]); }); }); @@ -164,11 +148,7 @@ describe('get_existing_prepackaged_rules', () => { test('should return a single item in a single page', async () => { const alertsClient = alertsClientMock.create(); alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const rules = await getRules({ - alertsClient: unsafeCast, - filter: '', - }); + const rules = await getRules({ alertsClient, filter: '' }); expect(rules).toEqual([getResult()]); }); @@ -196,11 +176,7 @@ describe('get_existing_prepackaged_rules', () => { getFindResultWithMultiHits({ data: [result1, result2], perPage: 2, page: 1, total: 2 }) ); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const rules = await getRules({ - alertsClient: unsafeCast, - filter: '', - }); + const rules = await getRules({ alertsClient, filter: '' }); expect(rules).toEqual([result1, result2]); }); }); @@ -209,11 +185,7 @@ describe('get_existing_prepackaged_rules', () => { test('it returns a count', async () => { const alertsClient = alertsClientMock.create(); alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const rules = await getRulesCount({ - alertsClient: unsafeCast, - filter: '', - }); + const rules = await getRulesCount({ alertsClient, filter: '' }); expect(rules).toEqual(1); }); }); @@ -222,10 +194,7 @@ describe('get_existing_prepackaged_rules', () => { test('it returns a count', async () => { const alertsClient = alertsClientMock.create(); alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const rules = await getNonPackagedRulesCount({ - alertsClient: unsafeCast, - }); + const rules = await getNonPackagedRulesCount({ alertsClient }); expect(rules).toEqual(1); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_export_all.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_export_all.test.ts index ff48b9f5f7c33..35d3489dad6fc 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_export_all.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_export_all.test.ts @@ -10,7 +10,6 @@ import { getFindResultWithSingleHit, FindHit, } from '../routes/__mocks__/request_responses'; -import { AlertsClient } from '../../../../../alerting'; import { getExportAll } from './get_export_all'; describe('getExportAll', () => { @@ -19,8 +18,7 @@ describe('getExportAll', () => { alertsClient.get.mockResolvedValue(getResult()); alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const exports = await getExportAll(unsafeCast); + const exports = await getExportAll(alertsClient); expect(exports).toEqual({ rulesNdjson: '{"created_at":"2019-12-13T16:40:33.400Z","updated_at":"2019-12-13T16:40:33.400Z","created_by":"elastic","description":"Detecting root and admin users","enabled":true,"false_positives":[],"filters":[{"query":{"match_phrase":{"host.name":"some-host"}}}],"from":"now-6m","id":"04128c15-0d1b-4716-a4c5-46997ac7f3bd","immutable":false,"index":["auditbeat-*","filebeat-*","packetbeat-*","winlogbeat-*"],"interval":"5m","rule_id":"rule-1","language":"kuery","output_index":".siem-signals","max_signals":100,"risk_score":50,"name":"Detect Root/Admin Users","query":"user.name: root or user.name: admin","references":["http://www.example.com","https://ww.example.com"],"saved_id":"some-id","timeline_id":"some-timeline-id","timeline_title":"some-timeline-title","meta":{"someMeta":"someField"},"severity":"high","updated_by":"elastic","tags":[],"to":"now","type":"query","threat":[{"framework":"MITRE ATT&CK","tactic":{"id":"TA0040","name":"impact","reference":"https://attack.mitre.org/tactics/TA0040/"},"technique":[{"id":"T1499","name":"endpoint denial of service","reference":"https://attack.mitre.org/techniques/T1499/"}]}],"version":1}\n', @@ -39,8 +37,7 @@ describe('getExportAll', () => { alertsClient.find.mockResolvedValue(findResult); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const exports = await getExportAll(unsafeCast); + const exports = await getExportAll(alertsClient); expect(exports).toEqual({ rulesNdjson: '', exportDetails: '{"exported_count":0,"missing_rules":[],"missing_rules_count":0}\n', diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_export_by_object_ids.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_export_by_object_ids.test.ts index 236d04acc782b..4b6ea527a2027 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_export_by_object_ids.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_export_by_object_ids.test.ts @@ -11,7 +11,6 @@ import { getFindResultWithSingleHit, FindHit, } from '../routes/__mocks__/request_responses'; -import { AlertsClient } from '../../../../../alerting'; describe('get_export_by_object_ids', () => { describe('getExportByObjectIds', () => { @@ -20,9 +19,8 @@ describe('get_export_by_object_ids', () => { alertsClient.get.mockResolvedValue(getResult()); alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; const objects = [{ rule_id: 'rule-1' }]; - const exports = await getExportByObjectIds(unsafeCast, objects); + const exports = await getExportByObjectIds(alertsClient, objects); expect(exports).toEqual({ rulesNdjson: '{"created_at":"2019-12-13T16:40:33.400Z","updated_at":"2019-12-13T16:40:33.400Z","created_by":"elastic","description":"Detecting root and admin users","enabled":true,"false_positives":[],"filters":[{"query":{"match_phrase":{"host.name":"some-host"}}}],"from":"now-6m","id":"04128c15-0d1b-4716-a4c5-46997ac7f3bd","immutable":false,"index":["auditbeat-*","filebeat-*","packetbeat-*","winlogbeat-*"],"interval":"5m","rule_id":"rule-1","language":"kuery","output_index":".siem-signals","max_signals":100,"risk_score":50,"name":"Detect Root/Admin Users","query":"user.name: root or user.name: admin","references":["http://www.example.com","https://ww.example.com"],"saved_id":"some-id","timeline_id":"some-timeline-id","timeline_title":"some-timeline-title","meta":{"someMeta":"someField"},"severity":"high","updated_by":"elastic","tags":[],"to":"now","type":"query","threat":[{"framework":"MITRE ATT&CK","tactic":{"id":"TA0040","name":"impact","reference":"https://attack.mitre.org/tactics/TA0040/"},"technique":[{"id":"T1499","name":"endpoint denial of service","reference":"https://attack.mitre.org/techniques/T1499/"}]}],"version":1}\n', @@ -45,9 +43,8 @@ describe('get_export_by_object_ids', () => { alertsClient.get.mockResolvedValue(getResult()); alertsClient.find.mockResolvedValue(findResult); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; const objects = [{ rule_id: 'rule-1' }]; - const exports = await getExportByObjectIds(unsafeCast, objects); + const exports = await getExportByObjectIds(alertsClient, objects); expect(exports).toEqual({ rulesNdjson: '', exportDetails: @@ -62,9 +59,8 @@ describe('get_export_by_object_ids', () => { alertsClient.get.mockResolvedValue(getResult()); alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; const objects = [{ rule_id: 'rule-1' }]; - const exports = await getRulesFromObjects(unsafeCast, objects); + const exports = await getRulesFromObjects(alertsClient, objects); const expected: RulesErrors = { exportedCount: 1, missingRules: [], @@ -138,9 +134,8 @@ describe('get_export_by_object_ids', () => { alertsClient.get.mockResolvedValue(result); alertsClient.find.mockResolvedValue(findResult); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; const objects = [{ rule_id: 'rule-1' }]; - const exports = await getRulesFromObjects(unsafeCast, objects); + const exports = await getRulesFromObjects(alertsClient, objects); const expected: RulesErrors = { exportedCount: 0, missingRules: [{ rule_id: 'rule-1' }], @@ -162,9 +157,8 @@ describe('get_export_by_object_ids', () => { alertsClient.get.mockRejectedValue({ output: { statusCode: 404 } }); alertsClient.find.mockResolvedValue(findResult); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; const objects = [{ rule_id: 'rule-1' }]; - const exports = await getRulesFromObjects(unsafeCast, objects); + const exports = await getRulesFromObjects(alertsClient, objects); const expected: RulesErrors = { exportedCount: 0, missingRules: [{ rule_id: 'rule-1' }], diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/read_rules.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/read_rules.test.ts index 6ba0aa95bdd7b..c637860c5646a 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/read_rules.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/read_rules.test.ts @@ -6,7 +6,6 @@ import { alertsClientMock } from '../../../../../alerting/server/alerts_client.mock'; import { readRules } from './read_rules'; -import { AlertsClient } from '../../../../../alerting'; import { getResult, getFindResultWithSingleHit } from '../routes/__mocks__/request_responses'; describe('read_rules', () => { @@ -15,9 +14,8 @@ describe('read_rules', () => { const alertsClient = alertsClientMock.create(); alertsClient.get.mockResolvedValue(getResult()); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; const rule = await readRules({ - alertsClient: unsafeCast, + alertsClient, id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', ruleId: undefined, }); @@ -28,9 +26,8 @@ describe('read_rules', () => { const alertsClient = alertsClientMock.create(); alertsClient.get.mockResolvedValue(getResult()); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; const rule = await readRules({ - alertsClient: unsafeCast, + alertsClient, id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', ruleId: null, }); @@ -42,9 +39,8 @@ describe('read_rules', () => { alertsClient.get.mockResolvedValue(getResult()); alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; const rule = await readRules({ - alertsClient: unsafeCast, + alertsClient, id: undefined, ruleId: 'rule-1', }); @@ -56,9 +52,8 @@ describe('read_rules', () => { alertsClient.get.mockResolvedValue(getResult()); alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; const rule = await readRules({ - alertsClient: unsafeCast, + alertsClient, id: null, ruleId: 'rule-1', }); @@ -70,9 +65,8 @@ describe('read_rules', () => { alertsClient.get.mockResolvedValue(getResult()); alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; const rule = await readRules({ - alertsClient: unsafeCast, + alertsClient, id: null, ruleId: null, }); @@ -84,9 +78,8 @@ describe('read_rules', () => { alertsClient.get.mockResolvedValue(getResult()); alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; const rule = await readRules({ - alertsClient: unsafeCast, + alertsClient, id: undefined, ruleId: undefined, }); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/tags/read_tags.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/tags/read_tags.test.ts index 87739bf785012..940011924de79 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/tags/read_tags.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/tags/read_tags.test.ts @@ -5,7 +5,6 @@ */ import { alertsClientMock } from '../../../../../alerting/server/alerts_client.mock'; -import { AlertsClient } from '../../../../../alerting'; import { getResult, getFindResultWithMultiHits } from '../routes/__mocks__/request_responses'; import { INTERNAL_RULE_ID_KEY, INTERNAL_IDENTIFIER } from '../../../../common/constants'; import { readRawTags, readTags, convertTagsToSet, convertToTags, isTags } from './read_tags'; @@ -30,10 +29,7 @@ describe('read_tags', () => { const alertsClient = alertsClientMock.create(); alertsClient.find.mockResolvedValue(getFindResultWithMultiHits({ data: [result1, result2] })); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const tags = await readRawTags({ - alertsClient: unsafeCast, - }); + const tags = await readRawTags({ alertsClient }); expect(tags).toEqual(['tag 1', 'tag 2', 'tag 3', 'tag 4']); }); @@ -51,10 +47,7 @@ describe('read_tags', () => { const alertsClient = alertsClientMock.create(); alertsClient.find.mockResolvedValue(getFindResultWithMultiHits({ data: [result1, result2] })); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const tags = await readRawTags({ - alertsClient: unsafeCast, - }); + const tags = await readRawTags({ alertsClient }); expect(tags).toEqual(['tag 1', 'tag 2', 'tag 3', 'tag 4']); }); @@ -72,10 +65,7 @@ describe('read_tags', () => { const alertsClient = alertsClientMock.create(); alertsClient.find.mockResolvedValue(getFindResultWithMultiHits({ data: [result1, result2] })); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const tags = await readRawTags({ - alertsClient: unsafeCast, - }); + const tags = await readRawTags({ alertsClient }); expect(tags).toEqual([]); }); @@ -88,10 +78,7 @@ describe('read_tags', () => { const alertsClient = alertsClientMock.create(); alertsClient.find.mockResolvedValue(getFindResultWithMultiHits({ data: [result1] })); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const tags = await readRawTags({ - alertsClient: unsafeCast, - }); + const tags = await readRawTags({ alertsClient }); expect(tags).toEqual(['tag 1', 'tag 2']); }); @@ -104,10 +91,7 @@ describe('read_tags', () => { const alertsClient = alertsClientMock.create(); alertsClient.find.mockResolvedValue(getFindResultWithMultiHits({ data: [result1] })); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const tags = await readRawTags({ - alertsClient: unsafeCast, - }); + const tags = await readRawTags({ alertsClient }); expect(tags).toEqual([]); }); }); @@ -127,10 +111,7 @@ describe('read_tags', () => { const alertsClient = alertsClientMock.create(); alertsClient.find.mockResolvedValue(getFindResultWithMultiHits({ data: [result1, result2] })); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const tags = await readTags({ - alertsClient: unsafeCast, - }); + const tags = await readTags({ alertsClient }); expect(tags).toEqual(['tag 1', 'tag 2', 'tag 3', 'tag 4']); }); @@ -148,10 +129,7 @@ describe('read_tags', () => { const alertsClient = alertsClientMock.create(); alertsClient.find.mockResolvedValue(getFindResultWithMultiHits({ data: [result1, result2] })); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const tags = await readTags({ - alertsClient: unsafeCast, - }); + const tags = await readTags({ alertsClient }); expect(tags).toEqual(['tag 1', 'tag 2', 'tag 3', 'tag 4']); }); @@ -169,10 +147,7 @@ describe('read_tags', () => { const alertsClient = alertsClientMock.create(); alertsClient.find.mockResolvedValue(getFindResultWithMultiHits({ data: [result1, result2] })); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const tags = await readTags({ - alertsClient: unsafeCast, - }); + const tags = await readTags({ alertsClient }); expect(tags).toEqual([]); }); @@ -185,10 +160,7 @@ describe('read_tags', () => { const alertsClient = alertsClientMock.create(); alertsClient.find.mockResolvedValue(getFindResultWithMultiHits({ data: [result1] })); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const tags = await readTags({ - alertsClient: unsafeCast, - }); + const tags = await readTags({ alertsClient }); expect(tags).toEqual(['tag 1', 'tag 2']); }); @@ -201,10 +173,7 @@ describe('read_tags', () => { const alertsClient = alertsClientMock.create(); alertsClient.find.mockResolvedValue(getFindResultWithMultiHits({ data: [result1] })); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const tags = await readTags({ - alertsClient: unsafeCast, - }); + const tags = await readTags({ alertsClient }); expect(tags).toEqual([]); }); @@ -221,10 +190,7 @@ describe('read_tags', () => { const alertsClient = alertsClientMock.create(); alertsClient.find.mockResolvedValue(getFindResultWithMultiHits({ data: [result1] })); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const tags = await readTags({ - alertsClient: unsafeCast, - }); + const tags = await readTags({ alertsClient }); expect(tags).toEqual(['tag 1']); }); @@ -257,10 +223,7 @@ describe('read_tags', () => { const alertsClient = alertsClientMock.create(); alertsClient.find.mockResolvedValue(getFindResultWithMultiHits({ data: [result1] })); - const unsafeCast: AlertsClient = (alertsClient as unknown) as AlertsClient; - const tags = await readTags({ - alertsClient: unsafeCast, - }); + const tags = await readTags({ alertsClient }); expect(tags).toEqual(['tag 1', 'tag 2', 'tag 3', 'tag 4', 'tag 5']); }); }); From 0e98dae05f341c83aeb059d21cc4a9a62fd9d756 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Mon, 10 Feb 2020 12:32:48 -0600 Subject: [PATCH 36/39] Return the 'default' space even when spaces are disabled This will allow users with spaces disabled to enable spaces without losing data. The tradeoff is that they may be surprised when signals don't exist within their configured xpack.siem.signalsIndex. --- .../server/lib/detection_engine/routes/utils.test.ts | 9 +-------- .../siem/server/lib/detection_engine/routes/utils.ts | 9 +++------ x-pack/legacy/plugins/siem/server/services/clients.ts | 6 ++++-- 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.test.ts index f2f44a378d76b..899419b8fa5e6 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.test.ts @@ -287,14 +287,7 @@ describe('utils', () => { }); }); - it('returns the configured index if spaces are disabled', () => { - const getSpaceId = jest.fn(() => undefined); - const index = getIndex(getSpaceId, mockConfig); - - expect(index).toEqual('mockSignalsIndex'); - }); - - it('appends the space id to the configured index if spaces are enabled', () => { + it('appends the space id to the configured index', () => { const getSpaceId = jest.fn(() => 'myspace'); const index = getIndex(getSpaceId, mockConfig); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts index bc7e36397d67c..db24256b6afd7 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/utils.ts @@ -157,12 +157,9 @@ export const transformBulkError = ( } }; -export const getIndex = ( - getSpaceId: () => string | undefined, - config: LegacyServices['config'] -): string => { - const spaceId = getSpaceId(); +export const getIndex = (getSpaceId: () => string, config: LegacyServices['config']): string => { const signalsIndex = config().get(`xpack.${APP_ID}.${SIGNALS_INDEX_KEY}`); + const spaceId = getSpaceId(); - return spaceId ? `${signalsIndex}-${spaceId}` : signalsIndex; + return `${signalsIndex}-${spaceId}`; }; diff --git a/x-pack/legacy/plugins/siem/server/services/clients.ts b/x-pack/legacy/plugins/siem/server/services/clients.ts index d76f8e4b68021..cb78f6e5c7838 100644 --- a/x-pack/legacy/plugins/siem/server/services/clients.ts +++ b/x-pack/legacy/plugins/siem/server/services/clients.ts @@ -18,7 +18,7 @@ import { CoreStart, StartPlugins, SetupPlugins } from '../plugin'; export interface Clients { actionsClient?: ActionsClient; clusterClient: IScopedClusterClient; - spacesClient: { getSpaceId: () => string | undefined }; + spacesClient: { getSpaceId: () => string }; savedObjectsClient: SavedObjectsClientContract; } interface LegacyClients { @@ -58,7 +58,9 @@ export class ClientsService { actionsClient: await this.actions?.getActionsClientWithRequest?.(kibanaRequest), clusterClient: this.clusterClient!.asScoped(kibanaRequest), savedObjectsClient: this.savedObjects!.getScopedClient(kibanaRequest), - spacesClient: { getSpaceId: () => this.spacesService?.getSpaceId?.(kibanaRequest) }, + spacesClient: { + getSpaceId: () => this.spacesService?.getSpaceId?.(kibanaRequest) ?? 'default', + }, }; }; } From f53e6f72a0bbebd97c5b5a2da3bccd087107c74e Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Wed, 12 Feb 2020 18:29:17 -0600 Subject: [PATCH 37/39] Account for spaces being disabled in ClientsService * Updates types to reflect that spaces may be unavailable * Adds a test for getSpaceId's behavior when spaces are disabled --- x-pack/legacy/plugins/siem/server/plugin.ts | 2 +- .../siem/server/services/clients.test.ts | 32 +++++++++++++++++++ .../plugins/siem/server/services/clients.ts | 10 +++--- 3 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 x-pack/legacy/plugins/siem/server/services/clients.test.ts diff --git a/x-pack/legacy/plugins/siem/server/plugin.ts b/x-pack/legacy/plugins/siem/server/plugin.ts index 3221adbf12539..e15248e5200ee 100644 --- a/x-pack/legacy/plugins/siem/server/plugin.ts +++ b/x-pack/legacy/plugins/siem/server/plugin.ts @@ -37,7 +37,7 @@ export interface SetupPlugins { encryptedSavedObjects: EncryptedSavedObjectsSetup; features: FeaturesSetup; security: SecuritySetup; - spaces: SpacesSetup; + spaces?: SpacesSetup; } export interface StartPlugins { diff --git a/x-pack/legacy/plugins/siem/server/services/clients.test.ts b/x-pack/legacy/plugins/siem/server/services/clients.test.ts new file mode 100644 index 0000000000000..7f63a8f5e949c --- /dev/null +++ b/x-pack/legacy/plugins/siem/server/services/clients.test.ts @@ -0,0 +1,32 @@ +/* + * 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 { coreMock, httpServerMock } from '../../../../../../src/core/server/mocks'; +import { actionsMock } from '../../../../../plugins/actions/server/mocks'; + +import { ClientsService } from './clients'; + +describe('ClientsService', () => { + describe('spacesClient', () => { + describe('#getSpaceId', () => { + it('returns the default spaceId if spaces are disabled', async () => { + const clients = new ClientsService(); + + const actions = actionsMock.createStart(); + const { elasticsearch } = coreMock.createSetup(); + const { savedObjects } = coreMock.createStart(); + const request = httpServerMock.createRawRequest(); + const spacesService = undefined; + + clients.setup(elasticsearch.dataClient, spacesService); + clients.start(savedObjects, actions); + + const { spacesClient } = await clients.createGetScoped()(request); + expect(spacesClient.getSpaceId()).toEqual('default'); + }); + }); + }); +}); diff --git a/x-pack/legacy/plugins/siem/server/services/clients.ts b/x-pack/legacy/plugins/siem/server/services/clients.ts index cb78f6e5c7838..ca50eda4e7a6c 100644 --- a/x-pack/legacy/plugins/siem/server/services/clients.ts +++ b/x-pack/legacy/plugins/siem/server/services/clients.ts @@ -13,7 +13,8 @@ import { } from '../../../../../../src/core/server'; import { ActionsClient } from '../../../../../plugins/actions/server'; import { AlertsClient } from '../../../../../legacy/plugins/alerting/server'; -import { CoreStart, StartPlugins, SetupPlugins } from '../plugin'; +import { SpacesServiceSetup } from '../../../../../plugins/spaces/server'; +import { CoreStart, StartPlugins } from '../plugin'; export interface Clients { actionsClient?: ActionsClient; @@ -30,12 +31,9 @@ export class ClientsService { private actions?: StartPlugins['actions']; private clusterClient?: IClusterClient; private savedObjects?: CoreStart['savedObjects']; - private spacesService?: SetupPlugins['spaces']['spacesService']; + private spacesService?: SpacesServiceSetup; - public setup( - clusterClient: IClusterClient, - spacesService: SetupPlugins['spaces']['spacesService'] - ) { + public setup(clusterClient: IClusterClient, spacesService?: SpacesServiceSetup) { this.clusterClient = clusterClient; this.spacesService = spacesService; } From 56fc3f5292a0893138b4e98af7116b02c671e057 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Thu, 13 Feb 2020 17:20:36 -0600 Subject: [PATCH 38/39] Fix false positives in query signals routes tests * Refactors mock expectations so that they're actually evaluated; they can't go within a mockImplementation call as it's evaluated in the wrong scope. * Fixes duplicated test to use the proper assertions --- .../signals/query_signals_route.test.ts | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.test.ts index d245d45d30c1e..9439adfcec3cb 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.test.ts @@ -40,37 +40,42 @@ describe('query for signal', () => { describe('query and agg on signals index', () => { test('returns 200 when using single query', async () => { - clients.clusterClient.callAsCurrentUser.mockImplementation((endpoint, params) => { - expect(params!.body).toMatchObject({ ...typicalSignalsQueryAggs() }); - return Promise.resolve(true); - }); - const { statusCode } = await server.inject(getSignalsAggsQueryRequest()); + const { statusCode } = await server.inject(getSignalsQueryRequest()); + expect(statusCode).toBe(200); + expect(clients.clusterClient.callAsCurrentUser).toHaveBeenCalledWith( + 'search', + expect.objectContaining({ body: typicalSignalsQuery() }) + ); expect(myUtils.getIndex).toHaveReturnedWith('fakeindex'); }); test('returns 200 when using single agg', async () => { - clients.clusterClient.callAsCurrentUser.mockImplementation((endpoint, params) => { - expect(params!.body).toMatchObject({ ...typicalSignalsQueryAggs() }); - return Promise.resolve(true); - }); const { statusCode } = await server.inject(getSignalsAggsQueryRequest()); + expect(statusCode).toBe(200); + expect(clients.clusterClient.callAsCurrentUser).toHaveBeenCalledWith( + 'search', + expect.objectContaining({ body: typicalSignalsQueryAggs() }) + ); expect(myUtils.getIndex).toHaveReturnedWith('fakeindex'); }); test('returns 200 when using aggs and query together', async () => { - const allTogether = getSignalsQueryRequest(); - allTogether.payload = { ...typicalSignalsQueryAggs(), ...typicalSignalsQuery() }; - clients.clusterClient.callAsCurrentUser.mockImplementation((endpoint, params) => { - expect(params!.body).toMatchObject({ - ...typicalSignalsQueryAggs(), - ...typicalSignalsQuery(), - }); - return Promise.resolve(true); - }); - const { statusCode } = await server.inject(allTogether); + const request = getSignalsQueryRequest(); + request.payload = { ...typicalSignalsQueryAggs(), ...typicalSignalsQuery() }; + const { statusCode } = await server.inject(request); + expect(statusCode).toBe(200); + expect(clients.clusterClient.callAsCurrentUser).toHaveBeenCalledWith( + 'search', + expect.objectContaining({ + body: { + ...typicalSignalsQuery(), + ...typicalSignalsQueryAggs(), + }, + }) + ); expect(myUtils.getIndex).toHaveReturnedWith('fakeindex'); }); From 716252882e3cd2ee44ea9d2231acaecec5021683 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Thu, 13 Feb 2020 17:38:02 -0600 Subject: [PATCH 39/39] style: Prefer null coalescing over ternary --- .../detection_engine/routes/rules/create_rules_bulk_route.ts | 3 +-- .../lib/detection_engine/routes/rules/create_rules_route.ts | 3 +-- .../detection_engine/routes/rules/update_rules_bulk_route.ts | 3 +-- .../lib/detection_engine/routes/rules/update_rules_route.ts | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts index 057c5fde5b599..51b7b132fc794 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts @@ -81,8 +81,7 @@ export const createCreateRulesBulkRoute = ( } = payloadRule; const ruleIdOrUuid = ruleId ?? uuid.v4(); try { - const finalIndex = - outputIndex != null ? outputIndex : getIndex(spacesClient.getSpaceId, config); + const finalIndex = outputIndex ?? getIndex(spacesClient.getSpaceId, config); const indexExists = await getIndexExists(clusterClient.callAsCurrentUser, finalIndex); if (!indexExists) { return createBulkErrorObject({ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts index 758f82bdbce80..19e772165628d 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts @@ -75,8 +75,7 @@ export const createCreateRulesRoute = ( return headers.response().code(404); } - const finalIndex = - outputIndex != null ? outputIndex : getIndex(spacesClient.getSpaceId, config); + const finalIndex = outputIndex ?? getIndex(spacesClient.getSpaceId, config); const indexExists = await getIndexExists(clusterClient.callAsCurrentUser, finalIndex); if (!indexExists) { return headers diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts index 2f15454d96606..98ed01474c3dc 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts @@ -74,8 +74,7 @@ export const createUpdateRulesBulkRoute = ( references, version, } = payloadRule; - const finalIndex = - outputIndex != null ? outputIndex : getIndex(spacesClient.getSpaceId, config); + const finalIndex = outputIndex ?? getIndex(spacesClient.getSpaceId, config); const idOrRuleIdOrUnknown = id ?? ruleId ?? '(unknown id)'; try { const rule = await updateRules({ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts index 4842bd1caa5b8..80fdfc1df8e0e 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts @@ -70,8 +70,7 @@ export const createUpdateRulesRoute = ( return headers.response().code(404); } - const finalIndex = - outputIndex != null ? outputIndex : getIndex(spacesClient.getSpaceId, config); + const finalIndex = outputIndex ?? getIndex(spacesClient.getSpaceId, config); const rule = await updateRules({ alertsClient, actionsClient,