Skip to content

Commit 2e42bdf

Browse files
authored
Merge branch 'main' into main
2 parents c42b1d4 + 74ebeca commit 2e42bdf

5 files changed

Lines changed: 63 additions & 11 deletions

File tree

x-pack/platform/plugins/private/file_upload/server/analyze_file.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ export async function analyzeFile(
3333
logger: Logger,
3434
data: InputData,
3535
overrides: InputOverrides,
36-
includePreview: boolean
36+
includePreview: boolean,
37+
abortSignal?: AbortSignal
3738
): Promise<AnalysisResult> {
3839
overrides.explain = overrides.explain === undefined ? 'true' : overrides.explain;
3940
const results = await client.asInternalUser.textStructure.findStructure(
@@ -42,7 +43,7 @@ export async function analyzeFile(
4243
ecs_compatibility: 'v1',
4344
...overrides,
4445
},
45-
{ maxRetries: 0 }
46+
{ maxRetries: 0, signal: abortSignal }
4647
);
4748

4849
const { hasOverrides, reducedOverrides } = formatOverrides(overrides);

x-pack/platform/plugins/private/file_upload/server/import_data.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,16 @@ export function importDataProvider({ asCurrentUser }: IScopedClusterClient) {
7777
async function importData(
7878
index: string,
7979
ingestPipelineId: string | undefined,
80-
data: InputData
80+
data: InputData,
81+
abortSignal?: AbortSignal
8182
): Promise<ImportResponse> {
8283
const docCount = data.length;
8384
const pipelineId = ingestPipelineId;
8485

8586
try {
8687
let failures: ImportFailure[] = [];
8788
if (data.length) {
88-
const resp = await indexData(index, pipelineId, data);
89+
const resp = await indexData(index, pipelineId, data, abortSignal);
8990
if (resp.success === false) {
9091
if (resp.ingestError) {
9192
// all docs failed, abort
@@ -147,7 +148,12 @@ export function importDataProvider({ asCurrentUser }: IScopedClusterClient) {
147148
}
148149
}
149150

150-
async function indexData(index: string, pipelineId: string | undefined, data: InputData) {
151+
async function indexData(
152+
index: string,
153+
pipelineId: string | undefined,
154+
data: InputData,
155+
abortSignal?: AbortSignal
156+
) {
151157
try {
152158
const body: BulkRequest['body'] = [];
153159
for (let i = 0; i < data.length; i++) {
@@ -163,6 +169,7 @@ export function importDataProvider({ asCurrentUser }: IScopedClusterClient) {
163169
const resp = await asCurrentUser.bulk(bulkRequest, {
164170
maxRetries: 0,
165171
requestTimeout: 3600000,
172+
signal: abortSignal,
166173
});
167174
if (resp.errors) {
168175
throw resp;

x-pack/platform/plugins/private/file_upload/server/routes.ts

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77

88
import { schema } from '@kbn/config-schema';
9-
import type { CoreSetup, Logger } from '@kbn/core/server';
9+
import type { CoreSetup, KibanaRequest, Logger } from '@kbn/core/server';
1010
import {
1111
MAX_FILE_SIZE_BYTES,
1212
MAX_TIKA_FILE_SIZE_BYTES,
@@ -30,6 +30,14 @@ import { checkFileUploadPrivileges } from './check_privileges';
3030
import { previewIndexTimeRange } from './preview_index_time_range';
3131
import { previewTikaContents } from './preview_tika_contents';
3232

33+
function getRequestAbortedSignal(request: KibanaRequest): AbortSignal {
34+
const controller = new AbortController();
35+
request.events.aborted$.subscribe(() => {
36+
controller.abort();
37+
});
38+
return controller.signal;
39+
}
40+
3341
/**
3442
* Routes for the file upload.
3543
*/
@@ -126,7 +134,8 @@ export function fileUploadRoutes(coreSetup: CoreSetup<StartDeps, unknown>, logge
126134
logger,
127135
request.body,
128136
omit(request.query, 'includePreview'),
129-
includePreview === true
137+
includePreview === true,
138+
getRequestAbortedSignal(request)
130139
);
131140
return response.ok({ body: result });
132141
} catch (e) {
@@ -282,7 +291,12 @@ export function fileUploadRoutes(coreSetup: CoreSetup<StartDeps, unknown>, logge
282291
return response.ok({ body });
283292
}
284293

285-
const result = await importData(index, ingestPipeline?.id ?? '', data);
294+
const result = await importData(
295+
index,
296+
ingestPipeline?.id ?? '',
297+
data,
298+
getRequestAbortedSignal(request)
299+
);
286300

287301
return response.ok({ body: result });
288302
} catch (e) {
@@ -312,7 +326,12 @@ export function fileUploadRoutes(coreSetup: CoreSetup<StartDeps, unknown>, logge
312326
const esClient = (await context.core).elasticsearch.client;
313327

314328
const { importData } = importDataProvider(esClient);
315-
const result = await importData(index, ingestPipelineId, data);
329+
const result = await importData(
330+
index,
331+
ingestPipelineId,
332+
data,
333+
getRequestAbortedSignal(request)
334+
);
316335

317336
return response.ok({ body: result });
318337
} catch (e) {

x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/alert_description.test.tsx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { useExpandableFlyoutApi } from '@kbn/expandable-flyout';
2222
import type { ExpandableFlyoutApi } from '@kbn/expandable-flyout';
2323
import { createTelemetryServiceMock } from '../../../../common/lib/telemetry/telemetry_service.mock';
2424
import { RulePreviewPanelKey, RULE_PREVIEW_BANNER } from '../../../rule_details/right';
25+
import { useUserPrivileges } from '../../../../common/components/user_privileges';
2526

2627
const mockedTelemetry = createTelemetryServiceMock();
2728
jest.mock('../../../../common/lib/kibana', () => {
@@ -35,6 +36,7 @@ jest.mock('../../../../common/lib/kibana', () => {
3536
});
3637

3738
jest.mock('@kbn/expandable-flyout');
39+
jest.mock('../../../../common/components/user_privileges');
3840

3941
const ruleUuid = {
4042
category: 'kibana',
@@ -91,6 +93,12 @@ describe('<AlertDescription />', () => {
9193
jest.mocked(useExpandableFlyoutApi).mockReturnValue(flyoutContextValue);
9294
});
9395

96+
beforeEach(() => {
97+
jest.mocked(useUserPrivileges).mockReturnValue({
98+
rulesPrivileges: { read: true },
99+
} as ReturnType<typeof useUserPrivileges>);
100+
});
101+
94102
it('should render the component', () => {
95103
const { getByTestId } = renderDescription(
96104
panelContextValue([ruleUuid, ruleDescription, ruleName])
@@ -158,5 +166,17 @@ describe('<AlertDescription />', () => {
158166
},
159167
});
160168
});
169+
170+
it('should render rule preview button as disabled if user does not have read privileges for rules', () => {
171+
jest.mocked(useUserPrivileges).mockReturnValue({
172+
rulesPrivileges: { read: false },
173+
} as ReturnType<typeof useUserPrivileges>);
174+
175+
const { getByTestId } = renderDescription(
176+
panelContextValue([ruleUuid, ruleDescription, ruleName])
177+
);
178+
expect(getByTestId(RULE_SUMMARY_BUTTON_TEST_ID)).toBeInTheDocument();
179+
expect(getByTestId(RULE_SUMMARY_BUTTON_TEST_ID)).toHaveAttribute('disabled');
180+
});
161181
});
162182
});

x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/right/components/alert_description.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { useExpandableFlyoutApi } from '@kbn/expandable-flyout';
1414
import { FormattedMessage } from '@kbn/i18n-react';
1515
import { i18n } from '@kbn/i18n';
1616
import { useKibana } from '../../../../common/lib/kibana';
17+
import { useUserPrivileges } from '../../../../common/components/user_privileges';
1718
import { useDocumentDetailsContext } from '../../shared/context';
1819
import { useBasicDataFromDetailsData } from '../../shared/hooks/use_basic_data_from_details_data';
1920
import {
@@ -33,7 +34,11 @@ export const AlertDescription: FC = () => {
3334
const { isAlert, ruleDescription, ruleName, ruleId } = useBasicDataFromDetailsData(
3435
dataFormattedForFieldBrowser
3536
);
37+
const { rulesPrivileges } = useUserPrivileges();
3638
const { openPreviewPanel } = useExpandableFlyoutApi();
39+
const ruleSummaryDisabled =
40+
isEmpty(ruleName) || isEmpty(ruleId) || isRulePreview || !rulesPrivileges?.read;
41+
3742
const openRulePreview = useCallback(() => {
3843
openPreviewPanel({
3944
id: RulePreviewPanelKey,
@@ -64,7 +69,7 @@ export const AlertDescription: FC = () => {
6469
defaultMessage: 'Show rule summary',
6570
}
6671
)}
67-
disabled={isEmpty(ruleName) || isEmpty(ruleId) || isRulePreview}
72+
disabled={ruleSummaryDisabled}
6873
>
6974
<FormattedMessage
7075
id="xpack.securitySolution.flyout.right.about.description.ruleSummaryButtonLabel"
@@ -73,7 +78,7 @@ export const AlertDescription: FC = () => {
7378
</EuiButtonEmpty>
7479
</EuiFlexItem>
7580
),
76-
[ruleName, openRulePreview, ruleId, isRulePreview]
81+
[openRulePreview, ruleSummaryDisabled]
7782
);
7883

7984
const alertRuleDescription =

0 commit comments

Comments
 (0)