diff --git a/src/core/public/workspace/workspaces_service.ts b/src/core/public/workspace/workspaces_service.ts index 6241f9ec74d5..cb82f3c44406 100644 --- a/src/core/public/workspace/workspaces_service.ts +++ b/src/core/public/workspace/workspaces_service.ts @@ -7,7 +7,6 @@ import { WorkspacesClient, WorkspacesClientContract } from './workspaces_client' import type { WorkspaceAttribute } from '../../server/types'; import { HttpSetup } from '../http'; import { IUiSettingsClient } from '../ui_settings'; -import { getWorkspaceIdFromUrl } from '../utils/workspace'; /** * @public @@ -32,12 +31,7 @@ export class WorkspacesService implements CoreService { private logger: Logger; private client?: IWorkspaceDBImpl; + private startDeps?: WorkspacesStartDeps; constructor(coreContext: CoreContext) { this.logger = coreContext.logger.get('workspaces-service'); } @@ -47,15 +50,29 @@ export class WorkspacesService private proxyWorkspaceTrafficToRealHandler(setupDeps: WorkspacesSetupDeps) { /** * Proxy all {basePath}/w/{workspaceId}{osdPath*} paths to - * {basePath}{osdPath*} + * {basePath}{osdPath*} when workspace is enabled + * + * Return HTTP 404 if accessing {basePath}/w/{workspaceId} when workspace is disabled */ - setupDeps.http.registerOnPreRouting((request, response, toolkit) => { + setupDeps.http.registerOnPreRouting(async (request, response, toolkit) => { const regexp = /\/w\/([^\/]*)/; const matchedResult = request.url.pathname.match(regexp); + if (matchedResult) { - const requestUrl = new URL(request.url.toString()); - requestUrl.pathname = requestUrl.pathname.replace(regexp, ''); - return toolkit.rewriteUrl(requestUrl.toString()); + if (this.startDeps) { + const savedObjectsClient = this.startDeps.savedObjects.getScopedClient(request); + const uiSettingsClient = this.startDeps.uiSettings.asScopedToClient(savedObjectsClient); + const workspacesEnabled = await uiSettingsClient.get('workspace:enabled'); + + if (workspacesEnabled) { + const requestUrl = new URL(request.url.toString()); + requestUrl.pathname = requestUrl.pathname.replace(regexp, ''); + return toolkit.rewriteUrl(requestUrl.toString()); + } else { + // If workspace was disable, return HTTP 404 + return response.notFound(); + } + } } return toolkit.next(); }); @@ -80,6 +97,7 @@ export class WorkspacesService } public async start(deps: WorkspacesStartDeps): Promise { + this.startDeps = deps; this.logger.debug('Starting SavedObjects service'); return {