Skip to content

Commit 0347989

Browse files
author
Joel Griffith
authored
[7.x] [Reporting]: Move router + license checks to new platform (#66331) (#67818)
* [Reporting]: Move router + license checks to new platform (#66331) * WIP: Move routes to new API, license and other checks inbound * Move license checks over to np licensing observable * Fix license checks + remove older modules * Fixing check_license tests, move to TS/Jest * Fix licensing setup for mocks * Move job.test.ts over to np * WIP: move user checks to higher-order func * Move more handler logic over to Response factory vs Boom * Major refactor to consolidate types, remove facades, and udpate helpers * Fix validation for dates in immediate exports * Linter fix on check license test * Fix job generation tests * Move deps => setupDeps * fix api test * fix jobs test * authorized_user_pre_routing and tests * Fixing duplicate identifiers * Fix licensing implementation changes * WIP: Moving license over to async/observables * Fix disabled-security case * finish auth_user_pre_routing cleanup - no more license check * WIP: Fixing final api tests * Trying to get schema differences in alignment * Reverting back to previous generation handler * Fix final API tests * Final API test fixes, few more hardening tests and better error messages * Simplify lower-level module implementation (core only interface) + test updates * Push some core logic into plugin * Move some core logic up to plugin * Marking private setupDeps + downstream fixes * revert logger as a param Co-authored-by: Timothy Sullivan <[email protected]> # Conflicts: # x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/create_job/index.ts # x-pack/legacy/plugins/reporting/server/routes/generation.ts * Add back in legacy /viz /search and /dashboard routes * Add back in and fix compatibility shim/tests
1 parent 3ea33a3 commit 0347989

Some content is hidden

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

46 files changed

+1600
-1786
lines changed

x-pack/legacy/plugins/reporting/common/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export const WHITELISTED_JOB_CONTENT_TYPES = [
2727
'application/pdf',
2828
CONTENT_TYPE_CSV,
2929
'image/png',
30+
'text/plain',
3031
];
3132

3233
// See:

x-pack/legacy/plugins/reporting/export_types/csv/server/create_job.ts

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,27 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7+
import { KibanaRequest, RequestHandlerContext } from 'src/core/server';
78
import { ReportingCore } from '../../../server';
89
import { cryptoFactory } from '../../../server/lib';
9-
import {
10-
ConditionalHeaders,
11-
CreateJobFactory,
12-
ESQueueCreateJobFn,
13-
RequestFacade,
14-
} from '../../../server/types';
10+
import { CreateJobFactory, ESQueueCreateJobFn } from '../../../server/types';
1511
import { JobParamsDiscoverCsv } from '../types';
1612

1713
export const createJobFactory: CreateJobFactory<ESQueueCreateJobFn<
1814
JobParamsDiscoverCsv
1915
>> = function createJobFactoryFn(reporting: ReportingCore) {
2016
const config = reporting.getConfig();
2117
const crypto = cryptoFactory(config.get('encryptionKey'));
18+
const setupDeps = reporting.getPluginSetupDeps();
2219

2320
return async function createJob(
2421
jobParams: JobParamsDiscoverCsv,
25-
headers: ConditionalHeaders['headers'],
26-
request: RequestFacade
22+
context: RequestHandlerContext,
23+
request: KibanaRequest
2724
) {
28-
const serializedEncryptedHeaders = await crypto.encrypt(headers);
25+
const serializedEncryptedHeaders = await crypto.encrypt(request.headers);
2926

30-
const savedObjectsClient = request.getSavedObjectsClient();
27+
const savedObjectsClient = context.core.savedObjects.client;
3128
const indexPatternSavedObject = await savedObjectsClient.get(
3229
'index-pattern',
3330
jobParams.indexPatternId!
@@ -36,7 +33,7 @@ export const createJobFactory: CreateJobFactory<ESQueueCreateJobFn<
3633
return {
3734
headers: serializedEncryptedHeaders,
3835
indexPatternSavedObject,
39-
basePath: request.getBasePath(),
36+
basePath: setupDeps.basePath(request),
4037
...jobParams,
4138
};
4239
};

x-pack/legacy/plugins/reporting/export_types/csv_from_savedobject/server/create_job/create_job.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66

77
import { notFound, notImplemented } from 'boom';
88
import { get } from 'lodash';
9+
import { KibanaRequest, RequestHandlerContext } from 'src/core/server';
910
import { CSV_FROM_SAVEDOBJECT_JOB_TYPE } from '../../../../common/constants';
1011
import { ReportingCore } from '../../../../server';
1112
import { cryptoFactory, LevelLogger } from '../../../../server/lib';
12-
import { CreateJobFactory, RequestFacade, TimeRangeParams } from '../../../../server/types';
13+
import { CreateJobFactory, TimeRangeParams } from '../../../../server/types';
1314
import {
1415
JobDocPayloadPanelCsv,
1516
JobParamsPanelCsv,
@@ -23,8 +24,9 @@ import { createJobSearch } from './create_job_search';
2324

2425
export type ImmediateCreateJobFn<JobParamsType> = (
2526
jobParams: JobParamsType,
26-
headers: Record<string, string>,
27-
req: RequestFacade
27+
headers: KibanaRequest['headers'],
28+
context: RequestHandlerContext,
29+
req: KibanaRequest
2830
) => Promise<{
2931
type: string | null;
3032
title: string;
@@ -46,21 +48,21 @@ export const createJobFactory: CreateJobFactory<ImmediateCreateJobFn<
4648

4749
return async function createJob(
4850
jobParams: JobParamsPanelCsv,
49-
headers: any,
50-
req: RequestFacade
51+
headers: KibanaRequest['headers'],
52+
context: RequestHandlerContext,
53+
req: KibanaRequest
5154
): Promise<JobDocPayloadPanelCsv> {
5255
const { savedObjectType, savedObjectId } = jobParams;
5356
const serializedEncryptedHeaders = await crypto.encrypt(headers);
54-
const client = req.getSavedObjectsClient();
5557

5658
const { panel, title, visType }: VisData = await Promise.resolve()
57-
.then(() => client.get(savedObjectType, savedObjectId))
59+
.then(() => context.core.savedObjects.client.get(savedObjectType, savedObjectId))
5860
.then(async (savedObject: SavedObject) => {
5961
const { attributes, references } = savedObject;
6062
const {
6163
kibanaSavedObjectMeta: kibanaSavedObjectMetaJSON,
6264
} = attributes as SavedSearchObjectAttributesJSON;
63-
const { timerange } = req.payload as { timerange: TimeRangeParams };
65+
const { timerange } = req.body as { timerange: TimeRangeParams };
6466

6567
if (!kibanaSavedObjectMetaJSON) {
6668
throw new Error('Could not parse saved object data!');

x-pack/legacy/plugins/reporting/export_types/csv_from_savedobject/server/execute_job.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,11 @@
55
*/
66

77
import { i18n } from '@kbn/i18n';
8+
import { KibanaRequest, RequestHandlerContext } from 'src/core/server';
89
import { CONTENT_TYPE_CSV, CSV_FROM_SAVEDOBJECT_JOB_TYPE } from '../../../common/constants';
910
import { ReportingCore } from '../../../server';
1011
import { cryptoFactory, LevelLogger } from '../../../server/lib';
11-
import {
12-
ExecuteJobFactory,
13-
JobDocOutput,
14-
JobDocPayload,
15-
RequestFacade,
16-
} from '../../../server/types';
12+
import { ExecuteJobFactory, JobDocOutput, JobDocPayload } from '../../../server/types';
1713
import { CsvResultFromSearch } from '../../csv/types';
1814
import { FakeRequest, JobDocPayloadPanelCsv, JobParamsPanelCsv, SearchPanel } from '../types';
1915
import { createGenerateCsv } from './lib';
@@ -25,7 +21,8 @@ import { createGenerateCsv } from './lib';
2521
export type ImmediateExecuteFn<JobParamsType> = (
2622
jobId: null,
2723
job: JobDocPayload<JobParamsType>,
28-
request: RequestFacade
24+
context: RequestHandlerContext,
25+
req: KibanaRequest
2926
) => Promise<JobDocOutput>;
3027

3128
export const executeJobFactory: ExecuteJobFactory<ImmediateExecuteFn<
@@ -39,7 +36,8 @@ export const executeJobFactory: ExecuteJobFactory<ImmediateExecuteFn<
3936
return async function executeJob(
4037
jobId: string | null,
4138
job: JobDocPayloadPanelCsv,
42-
realRequest?: RequestFacade
39+
context,
40+
req
4341
): Promise<JobDocOutput> {
4442
// There will not be a jobID for "immediate" generation.
4543
// jobID is only for "queued" jobs
@@ -58,10 +56,11 @@ export const executeJobFactory: ExecuteJobFactory<ImmediateExecuteFn<
5856

5957
jobLogger.debug(`Execute job generating [${visType}] csv`);
6058

61-
let requestObject: RequestFacade | FakeRequest;
62-
if (isImmediate && realRequest) {
59+
let requestObject: KibanaRequest | FakeRequest;
60+
61+
if (isImmediate && req) {
6362
jobLogger.info(`Executing job from Immediate API using request context`);
64-
requestObject = realRequest;
63+
requestObject = req;
6564
} else {
6665
jobLogger.info(`Executing job async using encrypted headers`);
6766
let decryptedHeaders: Record<string, unknown>;
@@ -103,6 +102,7 @@ export const executeJobFactory: ExecuteJobFactory<ImmediateExecuteFn<
103102
let size = 0;
104103
try {
105104
const generateResults: CsvResultFromSearch = await generateCsv(
105+
context,
106106
requestObject,
107107
visType as string,
108108
panel,

x-pack/legacy/plugins/reporting/export_types/csv_from_savedobject/server/lib/generate_csv.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@
55
*/
66

77
import { badRequest } from 'boom';
8-
import { ReportingCore } from '../../../../server';
8+
import { KibanaRequest, RequestHandlerContext } from 'src/core/server';
99
import { LevelLogger } from '../../../../server/lib';
10-
import { RequestFacade } from '../../../../server/types';
10+
import { ReportingCore } from '../../../../server';
1111
import { FakeRequest, JobParamsPanelCsv, SearchPanel, VisPanel } from '../../types';
1212
import { generateCsvSearch } from './generate_csv_search';
1313

1414
export function createGenerateCsv(reporting: ReportingCore, logger: LevelLogger) {
1515
return async function generateCsv(
16-
request: RequestFacade | FakeRequest,
16+
context: RequestHandlerContext,
17+
request: KibanaRequest | FakeRequest,
1718
visType: string,
1819
panel: VisPanel | SearchPanel,
1920
jobParams: JobParamsPanelCsv
@@ -26,11 +27,12 @@ export function createGenerateCsv(reporting: ReportingCore, logger: LevelLogger)
2627
switch (visType) {
2728
case 'search':
2829
return await generateCsvSearch(
29-
request as RequestFacade,
3030
reporting,
31-
logger,
31+
context,
32+
request as KibanaRequest,
3233
panel as SearchPanel,
33-
jobParams
34+
jobParams,
35+
logger
3436
);
3537
default:
3638
throw badRequest(`Unsupported or unrecognized saved object type: ${visType}`);

x-pack/legacy/plugins/reporting/export_types/csv_from_savedobject/server/lib/generate_csv_search.ts

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7-
import { IUiSettingsClient, KibanaRequest } from '../../../../../../../../src/core/server';
7+
import {
8+
IUiSettingsClient,
9+
KibanaRequest,
10+
RequestHandlerContext,
11+
} from '../../../../../../../../src/core/server';
812
import {
913
esQuery,
1014
EsQueryConfig,
@@ -13,23 +17,16 @@ import {
1317
Query,
1418
} from '../../../../../../../../src/plugins/data/server';
1519
import { CancellationToken } from '../../../../../../../plugins/reporting/common';
16-
import { ReportingCore } from '../../../../server';
1720
import { LevelLogger } from '../../../../server/lib';
18-
import { RequestFacade } from '../../../../server/types';
21+
import { ReportingCore } from '../../../../server';
1922
import { createGenerateCsv } from '../../../csv/server/lib/generate_csv';
2023
import {
2124
CsvResultFromSearch,
2225
GenerateCsvParams,
2326
JobParamsDiscoverCsv,
2427
SearchRequest,
2528
} from '../../../csv/types';
26-
import {
27-
IndexPatternField,
28-
QueryFilter,
29-
SavedSearchObjectAttributes,
30-
SearchPanel,
31-
SearchSource,
32-
} from '../../types';
29+
import { IndexPatternField, QueryFilter, SearchPanel, SearchSource } from '../../types';
3330
import { getDataSource } from './get_data_source';
3431
import { getFilters } from './get_filters';
3532

@@ -54,17 +51,16 @@ const getUiSettings = async (config: IUiSettingsClient) => {
5451
};
5552

5653
export async function generateCsvSearch(
57-
req: RequestFacade,
5854
reporting: ReportingCore,
59-
logger: LevelLogger,
55+
context: RequestHandlerContext,
56+
req: KibanaRequest,
6057
searchPanel: SearchPanel,
61-
jobParams: JobParamsDiscoverCsv
58+
jobParams: JobParamsDiscoverCsv,
59+
logger: LevelLogger
6260
): Promise<CsvResultFromSearch> {
63-
const savedObjectsClient = await reporting.getSavedObjectsClient(
64-
KibanaRequest.from(req.getRawRequest())
65-
);
61+
const savedObjectsClient = context.core.savedObjects.client;
6662
const { indexPatternSavedObjectId, timerange } = searchPanel;
67-
const savedSearchObjectAttr = searchPanel.attributes as SavedSearchObjectAttributes;
63+
const savedSearchObjectAttr = searchPanel.attributes;
6864
const { indexPatternSavedObject } = await getDataSource(
6965
savedObjectsClient,
7066
indexPatternSavedObjectId
@@ -153,9 +149,7 @@ export async function generateCsvSearch(
153149

154150
const config = reporting.getConfig();
155151
const elasticsearch = await reporting.getElasticsearchService();
156-
const { callAsCurrentUser } = elasticsearch.dataClient.asScoped(
157-
KibanaRequest.from(req.getRawRequest())
158-
);
152+
const { callAsCurrentUser } = elasticsearch.dataClient.asScoped(req);
159153
const callCluster = (...params: [string, object]) => callAsCurrentUser(...params);
160154
const uiSettings = await getUiSettings(uiConfig);
161155

x-pack/legacy/plugins/reporting/export_types/csv_from_savedobject/server/lib/get_filters.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export function getFilters(
2222
let timezone: string | null;
2323

2424
if (indexPatternTimeField) {
25-
if (!timerange) {
25+
if (!timerange || !timerange.min || !timerange.max) {
2626
throw badRequest(
2727
`Time range params are required for index pattern [${indexPatternId}], using time field [${indexPatternTimeField}]`
2828
);

x-pack/legacy/plugins/reporting/export_types/csv_from_savedobject/server/lib/get_job_params_from_request.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,19 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7-
import { RequestFacade } from '../../../../server/types';
7+
import { KibanaRequest } from 'src/core/server';
88
import { JobParamsPanelCsv, JobParamsPostPayloadPanelCsv } from '../../types';
99

1010
export function getJobParamsFromRequest(
11-
request: RequestFacade,
11+
request: KibanaRequest,
1212
opts: { isImmediate: boolean }
1313
): JobParamsPanelCsv {
14-
const { savedObjectType, savedObjectId } = request.params;
15-
const { timerange, state } = request.payload as JobParamsPostPayloadPanelCsv;
14+
const { savedObjectType, savedObjectId } = request.params as {
15+
savedObjectType: string;
16+
savedObjectId: string;
17+
};
18+
const { timerange, state } = request.body as JobParamsPostPayloadPanelCsv;
19+
1620
const post = timerange || state ? { timerange, state } : undefined;
1721

1822
return {

x-pack/legacy/plugins/reporting/export_types/png/server/create_job/index.ts

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,23 @@
55
*/
66

77
import { validateUrls } from '../../../../common/validate_urls';
8-
import { ReportingCore } from '../../../../server';
98
import { cryptoFactory } from '../../../../server/lib';
10-
import {
11-
ConditionalHeaders,
12-
CreateJobFactory,
13-
ESQueueCreateJobFn,
14-
RequestFacade,
15-
} from '../../../../server/types';
9+
import { CreateJobFactory, ESQueueCreateJobFn } from '../../../../server/types';
1610
import { JobParamsPNG } from '../../types';
1711

1812
export const createJobFactory: CreateJobFactory<ESQueueCreateJobFn<
1913
JobParamsPNG
20-
>> = function createJobFactoryFn(reporting: ReportingCore) {
14+
>> = function createJobFactoryFn(reporting) {
2115
const config = reporting.getConfig();
16+
const setupDeps = reporting.getPluginSetupDeps();
2217
const crypto = cryptoFactory(config.get('encryptionKey'));
2318

2419
return async function createJob(
25-
{ objectType, title, relativeUrl, browserTimezone, layout }: JobParamsPNG,
26-
headers: ConditionalHeaders['headers'],
27-
request: RequestFacade
20+
{ objectType, title, relativeUrl, browserTimezone, layout },
21+
context,
22+
req
2823
) {
29-
const serializedEncryptedHeaders = await crypto.encrypt(headers);
24+
const serializedEncryptedHeaders = await crypto.encrypt(req.headers);
3025

3126
validateUrls([relativeUrl]);
3227

@@ -37,7 +32,7 @@ export const createJobFactory: CreateJobFactory<ESQueueCreateJobFn<
3732
headers: serializedEncryptedHeaders,
3833
browserTimezone,
3934
layout,
40-
basePath: request.getBasePath(),
35+
basePath: setupDeps.basePath(req),
4136
forceNow: new Date().toISOString(),
4237
};
4338
};

0 commit comments

Comments
 (0)