Skip to content

Commit b1ab09f

Browse files
Merge branch 'cases-rbac-poc' of github.com:elastic/kibana into cases-rbac-audit-log
2 parents 01c2edf + 4f3c37e commit b1ab09f

65 files changed

Lines changed: 2077 additions & 2038 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

x-pack/plugins/cases/server/authorization/utils.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
*/
77

88
import { remove, uniq } from 'lodash';
9-
import { nodeBuilder } from '../../../../../src/plugins/data/common';
10-
import { KueryNode } from '../../../../../src/plugins/data/server';
9+
import { nodeBuilder, KueryNode } from '../../../../../src/plugins/data/common';
1110

1211
export const getOwnersFilter = (savedObjectType: string, owners: string[]): KueryNode => {
1312
return nodeBuilder.or(
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0; you may not use this file except in compliance with the Elastic License
5+
* 2.0.
6+
*/
7+
8+
import { CaseStatuses } from '../../../common/api';
9+
import { AlertInfo } from '../../common';
10+
import { CasesClientGetAlertsResponse } from './types';
11+
import { get } from './get';
12+
import { updateStatus } from './update_status';
13+
import { CasesClientArgs } from '../types';
14+
15+
/**
16+
* Defines the fields necessary to update an alert's status.
17+
*/
18+
export interface UpdateAlertRequest {
19+
id: string;
20+
index: string;
21+
status: CaseStatuses;
22+
}
23+
24+
export interface AlertUpdateStatus {
25+
alerts: UpdateAlertRequest[];
26+
}
27+
28+
export interface AlertGet {
29+
alertsInfo: AlertInfo[];
30+
}
31+
32+
export interface AlertSubClient {
33+
get(args: AlertGet): Promise<CasesClientGetAlertsResponse>;
34+
updateStatus(args: AlertUpdateStatus): Promise<void>;
35+
}
36+
37+
export const createAlertsSubClient = (args: CasesClientArgs): AlertSubClient => {
38+
const { alertsService, scopedClusterClient, logger } = args;
39+
40+
const alertsSubClient: AlertSubClient = {
41+
get: (params: AlertGet) =>
42+
get({
43+
...params,
44+
alertsService,
45+
scopedClusterClient,
46+
logger,
47+
}),
48+
updateStatus: (params: AlertUpdateStatus) =>
49+
updateStatus({
50+
...params,
51+
alertsService,
52+
scopedClusterClient,
53+
logger,
54+
}),
55+
};
56+
57+
return Object.freeze(alertsSubClient);
58+
};

x-pack/plugins/cases/server/client/alerts/update_status.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ describe('updateAlertsStatus', () => {
1414
const savedObjectsClient = createMockSavedObjectsRepository();
1515

1616
const casesClient = await createCasesClientWithMockSavedObjectsClient({ savedObjectsClient });
17-
await casesClient.client.updateAlertsStatus({
17+
await casesClient.client.updateStatus({
1818
alerts: [{ id: 'alert-id-1', index: '.siem-signals', status: CaseStatuses.closed }],
1919
});
2020

x-pack/plugins/cases/server/client/alerts/update_status.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import { ElasticsearchClient, Logger } from 'src/core/server';
99
import { AlertServiceContract } from '../../services';
10-
import { UpdateAlertRequest } from '../types';
10+
import { UpdateAlertRequest } from './client';
1111

1212
interface UpdateAlertsStatusArgs {
1313
alertsService: AlertServiceContract;
@@ -16,7 +16,7 @@ interface UpdateAlertsStatusArgs {
1616
logger: Logger;
1717
}
1818

19-
export const updateAlertsStatus = async ({
19+
export const updateStatus = async ({
2020
alertsService,
2121
alerts,
2222
scopedClusterClient,

x-pack/plugins/cases/server/client/comments/add.test.ts renamed to x-pack/plugins/cases/server/client/attachments/add.test.ts

File renamed without changes.

x-pack/plugins/cases/server/client/comments/add.ts renamed to x-pack/plugins/cases/server/client/attachments/add.ts

Lines changed: 59 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ import {
3232
buildCommentUserActionItem,
3333
} from '../../services/user_actions/helpers';
3434

35-
import { CaseServiceSetup, CaseUserActionServiceSetup } from '../../services';
35+
import { AttachmentService, CaseService, CaseUserActionService } from '../../services';
3636
import { CommentableCase, createAlertUpdateRequest } from '../../common';
37-
import { CasesClientHandler } from '..';
37+
import { CasesClientArgs, CasesClientInternal } from '..';
3838
import { createCaseError } from '../../common/error';
3939
import {
4040
MAX_GENERATED_ALERTS_PER_SUB_CASE,
@@ -50,17 +50,17 @@ async function getSubCase({
5050
userActionService,
5151
user,
5252
}: {
53-
caseService: CaseServiceSetup;
53+
caseService: CaseService;
5454
savedObjectsClient: SavedObjectsClientContract;
5555
caseId: string;
5656
createdAt: string;
57-
userActionService: CaseUserActionServiceSetup;
57+
userActionService: CaseUserActionService;
5858
user: User;
5959
}): Promise<SavedObject<SubCaseAttributes>> {
6060
const mostRecentSubCase = await caseService.getMostRecentSubCase(savedObjectsClient, caseId);
6161
if (mostRecentSubCase && mostRecentSubCase.attributes.status !== CaseStatuses.closed) {
6262
const subCaseAlertsAttachement = await caseService.getAllSubCaseComments({
63-
client: savedObjectsClient,
63+
soClient: savedObjectsClient,
6464
id: mostRecentSubCase.id,
6565
options: {
6666
fields: [],
@@ -79,13 +79,13 @@ async function getSubCase({
7979
}
8080

8181
const newSubCase = await caseService.createSubCase({
82-
client: savedObjectsClient,
82+
soClient: savedObjectsClient,
8383
createdAt,
8484
caseId,
8585
createdBy: user,
8686
});
87-
await userActionService.postUserActions({
88-
client: savedObjectsClient,
87+
await userActionService.bulkCreate({
88+
soClient: savedObjectsClient,
8989
actions: [
9090
buildCaseUserActionItem({
9191
action: 'create',
@@ -102,20 +102,22 @@ async function getSubCase({
102102
}
103103

104104
interface AddCommentFromRuleArgs {
105-
casesClient: CasesClientHandler;
105+
casesClientInternal: CasesClientInternal;
106106
caseId: string;
107107
comment: CommentRequestAlertType;
108108
savedObjectsClient: SavedObjectsClientContract;
109-
caseService: CaseServiceSetup;
110-
userActionService: CaseUserActionServiceSetup;
109+
attachmentService: AttachmentService;
110+
caseService: CaseService;
111+
userActionService: CaseUserActionService;
111112
logger: Logger;
112113
}
113114

114115
const addGeneratedAlerts = async ({
115116
savedObjectsClient,
117+
attachmentService,
116118
caseService,
117119
userActionService,
118-
casesClient,
120+
casesClientInternal,
119121
caseId,
120122
comment,
121123
logger,
@@ -136,7 +138,7 @@ const addGeneratedAlerts = async ({
136138
const createdDate = new Date().toISOString();
137139

138140
const caseInfo = await caseService.getCase({
139-
client: savedObjectsClient,
141+
soClient: savedObjectsClient,
140142
id: caseId,
141143
});
142144

@@ -167,7 +169,8 @@ const addGeneratedAlerts = async ({
167169
collection: caseInfo,
168170
subCase,
169171
soClient: savedObjectsClient,
170-
service: caseService,
172+
caseService,
173+
attachmentService,
171174
});
172175

173176
const {
@@ -184,13 +187,13 @@ const addGeneratedAlerts = async ({
184187
comment: query,
185188
status: subCase.attributes.status,
186189
});
187-
await casesClient.updateAlertsStatus({
190+
await casesClientInternal.alerts.updateStatus({
188191
alerts: alertsToUpdate,
189192
});
190193
}
191194

192-
await userActionService.postUserActions({
193-
client: savedObjectsClient,
195+
await userActionService.bulkCreate({
196+
soClient: savedObjectsClient,
194197
actions: [
195198
buildCommentUserActionItem({
196199
action: 'create',
@@ -216,25 +219,27 @@ const addGeneratedAlerts = async ({
216219
};
217220

218221
async function getCombinedCase({
219-
service,
220-
client,
222+
caseService,
223+
attachmentService,
224+
soClient,
221225
id,
222226
logger,
223227
}: {
224-
service: CaseServiceSetup;
225-
client: SavedObjectsClientContract;
228+
caseService: CaseService;
229+
attachmentService: AttachmentService;
230+
soClient: SavedObjectsClientContract;
226231
id: string;
227232
logger: Logger;
228233
}): Promise<CommentableCase> {
229234
const [casePromise, subCasePromise] = await Promise.allSettled([
230-
service.getCase({
231-
client,
235+
caseService.getCase({
236+
soClient,
232237
id,
233238
}),
234239
...(ENABLE_CASE_CONNECTOR
235240
? [
236-
service.getSubCase({
237-
client,
241+
caseService.getSubCase({
242+
soClient,
238243
id,
239244
}),
240245
]
@@ -243,16 +248,17 @@ async function getCombinedCase({
243248

244249
if (subCasePromise.status === 'fulfilled') {
245250
if (subCasePromise.value.references.length > 0) {
246-
const caseValue = await service.getCase({
247-
client,
251+
const caseValue = await caseService.getCase({
252+
soClient,
248253
id: subCasePromise.value.references[0].id,
249254
});
250255
return new CommentableCase({
251256
logger,
252257
collection: caseValue,
253258
subCase: subCasePromise.value,
254-
service,
255-
soClient: client,
259+
caseService,
260+
attachmentService,
261+
soClient,
256262
});
257263
} else {
258264
throw Boom.badRequest('Sub case found without reference to collection');
@@ -265,38 +271,39 @@ async function getCombinedCase({
265271
return new CommentableCase({
266272
logger,
267273
collection: casePromise.value,
268-
service,
269-
soClient: client,
274+
caseService,
275+
attachmentService,
276+
soClient,
270277
});
271278
}
272279
}
273280

274281
interface AddCommentArgs {
275-
casesClient: CasesClientHandler;
276282
caseId: string;
277283
comment: CommentRequest;
278-
savedObjectsClient: SavedObjectsClientContract;
279-
caseService: CaseServiceSetup;
280-
userActionService: CaseUserActionServiceSetup;
281-
user: User;
282-
logger: Logger;
284+
casesClientInternal: CasesClientInternal;
283285
}
284286

285287
export const addComment = async ({
286-
savedObjectsClient,
287-
caseService,
288-
userActionService,
289-
casesClient,
290288
caseId,
291289
comment,
292-
user,
293-
logger,
294-
}: AddCommentArgs): Promise<CaseResponse> => {
290+
casesClientInternal,
291+
...rest
292+
}: AddCommentArgs & CasesClientArgs): Promise<CaseResponse> => {
295293
const query = pipe(
296294
CommentRequestRt.decode(comment),
297295
fold(throwErrors(Boom.badRequest), identity)
298296
);
299297

298+
const {
299+
savedObjectsClient,
300+
caseService,
301+
userActionService,
302+
attachmentService,
303+
user,
304+
logger,
305+
} = rest;
306+
300307
if (isCommentRequestTypeGenAlert(comment)) {
301308
if (!ENABLE_CASE_CONNECTOR) {
302309
throw Boom.badRequest(
@@ -307,10 +314,11 @@ export const addComment = async ({
307314
return addGeneratedAlerts({
308315
caseId,
309316
comment,
310-
casesClient,
317+
casesClientInternal,
311318
savedObjectsClient,
312319
userActionService,
313320
caseService,
321+
attachmentService,
314322
logger,
315323
});
316324
}
@@ -320,8 +328,9 @@ export const addComment = async ({
320328
const createdDate = new Date().toISOString();
321329

322330
const combinedCase = await getCombinedCase({
323-
service: caseService,
324-
client: savedObjectsClient,
331+
caseService,
332+
attachmentService,
333+
soClient: savedObjectsClient,
325334
id: caseId,
326335
logger,
327336
});
@@ -346,13 +355,13 @@ export const addComment = async ({
346355
status: updatedCase.status,
347356
});
348357

349-
await casesClient.updateAlertsStatus({
358+
await casesClientInternal.alerts.updateStatus({
350359
alerts: alertsToUpdate,
351360
});
352361
}
353362

354-
await userActionService.postUserActions({
355-
client: savedObjectsClient,
363+
await userActionService.bulkCreate({
364+
soClient: savedObjectsClient,
356365
actions: [
357366
buildCommentUserActionItem({
358367
action: 'create',

0 commit comments

Comments
 (0)