From 41e9d79ff21afdfdc851a1b179744d36c2823c6e Mon Sep 17 00:00:00 2001 From: kobelb Date: Tue, 1 Dec 2020 15:08:09 -0800 Subject: [PATCH 1/5] We can now display alerts on the saved-object management page --- .../saved_objects_management/server/plugin.ts | 4 +++- .../saved_objects_management/server/routes/find.ts | 14 +++++++++++--- .../server/routes/index.ts | 11 ++++++++--- .../server/services/management.ts | 4 ++++ .../plugins/alerts/server/saved_objects/index.ts | 8 ++++++++ 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/plugins/saved_objects_management/server/plugin.ts b/src/plugins/saved_objects_management/server/plugin.ts index 4e39b08f5c62c9..0b1c860ce91136 100644 --- a/src/plugins/saved_objects_management/server/plugin.ts +++ b/src/plugins/saved_objects_management/server/plugin.ts @@ -34,9 +34,11 @@ export class SavedObjectsManagementPlugin this.logger = this.context.logger.get(); } - public async setup({ http, capabilities }: CoreSetup) { + public async setup({ http, capabilities, getStartServices }: CoreSetup) { this.logger.debug('Setting up SavedObjectsManagement plugin'); + const savedObjectsStartPromise = getStartServices().then(([core]) => core.savedObjects); registerRoutes({ + savedObjectsStartPromise, http, managementServicePromise: this.managementService$.pipe(first()).toPromise(), }); diff --git a/src/plugins/saved_objects_management/server/routes/find.ts b/src/plugins/saved_objects_management/server/routes/find.ts index ad9a547910144c..a18bf820d36504 100644 --- a/src/plugins/saved_objects_management/server/routes/find.ts +++ b/src/plugins/saved_objects_management/server/routes/find.ts @@ -18,13 +18,14 @@ */ import { schema } from '@kbn/config-schema'; -import { IRouter } from 'src/core/server'; +import { IRouter, SavedObjectsServiceStart } from 'src/core/server'; import { injectMetaAttributes } from '../lib'; import { ISavedObjectsManagement } from '../services'; export const registerFindRoute = ( router: IRouter, - managementServicePromise: Promise + managementServicePromise: Promise, + savedObjectsStartPromise: Promise ) => { const referenceSchema = schema.object({ type: schema.string(), @@ -57,7 +58,7 @@ export const registerFindRoute = ( }, router.handleLegacyErrors(async (context, req, res) => { const managementService = await managementServicePromise; - const { client } = context.core.savedObjects; + const savedObjects = await savedObjectsStartPromise; const searchTypes = Array.isArray(req.query.type) ? req.query.type : [req.query.type]; const includedFields = Array.isArray(req.query.fields) ? req.query.fields @@ -65,6 +66,13 @@ export const registerFindRoute = ( const importAndExportableTypes = searchTypes.filter((type) => managementService.isImportAndExportable(type) ); + const includedHiddenTypes = importAndExportableTypes.filter((type) => + managementService.isHidden(type) + ); + + const client = savedObjects.getScopedClient(req, { + includedHiddenTypes, + }); const searchFields = new Set(); importAndExportableTypes.forEach((type) => { diff --git a/src/plugins/saved_objects_management/server/routes/index.ts b/src/plugins/saved_objects_management/server/routes/index.ts index e074a0d5cbee2e..e35a324bcce6a8 100644 --- a/src/plugins/saved_objects_management/server/routes/index.ts +++ b/src/plugins/saved_objects_management/server/routes/index.ts @@ -17,7 +17,7 @@ * under the License. */ -import { HttpServiceSetup } from 'src/core/server'; +import { HttpServiceSetup, SavedObjectsServiceStart } from 'src/core/server'; import { ISavedObjectsManagement } from '../services'; import { registerFindRoute } from './find'; import { registerGetRoute } from './get'; @@ -29,11 +29,16 @@ import { registerGetAllowedTypesRoute } from './get_allowed_types'; interface RegisterRouteOptions { http: HttpServiceSetup; managementServicePromise: Promise; + savedObjectsStartPromise: Promise; } -export function registerRoutes({ http, managementServicePromise }: RegisterRouteOptions) { +export function registerRoutes({ + http, + managementServicePromise, + savedObjectsStartPromise, +}: RegisterRouteOptions) { const router = http.createRouter(); - registerFindRoute(router, managementServicePromise); + registerFindRoute(router, managementServicePromise, savedObjectsStartPromise); registerGetRoute(router, managementServicePromise); registerScrollForCountRoute(router); registerScrollForExportRoute(router); diff --git a/src/plugins/saved_objects_management/server/services/management.ts b/src/plugins/saved_objects_management/server/services/management.ts index f24226d798fae6..c4d8c123dfa8d9 100644 --- a/src/plugins/saved_objects_management/server/services/management.ts +++ b/src/plugins/saved_objects_management/server/services/management.ts @@ -28,6 +28,10 @@ export class SavedObjectsManagement { return this.registry.isImportableAndExportable(type); } + public isHidden(type: string) { + return this.registry.isHidden(type); + } + public getDefaultSearchField(type: string) { return this.registry.getType(type)?.management?.defaultSearchField; } diff --git a/x-pack/plugins/alerts/server/saved_objects/index.ts b/x-pack/plugins/alerts/server/saved_objects/index.ts index dfe122f56bc485..60876b65f57165 100644 --- a/x-pack/plugins/alerts/server/saved_objects/index.ts +++ b/x-pack/plugins/alerts/server/saved_objects/index.ts @@ -42,6 +42,14 @@ export function setupSavedObjects( namespaceType: 'single', migrations: getMigrations(encryptedSavedObjects), mappings: mappings.alert, + management: { + importableAndExportable: true, + icon: 'alert', + defaultSearchField: 'name', + getTitle(obj) { + return obj.attributes.name; + }, + }, }); savedObjects.registerType({ From f3f3f13a19926cad95f1d93adc58a4318a41a221 Mon Sep 17 00:00:00 2001 From: kobelb Date: Thu, 3 Dec 2020 13:31:51 -0800 Subject: [PATCH 2/5] Actions are now importable/exportable --- x-pack/plugins/actions/server/saved_objects/index.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/x-pack/plugins/actions/server/saved_objects/index.ts b/x-pack/plugins/actions/server/saved_objects/index.ts index db811e7cd3a4f4..c44b715e932fba 100644 --- a/x-pack/plugins/actions/server/saved_objects/index.ts +++ b/x-pack/plugins/actions/server/saved_objects/index.ts @@ -23,6 +23,14 @@ export function setupSavedObjects( namespaceType: 'single', mappings: mappings.action, migrations: getMigrations(encryptedSavedObjects), + management: { + importableAndExportable: true, + icon: 'tokenEvent', + defaultSearchField: 'name', + getTitle(obj) { + return obj.attributes.name; + }, + }, }); // Encrypted attributes From 5a26d515755930f9b11bd1b5f92eccde78755d23 Mon Sep 17 00:00:00 2001 From: kobelb Date: Thu, 3 Dec 2020 14:10:17 -0800 Subject: [PATCH 3/5] Let them be exported --- src/core/server/core_route_handler_context.ts | 10 +++++++++- src/core/server/index.ts | 2 ++ src/core/server/saved_objects/routes/export.ts | 8 +++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/core/server/core_route_handler_context.ts b/src/core/server/core_route_handler_context.ts index 520c5bd3f685bc..e037bf5075aa16 100644 --- a/src/core/server/core_route_handler_context.ts +++ b/src/core/server/core_route_handler_context.ts @@ -21,7 +21,11 @@ import { InternalCoreStart } from './internal_types'; import { KibanaRequest } from './http/router'; import { SavedObjectsClientContract } from './saved_objects/types'; -import { InternalSavedObjectsServiceStart, ISavedObjectTypeRegistry } from './saved_objects'; +import { + InternalSavedObjectsServiceStart, + ISavedObjectTypeRegistry, + SavedObjectsClientProviderOptions, +} from './saved_objects'; import { InternalElasticsearchServiceStart, IScopedClusterClient, @@ -78,6 +82,10 @@ class CoreSavedObjectsRouteHandlerContext { } return this.#typeRegistry; } + + public getClient(options?: SavedObjectsClientProviderOptions) { + return this.savedObjectsStart.getScopedClient(this.request, options); + } } class CoreUiSettingsRouteHandlerContext { diff --git a/src/core/server/index.ts b/src/core/server/index.ts index 9e654ea1e23035..ecafc8a8310042 100644 --- a/src/core/server/index.ts +++ b/src/core/server/index.ts @@ -56,6 +56,7 @@ import { IUiSettingsClient, UiSettingsServiceSetup, UiSettingsServiceStart } fro import { SavedObjectsClientContract } from './saved_objects/types'; import { ISavedObjectTypeRegistry, + SavedObjectsClientProviderOptions, SavedObjectsServiceSetup, SavedObjectsServiceStart, } from './saved_objects'; @@ -390,6 +391,7 @@ export interface RequestHandlerContext { savedObjects: { client: SavedObjectsClientContract; typeRegistry: ISavedObjectTypeRegistry; + getClient(options?: SavedObjectsClientProviderOptions): SavedObjectsClientContract; }; elasticsearch: { client: IScopedClusterClient; diff --git a/src/core/server/saved_objects/routes/export.ts b/src/core/server/saved_objects/routes/export.ts index 05a91f4aa4c2ce..500421483a7ef4 100644 --- a/src/core/server/saved_objects/routes/export.ts +++ b/src/core/server/saved_objects/routes/export.ts @@ -59,7 +59,6 @@ export const registerExportRoute = (router: IRouter, config: SavedObjectConfig) }, }, router.handleLegacyErrors(async (context, req, res) => { - const savedObjectsClient = context.core.savedObjects.client; const { type, hasReference, @@ -74,6 +73,13 @@ export const registerExportRoute = (router: IRouter, config: SavedObjectConfig) const supportedTypes = context.core.savedObjects.typeRegistry .getImportableAndExportableTypes() .map((t) => t.name); + + const includedHiddenTypes = supportedTypes.filter((supportedType) => + context.core.savedObjects.typeRegistry.isHidden(supportedType) + ); + + const savedObjectsClient = context.core.savedObjects.getClient({ includedHiddenTypes }); + if (types) { const validationError = validateTypes(types, supportedTypes); if (validationError) { From 9985667a5cdbe5c1d2171be66efa0600939fe4de Mon Sep 17 00:00:00 2001 From: kobelb Date: Thu, 3 Dec 2020 16:02:53 -0800 Subject: [PATCH 4/5] Let them be imported --- src/core/server/saved_objects/routes/import.ts | 12 +++++++++++- .../saved_objects/routes/resolve_import_errors.ts | 12 +++++++++++- x-pack/plugins/actions/server/saved_objects/index.ts | 1 + x-pack/plugins/alerts/server/saved_objects/index.ts | 1 + 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/core/server/saved_objects/routes/import.ts b/src/core/server/saved_objects/routes/import.ts index 291da5a5f01837..249eff0749bf0a 100644 --- a/src/core/server/saved_objects/routes/import.ts +++ b/src/core/server/saved_objects/routes/import.ts @@ -80,8 +80,18 @@ export const registerImportRoute = (router: IRouter, config: SavedObjectConfig) }); } + const supportedTypes = context.core.savedObjects.typeRegistry + .getImportableAndExportableTypes() + .map((t) => t.name); + + const includedHiddenTypes = supportedTypes.filter((supportedType) => + context.core.savedObjects.typeRegistry.isHidden(supportedType) + ); + + const savedObjectsClient = context.core.savedObjects.getClient({ includedHiddenTypes }); + const result = await importSavedObjectsFromStream({ - savedObjectsClient: context.core.savedObjects.client, + savedObjectsClient, typeRegistry: context.core.savedObjects.typeRegistry, readStream, objectLimit: maxImportExportSize, diff --git a/src/core/server/saved_objects/routes/resolve_import_errors.ts b/src/core/server/saved_objects/routes/resolve_import_errors.ts index 03b4322b27cbc7..18af0a446c28ae 100644 --- a/src/core/server/saved_objects/routes/resolve_import_errors.ts +++ b/src/core/server/saved_objects/routes/resolve_import_errors.ts @@ -87,9 +87,19 @@ export const registerResolveImportErrorsRoute = (router: IRouter, config: SavedO }); } + const supportedTypes = context.core.savedObjects.typeRegistry + .getImportableAndExportableTypes() + .map((t) => t.name); + + const includedHiddenTypes = supportedTypes.filter((supportedType) => + context.core.savedObjects.typeRegistry.isHidden(supportedType) + ); + + const savedObjectsClient = context.core.savedObjects.getClient({ includedHiddenTypes }); + const result = await resolveSavedObjectsImportErrors({ typeRegistry: context.core.savedObjects.typeRegistry, - savedObjectsClient: context.core.savedObjects.client, + savedObjectsClient, readStream, retries: req.body.retries, objectLimit: maxImportExportSize, diff --git a/x-pack/plugins/actions/server/saved_objects/index.ts b/x-pack/plugins/actions/server/saved_objects/index.ts index c44b715e932fba..488d74222b12d3 100644 --- a/x-pack/plugins/actions/server/saved_objects/index.ts +++ b/x-pack/plugins/actions/server/saved_objects/index.ts @@ -41,6 +41,7 @@ export function setupSavedObjects( type: ACTION_SAVED_OBJECT_TYPE, attributesToEncrypt: new Set(['secrets']), attributesToExcludeFromAAD: new Set(['name']), + allowPredefinedID: true, }); savedObjects.registerType({ diff --git a/x-pack/plugins/alerts/server/saved_objects/index.ts b/x-pack/plugins/alerts/server/saved_objects/index.ts index 60876b65f57165..bf42e376a65bcd 100644 --- a/x-pack/plugins/alerts/server/saved_objects/index.ts +++ b/x-pack/plugins/alerts/server/saved_objects/index.ts @@ -73,6 +73,7 @@ export function setupSavedObjects( type: 'alert', attributesToEncrypt: new Set(['apiKey']), attributesToExcludeFromAAD: new Set(AlertAttributesExcludedFromAAD), + allowPredefinedID: true, }); // Encrypted attributes From 0dc39a88ffb9d116c666c38d06ac7fc29a9eeac2 Mon Sep 17 00:00:00 2001 From: kobelb Date: Thu, 3 Dec 2020 16:12:42 -0800 Subject: [PATCH 5/5] Hacking the privileges model --- x-pack/plugins/features/server/oss_features.ts | 13 ++++++++----- x-pack/plugins/features/server/plugin.ts | 11 +++-------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/x-pack/plugins/features/server/oss_features.ts b/x-pack/plugins/features/server/oss_features.ts index 46dd5fd086b4ac..c102bbb19fbcfd 100644 --- a/x-pack/plugins/features/server/oss_features.ts +++ b/x-pack/plugins/features/server/oss_features.ts @@ -5,14 +5,17 @@ */ import { i18n } from '@kbn/i18n'; import { KibanaFeatureConfig } from '../common'; -import { DEFAULT_APP_CATEGORIES } from '../../../../src/core/server'; +import { DEFAULT_APP_CATEGORIES, ISavedObjectTypeRegistry } from '../../../../src/core/server'; export interface BuildOSSFeaturesParams { - savedObjectTypes: string[]; + savedObjectTypeRegistry: ISavedObjectTypeRegistry; includeTimelion: boolean; } -export const buildOSSFeatures = ({ savedObjectTypes, includeTimelion }: BuildOSSFeaturesParams) => { +export const buildOSSFeatures = ({ + savedObjectTypeRegistry, + includeTimelion, +}: BuildOSSFeaturesParams) => { return [ { id: 'discover', @@ -346,7 +349,7 @@ export const buildOSSFeatures = ({ savedObjectTypes, includeTimelion }: BuildOSS }, api: ['copySavedObjectsToSpaces'], savedObject: { - all: [...savedObjectTypes], + all: [...savedObjectTypeRegistry.getImportableAndExportableTypes().map((t) => t.name)], read: [], }, ui: ['read', 'edit', 'delete', 'copyIntoSpace', 'shareIntoSpace'], @@ -360,7 +363,7 @@ export const buildOSSFeatures = ({ savedObjectTypes, includeTimelion }: BuildOSS api: ['copySavedObjectsToSpaces'], savedObject: { all: [], - read: [...savedObjectTypes], + read: [...savedObjectTypeRegistry.getImportableAndExportableTypes().map((t) => t.name)], }, ui: ['read'], }, diff --git a/x-pack/plugins/features/server/plugin.ts b/x-pack/plugins/features/server/plugin.ts index 857bba4c606d43..a83b4490210aed 100644 --- a/x-pack/plugins/features/server/plugin.ts +++ b/x-pack/plugins/features/server/plugin.ts @@ -109,16 +109,11 @@ export class Plugin { public stop() {} private registerOssFeatures(savedObjects: SavedObjectsServiceStart) { - const registry = savedObjects.getTypeRegistry(); - const savedObjectTypes = registry.getVisibleTypes().map((t) => t.name); + const savedObjectTypeRegistry = savedObjects.getTypeRegistry(); - this.logger.debug( - `Registering OSS features with SO types: ${savedObjectTypes.join(', ')}. "includeTimelion": ${ - this.isTimelionEnabled - }.` - ); + this.logger.debug(`Registering OSS features. "includeTimelion": ${this.isTimelionEnabled}.`); const features = buildOSSFeatures({ - savedObjectTypes, + savedObjectTypeRegistry, includeTimelion: this.isTimelionEnabled, });