diff --git a/x-pack/legacy/plugins/reporting/export_types/csv/types.d.ts b/x-pack/legacy/plugins/reporting/export_types/csv/types.d.ts index c8fcff02c691b..3906c2bb1449d 100644 --- a/x-pack/legacy/plugins/reporting/export_types/csv/types.d.ts +++ b/x-pack/legacy/plugins/reporting/export_types/csv/types.d.ts @@ -5,7 +5,7 @@ */ import { Request } from 'hapi'; -import { JobParams, JobDocPayload, JobParamPostPayload, ConditionalHeaders } from '../../types'; +import { JobDocPayload, JobParamPostPayload, ConditionalHeaders } from '../../types'; export interface JobParamPostPayloadDiscoverCsv extends JobParamPostPayload { state?: { @@ -13,7 +13,8 @@ export interface JobParamPostPayloadDiscoverCsv extends JobParamPostPayload { sort: any[]; }; } -export interface JobParamsDiscoverCsv extends JobParams { + +export interface JobParamsDiscoverCsv { indexPatternId?: string; post?: JobParamPostPayloadDiscoverCsv; // delete this } diff --git a/x-pack/legacy/plugins/reporting/export_types/csv_from_savedobject/types.d.ts b/x-pack/legacy/plugins/reporting/export_types/csv_from_savedobject/types.d.ts index db3ffe11931a9..aa681210fc740 100644 --- a/x-pack/legacy/plugins/reporting/export_types/csv_from_savedobject/types.d.ts +++ b/x-pack/legacy/plugins/reporting/export_types/csv_from_savedobject/types.d.ts @@ -5,7 +5,7 @@ */ import { CancellationToken } from '../../common/cancellation_token'; -import { JobParams, JobParamPostPayload, JobDocPayload, KbnServer } from '../../types'; +import { JobParamPostPayload, JobDocPayload, KbnServer } from '../../types'; export interface FakeRequest { headers: any; @@ -16,7 +16,10 @@ export interface JobParamsPostPayloadPanelCsv extends JobParamPostPayload { state?: any; } -export interface JobParamsPanelCsv extends JobParams { +export interface JobParamsPanelCsv { + savedObjectType: string; + savedObjectId: string; + isImmediate: boolean; panel: SearchPanel; post?: JobParamsPostPayloadPanelCsv; visType?: string; diff --git a/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/create_job/compatibility_shim.js b/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/create_job/compatibility_shim.js index 1810c7ce79daa..c2a034eddc24f 100644 --- a/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/create_job/compatibility_shim.js +++ b/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/create_job/compatibility_shim.js @@ -45,25 +45,38 @@ export function compatibilityShimFactory(server, logger) { browserTimezone, objectType, title, - relativeUrl, // not deprecating relativeUrls, layout }, headers, request ) { - if (savedObjectId && (relativeUrl || relativeUrls)) { - throw new Error(`savedObjectId should not be provided if relativeUrls are provided`); - } - if (!savedObjectId && !relativeUrl && !relativeUrls) { - throw new Error(`either relativeUrls or savedObjectId must be provided`); + + // input validation and deprecation logging + if (savedObjectId) { + if (typeof savedObjectId !== 'string') { + throw new Error('Invalid savedObjectId (deprecated). String is expected.'); + } + if (relativeUrls) { + throw new Error(`savedObjectId should not be provided if relativeUrls are provided`); + } + } else { + if (!relativeUrls) { + throw new Error(`Either relativeUrls or savedObjectId must be provided`); + } + if (!Array.isArray(relativeUrls)) { + throw new Error('Invalid relativeUrls. String[] is expected.'); + } + relativeUrls.forEach(url => { + if (typeof url !== 'string') { + throw new Error('Invalid Relative URL in relativeUrls. String is expected.'); + } + }); } let kibanaRelativeUrls; if (relativeUrls) { kibanaRelativeUrls = relativeUrls; - } else if (relativeUrl) { - kibanaRelativeUrls = [ relativeUrl ]; } else { kibanaRelativeUrls = [getSavedObjectRelativeUrl(objectType, savedObjectId, queryString)]; logger.warning( diff --git a/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/create_job/compatibility_shim.test.js b/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/create_job/compatibility_shim.test.js index 352c1b1affcdc..202da9068a1bd 100644 --- a/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/create_job/compatibility_shim.test.js +++ b/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/create_job/compatibility_shim.test.js @@ -100,19 +100,6 @@ test(`passes the objectType and savedObjectId to the savedObjectsClient`, async expect(getMock.calls[0][1]).toBe(savedObjectId); }); -test(`logs no warnings when title and relativeUrl is passed`, async () => { - const mockLogger = createMockLogger(); - const compatibilityShim = compatibilityShimFactory(createMockServer(), mockLogger); - - const createJobMock = jest.fn(); - const mockRequest = createMockRequest(); - - await compatibilityShim(createJobMock)({ title: 'Phenomenal Dashboard', relativeUrl: '/abc' }, null, mockRequest); - - expect(mockLogger.warning.mock.calls.length).toBe(0); - expect(mockLogger.error.mock.calls.length).toBe(0); - -}); test(`logs no warnings when title and relativeUrls is passed`, async () => { const mockLogger = createMockLogger(); const compatibilityShim = compatibilityShimFactory(createMockServer(), mockLogger); @@ -132,7 +119,7 @@ test(`logs warning if title can not be provided`, async () => { const createJobMock = jest.fn(); const mockRequest = createMockRequest(); - await compatibilityShim(createJobMock)({ relativeUrl: '/abc' }, null, mockRequest); + await compatibilityShim(createJobMock)({ relativeUrls: ['/abc'] }, null, mockRequest); expect(mockLogger.warning.mock.calls.length).toBe(1); expect(mockLogger.warning.mock.calls[0][0]).toEqual( @@ -172,7 +159,7 @@ test(`passes objectType through`, async () => { const mockRequest = createMockRequest(); const objectType = 'foo'; - await compatibilityShim(createJobMock)({ title: 'test', relativeUrl: '/something', objectType }, null, mockRequest); + await compatibilityShim(createJobMock)({ title: 'test', relativeUrls: ['/something'], objectType }, null, mockRequest); expect(mockLogger.warning.mock.calls.length).toBe(0); expect(mockLogger.error.mock.calls.length).toBe(0); @@ -261,7 +248,7 @@ test(`passes headers and request through`, async () => { const headers = {}; const request = createMockRequest(); - await compatibilityShim(createJobMock)({ title: 'test', relativeUrl: '/something' }, headers, request); + await compatibilityShim(createJobMock)({ title: 'test', relativeUrls: ['/something'] }, headers, request); expect(mockLogger.warning.mock.calls.length).toBe(0); expect(mockLogger.error.mock.calls.length).toBe(0); diff --git a/x-pack/legacy/plugins/reporting/export_types/printable_pdf/types.d.ts b/x-pack/legacy/plugins/reporting/export_types/printable_pdf/types.d.ts index d75dedad9a333..a27b4aed48760 100644 --- a/x-pack/legacy/plugins/reporting/export_types/printable_pdf/types.d.ts +++ b/x-pack/legacy/plugins/reporting/export_types/printable_pdf/types.d.ts @@ -8,11 +8,11 @@ import { Request } from 'hapi'; import { LayoutInstance } from '../common/layouts/layout'; import { ConditionalHeaders, KbnServer, JobDocPayload } from '../../types'; -// Job params: structure of incoming user request data +// Job params: structure of incoming user request data, after being parsed from RISON export interface JobParamsPDF { objectType: string; title: string; - relativeUrl: string; + relativeUrls: string[]; browserTimezone: string; layout: LayoutInstance; } diff --git a/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver_factory/args.ts b/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver_factory/args.ts index 3b66c1903a9a8..a30e3a8bbba6d 100644 --- a/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver_factory/args.ts +++ b/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver_factory/args.ts @@ -4,25 +4,23 @@ * you may not use this file except in compliance with the Elastic License. */ -export interface IArgOptions { - userDataDir: string; - viewport: { width: number; height: number }; - disableSandbox: boolean; - proxyConfig: { - enabled: boolean; - server: string; - bypass?: string[]; - }; - verboseLogging?: boolean; +import { BrowserConfig } from '../../../../types'; + +interface LaunchArgs { + userDataDir: BrowserConfig['userDataDir']; + viewport: BrowserConfig['viewport']; + disableSandbox: BrowserConfig['disableSandbox']; + proxy: BrowserConfig['proxy']; + verboseLogging: BrowserConfig['verboseLogging']; } export const args = ({ userDataDir, viewport, disableSandbox, - proxyConfig, + proxy: proxyConfig, verboseLogging, -}: IArgOptions) => { +}: LaunchArgs) => { const flags = [ // Disable built-in Google Translate service '--disable-translate', @@ -61,6 +59,7 @@ export const args = ({ flags.push('--no-sandbox'); } + // TODO remove conditional if (verboseLogging) { flags.push('--enable-logging'); flags.push('--v=1'); diff --git a/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver_factory/index.ts b/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver_factory/index.ts index 4e5115598b0ff..baa25b1662abb 100644 --- a/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver_factory/index.ts +++ b/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver_factory/index.ts @@ -18,29 +18,27 @@ import * as Rx from 'rxjs'; import { ignoreElements, mergeMap, tap } from 'rxjs/operators'; import { InnerSubscriber } from 'rxjs/internal/InnerSubscriber'; -import { puppeteerLaunch } from '../puppeteer'; +import { BrowserConfig } from '../../../../types'; import { LevelLogger as Logger } from '../../../lib/level_logger'; import { HeadlessChromiumDriver } from '../driver'; -import { args, IArgOptions } from './args'; import { safeChildProcess } from '../../safe_child_process'; +import { puppeteerLaunch } from '../puppeteer'; import { getChromeLogLocation } from '../paths'; +import { args } from './args'; type binaryPath = string; type queueTimeout = number; -interface IBrowserConfig { - [key: string]: any; -} export class HeadlessChromiumDriverFactory { private binaryPath: binaryPath; private logger: Logger; - private browserConfig: IBrowserConfig; + private browserConfig: BrowserConfig; private queueTimeout: queueTimeout; constructor( binaryPath: binaryPath, logger: Logger, - browserConfig: IBrowserConfig, + browserConfig: BrowserConfig, queueTimeout: queueTimeout ) { this.binaryPath = binaryPath; @@ -51,17 +49,14 @@ export class HeadlessChromiumDriverFactory { type = 'chromium'; - test( - { viewport, browserTimezone }: { viewport: IArgOptions['viewport']; browserTimezone: string }, - logger: Logger - ) { + test({ viewport }: { viewport: BrowserConfig['viewport'] }, logger: Logger) { const userDataDir = fs.mkdtempSync(path.join(os.tmpdir(), 'chromium-')); const chromiumArgs = args({ userDataDir, viewport, verboseLogging: true, disableSandbox: this.browserConfig.disableSandbox, - proxyConfig: this.browserConfig.proxy, + proxy: this.browserConfig.proxy, }); return puppeteerLaunch({ @@ -69,9 +64,6 @@ export class HeadlessChromiumDriverFactory { executablePath: this.binaryPath, ignoreHTTPSErrors: true, args: chromiumArgs, - env: { - TZ: browserTimezone, - }, } as LaunchOptions).catch((error: Error) => { logger.error( `The Reporting plugin encountered issues launching Chromium in a self-test. You may have trouble generating reports.` @@ -86,7 +78,7 @@ export class HeadlessChromiumDriverFactory { viewport, browserTimezone, }: { - viewport: IArgOptions['viewport']; + viewport: BrowserConfig['viewport']; browserTimezone: string; }): Rx.Observable<{ driver$: Rx.Observable; @@ -101,7 +93,7 @@ export class HeadlessChromiumDriverFactory { viewport, verboseLogging: this.logger.isVerbose, disableSandbox: this.browserConfig.disableSandbox, - proxyConfig: this.browserConfig.proxy, + proxy: this.browserConfig.proxy, }); let browser: Browser; diff --git a/x-pack/legacy/plugins/reporting/server/browsers/chromium/index.js b/x-pack/legacy/plugins/reporting/server/browsers/chromium/index.ts similarity index 61% rename from x-pack/legacy/plugins/reporting/server/browsers/chromium/index.js rename to x-pack/legacy/plugins/reporting/server/browsers/chromium/index.ts index 551b5bf399c55..ea83a8a8df655 100644 --- a/x-pack/legacy/plugins/reporting/server/browsers/chromium/index.js +++ b/x-pack/legacy/plugins/reporting/server/browsers/chromium/index.ts @@ -4,10 +4,17 @@ * you may not use this file except in compliance with the Elastic License. */ +import { BrowserConfig } from '../../../types'; +import { LevelLogger } from '../../lib'; import { HeadlessChromiumDriverFactory } from './driver_factory'; export { paths } from './paths'; -export async function createDriverFactory(binaryPath, logger, browserConfig, queueTimeout) { +export async function createDriverFactory( + binaryPath: string, + logger: LevelLogger, + browserConfig: BrowserConfig, + queueTimeout: number +): Promise { return new HeadlessChromiumDriverFactory(binaryPath, logger, browserConfig, queueTimeout); } diff --git a/x-pack/legacy/plugins/reporting/server/browsers/create_browser_driver_factory.ts b/x-pack/legacy/plugins/reporting/server/browsers/create_browser_driver_factory.ts index ad3ea19587e45..ada20914eccb5 100644 --- a/x-pack/legacy/plugins/reporting/server/browsers/create_browser_driver_factory.ts +++ b/x-pack/legacy/plugins/reporting/server/browsers/create_browser_driver_factory.ts @@ -12,8 +12,11 @@ import { installBrowser } from './install'; import { LevelLogger } from '../lib/level_logger'; import { KbnServer } from '../../types'; import { PLUGIN_ID } from '../../common/constants'; +import { HeadlessChromiumDriverFactory } from './chromium/driver_factory'; -export async function createBrowserDriverFactory(server: KbnServer) { +export async function createBrowserDriverFactory( + server: KbnServer +): Promise { const config = server.config(); const logger = LevelLogger.createForServer(server, [PLUGIN_ID, 'browser-driver']); diff --git a/x-pack/legacy/plugins/reporting/server/lib/enqueue_job.ts b/x-pack/legacy/plugins/reporting/server/lib/enqueue_job.ts index 98124e33a8fc5..ec0ffdf51733e 100644 --- a/x-pack/legacy/plugins/reporting/server/lib/enqueue_job.ts +++ b/x-pack/legacy/plugins/reporting/server/lib/enqueue_job.ts @@ -9,7 +9,7 @@ import { get } from 'lodash'; // @ts-ignore import { events as esqueueEvents } from './esqueue'; import { oncePerServer } from './once_per_server'; -import { KbnServer, Logger, JobParams, ConditionalHeaders } from '../../types'; +import { KbnServer, Logger, ConditionalHeaders } from '../../types'; interface ConfirmedJob { id: string; @@ -29,7 +29,7 @@ function enqueueJobFn(server: KbnServer) { return async function enqueueJob( parentLogger: Logger, exportTypeId: string, - jobParams: JobParams, + jobParams: object, user: string, headers: ConditionalHeaders, request: Request diff --git a/x-pack/legacy/plugins/reporting/server/lib/validate/validate_browser.ts b/x-pack/legacy/plugins/reporting/server/lib/validate/validate_browser.ts index cbe60174830b3..7d011e6c0886e 100644 --- a/x-pack/legacy/plugins/reporting/server/lib/validate/validate_browser.ts +++ b/x-pack/legacy/plugins/reporting/server/lib/validate/validate_browser.ts @@ -6,20 +6,20 @@ import { Browser } from 'puppeteer'; import { KbnServer, Logger } from '../../../types'; import { CHROMIUM } from '../../browsers/browser_types'; +import { HeadlessChromiumDriverFactory } from '../../browsers/chromium/driver_factory'; /* * Validate the Reporting headless browser can launch, and that it can connect * to the locally running Kibana instance. */ -export const validateBrowser = async (server: KbnServer, browserFactory: any, logger: Logger) => { +export const validateBrowser = async ( + server: KbnServer, + browserFactory: HeadlessChromiumDriverFactory, + logger: Logger +) => { if (browserFactory.type === CHROMIUM) { return browserFactory - .test( - { - viewport: { width: 800, height: 600 }, - }, - logger - ) + .test({ viewport: { width: 800, height: 600 } }, logger) .then((browser: Browser | null) => { if (browser && browser.close) { browser.close(); diff --git a/x-pack/legacy/plugins/reporting/types.d.ts b/x-pack/legacy/plugins/reporting/types.d.ts index ff9a1b0f75d08..f1ddab8689569 100644 --- a/x-pack/legacy/plugins/reporting/types.d.ts +++ b/x-pack/legacy/plugins/reporting/types.d.ts @@ -38,6 +38,19 @@ export interface ConfigObject { get: (path?: string) => any; } +export interface BrowserConfig { + inspect: boolean; + userDataDir: string; + viewport: { width: number; height: number }; + disableSandbox: boolean; + proxy: { + enabled: boolean; + server: string; + bypass?: string[]; + }; + verboseLogging?: boolean; +} + export interface ElementPosition { boundingClientRect: { // modern browsers support x/y, but older ones don't @@ -79,16 +92,9 @@ export interface JobParamPostPayload { timerange: TimeRangeParams; } -// params that come into a request -export interface JobParams { - savedObjectType: string; - savedObjectId: string; - isImmediate: boolean; -} - export interface JobDocPayload { headers?: Record; - jobParams: JobParams; + jobParams: object; title: string; type: string | null; } @@ -134,10 +140,10 @@ export interface ESQueueWorker { } export type ESQueueCreateJobFn = ( - jobParams: JobParams, + jobParams: object, headers: ConditionalHeaders, request: Request -) => Promise; +) => Promise; export type ESQueueWorkerExecuteFn = (jobId: string, job: JobDoc, cancellationToken: any) => void;