Skip to content

Commit 1b8b97f

Browse files
authored
[Security Solution][Detection Engine][CPS] Rule Preview Issue Project Routing (elastic#259352)
## Summary Closes issue [elastic#258902](elastic#258902). Without `projectRouting: 'space'`, all three clients default to `_alias:_origin`, restricting preview searches to the origin project only. The fix passes `{ projectRouting: 'space' }` to each: - `scopedClusterClient`: fixes field caps and index resolution (pre-search checks in `run_execution_validation.ts`) - `searchSourceClient`: fixes data fetches for query/saved_query/threshold rule types - `asyncSearchClient`: fixes data fetches for EQL and ESQL rule types
1 parent ecea34b commit 1b8b97f

1 file changed

Lines changed: 13 additions & 6 deletions

File tree

  • x-pack/solutions/security/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules

x-pack/solutions/security/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,14 @@ export const previewRulesRoute = (
114114
return siemResponse.error({ statusCode: 400, body: validationErrors });
115115
}
116116
try {
117-
const [, { data, security: securityService, share, dataViews }] =
117+
const [coreStart, { data, security: securityService, share, dataViews }] =
118118
await getStartServices();
119-
const searchSourceClient = await data.search.searchSource.asScoped(request);
119+
const searchSourceClientWithCps = await data.search.searchSource.asScoped(request, {
120+
projectRouting: 'space',
121+
});
122+
const scopedClusterClientWithCps = coreStart.elasticsearch.client.asScoped(request, {
123+
projectRouting: 'space',
124+
});
120125
const savedObjectsClient = coreContext.savedObjects.client;
121126
const siemClient = (await context.securitySolution).getAppClient();
122127
const actionsClient = (await context.actions).getActionsClient();
@@ -274,20 +279,22 @@ export const previewRulesRoute = (
274279
savedObjectsClient: coreContext.savedObjects.client,
275280
scopedClusterClient: wrapScopedClusterClient({
276281
abortController,
277-
scopedClusterClient: coreContext.elasticsearch.client,
282+
scopedClusterClient: scopedClusterClientWithCps,
278283
}),
279284
getSearchSourceClient: async () =>
280285
wrapSearchSourceClient({
281286
abortController,
282-
searchSourceClient,
287+
searchSourceClient: searchSourceClientWithCps,
283288
}),
284289
getMaintenanceWindowIds: async () => [],
285290
getMaintenanceWindowNames: async () => [],
286291
uiSettingsClient: coreContext.uiSettings.client,
287292
getDataViews: async () => dataViewsService,
288293
share,
289294
getAsyncSearchClient: (strategy) => {
290-
const client = data.search.asScoped(request);
295+
const clientWithCps = data.search.asScoped(request, {
296+
projectRouting: 'space',
297+
});
291298
return wrapAsyncSearchClient({
292299
rule: {
293300
name: rule.name,
@@ -297,7 +304,7 @@ export const previewRulesRoute = (
297304
},
298305
logger,
299306
strategy,
300-
client,
307+
client: clientWithCps,
301308
abortController,
302309
});
303310
},

0 commit comments

Comments
 (0)