@backstage/backend-defaults 0.5.1-next.1 → 0.5.1
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.
- package/CHANGELOG.md +65 -0
- package/auth/package.json +1 -1
- package/cache/package.json +1 -1
- package/database/package.json +1 -1
- package/discovery/package.json +1 -1
- package/dist/CreateBackend.cjs.js +49 -0
- package/dist/CreateBackend.cjs.js.map +1 -0
- package/dist/PackageDiscoveryService.cjs.js +109 -0
- package/dist/PackageDiscoveryService.cjs.js.map +1 -0
- package/dist/auth.cjs.js +2 -996
- package/dist/auth.cjs.js.map +1 -1
- package/dist/cache.cjs.js +4 -204
- package/dist/cache.cjs.js.map +1 -1
- package/dist/database.cjs.js +4 -957
- package/dist/database.cjs.js.map +1 -1
- package/dist/database.d.ts +4 -1
- package/dist/discovery.cjs.js +4 -92
- package/dist/discovery.cjs.js.map +1 -1
- package/dist/discoveryFeatureLoader.cjs.js +19 -0
- package/dist/discoveryFeatureLoader.cjs.js.map +1 -0
- package/dist/entrypoints/auth/DefaultAuthService.cjs.js +130 -0
- package/dist/entrypoints/auth/DefaultAuthService.cjs.js.map +1 -0
- package/dist/entrypoints/auth/JwksClient.cjs.js +49 -0
- package/dist/entrypoints/auth/JwksClient.cjs.js.map +1 -0
- package/dist/entrypoints/auth/authServiceFactory.cjs.js +57 -0
- package/dist/entrypoints/auth/authServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/auth/external/ExternalTokenHandler.cjs.js +78 -0
- package/dist/entrypoints/auth/external/ExternalTokenHandler.cjs.js.map +1 -0
- package/dist/entrypoints/auth/external/helpers.cjs.js +92 -0
- package/dist/entrypoints/auth/external/helpers.cjs.js.map +1 -0
- package/dist/entrypoints/auth/external/jwks.cjs.js +63 -0
- package/dist/entrypoints/auth/external/jwks.cjs.js.map +1 -0
- package/dist/entrypoints/auth/external/legacy.cjs.js +73 -0
- package/dist/entrypoints/auth/external/legacy.cjs.js.map +1 -0
- package/dist/entrypoints/auth/external/static.cjs.js +33 -0
- package/dist/entrypoints/auth/external/static.cjs.js.map +1 -0
- package/dist/{cjs/helpers-D2f1CG0o.cjs.js → entrypoints/auth/helpers.cjs.js} +33 -19
- package/dist/entrypoints/auth/helpers.cjs.js.map +1 -0
- package/dist/entrypoints/auth/plugin/PluginTokenHandler.cjs.js +147 -0
- package/dist/entrypoints/auth/plugin/PluginTokenHandler.cjs.js.map +1 -0
- package/dist/entrypoints/auth/plugin/keys/DatabaseKeyStore.cjs.js +73 -0
- package/dist/entrypoints/auth/plugin/keys/DatabaseKeyStore.cjs.js.map +1 -0
- package/dist/entrypoints/auth/plugin/keys/DatabasePluginKeySource.cjs.js +75 -0
- package/dist/entrypoints/auth/plugin/keys/DatabasePluginKeySource.cjs.js.map +1 -0
- package/dist/entrypoints/auth/plugin/keys/StaticConfigPluginKeySource.cjs.js +91 -0
- package/dist/entrypoints/auth/plugin/keys/StaticConfigPluginKeySource.cjs.js.map +1 -0
- package/dist/entrypoints/auth/plugin/keys/createPluginKeySource.cjs.js +29 -0
- package/dist/entrypoints/auth/plugin/keys/createPluginKeySource.cjs.js.map +1 -0
- package/dist/entrypoints/auth/user/UserTokenHandler.cjs.js +110 -0
- package/dist/entrypoints/auth/user/UserTokenHandler.cjs.js.map +1 -0
- package/dist/entrypoints/cache/CacheClient.cjs.js +50 -0
- package/dist/entrypoints/cache/CacheClient.cjs.js.map +1 -0
- package/dist/entrypoints/cache/CacheManager.cjs.js +147 -0
- package/dist/entrypoints/cache/CacheManager.cjs.js.map +1 -0
- package/dist/entrypoints/cache/cacheServiceFactory.cjs.js +22 -0
- package/dist/entrypoints/cache/cacheServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/cache/types.cjs.js +10 -0
- package/dist/entrypoints/cache/types.cjs.js.map +1 -0
- package/dist/entrypoints/database/DatabaseManager.cjs.js +176 -0
- package/dist/entrypoints/database/DatabaseManager.cjs.js.map +1 -0
- package/dist/entrypoints/database/connectors/defaultNameOverride.cjs.js +14 -0
- package/dist/entrypoints/database/connectors/defaultNameOverride.cjs.js.map +1 -0
- package/dist/entrypoints/database/connectors/defaultSchemaOverride.cjs.js +12 -0
- package/dist/entrypoints/database/connectors/defaultSchemaOverride.cjs.js.map +1 -0
- package/dist/entrypoints/database/connectors/mergeDatabaseConfig.cjs.js +10 -0
- package/dist/entrypoints/database/connectors/mergeDatabaseConfig.cjs.js.map +1 -0
- package/dist/entrypoints/database/connectors/mysql.cjs.js +278 -0
- package/dist/entrypoints/database/connectors/mysql.cjs.js.map +1 -0
- package/dist/entrypoints/database/connectors/postgres.cjs.js +304 -0
- package/dist/entrypoints/database/connectors/postgres.cjs.js.map +1 -0
- package/dist/entrypoints/database/connectors/sqlite3.cjs.js +251 -0
- package/dist/entrypoints/database/connectors/sqlite3.cjs.js.map +1 -0
- package/dist/entrypoints/database/databaseServiceFactory.cjs.js +36 -0
- package/dist/entrypoints/database/databaseServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/discovery/HostDiscovery.cjs.js +86 -0
- package/dist/entrypoints/discovery/HostDiscovery.cjs.js.map +1 -0
- package/dist/entrypoints/discovery/discoveryServiceFactory.cjs.js +17 -0
- package/dist/entrypoints/discovery/discoveryServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/httpAuth/httpAuthServiceFactory.cjs.js +192 -0
- package/dist/entrypoints/httpAuth/httpAuthServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/httpRouter/createAuthIntegrationRouter.cjs.js +19 -0
- package/dist/entrypoints/httpRouter/createAuthIntegrationRouter.cjs.js.map +1 -0
- package/dist/entrypoints/httpRouter/createCookieAuthRefreshMiddleware.cjs.js +26 -0
- package/dist/entrypoints/httpRouter/createCookieAuthRefreshMiddleware.cjs.js.map +1 -0
- package/dist/entrypoints/httpRouter/createCredentialsBarrier.cjs.js +63 -0
- package/dist/entrypoints/httpRouter/createCredentialsBarrier.cjs.js.map +1 -0
- package/dist/entrypoints/httpRouter/createLifecycleMiddleware.cjs.js +52 -0
- package/dist/entrypoints/httpRouter/createLifecycleMiddleware.cjs.js.map +1 -0
- package/dist/entrypoints/httpRouter/httpRouterServiceFactory.cjs.js +48 -0
- package/dist/entrypoints/httpRouter/httpRouterServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/lifecycle/lifecycleServiceFactory.cjs.js +88 -0
- package/dist/entrypoints/lifecycle/lifecycleServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/logger/loggerServiceFactory.cjs.js +17 -0
- package/dist/entrypoints/logger/loggerServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/permissions/permissionsServiceFactory.cjs.js +22 -0
- package/dist/entrypoints/permissions/permissionsServiceFactory.cjs.js.map +1 -0
- package/dist/{cjs/createConfigSecretEnumerator-DShyoWWL.cjs.js → entrypoints/rootConfig/createConfigSecretEnumerator.cjs.js} +1 -1
- package/dist/entrypoints/rootConfig/createConfigSecretEnumerator.cjs.js.map +1 -0
- package/dist/entrypoints/rootConfig/rootConfigServiceFactory.cjs.js +26 -0
- package/dist/entrypoints/rootConfig/rootConfigServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/rootHealth/rootHealthServiceFactory.cjs.js +41 -0
- package/dist/entrypoints/rootHealth/rootHealthServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/rootHttpRouter/DefaultRootHttpRouter.cjs.js +77 -0
- package/dist/entrypoints/rootHttpRouter/DefaultRootHttpRouter.cjs.js.map +1 -0
- package/dist/entrypoints/rootHttpRouter/createHealthRouter.cjs.js +29 -0
- package/dist/entrypoints/rootHttpRouter/createHealthRouter.cjs.js.map +1 -0
- package/dist/entrypoints/rootHttpRouter/http/MiddlewareFactory.cjs.js +187 -0
- package/dist/entrypoints/rootHttpRouter/http/MiddlewareFactory.cjs.js.map +1 -0
- package/dist/entrypoints/rootHttpRouter/http/applyInternalErrorFilter.cjs.js +28 -0
- package/dist/entrypoints/rootHttpRouter/http/applyInternalErrorFilter.cjs.js.map +1 -0
- package/dist/{cjs/config-BDOwXIyo.cjs.js → entrypoints/rootHttpRouter/http/config.cjs.js} +1 -1
- package/dist/entrypoints/rootHttpRouter/http/config.cjs.js.map +1 -0
- package/dist/entrypoints/rootHttpRouter/http/createHttpServer.cjs.js +88 -0
- package/dist/entrypoints/rootHttpRouter/http/createHttpServer.cjs.js.map +1 -0
- package/dist/entrypoints/rootHttpRouter/http/getGeneratedCertificate.cjs.js +130 -0
- package/dist/entrypoints/rootHttpRouter/http/getGeneratedCertificate.cjs.js.map +1 -0
- package/dist/entrypoints/rootHttpRouter/http/readCorsOptions.cjs.js +51 -0
- package/dist/entrypoints/rootHttpRouter/http/readCorsOptions.cjs.js.map +1 -0
- package/dist/entrypoints/rootHttpRouter/http/readHelmetOptions.cjs.js +62 -0
- package/dist/entrypoints/rootHttpRouter/http/readHelmetOptions.cjs.js.map +1 -0
- package/dist/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.cjs.js +76 -0
- package/dist/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/rootLifecycle/rootLifecycleServiceFactory.cjs.js +76 -0
- package/dist/entrypoints/rootLifecycle/rootLifecycleServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/rootLogger/WinstonLogger.cjs.js +114 -0
- package/dist/entrypoints/rootLogger/WinstonLogger.cjs.js.map +1 -0
- package/dist/entrypoints/rootLogger/rootLoggerServiceFactory.cjs.js +30 -0
- package/dist/entrypoints/rootLogger/rootLoggerServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/database/migrateBackendTasks.cjs.js +18 -0
- package/dist/entrypoints/scheduler/database/migrateBackendTasks.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/database/tables.cjs.js +8 -0
- package/dist/entrypoints/scheduler/database/tables.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/lib/DefaultSchedulerService.cjs.js +37 -0
- package/dist/entrypoints/scheduler/lib/DefaultSchedulerService.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/lib/LocalTaskWorker.cjs.js +105 -0
- package/dist/entrypoints/scheduler/lib/LocalTaskWorker.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.cjs.js +138 -0
- package/dist/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/lib/PluginTaskSchedulerJanitor.cjs.js +59 -0
- package/dist/entrypoints/scheduler/lib/PluginTaskSchedulerJanitor.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/lib/TaskWorker.cjs.js +275 -0
- package/dist/entrypoints/scheduler/lib/TaskWorker.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/lib/types.cjs.js +60 -0
- package/dist/entrypoints/scheduler/lib/types.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/lib/util.cjs.js +66 -0
- package/dist/entrypoints/scheduler/lib/util.cjs.js.map +1 -0
- package/dist/entrypoints/scheduler/schedulerServiceFactory.cjs.js +19 -0
- package/dist/entrypoints/scheduler/schedulerServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/AwsCodeCommitUrlReader.cjs.js +274 -0
- package/dist/entrypoints/urlReader/lib/AwsCodeCommitUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/AwsS3UrlReader.cjs.js +261 -0
- package/dist/entrypoints/urlReader/lib/AwsS3UrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/AzureUrlReader.cjs.js +148 -0
- package/dist/entrypoints/urlReader/lib/AzureUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/BitbucketCloudUrlReader.cjs.js +174 -0
- package/dist/entrypoints/urlReader/lib/BitbucketCloudUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/BitbucketServerUrlReader.cjs.js +170 -0
- package/dist/entrypoints/urlReader/lib/BitbucketServerUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/BitbucketUrlReader.cjs.js +182 -0
- package/dist/entrypoints/urlReader/lib/BitbucketUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/FetchUrlReader.cjs.js +132 -0
- package/dist/entrypoints/urlReader/lib/FetchUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/GerritUrlReader.cjs.js +147 -0
- package/dist/entrypoints/urlReader/lib/GerritUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/GiteaUrlReader.cjs.js +122 -0
- package/dist/entrypoints/urlReader/lib/GiteaUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/GithubUrlReader.cjs.js +226 -0
- package/dist/entrypoints/urlReader/lib/GithubUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/GitlabUrlReader.cjs.js +276 -0
- package/dist/entrypoints/urlReader/lib/GitlabUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/GoogleGcsUrlReader.cjs.js +129 -0
- package/dist/entrypoints/urlReader/lib/GoogleGcsUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/HarnessUrlReader.cjs.js +120 -0
- package/dist/entrypoints/urlReader/lib/HarnessUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/ReadUrlResponseFactory.cjs.js +49 -0
- package/dist/entrypoints/urlReader/lib/ReadUrlResponseFactory.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/UrlReaderPredicateMux.cjs.js +46 -0
- package/dist/entrypoints/urlReader/lib/UrlReaderPredicateMux.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/UrlReaders.cjs.js +68 -0
- package/dist/entrypoints/urlReader/lib/UrlReaders.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/tree/ReadTreeResponseFactory.cjs.js +46 -0
- package/dist/entrypoints/urlReader/lib/tree/ReadTreeResponseFactory.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/tree/ReadableArrayResponse.cjs.js +78 -0
- package/dist/entrypoints/urlReader/lib/tree/ReadableArrayResponse.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/tree/TarArchiveResponse.cjs.js +147 -0
- package/dist/entrypoints/urlReader/lib/tree/TarArchiveResponse.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/tree/ZipArchiveResponse.cjs.js +161 -0
- package/dist/entrypoints/urlReader/lib/tree/ZipArchiveResponse.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/tree/util.cjs.js +28 -0
- package/dist/entrypoints/urlReader/lib/tree/util.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/util.cjs.js +11 -0
- package/dist/entrypoints/urlReader/lib/util.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/urlReaderServiceFactory.cjs.js +29 -0
- package/dist/entrypoints/urlReader/urlReaderServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/userInfo/DefaultUserInfoService.cjs.js +59 -0
- package/dist/entrypoints/userInfo/DefaultUserInfoService.cjs.js.map +1 -0
- package/dist/entrypoints/userInfo/userInfoServiceFactory.cjs.js +17 -0
- package/dist/entrypoints/userInfo/userInfoServiceFactory.cjs.js.map +1 -0
- package/dist/httpAuth.cjs.js +3 -187
- package/dist/httpAuth.cjs.js.map +1 -1
- package/dist/httpRouter.cjs.js +2 -166
- package/dist/httpRouter.cjs.js.map +1 -1
- package/dist/index.cjs.js +4 -160
- package/dist/index.cjs.js.map +1 -1
- package/dist/lib/escapeRegExp.cjs.js +8 -0
- package/dist/lib/escapeRegExp.cjs.js.map +1 -0
- package/dist/lifecycle.cjs.js +3 -58
- package/dist/lifecycle.cjs.js.map +1 -1
- package/dist/logger.cjs.js +3 -12
- package/dist/logger.cjs.js.map +1 -1
- package/dist/package.json.cjs.js +252 -0
- package/dist/package.json.cjs.js.map +1 -0
- package/dist/permissions.cjs.js +3 -17
- package/dist/permissions.cjs.js.map +1 -1
- package/dist/rootConfig.cjs.js +4 -22
- package/dist/rootConfig.cjs.js.map +1 -1
- package/dist/rootHealth.cjs.js +3 -35
- package/dist/rootHealth.cjs.js.map +1 -1
- package/dist/rootHttpRouter.cjs.js +15 -651
- package/dist/rootHttpRouter.cjs.js.map +1 -1
- package/dist/rootLifecycle.cjs.js +3 -70
- package/dist/rootLifecycle.cjs.js.map +1 -1
- package/dist/rootLogger.cjs.js +4 -137
- package/dist/rootLogger.cjs.js.map +1 -1
- package/dist/scheduler.cjs.js +4 -693
- package/dist/scheduler.cjs.js.map +1 -1
- package/dist/scheduler.d.ts +2 -1
- package/dist/urlReader.cjs.js +32 -2962
- package/dist/urlReader.cjs.js.map +1 -1
- package/dist/urlReader.d.ts +1 -2
- package/dist/userInfo.cjs.js +2 -64
- package/dist/userInfo.cjs.js.map +1 -1
- package/httpAuth/package.json +1 -1
- package/httpRouter/package.json +1 -1
- package/lifecycle/package.json +1 -1
- package/logger/package.json +1 -1
- package/package.json +20 -20
- package/permissions/package.json +1 -1
- package/rootConfig/package.json +1 -1
- package/rootHealth/package.json +1 -1
- package/rootHttpRouter/package.json +1 -1
- package/rootLifecycle/package.json +1 -1
- package/rootLogger/package.json +1 -1
- package/scheduler/package.json +1 -1
- package/urlReader/package.json +1 -1
- package/userInfo/package.json +1 -1
- package/dist/cjs/config-BDOwXIyo.cjs.js.map +0 -1
- package/dist/cjs/createConfigSecretEnumerator-DShyoWWL.cjs.js.map +0 -1
- package/dist/cjs/helpers-D2f1CG0o.cjs.js.map +0 -1
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var archiver = require('archiver');
|
|
4
|
+
var yauzl = require('yauzl');
|
|
5
|
+
var fs = require('fs-extra');
|
|
6
|
+
var platformPath = require('path');
|
|
7
|
+
var util = require('./util.cjs.js');
|
|
8
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
9
|
+
|
|
10
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
11
|
+
|
|
12
|
+
var archiver__default = /*#__PURE__*/_interopDefaultCompat(archiver);
|
|
13
|
+
var yauzl__default = /*#__PURE__*/_interopDefaultCompat(yauzl);
|
|
14
|
+
var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
15
|
+
var platformPath__default = /*#__PURE__*/_interopDefaultCompat(platformPath);
|
|
16
|
+
|
|
17
|
+
class ZipArchiveResponse {
|
|
18
|
+
constructor(stream, subPath, workDir, etag, filter) {
|
|
19
|
+
this.stream = stream;
|
|
20
|
+
this.subPath = subPath;
|
|
21
|
+
this.workDir = workDir;
|
|
22
|
+
this.etag = etag;
|
|
23
|
+
this.filter = filter;
|
|
24
|
+
if (subPath) {
|
|
25
|
+
if (!subPath.endsWith("/")) {
|
|
26
|
+
this.subPath += "/";
|
|
27
|
+
}
|
|
28
|
+
if (subPath.startsWith("/")) {
|
|
29
|
+
throw new TypeError(
|
|
30
|
+
`ZipArchiveResponse subPath must not start with a /, got '${subPath}'`
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
this.etag = etag;
|
|
35
|
+
}
|
|
36
|
+
read = false;
|
|
37
|
+
// Make sure the input stream is only read once
|
|
38
|
+
onlyOnce() {
|
|
39
|
+
if (this.read) {
|
|
40
|
+
throw new Error("Response has already been read");
|
|
41
|
+
}
|
|
42
|
+
this.read = true;
|
|
43
|
+
}
|
|
44
|
+
// File path relative to the root extracted directory or a sub directory if subpath is set.
|
|
45
|
+
getInnerPath(path) {
|
|
46
|
+
return path.slice(this.subPath.length);
|
|
47
|
+
}
|
|
48
|
+
shouldBeIncluded(entry) {
|
|
49
|
+
if (this.subPath) {
|
|
50
|
+
if (!entry.fileName.startsWith(this.subPath)) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (this.filter) {
|
|
55
|
+
return this.filter(this.getInnerPath(entry.fileName), {
|
|
56
|
+
size: entry.uncompressedSize
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
async streamToTemporaryFile(stream) {
|
|
62
|
+
const tmpDir = await fs__default.default.mkdtemp(
|
|
63
|
+
platformPath__default.default.join(this.workDir, "backstage-tmp")
|
|
64
|
+
);
|
|
65
|
+
const tmpFile = platformPath__default.default.join(tmpDir, "tmp.zip");
|
|
66
|
+
const writeStream = fs__default.default.createWriteStream(tmpFile);
|
|
67
|
+
return new Promise((resolve, reject) => {
|
|
68
|
+
writeStream.on("error", reject);
|
|
69
|
+
writeStream.on("finish", () => {
|
|
70
|
+
writeStream.end();
|
|
71
|
+
resolve({
|
|
72
|
+
fileName: tmpFile,
|
|
73
|
+
cleanup: () => fs__default.default.rm(tmpDir, { recursive: true })
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
stream.pipe(writeStream);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
forEveryZipEntry(zip, callback) {
|
|
80
|
+
return new Promise((resolve, reject) => {
|
|
81
|
+
yauzl__default.default.open(zip, { lazyEntries: true }, (err, zipfile) => {
|
|
82
|
+
if (err || !zipfile) {
|
|
83
|
+
reject(err || new Error(`Failed to open zip file ${zip}`));
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
zipfile.on("entry", async (entry) => {
|
|
87
|
+
if (!entry.fileName.endsWith("/") && this.shouldBeIncluded(entry)) {
|
|
88
|
+
zipfile.openReadStream(entry, async (openErr, readStream) => {
|
|
89
|
+
if (openErr || !readStream) {
|
|
90
|
+
reject(
|
|
91
|
+
openErr || new Error(`Failed to open zip entry ${entry.fileName}`)
|
|
92
|
+
);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
await callback(entry, readStream);
|
|
96
|
+
zipfile.readEntry();
|
|
97
|
+
});
|
|
98
|
+
} else {
|
|
99
|
+
zipfile.readEntry();
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
zipfile.once("end", () => resolve());
|
|
103
|
+
zipfile.on("error", (e) => reject(e));
|
|
104
|
+
zipfile.readEntry();
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
async files() {
|
|
109
|
+
this.onlyOnce();
|
|
110
|
+
const files = Array();
|
|
111
|
+
const temporary = await this.streamToTemporaryFile(this.stream);
|
|
112
|
+
await this.forEveryZipEntry(temporary.fileName, async (entry, content) => {
|
|
113
|
+
files.push({
|
|
114
|
+
path: this.getInnerPath(entry.fileName),
|
|
115
|
+
content: async () => await util.streamToBuffer(content),
|
|
116
|
+
lastModifiedAt: entry.lastModFileTime ? new Date(entry.lastModFileTime) : void 0
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
await temporary.cleanup();
|
|
120
|
+
return files;
|
|
121
|
+
}
|
|
122
|
+
async archive() {
|
|
123
|
+
this.onlyOnce();
|
|
124
|
+
if (!this.subPath) {
|
|
125
|
+
return this.stream;
|
|
126
|
+
}
|
|
127
|
+
const archive = archiver__default.default("zip");
|
|
128
|
+
const temporary = await this.streamToTemporaryFile(this.stream);
|
|
129
|
+
await this.forEveryZipEntry(temporary.fileName, async (entry, content) => {
|
|
130
|
+
archive.append(await util.streamToBuffer(content), {
|
|
131
|
+
name: this.getInnerPath(entry.fileName)
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
archive.finalize();
|
|
135
|
+
await temporary.cleanup();
|
|
136
|
+
return archive;
|
|
137
|
+
}
|
|
138
|
+
async dir(options) {
|
|
139
|
+
this.onlyOnce();
|
|
140
|
+
const dir = options?.targetDir ?? await fs__default.default.mkdtemp(platformPath__default.default.join(this.workDir, "backstage-"));
|
|
141
|
+
const temporary = await this.streamToTemporaryFile(this.stream);
|
|
142
|
+
await this.forEveryZipEntry(temporary.fileName, async (entry, content) => {
|
|
143
|
+
const entryPath = this.getInnerPath(entry.fileName);
|
|
144
|
+
const dirname = platformPath__default.default.dirname(entryPath);
|
|
145
|
+
if (dirname) {
|
|
146
|
+
await fs__default.default.mkdirp(backendPluginApi.resolveSafeChildPath(dir, dirname));
|
|
147
|
+
}
|
|
148
|
+
return new Promise(async (resolve, reject) => {
|
|
149
|
+
const file = fs__default.default.createWriteStream(backendPluginApi.resolveSafeChildPath(dir, entryPath));
|
|
150
|
+
file.on("finish", resolve);
|
|
151
|
+
content.on("error", reject);
|
|
152
|
+
content.pipe(file);
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
await temporary.cleanup();
|
|
156
|
+
return dir;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
exports.ZipArchiveResponse = ZipArchiveResponse;
|
|
161
|
+
//# sourceMappingURL=ZipArchiveResponse.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZipArchiveResponse.cjs.js","sources":["../../../../../src/entrypoints/urlReader/lib/tree/ZipArchiveResponse.ts"],"sourcesContent":["/*\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 {\n UrlReaderServiceReadTreeResponse,\n UrlReaderServiceReadTreeResponseDirOptions,\n UrlReaderServiceReadTreeResponseFile,\n} from '@backstage/backend-plugin-api';\nimport archiver from 'archiver';\nimport yauzl, { Entry } from 'yauzl';\nimport fs from 'fs-extra';\nimport platformPath from 'path';\nimport { Readable } from 'stream';\nimport { streamToBuffer } from './util';\nimport { resolveSafeChildPath } from '@backstage/backend-plugin-api';\n\n/**\n * Wraps a zip archive stream into a tree response reader.\n */\nexport class ZipArchiveResponse implements UrlReaderServiceReadTreeResponse {\n private read = false;\n\n constructor(\n private readonly stream: Readable,\n private readonly subPath: string,\n private readonly workDir: string,\n public readonly etag: string,\n private readonly filter?: (path: string, info: { size: number }) => boolean,\n ) {\n if (subPath) {\n if (!subPath.endsWith('/')) {\n this.subPath += '/';\n }\n if (subPath.startsWith('/')) {\n throw new TypeError(\n `ZipArchiveResponse subPath must not start with a /, got '${subPath}'`,\n );\n }\n }\n\n this.etag = etag;\n }\n\n // Make sure the input stream is only read once\n private onlyOnce() {\n if (this.read) {\n throw new Error('Response has already been read');\n }\n this.read = true;\n }\n\n // File path relative to the root extracted directory or a sub directory if subpath is set.\n private getInnerPath(path: string): string {\n return path.slice(this.subPath.length);\n }\n\n private shouldBeIncluded(entry: Entry): boolean {\n if (this.subPath) {\n if (!entry.fileName.startsWith(this.subPath)) {\n return false;\n }\n }\n if (this.filter) {\n return this.filter(this.getInnerPath(entry.fileName), {\n size: entry.uncompressedSize,\n });\n }\n return true;\n }\n\n private async streamToTemporaryFile(\n stream: Readable,\n ): Promise<{ fileName: string; cleanup: () => Promise<void> }> {\n const tmpDir = await fs.mkdtemp(\n platformPath.join(this.workDir, 'backstage-tmp'),\n );\n const tmpFile = platformPath.join(tmpDir, 'tmp.zip');\n\n const writeStream = fs.createWriteStream(tmpFile);\n\n return new Promise((resolve, reject) => {\n writeStream.on('error', reject);\n writeStream.on('finish', () => {\n writeStream.end();\n resolve({\n fileName: tmpFile,\n cleanup: () => fs.rm(tmpDir, { recursive: true }),\n });\n });\n stream.pipe(writeStream);\n });\n }\n\n private forEveryZipEntry(\n zip: string,\n callback: (entry: Entry, content: Readable) => Promise<void>,\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n yauzl.open(zip, { lazyEntries: true }, (err, zipfile) => {\n if (err || !zipfile) {\n reject(err || new Error(`Failed to open zip file ${zip}`));\n return;\n }\n\n zipfile.on('entry', async (entry: Entry) => {\n // Check that the file is not a directory, and that is matches the filter.\n if (!entry.fileName.endsWith('/') && this.shouldBeIncluded(entry)) {\n zipfile.openReadStream(entry, async (openErr, readStream) => {\n if (openErr || !readStream) {\n reject(\n openErr ||\n new Error(`Failed to open zip entry ${entry.fileName}`),\n );\n return;\n }\n\n await callback(entry, readStream);\n zipfile.readEntry();\n });\n } else {\n zipfile.readEntry();\n }\n });\n zipfile.once('end', () => resolve());\n zipfile.on('error', e => reject(e));\n zipfile.readEntry();\n });\n });\n }\n\n async files(): Promise<UrlReaderServiceReadTreeResponseFile[]> {\n this.onlyOnce();\n const files = Array<UrlReaderServiceReadTreeResponseFile>();\n const temporary = await this.streamToTemporaryFile(this.stream);\n\n await this.forEveryZipEntry(temporary.fileName, async (entry, content) => {\n files.push({\n path: this.getInnerPath(entry.fileName),\n content: async () => await streamToBuffer(content),\n lastModifiedAt: entry.lastModFileTime\n ? new Date(entry.lastModFileTime)\n : undefined,\n });\n });\n\n await temporary.cleanup();\n\n return files;\n }\n\n async archive(): Promise<Readable> {\n this.onlyOnce();\n\n if (!this.subPath) {\n return this.stream;\n }\n\n const archive = archiver('zip');\n const temporary = await this.streamToTemporaryFile(this.stream);\n\n await this.forEveryZipEntry(temporary.fileName, async (entry, content) => {\n archive.append(await streamToBuffer(content), {\n name: this.getInnerPath(entry.fileName),\n });\n });\n\n archive.finalize();\n\n await temporary.cleanup();\n\n return archive;\n }\n\n async dir(\n options?: UrlReaderServiceReadTreeResponseDirOptions,\n ): Promise<string> {\n this.onlyOnce();\n const dir =\n options?.targetDir ??\n (await fs.mkdtemp(platformPath.join(this.workDir, 'backstage-')));\n\n const temporary = await this.streamToTemporaryFile(this.stream);\n\n await this.forEveryZipEntry(temporary.fileName, async (entry, content) => {\n const entryPath = this.getInnerPath(entry.fileName);\n const dirname = platformPath.dirname(entryPath);\n\n if (dirname) {\n await fs.mkdirp(resolveSafeChildPath(dir, dirname));\n }\n return new Promise(async (resolve, reject) => {\n const file = fs.createWriteStream(resolveSafeChildPath(dir, entryPath));\n file.on('finish', resolve);\n\n content.on('error', reject);\n content.pipe(file);\n });\n });\n\n await temporary.cleanup();\n\n return dir;\n }\n}\n"],"names":["fs","platformPath","yauzl","streamToBuffer","archiver","resolveSafeChildPath"],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var stream = require('stream');
|
|
4
|
+
var util = require('util');
|
|
5
|
+
var concatStream = require('concat-stream');
|
|
6
|
+
|
|
7
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var concatStream__default = /*#__PURE__*/_interopDefaultCompat(concatStream);
|
|
10
|
+
|
|
11
|
+
const pipeline = util.promisify(stream.pipeline);
|
|
12
|
+
const directoryNameRegex = /^[^\/]+\//;
|
|
13
|
+
function stripFirstDirectoryFromPath(path) {
|
|
14
|
+
return path.replace(directoryNameRegex, "");
|
|
15
|
+
}
|
|
16
|
+
const streamToBuffer = (stream) => {
|
|
17
|
+
return new Promise(async (resolve, reject) => {
|
|
18
|
+
try {
|
|
19
|
+
await pipeline(stream, concatStream__default.default(resolve));
|
|
20
|
+
} catch (ex) {
|
|
21
|
+
reject(ex);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
exports.streamToBuffer = streamToBuffer;
|
|
27
|
+
exports.stripFirstDirectoryFromPath = stripFirstDirectoryFromPath;
|
|
28
|
+
//# sourceMappingURL=util.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.cjs.js","sources":["../../../../../src/entrypoints/urlReader/lib/tree/util.ts"],"sourcesContent":["/*\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\nimport { Readable, pipeline as pipelineCb } from 'stream';\nimport { promisify } from 'util';\nimport concatStream from 'concat-stream';\n\nconst pipeline = promisify(pipelineCb);\n\n// Matches a directory name + one `/` at the start of any string,\n// containing any character except `/` one or more times, and ending with a `/`\n// e.g. Will match `dirA/` in `dirA/dirB/file.ext`\nconst directoryNameRegex = /^[^\\/]+\\//;\n// Removes the first segment of a forward-slash-separated path\nexport function stripFirstDirectoryFromPath(path: string): string {\n return path.replace(directoryNameRegex, '');\n}\n\n// Collect the stream into a buffer and return\nexport const streamToBuffer = (stream: Readable): Promise<Buffer> => {\n return new Promise(async (resolve, reject) => {\n try {\n await pipeline(stream, concatStream(resolve));\n } catch (ex) {\n reject(ex);\n }\n });\n};\n"],"names":["promisify","pipelineCb","concatStream"],"mappings":";;;;;;;;;;AAoBA,MAAM,QAAA,GAAWA,eAAUC,eAAU,CAAA,CAAA;AAKrC,MAAM,kBAAqB,GAAA,WAAA,CAAA;AAEpB,SAAS,4BAA4B,IAAsB,EAAA;AAChE,EAAO,OAAA,IAAA,CAAK,OAAQ,CAAA,kBAAA,EAAoB,EAAE,CAAA,CAAA;AAC5C,CAAA;AAGa,MAAA,cAAA,GAAiB,CAAC,MAAsC,KAAA;AACnE,EAAA,OAAO,IAAI,OAAA,CAAQ,OAAO,OAAA,EAAS,MAAW,KAAA;AAC5C,IAAI,IAAA;AACF,MAAA,MAAM,QAAS,CAAA,MAAA,EAAQC,6BAAa,CAAA,OAAO,CAAC,CAAA,CAAA;AAAA,aACrC,EAAI,EAAA;AACX,MAAA,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,KACX;AAAA,GACD,CAAA,CAAA;AACH;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.cjs.js","sources":["../../../../src/entrypoints/urlReader/lib/util.ts"],"sourcesContent":["/*\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\nexport function parseLastModified(value: string | null | undefined) {\n if (!value) {\n return undefined;\n }\n\n return new Date(value);\n}\n"],"names":[],"mappings":";;AAgBO,SAAS,kBAAkB,KAAkC,EAAA;AAClE,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AAEA,EAAO,OAAA,IAAI,KAAK,KAAK,CAAA,CAAA;AACvB;;;;"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var UrlReaders = require('./lib/UrlReaders.cjs.js');
|
|
4
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
5
|
+
|
|
6
|
+
const urlReaderFactoriesServiceRef = backendPluginApi.createServiceRef({
|
|
7
|
+
id: "core.urlReader.factories",
|
|
8
|
+
scope: "plugin",
|
|
9
|
+
multiton: true
|
|
10
|
+
});
|
|
11
|
+
const urlReaderServiceFactory = backendPluginApi.createServiceFactory({
|
|
12
|
+
service: backendPluginApi.coreServices.urlReader,
|
|
13
|
+
deps: {
|
|
14
|
+
config: backendPluginApi.coreServices.rootConfig,
|
|
15
|
+
logger: backendPluginApi.coreServices.logger,
|
|
16
|
+
factories: urlReaderFactoriesServiceRef
|
|
17
|
+
},
|
|
18
|
+
async factory({ config, logger, factories }) {
|
|
19
|
+
return UrlReaders.UrlReaders.default({
|
|
20
|
+
config,
|
|
21
|
+
logger,
|
|
22
|
+
factories
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
exports.urlReaderFactoriesServiceRef = urlReaderFactoriesServiceRef;
|
|
28
|
+
exports.urlReaderServiceFactory = urlReaderServiceFactory;
|
|
29
|
+
//# sourceMappingURL=urlReaderServiceFactory.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urlReaderServiceFactory.cjs.js","sources":["../../../src/entrypoints/urlReader/urlReaderServiceFactory.ts"],"sourcesContent":["/*\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 { ReaderFactory } from './lib';\nimport { UrlReaders } from './lib/UrlReaders';\nimport {\n coreServices,\n createServiceFactory,\n createServiceRef,\n} from '@backstage/backend-plugin-api';\n\n/**\n * @public\n * A non-singleton reference to URL Reader factory services.\n *\n * @example\n * Creating a service factory implementation for a Custom URL Reader.\n * ```ts\n * createServiceFactory({\n * service: urlReaderFactoriesServiceRef,\n * deps: {},\n * async factory() {\n * return CustomUrlReader.factory;\n * },\n * });\n * ```\n */\nexport const urlReaderFactoriesServiceRef = createServiceRef<ReaderFactory>({\n id: 'core.urlReader.factories',\n scope: 'plugin',\n multiton: true,\n});\n\n/**\n * Reading content from external systems.\n *\n * See {@link @backstage/code-plugin-api#UrlReaderService}\n * and {@link https://backstage.io/docs/backend-system/core-services/url-reader | the service docs}\n * for more information.\n *\n * @public\n */\nexport const urlReaderServiceFactory = createServiceFactory({\n service: coreServices.urlReader,\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n factories: urlReaderFactoriesServiceRef,\n },\n async factory({ config, logger, factories }) {\n return UrlReaders.default({\n config,\n logger,\n factories,\n });\n },\n});\n"],"names":["createServiceRef","createServiceFactory","coreServices","UrlReaders"],"mappings":";;;;;AAwCO,MAAM,+BAA+BA,iCAAgC,CAAA;AAAA,EAC1E,EAAI,EAAA,0BAAA;AAAA,EACJ,KAAO,EAAA,QAAA;AAAA,EACP,QAAU,EAAA,IAAA;AACZ,CAAC,EAAA;AAWM,MAAM,0BAA0BC,qCAAqB,CAAA;AAAA,EAC1D,SAASC,6BAAa,CAAA,SAAA;AAAA,EACtB,IAAM,EAAA;AAAA,IACJ,QAAQA,6BAAa,CAAA,UAAA;AAAA,IACrB,QAAQA,6BAAa,CAAA,MAAA;AAAA,IACrB,SAAW,EAAA,4BAAA;AAAA,GACb;AAAA,EACA,MAAM,OAAQ,CAAA,EAAE,MAAQ,EAAA,MAAA,EAAQ,WAAa,EAAA;AAC3C,IAAA,OAAOC,sBAAW,OAAQ,CAAA;AAAA,MACxB,MAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF,CAAC;;;;;"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var errors = require('@backstage/errors');
|
|
4
|
+
var jose = require('jose');
|
|
5
|
+
var fetch = require('node-fetch');
|
|
6
|
+
var helpers = require('../auth/helpers.cjs.js');
|
|
7
|
+
|
|
8
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var fetch__default = /*#__PURE__*/_interopDefaultCompat(fetch);
|
|
11
|
+
|
|
12
|
+
class DefaultUserInfoService {
|
|
13
|
+
discovery;
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this.discovery = options.discovery;
|
|
16
|
+
}
|
|
17
|
+
async getUserInfo(credentials) {
|
|
18
|
+
const internalCredentials = helpers.toInternalBackstageCredentials(credentials);
|
|
19
|
+
if (internalCredentials.principal.type !== "user") {
|
|
20
|
+
throw new Error("Only user credentials are supported");
|
|
21
|
+
}
|
|
22
|
+
if (!internalCredentials.token) {
|
|
23
|
+
throw new Error("User credentials is unexpectedly missing token");
|
|
24
|
+
}
|
|
25
|
+
const { sub: userEntityRef, ent: tokenEnt } = jose.decodeJwt(
|
|
26
|
+
internalCredentials.token
|
|
27
|
+
);
|
|
28
|
+
if (typeof userEntityRef !== "string") {
|
|
29
|
+
throw new Error("User entity ref must be a string");
|
|
30
|
+
}
|
|
31
|
+
let ownershipEntityRefs = tokenEnt;
|
|
32
|
+
if (!ownershipEntityRefs) {
|
|
33
|
+
const userInfoResp = await fetch__default.default(
|
|
34
|
+
`${await this.discovery.getBaseUrl("auth")}/v1/userinfo`,
|
|
35
|
+
{
|
|
36
|
+
headers: {
|
|
37
|
+
Authorization: `Bearer ${internalCredentials.token}`
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
if (!userInfoResp.ok) {
|
|
42
|
+
throw await errors.ResponseError.fromResponse(userInfoResp);
|
|
43
|
+
}
|
|
44
|
+
const {
|
|
45
|
+
claims: { ent }
|
|
46
|
+
} = await userInfoResp.json();
|
|
47
|
+
ownershipEntityRefs = ent;
|
|
48
|
+
}
|
|
49
|
+
if (!ownershipEntityRefs) {
|
|
50
|
+
throw new Error("Ownership entity refs can not be determined");
|
|
51
|
+
} else if (!Array.isArray(ownershipEntityRefs) || ownershipEntityRefs.some((ref) => typeof ref !== "string")) {
|
|
52
|
+
throw new Error("Ownership entity refs must be an array of strings");
|
|
53
|
+
}
|
|
54
|
+
return { userEntityRef, ownershipEntityRefs };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
exports.DefaultUserInfoService = DefaultUserInfoService;
|
|
59
|
+
//# sourceMappingURL=DefaultUserInfoService.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefaultUserInfoService.cjs.js","sources":["../../../src/entrypoints/userInfo/DefaultUserInfoService.ts"],"sourcesContent":["/*\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 DiscoveryService,\n BackstageCredentials,\n} from '@backstage/backend-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport { decodeJwt } from 'jose';\nimport fetch from 'node-fetch';\nimport { toInternalBackstageCredentials } from '../auth/helpers';\n\nexport type Options = {\n discovery: DiscoveryService;\n};\n\nexport class DefaultUserInfoService implements UserInfoService {\n private readonly discovery: DiscoveryService;\n\n constructor(options: Options) {\n this.discovery = options.discovery;\n }\n\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: tokenEnt } = decodeJwt(\n internalCredentials.token,\n );\n\n if (typeof userEntityRef !== 'string') {\n throw new Error('User entity ref must be a string');\n }\n\n let ownershipEntityRefs = tokenEnt;\n\n if (!ownershipEntityRefs) {\n const userInfoResp = await fetch(\n `${await this.discovery.getBaseUrl('auth')}/v1/userinfo`,\n {\n headers: {\n Authorization: `Bearer ${internalCredentials.token}`,\n },\n },\n );\n\n if (!userInfoResp.ok) {\n throw await ResponseError.fromResponse(userInfoResp);\n }\n\n const {\n claims: { ent },\n } = await userInfoResp.json();\n ownershipEntityRefs = ent;\n }\n\n if (!ownershipEntityRefs) {\n throw new Error('Ownership entity refs can not be determined');\n } else 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"],"names":["toInternalBackstageCredentials","decodeJwt","fetch","ResponseError"],"mappings":";;;;;;;;;;;AA+BO,MAAM,sBAAkD,CAAA;AAAA,EAC5C,SAAA,CAAA;AAAA,EAEjB,YAAY,OAAkB,EAAA;AAC5B,IAAA,IAAA,CAAK,YAAY,OAAQ,CAAA,SAAA,CAAA;AAAA,GAC3B;AAAA,EAEA,MAAM,YACJ,WAC4B,EAAA;AAC5B,IAAM,MAAA,mBAAA,GAAsBA,uCAA+B,WAAW,CAAA,CAAA;AACtE,IAAI,IAAA,mBAAA,CAAoB,SAAU,CAAA,IAAA,KAAS,MAAQ,EAAA;AACjD,MAAM,MAAA,IAAI,MAAM,qCAAqC,CAAA,CAAA;AAAA,KACvD;AACA,IAAI,IAAA,CAAC,oBAAoB,KAAO,EAAA;AAC9B,MAAM,MAAA,IAAI,MAAM,gDAAgD,CAAA,CAAA;AAAA,KAClE;AACA,IAAA,MAAM,EAAE,GAAA,EAAK,aAAe,EAAA,GAAA,EAAK,UAAa,GAAAC,cAAA;AAAA,MAC5C,mBAAoB,CAAA,KAAA;AAAA,KACtB,CAAA;AAEA,IAAI,IAAA,OAAO,kBAAkB,QAAU,EAAA;AACrC,MAAM,MAAA,IAAI,MAAM,kCAAkC,CAAA,CAAA;AAAA,KACpD;AAEA,IAAA,IAAI,mBAAsB,GAAA,QAAA,CAAA;AAE1B,IAAA,IAAI,CAAC,mBAAqB,EAAA;AACxB,MAAA,MAAM,eAAe,MAAMC,sBAAA;AAAA,QACzB,GAAG,MAAM,IAAA,CAAK,SAAU,CAAA,UAAA,CAAW,MAAM,CAAC,CAAA,YAAA,CAAA;AAAA,QAC1C;AAAA,UACE,OAAS,EAAA;AAAA,YACP,aAAA,EAAe,CAAU,OAAA,EAAA,mBAAA,CAAoB,KAAK,CAAA,CAAA;AAAA,WACpD;AAAA,SACF;AAAA,OACF,CAAA;AAEA,MAAI,IAAA,CAAC,aAAa,EAAI,EAAA;AACpB,QAAM,MAAA,MAAMC,oBAAc,CAAA,YAAA,CAAa,YAAY,CAAA,CAAA;AAAA,OACrD;AAEA,MAAM,MAAA;AAAA,QACJ,MAAA,EAAQ,EAAE,GAAI,EAAA;AAAA,OAChB,GAAI,MAAM,YAAA,CAAa,IAAK,EAAA,CAAA;AAC5B,MAAsB,mBAAA,GAAA,GAAA,CAAA;AAAA,KACxB;AAEA,IAAA,IAAI,CAAC,mBAAqB,EAAA;AACxB,MAAM,MAAA,IAAI,MAAM,6CAA6C,CAAA,CAAA;AAAA,KAE7D,MAAA,IAAA,CAAC,KAAM,CAAA,OAAA,CAAQ,mBAAmB,CAAA,IAClC,mBAAoB,CAAA,IAAA,CAAK,CAAO,GAAA,KAAA,OAAO,GAAQ,KAAA,QAAQ,CACvD,EAAA;AACA,MAAM,MAAA,IAAI,MAAM,mDAAmD,CAAA,CAAA;AAAA,KACrE;AAEA,IAAO,OAAA,EAAE,eAAe,mBAAoB,EAAA,CAAA;AAAA,GAC9C;AACF;;;;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
4
|
+
var DefaultUserInfoService = require('./DefaultUserInfoService.cjs.js');
|
|
5
|
+
|
|
6
|
+
const userInfoServiceFactory = backendPluginApi.createServiceFactory({
|
|
7
|
+
service: backendPluginApi.coreServices.userInfo,
|
|
8
|
+
deps: {
|
|
9
|
+
discovery: backendPluginApi.coreServices.discovery
|
|
10
|
+
},
|
|
11
|
+
async factory({ discovery }) {
|
|
12
|
+
return new DefaultUserInfoService.DefaultUserInfoService({ discovery });
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
exports.userInfoServiceFactory = userInfoServiceFactory;
|
|
17
|
+
//# sourceMappingURL=userInfoServiceFactory.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userInfoServiceFactory.cjs.js","sources":["../../../src/entrypoints/userInfo/userInfoServiceFactory.ts"],"sourcesContent":["/*\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 { DefaultUserInfoService } from './DefaultUserInfoService';\n\n/**\n * Authenticated user information retrieval.\n *\n * See {@link @backstage/code-plugin-api#UserInfoService}\n * and {@link https://backstage.io/docs/backend-system/core-services/user-info | the service docs}\n * for more information.\n *\n * @public\n */\nexport const userInfoServiceFactory = createServiceFactory({\n service: coreServices.userInfo,\n deps: {\n discovery: coreServices.discovery,\n },\n async factory({ discovery }) {\n return new DefaultUserInfoService({ discovery });\n },\n});\n"],"names":["createServiceFactory","coreServices","DefaultUserInfoService"],"mappings":";;;;;AA+BO,MAAM,yBAAyBA,qCAAqB,CAAA;AAAA,EACzD,SAASC,6BAAa,CAAA,QAAA;AAAA,EACtB,IAAM,EAAA;AAAA,IACJ,WAAWA,6BAAa,CAAA,SAAA;AAAA,GAC1B;AAAA,EACA,MAAM,OAAA,CAAQ,EAAE,SAAA,EAAa,EAAA;AAC3B,IAAA,OAAO,IAAIC,6CAAA,CAAuB,EAAE,SAAA,EAAW,CAAA,CAAA;AAAA,GACjD;AACF,CAAC;;;;"}
|
package/dist/httpAuth.cjs.js
CHANGED
|
@@ -1,192 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var errors = require('@backstage/errors');
|
|
5
|
-
var cookie = require('cookie');
|
|
3
|
+
var httpAuthServiceFactory = require('./entrypoints/httpAuth/httpAuthServiceFactory.cjs.js');
|
|
6
4
|
|
|
7
|
-
const FIVE_MINUTES_MS = 5 * 60 * 1e3;
|
|
8
|
-
const BACKSTAGE_AUTH_COOKIE = "backstage-auth";
|
|
9
|
-
function getTokenFromRequest(req) {
|
|
10
|
-
const authHeader = req.headers.authorization;
|
|
11
|
-
if (typeof authHeader === "string") {
|
|
12
|
-
const matches = authHeader.match(/^Bearer[ ]+(\S+)$/i);
|
|
13
|
-
const token = matches?.[1];
|
|
14
|
-
if (token) {
|
|
15
|
-
return token;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
return void 0;
|
|
19
|
-
}
|
|
20
|
-
function getCookieFromRequest(req) {
|
|
21
|
-
const cookieHeader = req.headers.cookie;
|
|
22
|
-
if (cookieHeader) {
|
|
23
|
-
const cookies = cookie.parse(cookieHeader);
|
|
24
|
-
const token = cookies[BACKSTAGE_AUTH_COOKIE];
|
|
25
|
-
if (token) {
|
|
26
|
-
return token;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
return void 0;
|
|
30
|
-
}
|
|
31
|
-
function willExpireSoon(expiresAt) {
|
|
32
|
-
return Date.now() + FIVE_MINUTES_MS > expiresAt.getTime();
|
|
33
|
-
}
|
|
34
|
-
const credentialsSymbol = Symbol("backstage-credentials");
|
|
35
|
-
const limitedCredentialsSymbol = Symbol("backstage-limited-credentials");
|
|
36
|
-
class DefaultHttpAuthService {
|
|
37
|
-
#auth;
|
|
38
|
-
#discovery;
|
|
39
|
-
#pluginId;
|
|
40
|
-
constructor(auth, discovery, pluginId) {
|
|
41
|
-
this.#auth = auth;
|
|
42
|
-
this.#discovery = discovery;
|
|
43
|
-
this.#pluginId = pluginId;
|
|
44
|
-
}
|
|
45
|
-
async #extractCredentialsFromRequest(req) {
|
|
46
|
-
const token = getTokenFromRequest(req);
|
|
47
|
-
if (!token) {
|
|
48
|
-
return await this.#auth.getNoneCredentials();
|
|
49
|
-
}
|
|
50
|
-
return await this.#auth.authenticate(token);
|
|
51
|
-
}
|
|
52
|
-
async #extractLimitedCredentialsFromRequest(req) {
|
|
53
|
-
const token = getTokenFromRequest(req);
|
|
54
|
-
if (token) {
|
|
55
|
-
return await this.#auth.authenticate(token, {
|
|
56
|
-
allowLimitedAccess: true
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
const cookie = getCookieFromRequest(req);
|
|
60
|
-
if (cookie) {
|
|
61
|
-
return await this.#auth.authenticate(cookie, {
|
|
62
|
-
allowLimitedAccess: true
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
return await this.#auth.getNoneCredentials();
|
|
66
|
-
}
|
|
67
|
-
async #getCredentials(req) {
|
|
68
|
-
return req[credentialsSymbol] ??= this.#extractCredentialsFromRequest(req);
|
|
69
|
-
}
|
|
70
|
-
async #getLimitedCredentials(req) {
|
|
71
|
-
return req[limitedCredentialsSymbol] ??= this.#extractLimitedCredentialsFromRequest(req);
|
|
72
|
-
}
|
|
73
|
-
async credentials(req, options) {
|
|
74
|
-
const credentials = options?.allowLimitedAccess ? await this.#getLimitedCredentials(req) : await this.#getCredentials(req);
|
|
75
|
-
const allowed = options?.allow;
|
|
76
|
-
if (!allowed) {
|
|
77
|
-
return credentials;
|
|
78
|
-
}
|
|
79
|
-
if (this.#auth.isPrincipal(credentials, "none")) {
|
|
80
|
-
if (allowed.includes("none")) {
|
|
81
|
-
return credentials;
|
|
82
|
-
}
|
|
83
|
-
throw new errors.AuthenticationError("Missing credentials");
|
|
84
|
-
} else if (this.#auth.isPrincipal(credentials, "user")) {
|
|
85
|
-
if (allowed.includes("user")) {
|
|
86
|
-
return credentials;
|
|
87
|
-
}
|
|
88
|
-
throw new errors.NotAllowedError(
|
|
89
|
-
`This endpoint does not allow 'user' credentials`
|
|
90
|
-
);
|
|
91
|
-
} else if (this.#auth.isPrincipal(credentials, "service")) {
|
|
92
|
-
if (allowed.includes("service")) {
|
|
93
|
-
return credentials;
|
|
94
|
-
}
|
|
95
|
-
throw new errors.NotAllowedError(
|
|
96
|
-
`This endpoint does not allow 'service' credentials`
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
throw new errors.NotAllowedError(
|
|
100
|
-
"Unknown principal type, this should never happen"
|
|
101
|
-
);
|
|
102
|
-
}
|
|
103
|
-
async issueUserCookie(res, options) {
|
|
104
|
-
if (res.headersSent) {
|
|
105
|
-
throw new Error("Failed to issue user cookie, headers were already sent");
|
|
106
|
-
}
|
|
107
|
-
let credentials;
|
|
108
|
-
if (options?.credentials) {
|
|
109
|
-
if (this.#auth.isPrincipal(options.credentials, "none")) {
|
|
110
|
-
res.clearCookie(
|
|
111
|
-
BACKSTAGE_AUTH_COOKIE,
|
|
112
|
-
await this.#getCookieOptions(res.req)
|
|
113
|
-
);
|
|
114
|
-
return { expiresAt: /* @__PURE__ */ new Date() };
|
|
115
|
-
}
|
|
116
|
-
if (!this.#auth.isPrincipal(options.credentials, "user")) {
|
|
117
|
-
throw new errors.AuthenticationError(
|
|
118
|
-
"Refused to issue cookie for non-user principal"
|
|
119
|
-
);
|
|
120
|
-
}
|
|
121
|
-
credentials = options.credentials;
|
|
122
|
-
} else {
|
|
123
|
-
credentials = await this.credentials(res.req, { allow: ["user"] });
|
|
124
|
-
}
|
|
125
|
-
const existingExpiresAt = await this.#existingCookieExpiration(res.req);
|
|
126
|
-
if (existingExpiresAt && !willExpireSoon(existingExpiresAt)) {
|
|
127
|
-
return { expiresAt: existingExpiresAt };
|
|
128
|
-
}
|
|
129
|
-
const { token, expiresAt } = await this.#auth.getLimitedUserToken(
|
|
130
|
-
credentials
|
|
131
|
-
);
|
|
132
|
-
if (!token) {
|
|
133
|
-
throw new Error("User credentials is unexpectedly missing token");
|
|
134
|
-
}
|
|
135
|
-
res.cookie(BACKSTAGE_AUTH_COOKIE, token, {
|
|
136
|
-
...await this.#getCookieOptions(res.req),
|
|
137
|
-
expires: expiresAt
|
|
138
|
-
});
|
|
139
|
-
return { expiresAt };
|
|
140
|
-
}
|
|
141
|
-
async #getCookieOptions(_req) {
|
|
142
|
-
const externalBaseUrlStr = await this.#discovery.getExternalBaseUrl(
|
|
143
|
-
this.#pluginId
|
|
144
|
-
);
|
|
145
|
-
const externalBaseUrl = new URL(externalBaseUrlStr);
|
|
146
|
-
const secure = externalBaseUrl.protocol === "https:" || externalBaseUrl.hostname === "localhost";
|
|
147
|
-
return {
|
|
148
|
-
domain: externalBaseUrl.hostname,
|
|
149
|
-
httpOnly: true,
|
|
150
|
-
secure,
|
|
151
|
-
priority: "high",
|
|
152
|
-
sameSite: secure ? "none" : "lax"
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
async #existingCookieExpiration(req) {
|
|
156
|
-
const existingCookie = getCookieFromRequest(req);
|
|
157
|
-
if (!existingCookie) {
|
|
158
|
-
return void 0;
|
|
159
|
-
}
|
|
160
|
-
try {
|
|
161
|
-
const existingCredentials = await this.#auth.authenticate(
|
|
162
|
-
existingCookie,
|
|
163
|
-
{
|
|
164
|
-
allowLimitedAccess: true
|
|
165
|
-
}
|
|
166
|
-
);
|
|
167
|
-
if (!this.#auth.isPrincipal(existingCredentials, "user")) {
|
|
168
|
-
return void 0;
|
|
169
|
-
}
|
|
170
|
-
return existingCredentials.expiresAt;
|
|
171
|
-
} catch (error) {
|
|
172
|
-
if (error.name === "AuthenticationError") {
|
|
173
|
-
return void 0;
|
|
174
|
-
}
|
|
175
|
-
throw error;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
const httpAuthServiceFactory = backendPluginApi.createServiceFactory({
|
|
180
|
-
service: backendPluginApi.coreServices.httpAuth,
|
|
181
|
-
deps: {
|
|
182
|
-
auth: backendPluginApi.coreServices.auth,
|
|
183
|
-
discovery: backendPluginApi.coreServices.discovery,
|
|
184
|
-
plugin: backendPluginApi.coreServices.pluginMetadata
|
|
185
|
-
},
|
|
186
|
-
async factory({ auth, discovery, plugin }) {
|
|
187
|
-
return new DefaultHttpAuthService(auth, discovery, plugin.getId());
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
5
|
|
|
191
|
-
|
|
6
|
+
|
|
7
|
+
exports.httpAuthServiceFactory = httpAuthServiceFactory.httpAuthServiceFactory;
|
|
192
8
|
//# sourceMappingURL=httpAuth.cjs.js.map
|
package/dist/httpAuth.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"httpAuth.cjs.js","sources":["../src/entrypoints/httpAuth/httpAuthServiceFactory.ts"],"sourcesContent":["/*\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/**\n * Authentication of HTTP requests.\n *\n * See {@link @backstage/code-plugin-api#HttpAuthService}\n * and {@link https://backstage.io/docs/backend-system/core-services/http-auth | the service docs}\n * for more information.\n *\n * @public\n */\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"],"names":["parseCookie","AuthenticationError","NotAllowedError","createServiceFactory","coreServices"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"httpAuth.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|