Introduce the KibanaRequest interface (#135401)

* Introduce the IKibanaRequest interface

* swap to keeping the KibanaRequest name for the interface

* adapt usages

* fix mock

* export CoreKibanaRequest for now...

* adapt imports from tests

* lint

* more missed usages in tests

* fix another instanceof...

* improve tsdoc
This commit is contained in:
Pierre Gayvallet 2022-06-30 15:35:08 +02:00 committed by GitHub
parent d50434ed7b
commit 98c73d5278
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
26 changed files with 216 additions and 126 deletions

View file

@ -15,9 +15,10 @@ import { stringify } from 'query-string';
import { schema } from '@kbn/config-schema';
import {
KibanaRequest,
CoreKibanaRequest,
LifecycleResponseFactory,
RouteMethod,
KibanaRequest,
KibanaResponseFactory,
RouteValidationSpec,
KibanaRouteOptions,
@ -62,13 +63,16 @@ function createKibanaRequestMock<P = any, Q = any, B = any>({
routeAuthRequired,
validation = {},
kibanaRouteOptions = { xsrfRequired: true },
kibanaRequestState = { requestId: '123', requestUuid: '123e4567-e89b-12d3-a456-426614174000' },
kibanaRequestState = {
requestId: '123',
requestUuid: '123e4567-e89b-12d3-a456-426614174000',
},
auth = { isAuthenticated: true },
}: RequestFixtureOptions<P, Q, B> = {}) {
}: RequestFixtureOptions<P, Q, B> = {}): KibanaRequest<P, Q, B> {
const queryString = stringify(query, { sort: false });
const url = new URL(`${path}${queryString ? `?${queryString}` : ''}`, 'http://localhost');
return KibanaRequest.from<P, Q, B>(
return CoreKibanaRequest.from<P, Q, B>(
createRawRequestMock({
app: kibanaRequestState,
auth,

View file

@ -14,7 +14,7 @@ export type { AuthStatus, GetAuthState, IsAuthenticated } from './auth_state_sto
export {
isKibanaRequest,
isRealRequest,
KibanaRequest,
CoreKibanaRequest,
kibanaResponseFactory,
validBodyOutput,
} from './router';
@ -25,6 +25,7 @@ export type {
HttpResponseOptions,
HttpResponsePayload,
ErrorHttpResponseOptions,
KibanaRequest,
KibanaRequestEvents,
KibanaRequestRoute,
KibanaRequestRouteOptions,

View file

@ -11,6 +11,7 @@ import type { Logger } from '@kbn/logging';
import {
HapiResponseAdapter,
KibanaRequest,
CoreKibanaRequest,
IKibanaResponse,
lifecycleResponseFactory,
LifecycleResponseFactory,
@ -161,7 +162,7 @@ export function adoptToHapiAuthFormat(
responseToolkit: ResponseToolkit
): Promise<Lifecycle.ReturnValue> {
const hapiResponseAdapter = new HapiResponseAdapter(responseToolkit);
const kibanaRequest = KibanaRequest.from(request, undefined, false);
const kibanaRequest = CoreKibanaRequest.from(request, undefined, false);
try {
const result = await fn(kibanaRequest, lifecycleResponseFactory, toolkit);

View file

@ -10,6 +10,7 @@ import { Lifecycle, Request, ResponseToolkit as HapiResponseToolkit } from '@hap
import type { Logger } from '@kbn/logging';
import {
HapiResponseAdapter,
CoreKibanaRequest,
KibanaRequest,
KibanaResponse,
lifecycleResponseFactory,
@ -71,7 +72,7 @@ export function adoptToHapiOnPostAuthFormat(fn: OnPostAuthHandler, log: Logger)
): Promise<Lifecycle.ReturnValue> {
const hapiResponseAdapter = new HapiResponseAdapter(responseToolkit);
try {
const result = await fn(KibanaRequest.from(request), lifecycleResponseFactory, toolkit);
const result = await fn(CoreKibanaRequest.from(request), lifecycleResponseFactory, toolkit);
if (result instanceof KibanaResponse) {
return hapiResponseAdapter.handle(result);
}

View file

@ -11,6 +11,7 @@ import type { Logger } from '@kbn/logging';
import {
HapiResponseAdapter,
KibanaRequest,
CoreKibanaRequest,
KibanaResponse,
lifecycleResponseFactory,
LifecycleResponseFactory,
@ -72,7 +73,7 @@ export function adoptToHapiOnPreAuth(fn: OnPreAuthHandler, log: Logger) {
const hapiResponseAdapter = new HapiResponseAdapter(responseToolkit);
try {
const result = await fn(KibanaRequest.from(request), lifecycleResponseFactory, toolkit);
const result = await fn(CoreKibanaRequest.from(request), lifecycleResponseFactory, toolkit);
if (result instanceof KibanaResponse) {
return hapiResponseAdapter.handle(result);
}

View file

@ -15,7 +15,7 @@ import {
import Boom from '@hapi/boom';
import type { Logger } from '@kbn/logging';
import { HapiResponseAdapter, KibanaRequest, ResponseHeaders } from '../router';
import { HapiResponseAdapter, CoreKibanaRequest, KibanaRequest, ResponseHeaders } from '../router';
enum ResultType {
render = 'render',
@ -126,7 +126,7 @@ export function adoptToHapiOnPreResponseFormat(fn: OnPreResponseHandler, log: Lo
? response.output.statusCode
: response.statusCode;
const result = await fn(KibanaRequest.from(request), { statusCode }, toolkit);
const result = await fn(CoreKibanaRequest.from(request), { statusCode }, toolkit);
if (preResponseResult.isNext(result)) {
if (result.headers) {

View file

@ -10,6 +10,7 @@ import { Lifecycle, Request, ResponseToolkit as HapiResponseToolkit } from '@hap
import type { Logger } from '@kbn/logging';
import {
HapiResponseAdapter,
CoreKibanaRequest,
KibanaRequest,
KibanaResponse,
lifecycleResponseFactory,
@ -88,7 +89,7 @@ export function adoptToHapiOnRequest(fn: OnPreRoutingHandler, log: Logger) {
const hapiResponseAdapter = new HapiResponseAdapter(responseToolkit);
try {
const result = await fn(KibanaRequest.from(request), lifecycleResponseFactory, toolkit);
const result = await fn(CoreKibanaRequest.from(request), lifecycleResponseFactory, toolkit);
if (result instanceof KibanaResponse) {
return hapiResponseAdapter.handle(result);
}

View file

@ -16,13 +16,14 @@ export type {
RouteRegistrar,
RouterRoute,
} from './router';
export { isKibanaRequest, isRealRequest, ensureRawRequest, KibanaRequest } from './request';
export { isKibanaRequest, isRealRequest, ensureRawRequest, CoreKibanaRequest } from './request';
export type {
KibanaRequestEvents,
KibanaRequestRoute,
KibanaRequestRouteOptions,
KibanaRouteOptions,
KibanaRequestState,
KibanaRequest,
} from './request';
export { isSafeMethod, validBodyOutput } from './route';
export type {

View file

@ -11,17 +11,17 @@ jest.mock('uuid', () => ({
}));
import { RouteOptions } from '@hapi/hapi';
import { KibanaRequest } from './request';
import { CoreKibanaRequest } from './request';
import { httpServerMock } from '../http_server.mocks';
import { schema } from '@kbn/config-schema';
describe('KibanaRequest', () => {
describe('CoreKibanaRequest', () => {
describe('id property', () => {
it('uses the request.app.requestId property if present', () => {
const request = httpServerMock.createRawRequest({
app: { requestId: 'fakeId' },
});
const kibanaRequest = KibanaRequest.from(request);
const kibanaRequest = CoreKibanaRequest.from(request);
expect(kibanaRequest.id).toEqual('fakeId');
});
@ -30,7 +30,7 @@ describe('KibanaRequest', () => {
const request = httpServerMock.createRawRequest({
app: undefined,
});
const kibanaRequest = KibanaRequest.from(request);
const kibanaRequest = CoreKibanaRequest.from(request);
expect(kibanaRequest.id).toEqual('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx');
});
@ -39,7 +39,7 @@ describe('KibanaRequest', () => {
const request = httpServerMock.createRawRequest({
app: {},
});
const kibanaRequest = KibanaRequest.from(request);
const kibanaRequest = CoreKibanaRequest.from(request);
expect(kibanaRequest.id).toEqual('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx');
});
});
@ -49,7 +49,7 @@ describe('KibanaRequest', () => {
const request = httpServerMock.createRawRequest({
app: { requestUuid: '123e4567-e89b-12d3-a456-426614174000' },
});
const kibanaRequest = KibanaRequest.from(request);
const kibanaRequest = CoreKibanaRequest.from(request);
expect(kibanaRequest.uuid).toEqual('123e4567-e89b-12d3-a456-426614174000');
});
@ -58,7 +58,7 @@ describe('KibanaRequest', () => {
const request = httpServerMock.createRawRequest({
app: undefined,
});
const kibanaRequest = KibanaRequest.from(request);
const kibanaRequest = CoreKibanaRequest.from(request);
expect(kibanaRequest.uuid).toEqual('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx');
});
@ -67,7 +67,7 @@ describe('KibanaRequest', () => {
const request = httpServerMock.createRawRequest({
app: {},
});
const kibanaRequest = KibanaRequest.from(request);
const kibanaRequest = CoreKibanaRequest.from(request);
expect(kibanaRequest.uuid).toEqual('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx');
});
});
@ -77,7 +77,7 @@ describe('KibanaRequest', () => {
const request = httpServerMock.createRawRequest({
headers: { custom: 'one', authorization: 'token' },
});
const kibanaRequest = KibanaRequest.from(request);
const kibanaRequest = CoreKibanaRequest.from(request);
expect(kibanaRequest.headers).toEqual({ custom: 'one', authorization: 'token' });
});
});
@ -88,7 +88,7 @@ describe('KibanaRequest', () => {
const request = httpServerMock.createRawRequest({
headers: rawRequestHeaders,
});
const kibanaRequest = KibanaRequest.from(request);
const kibanaRequest = CoreKibanaRequest.from(request);
expect(kibanaRequest.headers).toEqual({ custom: 'one' });
expect(kibanaRequest.headers).not.toBe(rawRequestHeaders);
@ -99,7 +99,7 @@ describe('KibanaRequest', () => {
const request = httpServerMock.createRawRequest({
headers: { custom: 'one', authorization: 'token' },
});
const kibanaRequest = KibanaRequest.from(request);
const kibanaRequest = CoreKibanaRequest.from(request);
expect(kibanaRequest.headers).toEqual({
custom: 'one',
});
@ -109,7 +109,7 @@ describe('KibanaRequest', () => {
const request = httpServerMock.createRawRequest({
headers: { custom: 'one', authorization: 'token' },
});
const kibanaRequest = KibanaRequest.from(request, undefined, false);
const kibanaRequest = CoreKibanaRequest.from(request, undefined, false);
expect(kibanaRequest.headers).toEqual({
custom: 'one',
authorization: 'token',
@ -122,7 +122,7 @@ describe('KibanaRequest', () => {
const request = httpServerMock.createRawRequest({
headers: { custom: 'one' },
});
const kibanaRequest = KibanaRequest.from(request);
const kibanaRequest = CoreKibanaRequest.from(request);
expect(kibanaRequest.isSystemRequest).toBe(false);
});
@ -130,7 +130,7 @@ describe('KibanaRequest', () => {
const request = httpServerMock.createRawRequest({
headers: { custom: 'one', 'kbn-system-request': 'true' },
});
const kibanaRequest = KibanaRequest.from(request);
const kibanaRequest = CoreKibanaRequest.from(request);
expect(kibanaRequest.isSystemRequest).toBe(true);
});
@ -138,7 +138,7 @@ describe('KibanaRequest', () => {
const request = httpServerMock.createRawRequest({
headers: { custom: 'one', 'kbn-system-request': 'false' },
});
const kibanaRequest = KibanaRequest.from(request);
const kibanaRequest = CoreKibanaRequest.from(request);
expect(kibanaRequest.isSystemRequest).toBe(false);
});
});
@ -153,7 +153,7 @@ describe('KibanaRequest', () => {
},
},
});
const kibanaRequest = KibanaRequest.from(request);
const kibanaRequest = CoreKibanaRequest.from(request);
expect(kibanaRequest.route.options.authRequired).toBe(true);
});
@ -167,7 +167,7 @@ describe('KibanaRequest', () => {
},
},
});
const kibanaRequest = KibanaRequest.from(request);
const kibanaRequest = CoreKibanaRequest.from(request);
expect(kibanaRequest.route.options.authRequired).toBe(false);
});
@ -179,7 +179,7 @@ describe('KibanaRequest', () => {
},
},
});
const kibanaRequest = KibanaRequest.from(request);
const kibanaRequest = CoreKibanaRequest.from(request);
expect(kibanaRequest.route.options.authRequired).toBe(true);
});
@ -192,7 +192,7 @@ describe('KibanaRequest', () => {
},
},
});
const kibanaRequest = KibanaRequest.from(request);
const kibanaRequest = CoreKibanaRequest.from(request);
expect(kibanaRequest.route.options.authRequired).toBe('optional');
});
@ -205,7 +205,7 @@ describe('KibanaRequest', () => {
},
},
});
const kibanaRequest = KibanaRequest.from(request);
const kibanaRequest = CoreKibanaRequest.from(request);
expect(kibanaRequest.route.options.authRequired).toBe('optional');
});
@ -219,7 +219,7 @@ describe('KibanaRequest', () => {
},
});
expect(() => KibanaRequest.from(request)).toThrowErrorMatchingInlineSnapshot(
expect(() => CoreKibanaRequest.from(request)).toThrowErrorMatchingInlineSnapshot(
`"unexpected authentication options: {\\"strategies\\":[\\"session\\"]} for route: /"`
);
});
@ -233,7 +233,7 @@ describe('KibanaRequest', () => {
},
});
expect(() => KibanaRequest.from(request)).toThrowErrorMatchingInlineSnapshot(
expect(() => CoreKibanaRequest.from(request)).toThrowErrorMatchingInlineSnapshot(
`"unexpected authentication options: {} for route: /"`
);
});
@ -249,7 +249,7 @@ describe('KibanaRequest', () => {
}),
payload: body, // Set outside because the mock is using `merge` by lodash and breaks the Buffer into arrays
} as any;
const kibanaRequest = KibanaRequest.from(request, {
const kibanaRequest = CoreKibanaRequest.from(request, {
params: schema.object({ id: schema.string() }),
query: schema.object({ search: schema.string() }),
body: schema.buffer(),
@ -271,7 +271,7 @@ describe('KibanaRequest', () => {
}),
payload: body, // Set outside because the mock is using `merge` by lodash and breaks the Buffer into arrays
} as any;
const kibanaRequest = KibanaRequest.from(request, {
const kibanaRequest = CoreKibanaRequest.from(request, {
params: schema.object({ id: schema.string() }),
query: schema.object({ search: schema.string() }),
body: (data, { ok, badRequest }) => {

View file

@ -77,16 +77,115 @@ export interface KibanaRequestEvents {
completed$: Observable<void>;
}
/**
* Auth status for this request.
* @public
*/
export interface KibanaRequestAuth {
/** true if the request has been successfully authenticated, false otherwise. */
isAuthenticated: boolean;
}
/**
* Kibana specific abstraction for an incoming request.
* @public
*/
export class KibanaRequest<
export interface KibanaRequest<
Params = unknown,
Query = unknown,
Body = unknown,
Method extends RouteMethod = any
> {
/**
* A identifier to identify this request.
*
* @remarks
* Depending on the user's configuration, this value may be sourced from the
* incoming request's `X-Opaque-Id` header which is not guaranteed to be unique
* per request.
*/
readonly id: string;
/**
* A UUID to identify this request.
*
* @remarks
* This value is NOT sourced from the incoming request's `X-Opaque-Id` header. it
* is always a UUID uniquely identifying the request.
*/
readonly uuid: string;
/** a WHATWG URL standard object. */
readonly url: URL;
/** matched route details */
readonly route: RecursiveReadonly<KibanaRequestRoute<Method>>;
/**
* Readonly copy of incoming request headers.
* @remarks
* This property will contain a `filtered` copy of request headers.
*/
readonly headers: Headers;
/**
* Whether or not the request is a "system request" rather than an application-level request.
* Can be set on the client using the `HttpFetchOptions#asSystemRequest` option.
*/
readonly isSystemRequest: boolean;
/**
* The socket associated with this request.
* See {@link IKibanaSocket}.
*/
readonly socket: IKibanaSocket;
/**
* Allow to listen to events bound to this request.
* See {@link KibanaRequestEvents}.
*/
readonly events: KibanaRequestEvents;
/**
* The auth status of this request.
* See {@link KibanaRequestAuth}.
*/
readonly auth: KibanaRequestAuth;
/**
* URL rewritten in onPreRouting request interceptor.
*/
readonly rewrittenUrl?: URL;
/**
* The path parameter of this request.
*/
readonly params: Params;
/**
* The query parameter of this request.
*/
readonly query: Query;
/**
* The body payload of this request.
*/
readonly body: Body;
}
/**
* Core internal implementation of {@link KibanaRequest}
* @internal
* @remarks Only publicly exposed for consumers that need to forge requests using {@link CoreKibanaRequest.from}.
* All other usages should import and use the {@link KibanaRequest} interface instead.
*/
export class CoreKibanaRequest<
Params = unknown,
Query = unknown,
Body = unknown,
Method extends RouteMethod = any
> implements KibanaRequest<Params, Query, Body, Method>
{
/**
* Factory for creating requests. Validates the request before creating an
* instance of a KibanaRequest.
@ -98,8 +197,8 @@ export class KibanaRequest<
withoutSecretHeaders: boolean = true
) {
const routeValidator = RouteValidator.from<P, Q, B>(routeSchemas);
const requestParts = KibanaRequest.validate(req, routeValidator);
return new KibanaRequest(
const requestParts = CoreKibanaRequest.validate(req, routeValidator);
return new CoreKibanaRequest(
req,
requestParts.params,
requestParts.query,
@ -128,51 +227,25 @@ export class KibanaRequest<
return { query, params, body };
}
/**
* A identifier to identify this request.
*
* @remarks
* Depending on the user's configuration, this value may be sourced from the
* incoming request's `X-Opaque-Id` header which is not guaranteed to be unique
* per request.
*/
/** {@inheritDoc IKibanaRequest.id} */
public readonly id: string;
/**
* A UUID to identify this request.
*
* @remarks
* This value is NOT sourced from the incoming request's `X-Opaque-Id` header. it
* is always a UUID uniquely identifying the request.
*/
/** {@inheritDoc IKibanaRequest.uuid} */
public readonly uuid: string;
/** a WHATWG URL standard object. */
/** {@inheritDoc IKibanaRequest.url} */
public readonly url: URL;
/** matched route details */
/** {@inheritDoc IKibanaRequest.route} */
public readonly route: RecursiveReadonly<KibanaRequestRoute<Method>>;
/**
* Readonly copy of incoming request headers.
* @remarks
* This property will contain a `filtered` copy of request headers.
*/
/** {@inheritDoc IKibanaRequest.headers} */
public readonly headers: Headers;
/**
* Whether or not the request is a "system request" rather than an application-level request.
* Can be set on the client using the `HttpFetchOptions#asSystemRequest` option.
*/
/** {@inheritDoc IKibanaRequest.isSystemRequest} */
public readonly isSystemRequest: boolean;
/** {@link IKibanaSocket} */
/** {@inheritDoc IKibanaRequest.socket} */
public readonly socket: IKibanaSocket;
/** Request events {@link KibanaRequestEvents} */
/** {@inheritDoc IKibanaRequest.events} */
public readonly events: KibanaRequestEvents;
public readonly auth: {
/* true if the request has been successfully authenticated, otherwise false. */
isAuthenticated: boolean;
};
/**
* URL rewritten in onPreRouting request interceptor.
*/
/** {@inheritDoc IKibanaRequest.auth} */
public readonly auth: KibanaRequestAuth;
/** {@inheritDoc IKibanaRequest.rewrittenUrl} */
public readonly rewrittenUrl?: URL;
/** @internal */
@ -312,14 +385,14 @@ export class KibanaRequest<
* @internal
*/
export const ensureRawRequest = (request: KibanaRequest | Request) =>
isKibanaRequest(request) ? request[requestSymbol] : request;
isKibanaRequest(request) ? request[requestSymbol] : (request as Request);
/**
* Checks if an incoming request is a {@link KibanaRequest}
* @internal
*/
export function isKibanaRequest(request: unknown): request is KibanaRequest {
return request instanceof KibanaRequest;
export function isKibanaRequest(request: unknown): request is CoreKibanaRequest {
return request instanceof CoreKibanaRequest;
}
function isRequest(request: any): request is Request {

View file

@ -15,7 +15,7 @@ import {
isUnauthorizedError as isElasticsearchUnauthorizedError,
UnauthorizedError as EsNotAuthorizedError,
} from '../../elasticsearch/client/errors';
import { KibanaRequest } from './request';
import { KibanaRequest, CoreKibanaRequest } from './request';
import {
KibanaResponseFactory,
kibanaResponseFactory,
@ -266,7 +266,7 @@ export class Router<Context extends RequestHandlerContext = RequestHandlerContex
let kibanaRequest: KibanaRequest<P, Q, B, typeof request.method>;
const hapiResponseAdapter = new HapiResponseAdapter(responseToolkit);
try {
kibanaRequest = KibanaRequest.from(request, routeSchemas);
kibanaRequest = CoreKibanaRequest.from(request, routeSchemas);
} catch (e) {
return hapiResponseAdapter.toBadRequest(e.message);
}

View file

@ -235,7 +235,8 @@ export type {
SafeRouteMethod,
} from './http';
export { KibanaRequest, kibanaResponseFactory, validBodyOutput } from './http';
export { kibanaResponseFactory, validBodyOutput, CoreKibanaRequest } from './http';
export type { KibanaRequest } from './http';
export type {
HttpResourcesRenderOptions,

View file

@ -7,7 +7,7 @@
*/
import { SavedObject } from '../../../types';
import { KibanaRequest } from '../../http';
import { CoreKibanaRequest } from '../../http';
import { httpServerMock } from '../../http/http_server.mocks';
import { applyExportTransforms } from './apply_export_transforms';
import { SavedObjectsExportTransform } from './types';
@ -30,7 +30,7 @@ const createTransform = (
const toMap = <V>(record: Record<string, V>): Map<string, V> => new Map(Object.entries(record));
const expectedContext = {
request: expect.any(KibanaRequest),
request: expect.any(CoreKibanaRequest),
};
describe('applyExportTransforms', () => {

View file

@ -14,6 +14,7 @@ import {
Logger,
SavedObjectsClientContract,
KibanaRequest,
CoreKibanaRequest,
SavedObjectReference,
IBasePath,
SavedObject,
@ -226,7 +227,7 @@ function getFakeRequest(apiKey?: string) {
// Since we're using API keys and accessing elasticsearch can only be done
// via a request, we're faking one with the proper authorization headers.
const fakeRequest = KibanaRequest.from({
const fakeRequest = CoreKibanaRequest.from({
headers: requestHeaders,
path: '/',
route: { settings: {} },

View file

@ -7,7 +7,7 @@
import { Request } from '@hapi/hapi';
import { ruleTypeRegistryMock } from './rule_type_registry.mock';
import { KibanaRequest } from '@kbn/core/server';
import { CoreKibanaRequest } from '@kbn/core/server';
import { savedObjectsClientMock } from '@kbn/core/server/mocks';
import { securityMock } from '@kbn/security-plugin/server/mocks';
import {
@ -60,7 +60,7 @@ test('creates an alerting authorization client with proper constructor arguments
securityPluginStart,
...alertingAuthorizationClientFactoryParams,
});
const request = KibanaRequest.from(fakeRequest);
const request = CoreKibanaRequest.from(fakeRequest);
factory.create(request);
@ -78,7 +78,7 @@ test('creates an alerting authorization client with proper constructor arguments
test('creates an alerting authorization client with proper constructor arguments', async () => {
const factory = new AlertingAuthorizationClientFactory();
factory.initialize(alertingAuthorizationClientFactoryParams);
const request = KibanaRequest.from(fakeRequest);
const request = CoreKibanaRequest.from(fakeRequest);
factory.create(request);

View file

@ -9,7 +9,7 @@ import { Request } from '@hapi/hapi';
import { RulesClientFactory, RulesClientFactoryOpts } from './rules_client_factory';
import { ruleTypeRegistryMock } from './rule_type_registry.mock';
import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks';
import { KibanaRequest } from '@kbn/core/server';
import { CoreKibanaRequest } from '@kbn/core/server';
import {
savedObjectsClientMock,
savedObjectsServiceMock,
@ -85,7 +85,7 @@ beforeEach(() => {
test('creates a rules client with proper constructor arguments when security is enabled', async () => {
const factory = new RulesClientFactory();
factory.initialize({ securityPluginSetup, securityPluginStart, ...rulesClientFactoryParams });
const request = KibanaRequest.from(fakeRequest);
const request = CoreKibanaRequest.from(fakeRequest);
savedObjectsService.getScopedClient.mockReturnValue(savedObjectsClient);
alertingAuthorizationClientFactory.create.mockReturnValue(
@ -127,7 +127,7 @@ test('creates a rules client with proper constructor arguments when security is
test('creates a rules client with proper constructor arguments', async () => {
const factory = new RulesClientFactory();
factory.initialize(rulesClientFactoryParams);
const request = KibanaRequest.from(fakeRequest);
const request = CoreKibanaRequest.from(fakeRequest);
savedObjectsService.getScopedClient.mockReturnValue(savedObjectsClient);
alertingAuthorizationClientFactory.create.mockReturnValue(
@ -165,7 +165,7 @@ test('creates a rules client with proper constructor arguments', async () => {
test('getUserName() returns null when security is disabled', async () => {
const factory = new RulesClientFactory();
factory.initialize(rulesClientFactoryParams);
factory.create(KibanaRequest.from(fakeRequest), savedObjectsService);
factory.create(CoreKibanaRequest.from(fakeRequest), savedObjectsService);
const constructorCall = jest.requireMock('./rules_client').RulesClient.mock.calls[0][0];
const userNameResult = await constructorCall.getUserName();
@ -179,7 +179,7 @@ test('getUserName() returns a name when security is enabled', async () => {
securityPluginSetup,
securityPluginStart,
});
factory.create(KibanaRequest.from(fakeRequest), savedObjectsService);
factory.create(CoreKibanaRequest.from(fakeRequest), savedObjectsService);
const constructorCall = jest.requireMock('./rules_client').RulesClient.mock.calls[0][0];
securityPluginStart.authc.getCurrentUser.mockReturnValueOnce({
@ -192,7 +192,7 @@ test('getUserName() returns a name when security is enabled', async () => {
test('getActionsClient() returns ActionsClient', async () => {
const factory = new RulesClientFactory();
factory.initialize(rulesClientFactoryParams);
factory.create(KibanaRequest.from(fakeRequest), savedObjectsService);
factory.create(CoreKibanaRequest.from(fakeRequest), savedObjectsService);
const constructorCall = jest.requireMock('./rules_client').RulesClient.mock.calls[0][0];
const actionsClient = await constructorCall.getActionsClient();
@ -202,7 +202,7 @@ test('getActionsClient() returns ActionsClient', async () => {
test('createAPIKey() returns { apiKeysEnabled: false } when security is disabled', async () => {
const factory = new RulesClientFactory();
factory.initialize(rulesClientFactoryParams);
factory.create(KibanaRequest.from(fakeRequest), savedObjectsService);
factory.create(CoreKibanaRequest.from(fakeRequest), savedObjectsService);
const constructorCall = jest.requireMock('./rules_client').RulesClient.mock.calls[0][0];
const createAPIKeyResult = await constructorCall.createAPIKey();
@ -212,7 +212,7 @@ test('createAPIKey() returns { apiKeysEnabled: false } when security is disabled
test('createAPIKey() returns { apiKeysEnabled: false } when security is enabled but ES security is disabled', async () => {
const factory = new RulesClientFactory();
factory.initialize(rulesClientFactoryParams);
factory.create(KibanaRequest.from(fakeRequest), savedObjectsService);
factory.create(CoreKibanaRequest.from(fakeRequest), savedObjectsService);
const constructorCall = jest.requireMock('./rules_client').RulesClient.mock.calls[0][0];
securityPluginStart.authc.apiKeys.grantAsInternalUser.mockResolvedValueOnce(null);
@ -227,7 +227,7 @@ test('createAPIKey() returns an API key when security is enabled', async () => {
securityPluginSetup,
securityPluginStart,
});
factory.create(KibanaRequest.from(fakeRequest), savedObjectsService);
factory.create(CoreKibanaRequest.from(fakeRequest), savedObjectsService);
const constructorCall = jest.requireMock('./rules_client').RulesClient.mock.calls[0][0];
securityPluginStart.authc.apiKeys.grantAsInternalUser.mockResolvedValueOnce({
@ -249,7 +249,7 @@ test('createAPIKey() throws when security plugin createAPIKey throws an error',
securityPluginSetup,
securityPluginStart,
});
factory.create(KibanaRequest.from(fakeRequest), savedObjectsService);
factory.create(CoreKibanaRequest.from(fakeRequest), savedObjectsService);
const constructorCall = jest.requireMock('./rules_client').RulesClient.mock.calls[0][0];
securityPluginStart.authc.apiKeys.grantAsInternalUser.mockRejectedValueOnce(

View file

@ -6,7 +6,7 @@
*/
import { encryptedSavedObjectsMock } from '@kbn/encrypted-saved-objects-plugin/server/mocks';
import { KibanaRequest } from '@kbn/core/server';
import { CoreKibanaRequest } from '@kbn/core/server';
import { schema } from '@kbn/config-schema';
import { getDecryptedAttributes, getFakeKibanaRequest, loadRule } from './rule_loader';
@ -234,12 +234,12 @@ describe('rule_loader', () => {
describe('getFakeKibanaRequest()', () => {
test('has API key, in default space', async () => {
const kibanaRequestFromMock = jest.spyOn(KibanaRequest, 'from');
const kibanaRequestFromMock = jest.spyOn(CoreKibanaRequest, 'from');
const fakeRequest = getFakeKibanaRequest(context, 'default', apiKey);
const bpsSetParams = mockBasePathService.set.mock.calls[0];
expect(bpsSetParams).toEqual([fakeRequest, '/']);
expect(fakeRequest).toEqual(expect.any(KibanaRequest));
expect(fakeRequest).toEqual(expect.any(CoreKibanaRequest));
expect(kibanaRequestFromMock.mock.calls[0]).toMatchInlineSnapshot(`
Array [
Object {
@ -264,12 +264,12 @@ describe('rule_loader', () => {
});
test('has API key, in non-default space', async () => {
const kibanaRequestFromMock = jest.spyOn(KibanaRequest, 'from');
const kibanaRequestFromMock = jest.spyOn(CoreKibanaRequest, 'from');
const fakeRequest = getFakeKibanaRequest(context, spaceId, apiKey);
const bpsSetParams = mockBasePathService.set.mock.calls[0];
expect(bpsSetParams).toEqual([fakeRequest, '/s/rule-spaceId']);
expect(fakeRequest).toEqual(expect.any(KibanaRequest));
expect(fakeRequest).toEqual(expect.any(CoreKibanaRequest));
expect(kibanaRequestFromMock.mock.calls[0]).toMatchInlineSnapshot(`
Array [
Object {
@ -294,13 +294,13 @@ describe('rule_loader', () => {
});
test('does not have API key, in default space', async () => {
const kibanaRequestFromMock = jest.spyOn(KibanaRequest, 'from');
const kibanaRequestFromMock = jest.spyOn(CoreKibanaRequest, 'from');
const fakeRequest = getFakeKibanaRequest(context, 'default', null);
const bpsSetParams = mockBasePathService.set.mock.calls[0];
expect(bpsSetParams).toEqual([fakeRequest, '/']);
expect(fakeRequest).toEqual(expect.any(KibanaRequest));
expect(fakeRequest).toEqual(expect.any(CoreKibanaRequest));
expect(kibanaRequestFromMock.mock.calls[0]).toMatchInlineSnapshot(`
Array [
Object {

View file

@ -8,7 +8,7 @@
import { PublicMethodsOf } from '@kbn/utility-types';
import type { Request } from '@hapi/hapi';
import { addSpaceIdToPath } from '@kbn/spaces-plugin/server';
import { KibanaRequest } from '@kbn/core/server';
import { CoreKibanaRequest } from '@kbn/core/server';
import { TaskRunnerContext } from './task_runner_factory';
import { ErrorWithReason, validateRuleTypeParams } from '../lib';
import {
@ -127,7 +127,7 @@ export function getFakeKibanaRequest(
const path = addSpaceIdToPath('/', spaceId);
const fakeRequest = KibanaRequest.from({
const fakeRequest = CoreKibanaRequest.from({
headers: requestHeaders,
path: '/',
route: { settings: {} },

View file

@ -6,15 +6,15 @@
*/
import { httpServerMock } from '@kbn/core/server/mocks';
import { KibanaRequest } from '@kbn/core/server';
import { CoreKibanaRequest } from '@kbn/core/server';
import { spacesServiceMock } from '@kbn/spaces-plugin/server/spaces_service/spaces_service.mock';
import { getSpaceId } from './get_space_id';
describe('get_space_id', () => {
let request = KibanaRequest.from(httpServerMock.createRawRequest({}));
let request = CoreKibanaRequest.from(httpServerMock.createRawRequest({}));
beforeEach(() => {
request = KibanaRequest.from(httpServerMock.createRawRequest({}));
request = CoreKibanaRequest.from(httpServerMock.createRawRequest({}));
jest.clearAllMocks();
});

View file

@ -6,16 +6,16 @@
*/
import { httpServerMock } from '@kbn/core/server/mocks';
import { KibanaRequest } from '@kbn/core/server';
import { CoreKibanaRequest } from '@kbn/core/server';
import { securityMock } from '@kbn/security-plugin/server/mocks';
import { getUser } from './get_user';
describe('get_user', () => {
let request = KibanaRequest.from(httpServerMock.createRawRequest({}));
let request = CoreKibanaRequest.from(httpServerMock.createRawRequest({}));
beforeEach(() => {
jest.clearAllMocks();
request = KibanaRequest.from(httpServerMock.createRawRequest({}));
request = CoreKibanaRequest.from(httpServerMock.createRawRequest({}));
});
afterEach(() => {

View file

@ -12,7 +12,7 @@ import type {
UiSettingsServiceStart,
} from '@kbn/core/server';
import type { SpacesPluginStart } from '@kbn/spaces-plugin/server';
import { KibanaRequest } from '@kbn/core/server';
import { CoreKibanaRequest, KibanaRequest } from '@kbn/core/server';
import type { CloudSetup } from '@kbn/cloud-plugin/server';
import type { PluginStart as DataViewsPluginStart } from '@kbn/data-views-plugin/server';
import type { SecurityPluginSetup } from '@kbn/security-plugin/server';
@ -59,8 +59,11 @@ export type MlServicesProviders = JobsHealthServiceProvider;
interface Guards {
isMinimumLicense(): Guards;
isFullLicense(): Guards;
hasMlCapabilities: (caps: MlCapabilitiesKey[]) => Guards;
ok(callback: OkCallback): any;
}
@ -100,6 +103,7 @@ export function createSharedServices(
internalServicesProviders: MlServicesProviders;
} {
const { isFullLicense, isMinimumLicense } = licenseChecks(mlLicense);
function getGuards(
request: KibanaRequest,
savedObjectsClient: SavedObjectsClientContract
@ -239,7 +243,7 @@ function getRequestItemsProvider(
};
let mlSavedObjectService;
if (request instanceof KibanaRequest) {
if (request instanceof CoreKibanaRequest) {
hasMlCapabilities = getHasMlCapabilities(request);
scopedClient = clusterClient.asScoped(request);
mlSavedObjectService = getSobSavedObjectService(scopedClient);

View file

@ -17,7 +17,7 @@ import type {
StatusServiceSetup,
UiSettingsServiceStart,
} from '@kbn/core/server';
import { KibanaRequest, ServiceStatusLevels } from '@kbn/core/server';
import { KibanaRequest, CoreKibanaRequest, ServiceStatusLevels } from '@kbn/core/server';
import type { PluginStart as DataPluginStart } from '@kbn/data-plugin/server';
import type { PluginSetupContract as FeaturesPluginSetup } from '@kbn/features-plugin/server';
import type { FieldFormatsStart } from '@kbn/field-formats-plugin/server';
@ -322,7 +322,7 @@ export class ReportingCore {
}
public getFakeRequest(baseRequest: object, spaceId: string | undefined, logger = this.logger) {
const fakeRequest = KibanaRequest.from({
const fakeRequest = CoreKibanaRequest.from({
path: '/',
route: { settings: {} },
url: { href: '/' },

View file

@ -8,7 +8,7 @@
import { Request } from '@hapi/hapi';
import { AlertsClientFactory, AlertsClientFactoryProps } from './alerts_client_factory';
import { ElasticsearchClient, KibanaRequest } from '@kbn/core/server';
import { ElasticsearchClient, KibanaRequest, CoreKibanaRequest } from '@kbn/core/server';
import { loggingSystemMock } from '@kbn/core/server/mocks';
import { securityMock } from '@kbn/security-plugin/server/mocks';
import { auditLoggerMock } from '@kbn/security-plugin/server/audit/mocks';
@ -56,7 +56,7 @@ describe('AlertsClientFactory', () => {
test('creates an alerts client with proper constructor arguments', async () => {
const factory = new AlertsClientFactory();
factory.initialize({ ...alertsClientFactoryParams });
const request = KibanaRequest.from(fakeRequest);
const request = CoreKibanaRequest.from(fakeRequest);
await factory.create(request);
expect(jest.requireMock('./alerts_client').AlertsClient).toHaveBeenCalledWith({

View file

@ -12,9 +12,10 @@ import type {
CapabilitiesStart,
IBasePath,
IClusterClient,
KibanaRequest,
Logger,
} from '@kbn/core/server';
import { KibanaRequest } from '@kbn/core/server';
import { CoreKibanaRequest } from '@kbn/core/server';
import { addSpaceIdToPath } from '@kbn/spaces-plugin/common';
import type { SpacesServiceStart } from '@kbn/spaces-plugin/server';
@ -165,7 +166,7 @@ export class AnonymousAccessService {
* anonymous service account credentials.
*/
private createFakeAnonymousRequest({ authenticateRequest }: { authenticateRequest: boolean }) {
return KibanaRequest.from({
return CoreKibanaRequest.from({
headers:
authenticateRequest && this.httpAuthorizationHeader
? { authorization: this.httpAuthorizationHeader.toString() }

View file

@ -5,8 +5,8 @@
* 2.0.
*/
import type { IBasePath, IClusterClient, LoggerFactory } from '@kbn/core/server';
import { KibanaRequest } from '@kbn/core/server';
import type { IBasePath, IClusterClient, KibanaRequest, LoggerFactory } from '@kbn/core/server';
import { CoreKibanaRequest } from '@kbn/core/server';
import type { Logger } from '@kbn/logging';
import type { PublicMethodsOf } from '@kbn/utility-types';
@ -131,7 +131,7 @@ const ACCESS_AGREEMENT_ROUTE = '/security/access_agreement';
const OVERWRITTEN_SESSION_ROUTE = '/security/overwritten_session';
function assertRequest(request: KibanaRequest) {
if (!(request instanceof KibanaRequest)) {
if (!(request instanceof CoreKibanaRequest)) {
throw new Error(`Request should be a valid "KibanaRequest" instance, was [${typeof request}].`);
}
}

View file

@ -5,7 +5,7 @@
* 2.0.
*/
import { KibanaRequest } from '@kbn/core/server';
import { CoreKibanaRequest } from '@kbn/core/server';
import { loggingSystemMock, httpServerMock } from '@kbn/core/server/mocks';
import { securityMock } from '@kbn/security-plugin/server/mocks';
import { ReindexStep, ReindexStatus, ReindexSavedObject } from '../../../common/types';
@ -14,7 +14,7 @@ import { credentialStoreFactory } from './credential_store';
const basicAuthHeader = 'Basic abc';
const logMock = loggingSystemMock.create().get();
const requestMock = KibanaRequest.from(
const requestMock = CoreKibanaRequest.from(
httpServerMock.createRawRequest({
headers: {
authorization: basicAuthHeader,