@backstage/backend-app-api 0.6.3-next.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/config/ObservableConfigProxy.ts","../src/lib/urls.ts","../src/config/config.ts","../src/http/config.ts","../src/http/getGeneratedCertificate.ts","../src/http/createHttpServer.ts","../src/http/readHelmetOptions.ts","../src/http/readCorsOptions.ts","../src/http/applyInternalErrorFilter.ts","../src/http/MiddlewareFactory.ts","../src/lib/escapeRegExp.ts","../src/logging/WinstonLogger.ts","../src/services/implementations/rootLifecycle/rootLifecycleServiceFactory.ts","../src/services/implementations/lifecycle/lifecycleServiceFactory.ts","../src/lib/DependencyGraph.ts","../src/wiring/ServiceRegistry.ts","../src/wiring/BackendInitializer.ts","../src/wiring/BackstageBackend.ts","../src/wiring/createSpecializedBackend.ts","../src/services/implementations/auth/authServiceFactory.ts","../src/services/implementations/cache/cacheServiceFactory.ts","../src/services/implementations/config/rootConfigServiceFactory.ts","../src/services/implementations/database/databaseServiceFactory.ts","../src/services/implementations/discovery/HostDiscovery.ts","../src/services/implementations/discovery/discoveryServiceFactory.ts","../src/services/implementations/httpAuth/httpAuthServiceFactory.ts","../src/services/implementations/httpRouter/createLifecycleMiddleware.ts","../src/services/implementations/httpRouter/createCredentialsBarrier.ts","../src/services/implementations/httpRouter/httpRouterServiceFactory.ts","../src/services/implementations/identity/identityServiceFactory.ts","../src/services/implementations/logger/loggerServiceFactory.ts","../src/services/implementations/permissions/permissionsServiceFactory.ts","../src/services/implementations/rootHttpRouter/DefaultRootHttpRouter.ts","../src/services/implementations/rootHttpRouter/rootHttpRouterServiceFactory.ts","../src/services/implementations/rootLogger/rootLoggerServiceFactory.ts","../src/services/implementations/scheduler/schedulerServiceFactory.ts","../src/services/implementations/tokenManager/tokenManagerServiceFactory.ts","../src/services/implementations/urlReader/urlReaderServiceFactory.ts","../src/services/implementations/userInfo/userInfoServiceFactory.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Config, ConfigReader } from '@backstage/config';\nimport { JsonValue } from '@backstage/types';\n\nexport class ObservableConfigProxy implements Config {\n private config: Config = new ConfigReader({});\n\n private readonly subscribers: (() => void)[] = [];\n\n constructor(\n private readonly parent?: ObservableConfigProxy,\n private parentKey?: string,\n ) {\n if (parent && !parentKey) {\n throw new Error('parentKey is required if parent is set');\n }\n }\n\n setConfig(config: Config) {\n if (this.parent) {\n throw new Error('immutable');\n }\n this.config = config;\n for (const subscriber of this.subscribers) {\n try {\n subscriber();\n } catch (error) {\n console.error(`Config subscriber threw error, ${error}`);\n }\n }\n }\n\n subscribe(onChange: () => void): { unsubscribe: () => void } {\n if (this.parent) {\n return this.parent.subscribe(onChange);\n }\n\n this.subscribers.push(onChange);\n return {\n unsubscribe: () => {\n const index = this.subscribers.indexOf(onChange);\n if (index >= 0) {\n this.subscribers.splice(index, 1);\n }\n },\n };\n }\n\n private select(required: true): Config;\n private select(required: false): Config | undefined;\n private select(required: boolean): Config | undefined {\n if (this.parent && this.parentKey) {\n if (required) {\n return this.parent.select(true).getConfig(this.parentKey);\n }\n return this.parent.select(false)?.getOptionalConfig(this.parentKey);\n }\n\n return this.config;\n }\n\n has(key: string): boolean {\n return this.select(false)?.has(key) ?? false;\n }\n keys(): string[] {\n return this.select(false)?.keys() ?? [];\n }\n get<T = JsonValue>(key?: string): T {\n return this.select(true).get(key);\n }\n getOptional<T = JsonValue>(key?: string): T | undefined {\n return this.select(false)?.getOptional(key);\n }\n getConfig(key: string): Config {\n return new ObservableConfigProxy(this, key);\n }\n getOptionalConfig(key: string): Config | undefined {\n if (this.select(false)?.has(key)) {\n return new ObservableConfigProxy(this, key);\n }\n return undefined;\n }\n getConfigArray(key: string): Config[] {\n return this.select(true).getConfigArray(key);\n }\n getOptionalConfigArray(key: string): Config[] | undefined {\n return this.select(false)?.getOptionalConfigArray(key);\n }\n getNumber(key: string): number {\n return this.select(true).getNumber(key);\n }\n getOptionalNumber(key: string): number | undefined {\n return this.select(false)?.getOptionalNumber(key);\n }\n getBoolean(key: string): boolean {\n return this.select(true).getBoolean(key);\n }\n getOptionalBoolean(key: string): boolean | undefined {\n return this.select(false)?.getOptionalBoolean(key);\n }\n getString(key: string): string {\n return this.select(true).getString(key);\n }\n getOptionalString(key: string): string | undefined {\n return this.select(false)?.getOptionalString(key);\n }\n getStringArray(key: string): string[] {\n return this.select(true).getStringArray(key);\n }\n getOptionalStringArray(key: string): string[] | undefined {\n return this.select(false)?.getOptionalStringArray(key);\n }\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport function isValidUrl(url: string): boolean {\n try {\n // eslint-disable-next-line no-new\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { resolve as resolvePath } from 'path';\nimport parseArgs from 'minimist';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { findPaths } from '@backstage/cli-common';\nimport {\n loadConfigSchema,\n loadConfig,\n ConfigTarget,\n LoadConfigOptionsRemote,\n ConfigSchema,\n} from '@backstage/config-loader';\nimport { ConfigReader } from '@backstage/config';\nimport type { Config, AppConfig } from '@backstage/config';\nimport { getPackages } from '@manypkg/get-packages';\nimport { ObservableConfigProxy } from './ObservableConfigProxy';\nimport { isValidUrl } from '../lib/urls';\n\n/** @public */\nexport async function createConfigSecretEnumerator(options: {\n logger: LoggerService;\n dir?: string;\n schema?: ConfigSchema;\n}): Promise<(config: Config) => Iterable<string>> {\n const { logger, dir = process.cwd() } = options;\n const { packages } = await getPackages(dir);\n const schema =\n options.schema ??\n (await loadConfigSchema({\n dependencies: packages.map(p => p.packageJson.name),\n }));\n\n return (config: Config) => {\n const [secretsData] = schema.process(\n [{ data: config.getOptional() ?? {}, context: 'schema-enumerator' }],\n {\n visibility: ['secret'],\n ignoreSchemaErrors: true,\n },\n );\n const secrets = new Set<string>();\n JSON.parse(\n JSON.stringify(secretsData.data),\n (_, v) => typeof v === 'string' && secrets.add(v),\n );\n logger.info(\n `Found ${secrets.size} new secrets in config that will be redacted`,\n );\n return secrets;\n };\n}\n\n/**\n * Load configuration for a Backend.\n *\n * This function should only be called once, during the initialization of the backend.\n *\n * @public\n */\nexport async function loadBackendConfig(options: {\n remote?: LoadConfigOptionsRemote;\n argv: string[];\n additionalConfigs?: AppConfig[];\n watch?: boolean;\n}): Promise<{ config: Config }> {\n const args = parseArgs(options.argv);\n\n const configTargets: ConfigTarget[] = [args.config ?? []]\n .flat()\n .map(arg => (isValidUrl(arg) ? { url: arg } : { path: resolvePath(arg) }));\n\n /* eslint-disable-next-line no-restricted-syntax */\n const paths = findPaths(__dirname);\n\n let currentCancelFunc: (() => void) | undefined = undefined;\n\n const config = new ObservableConfigProxy();\n const { appConfigs } = await loadConfig({\n configRoot: paths.targetRoot,\n configTargets: configTargets,\n remote: options.remote,\n watch:\n options.watch ?? true\n ? {\n onChange(newConfigs) {\n console.info(\n `Reloaded config from ${newConfigs\n .map(c => c.context)\n .join(', ')}`,\n );\n const configsToMerge = [...newConfigs];\n if (options.additionalConfigs) {\n configsToMerge.push(...options.additionalConfigs);\n }\n config.setConfig(ConfigReader.fromConfigs(configsToMerge));\n },\n stopSignal: new Promise(resolve => {\n if (currentCancelFunc) {\n currentCancelFunc();\n }\n currentCancelFunc = resolve;\n\n // TODO(Rugvip): We keep this here for now to avoid breaking the old system\n // since this is re-used in backend-common\n if (module.hot) {\n module.hot.addDisposeHandler(resolve);\n }\n }),\n }\n : undefined,\n });\n console.info(\n `Loaded config from ${appConfigs.map(c => c.context).join(', ')}`,\n );\n\n const finalAppConfigs = [...appConfigs];\n if (options.additionalConfigs) {\n finalAppConfigs.push(...options.additionalConfigs);\n }\n config.setConfig(ConfigReader.fromConfigs(finalAppConfigs));\n\n return { config };\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Config } from '@backstage/config';\nimport { HttpServerOptions } from './types';\n\nconst DEFAULT_PORT = 7007;\nconst DEFAULT_HOST = '';\n\n/**\n * Reads {@link HttpServerOptions} from a {@link @backstage/config#Config} object.\n *\n * @public\n * @remarks\n *\n * The provided configuration object should contain the `listen` and\n * additional keys directly.\n *\n * @example\n * ```ts\n * const opts = readHttpServerOptions(config.getConfig('backend'));\n * ```\n */\nexport function readHttpServerOptions(config?: Config): HttpServerOptions {\n return {\n listen: readHttpListenOptions(config),\n https: readHttpsOptions(config),\n };\n}\n\nfunction readHttpListenOptions(config?: Config): HttpServerOptions['listen'] {\n const listen = config?.getOptional('listen');\n if (typeof listen === 'string') {\n const parts = String(listen).split(':');\n const port = parseInt(parts[parts.length - 1], 10);\n if (!isNaN(port)) {\n if (parts.length === 1) {\n return { port, host: DEFAULT_HOST };\n }\n if (parts.length === 2) {\n return { host: parts[0], port };\n }\n }\n throw new Error(\n `Unable to parse listen address ${listen}, expected <port> or <host>:<port>`,\n );\n }\n\n // Workaround to allow empty string\n const host = config?.getOptional('listen.host') ?? DEFAULT_HOST;\n if (typeof host !== 'string') {\n config?.getOptionalString('listen.host'); // will throw\n throw new Error('unreachable');\n }\n\n return {\n port: config?.getOptionalNumber('listen.port') ?? DEFAULT_PORT,\n host,\n };\n}\n\nfunction readHttpsOptions(config?: Config): HttpServerOptions['https'] {\n const https = config?.getOptional('https');\n if (https === true) {\n const baseUrl = config!.getString('baseUrl');\n let hostname;\n try {\n hostname = new URL(baseUrl).hostname;\n } catch (error) {\n throw new Error(`Invalid baseUrl \"${baseUrl}\"`);\n }\n\n return { certificate: { type: 'generated', hostname } };\n }\n\n const cc = config?.getOptionalConfig('https');\n if (!cc) {\n return undefined;\n }\n\n return {\n certificate: {\n type: 'pem',\n cert: cc.getString('certificate.cert'),\n key: cc.getString('certificate.key'),\n },\n };\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport fs from 'fs-extra';\nimport { resolve as resolvePath, dirname } from 'path';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport forge from 'node-forge';\n\nconst FIVE_DAYS_IN_MS = 5 * 24 * 60 * 60 * 1000;\n\nconst IP_HOSTNAME_REGEX = /:|^\\d+\\.\\d+\\.\\d+\\.\\d+$/;\n\nexport async function getGeneratedCertificate(\n hostname: string,\n logger: LoggerService,\n) {\n const hasModules = await fs.pathExists('node_modules');\n let certPath;\n if (hasModules) {\n certPath = resolvePath(\n 'node_modules/.cache/backstage-backend/dev-cert.pem',\n );\n await fs.ensureDir(dirname(certPath));\n } else {\n certPath = resolvePath('.dev-cert.pem');\n }\n\n if (await fs.pathExists(certPath)) {\n try {\n const cert = await fs.readFile(certPath);\n\n const crt = forge.pki.certificateFromPem(cert.toString());\n const remainingMs = crt.validity.notAfter.getTime() - Date.now();\n if (remainingMs > FIVE_DAYS_IN_MS) {\n logger.info('Using existing self-signed certificate');\n return {\n key: cert,\n cert,\n };\n }\n } catch (error) {\n logger.warn(`Unable to use existing self-signed certificate, ${error}`);\n }\n }\n\n logger.info('Generating new self-signed certificate');\n const newCert = await generateCertificate(hostname);\n await fs.writeFile(certPath, newCert.cert + newCert.key, 'utf8');\n return newCert;\n}\n\nasync function generateCertificate(hostname: string) {\n const attributes = [\n {\n name: 'commonName',\n value: 'dev-cert',\n },\n ];\n\n const sans = [\n {\n type: 2, // DNS\n value: 'localhost',\n },\n {\n type: 2,\n value: 'localhost.localdomain',\n },\n {\n type: 2,\n value: '[::1]',\n },\n {\n type: 7, // IP\n ip: '127.0.0.1',\n },\n {\n type: 7,\n ip: 'fe80::1',\n },\n ];\n\n // Add hostname from backend.baseUrl if it doesn't already exist in our list of SANs\n if (!sans.find(({ value, ip }) => value === hostname || ip === hostname)) {\n sans.push(\n IP_HOSTNAME_REGEX.test(hostname)\n ? {\n type: 7,\n ip: hostname,\n }\n : {\n type: 2,\n value: hostname,\n },\n );\n }\n\n const params = {\n algorithm: 'sha256',\n keySize: 2048,\n days: 30,\n extensions: [\n {\n name: 'keyUsage',\n keyCertSign: true,\n digitalSignature: true,\n nonRepudiation: true,\n keyEncipherment: true,\n dataEncipherment: true,\n },\n {\n name: 'extKeyUsage',\n serverAuth: true,\n clientAuth: true,\n codeSigning: true,\n timeStamping: true,\n },\n {\n name: 'subjectAltName',\n altNames: sans,\n },\n ],\n };\n\n return new Promise<{ key: string; cert: string }>((resolve, reject) =>\n require('selfsigned').generate(\n attributes,\n params,\n (err: Error, bundle: { private: string; cert: string }) => {\n if (err) {\n reject(err);\n } else {\n resolve({ key: bundle.private, cert: bundle.cert });\n }\n },\n ),\n );\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as http from 'http';\nimport * as https from 'https';\nimport stoppableServer from 'stoppable';\nimport { RequestListener } from 'http';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { HttpServerOptions, ExtendedHttpServer } from './types';\nimport { getGeneratedCertificate } from './getGeneratedCertificate';\n\n/**\n * Creates a Node.js HTTP or HTTPS server instance.\n *\n * @public\n */\nexport async function createHttpServer(\n listener: RequestListener,\n options: HttpServerOptions,\n deps: { logger: LoggerService },\n): Promise<ExtendedHttpServer> {\n const server = await createServer(listener, options, deps);\n\n const stopper = stoppableServer(server, 0);\n // The stopper here is actually the server itself, so if we try\n // to call stopper.stop() down in the stop implementation, we'll\n // be calling ourselves.\n const stopServer = stopper.stop.bind(stopper);\n\n return Object.assign(server, {\n start() {\n return new Promise<void>((resolve, reject) => {\n const handleStartupError = (error: Error) => {\n server.close();\n reject(error);\n };\n\n server.on('error', handleStartupError);\n\n const { host, port } = options.listen;\n server.listen(port, host, () => {\n server.off('error', handleStartupError);\n deps.logger.info(`Listening on ${host}:${port}`);\n resolve();\n });\n });\n },\n\n stop() {\n return new Promise<void>((resolve, reject) => {\n stopServer((error?: Error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n },\n\n port() {\n const address = server.address();\n if (typeof address === 'string' || address === null) {\n throw new Error(`Unexpected server address '${address}'`);\n }\n return address.port;\n },\n });\n}\n\nasync function createServer(\n listener: RequestListener,\n options: HttpServerOptions,\n deps: { logger: LoggerService },\n): Promise<http.Server> {\n if (options.https) {\n const { certificate } = options.https;\n if (certificate.type === 'generated') {\n const credentials = await getGeneratedCertificate(\n certificate.hostname,\n deps.logger,\n );\n return https.createServer(credentials, listener);\n }\n return https.createServer(certificate, listener);\n }\n\n return http.createServer(listener);\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Config } from '@backstage/config';\nimport helmet from 'helmet';\nimport { HelmetOptions } from 'helmet';\nimport { ContentSecurityPolicyOptions } from 'helmet/dist/types/middlewares/content-security-policy';\n\n/**\n * Attempts to read Helmet options from the backend configuration object.\n *\n * @public\n * @param config - The backend configuration object.\n * @returns A Helmet options object, or undefined if no Helmet configuration is present.\n *\n * @example\n * ```ts\n * const helmetOptions = readHelmetOptions(config.getConfig('backend'));\n * ```\n */\nexport function readHelmetOptions(config?: Config): HelmetOptions {\n const cspOptions = readCspDirectives(config);\n return {\n contentSecurityPolicy: {\n useDefaults: false,\n directives: applyCspDirectives(cspOptions),\n },\n // These are all disabled in order to maintain backwards compatibility\n // when bumping helmet v5. We can't enable these by default because\n // there is no way for users to configure them.\n // TODO(Rugvip): We should give control of this setup to consumers\n crossOriginEmbedderPolicy: false,\n crossOriginOpenerPolicy: false,\n crossOriginResourcePolicy: false,\n originAgentCluster: false,\n };\n}\n\ntype CspDirectives = Record<string, string[] | false> | undefined;\n\n/**\n * Attempts to read a CSP directives from the backend configuration object.\n *\n * @example\n * ```yaml\n * backend:\n * csp:\n * connect-src: [\"'self'\", 'http:', 'https:']\n * upgrade-insecure-requests: false\n * ```\n */\nfunction readCspDirectives(config?: Config): CspDirectives {\n const cc = config?.getOptionalConfig('csp');\n if (!cc) {\n return undefined;\n }\n\n const result: Record<string, string[] | false> = {};\n for (const key of cc.keys()) {\n if (cc.get(key) === false) {\n result[key] = false;\n } else {\n result[key] = cc.getStringArray(key);\n }\n }\n\n return result;\n}\n\nexport function applyCspDirectives(\n directives: CspDirectives,\n): ContentSecurityPolicyOptions['directives'] {\n const result: ContentSecurityPolicyOptions['directives'] =\n helmet.contentSecurityPolicy.getDefaultDirectives();\n\n // TODO(Rugvip): We currently use non-precompiled AJV for validation in the frontend, which uses eval.\n // It should be replaced by any other solution that doesn't require unsafe-eval.\n result['script-src'] = [\"'self'\", \"'unsafe-eval'\"];\n\n // TODO(Rugvip): This is removed so that we maintained backwards compatibility\n // when bumping to helmet v5, we could remove this as well as\n // skip setting `useDefaults: false` in the future.\n delete result['form-action'];\n\n if (directives) {\n for (const [key, value] of Object.entries(directives)) {\n if (value === false) {\n delete result[key];\n } else {\n result[key] = value;\n }\n }\n }\n\n return result;\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Config } from '@backstage/config';\nimport { CorsOptions } from 'cors';\nimport { Minimatch } from 'minimatch';\n\n/**\n * Attempts to read a CORS options object from the backend configuration object.\n *\n * @public\n * @param config - The backend configuration object.\n * @returns A CORS options object, or undefined if no cors configuration is present.\n *\n * @example\n * ```ts\n * const corsOptions = readCorsOptions(config.getConfig('backend'));\n * ```\n */\nexport function readCorsOptions(config?: Config): CorsOptions {\n const cc = config?.getOptionalConfig('cors');\n if (!cc) {\n return { origin: false }; // Disable CORS\n }\n\n return removeUnknown({\n origin: createCorsOriginMatcher(readStringArray(cc, 'origin')),\n methods: readStringArray(cc, 'methods'),\n allowedHeaders: readStringArray(cc, 'allowedHeaders'),\n exposedHeaders: readStringArray(cc, 'exposedHeaders'),\n credentials: cc.getOptionalBoolean('credentials'),\n maxAge: cc.getOptionalNumber('maxAge'),\n preflightContinue: cc.getOptionalBoolean('preflightContinue'),\n optionsSuccessStatus: cc.getOptionalNumber('optionsSuccessStatus'),\n });\n}\n\nfunction removeUnknown<T extends object>(obj: T): T {\n return Object.fromEntries(\n Object.entries(obj).filter(([, v]) => v !== undefined),\n ) as T;\n}\n\nfunction readStringArray(config: Config, key: string): string[] | undefined {\n const value = config.getOptional(key);\n if (typeof value === 'string') {\n return [value];\n } else if (!value) {\n return undefined;\n }\n return config.getStringArray(key);\n}\n\nfunction createCorsOriginMatcher(allowedOriginPatterns: string[] | undefined) {\n if (!allowedOriginPatterns) {\n return undefined;\n }\n\n const allowedOriginMatchers = allowedOriginPatterns.map(\n pattern => new Minimatch(pattern, { nocase: true, noglobstar: true }),\n );\n\n return (\n origin: string | undefined,\n callback: (\n err: Error | null,\n origin: boolean | string | RegExp | (boolean | string | RegExp)[],\n ) => void,\n ) => {\n return callback(\n null,\n allowedOriginMatchers.some(pattern => pattern.match(origin ?? '')),\n );\n };\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { assertError } from '@backstage/errors';\nimport { randomBytes } from 'crypto';\n\nfunction handleBadError(error: Error, logger: LoggerService) {\n const logId = randomBytes(10).toString('hex');\n logger\n .child({ logId })\n .error(`Filtered internal error with logId=${logId} from response`, error);\n const newError = new Error(`An internal error occurred logId=${logId}`);\n delete newError.stack; // Trim the stack since it's not particularly useful\n return newError;\n}\n\n/**\n * Filters out certain known error types that should never be returned in responses.\n *\n * @internal\n */\nexport function applyInternalErrorFilter(\n error: unknown,\n logger: LoggerService,\n): Error {\n try {\n assertError(error);\n } catch (assertionError: unknown) {\n assertError(assertionError);\n return handleBadError(assertionError, logger);\n }\n\n const constructorName = error.constructor.name;\n\n // DatabaseError are thrown by the pg-protocol module\n if (constructorName === 'DatabaseError') {\n return handleBadError(error, logger);\n }\n\n return error;\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n RootConfigService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport {\n Request,\n Response,\n ErrorRequestHandler,\n NextFunction,\n RequestHandler,\n} from 'express';\nimport cors from 'cors';\nimport helmet from 'helmet';\nimport morgan from 'morgan';\nimport compression from 'compression';\nimport { readHelmetOptions } from './readHelmetOptions';\nimport { readCorsOptions } from './readCorsOptions';\nimport {\n AuthenticationError,\n ConflictError,\n ErrorResponseBody,\n InputError,\n NotAllowedError,\n NotFoundError,\n NotModifiedError,\n ServiceUnavailableError,\n serializeError,\n} from '@backstage/errors';\nimport { NotImplementedError } from '@backstage/errors';\nimport { applyInternalErrorFilter } from './applyInternalErrorFilter';\n\n/**\n * Options used to create a {@link MiddlewareFactory}.\n *\n * @public\n */\nexport interface MiddlewareFactoryOptions {\n config: RootConfigService;\n logger: LoggerService;\n}\n\n/**\n * Options passed to the {@link MiddlewareFactory.error} middleware.\n *\n * @public\n */\nexport interface MiddlewareFactoryErrorOptions {\n /**\n * Whether error response bodies should show error stack traces or not.\n *\n * If not specified, by default shows stack traces only in development mode.\n */\n showStackTraces?: boolean;\n\n /**\n * Whether any 4xx errors should be logged or not.\n *\n * If not specified, default to only logging 5xx errors.\n */\n logAllErrors?: boolean;\n}\n\n/**\n * A utility to configure common middleware.\n *\n * @public\n */\nexport class MiddlewareFactory {\n #config: RootConfigService;\n #logger: LoggerService;\n\n /**\n * Creates a new {@link MiddlewareFactory}.\n */\n static create(options: MiddlewareFactoryOptions) {\n return new MiddlewareFactory(options);\n }\n\n private constructor(options: MiddlewareFactoryOptions) {\n this.#config = options.config;\n this.#logger = options.logger;\n }\n\n /**\n * Returns a middleware that unconditionally produces a 404 error response.\n *\n * @remarks\n *\n * Typically you want to place this middleware at the end of the chain, such\n * that it's the last one attempted after no other routes matched.\n *\n * @returns An Express request handler\n */\n notFound(): RequestHandler {\n return (_req: Request, res: Response) => {\n res.status(404).end();\n };\n }\n\n /**\n * Returns the compression middleware.\n *\n * @remarks\n *\n * The middleware will attempt to compress response bodies for all requests\n * that traverse through the middleware.\n */\n compression(): RequestHandler {\n return compression();\n }\n\n /**\n * Returns a request logging middleware.\n *\n * @remarks\n *\n * Typically you want to place this middleware at the start of the chain, such\n * that it always logs requests whether they are \"caught\" by handlers farther\n * down or not.\n *\n * @returns An Express request handler\n */\n logging(): RequestHandler {\n const logger = this.#logger.child({\n type: 'incomingRequest',\n });\n\n return morgan('combined', {\n stream: {\n write(message: string) {\n logger.info(message.trimEnd());\n },\n },\n });\n }\n\n /**\n * Returns a middleware that implements the helmet library.\n *\n * @remarks\n *\n * This middleware applies security policies to incoming requests and outgoing\n * responses. It is configured using config keys such as `backend.csp`.\n *\n * @see {@link https://helmetjs.github.io/}\n *\n * @returns An Express request handler\n */\n helmet(): RequestHandler {\n return helmet(readHelmetOptions(this.#config.getOptionalConfig('backend')));\n }\n\n /**\n * Returns a middleware that implements the cors library.\n *\n * @remarks\n *\n * This middleware handles CORS. It is configured using the config key\n * `backend.cors`.\n *\n * @see {@link https://github.com/expressjs/cors}\n *\n * @returns An Express request handler\n */\n cors(): RequestHandler {\n return cors(readCorsOptions(this.#config.getOptionalConfig('backend')));\n }\n\n /**\n * Express middleware to handle errors during request processing.\n *\n * @remarks\n *\n * This is commonly the very last middleware in the chain.\n *\n * Its primary purpose is not to do translation of business logic exceptions,\n * but rather to be a global catch-all for uncaught \"fatal\" errors that are\n * expected to result in a 500 error. However, it also does handle some common\n * error types (such as http-error exceptions, and the well-known error types\n * in the `@backstage/errors` package) and returns the enclosed status code\n * accordingly.\n *\n * It will also produce a response body with a serialized form of the error,\n * unless a previous handler already did send a body. See\n * {@link @backstage/errors#ErrorResponseBody} for the response shape used.\n *\n * @returns An Express error request handler\n */\n error(options: MiddlewareFactoryErrorOptions = {}): ErrorRequestHandler {\n const showStackTraces =\n options.showStackTraces ?? process.env.NODE_ENV === 'development';\n\n const logger = this.#logger.child({\n type: 'errorHandler',\n });\n\n return (\n rawError: Error,\n req: Request,\n res: Response,\n next: NextFunction,\n ) => {\n const error = applyInternalErrorFilter(rawError, logger);\n\n const statusCode = getStatusCode(error);\n if (options.logAllErrors || statusCode >= 500) {\n logger.error(`Request failed with status ${statusCode}`, error);\n }\n\n if (res.headersSent) {\n // If the headers have already been sent, do not send the response again\n // as this will throw an error in the backend.\n next(error);\n return;\n }\n\n const body: ErrorResponseBody = {\n error: serializeError(error, { includeStack: showStackTraces }),\n request: { method: req.method, url: req.url },\n response: { statusCode },\n };\n\n res.status(statusCode).json(body);\n };\n }\n}\n\nfunction getStatusCode(error: Error): number {\n // Look for common http library status codes\n const knownStatusCodeFields = ['statusCode', 'status'];\n for (const field of knownStatusCodeFields) {\n const statusCode = (error as any)[field];\n if (\n typeof statusCode === 'number' &&\n (statusCode | 0) === statusCode && // is whole integer\n statusCode >= 100 &&\n statusCode <= 599\n ) {\n return statusCode;\n }\n }\n\n // Handle well-known error types\n switch (error.name) {\n case NotModifiedError.name:\n return 304;\n case InputError.name:\n return 400;\n case AuthenticationError.name:\n return 401;\n case NotAllowedError.name:\n return 403;\n case NotFoundError.name:\n return 404;\n case ConflictError.name:\n return 409;\n case NotImplementedError.name:\n return 501;\n case ServiceUnavailableError.name:\n return 503;\n default:\n break;\n }\n\n // Fall back to internal server error\n return 500;\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Escapes a given string to be used inside a RegExp.\n *\n * Taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n */\nexport const escapeRegExp = (text: string) => {\n return text.replace(/[.*+?^${}(\\)|[\\]\\\\]/g, '\\\\$&');\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n LoggerService,\n RootLoggerService,\n} from '@backstage/backend-plugin-api';\nimport { JsonObject } from '@backstage/types';\nimport { Format, TransformableInfo } from 'logform';\nimport {\n Logger,\n format,\n createLogger,\n transports,\n transport as Transport,\n} from 'winston';\nimport { escapeRegExp } from '../lib/escapeRegExp';\n\n/**\n * @public\n */\nexport interface WinstonLoggerOptions {\n meta?: JsonObject;\n level?: string;\n format?: Format;\n transports?: Transport[];\n}\n\n/**\n * A {@link @backstage/backend-plugin-api#LoggerService} implementation based on winston.\n *\n * @public\n */\nexport class WinstonLogger implements RootLoggerService {\n #winston: Logger;\n #addRedactions?: (redactions: Iterable<string>) => void;\n\n /**\n * Creates a {@link WinstonLogger} instance.\n */\n static create(options: WinstonLoggerOptions): WinstonLogger {\n const redacter = WinstonLogger.redacter();\n const defaultFormatter =\n process.env.NODE_ENV === 'production'\n ? format.json()\n : WinstonLogger.colorFormat();\n\n let logger = createLogger({\n level: process.env.LOG_LEVEL || options.level || 'info',\n format: format.combine(\n redacter.format,\n options.format ?? defaultFormatter,\n ),\n transports: options.transports ?? new transports.Console(),\n });\n\n if (options.meta) {\n logger = logger.child(options.meta);\n }\n\n return new WinstonLogger(logger, redacter.add);\n }\n\n /**\n * Creates a winston log formatter for redacting secrets.\n */\n static redacter(): {\n format: Format;\n add: (redactions: Iterable<string>) => void;\n } {\n const redactionSet = new Set<string>();\n\n let redactionPattern: RegExp | undefined = undefined;\n\n return {\n format: format(info => {\n if (redactionPattern && typeof info.message === 'string') {\n info.message = info.message.replace(redactionPattern, '[REDACTED]');\n }\n if (redactionPattern && typeof info.stack === 'string') {\n info.stack = info.stack.replace(redactionPattern, '[REDACTED]');\n }\n return info;\n })(),\n add(newRedactions) {\n let added = 0;\n for (const redactionToTrim of newRedactions) {\n // Trimming the string ensures that we don't accdentally get extra\n // newlines or other whitespace interfering with the redaction; this\n // can happen for example when using string literals in yaml\n const redaction = redactionToTrim.trim();\n // Exclude secrets that are empty or just one character in length. These\n // typically mean that you are running local dev or tests, or using the\n // --lax flag which sets things to just 'x'.\n if (redaction.length <= 1) {\n continue;\n }\n if (!redactionSet.has(redaction)) {\n redactionSet.add(redaction);\n added += 1;\n }\n }\n if (added > 0) {\n const redactions = Array.from(redactionSet)\n .map(r => escapeRegExp(r))\n .join('|');\n redactionPattern = new RegExp(`(${redactions})`, 'g');\n }\n },\n };\n }\n\n /**\n * Creates a pretty printed winston log formatter.\n */\n static colorFormat(): Format {\n const colorizer = format.colorize();\n\n return format.combine(\n format.timestamp(),\n format.colorize({\n colors: {\n timestamp: 'dim',\n prefix: 'blue',\n field: 'cyan',\n debug: 'grey',\n },\n }),\n format.printf((info: TransformableInfo) => {\n const { timestamp, level, message, plugin, service, ...fields } = info;\n const prefix = plugin || service;\n const timestampColor = colorizer.colorize('timestamp', timestamp);\n const prefixColor = colorizer.colorize('prefix', prefix);\n\n const extraFields = Object.entries(fields)\n .map(\n ([key, value]) =>\n `${colorizer.colorize('field', `${key}`)}=${value}`,\n )\n .join(' ');\n\n return `${timestampColor} ${prefixColor} ${level} ${message} ${extraFields}`;\n }),\n );\n }\n\n private constructor(\n winston: Logger,\n addRedactions?: (redactions: Iterable<string>) => void,\n ) {\n this.#winston = winston;\n this.#addRedactions = addRedactions;\n }\n\n error(message: string, meta?: JsonObject): void {\n this.#winston.error(message, meta);\n }\n\n warn(message: string, meta?: JsonObject): void {\n this.#winston.warn(message, meta);\n }\n\n info(message: string, meta?: JsonObject): void {\n this.#winston.info(message, meta);\n }\n\n debug(message: string, meta?: JsonObject): void {\n this.#winston.debug(message, meta);\n }\n\n child(meta: JsonObject): LoggerService {\n return new WinstonLogger(this.#winston.child(meta));\n }\n\n addRedactions(redactions: Iterable<string>) {\n this.#addRedactions?.(redactions);\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createServiceFactory,\n coreServices,\n LifecycleServiceStartupHook,\n LifecycleServiceStartupOptions,\n LifecycleServiceShutdownHook,\n LifecycleServiceShutdownOptions,\n RootLifecycleService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\n\n/** @internal */\nexport class BackendLifecycleImpl implements RootLifecycleService {\n constructor(private readonly logger: LoggerService) {}\n\n #hasStarted = false;\n #startupTasks: Array<{\n hook: LifecycleServiceStartupHook;\n options?: LifecycleServiceStartupOptions;\n }> = [];\n\n addStartupHook(\n hook: LifecycleServiceStartupHook,\n options?: LifecycleServiceStartupOptions,\n ): void {\n if (this.#hasStarted) {\n throw new Error('Attempted to add startup hook after startup');\n }\n this.#startupTasks.push({ hook, options });\n }\n\n async startup(): Promise<void> {\n if (this.#hasStarted) {\n return;\n }\n this.#hasStarted = true;\n\n this.logger.debug(`Running ${this.#startupTasks.length} startup tasks...`);\n await Promise.all(\n this.#startupTasks.map(async ({ hook, options }) => {\n const logger = options?.logger ?? this.logger;\n try {\n await hook();\n logger.debug(`Startup hook succeeded`);\n } catch (error) {\n logger.error(`Startup hook failed, ${error}`);\n }\n }),\n );\n }\n\n #hasShutdown = false;\n #shutdownTasks: Array<{\n hook: LifecycleServiceShutdownHook;\n options?: LifecycleServiceShutdownOptions;\n }> = [];\n\n addShutdownHook(\n hook: LifecycleServiceShutdownHook,\n options?: LifecycleServiceShutdownOptions,\n ): void {\n if (this.#hasShutdown) {\n throw new Error('Attempted to add shutdown hook after shutdown');\n }\n this.#shutdownTasks.push({ hook, options });\n }\n\n async shutdown(): Promise<void> {\n if (this.#hasShutdown) {\n return;\n }\n this.#hasShutdown = true;\n\n this.logger.debug(\n `Running ${this.#shutdownTasks.length} shutdown tasks...`,\n );\n await Promise.all(\n this.#shutdownTasks.map(async ({ hook, options }) => {\n const logger = options?.logger ?? this.logger;\n try {\n await hook();\n logger.debug(`Shutdown hook succeeded`);\n } catch (error) {\n logger.error(`Shutdown hook failed, ${error}`);\n }\n }),\n );\n }\n}\n\n/**\n * Allows plugins to register shutdown hooks that are run when the process is about to exit.\n *\n * @public\n */\nexport const rootLifecycleServiceFactory = createServiceFactory({\n service: coreServices.rootLifecycle,\n deps: {\n logger: coreServices.rootLogger,\n },\n async factory({ logger }) {\n return new BackendLifecycleImpl(logger);\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n LifecycleService,\n LifecycleServiceShutdownHook,\n LifecycleServiceShutdownOptions,\n LifecycleServiceStartupHook,\n LifecycleServiceStartupOptions,\n LoggerService,\n PluginMetadataService,\n RootLifecycleService,\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\n\n/** @internal */\nexport class BackendPluginLifecycleImpl implements LifecycleService {\n constructor(\n private readonly logger: LoggerService,\n private readonly rootLifecycle: RootLifecycleService,\n private readonly pluginMetadata: PluginMetadataService,\n ) {}\n\n #hasStarted = false;\n #startupTasks: Array<{\n hook: LifecycleServiceStartupHook;\n options?: LifecycleServiceStartupOptions;\n }> = [];\n\n addStartupHook(\n hook: LifecycleServiceStartupHook,\n options?: LifecycleServiceStartupOptions,\n ): void {\n if (this.#hasStarted) {\n throw new Error('Attempted to add startup hook after startup');\n }\n this.#startupTasks.push({ hook, options });\n }\n\n async startup(): Promise<void> {\n if (this.#hasStarted) {\n return;\n }\n this.#hasStarted = true;\n\n this.logger.debug(\n `Running ${this.#startupTasks.length} plugin startup tasks...`,\n );\n await Promise.all(\n this.#startupTasks.map(async ({ hook, options }) => {\n const logger = options?.logger ?? this.logger;\n try {\n await hook();\n logger.debug(`Plugin startup hook succeeded`);\n } catch (error) {\n logger.error(`Plugin startup hook failed, ${error}`);\n }\n }),\n );\n }\n\n addShutdownHook(\n hook: LifecycleServiceShutdownHook,\n options?: LifecycleServiceShutdownOptions,\n ): void {\n const plugin = this.pluginMetadata.getId();\n this.rootLifecycle.addShutdownHook(hook, {\n logger: options?.logger?.child({ plugin }) ?? this.logger,\n });\n }\n}\n\n/**\n * Allows plugins to register shutdown hooks that are run when the process is about to exit.\n * @public\n */\nexport const lifecycleServiceFactory = createServiceFactory({\n service: coreServices.lifecycle,\n deps: {\n logger: coreServices.logger,\n rootLifecycle: coreServices.rootLifecycle,\n pluginMetadata: coreServices.pluginMetadata,\n },\n async factory({ rootLifecycle, logger, pluginMetadata }) {\n return new BackendPluginLifecycleImpl(\n logger,\n rootLifecycle,\n pluginMetadata,\n );\n },\n});\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\ninterface NodeInput<T> {\n value: T;\n consumes?: Iterable<string>;\n provides?: Iterable<string>;\n}\n\n/** @internal */\nclass Node<T> {\n static from<T>(input: NodeInput<T>) {\n return new Node<T>(\n input.value,\n input.consumes ? new Set(input.consumes) : new Set(),\n input.provides ? new Set(input.provides) : new Set(),\n );\n }\n\n private constructor(\n readonly value: T,\n readonly consumes: Set<string>,\n readonly provides: Set<string>,\n ) {}\n}\n\n/** @internal */\nclass CycleKeySet<T> {\n static from<T>(nodes: Array<Node<T>>) {\n return new CycleKeySet<T>(nodes);\n }\n\n #nodeIds: Map<T, number>;\n #cycleKeys: Set<string>;\n\n private constructor(nodes: Array<Node<T>>) {\n this.#nodeIds = new Map(nodes.map((n, i) => [n.value, i]));\n this.#cycleKeys = new Set<string>();\n }\n\n tryAdd(path: T[]): boolean {\n const cycleKey = this.#getCycleKey(path);\n if (this.#cycleKeys.has(cycleKey)) {\n return false;\n }\n this.#cycleKeys.add(cycleKey);\n return true;\n }\n\n #getCycleKey(path: T[]): string {\n return path\n .map(n => this.#nodeIds.get(n)!)\n .sort()\n .join(',');\n }\n}\n\n/**\n * Internal helper to help validate and traverse a dependency graph.\n * @internal\n */\nexport class DependencyGraph<T> {\n static fromMap(\n nodes: Record<string, Omit<NodeInput<unknown>, 'value'>>,\n ): DependencyGraph<string> {\n return this.fromIterable(\n Object.entries(nodes).map(([key, node]) => ({\n value: String(key),\n ...node,\n })),\n );\n }\n\n static fromIterable<T>(\n nodeInputs: Iterable<NodeInput<T>>,\n ): DependencyGraph<T> {\n const nodes = new Array<Node<T>>();\n for (const nodeInput of nodeInputs) {\n nodes.push(Node.from(nodeInput));\n }\n\n return new DependencyGraph(nodes);\n }\n\n #nodes: Array<Node<T>>;\n #allProvided: Set<string>;\n\n private constructor(nodes: Array<Node<T>>) {\n this.#nodes = nodes;\n this.#allProvided = new Set();\n\n for (const node of this.#nodes.values()) {\n for (const produced of node.provides) {\n this.#allProvided.add(produced);\n }\n }\n }\n\n /**\n * Find all nodes that consume dependencies that are not provided by any other node.\n */\n findUnsatisfiedDeps(): Array<{ value: T; unsatisfied: string[] }> {\n const unsatisfiedDependencies = [];\n for (const node of this.#nodes.values()) {\n const unsatisfied = Array.from(node.consumes).filter(\n id => !this.#allProvided.has(id),\n );\n if (unsatisfied.length > 0) {\n unsatisfiedDependencies.push({ value: node.value, unsatisfied });\n }\n }\n return unsatisfiedDependencies;\n }\n\n /**\n * Detect the first circular dependency within the graph, returning the path of nodes that\n * form a cycle, with the same node as the first and last element of the array.\n */\n detectCircularDependency(): T[] | undefined {\n return this.detectCircularDependencies().next().value;\n }\n\n /**\n * Detect circular dependencies within the graph, returning the path of nodes that\n * form a cycle, with the same node as the first and last element of the array.\n */\n *detectCircularDependencies(): Generator<T[], undefined> {\n const cycleKeys = CycleKeySet.from(this.#nodes);\n\n for (const startNode of this.#nodes) {\n const visited = new Set<Node<T>>();\n const stack = new Array<[node: Node<T>, path: T[]]>([\n startNode,\n [startNode.value],\n ]);\n\n while (stack.length > 0) {\n const [node, path] = stack.pop()!;\n if (visited.has(node)) {\n continue;\n }\n visited.add(node);\n for (const consumed of node.consumes) {\n const providerNodes = this.#nodes.filter(other =>\n other.provides.has(consumed),\n );\n for (const provider of providerNodes) {\n if (provider === startNode) {\n if (cycleKeys.tryAdd(path)) {\n yield [...path, startNode.value];\n }\n\n break;\n }\n if (!visited.has(provider)) {\n stack.push([provider, [...path, provider.value]]);\n }\n }\n }\n }\n }\n return undefined;\n }\n\n /**\n * Traverses the dependency graph in topological order, calling the provided\n * function for each node and waiting for it to resolve.\n *\n * The nodes are traversed in parallel, but in such a way that no node is\n * visited before all of its dependencies.\n *\n * Dependencies of nodes that are not produced by any other nodes will be ignored.\n */\n async parallelTopologicalTraversal<TResult>(\n fn: (value: T) => Promise<TResult>,\n ): Promise<TResult[]> {\n const allProvided = this.#allProvided;\n const producedSoFar = new Set<string>();\n const waiting = new Set(this.#nodes.values());\n const visited = new Set<Node<T>>();\n const results = new Array<TResult>();\n let inFlight = 0; // Keep track of how many callbacks are in flight, so that we know if we got stuck\n\n // Find all nodes that have no dependencies that have not already been produced by visited nodes\n async function processMoreNodes() {\n if (waiting.size === 0) {\n return;\n }\n const nodesToProcess = [];\n for (const node of waiting) {\n let ready = true;\n for (const consumed of node.consumes) {\n if (allProvided.has(consumed) && !producedSoFar.has(consumed)) {\n ready = false;\n continue;\n }\n }\n if (ready) {\n nodesToProcess.push(node);\n }\n }\n\n for (const node of nodesToProcess) {\n waiting.delete(node);\n }\n\n if (nodesToProcess.length === 0 && inFlight === 0) {\n // We expect the caller to check for circular dependencies before\n // traversal, so this error should never happen\n throw new Error('Circular dependency detected');\n }\n\n await Promise.all(nodesToProcess.map(processNode));\n }\n\n // Process an individual node, and then add its produced dependencies to the set of available products\n async function processNode(node: Node<T>) {\n visited.add(node);\n inFlight += 1;\n\n const result = await fn(node.value);\n results.push(result);\n\n node.provides.forEach(produced => producedSoFar.add(produced));\n inFlight -= 1;\n await processMoreNodes();\n }\n\n await processMoreNodes();\n\n return results;\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ServiceFactory,\n ServiceRef,\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { ConflictError, stringifyError } from '@backstage/errors';\n// Direct internal import to avoid duplication\n// eslint-disable-next-line @backstage/no-forbidden-package-imports\nimport { InternalServiceFactory } from '@backstage/backend-plugin-api/src/services/system/types';\nimport { DependencyGraph } from '../lib/DependencyGraph';\n/**\n * Keep in sync with `@backstage/backend-plugin-api/src/services/system/types.ts`\n * @internal\n */\nexport type InternalServiceRef = ServiceRef<unknown> & {\n __defaultFactory?: (\n service: ServiceRef<unknown>,\n ) => Promise<ServiceFactory | (() => ServiceFactory)>;\n};\n\nfunction toInternalServiceFactory<TService, TScope extends 'plugin' | 'root'>(\n factory: ServiceFactory<TService, TScope>,\n): InternalServiceFactory<TService, TScope> {\n const f = factory as InternalServiceFactory<TService, TScope>;\n if (f.$$type !== '@backstage/BackendFeature') {\n throw new Error(`Invalid service factory, bad type '${f.$$type}'`);\n }\n if (f.version !== 'v1') {\n throw new Error(`Invalid service factory, bad version '${f.version}'`);\n }\n return f;\n}\n\nconst pluginMetadataServiceFactory = createServiceFactory(\n (options?: { pluginId: string }) => ({\n service: coreServices.pluginMetadata,\n deps: {},\n factory: async () => ({ getId: () => options?.pluginId! }),\n }),\n);\n\nexport class ServiceRegistry {\n static create(factories: Array<ServiceFactory>): ServiceRegistry {\n const registry = new ServiceRegistry(factories);\n registry.checkForCircularDeps();\n return registry;\n }\n\n readonly #providedFactories: Map<string, InternalServiceFactory>;\n readonly #loadedDefaultFactories: Map<\n Function,\n Promise<InternalServiceFactory>\n >;\n readonly #implementations: Map<\n InternalServiceFactory,\n {\n context: Promise<unknown>;\n byPlugin: Map<string, Promise<unknown>>;\n }\n >;\n readonly #rootServiceImplementations = new Map<\n InternalServiceFactory,\n Promise<unknown>\n >();\n readonly #addedFactoryIds = new Set<string>();\n readonly #instantiatedFactories = new Set<string>();\n\n private constructor(factories: Array<ServiceFactory>) {\n this.#providedFactories = new Map(\n factories.map(sf => [sf.service.id, toInternalServiceFactory(sf)]),\n );\n this.#loadedDefaultFactories = new Map();\n this.#implementations = new Map();\n }\n\n #resolveFactory(\n ref: ServiceRef<unknown>,\n pluginId: string,\n ): Promise<InternalServiceFactory> | undefined {\n // Special case handling of the plugin metadata service, generating a custom factory for it each time\n if (ref.id === coreServices.pluginMetadata.id) {\n return Promise.resolve(\n toInternalServiceFactory(pluginMetadataServiceFactory({ pluginId })),\n );\n }\n\n let resolvedFactory:\n | Promise<InternalServiceFactory>\n | InternalServiceFactory\n | undefined = this.#providedFactories.get(ref.id);\n const { __defaultFactory: defaultFactory } = ref as InternalServiceRef;\n if (!resolvedFactory && !defaultFactory) {\n return undefined;\n }\n\n if (!resolvedFactory) {\n let loadedFactory = this.#loadedDefaultFactories.get(defaultFactory!);\n if (!loadedFactory) {\n loadedFactory = Promise.resolve()\n .then(() => defaultFactory!(ref))\n .then(f =>\n toInternalServiceFactory(typeof f === 'function' ? f() : f),\n );\n this.#loadedDefaultFactories.set(defaultFactory!, loadedFactory);\n }\n resolvedFactory = loadedFactory.catch(error => {\n throw new Error(\n `Failed to instantiate service '${\n ref.id\n }' because the default factory loader threw an error, ${stringifyError(\n error,\n )}`,\n );\n });\n }\n\n return Promise.resolve(resolvedFactory);\n }\n\n #checkForMissingDeps(factory: InternalServiceFactory, pluginId: string) {\n const missingDeps = Object.values(factory.deps).filter(ref => {\n if (ref.id === coreServices.pluginMetadata.id) {\n return false;\n }\n if (this.#providedFactories.get(ref.id)) {\n return false;\n }\n\n return !(ref as InternalServiceRef).__defaultFactory;\n });\n\n if (missingDeps.length) {\n const missing = missingDeps.map(r => `'${r.id}'`).join(', ');\n throw new Error(\n `Failed to instantiate service '${factory.service.id}' for '${pluginId}' because the following dependent services are missing: ${missing}`,\n );\n }\n }\n\n checkForCircularDeps(): void {\n const graph = DependencyGraph.fromIterable(\n Array.from(this.#providedFactories).map(\n ([serviceId, serviceFactory]) => ({\n value: serviceId,\n provides: [serviceId],\n consumes: Object.values(serviceFactory.deps).map(d => d.id),\n }),\n ),\n );\n const circularDependencies = Array.from(graph.detectCircularDependencies());\n\n if (circularDependencies.length) {\n const cycles = circularDependencies\n .map(c => c.map(id => `'${id}'`).join(' -> '))\n .join('\\n ');\n\n throw new ConflictError(`Circular dependencies detected:\\n ${cycles}`);\n }\n }\n\n add(factory: ServiceFactory) {\n const factoryId = factory.service.id;\n if (factoryId === coreServices.pluginMetadata.id) {\n throw new Error(\n `The ${coreServices.pluginMetadata.id} service cannot be overridden`,\n );\n }\n\n if (this.#addedFactoryIds.has(factoryId)) {\n throw new Error(\n `Duplicate service implementations provided for ${factoryId}`,\n );\n }\n\n if (this.#instantiatedFactories.has(factoryId)) {\n throw new Error(\n `Unable to set service factory with id ${factoryId}, service has already been instantiated`,\n );\n }\n\n this.#addedFactoryIds.add(factoryId);\n this.#providedFactories.set(factoryId, toInternalServiceFactory(factory));\n }\n\n getServiceRefs(): ServiceRef<unknown>[] {\n return Array.from(this.#providedFactories.values()).map(f => f.service);\n }\n\n get<T>(ref: ServiceRef<T>, pluginId: string): Promise<T> | undefined {\n this.#instantiatedFactories.add(ref.id);\n\n return this.#resolveFactory(ref, pluginId)?.then(factory => {\n if (factory.service.scope === 'root') {\n let existing = this.#rootServiceImplementations.get(factory);\n if (!existing) {\n this.#checkForMissingDeps(factory, pluginId);\n const rootDeps = new Array<Promise<[name: string, impl: unknown]>>();\n\n for (const [name, serviceRef] of Object.entries(factory.deps)) {\n if (serviceRef.scope !== 'root') {\n throw new Error(\n `Failed to instantiate 'root' scoped service '${ref.id}' because it depends on '${serviceRef.scope}' scoped service '${serviceRef.id}'.`,\n );\n }\n const target = this.get(serviceRef, pluginId)!;\n rootDeps.push(target.then(impl => [name, impl]));\n }\n\n existing = Promise.all(rootDeps).then(entries =>\n factory.factory(Object.fromEntries(entries), undefined),\n );\n this.#rootServiceImplementations.set(factory, existing);\n }\n return existing as Promise<T>;\n }\n\n let implementation = this.#implementations.get(factory);\n if (!implementation) {\n this.#checkForMissingDeps(factory, pluginId);\n const rootDeps = new Array<Promise<[name: string, impl: unknown]>>();\n\n for (const [name, serviceRef] of Object.entries(factory.deps)) {\n if (serviceRef.scope === 'root') {\n const target = this.get(serviceRef, pluginId)!;\n rootDeps.push(target.then(impl => [name, impl]));\n }\n }\n\n implementation = {\n context: Promise.all(rootDeps)\n .then(entries =>\n factory.createRootContext?.(Object.fromEntries(entries)),\n )\n .catch(error => {\n const cause = stringifyError(error);\n throw new Error(\n `Failed to instantiate service '${ref.id}' because createRootContext threw an error, ${cause}`,\n );\n }),\n byPlugin: new Map(),\n };\n\n this.#implementations.set(factory, implementation);\n }\n\n let result = implementation.byPlugin.get(pluginId) as Promise<any>;\n if (!result) {\n const allDeps = new Array<Promise<[name: string, impl: unknown]>>();\n\n for (const [name, serviceRef] of Object.entries(factory.deps)) {\n const target = this.get(serviceRef, pluginId)!;\n allDeps.push(target.then(impl => [name, impl]));\n }\n\n result = implementation.context\n .then(context =>\n Promise.all(allDeps).then(entries =>\n factory.factory(Object.fromEntries(entries), context),\n ),\n )\n .catch(error => {\n const cause = stringifyError(error);\n throw new Error(\n `Failed to instantiate service '${ref.id}' for '${pluginId}' because the factory function threw an error, ${cause}`,\n );\n });\n implementation.byPlugin.set(pluginId, result);\n }\n\n return result;\n });\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n BackendFeature,\n ExtensionPoint,\n coreServices,\n ServiceRef,\n ServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { BackendLifecycleImpl } from '../services/implementations/rootLifecycle/rootLifecycleServiceFactory';\nimport { BackendPluginLifecycleImpl } from '../services/implementations/lifecycle/lifecycleServiceFactory';\nimport { ServiceOrExtensionPoint } from './types';\n// Direct internal import to avoid duplication\n// eslint-disable-next-line @backstage/no-forbidden-package-imports\nimport { InternalBackendFeature } from '@backstage/backend-plugin-api/src/wiring/types';\nimport { ForwardedError, ConflictError } from '@backstage/errors';\nimport { featureDiscoveryServiceRef } from '@backstage/backend-plugin-api/alpha';\nimport { DependencyGraph } from '../lib/DependencyGraph';\nimport { ServiceRegistry } from './ServiceRegistry';\n\nexport interface BackendRegisterInit {\n consumes: Set<ServiceOrExtensionPoint>;\n provides: Set<ServiceOrExtensionPoint>;\n init: {\n deps: { [name: string]: ServiceOrExtensionPoint };\n func: (deps: { [name: string]: unknown }) => Promise<void>;\n };\n}\n\nexport class BackendInitializer {\n #startPromise?: Promise<void>;\n #features = new Array<InternalBackendFeature>();\n #extensionPoints = new Map<string, { impl: unknown; pluginId: string }>();\n #serviceRegistry: ServiceRegistry;\n #registeredFeatures = new Array<Promise<BackendFeature>>();\n\n constructor(defaultApiFactories: ServiceFactory[]) {\n this.#serviceRegistry = ServiceRegistry.create([...defaultApiFactories]);\n }\n\n async #getInitDeps(\n deps: { [name: string]: ServiceOrExtensionPoint },\n pluginId: string,\n moduleId?: string,\n ) {\n const result = new Map<string, unknown>();\n const missingRefs = new Set<ServiceOrExtensionPoint>();\n\n for (const [name, ref] of Object.entries(deps)) {\n const ep = this.#extensionPoints.get(ref.id);\n if (ep) {\n if (ep.pluginId !== pluginId) {\n throw new Error(\n `Illegal dependency: Module '${moduleId}' for plugin '${pluginId}' attempted to depend on extension point '${ref.id}' for plugin '${ep.pluginId}'. Extension points can only be used within their plugin's scope.`,\n );\n }\n result.set(name, ep.impl);\n } else {\n const impl = await this.#serviceRegistry.get(\n ref as ServiceRef<unknown>,\n pluginId,\n );\n if (impl) {\n result.set(name, impl);\n } else {\n missingRefs.add(ref);\n }\n }\n }\n\n if (missingRefs.size > 0) {\n const missing = Array.from(missingRefs).join(', ');\n throw new Error(\n `No extension point or service available for the following ref(s): ${missing}`,\n );\n }\n\n return Object.fromEntries(result);\n }\n\n add(feature: BackendFeature | Promise<BackendFeature>) {\n if (this.#startPromise) {\n throw new Error('feature can not be added after the backend has started');\n }\n this.#registeredFeatures.push(Promise.resolve(feature));\n }\n\n #addFeature(feature: BackendFeature) {\n if (feature.$$type !== '@backstage/BackendFeature') {\n throw new Error(\n `Failed to add feature, invalid type '${feature.$$type}'`,\n );\n }\n\n if (isServiceFactory(feature)) {\n this.#serviceRegistry.add(feature);\n } else if (isInternalBackendFeature(feature)) {\n if (feature.version !== 'v1') {\n throw new Error(\n `Failed to add feature, invalid version '${feature.version}'`,\n );\n }\n this.#features.push(feature);\n } else {\n throw new Error(\n `Failed to add feature, invalid feature ${JSON.stringify(feature)}`,\n );\n }\n }\n\n async start(): Promise<void> {\n if (this.#startPromise) {\n throw new Error('Backend has already started');\n }\n\n const exitHandler = async () => {\n process.removeListener('SIGTERM', exitHandler);\n process.removeListener('SIGINT', exitHandler);\n process.removeListener('beforeExit', exitHandler);\n\n try {\n await this.stop();\n process.exit(0);\n } catch (error) {\n console.error(error);\n process.exit(1);\n }\n };\n\n process.addListener('SIGTERM', exitHandler);\n process.addListener('SIGINT', exitHandler);\n process.addListener('beforeExit', exitHandler);\n\n this.#startPromise = this.#doStart();\n await this.#startPromise;\n }\n\n async #doStart(): Promise<void> {\n this.#serviceRegistry.checkForCircularDeps();\n\n for (const feature of this.#registeredFeatures) {\n this.#addFeature(await feature);\n }\n\n const featureDiscovery = await this.#serviceRegistry.get(\n featureDiscoveryServiceRef,\n 'root',\n );\n\n if (featureDiscovery) {\n const { features } = await featureDiscovery.getBackendFeatures();\n for (const feature of features) {\n this.#addFeature(feature);\n }\n this.#serviceRegistry.checkForCircularDeps();\n }\n\n // Initialize all root scoped services\n for (const ref of this.#serviceRegistry.getServiceRefs()) {\n if (ref.scope === 'root') {\n await this.#serviceRegistry.get(ref, 'root');\n }\n }\n\n const pluginInits = new Map<string, BackendRegisterInit>();\n const moduleInits = new Map<string, Map<string, BackendRegisterInit>>();\n\n // Enumerate all features\n for (const feature of this.#features) {\n for (const r of feature.getRegistrations()) {\n const provides = new Set<ExtensionPoint<unknown>>();\n\n if (r.type === 'plugin' || r.type === 'module') {\n for (const [extRef, extImpl] of r.extensionPoints) {\n if (this.#extensionPoints.has(extRef.id)) {\n throw new Error(\n `ExtensionPoint with ID '${extRef.id}' is already registered`,\n );\n }\n this.#extensionPoints.set(extRef.id, {\n impl: extImpl,\n pluginId: r.pluginId,\n });\n provides.add(extRef);\n }\n }\n\n if (r.type === 'plugin') {\n if (pluginInits.has(r.pluginId)) {\n throw new Error(`Plugin '${r.pluginId}' is already registered`);\n }\n pluginInits.set(r.pluginId, {\n provides,\n consumes: new Set(Object.values(r.init.deps)),\n init: r.init,\n });\n } else {\n let modules = moduleInits.get(r.pluginId);\n if (!modules) {\n modules = new Map();\n moduleInits.set(r.pluginId, modules);\n }\n if (modules.has(r.moduleId)) {\n throw new Error(\n `Module '${r.moduleId}' for plugin '${r.pluginId}' is already registered`,\n );\n }\n modules.set(r.moduleId, {\n provides,\n consumes: new Set(Object.values(r.init.deps)),\n init: r.init,\n });\n }\n }\n }\n\n const allPluginIds = [\n ...new Set([...pluginInits.keys(), ...moduleInits.keys()]),\n ];\n\n // All plugins are initialized in parallel\n await Promise.all(\n allPluginIds.map(async pluginId => {\n // Modules are initialized before plugins, so that they can provide extension to the plugin\n const modules = moduleInits.get(pluginId);\n if (modules) {\n const tree = DependencyGraph.fromIterable(\n Array.from(modules).map(([moduleId, moduleInit]) => ({\n value: { moduleId, moduleInit },\n // Relationships are reversed at this point since we're only interested in the extension points.\n // If a modules provides extension point A we want it to be initialized AFTER all modules\n // that depend on extension point A, so that they can provide their extensions.\n consumes: Array.from(moduleInit.provides).map(p => p.id),\n provides: Array.from(moduleInit.consumes).map(c => c.id),\n })),\n );\n const circular = tree.detectCircularDependency();\n if (circular) {\n throw new ConflictError(\n `Circular dependency detected for modules of plugin '${pluginId}', ${circular\n .map(({ moduleId }) => `'${moduleId}'`)\n .join(' -> ')}`,\n );\n }\n await tree.parallelTopologicalTraversal(\n async ({ moduleId, moduleInit }) => {\n const moduleDeps = await this.#getInitDeps(\n moduleInit.init.deps,\n pluginId,\n moduleId,\n );\n await moduleInit.init.func(moduleDeps).catch(error => {\n throw new ForwardedError(\n `Module '${moduleId}' for plugin '${pluginId}' startup failed`,\n error,\n );\n });\n },\n );\n }\n\n // Once all modules have been initialized, we can initialize the plugin itself\n const pluginInit = pluginInits.get(pluginId);\n // We allow modules to be installed without the accompanying plugin, so the plugin may not exist\n if (pluginInit) {\n const pluginDeps = await this.#getInitDeps(\n pluginInit.init.deps,\n pluginId,\n );\n await pluginInit.init.func(pluginDeps).catch(error => {\n throw new ForwardedError(\n `Plugin '${pluginId}' startup failed`,\n error,\n );\n });\n }\n\n // Once the plugin and all modules have been initialized, we can signal that the plugin has stared up successfully\n const lifecycleService = await this.#getPluginLifecycleImpl(pluginId);\n await lifecycleService.startup();\n }),\n );\n\n // Once all plugins and modules have been initialized, we can signal that the backend has started up successfully\n const lifecycleService = await this.#getRootLifecycleImpl();\n await lifecycleService.startup();\n\n // Once the backend is started, any uncaught errors or unhandled rejections are caught\n // and logged, in order to avoid crashing the entire backend on local failures.\n if (process.env.NODE_ENV !== 'test') {\n const rootLogger = await this.#serviceRegistry.get(\n coreServices.rootLogger,\n 'root',\n );\n process.on('unhandledRejection', (reason: Error) => {\n rootLogger\n ?.child({ type: 'unhandledRejection' })\n ?.error('Unhandled rejection', reason);\n });\n process.on('uncaughtException', error => {\n rootLogger\n ?.child({ type: 'uncaughtException' })\n ?.error('Uncaught exception', error);\n });\n }\n }\n\n async stop(): Promise<void> {\n if (!this.#startPromise) {\n return;\n }\n\n try {\n await this.#startPromise;\n } catch (error) {\n // The startup failed, but we may still want to do cleanup so we continue silently\n }\n\n const lifecycleService = await this.#getRootLifecycleImpl();\n await lifecycleService.shutdown();\n }\n\n // Bit of a hacky way to grab the lifecycle services, potentially find a nicer way to do this\n async #getRootLifecycleImpl(): Promise<BackendLifecycleImpl> {\n const lifecycleService = await this.#serviceRegistry.get(\n coreServices.rootLifecycle,\n 'root',\n );\n if (lifecycleService instanceof BackendLifecycleImpl) {\n return lifecycleService;\n }\n throw new Error('Unexpected root lifecycle service implementation');\n }\n\n async #getPluginLifecycleImpl(\n pluginId: string,\n ): Promise<BackendPluginLifecycleImpl> {\n const lifecycleService = await this.#serviceRegistry.get(\n coreServices.lifecycle,\n pluginId,\n );\n if (lifecycleService instanceof BackendPluginLifecycleImpl) {\n return lifecycleService;\n }\n throw new Error('Unexpected plugin lifecycle service implementation');\n }\n}\n\nfunction isServiceFactory(feature: BackendFeature): feature is ServiceFactory {\n return !!(feature as ServiceFactory).service;\n}\n\nfunction isInternalBackendFeature(\n feature: BackendFeature,\n): feature is InternalBackendFeature {\n return (\n typeof (feature as InternalBackendFeature).getRegistrations === 'function'\n );\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BackendFeature, ServiceFactory } from '@backstage/backend-plugin-api';\nimport { BackendInitializer } from './BackendInitializer';\nimport { Backend } from './types';\n\nexport class BackstageBackend implements Backend {\n #initializer: BackendInitializer;\n\n constructor(defaultServiceFactories: ServiceFactory[]) {\n this.#initializer = new BackendInitializer(defaultServiceFactories);\n }\n\n add(\n feature:\n | BackendFeature\n | (() => BackendFeature)\n | Promise<{ default: BackendFeature | (() => BackendFeature) }>,\n ): void {\n if (isPromise(feature)) {\n this.#initializer.add(feature.then(f => unwrapFeature(f.default)));\n } else {\n this.#initializer.add(unwrapFeature(feature));\n }\n }\n\n async start(): Promise<void> {\n await this.#initializer.start();\n }\n\n async stop(): Promise<void> {\n await this.#initializer.stop();\n }\n}\n\nfunction isPromise<T>(value: unknown | Promise<T>): value is Promise<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof value.then === 'function'\n );\n}\n\nfunction unwrapFeature(\n feature:\n | BackendFeature\n | (() => BackendFeature)\n | { default: BackendFeature | (() => BackendFeature) },\n): BackendFeature {\n if (typeof feature === 'function') {\n return feature();\n }\n if ('$$type' in feature) {\n return feature;\n }\n // This is a workaround where default exports get transpiled to `exports['default'] = ...`\n // in CommonJS modules, which in turn results in a double `{ default: { default: ... } }` nesting\n // when importing using a dynamic import.\n // TODO: This is a broader issue than just this piece of code, and should move away from CommonJS.\n if ('default' in feature) {\n const defaultFeature = feature.default;\n return typeof defaultFeature === 'function'\n ? defaultFeature()\n : defaultFeature;\n }\n return feature;\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { coreServices } from '@backstage/backend-plugin-api';\nimport { BackstageBackend } from './BackstageBackend';\nimport { Backend, CreateSpecializedBackendOptions } from './types';\n\n/**\n * @public\n */\nexport function createSpecializedBackend(\n options: CreateSpecializedBackendOptions,\n): Backend {\n const services = options.defaultServiceFactories.map(sf =>\n typeof sf === 'function' ? sf() : sf,\n );\n\n const exists = new Set<string>();\n const duplicates = new Set<string>();\n for (const { service } of services) {\n if (exists.has(service.id)) {\n duplicates.add(service.id);\n } else {\n exists.add(service.id);\n }\n }\n if (duplicates.size > 0) {\n const ids = Array.from(duplicates).join(', ');\n throw new Error(`Duplicate service implementations provided for ${ids}`);\n }\n if (exists.has(coreServices.pluginMetadata.id)) {\n throw new Error(\n `The ${coreServices.pluginMetadata.id} service cannot be overridden`,\n );\n }\n\n return new BackstageBackend(services);\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TokenManager } from '@backstage/backend-common';\nimport {\n AuthService,\n BackstageCredentials,\n BackstagePrincipalTypes,\n BackstageServicePrincipal,\n BackstageNonePrincipal,\n BackstageUserPrincipal,\n IdentityService,\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { AuthenticationError } from '@backstage/errors';\nimport { IdentityApiGetIdentityRequest } from '@backstage/plugin-auth-node';\nimport { decodeJwt } from 'jose';\n\n/** @internal */\nexport type InternalBackstageCredentials<TPrincipal = unknown> =\n BackstageCredentials<TPrincipal> & {\n version: string;\n token?: string;\n };\n\nexport function createCredentialsWithServicePrincipal(\n sub: string,\n token?: string,\n): InternalBackstageCredentials<BackstageServicePrincipal> {\n return {\n $$type: '@backstage/BackstageCredentials',\n version: 'v1',\n token,\n principal: {\n type: 'service',\n subject: sub,\n },\n };\n}\n\nexport function createCredentialsWithUserPrincipal(\n sub: string,\n token: string,\n expiresAt?: Date,\n): InternalBackstageCredentials<BackstageUserPrincipal> {\n return {\n $$type: '@backstage/BackstageCredentials',\n version: 'v1',\n token,\n expiresAt,\n principal: {\n type: 'user',\n userEntityRef: sub,\n },\n };\n}\n\nexport function createCredentialsWithNonePrincipal(): InternalBackstageCredentials<BackstageNonePrincipal> {\n return {\n $$type: '@backstage/BackstageCredentials',\n version: 'v1',\n principal: {\n type: 'none',\n },\n };\n}\n\nexport function toInternalBackstageCredentials(\n credentials: BackstageCredentials,\n): InternalBackstageCredentials<\n BackstageUserPrincipal | BackstageServicePrincipal | BackstageNonePrincipal\n> {\n if (credentials.$$type !== '@backstage/BackstageCredentials') {\n throw new Error('Invalid credential type');\n }\n\n const internalCredentials = credentials as InternalBackstageCredentials<\n BackstageUserPrincipal | BackstageServicePrincipal | BackstageNonePrincipal\n >;\n\n if (internalCredentials.version !== 'v1') {\n throw new Error(\n `Invalid credential version ${internalCredentials.version}`,\n );\n }\n\n return internalCredentials;\n}\n\n/** @internal */\nclass DefaultAuthService implements AuthService {\n constructor(\n private readonly tokenManager: TokenManager,\n private readonly identity: IdentityService,\n private readonly pluginId: string,\n private readonly disableDefaultAuthPolicy: boolean,\n ) {}\n\n // allowLimitedAccess is currently ignored, since we currently always use the full user tokens\n async authenticate(token: string): Promise<BackstageCredentials> {\n const { sub, aud } = decodeJwt(token);\n\n // Legacy service-to-service token\n if (sub === 'backstage-server' && !aud) {\n await this.tokenManager.authenticate(token);\n return createCredentialsWithServicePrincipal('external:backstage-plugin');\n }\n\n // User Backstage token\n const identity = await this.identity.getIdentity({\n request: {\n headers: { authorization: `Bearer ${token}` },\n },\n } as IdentityApiGetIdentityRequest);\n\n if (!identity) {\n throw new AuthenticationError('Invalid user token');\n }\n\n return createCredentialsWithUserPrincipal(\n identity.identity.userEntityRef,\n token,\n this.#getJwtExpiration(token),\n );\n }\n\n isPrincipal<TType extends keyof BackstagePrincipalTypes>(\n credentials: BackstageCredentials,\n type: TType,\n ): credentials is BackstageCredentials<BackstagePrincipalTypes[TType]> {\n const principal = credentials.principal as\n | BackstageUserPrincipal\n | BackstageServicePrincipal;\n\n if (type === 'unknown') {\n return true;\n }\n\n if (principal.type !== type) {\n return false;\n }\n\n return true;\n }\n\n async getNoneCredentials(): Promise<\n BackstageCredentials<BackstageNonePrincipal>\n > {\n return createCredentialsWithNonePrincipal();\n }\n\n async getOwnServiceCredentials(): Promise<\n BackstageCredentials<BackstageServicePrincipal>\n > {\n return createCredentialsWithServicePrincipal(`plugin:${this.pluginId}`);\n }\n\n async getPluginRequestToken(options: {\n onBehalfOf: BackstageCredentials;\n targetPluginId: string;\n }): Promise<{ token: string }> {\n const internalForward = toInternalBackstageCredentials(options.onBehalfOf);\n const { type } = internalForward.principal;\n\n // Since disabling the default policy means we'll be allowing\n // unauthenticated requests through, we might have unauthenticated\n // credentials from service calls that reach this point. If that's the case,\n // we'll want to keep \"forwarding\" the unauthenticated credentials, which we\n // do by returning an empty token.\n if (type === 'none' && this.disableDefaultAuthPolicy) {\n return { token: '' };\n }\n\n switch (type) {\n // TODO: Check whether the principal is ourselves\n case 'service':\n return this.tokenManager.getToken();\n case 'user':\n if (!internalForward.token) {\n throw new Error('User credentials is unexpectedly missing token');\n }\n return { token: internalForward.token };\n default:\n throw new AuthenticationError(\n `Refused to issue service token for credential type '${type}'`,\n );\n }\n }\n\n async getLimitedUserToken(\n credentials: BackstageCredentials<BackstageUserPrincipal>,\n ): Promise<{ token: string; expiresAt: Date }> {\n const internalCredentials = toInternalBackstageCredentials(credentials);\n\n const { token } = internalCredentials;\n\n if (!token) {\n throw new AuthenticationError(\n 'User credentials is unexpectedly missing token',\n );\n }\n\n return { token, expiresAt: this.#getJwtExpiration(token) };\n }\n\n #getJwtExpiration(token: string) {\n const { exp } = decodeJwt(token);\n if (!exp) {\n throw new AuthenticationError('User token is missing expiration');\n }\n return new Date(exp * 1000);\n }\n}\n\n/** @public */\nexport const authServiceFactory = createServiceFactory({\n service: coreServices.auth,\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.rootLogger,\n plugin: coreServices.pluginMetadata,\n identity: coreServices.identity,\n // Re-using the token manager makes sure that we use the same generated keys for\n // development as plugins that have not yet been migrated. It's important that this\n // keeps working as long as there are plugins that have not been migrated to the\n // new auth services in the new backend system.\n tokenManager: coreServices.tokenManager,\n },\n async factory({ config, plugin, identity, tokenManager }) {\n const disableDefaultAuthPolicy = Boolean(\n config.getOptionalBoolean(\n 'backend.auth.dangerouslyDisableDefaultAuthPolicy',\n ),\n );\n return new DefaultAuthService(\n tokenManager,\n identity,\n plugin.getId(),\n disableDefaultAuthPolicy,\n );\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CacheManager } from '@backstage/backend-common';\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const cacheServiceFactory = createServiceFactory({\n service: coreServices.cache,\n deps: {\n config: coreServices.rootConfig,\n plugin: coreServices.pluginMetadata,\n },\n async createRootContext({ config }) {\n return CacheManager.fromConfig(config);\n },\n async factory({ plugin }, manager) {\n return manager.forPlugin(plugin.getId()).getClient();\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport {\n ConfigSources,\n RemoteConfigSourceOptions,\n} from '@backstage/config-loader';\n\n/** @public */\nexport interface RootConfigFactoryOptions {\n /**\n * Process arguments to use instead of the default `process.argv()`.\n */\n argv?: string[];\n\n /**\n * Enables and sets options for remote configuration loading.\n */\n remote?: Pick<RemoteConfigSourceOptions, 'reloadInterval'>;\n watch?: boolean;\n}\n\n/** @public */\nexport const rootConfigServiceFactory = createServiceFactory(\n (options?: RootConfigFactoryOptions) => ({\n service: coreServices.rootConfig,\n deps: {},\n async factory() {\n const source = ConfigSources.default({\n argv: options?.argv,\n remote: options?.remote,\n watch: options?.watch,\n });\n console.log(`Loading config from ${source}`);\n return await ConfigSources.toConfig(source);\n },\n }),\n);\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DatabaseManager } from '@backstage/backend-common';\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { ConfigReader } from '@backstage/config';\n\n/** @public */\nexport const databaseServiceFactory = createServiceFactory({\n service: coreServices.database,\n deps: {\n config: coreServices.rootConfig,\n lifecycle: coreServices.lifecycle,\n pluginMetadata: coreServices.pluginMetadata,\n },\n async createRootContext({ config }) {\n return config.getOptional('backend.database')\n ? DatabaseManager.fromConfig(config)\n : DatabaseManager.fromConfig(\n new ConfigReader({\n backend: {\n database: { client: 'better-sqlite3', connection: ':memory:' },\n },\n }),\n );\n },\n async factory({ pluginMetadata, lifecycle }, databaseManager) {\n return databaseManager.forPlugin(pluginMetadata.getId(), {\n pluginMetadata,\n lifecycle,\n });\n },\n});\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Config } from '@backstage/config';\nimport { readHttpServerOptions } from '@backstage/backend-app-api';\nimport { DiscoveryService } from '@backstage/backend-plugin-api';\n\ntype Target = string | { internal: string; external: string };\n\n/**\n * HostDiscovery is a basic PluginEndpointDiscovery implementation\n * that can handle plugins that are hosted in a single or multiple deployments.\n *\n * The deployment may be scaled horizontally, as long as the external URL\n * is the same for all instances. However, internal URLs will always be\n * resolved to the same host, so there won't be any balancing of internal traffic.\n *\n * @public\n */\nexport class HostDiscovery implements DiscoveryService {\n /**\n * Creates a new HostDiscovery discovery instance by reading\n * from the `backend` config section, specifically the `.baseUrl` for\n * discovering the external URL, and the `.listen` and `.https` config\n * for the internal one.\n *\n * Can be overridden in config by providing a target and corresponding plugins in `discovery.endpoints`.\n * eg.\n * ```yaml\n * discovery:\n * endpoints:\n * - target: https://internal.example.com/internal-catalog\n * plugins: [catalog]\n * - target: https://internal.example.com/secure/api/{{pluginId}}\n * plugins: [auth, permission]\n * - target:\n * internal: https://internal.example.com/search\n * external: https://example.com/search\n * plugins: [search]\n * ```\n *\n * The basePath defaults to `/api`, meaning the default full internal\n * path for the `catalog` plugin will be `http://localhost:7007/api/catalog`.\n */\n static fromConfig(config: Config, options?: { basePath?: string }) {\n const basePath = options?.basePath ?? '/api';\n const externalBaseUrl = config\n .getString('backend.baseUrl')\n .replace(/\\/+$/, '');\n\n const {\n listen: { host: listenHost = '::', port: listenPort },\n } = readHttpServerOptions(config.getConfig('backend'));\n const protocol = config.has('backend.https') ? 'https' : 'http';\n\n // Translate bind-all to localhost, and support IPv6\n let host = listenHost;\n if (host === '::' || host === '') {\n // We use localhost instead of ::1, since IPv6-compatible systems should default\n // to using IPv6 when they see localhost, but if the system doesn't support IPv6\n // things will still work.\n host = 'localhost';\n } else if (host === '0.0.0.0') {\n host = '127.0.0.1';\n }\n if (host.includes(':')) {\n host = `[${host}]`;\n }\n\n const internalBaseUrl = `${protocol}://${host}:${listenPort}`;\n\n return new HostDiscovery(\n internalBaseUrl + basePath,\n externalBaseUrl + basePath,\n config.getOptionalConfig('discovery'),\n );\n }\n\n private constructor(\n private readonly internalBaseUrl: string,\n private readonly externalBaseUrl: string,\n private readonly discoveryConfig: Config | undefined,\n ) {}\n\n private getTargetFromConfig(pluginId: string, type: 'internal' | 'external') {\n const endpoints = this.discoveryConfig?.getOptionalConfigArray('endpoints');\n\n const target = endpoints\n ?.find(endpoint => endpoint.getStringArray('plugins').includes(pluginId))\n ?.get<Target>('target');\n\n if (!target) {\n const baseUrl =\n type === 'external' ? this.externalBaseUrl : this.internalBaseUrl;\n\n return `${baseUrl}/${encodeURIComponent(pluginId)}`;\n }\n\n if (typeof target === 'string') {\n return target.replace(\n /\\{\\{\\s*pluginId\\s*\\}\\}/g,\n encodeURIComponent(pluginId),\n );\n }\n\n return target[type].replace(\n /\\{\\{\\s*pluginId\\s*\\}\\}/g,\n encodeURIComponent(pluginId),\n );\n }\n\n async getBaseUrl(pluginId: string): Promise<string> {\n return this.getTargetFromConfig(pluginId, 'internal');\n }\n\n async getExternalBaseUrl(pluginId: string): Promise<string> {\n return this.getTargetFromConfig(pluginId, 'external');\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { HostDiscovery } from './HostDiscovery';\n\n/** @public */\nexport const discoveryServiceFactory = createServiceFactory({\n service: coreServices.discovery,\n deps: {\n config: coreServices.rootConfig,\n },\n async factory({ config }) {\n return HostDiscovery.fromConfig(config);\n },\n});\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n AuthService,\n BackstageCredentials,\n BackstagePrincipalTypes,\n BackstageUserPrincipal,\n DiscoveryService,\n HttpAuthService,\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { AuthenticationError, NotAllowedError } from '@backstage/errors';\nimport { parse as parseCookie } from 'cookie';\nimport { Request, Response } from 'express';\n\nconst FIVE_MINUTES_MS = 5 * 60 * 1000;\n\nconst BACKSTAGE_AUTH_COOKIE = 'backstage-auth';\n\nfunction getTokenFromRequest(req: Request) {\n // TODO: support multiple auth headers (iterate rawHeaders)\n const authHeader = req.headers.authorization;\n if (typeof authHeader === 'string') {\n const matches = authHeader.match(/^Bearer[ ]+(\\S+)$/i);\n const token = matches?.[1];\n if (token) {\n return token;\n }\n }\n\n return undefined;\n}\n\nfunction getCookieFromRequest(req: Request) {\n const cookieHeader = req.headers.cookie;\n if (cookieHeader) {\n const cookies = parseCookie(cookieHeader);\n const token = cookies[BACKSTAGE_AUTH_COOKIE];\n if (token) {\n return token;\n }\n }\n\n return undefined;\n}\n\nfunction willExpireSoon(expiresAt: Date) {\n return Date.now() + FIVE_MINUTES_MS > expiresAt.getTime();\n}\n\nconst credentialsSymbol = Symbol('backstage-credentials');\nconst limitedCredentialsSymbol = Symbol('backstage-limited-credentials');\n\ntype RequestWithCredentials = Request & {\n [credentialsSymbol]?: Promise<BackstageCredentials>;\n [limitedCredentialsSymbol]?: Promise<BackstageCredentials>;\n};\n\nclass DefaultHttpAuthService implements HttpAuthService {\n readonly #auth: AuthService;\n readonly #discovery: DiscoveryService;\n readonly #pluginId: string;\n\n constructor(\n auth: AuthService,\n discovery: DiscoveryService,\n pluginId: string,\n ) {\n this.#auth = auth;\n this.#discovery = discovery;\n this.#pluginId = pluginId;\n }\n\n async #extractCredentialsFromRequest(req: Request) {\n const token = getTokenFromRequest(req);\n if (!token) {\n return await this.#auth.getNoneCredentials();\n }\n\n return await this.#auth.authenticate(token);\n }\n\n async #extractLimitedCredentialsFromRequest(req: Request) {\n const token = getTokenFromRequest(req);\n if (token) {\n return await this.#auth.authenticate(token, {\n allowLimitedAccess: true,\n });\n }\n\n const cookie = getCookieFromRequest(req);\n if (cookie) {\n return await this.#auth.authenticate(cookie, {\n allowLimitedAccess: true,\n });\n }\n\n return await this.#auth.getNoneCredentials();\n }\n\n async #getCredentials(req: RequestWithCredentials) {\n return (req[credentialsSymbol] ??=\n this.#extractCredentialsFromRequest(req));\n }\n\n async #getLimitedCredentials(req: RequestWithCredentials) {\n return (req[limitedCredentialsSymbol] ??=\n this.#extractLimitedCredentialsFromRequest(req));\n }\n\n async credentials<TAllowed extends keyof BackstagePrincipalTypes = 'unknown'>(\n req: Request,\n options?: {\n allow?: Array<TAllowed>;\n allowLimitedAccess?: boolean;\n },\n ): Promise<BackstageCredentials<BackstagePrincipalTypes[TAllowed]>> {\n // Limited and full credentials are treated as two separate cases, this lets\n // us avoid internal dependencies between the AuthService and\n // HttpAuthService implementations\n const credentials = options?.allowLimitedAccess\n ? await this.#getLimitedCredentials(req)\n : await this.#getCredentials(req);\n\n const allowed = options?.allow;\n if (!allowed) {\n return credentials as any;\n }\n\n if (this.#auth.isPrincipal(credentials, 'none')) {\n if (allowed.includes('none' as TAllowed)) {\n return credentials as any;\n }\n\n throw new AuthenticationError('Missing credentials');\n } else if (this.#auth.isPrincipal(credentials, 'user')) {\n if (allowed.includes('user' as TAllowed)) {\n return credentials as any;\n }\n\n throw new NotAllowedError(\n `This endpoint does not allow 'user' credentials`,\n );\n } else if (this.#auth.isPrincipal(credentials, 'service')) {\n if (allowed.includes('service' as TAllowed)) {\n return credentials as any;\n }\n\n throw new NotAllowedError(\n `This endpoint does not allow 'service' credentials`,\n );\n }\n\n throw new NotAllowedError(\n 'Unknown principal type, this should never happen',\n );\n }\n\n async issueUserCookie(\n res: Response,\n options?: { credentials?: BackstageCredentials },\n ): Promise<{ expiresAt: Date }> {\n if (res.headersSent) {\n throw new Error('Failed to issue user cookie, headers were already sent');\n }\n\n let credentials: BackstageCredentials<BackstageUserPrincipal>;\n if (options?.credentials) {\n if (!this.#auth.isPrincipal(options.credentials, 'user')) {\n throw new AuthenticationError(\n 'Refused to issue cookie for non-user principal',\n );\n }\n credentials = options.credentials;\n } else {\n credentials = await this.credentials(res.req, { allow: ['user'] });\n }\n\n const existingExpiresAt = await this.#existingCookieExpiration(res.req);\n if (existingExpiresAt && !willExpireSoon(existingExpiresAt)) {\n return { expiresAt: existingExpiresAt };\n }\n\n const originHeader = res.req.headers.origin;\n const origin =\n !originHeader || originHeader === 'null' ? undefined : originHeader;\n\n // https://backstage.example.com/api/catalog\n const externalBaseUrlStr = await this.#discovery.getExternalBaseUrl(\n this.#pluginId,\n );\n const externalBaseUrl = new URL(origin ?? externalBaseUrlStr);\n\n const { token, expiresAt } = await this.#auth.getLimitedUserToken(\n credentials,\n );\n if (!token) {\n throw new Error('User credentials is unexpectedly missing token');\n }\n\n const secure =\n externalBaseUrl.protocol === 'https:' ||\n externalBaseUrl.hostname === 'localhost';\n\n res.cookie(BACKSTAGE_AUTH_COOKIE, token, {\n domain: externalBaseUrl.hostname,\n httpOnly: true,\n expires: expiresAt,\n secure,\n priority: 'high',\n sameSite: secure ? 'none' : 'lax',\n });\n\n return { expiresAt };\n }\n\n async #existingCookieExpiration(req: Request): Promise<Date | undefined> {\n const existingCookie = getCookieFromRequest(req);\n if (!existingCookie) {\n return undefined;\n }\n\n try {\n const existingCredentials = await this.#auth.authenticate(\n existingCookie,\n {\n allowLimitedAccess: true,\n },\n );\n if (!this.#auth.isPrincipal(existingCredentials, 'user')) {\n return undefined;\n }\n\n return existingCredentials.expiresAt;\n } catch (error) {\n if (error.name === 'AuthenticationError') {\n return undefined;\n }\n throw error;\n }\n }\n}\n\n/** @public */\nexport const httpAuthServiceFactory = createServiceFactory({\n service: coreServices.httpAuth,\n deps: {\n auth: coreServices.auth,\n discovery: coreServices.discovery,\n plugin: coreServices.pluginMetadata,\n },\n async factory({ auth, discovery, plugin }) {\n return new DefaultHttpAuthService(auth, discovery, plugin.getId());\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LifecycleService } from '@backstage/backend-plugin-api';\nimport { ServiceUnavailableError } from '@backstage/errors';\nimport { HumanDuration, durationToMilliseconds } from '@backstage/types';\nimport { RequestHandler } from 'express';\n\nexport const DEFAULT_TIMEOUT = { seconds: 5 };\n\n/**\n * Options for {@link createLifecycleMiddleware}.\n * @public\n */\nexport interface LifecycleMiddlewareOptions {\n lifecycle: LifecycleService;\n /**\n * The maximum time that paused requests will wait for the service to start, before returning an error.\n *\n * Defaults to 5 seconds.\n */\n startupRequestPauseTimeout?: HumanDuration;\n}\n\n/**\n * Creates a middleware that pauses requests until the service has started.\n *\n * @remarks\n *\n * Requests that arrive before the service has started will be paused until startup is complete.\n * If the service does not start within the provided timeout, the request will be rejected with a\n * {@link @backstage/errors#ServiceUnavailableError}.\n *\n * If the service is shutting down, all requests will be rejected with a\n * {@link @backstage/errors#ServiceUnavailableError}.\n *\n * @public\n */\nexport function createLifecycleMiddleware(\n options: LifecycleMiddlewareOptions,\n): RequestHandler {\n const { lifecycle, startupRequestPauseTimeout = DEFAULT_TIMEOUT } = options;\n\n let state: 'init' | 'up' | 'down' = 'init';\n const waiting = new Set<{\n next: (err?: Error) => void;\n timeout: NodeJS.Timeout;\n }>();\n\n lifecycle.addStartupHook(async () => {\n if (state === 'init') {\n state = 'up';\n for (const item of waiting) {\n clearTimeout(item.timeout);\n item.next();\n }\n waiting.clear();\n }\n });\n\n lifecycle.addShutdownHook(async () => {\n state = 'down';\n\n for (const item of waiting) {\n clearTimeout(item.timeout);\n item.next(new ServiceUnavailableError('Service is shutting down'));\n }\n waiting.clear();\n });\n\n const timeoutMs = durationToMilliseconds(startupRequestPauseTimeout);\n\n return (_req, _res, next) => {\n if (state === 'up') {\n next();\n return;\n } else if (state === 'down') {\n next(new ServiceUnavailableError('Service is shutting down'));\n return;\n }\n\n const item = {\n next,\n timeout: setTimeout(() => {\n if (waiting.delete(item)) {\n next(new ServiceUnavailableError('Service has not started up yet'));\n }\n }, timeoutMs),\n };\n\n waiting.add(item);\n };\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n HttpAuthService,\n HttpRouterServiceAuthPolicy,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\nimport { RequestHandler } from 'express';\nimport { pathToRegexp } from 'path-to-regexp';\n\nexport function createPathPolicyPredicate(policyPath: string) {\n if (policyPath === '/' || policyPath === '*') {\n return () => true;\n }\n\n const pathRegex = pathToRegexp(policyPath, undefined, {\n end: false,\n });\n\n return (path: string): boolean => {\n return pathRegex.test(path);\n };\n}\n\nexport function createCredentialsBarrier(options: {\n httpAuth: HttpAuthService;\n config: RootConfigService;\n}): {\n middleware: RequestHandler;\n addAuthPolicy: (policy: HttpRouterServiceAuthPolicy) => void;\n} {\n const { httpAuth, config } = options;\n\n const disableDefaultAuthPolicy = config.getOptionalBoolean(\n 'backend.auth.dangerouslyDisableDefaultAuthPolicy',\n );\n\n if (disableDefaultAuthPolicy) {\n return {\n middleware: (_req, _res, next) => next(),\n addAuthPolicy: () => {},\n };\n }\n\n const unauthenticatedPredicates = new Array<(path: string) => boolean>();\n const cookiePredicates = new Array<(path: string) => boolean>();\n\n const middleware: RequestHandler = (req, _, next) => {\n const allowsUnauthenticated = unauthenticatedPredicates.some(predicate =>\n predicate(req.path),\n );\n\n if (allowsUnauthenticated) {\n next();\n return;\n }\n\n const allowsCookie = cookiePredicates.some(predicate =>\n predicate(req.path),\n );\n\n httpAuth\n .credentials(req, {\n allow: ['user', 'service'],\n allowLimitedAccess: allowsCookie,\n })\n .then(\n () => next(),\n err => next(err),\n );\n };\n\n const addAuthPolicy = (policy: HttpRouterServiceAuthPolicy) => {\n if (policy.allow === 'unauthenticated') {\n unauthenticatedPredicates.push(createPathPolicyPredicate(policy.path));\n } else if (policy.allow === 'user-cookie') {\n cookiePredicates.push(createPathPolicyPredicate(policy.path));\n } else {\n throw new Error('Invalid auth policy');\n }\n };\n\n return { middleware, addAuthPolicy };\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n HttpRouterServiceAuthPolicy,\n} from '@backstage/backend-plugin-api';\nimport { Handler } from 'express';\nimport PromiseRouter from 'express-promise-router';\nimport { createLifecycleMiddleware } from './createLifecycleMiddleware';\nimport { createCredentialsBarrier } from './createCredentialsBarrier';\n\n/**\n * @public\n */\nexport interface HttpRouterFactoryOptions {\n /**\n * A callback used to generate the path for each plugin, defaults to `/api/{pluginId}`.\n */\n getPath?(pluginId: string): string;\n}\n\n/** @public */\nexport const httpRouterServiceFactory = createServiceFactory(\n (options?: HttpRouterFactoryOptions) => ({\n service: coreServices.httpRouter,\n deps: {\n plugin: coreServices.pluginMetadata,\n config: coreServices.rootConfig,\n lifecycle: coreServices.lifecycle,\n rootHttpRouter: coreServices.rootHttpRouter,\n httpAuth: coreServices.httpAuth,\n },\n async factory({ httpAuth, config, plugin, rootHttpRouter, lifecycle }) {\n const getPath = options?.getPath ?? (id => `/api/${id}`);\n const path = getPath(plugin.getId());\n\n const router = PromiseRouter();\n rootHttpRouter.use(path, router);\n\n const credentialsBarrier = createCredentialsBarrier({ httpAuth, config });\n\n router.use(createLifecycleMiddleware({ lifecycle }));\n router.use(credentialsBarrier.middleware);\n\n return {\n use(handler: Handler): void {\n router.use(handler);\n },\n addAuthPolicy(policy: HttpRouterServiceAuthPolicy): void {\n credentialsBarrier.addAuthPolicy(policy);\n },\n };\n },\n }),\n);\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { DefaultIdentityClient } from '@backstage/plugin-auth-node';\n\n/**\n * An identity client options object which allows extra configurations\n *\n * @public\n */\nexport type IdentityFactoryOptions = {\n issuer?: string;\n\n /** JWS \"alg\" (Algorithm) Header Parameter values. Defaults to an array containing just ES256.\n * More info on supported algorithms: https://github.com/panva/jose */\n algorithms?: string[];\n};\n\n/** @public */\nexport const identityServiceFactory = createServiceFactory(\n (options?: IdentityFactoryOptions) => ({\n service: coreServices.identity,\n deps: {\n discovery: coreServices.discovery,\n },\n async factory({ discovery }) {\n return DefaultIdentityClient.create({ discovery, ...options });\n },\n }),\n);\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createServiceFactory,\n coreServices,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const loggerServiceFactory = createServiceFactory({\n service: coreServices.logger,\n deps: {\n rootLogger: coreServices.rootLogger,\n plugin: coreServices.pluginMetadata,\n },\n factory({ rootLogger, plugin }) {\n return rootLogger.child({ plugin: plugin.getId() });\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { ServerPermissionClient } from '@backstage/plugin-permission-node';\n\n/** @public */\nexport const permissionsServiceFactory = createServiceFactory({\n service: coreServices.permissions,\n deps: {\n auth: coreServices.auth,\n config: coreServices.rootConfig,\n discovery: coreServices.discovery,\n tokenManager: coreServices.tokenManager,\n },\n async factory({ auth, config, discovery, tokenManager }) {\n return ServerPermissionClient.fromConfig(config, {\n auth,\n discovery,\n tokenManager,\n });\n },\n});\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RootHttpRouterService } from '@backstage/backend-plugin-api';\nimport { Handler, Router } from 'express';\nimport trimEnd from 'lodash/trimEnd';\n\nfunction normalizePath(path: string): string {\n return `${trimEnd(path, '/')}/`;\n}\n\n/**\n * Options for the {@link DefaultRootHttpRouter} class.\n *\n * @public\n */\nexport interface DefaultRootHttpRouterOptions {\n /**\n * The path to forward all unmatched requests to. Defaults to '/api/app' if\n * not given. Disables index path behavior if false is given.\n */\n indexPath?: string | false;\n}\n\n/**\n * The default implementation of the {@link @backstage/backend-plugin-api#RootHttpRouterService} interface for\n * {@link @backstage/backend-plugin-api#coreServices.rootHttpRouter}.\n *\n * @public\n */\nexport class DefaultRootHttpRouter implements RootHttpRouterService {\n #indexPath?: string;\n\n #router = Router();\n #namedRoutes = Router();\n #indexRouter = Router();\n #existingPaths = new Array<string>();\n\n static create(options?: DefaultRootHttpRouterOptions) {\n let indexPath;\n if (options?.indexPath === false) {\n indexPath = undefined;\n } else if (options?.indexPath === undefined) {\n indexPath = '/api/app';\n } else if (options?.indexPath === '') {\n throw new Error('indexPath option may not be an empty string');\n } else {\n indexPath = options.indexPath;\n }\n return new DefaultRootHttpRouter(indexPath);\n }\n\n private constructor(indexPath?: string) {\n this.#indexPath = indexPath;\n this.#router.use(this.#namedRoutes);\n if (this.#indexPath) {\n this.#router.use(this.#indexRouter);\n }\n }\n\n use(path: string, handler: Handler) {\n if (path.match(/^[/\\s]*$/)) {\n throw new Error(`Root router path may not be empty`);\n }\n const conflictingPath = this.#findConflictingPath(path);\n if (conflictingPath) {\n throw new Error(\n `Path ${path} conflicts with the existing path ${conflictingPath}`,\n );\n }\n this.#existingPaths.push(path);\n this.#namedRoutes.use(path, handler);\n\n if (this.#indexPath === path) {\n this.#indexRouter.use(handler);\n }\n }\n\n handler(): Handler {\n return this.#router;\n }\n\n #findConflictingPath(newPath: string): string | undefined {\n const normalizedNewPath = normalizePath(newPath);\n for (const path of this.#existingPaths) {\n const normalizedPath = normalizePath(path);\n if (normalizedPath.startsWith(normalizedNewPath)) {\n return path;\n }\n if (normalizedNewPath.startsWith(normalizedPath)) {\n return path;\n }\n }\n return undefined;\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n RootConfigService,\n coreServices,\n createServiceFactory,\n LifecycleService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport express, { RequestHandler, Express } from 'express';\nimport {\n createHttpServer,\n MiddlewareFactory,\n readHttpServerOptions,\n} from '../../../http';\nimport { DefaultRootHttpRouter } from './DefaultRootHttpRouter';\n\n/**\n * @public\n */\nexport interface RootHttpRouterConfigureContext {\n app: Express;\n middleware: MiddlewareFactory;\n routes: RequestHandler;\n config: RootConfigService;\n logger: LoggerService;\n lifecycle: LifecycleService;\n}\n\n/**\n * @public\n */\nexport type RootHttpRouterFactoryOptions = {\n /**\n * The path to forward all unmatched requests to. Defaults to '/api/app' if\n * not given. Disables index path behavior if false is given.\n */\n indexPath?: string | false;\n\n configure?(context: RootHttpRouterConfigureContext): void;\n};\n\nfunction defaultConfigure(context: RootHttpRouterConfigureContext) {\n const { app, routes, middleware } = context;\n app.use(middleware.helmet());\n app.use(middleware.cors());\n app.use(middleware.compression());\n app.use(middleware.logging());\n app.use(routes);\n app.use(middleware.notFound());\n app.use(middleware.error());\n}\n\n/** @public */\nexport const rootHttpRouterServiceFactory = createServiceFactory(\n (options?: RootHttpRouterFactoryOptions) => ({\n service: coreServices.rootHttpRouter,\n deps: {\n config: coreServices.rootConfig,\n rootLogger: coreServices.rootLogger,\n lifecycle: coreServices.rootLifecycle,\n },\n async factory({ config, rootLogger, lifecycle }) {\n const { indexPath, configure = defaultConfigure } = options ?? {};\n const logger = rootLogger.child({ service: 'rootHttpRouter' });\n const app = express();\n\n const router = DefaultRootHttpRouter.create({ indexPath });\n const middleware = MiddlewareFactory.create({ config, logger });\n\n configure({\n app,\n routes: router.handler(),\n middleware,\n config,\n logger,\n lifecycle,\n });\n\n const server = await createHttpServer(\n app,\n readHttpServerOptions(config.getOptionalConfig('backend')),\n { logger },\n );\n\n lifecycle.addShutdownHook(() => server.stop());\n\n await server.start();\n\n return router;\n },\n }),\n);\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createServiceFactory,\n coreServices,\n} from '@backstage/backend-plugin-api';\nimport { WinstonLogger } from '../../../logging';\nimport { transports, format } from 'winston';\nimport { createConfigSecretEnumerator } from '../../../config';\n\n/** @public */\nexport const rootLoggerServiceFactory = createServiceFactory({\n service: coreServices.rootLogger,\n deps: {\n config: coreServices.rootConfig,\n },\n async factory({ config }) {\n const logger = WinstonLogger.create({\n meta: {\n service: 'backstage',\n },\n level: process.env.LOG_LEVEL || 'info',\n format:\n process.env.NODE_ENV === 'production'\n ? format.json()\n : WinstonLogger.colorFormat(),\n transports: [new transports.Console()],\n });\n\n const secretEnumerator = await createConfigSecretEnumerator({ logger });\n logger.addRedactions(secretEnumerator(config));\n config.subscribe?.(() => logger.addRedactions(secretEnumerator(config)));\n\n return logger;\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { loggerToWinstonLogger } from '@backstage/backend-common';\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { TaskScheduler } from '@backstage/backend-tasks';\n\n/** @public */\nexport const schedulerServiceFactory = createServiceFactory({\n service: coreServices.scheduler,\n deps: {\n plugin: coreServices.pluginMetadata,\n databaseManager: coreServices.database,\n logger: coreServices.logger,\n },\n async factory({ plugin, databaseManager, logger }) {\n return TaskScheduler.forPlugin({\n pluginId: plugin.getId(),\n databaseManager,\n logger: loggerToWinstonLogger(logger),\n });\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { ServerTokenManager } from '@backstage/backend-common';\n\n/** @public */\nexport const tokenManagerServiceFactory = createServiceFactory({\n service: coreServices.tokenManager,\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.rootLogger,\n },\n createRootContext({ config, logger }) {\n return ServerTokenManager.fromConfig(config, {\n logger,\n });\n },\n async factory(_deps, tokenManager) {\n return tokenManager;\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { loggerToWinstonLogger, UrlReaders } from '@backstage/backend-common';\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const urlReaderServiceFactory = createServiceFactory({\n service: coreServices.urlReader,\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n },\n async factory({ config, logger }) {\n return UrlReaders.default({\n config,\n logger: loggerToWinstonLogger(logger),\n });\n },\n});\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n UserInfoService,\n BackstageUserInfo,\n coreServices,\n createServiceFactory,\n BackstageCredentials,\n} from '@backstage/backend-plugin-api';\nimport { toInternalBackstageCredentials } from '../auth/authServiceFactory';\nimport { decodeJwt } from 'jose';\n\n// TODO: The intention is for this to eventually be replaced by a call to the auth-backend\nexport class DefaultUserInfoService implements UserInfoService {\n async getUserInfo(\n credentials: BackstageCredentials,\n ): Promise<BackstageUserInfo> {\n const internalCredentials = toInternalBackstageCredentials(credentials);\n if (internalCredentials.principal.type !== 'user') {\n throw new Error('Only user credentials are supported');\n }\n if (!internalCredentials.token) {\n throw new Error('User credentials is unexpectedly missing token');\n }\n const { sub: userEntityRef, ent: ownershipEntityRefs = [] } = decodeJwt(\n internalCredentials.token,\n );\n\n if (typeof userEntityRef !== 'string') {\n throw new Error('User entity ref must be a string');\n }\n if (\n !Array.isArray(ownershipEntityRefs) ||\n ownershipEntityRefs.some(ref => typeof ref !== 'string')\n ) {\n throw new Error('Ownership entity refs must be an array of strings');\n }\n\n return { userEntityRef, ownershipEntityRefs };\n }\n}\n\n/** @public */\nexport const userInfoServiceFactory = createServiceFactory({\n service: coreServices.userInfo,\n deps: {},\n async factory() {\n return new DefaultUserInfoService();\n },\n});\n"],"names":["ConfigReader","getPackages","loadConfigSchema","_a","parseArgs","resolvePath","findPaths","config","loadConfig","fs","dirname","forge","stoppableServer","https","http","helmet","Minimatch","randomBytes","assertError","__privateAdd","__privateSet","compression","__privateGet","morgan","cors","serializeError","NotModifiedError","InputError","AuthenticationError","NotAllowedError","NotFoundError","ConflictError","NotImplementedError","ServiceUnavailableError","format","createLogger","transports","_hasStarted","_startupTasks","createServiceFactory","coreServices","__privateMethod","stringifyError","featureDiscoveryServiceRef","ForwardedError","lifecycleService","decodeJwt","CacheManager","ConfigSources","DatabaseManager","readHttpServerOptions","parseCookie","durationToMilliseconds","pathToRegexp","PromiseRouter","DefaultIdentityClient","ServerPermissionClient","trimEnd","Router","express","TaskScheduler","loggerToWinstonLogger","ServerTokenManager","UrlReaders"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/config/ObservableConfigProxy.ts","../src/lib/urls.ts","../src/config/config.ts","../src/http/config.ts","../src/http/getGeneratedCertificate.ts","../src/http/createHttpServer.ts","../src/http/readHelmetOptions.ts","../src/http/readCorsOptions.ts","../src/http/applyInternalErrorFilter.ts","../src/http/MiddlewareFactory.ts","../src/lib/escapeRegExp.ts","../src/logging/WinstonLogger.ts","../src/services/implementations/rootLifecycle/rootLifecycleServiceFactory.ts","../src/services/implementations/lifecycle/lifecycleServiceFactory.ts","../src/lib/DependencyGraph.ts","../src/wiring/ServiceRegistry.ts","../src/wiring/BackendInitializer.ts","../src/wiring/BackstageBackend.ts","../src/wiring/createSpecializedBackend.ts","../src/services/implementations/auth/DatabaseKeyStore.ts","../src/services/implementations/auth/helpers.ts","../src/services/implementations/auth/DefaultAuthService.ts","../src/services/implementations/auth/JwksClient.ts","../src/services/implementations/auth/plugin/PluginTokenHandler.ts","../src/services/implementations/auth/user/UserTokenHandler.ts","../src/services/implementations/auth/external/legacy.ts","../src/services/implementations/auth/external/static.ts","../src/services/implementations/auth/external/ExternalTokenHandler.ts","../src/services/implementations/auth/authServiceFactory.ts","../src/services/implementations/cache/cacheServiceFactory.ts","../src/services/implementations/config/rootConfigServiceFactory.ts","../src/services/implementations/database/databaseServiceFactory.ts","../src/services/implementations/discovery/HostDiscovery.ts","../src/services/implementations/discovery/discoveryServiceFactory.ts","../src/services/implementations/httpAuth/httpAuthServiceFactory.ts","../src/services/implementations/httpRouter/createLifecycleMiddleware.ts","../src/services/implementations/httpRouter/createCredentialsBarrier.ts","../src/services/implementations/httpRouter/createAuthIntegrationRouter.ts","../src/services/implementations/httpRouter/createCookieAuthRefreshMiddleware.ts","../src/services/implementations/httpRouter/httpRouterServiceFactory.ts","../src/services/implementations/identity/identityServiceFactory.ts","../src/services/implementations/logger/loggerServiceFactory.ts","../src/services/implementations/permissions/permissionsServiceFactory.ts","../src/services/implementations/rootHttpRouter/DefaultRootHttpRouter.ts","../src/services/implementations/rootHttpRouter/rootHttpRouterServiceFactory.ts","../src/services/implementations/rootLogger/rootLoggerServiceFactory.ts","../src/services/implementations/scheduler/schedulerServiceFactory.ts","../src/services/implementations/tokenManager/tokenManagerServiceFactory.ts","../src/services/implementations/urlReader/urlReaderServiceFactory.ts","../src/services/implementations/userInfo/userInfoServiceFactory.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Config, ConfigReader } from '@backstage/config';\nimport { JsonValue } from '@backstage/types';\n\nexport class ObservableConfigProxy implements Config {\n private config: Config = new ConfigReader({});\n\n private readonly subscribers: (() => void)[] = [];\n\n constructor(\n private readonly parent?: ObservableConfigProxy,\n private parentKey?: string,\n ) {\n if (parent && !parentKey) {\n throw new Error('parentKey is required if parent is set');\n }\n }\n\n setConfig(config: Config) {\n if (this.parent) {\n throw new Error('immutable');\n }\n this.config = config;\n for (const subscriber of this.subscribers) {\n try {\n subscriber();\n } catch (error) {\n console.error(`Config subscriber threw error, ${error}`);\n }\n }\n }\n\n subscribe(onChange: () => void): { unsubscribe: () => void } {\n if (this.parent) {\n return this.parent.subscribe(onChange);\n }\n\n this.subscribers.push(onChange);\n return {\n unsubscribe: () => {\n const index = this.subscribers.indexOf(onChange);\n if (index >= 0) {\n this.subscribers.splice(index, 1);\n }\n },\n };\n }\n\n private select(required: true): Config;\n private select(required: false): Config | undefined;\n private select(required: boolean): Config | undefined {\n if (this.parent && this.parentKey) {\n if (required) {\n return this.parent.select(true).getConfig(this.parentKey);\n }\n return this.parent.select(false)?.getOptionalConfig(this.parentKey);\n }\n\n return this.config;\n }\n\n has(key: string): boolean {\n return this.select(false)?.has(key) ?? false;\n }\n keys(): string[] {\n return this.select(false)?.keys() ?? [];\n }\n get<T = JsonValue>(key?: string): T {\n return this.select(true).get(key);\n }\n getOptional<T = JsonValue>(key?: string): T | undefined {\n return this.select(false)?.getOptional(key);\n }\n getConfig(key: string): Config {\n return new ObservableConfigProxy(this, key);\n }\n getOptionalConfig(key: string): Config | undefined {\n if (this.select(false)?.has(key)) {\n return new ObservableConfigProxy(this, key);\n }\n return undefined;\n }\n getConfigArray(key: string): Config[] {\n return this.select(true).getConfigArray(key);\n }\n getOptionalConfigArray(key: string): Config[] | undefined {\n return this.select(false)?.getOptionalConfigArray(key);\n }\n getNumber(key: string): number {\n return this.select(true).getNumber(key);\n }\n getOptionalNumber(key: string): number | undefined {\n return this.select(false)?.getOptionalNumber(key);\n }\n getBoolean(key: string): boolean {\n return this.select(true).getBoolean(key);\n }\n getOptionalBoolean(key: string): boolean | undefined {\n return this.select(false)?.getOptionalBoolean(key);\n }\n getString(key: string): string {\n return this.select(true).getString(key);\n }\n getOptionalString(key: string): string | undefined {\n return this.select(false)?.getOptionalString(key);\n }\n getStringArray(key: string): string[] {\n return this.select(true).getStringArray(key);\n }\n getOptionalStringArray(key: string): string[] | undefined {\n return this.select(false)?.getOptionalStringArray(key);\n }\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport function isValidUrl(url: string): boolean {\n try {\n // eslint-disable-next-line no-new\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { resolve as resolvePath } from 'path';\nimport parseArgs from 'minimist';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { findPaths } from '@backstage/cli-common';\nimport {\n loadConfigSchema,\n loadConfig,\n ConfigTarget,\n LoadConfigOptionsRemote,\n ConfigSchema,\n} from '@backstage/config-loader';\nimport { ConfigReader } from '@backstage/config';\nimport type { Config, AppConfig } from '@backstage/config';\nimport { getPackages } from '@manypkg/get-packages';\nimport { ObservableConfigProxy } from './ObservableConfigProxy';\nimport { isValidUrl } from '../lib/urls';\n\n/** @public */\nexport async function createConfigSecretEnumerator(options: {\n logger: LoggerService;\n dir?: string;\n schema?: ConfigSchema;\n}): Promise<(config: Config) => Iterable<string>> {\n const { logger, dir = process.cwd() } = options;\n const { packages } = await getPackages(dir);\n const schema =\n options.schema ??\n (await loadConfigSchema({\n dependencies: packages.map(p => p.packageJson.name),\n }));\n\n return (config: Config) => {\n const [secretsData] = schema.process(\n [{ data: config.getOptional() ?? {}, context: 'schema-enumerator' }],\n {\n visibility: ['secret'],\n ignoreSchemaErrors: true,\n },\n );\n const secrets = new Set<string>();\n JSON.parse(\n JSON.stringify(secretsData.data),\n (_, v) => typeof v === 'string' && secrets.add(v),\n );\n logger.info(\n `Found ${secrets.size} new secrets in config that will be redacted`,\n );\n return secrets;\n };\n}\n\n/**\n * Load configuration for a Backend.\n *\n * This function should only be called once, during the initialization of the backend.\n *\n * @public\n */\nexport async function loadBackendConfig(options: {\n remote?: LoadConfigOptionsRemote;\n argv: string[];\n additionalConfigs?: AppConfig[];\n watch?: boolean;\n}): Promise<{ config: Config }> {\n const args = parseArgs(options.argv);\n\n const configTargets: ConfigTarget[] = [args.config ?? []]\n .flat()\n .map(arg => (isValidUrl(arg) ? { url: arg } : { path: resolvePath(arg) }));\n\n /* eslint-disable-next-line no-restricted-syntax */\n const paths = findPaths(__dirname);\n\n let currentCancelFunc: (() => void) | undefined = undefined;\n\n const config = new ObservableConfigProxy();\n const { appConfigs } = await loadConfig({\n configRoot: paths.targetRoot,\n configTargets: configTargets,\n remote: options.remote,\n watch:\n options.watch ?? true\n ? {\n onChange(newConfigs) {\n console.info(\n `Reloaded config from ${newConfigs\n .map(c => c.context)\n .join(', ')}`,\n );\n const configsToMerge = [...newConfigs];\n if (options.additionalConfigs) {\n configsToMerge.push(...options.additionalConfigs);\n }\n config.setConfig(ConfigReader.fromConfigs(configsToMerge));\n },\n stopSignal: new Promise(resolve => {\n if (currentCancelFunc) {\n currentCancelFunc();\n }\n currentCancelFunc = resolve;\n\n // TODO(Rugvip): We keep this here for now to avoid breaking the old system\n // since this is re-used in backend-common\n if (module.hot) {\n module.hot.addDisposeHandler(resolve);\n }\n }),\n }\n : undefined,\n });\n console.info(\n `Loaded config from ${appConfigs.map(c => c.context).join(', ')}`,\n );\n\n const finalAppConfigs = [...appConfigs];\n if (options.additionalConfigs) {\n finalAppConfigs.push(...options.additionalConfigs);\n }\n config.setConfig(ConfigReader.fromConfigs(finalAppConfigs));\n\n return { config };\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Config } from '@backstage/config';\nimport { HttpServerOptions } from './types';\n\nconst DEFAULT_PORT = 7007;\nconst DEFAULT_HOST = '';\n\n/**\n * Reads {@link HttpServerOptions} from a {@link @backstage/config#Config} object.\n *\n * @public\n * @remarks\n *\n * The provided configuration object should contain the `listen` and\n * additional keys directly.\n *\n * @example\n * ```ts\n * const opts = readHttpServerOptions(config.getConfig('backend'));\n * ```\n */\nexport function readHttpServerOptions(config?: Config): HttpServerOptions {\n return {\n listen: readHttpListenOptions(config),\n https: readHttpsOptions(config),\n };\n}\n\nfunction readHttpListenOptions(config?: Config): HttpServerOptions['listen'] {\n const listen = config?.getOptional('listen');\n if (typeof listen === 'string') {\n const parts = String(listen).split(':');\n const port = parseInt(parts[parts.length - 1], 10);\n if (!isNaN(port)) {\n if (parts.length === 1) {\n return { port, host: DEFAULT_HOST };\n }\n if (parts.length === 2) {\n return { host: parts[0], port };\n }\n }\n throw new Error(\n `Unable to parse listen address ${listen}, expected <port> or <host>:<port>`,\n );\n }\n\n // Workaround to allow empty string\n const host = config?.getOptional('listen.host') ?? DEFAULT_HOST;\n if (typeof host !== 'string') {\n config?.getOptionalString('listen.host'); // will throw\n throw new Error('unreachable');\n }\n\n return {\n port: config?.getOptionalNumber('listen.port') ?? DEFAULT_PORT,\n host,\n };\n}\n\nfunction readHttpsOptions(config?: Config): HttpServerOptions['https'] {\n const https = config?.getOptional('https');\n if (https === true) {\n const baseUrl = config!.getString('baseUrl');\n let hostname;\n try {\n hostname = new URL(baseUrl).hostname;\n } catch (error) {\n throw new Error(`Invalid baseUrl \"${baseUrl}\"`);\n }\n\n return { certificate: { type: 'generated', hostname } };\n }\n\n const cc = config?.getOptionalConfig('https');\n if (!cc) {\n return undefined;\n }\n\n return {\n certificate: {\n type: 'pem',\n cert: cc.getString('certificate.cert'),\n key: cc.getString('certificate.key'),\n },\n };\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport fs from 'fs-extra';\nimport { resolve as resolvePath, dirname } from 'path';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport forge from 'node-forge';\n\nconst FIVE_DAYS_IN_MS = 5 * 24 * 60 * 60 * 1000;\n\nconst IP_HOSTNAME_REGEX = /:|^\\d+\\.\\d+\\.\\d+\\.\\d+$/;\n\nexport async function getGeneratedCertificate(\n hostname: string,\n logger: LoggerService,\n) {\n const hasModules = await fs.pathExists('node_modules');\n let certPath;\n if (hasModules) {\n certPath = resolvePath(\n 'node_modules/.cache/backstage-backend/dev-cert.pem',\n );\n await fs.ensureDir(dirname(certPath));\n } else {\n certPath = resolvePath('.dev-cert.pem');\n }\n\n if (await fs.pathExists(certPath)) {\n try {\n const cert = await fs.readFile(certPath);\n\n const crt = forge.pki.certificateFromPem(cert.toString());\n const remainingMs = crt.validity.notAfter.getTime() - Date.now();\n if (remainingMs > FIVE_DAYS_IN_MS) {\n logger.info('Using existing self-signed certificate');\n return {\n key: cert,\n cert,\n };\n }\n } catch (error) {\n logger.warn(`Unable to use existing self-signed certificate, ${error}`);\n }\n }\n\n logger.info('Generating new self-signed certificate');\n const newCert = await generateCertificate(hostname);\n await fs.writeFile(certPath, newCert.cert + newCert.key, 'utf8');\n return newCert;\n}\n\nasync function generateCertificate(hostname: string) {\n const attributes = [\n {\n name: 'commonName',\n value: 'dev-cert',\n },\n ];\n\n const sans = [\n {\n type: 2, // DNS\n value: 'localhost',\n },\n {\n type: 2,\n value: 'localhost.localdomain',\n },\n {\n type: 2,\n value: '[::1]',\n },\n {\n type: 7, // IP\n ip: '127.0.0.1',\n },\n {\n type: 7,\n ip: 'fe80::1',\n },\n ];\n\n // Add hostname from backend.baseUrl if it doesn't already exist in our list of SANs\n if (!sans.find(({ value, ip }) => value === hostname || ip === hostname)) {\n sans.push(\n IP_HOSTNAME_REGEX.test(hostname)\n ? {\n type: 7,\n ip: hostname,\n }\n : {\n type: 2,\n value: hostname,\n },\n );\n }\n\n const params = {\n algorithm: 'sha256',\n keySize: 2048,\n days: 30,\n extensions: [\n {\n name: 'keyUsage',\n keyCertSign: true,\n digitalSignature: true,\n nonRepudiation: true,\n keyEncipherment: true,\n dataEncipherment: true,\n },\n {\n name: 'extKeyUsage',\n serverAuth: true,\n clientAuth: true,\n codeSigning: true,\n timeStamping: true,\n },\n {\n name: 'subjectAltName',\n altNames: sans,\n },\n ],\n };\n\n return new Promise<{ key: string; cert: string }>((resolve, reject) =>\n require('selfsigned').generate(\n attributes,\n params,\n (err: Error, bundle: { private: string; cert: string }) => {\n if (err) {\n reject(err);\n } else {\n resolve({ key: bundle.private, cert: bundle.cert });\n }\n },\n ),\n );\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as http from 'http';\nimport * as https from 'https';\nimport stoppableServer from 'stoppable';\nimport { RequestListener } from 'http';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { HttpServerOptions, ExtendedHttpServer } from './types';\nimport { getGeneratedCertificate } from './getGeneratedCertificate';\n\n/**\n * Creates a Node.js HTTP or HTTPS server instance.\n *\n * @public\n */\nexport async function createHttpServer(\n listener: RequestListener,\n options: HttpServerOptions,\n deps: { logger: LoggerService },\n): Promise<ExtendedHttpServer> {\n const server = await createServer(listener, options, deps);\n\n const stopper = stoppableServer(server, 0);\n // The stopper here is actually the server itself, so if we try\n // to call stopper.stop() down in the stop implementation, we'll\n // be calling ourselves.\n const stopServer = stopper.stop.bind(stopper);\n\n return Object.assign(server, {\n start() {\n return new Promise<void>((resolve, reject) => {\n const handleStartupError = (error: Error) => {\n server.close();\n reject(error);\n };\n\n server.on('error', handleStartupError);\n\n const { host, port } = options.listen;\n server.listen(port, host, () => {\n server.off('error', handleStartupError);\n deps.logger.info(`Listening on ${host}:${port}`);\n resolve();\n });\n });\n },\n\n stop() {\n return new Promise<void>((resolve, reject) => {\n stopServer((error?: Error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n },\n\n port() {\n const address = server.address();\n if (typeof address === 'string' || address === null) {\n throw new Error(`Unexpected server address '${address}'`);\n }\n return address.port;\n },\n });\n}\n\nasync function createServer(\n listener: RequestListener,\n options: HttpServerOptions,\n deps: { logger: LoggerService },\n): Promise<http.Server> {\n if (options.https) {\n const { certificate } = options.https;\n if (certificate.type === 'generated') {\n const credentials = await getGeneratedCertificate(\n certificate.hostname,\n deps.logger,\n );\n return https.createServer(credentials, listener);\n }\n return https.createServer(certificate, listener);\n }\n\n return http.createServer(listener);\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Config } from '@backstage/config';\nimport helmet from 'helmet';\nimport { HelmetOptions } from 'helmet';\nimport { ContentSecurityPolicyOptions } from 'helmet/dist/types/middlewares/content-security-policy';\n\n/**\n * Attempts to read Helmet options from the backend configuration object.\n *\n * @public\n * @param config - The backend configuration object.\n * @returns A Helmet options object, or undefined if no Helmet configuration is present.\n *\n * @example\n * ```ts\n * const helmetOptions = readHelmetOptions(config.getConfig('backend'));\n * ```\n */\nexport function readHelmetOptions(config?: Config): HelmetOptions {\n const cspOptions = readCspDirectives(config);\n return {\n contentSecurityPolicy: {\n useDefaults: false,\n directives: applyCspDirectives(cspOptions),\n },\n // These are all disabled in order to maintain backwards compatibility\n // when bumping helmet v5. We can't enable these by default because\n // there is no way for users to configure them.\n // TODO(Rugvip): We should give control of this setup to consumers\n crossOriginEmbedderPolicy: false,\n crossOriginOpenerPolicy: false,\n crossOriginResourcePolicy: false,\n originAgentCluster: false,\n };\n}\n\ntype CspDirectives = Record<string, string[] | false> | undefined;\n\n/**\n * Attempts to read a CSP directives from the backend configuration object.\n *\n * @example\n * ```yaml\n * backend:\n * csp:\n * connect-src: [\"'self'\", 'http:', 'https:']\n * upgrade-insecure-requests: false\n * ```\n */\nfunction readCspDirectives(config?: Config): CspDirectives {\n const cc = config?.getOptionalConfig('csp');\n if (!cc) {\n return undefined;\n }\n\n const result: Record<string, string[] | false> = {};\n for (const key of cc.keys()) {\n if (cc.get(key) === false) {\n result[key] = false;\n } else {\n result[key] = cc.getStringArray(key);\n }\n }\n\n return result;\n}\n\nexport function applyCspDirectives(\n directives: CspDirectives,\n): ContentSecurityPolicyOptions['directives'] {\n const result: ContentSecurityPolicyOptions['directives'] =\n helmet.contentSecurityPolicy.getDefaultDirectives();\n\n // TODO(Rugvip): We currently use non-precompiled AJV for validation in the frontend, which uses eval.\n // It should be replaced by any other solution that doesn't require unsafe-eval.\n result['script-src'] = [\"'self'\", \"'unsafe-eval'\"];\n\n // TODO(Rugvip): This is removed so that we maintained backwards compatibility\n // when bumping to helmet v5, we could remove this as well as\n // skip setting `useDefaults: false` in the future.\n delete result['form-action'];\n\n if (directives) {\n for (const [key, value] of Object.entries(directives)) {\n if (value === false) {\n delete result[key];\n } else {\n result[key] = value;\n }\n }\n }\n\n return result;\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Config } from '@backstage/config';\nimport { CorsOptions } from 'cors';\nimport { Minimatch } from 'minimatch';\n\n/**\n * Attempts to read a CORS options object from the backend configuration object.\n *\n * @public\n * @param config - The backend configuration object.\n * @returns A CORS options object, or undefined if no cors configuration is present.\n *\n * @example\n * ```ts\n * const corsOptions = readCorsOptions(config.getConfig('backend'));\n * ```\n */\nexport function readCorsOptions(config?: Config): CorsOptions {\n const cc = config?.getOptionalConfig('cors');\n if (!cc) {\n return { origin: false }; // Disable CORS\n }\n\n return removeUnknown({\n origin: createCorsOriginMatcher(readStringArray(cc, 'origin')),\n methods: readStringArray(cc, 'methods'),\n allowedHeaders: readStringArray(cc, 'allowedHeaders'),\n exposedHeaders: readStringArray(cc, 'exposedHeaders'),\n credentials: cc.getOptionalBoolean('credentials'),\n maxAge: cc.getOptionalNumber('maxAge'),\n preflightContinue: cc.getOptionalBoolean('preflightContinue'),\n optionsSuccessStatus: cc.getOptionalNumber('optionsSuccessStatus'),\n });\n}\n\nfunction removeUnknown<T extends object>(obj: T): T {\n return Object.fromEntries(\n Object.entries(obj).filter(([, v]) => v !== undefined),\n ) as T;\n}\n\nfunction readStringArray(config: Config, key: string): string[] | undefined {\n const value = config.getOptional(key);\n if (typeof value === 'string') {\n return [value];\n } else if (!value) {\n return undefined;\n }\n return config.getStringArray(key);\n}\n\nfunction createCorsOriginMatcher(allowedOriginPatterns: string[] | undefined) {\n if (!allowedOriginPatterns) {\n return undefined;\n }\n\n const allowedOriginMatchers = allowedOriginPatterns.map(\n pattern => new Minimatch(pattern, { nocase: true, noglobstar: true }),\n );\n\n return (\n origin: string | undefined,\n callback: (\n err: Error | null,\n origin: boolean | string | RegExp | (boolean | string | RegExp)[],\n ) => void,\n ) => {\n return callback(\n null,\n allowedOriginMatchers.some(pattern => pattern.match(origin ?? '')),\n );\n };\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { assertError } from '@backstage/errors';\nimport { randomBytes } from 'crypto';\n\nfunction handleBadError(error: Error, logger: LoggerService) {\n const logId = randomBytes(10).toString('hex');\n logger\n .child({ logId })\n .error(`Filtered internal error with logId=${logId} from response`, error);\n const newError = new Error(`An internal error occurred logId=${logId}`);\n delete newError.stack; // Trim the stack since it's not particularly useful\n return newError;\n}\n\n/**\n * Filters out certain known error types that should never be returned in responses.\n *\n * @internal\n */\nexport function applyInternalErrorFilter(\n error: unknown,\n logger: LoggerService,\n): Error {\n try {\n assertError(error);\n } catch (assertionError: unknown) {\n assertError(assertionError);\n return handleBadError(assertionError, logger);\n }\n\n const constructorName = error.constructor.name;\n\n // DatabaseError are thrown by the pg-protocol module\n if (constructorName === 'DatabaseError') {\n return handleBadError(error, logger);\n }\n\n return error;\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n RootConfigService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport {\n Request,\n Response,\n ErrorRequestHandler,\n NextFunction,\n RequestHandler,\n} from 'express';\nimport cors from 'cors';\nimport helmet from 'helmet';\nimport morgan from 'morgan';\nimport compression from 'compression';\nimport { readHelmetOptions } from './readHelmetOptions';\nimport { readCorsOptions } from './readCorsOptions';\nimport {\n AuthenticationError,\n ConflictError,\n ErrorResponseBody,\n InputError,\n NotAllowedError,\n NotFoundError,\n NotModifiedError,\n ServiceUnavailableError,\n serializeError,\n} from '@backstage/errors';\nimport { NotImplementedError } from '@backstage/errors';\nimport { applyInternalErrorFilter } from './applyInternalErrorFilter';\n\n/**\n * Options used to create a {@link MiddlewareFactory}.\n *\n * @public\n */\nexport interface MiddlewareFactoryOptions {\n config: RootConfigService;\n logger: LoggerService;\n}\n\n/**\n * Options passed to the {@link MiddlewareFactory.error} middleware.\n *\n * @public\n */\nexport interface MiddlewareFactoryErrorOptions {\n /**\n * Whether error response bodies should show error stack traces or not.\n *\n * If not specified, by default shows stack traces only in development mode.\n */\n showStackTraces?: boolean;\n\n /**\n * Whether any 4xx errors should be logged or not.\n *\n * If not specified, default to only logging 5xx errors.\n */\n logAllErrors?: boolean;\n}\n\n/**\n * A utility to configure common middleware.\n *\n * @public\n */\nexport class MiddlewareFactory {\n #config: RootConfigService;\n #logger: LoggerService;\n\n /**\n * Creates a new {@link MiddlewareFactory}.\n */\n static create(options: MiddlewareFactoryOptions) {\n return new MiddlewareFactory(options);\n }\n\n private constructor(options: MiddlewareFactoryOptions) {\n this.#config = options.config;\n this.#logger = options.logger;\n }\n\n /**\n * Returns a middleware that unconditionally produces a 404 error response.\n *\n * @remarks\n *\n * Typically you want to place this middleware at the end of the chain, such\n * that it's the last one attempted after no other routes matched.\n *\n * @returns An Express request handler\n */\n notFound(): RequestHandler {\n return (_req: Request, res: Response) => {\n res.status(404).end();\n };\n }\n\n /**\n * Returns the compression middleware.\n *\n * @remarks\n *\n * The middleware will attempt to compress response bodies for all requests\n * that traverse through the middleware.\n */\n compression(): RequestHandler {\n return compression();\n }\n\n /**\n * Returns a request logging middleware.\n *\n * @remarks\n *\n * Typically you want to place this middleware at the start of the chain, such\n * that it always logs requests whether they are \"caught\" by handlers farther\n * down or not.\n *\n * @returns An Express request handler\n */\n logging(): RequestHandler {\n const logger = this.#logger.child({\n type: 'incomingRequest',\n });\n\n return morgan('combined', {\n stream: {\n write(message: string) {\n logger.info(message.trimEnd());\n },\n },\n });\n }\n\n /**\n * Returns a middleware that implements the helmet library.\n *\n * @remarks\n *\n * This middleware applies security policies to incoming requests and outgoing\n * responses. It is configured using config keys such as `backend.csp`.\n *\n * @see {@link https://helmetjs.github.io/}\n *\n * @returns An Express request handler\n */\n helmet(): RequestHandler {\n return helmet(readHelmetOptions(this.#config.getOptionalConfig('backend')));\n }\n\n /**\n * Returns a middleware that implements the cors library.\n *\n * @remarks\n *\n * This middleware handles CORS. It is configured using the config key\n * `backend.cors`.\n *\n * @see {@link https://github.com/expressjs/cors}\n *\n * @returns An Express request handler\n */\n cors(): RequestHandler {\n return cors(readCorsOptions(this.#config.getOptionalConfig('backend')));\n }\n\n /**\n * Express middleware to handle errors during request processing.\n *\n * @remarks\n *\n * This is commonly the very last middleware in the chain.\n *\n * Its primary purpose is not to do translation of business logic exceptions,\n * but rather to be a global catch-all for uncaught \"fatal\" errors that are\n * expected to result in a 500 error. However, it also does handle some common\n * error types (such as http-error exceptions, and the well-known error types\n * in the `@backstage/errors` package) and returns the enclosed status code\n * accordingly.\n *\n * It will also produce a response body with a serialized form of the error,\n * unless a previous handler already did send a body. See\n * {@link @backstage/errors#ErrorResponseBody} for the response shape used.\n *\n * @returns An Express error request handler\n */\n error(options: MiddlewareFactoryErrorOptions = {}): ErrorRequestHandler {\n const showStackTraces =\n options.showStackTraces ?? process.env.NODE_ENV === 'development';\n\n const logger = this.#logger.child({\n type: 'errorHandler',\n });\n\n return (\n rawError: Error,\n req: Request,\n res: Response,\n next: NextFunction,\n ) => {\n const error = applyInternalErrorFilter(rawError, logger);\n\n const statusCode = getStatusCode(error);\n if (options.logAllErrors || statusCode >= 500) {\n logger.error(`Request failed with status ${statusCode}`, error);\n }\n\n if (res.headersSent) {\n // If the headers have already been sent, do not send the response again\n // as this will throw an error in the backend.\n next(error);\n return;\n }\n\n const body: ErrorResponseBody = {\n error: serializeError(error, { includeStack: showStackTraces }),\n request: { method: req.method, url: req.url },\n response: { statusCode },\n };\n\n res.status(statusCode).json(body);\n };\n }\n}\n\nfunction getStatusCode(error: Error): number {\n // Look for common http library status codes\n const knownStatusCodeFields = ['statusCode', 'status'];\n for (const field of knownStatusCodeFields) {\n const statusCode = (error as any)[field];\n if (\n typeof statusCode === 'number' &&\n (statusCode | 0) === statusCode && // is whole integer\n statusCode >= 100 &&\n statusCode <= 599\n ) {\n return statusCode;\n }\n }\n\n // Handle well-known error types\n switch (error.name) {\n case NotModifiedError.name:\n return 304;\n case InputError.name:\n return 400;\n case AuthenticationError.name:\n return 401;\n case NotAllowedError.name:\n return 403;\n case NotFoundError.name:\n return 404;\n case ConflictError.name:\n return 409;\n case NotImplementedError.name:\n return 501;\n case ServiceUnavailableError.name:\n return 503;\n default:\n break;\n }\n\n // Fall back to internal server error\n return 500;\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Escapes a given string to be used inside a RegExp.\n *\n * Taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n */\nexport const escapeRegExp = (text: string) => {\n return text.replace(/[.*+?^${}(\\)|[\\]\\\\]/g, '\\\\$&');\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n LoggerService,\n RootLoggerService,\n} from '@backstage/backend-plugin-api';\nimport { JsonObject } from '@backstage/types';\nimport { Format, TransformableInfo } from 'logform';\nimport {\n Logger,\n format,\n createLogger,\n transports,\n transport as Transport,\n} from 'winston';\nimport { escapeRegExp } from '../lib/escapeRegExp';\n\n/**\n * @public\n */\nexport interface WinstonLoggerOptions {\n meta?: JsonObject;\n level?: string;\n format?: Format;\n transports?: Transport[];\n}\n\n/**\n * A {@link @backstage/backend-plugin-api#LoggerService} implementation based on winston.\n *\n * @public\n */\nexport class WinstonLogger implements RootLoggerService {\n #winston: Logger;\n #addRedactions?: (redactions: Iterable<string>) => void;\n\n /**\n * Creates a {@link WinstonLogger} instance.\n */\n static create(options: WinstonLoggerOptions): WinstonLogger {\n const redacter = WinstonLogger.redacter();\n const defaultFormatter =\n process.env.NODE_ENV === 'production'\n ? format.json()\n : WinstonLogger.colorFormat();\n\n let logger = createLogger({\n level: process.env.LOG_LEVEL || options.level || 'info',\n format: format.combine(\n redacter.format,\n options.format ?? defaultFormatter,\n ),\n transports: options.transports ?? new transports.Console(),\n });\n\n if (options.meta) {\n logger = logger.child(options.meta);\n }\n\n return new WinstonLogger(logger, redacter.add);\n }\n\n /**\n * Creates a winston log formatter for redacting secrets.\n */\n static redacter(): {\n format: Format;\n add: (redactions: Iterable<string>) => void;\n } {\n const redactionSet = new Set<string>();\n\n let redactionPattern: RegExp | undefined = undefined;\n\n return {\n format: format(info => {\n if (redactionPattern && typeof info.message === 'string') {\n info.message = info.message.replace(redactionPattern, '[REDACTED]');\n }\n if (redactionPattern && typeof info.stack === 'string') {\n info.stack = info.stack.replace(redactionPattern, '[REDACTED]');\n }\n return info;\n })(),\n add(newRedactions) {\n let added = 0;\n for (const redactionToTrim of newRedactions) {\n // Trimming the string ensures that we don't accdentally get extra\n // newlines or other whitespace interfering with the redaction; this\n // can happen for example when using string literals in yaml\n const redaction = redactionToTrim.trim();\n // Exclude secrets that are empty or just one character in length. These\n // typically mean that you are running local dev or tests, or using the\n // --lax flag which sets things to just 'x'.\n if (redaction.length <= 1) {\n continue;\n }\n if (!redactionSet.has(redaction)) {\n redactionSet.add(redaction);\n added += 1;\n }\n }\n if (added > 0) {\n const redactions = Array.from(redactionSet)\n .map(r => escapeRegExp(r))\n .join('|');\n redactionPattern = new RegExp(`(${redactions})`, 'g');\n }\n },\n };\n }\n\n /**\n * Creates a pretty printed winston log formatter.\n */\n static colorFormat(): Format {\n const colorizer = format.colorize();\n\n return format.combine(\n format.timestamp(),\n format.colorize({\n colors: {\n timestamp: 'dim',\n prefix: 'blue',\n field: 'cyan',\n debug: 'grey',\n },\n }),\n format.printf((info: TransformableInfo) => {\n const { timestamp, level, message, plugin, service, ...fields } = info;\n const prefix = plugin || service;\n const timestampColor = colorizer.colorize('timestamp', timestamp);\n const prefixColor = colorizer.colorize('prefix', prefix);\n\n const extraFields = Object.entries(fields)\n .map(\n ([key, value]) =>\n `${colorizer.colorize('field', `${key}`)}=${value}`,\n )\n .join(' ');\n\n return `${timestampColor} ${prefixColor} ${level} ${message} ${extraFields}`;\n }),\n );\n }\n\n private constructor(\n winston: Logger,\n addRedactions?: (redactions: Iterable<string>) => void,\n ) {\n this.#winston = winston;\n this.#addRedactions = addRedactions;\n }\n\n error(message: string, meta?: JsonObject): void {\n this.#winston.error(message, meta);\n }\n\n warn(message: string, meta?: JsonObject): void {\n this.#winston.warn(message, meta);\n }\n\n info(message: string, meta?: JsonObject): void {\n this.#winston.info(message, meta);\n }\n\n debug(message: string, meta?: JsonObject): void {\n this.#winston.debug(message, meta);\n }\n\n child(meta: JsonObject): LoggerService {\n return new WinstonLogger(this.#winston.child(meta));\n }\n\n addRedactions(redactions: Iterable<string>) {\n this.#addRedactions?.(redactions);\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createServiceFactory,\n coreServices,\n LifecycleServiceStartupHook,\n LifecycleServiceStartupOptions,\n LifecycleServiceShutdownHook,\n LifecycleServiceShutdownOptions,\n RootLifecycleService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\n\n/** @internal */\nexport class BackendLifecycleImpl implements RootLifecycleService {\n constructor(private readonly logger: LoggerService) {}\n\n #hasStarted = false;\n #startupTasks: Array<{\n hook: LifecycleServiceStartupHook;\n options?: LifecycleServiceStartupOptions;\n }> = [];\n\n addStartupHook(\n hook: LifecycleServiceStartupHook,\n options?: LifecycleServiceStartupOptions,\n ): void {\n if (this.#hasStarted) {\n throw new Error('Attempted to add startup hook after startup');\n }\n this.#startupTasks.push({ hook, options });\n }\n\n async startup(): Promise<void> {\n if (this.#hasStarted) {\n return;\n }\n this.#hasStarted = true;\n\n this.logger.debug(`Running ${this.#startupTasks.length} startup tasks...`);\n await Promise.all(\n this.#startupTasks.map(async ({ hook, options }) => {\n const logger = options?.logger ?? this.logger;\n try {\n await hook();\n logger.debug(`Startup hook succeeded`);\n } catch (error) {\n logger.error(`Startup hook failed, ${error}`);\n }\n }),\n );\n }\n\n #hasShutdown = false;\n #shutdownTasks: Array<{\n hook: LifecycleServiceShutdownHook;\n options?: LifecycleServiceShutdownOptions;\n }> = [];\n\n addShutdownHook(\n hook: LifecycleServiceShutdownHook,\n options?: LifecycleServiceShutdownOptions,\n ): void {\n if (this.#hasShutdown) {\n throw new Error('Attempted to add shutdown hook after shutdown');\n }\n this.#shutdownTasks.push({ hook, options });\n }\n\n async shutdown(): Promise<void> {\n if (this.#hasShutdown) {\n return;\n }\n this.#hasShutdown = true;\n\n this.logger.debug(\n `Running ${this.#shutdownTasks.length} shutdown tasks...`,\n );\n await Promise.all(\n this.#shutdownTasks.map(async ({ hook, options }) => {\n const logger = options?.logger ?? this.logger;\n try {\n await hook();\n logger.debug(`Shutdown hook succeeded`);\n } catch (error) {\n logger.error(`Shutdown hook failed, ${error}`);\n }\n }),\n );\n }\n}\n\n/**\n * Allows plugins to register shutdown hooks that are run when the process is about to exit.\n *\n * @public\n */\nexport const rootLifecycleServiceFactory = createServiceFactory({\n service: coreServices.rootLifecycle,\n deps: {\n logger: coreServices.rootLogger,\n },\n async factory({ logger }) {\n return new BackendLifecycleImpl(logger);\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n LifecycleService,\n LifecycleServiceShutdownHook,\n LifecycleServiceShutdownOptions,\n LifecycleServiceStartupHook,\n LifecycleServiceStartupOptions,\n LoggerService,\n PluginMetadataService,\n RootLifecycleService,\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\n\n/** @internal */\nexport class BackendPluginLifecycleImpl implements LifecycleService {\n constructor(\n private readonly logger: LoggerService,\n private readonly rootLifecycle: RootLifecycleService,\n private readonly pluginMetadata: PluginMetadataService,\n ) {}\n\n #hasStarted = false;\n #startupTasks: Array<{\n hook: LifecycleServiceStartupHook;\n options?: LifecycleServiceStartupOptions;\n }> = [];\n\n addStartupHook(\n hook: LifecycleServiceStartupHook,\n options?: LifecycleServiceStartupOptions,\n ): void {\n if (this.#hasStarted) {\n throw new Error('Attempted to add startup hook after startup');\n }\n this.#startupTasks.push({ hook, options });\n }\n\n async startup(): Promise<void> {\n if (this.#hasStarted) {\n return;\n }\n this.#hasStarted = true;\n\n this.logger.debug(\n `Running ${this.#startupTasks.length} plugin startup tasks...`,\n );\n await Promise.all(\n this.#startupTasks.map(async ({ hook, options }) => {\n const logger = options?.logger ?? this.logger;\n try {\n await hook();\n logger.debug(`Plugin startup hook succeeded`);\n } catch (error) {\n logger.error(`Plugin startup hook failed, ${error}`);\n }\n }),\n );\n }\n\n addShutdownHook(\n hook: LifecycleServiceShutdownHook,\n options?: LifecycleServiceShutdownOptions,\n ): void {\n const plugin = this.pluginMetadata.getId();\n this.rootLifecycle.addShutdownHook(hook, {\n logger: options?.logger?.child({ plugin }) ?? this.logger,\n });\n }\n}\n\n/**\n * Allows plugins to register shutdown hooks that are run when the process is about to exit.\n * @public\n */\nexport const lifecycleServiceFactory = createServiceFactory({\n service: coreServices.lifecycle,\n deps: {\n logger: coreServices.logger,\n rootLifecycle: coreServices.rootLifecycle,\n pluginMetadata: coreServices.pluginMetadata,\n },\n async factory({ rootLifecycle, logger, pluginMetadata }) {\n return new BackendPluginLifecycleImpl(\n logger,\n rootLifecycle,\n pluginMetadata,\n );\n },\n});\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\ninterface NodeInput<T> {\n value: T;\n consumes?: Iterable<string>;\n provides?: Iterable<string>;\n}\n\n/** @internal */\nclass Node<T> {\n static from<T>(input: NodeInput<T>) {\n return new Node<T>(\n input.value,\n input.consumes ? new Set(input.consumes) : new Set(),\n input.provides ? new Set(input.provides) : new Set(),\n );\n }\n\n private constructor(\n readonly value: T,\n readonly consumes: Set<string>,\n readonly provides: Set<string>,\n ) {}\n}\n\n/** @internal */\nclass CycleKeySet<T> {\n static from<T>(nodes: Array<Node<T>>) {\n return new CycleKeySet<T>(nodes);\n }\n\n #nodeIds: Map<T, number>;\n #cycleKeys: Set<string>;\n\n private constructor(nodes: Array<Node<T>>) {\n this.#nodeIds = new Map(nodes.map((n, i) => [n.value, i]));\n this.#cycleKeys = new Set<string>();\n }\n\n tryAdd(path: T[]): boolean {\n const cycleKey = this.#getCycleKey(path);\n if (this.#cycleKeys.has(cycleKey)) {\n return false;\n }\n this.#cycleKeys.add(cycleKey);\n return true;\n }\n\n #getCycleKey(path: T[]): string {\n return path\n .map(n => this.#nodeIds.get(n)!)\n .sort()\n .join(',');\n }\n}\n\n/**\n * Internal helper to help validate and traverse a dependency graph.\n * @internal\n */\nexport class DependencyGraph<T> {\n static fromMap(\n nodes: Record<string, Omit<NodeInput<unknown>, 'value'>>,\n ): DependencyGraph<string> {\n return this.fromIterable(\n Object.entries(nodes).map(([key, node]) => ({\n value: String(key),\n ...node,\n })),\n );\n }\n\n static fromIterable<T>(\n nodeInputs: Iterable<NodeInput<T>>,\n ): DependencyGraph<T> {\n const nodes = new Array<Node<T>>();\n for (const nodeInput of nodeInputs) {\n nodes.push(Node.from(nodeInput));\n }\n\n return new DependencyGraph(nodes);\n }\n\n #nodes: Array<Node<T>>;\n #allProvided: Set<string>;\n\n private constructor(nodes: Array<Node<T>>) {\n this.#nodes = nodes;\n this.#allProvided = new Set();\n\n for (const node of this.#nodes.values()) {\n for (const produced of node.provides) {\n this.#allProvided.add(produced);\n }\n }\n }\n\n /**\n * Find all nodes that consume dependencies that are not provided by any other node.\n */\n findUnsatisfiedDeps(): Array<{ value: T; unsatisfied: string[] }> {\n const unsatisfiedDependencies = [];\n for (const node of this.#nodes.values()) {\n const unsatisfied = Array.from(node.consumes).filter(\n id => !this.#allProvided.has(id),\n );\n if (unsatisfied.length > 0) {\n unsatisfiedDependencies.push({ value: node.value, unsatisfied });\n }\n }\n return unsatisfiedDependencies;\n }\n\n /**\n * Detect the first circular dependency within the graph, returning the path of nodes that\n * form a cycle, with the same node as the first and last element of the array.\n */\n detectCircularDependency(): T[] | undefined {\n return this.detectCircularDependencies().next().value;\n }\n\n /**\n * Detect circular dependencies within the graph, returning the path of nodes that\n * form a cycle, with the same node as the first and last element of the array.\n */\n *detectCircularDependencies(): Generator<T[], undefined> {\n const cycleKeys = CycleKeySet.from(this.#nodes);\n\n for (const startNode of this.#nodes) {\n const visited = new Set<Node<T>>();\n const stack = new Array<[node: Node<T>, path: T[]]>([\n startNode,\n [startNode.value],\n ]);\n\n while (stack.length > 0) {\n const [node, path] = stack.pop()!;\n if (visited.has(node)) {\n continue;\n }\n visited.add(node);\n for (const consumed of node.consumes) {\n const providerNodes = this.#nodes.filter(other =>\n other.provides.has(consumed),\n );\n for (const provider of providerNodes) {\n if (provider === startNode) {\n if (cycleKeys.tryAdd(path)) {\n yield [...path, startNode.value];\n }\n\n break;\n }\n if (!visited.has(provider)) {\n stack.push([provider, [...path, provider.value]]);\n }\n }\n }\n }\n }\n return undefined;\n }\n\n /**\n * Traverses the dependency graph in topological order, calling the provided\n * function for each node and waiting for it to resolve.\n *\n * The nodes are traversed in parallel, but in such a way that no node is\n * visited before all of its dependencies.\n *\n * Dependencies of nodes that are not produced by any other nodes will be ignored.\n */\n async parallelTopologicalTraversal<TResult>(\n fn: (value: T) => Promise<TResult>,\n ): Promise<TResult[]> {\n const allProvided = this.#allProvided;\n const producedSoFar = new Set<string>();\n const waiting = new Set(this.#nodes.values());\n const visited = new Set<Node<T>>();\n const results = new Array<TResult>();\n let inFlight = 0; // Keep track of how many callbacks are in flight, so that we know if we got stuck\n\n // Find all nodes that have no dependencies that have not already been produced by visited nodes\n async function processMoreNodes() {\n if (waiting.size === 0) {\n return;\n }\n const nodesToProcess = [];\n for (const node of waiting) {\n let ready = true;\n for (const consumed of node.consumes) {\n if (allProvided.has(consumed) && !producedSoFar.has(consumed)) {\n ready = false;\n continue;\n }\n }\n if (ready) {\n nodesToProcess.push(node);\n }\n }\n\n for (const node of nodesToProcess) {\n waiting.delete(node);\n }\n\n if (nodesToProcess.length === 0 && inFlight === 0) {\n // We expect the caller to check for circular dependencies before\n // traversal, so this error should never happen\n throw new Error('Circular dependency detected');\n }\n\n await Promise.all(nodesToProcess.map(processNode));\n }\n\n // Process an individual node, and then add its produced dependencies to the set of available products\n async function processNode(node: Node<T>) {\n visited.add(node);\n inFlight += 1;\n\n const result = await fn(node.value);\n results.push(result);\n\n node.provides.forEach(produced => producedSoFar.add(produced));\n inFlight -= 1;\n await processMoreNodes();\n }\n\n await processMoreNodes();\n\n return results;\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ServiceFactory,\n ServiceRef,\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { ConflictError, stringifyError } from '@backstage/errors';\n// Direct internal import to avoid duplication\n// eslint-disable-next-line @backstage/no-forbidden-package-imports\nimport { InternalServiceFactory } from '@backstage/backend-plugin-api/src/services/system/types';\nimport { DependencyGraph } from '../lib/DependencyGraph';\n/**\n * Keep in sync with `@backstage/backend-plugin-api/src/services/system/types.ts`\n * @internal\n */\nexport type InternalServiceRef = ServiceRef<unknown> & {\n __defaultFactory?: (\n service: ServiceRef<unknown>,\n ) => Promise<ServiceFactory | (() => ServiceFactory)>;\n};\n\nfunction toInternalServiceFactory<TService, TScope extends 'plugin' | 'root'>(\n factory: ServiceFactory<TService, TScope>,\n): InternalServiceFactory<TService, TScope> {\n const f = factory as InternalServiceFactory<TService, TScope>;\n if (f.$$type !== '@backstage/BackendFeature') {\n throw new Error(`Invalid service factory, bad type '${f.$$type}'`);\n }\n if (f.version !== 'v1') {\n throw new Error(`Invalid service factory, bad version '${f.version}'`);\n }\n return f;\n}\n\nconst pluginMetadataServiceFactory = createServiceFactory(\n (options?: { pluginId: string }) => ({\n service: coreServices.pluginMetadata,\n deps: {},\n factory: async () => ({ getId: () => options?.pluginId! }),\n }),\n);\n\nexport class ServiceRegistry {\n static create(factories: Array<ServiceFactory>): ServiceRegistry {\n const registry = new ServiceRegistry(factories);\n registry.checkForCircularDeps();\n return registry;\n }\n\n readonly #providedFactories: Map<string, InternalServiceFactory>;\n readonly #loadedDefaultFactories: Map<\n Function,\n Promise<InternalServiceFactory>\n >;\n readonly #implementations: Map<\n InternalServiceFactory,\n {\n context: Promise<unknown>;\n byPlugin: Map<string, Promise<unknown>>;\n }\n >;\n readonly #rootServiceImplementations = new Map<\n InternalServiceFactory,\n Promise<unknown>\n >();\n readonly #addedFactoryIds = new Set<string>();\n readonly #instantiatedFactories = new Set<string>();\n\n private constructor(factories: Array<ServiceFactory>) {\n this.#providedFactories = new Map(\n factories.map(sf => [sf.service.id, toInternalServiceFactory(sf)]),\n );\n this.#loadedDefaultFactories = new Map();\n this.#implementations = new Map();\n }\n\n #resolveFactory(\n ref: ServiceRef<unknown>,\n pluginId: string,\n ): Promise<InternalServiceFactory> | undefined {\n // Special case handling of the plugin metadata service, generating a custom factory for it each time\n if (ref.id === coreServices.pluginMetadata.id) {\n return Promise.resolve(\n toInternalServiceFactory(pluginMetadataServiceFactory({ pluginId })),\n );\n }\n\n let resolvedFactory:\n | Promise<InternalServiceFactory>\n | InternalServiceFactory\n | undefined = this.#providedFactories.get(ref.id);\n const { __defaultFactory: defaultFactory } = ref as InternalServiceRef;\n if (!resolvedFactory && !defaultFactory) {\n return undefined;\n }\n\n if (!resolvedFactory) {\n let loadedFactory = this.#loadedDefaultFactories.get(defaultFactory!);\n if (!loadedFactory) {\n loadedFactory = Promise.resolve()\n .then(() => defaultFactory!(ref))\n .then(f =>\n toInternalServiceFactory(typeof f === 'function' ? f() : f),\n );\n this.#loadedDefaultFactories.set(defaultFactory!, loadedFactory);\n }\n resolvedFactory = loadedFactory.catch(error => {\n throw new Error(\n `Failed to instantiate service '${\n ref.id\n }' because the default factory loader threw an error, ${stringifyError(\n error,\n )}`,\n );\n });\n }\n\n return Promise.resolve(resolvedFactory);\n }\n\n #checkForMissingDeps(factory: InternalServiceFactory, pluginId: string) {\n const missingDeps = Object.values(factory.deps).filter(ref => {\n if (ref.id === coreServices.pluginMetadata.id) {\n return false;\n }\n if (this.#providedFactories.get(ref.id)) {\n return false;\n }\n\n return !(ref as InternalServiceRef).__defaultFactory;\n });\n\n if (missingDeps.length) {\n const missing = missingDeps.map(r => `'${r.id}'`).join(', ');\n throw new Error(\n `Failed to instantiate service '${factory.service.id}' for '${pluginId}' because the following dependent services are missing: ${missing}`,\n );\n }\n }\n\n checkForCircularDeps(): void {\n const graph = DependencyGraph.fromIterable(\n Array.from(this.#providedFactories).map(\n ([serviceId, serviceFactory]) => ({\n value: serviceId,\n provides: [serviceId],\n consumes: Object.values(serviceFactory.deps).map(d => d.id),\n }),\n ),\n );\n const circularDependencies = Array.from(graph.detectCircularDependencies());\n\n if (circularDependencies.length) {\n const cycles = circularDependencies\n .map(c => c.map(id => `'${id}'`).join(' -> '))\n .join('\\n ');\n\n throw new ConflictError(`Circular dependencies detected:\\n ${cycles}`);\n }\n }\n\n add(factory: ServiceFactory) {\n const factoryId = factory.service.id;\n if (factoryId === coreServices.pluginMetadata.id) {\n throw new Error(\n `The ${coreServices.pluginMetadata.id} service cannot be overridden`,\n );\n }\n\n if (this.#addedFactoryIds.has(factoryId)) {\n throw new Error(\n `Duplicate service implementations provided for ${factoryId}`,\n );\n }\n\n if (this.#instantiatedFactories.has(factoryId)) {\n throw new Error(\n `Unable to set service factory with id ${factoryId}, service has already been instantiated`,\n );\n }\n\n this.#addedFactoryIds.add(factoryId);\n this.#providedFactories.set(factoryId, toInternalServiceFactory(factory));\n }\n\n async initializeEagerServicesWithScope(\n scope: 'root' | 'plugin',\n pluginId: string = 'root',\n ) {\n for (const factory of this.#providedFactories.values()) {\n if (factory.service.scope === scope) {\n // Root-scoped services are eager by default, plugin-scoped are lazy by default\n if (scope === 'root' && factory.initialization !== 'lazy') {\n await this.get(factory.service, pluginId);\n } else if (scope === 'plugin' && factory.initialization === 'always') {\n await this.get(factory.service, pluginId);\n }\n }\n }\n }\n\n get<T>(ref: ServiceRef<T>, pluginId: string): Promise<T> | undefined {\n this.#instantiatedFactories.add(ref.id);\n\n return this.#resolveFactory(ref, pluginId)?.then(factory => {\n if (factory.service.scope === 'root') {\n let existing = this.#rootServiceImplementations.get(factory);\n if (!existing) {\n this.#checkForMissingDeps(factory, pluginId);\n const rootDeps = new Array<Promise<[name: string, impl: unknown]>>();\n\n for (const [name, serviceRef] of Object.entries(factory.deps)) {\n if (serviceRef.scope !== 'root') {\n throw new Error(\n `Failed to instantiate 'root' scoped service '${ref.id}' because it depends on '${serviceRef.scope}' scoped service '${serviceRef.id}'.`,\n );\n }\n const target = this.get(serviceRef, pluginId)!;\n rootDeps.push(target.then(impl => [name, impl]));\n }\n\n existing = Promise.all(rootDeps).then(entries =>\n factory.factory(Object.fromEntries(entries), undefined),\n );\n this.#rootServiceImplementations.set(factory, existing);\n }\n return existing as Promise<T>;\n }\n\n let implementation = this.#implementations.get(factory);\n if (!implementation) {\n this.#checkForMissingDeps(factory, pluginId);\n const rootDeps = new Array<Promise<[name: string, impl: unknown]>>();\n\n for (const [name, serviceRef] of Object.entries(factory.deps)) {\n if (serviceRef.scope === 'root') {\n const target = this.get(serviceRef, pluginId)!;\n rootDeps.push(target.then(impl => [name, impl]));\n }\n }\n\n implementation = {\n context: Promise.all(rootDeps)\n .then(entries =>\n factory.createRootContext?.(Object.fromEntries(entries)),\n )\n .catch(error => {\n const cause = stringifyError(error);\n throw new Error(\n `Failed to instantiate service '${ref.id}' because createRootContext threw an error, ${cause}`,\n );\n }),\n byPlugin: new Map(),\n };\n\n this.#implementations.set(factory, implementation);\n }\n\n let result = implementation.byPlugin.get(pluginId) as Promise<any>;\n if (!result) {\n const allDeps = new Array<Promise<[name: string, impl: unknown]>>();\n\n for (const [name, serviceRef] of Object.entries(factory.deps)) {\n const target = this.get(serviceRef, pluginId)!;\n allDeps.push(target.then(impl => [name, impl]));\n }\n\n result = implementation.context\n .then(context =>\n Promise.all(allDeps).then(entries =>\n factory.factory(Object.fromEntries(entries), context),\n ),\n )\n .catch(error => {\n const cause = stringifyError(error);\n throw new Error(\n `Failed to instantiate service '${ref.id}' for '${pluginId}' because the factory function threw an error, ${cause}`,\n );\n });\n implementation.byPlugin.set(pluginId, result);\n }\n\n return result;\n });\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n BackendFeature,\n ExtensionPoint,\n coreServices,\n ServiceRef,\n ServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { BackendLifecycleImpl } from '../services/implementations/rootLifecycle/rootLifecycleServiceFactory';\nimport { BackendPluginLifecycleImpl } from '../services/implementations/lifecycle/lifecycleServiceFactory';\nimport { ServiceOrExtensionPoint } from './types';\n// Direct internal import to avoid duplication\n// eslint-disable-next-line @backstage/no-forbidden-package-imports\nimport { InternalBackendFeature } from '@backstage/backend-plugin-api/src/wiring/types';\nimport { ForwardedError, ConflictError } from '@backstage/errors';\nimport { featureDiscoveryServiceRef } from '@backstage/backend-plugin-api/alpha';\nimport { DependencyGraph } from '../lib/DependencyGraph';\nimport { ServiceRegistry } from './ServiceRegistry';\n\nexport interface BackendRegisterInit {\n consumes: Set<ServiceOrExtensionPoint>;\n provides: Set<ServiceOrExtensionPoint>;\n init: {\n deps: { [name: string]: ServiceOrExtensionPoint };\n func: (deps: { [name: string]: unknown }) => Promise<void>;\n };\n}\n\nexport class BackendInitializer {\n #startPromise?: Promise<void>;\n #features = new Array<InternalBackendFeature>();\n #extensionPoints = new Map<string, { impl: unknown; pluginId: string }>();\n #serviceRegistry: ServiceRegistry;\n #registeredFeatures = new Array<Promise<BackendFeature>>();\n\n constructor(defaultApiFactories: ServiceFactory[]) {\n this.#serviceRegistry = ServiceRegistry.create([...defaultApiFactories]);\n }\n\n async #getInitDeps(\n deps: { [name: string]: ServiceOrExtensionPoint },\n pluginId: string,\n moduleId?: string,\n ) {\n const result = new Map<string, unknown>();\n const missingRefs = new Set<ServiceOrExtensionPoint>();\n\n for (const [name, ref] of Object.entries(deps)) {\n const ep = this.#extensionPoints.get(ref.id);\n if (ep) {\n if (ep.pluginId !== pluginId) {\n throw new Error(\n `Illegal dependency: Module '${moduleId}' for plugin '${pluginId}' attempted to depend on extension point '${ref.id}' for plugin '${ep.pluginId}'. Extension points can only be used within their plugin's scope.`,\n );\n }\n result.set(name, ep.impl);\n } else {\n const impl = await this.#serviceRegistry.get(\n ref as ServiceRef<unknown>,\n pluginId,\n );\n if (impl) {\n result.set(name, impl);\n } else {\n missingRefs.add(ref);\n }\n }\n }\n\n if (missingRefs.size > 0) {\n const missing = Array.from(missingRefs).join(', ');\n throw new Error(\n `No extension point or service available for the following ref(s): ${missing}`,\n );\n }\n\n return Object.fromEntries(result);\n }\n\n add(feature: BackendFeature | Promise<BackendFeature>) {\n if (this.#startPromise) {\n throw new Error('feature can not be added after the backend has started');\n }\n this.#registeredFeatures.push(Promise.resolve(feature));\n }\n\n #addFeature(feature: BackendFeature) {\n if (feature.$$type !== '@backstage/BackendFeature') {\n throw new Error(\n `Failed to add feature, invalid type '${feature.$$type}'`,\n );\n }\n\n if (isServiceFactory(feature)) {\n this.#serviceRegistry.add(feature);\n } else if (isInternalBackendFeature(feature)) {\n if (feature.version !== 'v1') {\n throw new Error(\n `Failed to add feature, invalid version '${feature.version}'`,\n );\n }\n this.#features.push(feature);\n } else {\n throw new Error(\n `Failed to add feature, invalid feature ${JSON.stringify(feature)}`,\n );\n }\n }\n\n async start(): Promise<void> {\n if (this.#startPromise) {\n throw new Error('Backend has already started');\n }\n\n const exitHandler = async () => {\n process.removeListener('SIGTERM', exitHandler);\n process.removeListener('SIGINT', exitHandler);\n process.removeListener('beforeExit', exitHandler);\n\n try {\n await this.stop();\n process.exit(0);\n } catch (error) {\n console.error(error);\n process.exit(1);\n }\n };\n\n process.addListener('SIGTERM', exitHandler);\n process.addListener('SIGINT', exitHandler);\n process.addListener('beforeExit', exitHandler);\n\n this.#startPromise = this.#doStart();\n await this.#startPromise;\n }\n\n async #doStart(): Promise<void> {\n this.#serviceRegistry.checkForCircularDeps();\n\n for (const feature of this.#registeredFeatures) {\n this.#addFeature(await feature);\n }\n\n const featureDiscovery = await this.#serviceRegistry.get(\n featureDiscoveryServiceRef,\n 'root',\n );\n\n if (featureDiscovery) {\n const { features } = await featureDiscovery.getBackendFeatures();\n for (const feature of features) {\n this.#addFeature(feature);\n }\n this.#serviceRegistry.checkForCircularDeps();\n }\n\n // Initialize all root scoped services\n await this.#serviceRegistry.initializeEagerServicesWithScope('root');\n\n const pluginInits = new Map<string, BackendRegisterInit>();\n const moduleInits = new Map<string, Map<string, BackendRegisterInit>>();\n\n // Enumerate all features\n for (const feature of this.#features) {\n for (const r of feature.getRegistrations()) {\n const provides = new Set<ExtensionPoint<unknown>>();\n\n if (r.type === 'plugin' || r.type === 'module') {\n for (const [extRef, extImpl] of r.extensionPoints) {\n if (this.#extensionPoints.has(extRef.id)) {\n throw new Error(\n `ExtensionPoint with ID '${extRef.id}' is already registered`,\n );\n }\n this.#extensionPoints.set(extRef.id, {\n impl: extImpl,\n pluginId: r.pluginId,\n });\n provides.add(extRef);\n }\n }\n\n if (r.type === 'plugin') {\n if (pluginInits.has(r.pluginId)) {\n throw new Error(`Plugin '${r.pluginId}' is already registered`);\n }\n pluginInits.set(r.pluginId, {\n provides,\n consumes: new Set(Object.values(r.init.deps)),\n init: r.init,\n });\n } else {\n let modules = moduleInits.get(r.pluginId);\n if (!modules) {\n modules = new Map();\n moduleInits.set(r.pluginId, modules);\n }\n if (modules.has(r.moduleId)) {\n throw new Error(\n `Module '${r.moduleId}' for plugin '${r.pluginId}' is already registered`,\n );\n }\n modules.set(r.moduleId, {\n provides,\n consumes: new Set(Object.values(r.init.deps)),\n init: r.init,\n });\n }\n }\n }\n\n const allPluginIds = [...pluginInits.keys()];\n\n // All plugins are initialized in parallel\n await Promise.all(\n allPluginIds.map(async pluginId => {\n // Initialize all eager services\n await this.#serviceRegistry.initializeEagerServicesWithScope(\n 'plugin',\n pluginId,\n );\n\n // Modules are initialized before plugins, so that they can provide extension to the plugin\n const modules = moduleInits.get(pluginId);\n if (modules) {\n const tree = DependencyGraph.fromIterable(\n Array.from(modules).map(([moduleId, moduleInit]) => ({\n value: { moduleId, moduleInit },\n // Relationships are reversed at this point since we're only interested in the extension points.\n // If a modules provides extension point A we want it to be initialized AFTER all modules\n // that depend on extension point A, so that they can provide their extensions.\n consumes: Array.from(moduleInit.provides).map(p => p.id),\n provides: Array.from(moduleInit.consumes).map(c => c.id),\n })),\n );\n const circular = tree.detectCircularDependency();\n if (circular) {\n throw new ConflictError(\n `Circular dependency detected for modules of plugin '${pluginId}', ${circular\n .map(({ moduleId }) => `'${moduleId}'`)\n .join(' -> ')}`,\n );\n }\n await tree.parallelTopologicalTraversal(\n async ({ moduleId, moduleInit }) => {\n const moduleDeps = await this.#getInitDeps(\n moduleInit.init.deps,\n pluginId,\n moduleId,\n );\n await moduleInit.init.func(moduleDeps).catch(error => {\n throw new ForwardedError(\n `Module '${moduleId}' for plugin '${pluginId}' startup failed`,\n error,\n );\n });\n },\n );\n }\n\n // Once all modules have been initialized, we can initialize the plugin itself\n const pluginInit = pluginInits.get(pluginId);\n // We allow modules to be installed without the accompanying plugin, so the plugin may not exist\n if (pluginInit) {\n const pluginDeps = await this.#getInitDeps(\n pluginInit.init.deps,\n pluginId,\n );\n await pluginInit.init.func(pluginDeps).catch(error => {\n throw new ForwardedError(\n `Plugin '${pluginId}' startup failed`,\n error,\n );\n });\n }\n\n // Once the plugin and all modules have been initialized, we can signal that the plugin has stared up successfully\n const lifecycleService = await this.#getPluginLifecycleImpl(pluginId);\n await lifecycleService.startup();\n }),\n );\n\n // Once all plugins and modules have been initialized, we can signal that the backend has started up successfully\n const lifecycleService = await this.#getRootLifecycleImpl();\n await lifecycleService.startup();\n\n // Once the backend is started, any uncaught errors or unhandled rejections are caught\n // and logged, in order to avoid crashing the entire backend on local failures.\n if (process.env.NODE_ENV !== 'test') {\n const rootLogger = await this.#serviceRegistry.get(\n coreServices.rootLogger,\n 'root',\n );\n process.on('unhandledRejection', (reason: Error) => {\n rootLogger\n ?.child({ type: 'unhandledRejection' })\n ?.error('Unhandled rejection', reason);\n });\n process.on('uncaughtException', error => {\n rootLogger\n ?.child({ type: 'uncaughtException' })\n ?.error('Uncaught exception', error);\n });\n }\n }\n\n async stop(): Promise<void> {\n if (!this.#startPromise) {\n return;\n }\n\n try {\n await this.#startPromise;\n } catch (error) {\n // The startup failed, but we may still want to do cleanup so we continue silently\n }\n\n const lifecycleService = await this.#getRootLifecycleImpl();\n await lifecycleService.shutdown();\n }\n\n // Bit of a hacky way to grab the lifecycle services, potentially find a nicer way to do this\n async #getRootLifecycleImpl(): Promise<BackendLifecycleImpl> {\n const lifecycleService = await this.#serviceRegistry.get(\n coreServices.rootLifecycle,\n 'root',\n );\n if (lifecycleService instanceof BackendLifecycleImpl) {\n return lifecycleService;\n }\n throw new Error('Unexpected root lifecycle service implementation');\n }\n\n async #getPluginLifecycleImpl(\n pluginId: string,\n ): Promise<BackendPluginLifecycleImpl> {\n const lifecycleService = await this.#serviceRegistry.get(\n coreServices.lifecycle,\n pluginId,\n );\n if (lifecycleService instanceof BackendPluginLifecycleImpl) {\n return lifecycleService;\n }\n throw new Error('Unexpected plugin lifecycle service implementation');\n }\n}\n\nfunction isServiceFactory(feature: BackendFeature): feature is ServiceFactory {\n return !!(feature as ServiceFactory).service;\n}\n\nfunction isInternalBackendFeature(\n feature: BackendFeature,\n): feature is InternalBackendFeature {\n return (\n typeof (feature as InternalBackendFeature).getRegistrations === 'function'\n );\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BackendFeature, ServiceFactory } from '@backstage/backend-plugin-api';\nimport { BackendInitializer } from './BackendInitializer';\nimport { Backend } from './types';\n\nexport class BackstageBackend implements Backend {\n #initializer: BackendInitializer;\n\n constructor(defaultServiceFactories: ServiceFactory[]) {\n this.#initializer = new BackendInitializer(defaultServiceFactories);\n }\n\n add(\n feature:\n | BackendFeature\n | (() => BackendFeature)\n | Promise<{ default: BackendFeature | (() => BackendFeature) }>,\n ): void {\n if (isPromise(feature)) {\n this.#initializer.add(feature.then(f => unwrapFeature(f.default)));\n } else {\n this.#initializer.add(unwrapFeature(feature));\n }\n }\n\n async start(): Promise<void> {\n await this.#initializer.start();\n }\n\n async stop(): Promise<void> {\n await this.#initializer.stop();\n }\n}\n\nfunction isPromise<T>(value: unknown | Promise<T>): value is Promise<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof value.then === 'function'\n );\n}\n\nfunction unwrapFeature(\n feature:\n | BackendFeature\n | (() => BackendFeature)\n | { default: BackendFeature | (() => BackendFeature) },\n): BackendFeature {\n if (typeof feature === 'function') {\n return feature();\n }\n if ('$$type' in feature) {\n return feature;\n }\n // This is a workaround where default exports get transpiled to `exports['default'] = ...`\n // in CommonJS modules, which in turn results in a double `{ default: { default: ... } }` nesting\n // when importing using a dynamic import.\n // TODO: This is a broader issue than just this piece of code, and should move away from CommonJS.\n if ('default' in feature) {\n const defaultFeature = feature.default;\n return typeof defaultFeature === 'function'\n ? defaultFeature()\n : defaultFeature;\n }\n return feature;\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { coreServices } from '@backstage/backend-plugin-api';\nimport { BackstageBackend } from './BackstageBackend';\nimport { Backend, CreateSpecializedBackendOptions } from './types';\n\n/**\n * @public\n */\nexport function createSpecializedBackend(\n options: CreateSpecializedBackendOptions,\n): Backend {\n const services = options.defaultServiceFactories.map(sf =>\n typeof sf === 'function' ? sf() : sf,\n );\n\n const exists = new Set<string>();\n const duplicates = new Set<string>();\n for (const { service } of services) {\n if (exists.has(service.id)) {\n duplicates.add(service.id);\n } else {\n exists.add(service.id);\n }\n }\n if (duplicates.size > 0) {\n const ids = Array.from(duplicates).join(', ');\n throw new Error(`Duplicate service implementations provided for ${ids}`);\n }\n if (exists.has(coreServices.pluginMetadata.id)) {\n throw new Error(\n `The ${coreServices.pluginMetadata.id} service cannot be overridden`,\n );\n }\n\n return new BackstageBackend(services);\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DatabaseService, LoggerService } from '@backstage/backend-plugin-api';\nimport { DateTime } from 'luxon';\nimport { Knex } from 'knex';\nimport { JsonObject } from '@backstage/types';\nimport { resolvePackagePath } from '@backstage/backend-common';\nimport { KeyStore } from './types';\n\nconst MIGRATIONS_TABLE = 'backstage_backend_public_keys__knex_migrations';\n/** @internal */\nexport const TABLE = 'backstage_backend_public_keys__keys';\n\ntype Row = {\n id: string;\n key: string;\n expires_at: string;\n};\n\nexport function applyDatabaseMigrations(knex: Knex): Promise<void> {\n const migrationsDir = resolvePackagePath(\n '@backstage/backend-app-api',\n 'migrations',\n );\n\n return knex.migrate.latest({\n directory: migrationsDir,\n tableName: MIGRATIONS_TABLE,\n });\n}\n\n/** @internal */\nexport class DatabaseKeyStore implements KeyStore {\n static async create(options: {\n database: DatabaseService;\n logger: LoggerService;\n }) {\n const { database, logger } = options;\n\n const client = await database.getClient();\n if (!database.migrations?.skip) {\n await applyDatabaseMigrations(client);\n }\n return new DatabaseKeyStore(client, logger);\n }\n\n private constructor(\n private readonly client: Knex,\n private readonly logger: LoggerService,\n ) {}\n\n async addKey(options: {\n id: string;\n key: JsonObject & { kid: string };\n expiresAt: Date;\n }) {\n await this.client<Row>(TABLE).insert({\n id: options.key.kid,\n key: JSON.stringify(options.key),\n expires_at: options.expiresAt.toISOString(),\n });\n }\n\n async listKeys() {\n const rows = await this.client<Row>(TABLE).select();\n const keys = rows.map(row => ({\n id: row.id,\n key: JSON.parse(row.key),\n expiresAt: new Date(row.expires_at),\n }));\n\n const validKeys = [];\n const expiredKeys = [];\n\n for (const key of keys) {\n if (DateTime.fromJSDate(key.expiresAt) < DateTime.local()) {\n expiredKeys.push(key);\n } else {\n validKeys.push(key);\n }\n }\n\n // Lazily prune expired keys. This may cause duplicate removals if we have concurrent callers, but w/e\n if (expiredKeys.length > 0) {\n const kids = expiredKeys.map(({ key }) => key.kid);\n\n this.logger.info(\n `Removing expired plugin service keys, '${kids.join(\"', '\")}'`,\n );\n\n // We don't await this, just let it run in the background\n this.client<Row>(TABLE)\n .delete()\n .whereIn('id', kids)\n .catch(error => {\n this.logger.error(\n 'Failed to remove expired plugin service keys',\n error,\n );\n });\n }\n\n return { keys: validKeys };\n }\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n BackstageCredentials,\n BackstageNonePrincipal,\n BackstageServicePrincipal,\n BackstageUserPrincipal,\n} from '@backstage/backend-plugin-api';\nimport { InternalBackstageCredentials } from './types';\n\nexport function createCredentialsWithServicePrincipal(\n sub: string,\n token?: string,\n): InternalBackstageCredentials<BackstageServicePrincipal> {\n return {\n $$type: '@backstage/BackstageCredentials',\n version: 'v1',\n token,\n principal: {\n type: 'service',\n subject: sub,\n },\n };\n}\n\nexport function createCredentialsWithUserPrincipal(\n sub: string,\n token: string,\n expiresAt?: Date,\n): InternalBackstageCredentials<BackstageUserPrincipal> {\n return {\n $$type: '@backstage/BackstageCredentials',\n version: 'v1',\n token,\n expiresAt,\n principal: {\n type: 'user',\n userEntityRef: sub,\n },\n };\n}\n\nexport function createCredentialsWithNonePrincipal(): InternalBackstageCredentials<BackstageNonePrincipal> {\n return {\n $$type: '@backstage/BackstageCredentials',\n version: 'v1',\n principal: {\n type: 'none',\n },\n };\n}\n\nexport function toInternalBackstageCredentials(\n credentials: BackstageCredentials,\n): InternalBackstageCredentials<\n BackstageUserPrincipal | BackstageServicePrincipal | BackstageNonePrincipal\n> {\n if (credentials.$$type !== '@backstage/BackstageCredentials') {\n throw new Error('Invalid credential type');\n }\n\n const internalCredentials = credentials as InternalBackstageCredentials<\n BackstageUserPrincipal | BackstageServicePrincipal | BackstageNonePrincipal\n >;\n\n if (internalCredentials.version !== 'v1') {\n throw new Error(\n `Invalid credential version ${internalCredentials.version}`,\n );\n }\n\n return internalCredentials;\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TokenManager } from '@backstage/backend-common';\nimport {\n AuthService,\n BackstageCredentials,\n BackstageNonePrincipal,\n BackstagePrincipalTypes,\n BackstageServicePrincipal,\n BackstageUserPrincipal,\n} from '@backstage/backend-plugin-api';\nimport { AuthenticationError } from '@backstage/errors';\nimport { JsonObject } from '@backstage/types';\nimport { decodeJwt } from 'jose';\nimport { ExternalTokenHandler } from './external/ExternalTokenHandler';\nimport { PluginTokenHandler } from './plugin/PluginTokenHandler';\nimport { UserTokenHandler } from './user/UserTokenHandler';\nimport {\n createCredentialsWithNonePrincipal,\n createCredentialsWithServicePrincipal,\n createCredentialsWithUserPrincipal,\n toInternalBackstageCredentials,\n} from './helpers';\nimport { KeyStore } from './types';\n\n/** @internal */\nexport class DefaultAuthService implements AuthService {\n constructor(\n private readonly userTokenHandler: UserTokenHandler,\n private readonly pluginTokenHandler: PluginTokenHandler,\n private readonly externalTokenHandler: ExternalTokenHandler,\n private readonly tokenManager: TokenManager,\n private readonly pluginId: string,\n private readonly disableDefaultAuthPolicy: boolean,\n private readonly publicKeyStore: KeyStore,\n ) {}\n\n // allowLimitedAccess is currently ignored, since we currently always use the full user tokens\n async authenticate(token: string): Promise<BackstageCredentials> {\n const pluginResult = await this.pluginTokenHandler.verifyToken(token);\n if (pluginResult) {\n if (pluginResult.limitedUserToken) {\n const userResult = await this.userTokenHandler.verifyToken(\n pluginResult.limitedUserToken,\n );\n if (!userResult) {\n throw new AuthenticationError(\n 'Invalid user token in plugin token obo claim',\n );\n }\n return createCredentialsWithUserPrincipal(\n userResult.userEntityRef,\n pluginResult.limitedUserToken,\n this.#getJwtExpiration(pluginResult.limitedUserToken),\n );\n }\n return createCredentialsWithServicePrincipal(pluginResult.subject);\n }\n\n const userResult = await this.userTokenHandler.verifyToken(token);\n if (userResult) {\n return createCredentialsWithUserPrincipal(\n userResult.userEntityRef,\n token,\n this.#getJwtExpiration(token),\n );\n }\n\n const externalResult = await this.externalTokenHandler.verifyToken(token);\n if (externalResult) {\n return createCredentialsWithServicePrincipal(externalResult.subject);\n }\n\n throw new AuthenticationError('Illegal token');\n }\n\n isPrincipal<TType extends keyof BackstagePrincipalTypes>(\n credentials: BackstageCredentials,\n type: TType,\n ): credentials is BackstageCredentials<BackstagePrincipalTypes[TType]> {\n const principal = credentials.principal as\n | BackstageUserPrincipal\n | BackstageServicePrincipal;\n\n if (type === 'unknown') {\n return true;\n }\n\n if (principal.type !== type) {\n return false;\n }\n\n return true;\n }\n\n async getNoneCredentials(): Promise<\n BackstageCredentials<BackstageNonePrincipal>\n > {\n return createCredentialsWithNonePrincipal();\n }\n\n async getOwnServiceCredentials(): Promise<\n BackstageCredentials<BackstageServicePrincipal>\n > {\n return createCredentialsWithServicePrincipal(`plugin:${this.pluginId}`);\n }\n\n async getPluginRequestToken(options: {\n onBehalfOf: BackstageCredentials;\n targetPluginId: string;\n }): Promise<{ token: string }> {\n const { targetPluginId } = options;\n const internalForward = toInternalBackstageCredentials(options.onBehalfOf);\n const { type } = internalForward.principal;\n\n // Since disabling the default policy means we'll be allowing\n // unauthenticated requests through, we might have unauthenticated\n // credentials from service calls that reach this point. If that's the case,\n // we'll want to keep \"forwarding\" the unauthenticated credentials, which we\n // do by returning an empty token.\n if (type === 'none' && this.disableDefaultAuthPolicy) {\n return { token: '' };\n }\n\n const targetSupportsNewAuth =\n await this.pluginTokenHandler.isTargetPluginSupported(targetPluginId);\n\n // check whether a plugin support the new auth system\n // by checking the public keys endpoint existance.\n switch (type) {\n // TODO: Check whether the principal is ourselves\n case 'service':\n if (targetSupportsNewAuth) {\n return this.pluginTokenHandler.issueToken({\n pluginId: this.pluginId,\n targetPluginId,\n });\n }\n // If the target plugin does not support the new auth service, fall back to using old token format\n return this.tokenManager.getToken();\n case 'user': {\n const { token } = internalForward;\n if (!token) {\n throw new Error('User credentials is unexpectedly missing token');\n }\n // If the target plugin supports the new auth service we issue a service\n // on-behalf-of token rather than forwarding the user token\n if (targetSupportsNewAuth) {\n const onBehalfOf = await this.userTokenHandler.createLimitedUserToken(\n token,\n );\n return this.pluginTokenHandler.issueToken({\n pluginId: this.pluginId,\n targetPluginId,\n onBehalfOf,\n });\n }\n\n if (this.userTokenHandler.isLimitedUserToken(token)) {\n throw new AuthenticationError(\n `Unable to call '${targetPluginId}' plugin on behalf of user, because the target plugin does not support on-behalf-of tokens or the plugin doesn't exist`,\n );\n }\n return { token };\n }\n default:\n throw new AuthenticationError(\n `Refused to issue service token for credential type '${type}'`,\n );\n }\n }\n\n async getLimitedUserToken(\n credentials: BackstageCredentials<BackstageUserPrincipal>,\n ): Promise<{ token: string; expiresAt: Date }> {\n const { token: backstageToken } =\n toInternalBackstageCredentials(credentials);\n if (!backstageToken) {\n throw new AuthenticationError(\n 'User credentials is unexpectedly missing token',\n );\n }\n\n return this.userTokenHandler.createLimitedUserToken(backstageToken);\n }\n\n async listPublicServiceKeys(): Promise<{ keys: JsonObject[] }> {\n const { keys } = await this.publicKeyStore.listKeys();\n return { keys: keys.map(({ key }) => key) };\n }\n\n #getJwtExpiration(token: string) {\n const { exp } = decodeJwt(token);\n if (!exp) {\n throw new AuthenticationError('User token is missing expiration');\n }\n return new Date(exp * 1000);\n }\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthenticationError } from '@backstage/errors';\nimport {\n createRemoteJWKSet,\n decodeJwt,\n decodeProtectedHeader,\n FlattenedJWSInput,\n JWSHeaderParameters,\n} from 'jose';\nimport { GetKeyFunction } from 'jose/dist/types/types';\n\nconst CLOCK_MARGIN_S = 10;\n\nexport class JwksClient {\n #keyStore?: GetKeyFunction<JWSHeaderParameters, FlattenedJWSInput>;\n #keyStoreUpdated: number = 0;\n\n constructor(private readonly getEndpoint: () => Promise<URL>) {}\n\n get getKey() {\n if (!this.#keyStore) {\n throw new AuthenticationError(\n 'refreshKeyStore must be called before jwksClient.getKey',\n );\n }\n return this.#keyStore;\n }\n\n /**\n * If the last keystore refresh is stale, update the keystore URL to the latest\n */\n async refreshKeyStore(rawJwtToken: string): Promise<void> {\n const payload = await decodeJwt(rawJwtToken);\n const header = await decodeProtectedHeader(rawJwtToken);\n\n // Refresh public keys if needed\n let keyStoreHasKey;\n try {\n if (this.#keyStore) {\n // Check if the key is present in the keystore\n const [_, rawPayload, rawSignature] = rawJwtToken.split('.');\n keyStoreHasKey = await this.#keyStore(header, {\n payload: rawPayload,\n signature: rawSignature,\n });\n }\n } catch (error) {\n keyStoreHasKey = false;\n }\n // Refresh public key URL if needed\n // Add a small margin in case clocks are out of sync\n const issuedAfterLastRefresh =\n payload?.iat && payload.iat > this.#keyStoreUpdated - CLOCK_MARGIN_S;\n if (!this.#keyStore || (!keyStoreHasKey && issuedAfterLastRefresh)) {\n const endpoint = await this.getEndpoint();\n this.#keyStore = createRemoteJWKSet(endpoint);\n this.#keyStoreUpdated = Date.now() / 1000;\n }\n }\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DiscoveryService, LoggerService } from '@backstage/backend-plugin-api';\nimport {\n decodeJwt,\n exportJWK,\n generateKeyPair,\n JWK,\n importJWK,\n SignJWT,\n decodeProtectedHeader,\n} from 'jose';\nimport { v4 as uuid } from 'uuid';\nimport { InternalKey, KeyStore } from '../types';\nimport { AuthenticationError } from '@backstage/errors';\nimport { jwtVerify } from 'jose';\nimport { tokenTypes } from '@backstage/plugin-auth-node';\nimport { JwksClient } from '../JwksClient';\n\n/**\n * The margin for how many times longer we make the public key available\n * compared to how long we use the private key to sign new tokens.\n */\nconst KEY_EXPIRATION_MARGIN_FACTOR = 3;\nconst SECONDS_IN_MS = 1000;\n\nconst ALLOWED_PLUGIN_ID_PATTERN = /^[a-z0-9_-]+$/i;\n\ntype Options = {\n ownPluginId: string;\n publicKeyStore: KeyStore;\n discovery: DiscoveryService;\n logger: LoggerService;\n /** Expiration time of signing keys in seconds */\n keyDurationSeconds: number;\n /** JWS \"alg\" (Algorithm) Header Parameter value. Defaults to ES256.\n * Must match one of the algorithms defined for IdentityClient.\n * When setting a different algorithm, check if the `key` field\n * of the `signing_keys` table can fit the length of the generated keys.\n * If not, add a knex migration file in the migrations folder.\n * More info on supported algorithms: https://github.com/panva/jose */\n algorithm?: string;\n};\n\nexport class PluginTokenHandler {\n private privateKeyPromise?: Promise<JWK>;\n private keyExpiry?: Date;\n private jwksMap = new Map<string, JwksClient>();\n\n // Tracking state for isTargetPluginSupported\n private supportedTargetPlugins = new Set<string>();\n private targetPluginInflightChecks = new Map<string, Promise<boolean>>();\n\n static create(options: Options) {\n return new PluginTokenHandler(\n options.logger,\n options.ownPluginId,\n options.publicKeyStore,\n options.keyDurationSeconds,\n options.algorithm ?? 'ES256',\n options.discovery,\n );\n }\n\n private constructor(\n private readonly logger: LoggerService,\n private readonly ownPluginId: string,\n private readonly publicKeyStore: KeyStore,\n private readonly keyDurationSeconds: number,\n private readonly algorithm: string,\n private readonly discovery: DiscoveryService,\n ) {}\n\n async verifyToken(\n token: string,\n ): Promise<{ subject: string; limitedUserToken?: string } | undefined> {\n try {\n const { typ } = decodeProtectedHeader(token);\n if (typ !== tokenTypes.plugin.typParam) {\n return undefined;\n }\n } catch {\n return undefined;\n }\n\n const pluginId = String(decodeJwt(token).sub);\n if (!pluginId) {\n throw new AuthenticationError('Invalid plugin token: missing subject');\n }\n if (!ALLOWED_PLUGIN_ID_PATTERN.test(pluginId)) {\n throw new AuthenticationError(\n 'Invalid plugin token: forbidden subject format',\n );\n }\n\n const jwksClient = await this.getJwksClient(pluginId);\n await jwksClient.refreshKeyStore(token); // TODO(Rugvip): Refactor so that this isn't needed\n\n const { payload } = await jwtVerify<{ sub: string; obo?: string }>(\n token,\n jwksClient.getKey,\n {\n typ: tokenTypes.plugin.typParam,\n audience: this.ownPluginId,\n requiredClaims: ['iat', 'exp', 'sub', 'aud'],\n },\n ).catch(e => {\n throw new AuthenticationError('Invalid plugin token', e);\n });\n\n return { subject: `plugin:${payload.sub}`, limitedUserToken: payload.obo };\n }\n\n async issueToken(options: {\n pluginId: string;\n targetPluginId: string;\n onBehalfOf?: { token: string; expiresAt: Date };\n }): Promise<{ token: string }> {\n const { pluginId, targetPluginId, onBehalfOf } = options;\n const key = await this.getKey();\n\n const sub = pluginId;\n const aud = targetPluginId;\n const iat = Math.floor(Date.now() / SECONDS_IN_MS);\n const ourExp = iat + this.keyDurationSeconds;\n const exp = onBehalfOf\n ? Math.min(\n ourExp,\n Math.floor(onBehalfOf.expiresAt.getTime() / SECONDS_IN_MS),\n )\n : ourExp;\n\n const claims = { sub, aud, iat, exp, obo: onBehalfOf?.token };\n const token = await new SignJWT(claims)\n .setProtectedHeader({\n typ: tokenTypes.plugin.typParam,\n alg: this.algorithm,\n kid: key.kid,\n })\n .setAudience(aud)\n .setSubject(sub)\n .setIssuedAt(iat)\n .setExpirationTime(exp)\n .sign(await importJWK(key));\n\n return { token };\n }\n\n async isTargetPluginSupported(targetPluginId: string): Promise<boolean> {\n if (this.supportedTargetPlugins.has(targetPluginId)) {\n return true;\n }\n const inFlight = this.targetPluginInflightChecks.get(targetPluginId);\n if (inFlight) {\n return inFlight;\n }\n\n const doCheck = async () => {\n try {\n const res = await fetch(\n `${await this.discovery.getBaseUrl(\n targetPluginId,\n )}/.backstage/auth/v1/jwks.json`,\n );\n if (res.status === 404) {\n return false;\n }\n\n if (!res.ok) {\n throw new Error(`Failed to fetch jwks.json, ${res.status}`);\n }\n\n const data = await res.json();\n if (!data.keys) {\n throw new Error(`Invalid jwks.json response, missing keys`);\n }\n\n this.supportedTargetPlugins.add(targetPluginId);\n return true;\n } catch (error) {\n this.logger.error('Unexpected failure for target JWKS check', error);\n return false;\n } finally {\n this.targetPluginInflightChecks.delete(targetPluginId);\n }\n };\n\n const check = doCheck();\n this.targetPluginInflightChecks.set(targetPluginId, check);\n return check;\n }\n\n private async getJwksClient(pluginId: string) {\n const client = this.jwksMap.get(pluginId);\n if (client) {\n return client;\n }\n\n // Double check that the target plugin has a valid JWKS endpoint, otherwise avoid creating a remote key set\n if (!(await this.isTargetPluginSupported(pluginId))) {\n throw new AuthenticationError(\n `Received a plugin token where the source '${pluginId}' plugin unexpectedly does not have a JWKS endpoint`,\n );\n }\n\n const newClient = new JwksClient(async () => {\n return new URL(\n `${await this.discovery.getBaseUrl(\n pluginId,\n )}/.backstage/auth/v1/jwks.json`,\n );\n });\n\n this.jwksMap.set(pluginId, newClient);\n return newClient;\n }\n\n private async getKey(): Promise<JWK> {\n // Make sure that we only generate one key at a time\n if (this.privateKeyPromise) {\n if (this.keyExpiry && this.keyExpiry.getTime() > Date.now()) {\n return this.privateKeyPromise;\n }\n this.logger.info(`Signing key has expired, generating new key`);\n delete this.privateKeyPromise;\n }\n\n this.keyExpiry = new Date(\n Date.now() + this.keyDurationSeconds * SECONDS_IN_MS,\n );\n\n const promise = (async () => {\n // This generates a new signing key to be used to sign tokens until the next key rotation\n const kid = uuid();\n const key = await generateKeyPair(this.algorithm);\n const publicKey = await exportJWK(key.publicKey);\n const privateKey = await exportJWK(key.privateKey);\n publicKey.kid = privateKey.kid = kid;\n publicKey.alg = privateKey.alg = this.algorithm;\n\n // We're not allowed to use the key until it has been successfully stored\n // TODO: some token verification implementations aggressively cache the list of keys, and\n // don't attempt to fetch new ones even if they encounter an unknown kid. Therefore we\n // may want to keep using the existing key for some period of time until we switch to\n // the new one. This also needs to be implemented cross-service though, meaning new services\n // that boot up need to be able to grab an existing key to use for signing.\n this.logger.info(`Created new signing key ${kid}`);\n\n await this.publicKeyStore.addKey({\n id: kid,\n key: publicKey as InternalKey,\n expiresAt: new Date(\n Date.now() +\n this.keyDurationSeconds *\n SECONDS_IN_MS *\n KEY_EXPIRATION_MARGIN_FACTOR,\n ),\n });\n\n // At this point we are allowed to start using the new key\n return privateKey;\n })();\n\n this.privateKeyPromise = promise;\n\n try {\n // If we fail to generate a new key, we need to clear the state so that\n // the next caller will try to generate another key.\n await promise;\n } catch (error) {\n this.logger.error(`Failed to generate new signing key, ${error}`);\n delete this.keyExpiry;\n delete this.privateKeyPromise;\n }\n\n return promise;\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DiscoveryService } from '@backstage/backend-plugin-api';\nimport { AuthenticationError } from '@backstage/errors';\nimport { tokenTypes } from '@backstage/plugin-auth-node';\nimport {\n base64url,\n decodeJwt,\n decodeProtectedHeader,\n jwtVerify,\n JWTVerifyOptions,\n} from 'jose';\nimport { JwksClient } from '../JwksClient';\n\n/**\n * An identity client to interact with auth-backend and authenticate Backstage\n * tokens\n *\n * @internal\n */\nexport class UserTokenHandler {\n static create(options: { discovery: DiscoveryService }): UserTokenHandler {\n const algorithms = ['ES256']; // TODO: configurable?\n const jwksClient = new JwksClient(async () => {\n const url = await options.discovery.getBaseUrl('auth');\n return new URL(`${url}/.well-known/jwks.json`);\n });\n return new UserTokenHandler(algorithms, jwksClient);\n }\n\n constructor(\n private readonly algorithms: string[],\n private readonly jwksClient: JwksClient,\n ) {}\n\n async verifyToken(token: string) {\n const verifyOpts = this.#getTokenVerificationOptions(token);\n if (!verifyOpts) {\n return undefined;\n }\n\n await this.jwksClient.refreshKeyStore(token);\n\n // Verify a limited token, ensuring the necessarily claims are present and token type is correct\n const { payload } = await jwtVerify(\n token,\n this.jwksClient.getKey,\n verifyOpts,\n ).catch(e => {\n throw new AuthenticationError('Invalid token', e);\n });\n\n const userEntityRef = payload.sub;\n\n if (!userEntityRef) {\n throw new AuthenticationError('No user sub found in token');\n }\n\n return { userEntityRef };\n }\n\n #getTokenVerificationOptions(token: string): JWTVerifyOptions | undefined {\n try {\n const { typ } = decodeProtectedHeader(token);\n\n if (typ === tokenTypes.user.typParam) {\n return {\n algorithms: this.algorithms,\n requiredClaims: ['iat', 'exp', 'sub'],\n typ: tokenTypes.user.typParam,\n };\n }\n\n if (typ === tokenTypes.limitedUser.typParam) {\n return {\n algorithms: this.algorithms,\n requiredClaims: ['iat', 'exp', 'sub'],\n typ: tokenTypes.limitedUser.typParam,\n };\n }\n\n const { aud } = decodeJwt(token);\n if (aud === tokenTypes.user.audClaim) {\n return {\n algorithms: this.algorithms,\n audience: tokenTypes.user.audClaim,\n };\n }\n } catch {\n /* ignore */\n }\n\n return undefined;\n }\n\n createLimitedUserToken(backstageToken: string) {\n const [headerRaw, payloadRaw] = backstageToken.split('.');\n const header = JSON.parse(\n new TextDecoder().decode(base64url.decode(headerRaw)),\n );\n const payload = JSON.parse(\n new TextDecoder().decode(base64url.decode(payloadRaw)),\n );\n\n const tokenType = header.typ;\n\n // Only new user tokens can be used to create a limited user token. If we\n // can't create a limited token, or the token is already a limited one, we\n // return the original token\n if (!tokenType || tokenType === tokenTypes.limitedUser.typParam) {\n return { token: backstageToken, expiresAt: new Date(payload.exp * 1000) };\n }\n\n if (tokenType !== tokenTypes.user.typParam) {\n throw new AuthenticationError(\n 'Failed to create limited user token, invalid token type',\n );\n }\n\n // NOTE: The order and properties in both the header and payload must match\n // the usage in plugins/auth-backend/src/identity/TokenFactory.ts\n const limitedUserToken = [\n base64url.encode(\n JSON.stringify({\n typ: tokenTypes.limitedUser.typParam,\n alg: header.alg,\n kid: header.kid,\n }),\n ),\n base64url.encode(\n JSON.stringify({\n sub: payload.sub,\n ent: payload.ent,\n iat: payload.iat,\n exp: payload.exp,\n }),\n ),\n payload.uip,\n ].join('.');\n\n return { token: limitedUserToken, expiresAt: new Date(payload.exp * 1000) };\n }\n\n isLimitedUserToken(token: string): boolean {\n try {\n const { typ } = decodeProtectedHeader(token);\n return typ === tokenTypes.limitedUser.typParam;\n } catch {\n return false;\n }\n }\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Config } from '@backstage/config';\nimport { base64url, decodeJwt, decodeProtectedHeader, jwtVerify } from 'jose';\nimport { TokenHandler } from './types';\n\n/**\n * Handles `type: legacy` access.\n *\n * @internal\n */\nexport class LegacyTokenHandler implements TokenHandler {\n #entries: Array<{ key: Uint8Array; subject: string }> = [];\n\n add(options: Config) {\n this.#doAdd(options.getString('secret'), options.getString('subject'));\n }\n\n // used only for the old backend.auth.keys array\n addOld(options: Config) {\n // This choice of subject is for compatibility reasons\n this.#doAdd(options.getString('secret'), 'external:backstage-plugin');\n }\n\n #doAdd(secret: string, subject: string) {\n if (!secret.match(/^\\S+$/)) {\n throw new Error('Illegal secret, must be a valid base64 string');\n }\n\n let key: Uint8Array;\n try {\n key = base64url.decode(secret);\n } catch {\n throw new Error('Illegal secret, must be a valid base64 string');\n }\n\n if (!subject.match(/^\\S+$/)) {\n throw new Error('Illegal subject, must be a set of non-space characters');\n }\n\n this.#entries.push({ key, subject });\n }\n\n async verifyToken(token: string) {\n // First do a duck typing check to see if it remotely looks like a legacy token\n try {\n // We do a fair amount of checking upfront here. Since we aren't certain\n // that it's even the right type of key that we're looking at, we can't\n // defer eg the alg check to jwtVerify, because it won't be possible to\n // discern different reasons for key verification failures from each other\n // easily\n const { alg } = decodeProtectedHeader(token);\n if (alg !== 'HS256') {\n return undefined;\n }\n const { sub, aud } = decodeJwt(token);\n if (sub !== 'backstage-server' || aud) {\n return undefined;\n }\n } catch (e) {\n // Doesn't look like a jwt at all\n return undefined;\n }\n\n for (const entry of this.#entries) {\n try {\n await jwtVerify(token, entry.key);\n return { subject: entry.subject };\n } catch (e) {\n if (e.code !== 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED') {\n throw e;\n }\n // Otherwise continue to try the next key\n }\n }\n\n // None of the signing keys matched\n return undefined;\n }\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Config } from '@backstage/config';\nimport { TokenHandler } from './types';\n\nconst MIN_TOKEN_LENGTH = 8;\n\n/**\n * Handles `type: static` access.\n *\n * @internal\n */\nexport class StaticTokenHandler implements TokenHandler {\n #entries: Array<{ token: string; subject: string }> = [];\n\n add(options: Config) {\n const token = options.getString('token');\n if (!token.match(/^\\S+$/)) {\n throw new Error('Illegal token, must be a set of non-space characters');\n }\n if (token.length < MIN_TOKEN_LENGTH) {\n throw new Error(\n `Illegal token, must be at least ${MIN_TOKEN_LENGTH} characters length`,\n );\n }\n\n const subject = options.getString('subject');\n if (!subject.match(/^\\S+$/)) {\n throw new Error('Illegal subject, must be a set of non-space characters');\n }\n\n this.#entries.push({ token, subject });\n }\n\n async verifyToken(token: string) {\n const entry = this.#entries.find(e => e.token === token);\n if (!entry) {\n return undefined;\n }\n\n return { subject: entry.subject };\n }\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n LoggerService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\nimport { LegacyTokenHandler } from './legacy';\nimport { StaticTokenHandler } from './static';\nimport { TokenHandler } from './types';\n\nconst NEW_CONFIG_KEY = 'backend.auth.externalAccess';\nconst OLD_CONFIG_KEY = 'backend.auth.keys';\n\n/**\n * Handles all types of external caller token types (i.e. not Backstage user\n * tokens, nor Backstage backend plugin tokens).\n *\n * @internal\n */\nexport class ExternalTokenHandler {\n static create(options: {\n config: RootConfigService;\n logger: LoggerService;\n }): ExternalTokenHandler {\n const { config, logger } = options;\n\n const staticHandler = new StaticTokenHandler();\n const legacyHandler = new LegacyTokenHandler();\n const handlers: Record<string, TokenHandler> = {\n static: staticHandler,\n legacy: legacyHandler,\n };\n\n // Load the new-style handlers\n const handlerConfigs = config.getOptionalConfigArray(NEW_CONFIG_KEY) ?? [];\n for (const handlerConfig of handlerConfigs) {\n const type = handlerConfig.getString('type');\n const handler = handlers[type];\n if (!handler) {\n const valid = Object.keys(handlers)\n .map(k => `'${k}'`)\n .join(', ');\n throw new Error(\n `Unknown type '${type}' in ${NEW_CONFIG_KEY}, expected one of ${valid}`,\n );\n }\n handler.add(handlerConfig.getConfig('options'));\n }\n\n // Load the old keys too\n const legacyConfigs = config.getOptionalConfigArray(OLD_CONFIG_KEY) ?? [];\n if (legacyConfigs.length) {\n logger.warn(\n `DEPRECATION WARNING: The ${OLD_CONFIG_KEY} config has been replaced by ${NEW_CONFIG_KEY}, see https://backstage.io/docs/auth/service-to-service-auth`,\n );\n }\n for (const handlerConfig of legacyConfigs) {\n legacyHandler.addOld(handlerConfig);\n }\n\n return new ExternalTokenHandler(Object.values(handlers));\n }\n\n constructor(private readonly handlers: TokenHandler[]) {}\n\n async verifyToken(token: string): Promise<{ subject: string } | undefined> {\n for (const handler of this.handlers) {\n const result = await handler.verifyToken(token);\n if (result) {\n return result;\n }\n }\n return undefined;\n }\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { DatabaseKeyStore } from './DatabaseKeyStore';\nimport { DefaultAuthService } from './DefaultAuthService';\nimport { PluginTokenHandler } from './plugin/PluginTokenHandler';\nimport { UserTokenHandler } from './user/UserTokenHandler';\nimport { ExternalTokenHandler } from './external/ExternalTokenHandler';\n\n/** @public */\nexport const authServiceFactory = createServiceFactory({\n service: coreServices.auth,\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.rootLogger,\n discovery: coreServices.discovery,\n plugin: coreServices.pluginMetadata,\n database: coreServices.database,\n // Re-using the token manager makes sure that we use the same generated keys for\n // development as plugins that have not yet been migrated. It's important that this\n // keeps working as long as there are plugins that have not been migrated to the\n // new auth services in the new backend system.\n tokenManager: coreServices.tokenManager,\n },\n\n async factory({ config, discovery, plugin, tokenManager, logger, database }) {\n const disableDefaultAuthPolicy = Boolean(\n config.getOptionalBoolean(\n 'backend.auth.dangerouslyDisableDefaultAuthPolicy',\n ),\n );\n\n const publicKeyStore = await DatabaseKeyStore.create({\n database,\n logger,\n });\n\n const userTokens = UserTokenHandler.create({\n discovery,\n });\n const pluginTokens = PluginTokenHandler.create({\n ownPluginId: plugin.getId(),\n keyDurationSeconds: 60 * 60,\n logger,\n publicKeyStore,\n discovery,\n });\n const externalTokens = ExternalTokenHandler.create({\n config,\n logger,\n });\n\n return new DefaultAuthService(\n userTokens,\n pluginTokens,\n externalTokens,\n tokenManager,\n plugin.getId(),\n disableDefaultAuthPolicy,\n publicKeyStore,\n );\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CacheManager } from '@backstage/backend-common';\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const cacheServiceFactory = createServiceFactory({\n service: coreServices.cache,\n deps: {\n config: coreServices.rootConfig,\n plugin: coreServices.pluginMetadata,\n },\n async createRootContext({ config }) {\n return CacheManager.fromConfig(config);\n },\n async factory({ plugin }, manager) {\n return manager.forPlugin(plugin.getId()).getClient();\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport {\n ConfigSources,\n RemoteConfigSourceOptions,\n} from '@backstage/config-loader';\n\n/** @public */\nexport interface RootConfigFactoryOptions {\n /**\n * Process arguments to use instead of the default `process.argv()`.\n */\n argv?: string[];\n\n /**\n * Enables and sets options for remote configuration loading.\n */\n remote?: Pick<RemoteConfigSourceOptions, 'reloadInterval'>;\n watch?: boolean;\n}\n\n/** @public */\nexport const rootConfigServiceFactory = createServiceFactory(\n (options?: RootConfigFactoryOptions) => ({\n service: coreServices.rootConfig,\n deps: {},\n async factory() {\n const source = ConfigSources.default({\n argv: options?.argv,\n remote: options?.remote,\n watch: options?.watch,\n });\n console.log(`Loading config from ${source}`);\n return await ConfigSources.toConfig(source);\n },\n }),\n);\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DatabaseManager } from '@backstage/backend-common';\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { ConfigReader } from '@backstage/config';\n\n/** @public */\nexport const databaseServiceFactory = createServiceFactory({\n service: coreServices.database,\n deps: {\n config: coreServices.rootConfig,\n lifecycle: coreServices.lifecycle,\n pluginMetadata: coreServices.pluginMetadata,\n },\n async createRootContext({ config }) {\n return config.getOptional('backend.database')\n ? DatabaseManager.fromConfig(config)\n : DatabaseManager.fromConfig(\n new ConfigReader({\n backend: {\n database: { client: 'better-sqlite3', connection: ':memory:' },\n },\n }),\n );\n },\n async factory({ pluginMetadata, lifecycle }, databaseManager) {\n return databaseManager.forPlugin(pluginMetadata.getId(), {\n pluginMetadata,\n lifecycle,\n });\n },\n});\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Config } from '@backstage/config';\nimport { readHttpServerOptions } from '@backstage/backend-app-api';\nimport { DiscoveryService } from '@backstage/backend-plugin-api';\n\ntype Target = string | { internal: string; external: string };\n\n/**\n * HostDiscovery is a basic PluginEndpointDiscovery implementation\n * that can handle plugins that are hosted in a single or multiple deployments.\n *\n * The deployment may be scaled horizontally, as long as the external URL\n * is the same for all instances. However, internal URLs will always be\n * resolved to the same host, so there won't be any balancing of internal traffic.\n *\n * @public\n */\nexport class HostDiscovery implements DiscoveryService {\n /**\n * Creates a new HostDiscovery discovery instance by reading\n * from the `backend` config section, specifically the `.baseUrl` for\n * discovering the external URL, and the `.listen` and `.https` config\n * for the internal one.\n *\n * Can be overridden in config by providing a target and corresponding plugins in `discovery.endpoints`.\n * eg.\n * ```yaml\n * discovery:\n * endpoints:\n * - target: https://internal.example.com/internal-catalog\n * plugins: [catalog]\n * - target: https://internal.example.com/secure/api/{{pluginId}}\n * plugins: [auth, permission]\n * - target:\n * internal: https://internal.example.com/search\n * external: https://example.com/search\n * plugins: [search]\n * ```\n *\n * The basePath defaults to `/api`, meaning the default full internal\n * path for the `catalog` plugin will be `http://localhost:7007/api/catalog`.\n */\n static fromConfig(config: Config, options?: { basePath?: string }) {\n const basePath = options?.basePath ?? '/api';\n const externalBaseUrl = config\n .getString('backend.baseUrl')\n .replace(/\\/+$/, '');\n\n const {\n listen: { host: listenHost = '::', port: listenPort },\n } = readHttpServerOptions(config.getConfig('backend'));\n const protocol = config.has('backend.https') ? 'https' : 'http';\n\n // Translate bind-all to localhost, and support IPv6\n let host = listenHost;\n if (host === '::' || host === '') {\n // We use localhost instead of ::1, since IPv6-compatible systems should default\n // to using IPv6 when they see localhost, but if the system doesn't support IPv6\n // things will still work.\n host = 'localhost';\n } else if (host === '0.0.0.0') {\n host = '127.0.0.1';\n }\n if (host.includes(':')) {\n host = `[${host}]`;\n }\n\n const internalBaseUrl = `${protocol}://${host}:${listenPort}`;\n\n return new HostDiscovery(\n internalBaseUrl + basePath,\n externalBaseUrl + basePath,\n config.getOptionalConfig('discovery'),\n );\n }\n\n private constructor(\n private readonly internalBaseUrl: string,\n private readonly externalBaseUrl: string,\n private readonly discoveryConfig: Config | undefined,\n ) {}\n\n private getTargetFromConfig(pluginId: string, type: 'internal' | 'external') {\n const endpoints = this.discoveryConfig?.getOptionalConfigArray('endpoints');\n\n const target = endpoints\n ?.find(endpoint => endpoint.getStringArray('plugins').includes(pluginId))\n ?.get<Target>('target');\n\n if (!target) {\n const baseUrl =\n type === 'external' ? this.externalBaseUrl : this.internalBaseUrl;\n\n return `${baseUrl}/${encodeURIComponent(pluginId)}`;\n }\n\n if (typeof target === 'string') {\n return target.replace(\n /\\{\\{\\s*pluginId\\s*\\}\\}/g,\n encodeURIComponent(pluginId),\n );\n }\n\n return target[type].replace(\n /\\{\\{\\s*pluginId\\s*\\}\\}/g,\n encodeURIComponent(pluginId),\n );\n }\n\n async getBaseUrl(pluginId: string): Promise<string> {\n return this.getTargetFromConfig(pluginId, 'internal');\n }\n\n async getExternalBaseUrl(pluginId: string): Promise<string> {\n return this.getTargetFromConfig(pluginId, 'external');\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { HostDiscovery } from './HostDiscovery';\n\n/** @public */\nexport const discoveryServiceFactory = createServiceFactory({\n service: coreServices.discovery,\n deps: {\n config: coreServices.rootConfig,\n },\n async factory({ config }) {\n return HostDiscovery.fromConfig(config);\n },\n});\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n AuthService,\n BackstageCredentials,\n BackstagePrincipalTypes,\n BackstageUserPrincipal,\n DiscoveryService,\n HttpAuthService,\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { AuthenticationError, NotAllowedError } from '@backstage/errors';\nimport { parse as parseCookie } from 'cookie';\nimport { Request, Response } from 'express';\n\nconst FIVE_MINUTES_MS = 5 * 60 * 1000;\n\nconst BACKSTAGE_AUTH_COOKIE = 'backstage-auth';\n\nfunction getTokenFromRequest(req: Request) {\n // TODO: support multiple auth headers (iterate rawHeaders)\n const authHeader = req.headers.authorization;\n if (typeof authHeader === 'string') {\n const matches = authHeader.match(/^Bearer[ ]+(\\S+)$/i);\n const token = matches?.[1];\n if (token) {\n return token;\n }\n }\n\n return undefined;\n}\n\nfunction getCookieFromRequest(req: Request) {\n const cookieHeader = req.headers.cookie;\n if (cookieHeader) {\n const cookies = parseCookie(cookieHeader);\n const token = cookies[BACKSTAGE_AUTH_COOKIE];\n if (token) {\n return token;\n }\n }\n\n return undefined;\n}\n\nfunction willExpireSoon(expiresAt: Date) {\n return Date.now() + FIVE_MINUTES_MS > expiresAt.getTime();\n}\n\nconst credentialsSymbol = Symbol('backstage-credentials');\nconst limitedCredentialsSymbol = Symbol('backstage-limited-credentials');\n\ntype RequestWithCredentials = Request & {\n [credentialsSymbol]?: Promise<BackstageCredentials>;\n [limitedCredentialsSymbol]?: Promise<BackstageCredentials>;\n};\n\nclass DefaultHttpAuthService implements HttpAuthService {\n readonly #auth: AuthService;\n readonly #discovery: DiscoveryService;\n readonly #pluginId: string;\n\n constructor(\n auth: AuthService,\n discovery: DiscoveryService,\n pluginId: string,\n ) {\n this.#auth = auth;\n this.#discovery = discovery;\n this.#pluginId = pluginId;\n }\n\n async #extractCredentialsFromRequest(req: Request) {\n const token = getTokenFromRequest(req);\n if (!token) {\n return await this.#auth.getNoneCredentials();\n }\n\n return await this.#auth.authenticate(token);\n }\n\n async #extractLimitedCredentialsFromRequest(req: Request) {\n const token = getTokenFromRequest(req);\n if (token) {\n return await this.#auth.authenticate(token, {\n allowLimitedAccess: true,\n });\n }\n\n const cookie = getCookieFromRequest(req);\n if (cookie) {\n return await this.#auth.authenticate(cookie, {\n allowLimitedAccess: true,\n });\n }\n\n return await this.#auth.getNoneCredentials();\n }\n\n async #getCredentials(req: RequestWithCredentials) {\n return (req[credentialsSymbol] ??=\n this.#extractCredentialsFromRequest(req));\n }\n\n async #getLimitedCredentials(req: RequestWithCredentials) {\n return (req[limitedCredentialsSymbol] ??=\n this.#extractLimitedCredentialsFromRequest(req));\n }\n\n async credentials<TAllowed extends keyof BackstagePrincipalTypes = 'unknown'>(\n req: Request,\n options?: {\n allow?: Array<TAllowed>;\n allowLimitedAccess?: boolean;\n },\n ): Promise<BackstageCredentials<BackstagePrincipalTypes[TAllowed]>> {\n // Limited and full credentials are treated as two separate cases, this lets\n // us avoid internal dependencies between the AuthService and\n // HttpAuthService implementations\n const credentials = options?.allowLimitedAccess\n ? await this.#getLimitedCredentials(req)\n : await this.#getCredentials(req);\n\n const allowed = options?.allow;\n if (!allowed) {\n return credentials as any;\n }\n\n if (this.#auth.isPrincipal(credentials, 'none')) {\n if (allowed.includes('none' as TAllowed)) {\n return credentials as any;\n }\n\n throw new AuthenticationError('Missing credentials');\n } else if (this.#auth.isPrincipal(credentials, 'user')) {\n if (allowed.includes('user' as TAllowed)) {\n return credentials as any;\n }\n\n throw new NotAllowedError(\n `This endpoint does not allow 'user' credentials`,\n );\n } else if (this.#auth.isPrincipal(credentials, 'service')) {\n if (allowed.includes('service' as TAllowed)) {\n return credentials as any;\n }\n\n throw new NotAllowedError(\n `This endpoint does not allow 'service' credentials`,\n );\n }\n\n throw new NotAllowedError(\n 'Unknown principal type, this should never happen',\n );\n }\n\n async issueUserCookie(\n res: Response,\n options?: { credentials?: BackstageCredentials },\n ): Promise<{ expiresAt: Date }> {\n if (res.headersSent) {\n throw new Error('Failed to issue user cookie, headers were already sent');\n }\n\n let credentials: BackstageCredentials<BackstageUserPrincipal>;\n if (options?.credentials) {\n if (this.#auth.isPrincipal(options.credentials, 'none')) {\n res.clearCookie(\n BACKSTAGE_AUTH_COOKIE,\n await this.#getCookieOptions(res.req),\n );\n return { expiresAt: new Date() };\n }\n if (!this.#auth.isPrincipal(options.credentials, 'user')) {\n throw new AuthenticationError(\n 'Refused to issue cookie for non-user principal',\n );\n }\n credentials = options.credentials;\n } else {\n credentials = await this.credentials(res.req, { allow: ['user'] });\n }\n\n const existingExpiresAt = await this.#existingCookieExpiration(res.req);\n if (existingExpiresAt && !willExpireSoon(existingExpiresAt)) {\n return { expiresAt: existingExpiresAt };\n }\n\n const { token, expiresAt } = await this.#auth.getLimitedUserToken(\n credentials,\n );\n if (!token) {\n throw new Error('User credentials is unexpectedly missing token');\n }\n\n res.cookie(BACKSTAGE_AUTH_COOKIE, token, {\n ...(await this.#getCookieOptions(res.req)),\n expires: expiresAt,\n });\n\n return { expiresAt };\n }\n\n async #getCookieOptions(_req: Request): Promise<{\n domain: string;\n httpOnly: true;\n secure: boolean;\n priority: 'high';\n sameSite: 'none' | 'lax';\n }> {\n // TODO: eventually we should read from `${req.protocol}://${req.hostname}`\n // once https://github.com/backstage/backstage/issues/24169 has landed\n const externalBaseUrlStr = await this.#discovery.getExternalBaseUrl(\n this.#pluginId,\n );\n const externalBaseUrl = new URL(externalBaseUrlStr);\n\n const secure =\n externalBaseUrl.protocol === 'https:' ||\n externalBaseUrl.hostname === 'localhost';\n\n return {\n domain: externalBaseUrl.hostname,\n httpOnly: true,\n secure,\n priority: 'high',\n sameSite: secure ? 'none' : 'lax',\n };\n }\n\n async #existingCookieExpiration(req: Request): Promise<Date | undefined> {\n const existingCookie = getCookieFromRequest(req);\n if (!existingCookie) {\n return undefined;\n }\n\n try {\n const existingCredentials = await this.#auth.authenticate(\n existingCookie,\n {\n allowLimitedAccess: true,\n },\n );\n if (!this.#auth.isPrincipal(existingCredentials, 'user')) {\n return undefined;\n }\n\n return existingCredentials.expiresAt;\n } catch (error) {\n if (error.name === 'AuthenticationError') {\n return undefined;\n }\n throw error;\n }\n }\n}\n\n/** @public */\nexport const httpAuthServiceFactory = createServiceFactory({\n service: coreServices.httpAuth,\n deps: {\n auth: coreServices.auth,\n discovery: coreServices.discovery,\n plugin: coreServices.pluginMetadata,\n },\n async factory({ auth, discovery, plugin }) {\n return new DefaultHttpAuthService(auth, discovery, plugin.getId());\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LifecycleService } from '@backstage/backend-plugin-api';\nimport { ServiceUnavailableError } from '@backstage/errors';\nimport { HumanDuration, durationToMilliseconds } from '@backstage/types';\nimport { RequestHandler } from 'express';\n\nexport const DEFAULT_TIMEOUT = { seconds: 5 };\n\n/**\n * Options for {@link createLifecycleMiddleware}.\n * @public\n */\nexport interface LifecycleMiddlewareOptions {\n lifecycle: LifecycleService;\n /**\n * The maximum time that paused requests will wait for the service to start, before returning an error.\n *\n * Defaults to 5 seconds.\n */\n startupRequestPauseTimeout?: HumanDuration;\n}\n\n/**\n * Creates a middleware that pauses requests until the service has started.\n *\n * @remarks\n *\n * Requests that arrive before the service has started will be paused until startup is complete.\n * If the service does not start within the provided timeout, the request will be rejected with a\n * {@link @backstage/errors#ServiceUnavailableError}.\n *\n * If the service is shutting down, all requests will be rejected with a\n * {@link @backstage/errors#ServiceUnavailableError}.\n *\n * @public\n */\nexport function createLifecycleMiddleware(\n options: LifecycleMiddlewareOptions,\n): RequestHandler {\n const { lifecycle, startupRequestPauseTimeout = DEFAULT_TIMEOUT } = options;\n\n let state: 'init' | 'up' | 'down' = 'init';\n const waiting = new Set<{\n next: (err?: Error) => void;\n timeout: NodeJS.Timeout;\n }>();\n\n lifecycle.addStartupHook(async () => {\n if (state === 'init') {\n state = 'up';\n for (const item of waiting) {\n clearTimeout(item.timeout);\n item.next();\n }\n waiting.clear();\n }\n });\n\n lifecycle.addShutdownHook(async () => {\n state = 'down';\n\n for (const item of waiting) {\n clearTimeout(item.timeout);\n item.next(new ServiceUnavailableError('Service is shutting down'));\n }\n waiting.clear();\n });\n\n const timeoutMs = durationToMilliseconds(startupRequestPauseTimeout);\n\n return (_req, _res, next) => {\n if (state === 'up') {\n next();\n return;\n } else if (state === 'down') {\n next(new ServiceUnavailableError('Service is shutting down'));\n return;\n }\n\n const item = {\n next,\n timeout: setTimeout(() => {\n if (waiting.delete(item)) {\n next(new ServiceUnavailableError('Service has not started up yet'));\n }\n }, timeoutMs),\n };\n\n waiting.add(item);\n };\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n HttpAuthService,\n HttpRouterServiceAuthPolicy,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\nimport { RequestHandler } from 'express';\nimport { pathToRegexp } from 'path-to-regexp';\n\nexport function createPathPolicyPredicate(policyPath: string) {\n if (policyPath === '/' || policyPath === '*') {\n return () => true;\n }\n\n const pathRegex = pathToRegexp(policyPath, undefined, {\n end: false,\n });\n\n return (path: string): boolean => {\n return pathRegex.test(path);\n };\n}\n\nexport function createCredentialsBarrier(options: {\n httpAuth: HttpAuthService;\n config: RootConfigService;\n}): {\n middleware: RequestHandler;\n addAuthPolicy: (policy: HttpRouterServiceAuthPolicy) => void;\n} {\n const { httpAuth, config } = options;\n\n const disableDefaultAuthPolicy = config.getOptionalBoolean(\n 'backend.auth.dangerouslyDisableDefaultAuthPolicy',\n );\n\n if (disableDefaultAuthPolicy) {\n return {\n middleware: (_req, _res, next) => next(),\n addAuthPolicy: () => {},\n };\n }\n\n const unauthenticatedPredicates = new Array<(path: string) => boolean>();\n const cookiePredicates = new Array<(path: string) => boolean>();\n\n const middleware: RequestHandler = (req, _, next) => {\n const allowsUnauthenticated = unauthenticatedPredicates.some(predicate =>\n predicate(req.path),\n );\n\n if (allowsUnauthenticated) {\n next();\n return;\n }\n\n const allowsCookie = cookiePredicates.some(predicate =>\n predicate(req.path),\n );\n\n httpAuth\n .credentials(req, {\n allow: ['user', 'service'],\n allowLimitedAccess: allowsCookie,\n })\n .then(\n () => next(),\n err => next(err),\n );\n };\n\n const addAuthPolicy = (policy: HttpRouterServiceAuthPolicy) => {\n if (policy.allow === 'unauthenticated') {\n unauthenticatedPredicates.push(createPathPolicyPredicate(policy.path));\n } else if (policy.allow === 'user-cookie') {\n cookiePredicates.push(createPathPolicyPredicate(policy.path));\n } else {\n throw new Error('Invalid auth policy');\n }\n };\n\n return { middleware, addAuthPolicy };\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { AuthService } from '@backstage/backend-plugin-api';\nimport express from 'express';\nimport Router from 'express-promise-router';\n\nexport function createAuthIntegrationRouter(options: {\n auth: AuthService;\n}): express.Router {\n const router = Router();\n\n router.get('/.backstage/auth/v1/jwks.json', async (_req, res) => {\n const { keys } = await options.auth.listPublicServiceKeys();\n\n res.json({ keys });\n });\n\n return router;\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AuthService, HttpAuthService } from '@backstage/backend-plugin-api';\nimport Router from 'express-promise-router';\n\nconst WELL_KNOWN_COOKIE_PATH_V1 = '/.backstage/auth/v1/cookie';\n\n/**\n * @public\n * Creates a middleware that can be used to refresh the cookie for the user.\n */\nexport function createCookieAuthRefreshMiddleware(options: {\n auth: AuthService;\n httpAuth: HttpAuthService;\n}) {\n const { auth, httpAuth } = options;\n const router = Router();\n\n // Endpoint that sets the cookie for the user\n router.get(WELL_KNOWN_COOKIE_PATH_V1, async (_, res) => {\n const { expiresAt } = await httpAuth.issueUserCookie(res);\n res.json({ expiresAt: expiresAt.toISOString() });\n });\n\n // Endpoint that removes the cookie for the user\n router.delete(WELL_KNOWN_COOKIE_PATH_V1, async (_, res) => {\n const credentials = await auth.getNoneCredentials();\n await httpAuth.issueUserCookie(res, { credentials });\n res.status(204).end();\n });\n\n return router;\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Handler } from 'express';\nimport PromiseRouter from 'express-promise-router';\nimport {\n coreServices,\n createServiceFactory,\n HttpRouterServiceAuthPolicy,\n} from '@backstage/backend-plugin-api';\nimport { createLifecycleMiddleware } from './createLifecycleMiddleware';\nimport { createCredentialsBarrier } from './createCredentialsBarrier';\nimport { createAuthIntegrationRouter } from './createAuthIntegrationRouter';\nimport { createCookieAuthRefreshMiddleware } from './createCookieAuthRefreshMiddleware';\n\n/**\n * @public\n */\nexport interface HttpRouterFactoryOptions {\n /**\n * A callback used to generate the path for each plugin, defaults to `/api/{pluginId}`.\n */\n getPath?(pluginId: string): string;\n}\n\n/** @public */\nexport const httpRouterServiceFactory = createServiceFactory(\n (options?: HttpRouterFactoryOptions) => ({\n service: coreServices.httpRouter,\n initialization: 'always',\n deps: {\n plugin: coreServices.pluginMetadata,\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n lifecycle: coreServices.lifecycle,\n rootHttpRouter: coreServices.rootHttpRouter,\n auth: coreServices.auth,\n httpAuth: coreServices.httpAuth,\n },\n async factory({\n auth,\n httpAuth,\n config,\n logger,\n plugin,\n rootHttpRouter,\n lifecycle,\n }) {\n if (options?.getPath) {\n logger.warn(\n `DEPRECATION WARNING: The 'getPath' option for HttpRouterService is deprecated. The ability to reconfigure the '/api/' path prefix for plugins will be removed in the future.`,\n );\n }\n const getPath = options?.getPath ?? (id => `/api/${id}`);\n const path = getPath(plugin.getId());\n\n const router = PromiseRouter();\n rootHttpRouter.use(path, router);\n\n const credentialsBarrier = createCredentialsBarrier({\n httpAuth,\n config,\n });\n\n router.use(createLifecycleMiddleware({ lifecycle }));\n router.use(createAuthIntegrationRouter({ auth }));\n router.use(credentialsBarrier.middleware);\n router.use(createCookieAuthRefreshMiddleware({ auth, httpAuth }));\n\n return {\n use(handler: Handler): void {\n router.use(handler);\n },\n addAuthPolicy(policy: HttpRouterServiceAuthPolicy): void {\n credentialsBarrier.addAuthPolicy(policy);\n },\n };\n },\n }),\n);\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { DefaultIdentityClient } from '@backstage/plugin-auth-node';\n\n/**\n * An identity client options object which allows extra configurations\n *\n * @public\n */\nexport type IdentityFactoryOptions = {\n issuer?: string;\n\n /** JWS \"alg\" (Algorithm) Header Parameter values. Defaults to an array containing just ES256.\n * More info on supported algorithms: https://github.com/panva/jose */\n algorithms?: string[];\n};\n\n/** @public */\nexport const identityServiceFactory = createServiceFactory(\n (options?: IdentityFactoryOptions) => ({\n service: coreServices.identity,\n deps: {\n discovery: coreServices.discovery,\n },\n async factory({ discovery }) {\n return DefaultIdentityClient.create({ discovery, ...options });\n },\n }),\n);\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createServiceFactory,\n coreServices,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const loggerServiceFactory = createServiceFactory({\n service: coreServices.logger,\n deps: {\n rootLogger: coreServices.rootLogger,\n plugin: coreServices.pluginMetadata,\n },\n factory({ rootLogger, plugin }) {\n return rootLogger.child({ plugin: plugin.getId() });\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { ServerPermissionClient } from '@backstage/plugin-permission-node';\n\n/** @public */\nexport const permissionsServiceFactory = createServiceFactory({\n service: coreServices.permissions,\n deps: {\n auth: coreServices.auth,\n config: coreServices.rootConfig,\n discovery: coreServices.discovery,\n tokenManager: coreServices.tokenManager,\n },\n async factory({ auth, config, discovery, tokenManager }) {\n return ServerPermissionClient.fromConfig(config, {\n auth,\n discovery,\n tokenManager,\n });\n },\n});\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RootHttpRouterService } from '@backstage/backend-plugin-api';\nimport { Handler, Router } from 'express';\nimport trimEnd from 'lodash/trimEnd';\n\nfunction normalizePath(path: string): string {\n return `${trimEnd(path, '/')}/`;\n}\n\n/**\n * Options for the {@link DefaultRootHttpRouter} class.\n *\n * @public\n */\nexport interface DefaultRootHttpRouterOptions {\n /**\n * The path to forward all unmatched requests to. Defaults to '/api/app' if\n * not given. Disables index path behavior if false is given.\n */\n indexPath?: string | false;\n}\n\n/**\n * The default implementation of the {@link @backstage/backend-plugin-api#RootHttpRouterService} interface for\n * {@link @backstage/backend-plugin-api#coreServices.rootHttpRouter}.\n *\n * @public\n */\nexport class DefaultRootHttpRouter implements RootHttpRouterService {\n #indexPath?: string;\n\n #router = Router();\n #namedRoutes = Router();\n #indexRouter = Router();\n #existingPaths = new Array<string>();\n\n static create(options?: DefaultRootHttpRouterOptions) {\n let indexPath;\n if (options?.indexPath === false) {\n indexPath = undefined;\n } else if (options?.indexPath === undefined) {\n indexPath = '/api/app';\n } else if (options?.indexPath === '') {\n throw new Error('indexPath option may not be an empty string');\n } else {\n indexPath = options.indexPath;\n }\n return new DefaultRootHttpRouter(indexPath);\n }\n\n private constructor(indexPath?: string) {\n this.#indexPath = indexPath;\n this.#router.use(this.#namedRoutes);\n\n // Any request with a /api/ prefix will skip the index router, even if no named router matches\n this.#router.use('/api/', (_req, _res, next) => {\n next('router');\n });\n\n if (this.#indexPath) {\n this.#router.use(this.#indexRouter);\n }\n }\n\n use(path: string, handler: Handler) {\n if (path.match(/^[/\\s]*$/)) {\n throw new Error(`Root router path may not be empty`);\n }\n const conflictingPath = this.#findConflictingPath(path);\n if (conflictingPath) {\n throw new Error(\n `Path ${path} conflicts with the existing path ${conflictingPath}`,\n );\n }\n this.#existingPaths.push(path);\n this.#namedRoutes.use(path, handler);\n\n if (this.#indexPath === path) {\n this.#indexRouter.use(handler);\n }\n }\n\n handler(): Handler {\n return this.#router;\n }\n\n #findConflictingPath(newPath: string): string | undefined {\n const normalizedNewPath = normalizePath(newPath);\n for (const path of this.#existingPaths) {\n const normalizedPath = normalizePath(path);\n if (normalizedPath.startsWith(normalizedNewPath)) {\n return path;\n }\n if (normalizedNewPath.startsWith(normalizedPath)) {\n return path;\n }\n }\n return undefined;\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n RootConfigService,\n coreServices,\n createServiceFactory,\n LifecycleService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport express, { RequestHandler, Express } from 'express';\nimport {\n createHttpServer,\n MiddlewareFactory,\n readHttpServerOptions,\n} from '../../../http';\nimport { DefaultRootHttpRouter } from './DefaultRootHttpRouter';\n\n/**\n * @public\n */\nexport interface RootHttpRouterConfigureContext {\n app: Express;\n middleware: MiddlewareFactory;\n routes: RequestHandler;\n config: RootConfigService;\n logger: LoggerService;\n lifecycle: LifecycleService;\n}\n\n/**\n * @public\n */\nexport type RootHttpRouterFactoryOptions = {\n /**\n * The path to forward all unmatched requests to. Defaults to '/api/app' if\n * not given. Disables index path behavior if false is given.\n */\n indexPath?: string | false;\n\n configure?(context: RootHttpRouterConfigureContext): void;\n};\n\nfunction defaultConfigure(context: RootHttpRouterConfigureContext) {\n const { app, routes, middleware } = context;\n app.use(middleware.helmet());\n app.use(middleware.cors());\n app.use(middleware.compression());\n app.use(middleware.logging());\n app.use(routes);\n app.use(middleware.notFound());\n app.use(middleware.error());\n}\n\n/** @public */\nexport const rootHttpRouterServiceFactory = createServiceFactory(\n (options?: RootHttpRouterFactoryOptions) => ({\n service: coreServices.rootHttpRouter,\n deps: {\n config: coreServices.rootConfig,\n rootLogger: coreServices.rootLogger,\n lifecycle: coreServices.rootLifecycle,\n },\n async factory({ config, rootLogger, lifecycle }) {\n const { indexPath, configure = defaultConfigure } = options ?? {};\n const logger = rootLogger.child({ service: 'rootHttpRouter' });\n const app = express();\n\n const router = DefaultRootHttpRouter.create({ indexPath });\n const middleware = MiddlewareFactory.create({ config, logger });\n\n configure({\n app,\n routes: router.handler(),\n middleware,\n config,\n logger,\n lifecycle,\n });\n\n const server = await createHttpServer(\n app,\n readHttpServerOptions(config.getOptionalConfig('backend')),\n { logger },\n );\n\n lifecycle.addShutdownHook(() => server.stop());\n\n await server.start();\n\n return router;\n },\n }),\n);\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createServiceFactory,\n coreServices,\n} from '@backstage/backend-plugin-api';\nimport { WinstonLogger } from '../../../logging';\nimport { transports, format } from 'winston';\nimport { createConfigSecretEnumerator } from '../../../config';\n\n/** @public */\nexport const rootLoggerServiceFactory = createServiceFactory({\n service: coreServices.rootLogger,\n deps: {\n config: coreServices.rootConfig,\n },\n async factory({ config }) {\n const logger = WinstonLogger.create({\n meta: {\n service: 'backstage',\n },\n level: process.env.LOG_LEVEL || 'info',\n format:\n process.env.NODE_ENV === 'production'\n ? format.json()\n : WinstonLogger.colorFormat(),\n transports: [new transports.Console()],\n });\n\n const secretEnumerator = await createConfigSecretEnumerator({ logger });\n logger.addRedactions(secretEnumerator(config));\n config.subscribe?.(() => logger.addRedactions(secretEnumerator(config)));\n\n return logger;\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { TaskScheduler } from '@backstage/backend-tasks';\n\n/** @public */\nexport const schedulerServiceFactory = createServiceFactory({\n service: coreServices.scheduler,\n deps: {\n plugin: coreServices.pluginMetadata,\n databaseManager: coreServices.database,\n logger: coreServices.logger,\n },\n async factory({ plugin, databaseManager, logger }) {\n return TaskScheduler.forPlugin({\n pluginId: plugin.getId(),\n databaseManager,\n logger,\n });\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { ServerTokenManager } from '@backstage/backend-common';\n\n/** @public */\nexport const tokenManagerServiceFactory = createServiceFactory({\n service: coreServices.tokenManager,\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.rootLogger,\n },\n createRootContext({ config, logger }) {\n return ServerTokenManager.fromConfig(config, {\n logger,\n });\n },\n async factory(_deps, tokenManager) {\n return tokenManager;\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { UrlReaders } from '@backstage/backend-common';\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const urlReaderServiceFactory = createServiceFactory({\n service: coreServices.urlReader,\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n },\n async factory({ config, logger }) {\n return UrlReaders.default({\n config,\n logger,\n });\n },\n});\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n UserInfoService,\n BackstageUserInfo,\n coreServices,\n createServiceFactory,\n BackstageCredentials,\n} from '@backstage/backend-plugin-api';\nimport { decodeJwt } from 'jose';\nimport { toInternalBackstageCredentials } from '../auth/helpers';\n\n// TODO: The intention is for this to eventually be replaced by a call to the auth-backend\nexport class DefaultUserInfoService implements UserInfoService {\n async getUserInfo(\n credentials: BackstageCredentials,\n ): Promise<BackstageUserInfo> {\n const internalCredentials = toInternalBackstageCredentials(credentials);\n if (internalCredentials.principal.type !== 'user') {\n throw new Error('Only user credentials are supported');\n }\n if (!internalCredentials.token) {\n throw new Error('User credentials is unexpectedly missing token');\n }\n const { sub: userEntityRef, ent: ownershipEntityRefs = [] } = decodeJwt(\n internalCredentials.token,\n );\n\n if (typeof userEntityRef !== 'string') {\n throw new Error('User entity ref must be a string');\n }\n if (\n !Array.isArray(ownershipEntityRefs) ||\n ownershipEntityRefs.some(ref => typeof ref !== 'string')\n ) {\n throw new Error('Ownership entity refs must be an array of strings');\n }\n\n return { userEntityRef, ownershipEntityRefs };\n }\n}\n\n/** @public */\nexport const userInfoServiceFactory = createServiceFactory({\n service: coreServices.userInfo,\n deps: {},\n async factory() {\n return new DefaultUserInfoService();\n },\n});\n"],"names":["__publicField","ConfigReader","getPackages","loadConfigSchema","_a","parseArgs","resolvePath","findPaths","config","loadConfig","fs","dirname","forge","stoppableServer","https","http","helmet","Minimatch","randomBytes","assertError","__privateAdd","__privateSet","compression","__privateGet","morgan","cors","serializeError","NotModifiedError","InputError","AuthenticationError","NotAllowedError","NotFoundError","ConflictError","NotImplementedError","ServiceUnavailableError","format","createLogger","transports","_hasStarted","_startupTasks","createServiceFactory","coreServices","__privateMethod","stringifyError","featureDiscoveryServiceRef","ForwardedError","lifecycleService","resolvePackagePath","DateTime","userResult","decodeJwt","decodeProtectedHeader","createRemoteJWKSet","tokenTypes","jwtVerify","SignJWT","importJWK","uuid","generateKeyPair","exportJWK","base64url","_entries","CacheManager","ConfigSources","DatabaseManager","readHttpServerOptions","parseCookie","durationToMilliseconds","pathToRegexp","Router","PromiseRouter","DefaultIdentityClient","ServerPermissionClient","trimEnd","express","TaskScheduler","ServerTokenManager","UrlReaders"],"mappings":"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"}