diff --git a/x-pack/platform/plugins/shared/content_connectors/public/components/connector_detail/deployment.tsx b/x-pack/platform/plugins/shared/content_connectors/public/components/connector_detail/deployment.tsx index 4526b13e6e0df..a327f57a223f9 100644 --- a/x-pack/platform/plugins/shared/content_connectors/public/components/connector_detail/deployment.tsx +++ b/x-pack/platform/plugins/shared/content_connectors/public/components/connector_detail/deployment.tsx @@ -96,10 +96,10 @@ export const ConnectorDeployment: React.FC = () => { return <>; } - const hasApiKey = !!(connector.api_key_id ?? generatedData?.apiKey); + const hasApiKey = !!(connector.api_key_id ?? generatedData?.apiKey ?? apiKeyData); const isWaitingForConnector = !connector.status || connector.status === ConnectorStatus.CREATED; - const apiKey = generatedData?.apiKey || apiKeyData || apiKeyMetaData; + const apiKey = apiKeyData || generatedData?.apiKey || apiKeyMetaData; return ( diff --git a/x-pack/platform/plugins/shared/content_connectors/server/routes/connectors.ts b/x-pack/platform/plugins/shared/content_connectors/server/routes/connectors.ts index f449f9a47b37d..c6a8f69bd0765 100644 --- a/x-pack/platform/plugins/shared/content_connectors/server/routes/connectors.ts +++ b/x-pack/platform/plugins/shared/content_connectors/server/routes/connectors.ts @@ -10,7 +10,12 @@ import { SavedObjectsClient } from '@kbn/core/server'; import type { ElasticsearchErrorDetails } from '@kbn/es-errors'; import { i18n } from '@kbn/i18n'; -import type { ConnectorStatus, FilteringRule, Connector } from '@kbn/search-connectors'; +import type { + ConnectorStatus, + FilteringRule, + Connector, + ConnectorDocument, +} from '@kbn/search-connectors'; import { CONNECTORS_INDEX, cancelSync, @@ -1315,4 +1320,62 @@ export function registerConnectorRoutes({ }); }) ); + + router.post( + { + path: '/internal/content_connectors/indices/{indexName}/api_key', + security: { + authz: { + enabled: false, + reason: 'This route delegates authorization to the scoped ES client', + }, + }, + validate: { + params: schema.object({ + indexName: schema.string(), + }), + body: schema.object({ + is_native: schema.boolean(), + }), + }, + }, + elasticsearchErrorHandler(log, async (context, request, response) => { + const indexName = decodeURIComponent(request.params.indexName); + const { client } = (await context.core).elasticsearch; + const [_core, start] = await getStartServices(); + const isAgentlessEnabled = start.fleet?.agentless?.enabled === true; + + const connectorResult = await client.asCurrentUser.search({ + index: CONNECTORS_INDEX, + query: { term: { index_name: indexName } }, + }); + const connector = connectorResult.hits.hits[0]; + if (!connector) { + return createError({ + errorCode: ErrorCode.RESOURCE_NOT_FOUND, + message: i18n.translate( + 'xpack.contentConnectors.routes.indices.apiKey.connectorNotFound', + { + defaultMessage: 'No connector found for index {indexName}.', + values: { indexName }, + } + ), + response, + statusCode: 404, + }); + } + + const apiKeyResult = await generateApiKey( + client, + indexName, + request.body.is_native, + isAgentlessEnabled + ); + + return response.ok({ + body: apiKeyResult, + headers: { 'content-type': 'application/json' }, + }); + }) + ); }