@bsb/config-vault 0.0.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.
Files changed (43) hide show
  1. package/README.md +49 -0
  2. package/bsb-plugin.json +40 -0
  3. package/lib/index.d.ts +2 -0
  4. package/lib/index.d.ts.map +1 -0
  5. package/lib/index.js +2 -0
  6. package/lib/index.js.map +1 -0
  7. package/lib/plugins/config-vault/index.d.ts +39 -0
  8. package/lib/plugins/config-vault/index.d.ts.map +1 -0
  9. package/lib/plugins/config-vault/index.js +175 -0
  10. package/lib/plugins/config-vault/index.js.map +1 -0
  11. package/lib/plugins/service-config-vault/crypto.d.ts +17 -0
  12. package/lib/plugins/service-config-vault/crypto.d.ts.map +1 -0
  13. package/lib/plugins/service-config-vault/crypto.js +76 -0
  14. package/lib/plugins/service-config-vault/crypto.js.map +1 -0
  15. package/lib/plugins/service-config-vault/http-server.d.ts +20 -0
  16. package/lib/plugins/service-config-vault/http-server.d.ts.map +1 -0
  17. package/lib/plugins/service-config-vault/http-server.js +272 -0
  18. package/lib/plugins/service-config-vault/http-server.js.map +1 -0
  19. package/lib/plugins/service-config-vault/index.d.ts +82 -0
  20. package/lib/plugins/service-config-vault/index.d.ts.map +1 -0
  21. package/lib/plugins/service-config-vault/index.js +95 -0
  22. package/lib/plugins/service-config-vault/index.js.map +1 -0
  23. package/lib/plugins/service-config-vault/passkeys.d.ts +9 -0
  24. package/lib/plugins/service-config-vault/passkeys.d.ts.map +1 -0
  25. package/lib/plugins/service-config-vault/passkeys.js +12 -0
  26. package/lib/plugins/service-config-vault/passkeys.js.map +1 -0
  27. package/lib/plugins/service-config-vault/store.d.ts +42 -0
  28. package/lib/plugins/service-config-vault/store.d.ts.map +1 -0
  29. package/lib/plugins/service-config-vault/store.js +396 -0
  30. package/lib/plugins/service-config-vault/store.js.map +1 -0
  31. package/lib/plugins/service-config-vault/types.d.ts +127 -0
  32. package/lib/plugins/service-config-vault/types.d.ts.map +1 -0
  33. package/lib/plugins/service-config-vault/types.js +2 -0
  34. package/lib/plugins/service-config-vault/types.js.map +1 -0
  35. package/lib/plugins/service-config-vault/vault.d.ts +52 -0
  36. package/lib/plugins/service-config-vault/vault.d.ts.map +1 -0
  37. package/lib/plugins/service-config-vault/vault.js +243 -0
  38. package/lib/plugins/service-config-vault/vault.js.map +1 -0
  39. package/lib/schemas/config-vault.json +73 -0
  40. package/lib/schemas/config-vault.plugin.json +82 -0
  41. package/lib/schemas/service-config-vault.json +146 -0
  42. package/lib/schemas/service-config-vault.plugin.json +93 -0
  43. package/package.json +52 -0
package/README.md ADDED
@@ -0,0 +1,49 @@
1
+ # BSB Vault
2
+
3
+ `@bsb/config-vault` provides **Vault**, a secure managed configuration service for BSB.
4
+
5
+ It contains two plugins:
6
+
7
+ - `service-config-vault`: h3 + Postgres admin UI/API.
8
+ - `config-vault`: BSB config plugin that loads the latest active published config from Vault.
9
+
10
+ Runtime containers do not choose applications, groups, profiles, or versions. The Vault API key is bound server-side to an application, service group, deployment profile, and config plugin id.
11
+
12
+ ## Runtime
13
+
14
+ ```yaml
15
+ config-vault:
16
+ plugin: config-vault
17
+ package: "@bsb/config-vault"
18
+ enabled: true
19
+ config:
20
+ vaultUrl: https://vault.example.com
21
+ apiKeyId: vk_xxx
22
+ apiSecret: vs_xxx
23
+ ```
24
+
25
+ When a container restarts, it pulls the active published version for the API key's bound deployment profile.
26
+
27
+ ## Service
28
+
29
+ ```yaml
30
+ service-config-vault:
31
+ plugin: service-config-vault
32
+ package: "@bsb/config-vault"
33
+ enabled: true
34
+ config:
35
+ host: 0.0.0.0
36
+ port: 8080
37
+ publicUrl: https://vault.example.com
38
+ production: true
39
+ databaseUrl: postgres://vault:secret@postgres:5432/vault
40
+ masterKey: BASE64_32_BYTE_KEY
41
+ ```
42
+
43
+ `masterKey` must be a base64 encoded 32-byte key. Generate one with:
44
+
45
+ ```bash
46
+ node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
47
+ ```
48
+
49
+ Keep the value stable. If the key changes, Vault cannot decrypt configs already stored in Postgres.
@@ -0,0 +1,40 @@
1
+ {
2
+ "nodejs": [
3
+ {
4
+ "id": "config-vault",
5
+ "name": "config-vault",
6
+ "basePath": "./",
7
+ "description": "Managed BSB config plugin that loads latest active config from Vault",
8
+ "tags": [
9
+ "vault",
10
+ "config",
11
+ "managed",
12
+ "runtime"
13
+ ],
14
+ "documentation": [
15
+ "./docs/config-vault.md"
16
+ ],
17
+ "pluginPath": "src/plugins/config-vault/",
18
+ "image": "../../../docs/public/assets/images/bsb-logo.png"
19
+ },
20
+ {
21
+ "id": "service-config-vault",
22
+ "name": "Vault",
23
+ "basePath": "./",
24
+ "description": "Secure BSB managed configuration service with Postgres, admin UI, plugin catalog, and runtime API keys",
25
+ "tags": [
26
+ "vault",
27
+ "config",
28
+ "security",
29
+ "postgres",
30
+ "h3",
31
+ "admin-ui"
32
+ ],
33
+ "documentation": [
34
+ "./docs/service-config-vault.md"
35
+ ],
36
+ "pluginPath": "src/plugins/service-config-vault/",
37
+ "image": "../../../docs/public/assets/images/bsb-logo.png"
38
+ }
39
+ ]
40
+ }
package/lib/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ import * as av from 'anyvali';
2
+ import { BSBConfig, type BSBConfigConstructor, type EventsConfig, type Observable, type ObservableConfig, type PluginDefinition, type PluginType } from '@bsb/base';
3
+ export declare const Config: import("@bsb/base").BSBPluginConfigClass<av.ObjectSchema<{
4
+ vaultUrl: av.StringSchema;
5
+ apiKeyId: av.StringSchema;
6
+ apiSecret: av.StringSchema;
7
+ timeoutMs: av.Int32Schema;
8
+ allowInsecureHttp: av.BoolSchema;
9
+ }>>;
10
+ export declare class Plugin extends BSBConfig<InstanceType<typeof Config>> {
11
+ static Config: import("@bsb/base").BSBPluginConfigClass<av.ObjectSchema<{
12
+ vaultUrl: av.StringSchema;
13
+ apiKeyId: av.StringSchema;
14
+ apiSecret: av.StringSchema;
15
+ timeoutMs: av.Int32Schema;
16
+ allowInsecureHttp: av.BoolSchema;
17
+ }>>;
18
+ private appConfig;
19
+ private deploymentProfile;
20
+ constructor(config: BSBConfigConstructor<InstanceType<typeof Config>>);
21
+ init(obs: Observable): Promise<void>;
22
+ getServicePluginDefinition(obs: Observable, pluginName: string): Promise<{
23
+ name: string;
24
+ enabled: boolean;
25
+ }>;
26
+ getObservablePlugins(_obs: Observable): Promise<Record<string, ObservableConfig>>;
27
+ getEventsPlugins(_obs: Observable): Promise<Record<string, EventsConfig>>;
28
+ getServicePlugins(obs: Observable): Promise<Record<string, PluginDefinition>>;
29
+ getPluginConfig(_obs: Observable, pluginType: PluginType, plugin: string): Promise<object | null>;
30
+ getPlugins(): Promise<{
31
+ npmPackage: string | undefined | null;
32
+ plugin: string;
33
+ name: string;
34
+ enabled: boolean;
35
+ }[]>;
36
+ dispose(): void;
37
+ private getRequiredServices;
38
+ }
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/config-vault/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EACL,SAAS,EACT,KAAK,oBAAoB,EAEzB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAIhB,MAAM,WAAW,CAAC;AAWnB,eAAO,MAAM,MAAM;;;;;;GASlB,CAAC;AAUF,qBAAa,MAAO,SAAQ,SAAS,CAAC,YAAY,CAAC,OAAO,MAAM,CAAC,CAAC;IAChE,MAAM,CAAC,MAAM;;;;;;QAAU;IAEvB,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,iBAAiB,CAAa;gBAE1B,MAAM,EAAE,oBAAoB,CAAC,YAAY,CAAC,OAAO,MAAM,CAAC,CAAC;IAI/D,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA0DpC,0BAA0B,CAC9B,GAAG,EAAE,UAAU,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAexC,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAIjF,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAIzE,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAI7E,eAAe,CACnB,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASnB,UAAU,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAUxH,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,mBAAmB;CAY5B"}
@@ -0,0 +1,175 @@
1
+ import * as av from 'anyvali';
2
+ import { BSBConfig, BSBError, PluginTypes, Tools, createConfigSchema, } from '@bsb/base';
3
+ const ConfigSchema = av.object({
4
+ vaultUrl: av.string().minLength(1).describe('Vault service base URL'),
5
+ apiKeyId: av.string().minLength(1).describe('Vault runtime API key id'),
6
+ apiSecret: av.string().minLength(1).describe('Vault runtime API secret'),
7
+ timeoutMs: av.int32().min(1000).default(5000).describe('Vault HTTP request timeout in milliseconds'),
8
+ allowInsecureHttp: av.bool().default(false).describe('Allow http:// Vault URLs for local development only'),
9
+ }).describe('Vault config plugin settings');
10
+ export const Config = createConfigSchema({
11
+ name: 'config-vault',
12
+ description: 'Managed BSB config plugin that loads latest active config from Vault',
13
+ image: '../../../docs/public/assets/images/bsb-logo.png',
14
+ tags: ['vault', 'config', 'managed', 'runtime'],
15
+ documentation: ['./docs/config-vault.md'],
16
+ }, ConfigSchema);
17
+ export class Plugin extends BSBConfig {
18
+ static Config = Config;
19
+ appConfig;
20
+ deploymentProfile = 'default';
21
+ constructor(config) {
22
+ super(config);
23
+ }
24
+ async init(obs) {
25
+ const url = new URL('/runtime/config', this.config.vaultUrl);
26
+ if (url.protocol !== 'https:' && !this.config.allowInsecureHttp) {
27
+ throw new BSBError(obs.trace, 'config-vault requires https Vault URLs unless allowInsecureHttp is true');
28
+ }
29
+ const controller = new AbortController();
30
+ const timeout = setTimeout(() => controller.abort(), this.config.timeoutMs);
31
+ let response;
32
+ try {
33
+ response = await fetch(url, {
34
+ method: 'GET',
35
+ headers: {
36
+ 'x-vault-key-id': this.config.apiKeyId,
37
+ 'x-vault-secret': this.config.apiSecret,
38
+ },
39
+ signal: controller.signal,
40
+ });
41
+ }
42
+ catch (error) {
43
+ throw new BSBError(obs.trace, 'Failed to fetch Vault config: {error}', {
44
+ error: error instanceof Error ? error.message : String(error),
45
+ });
46
+ }
47
+ finally {
48
+ clearTimeout(timeout);
49
+ }
50
+ if (!response.ok) {
51
+ throw new BSBError(obs.trace, 'Vault config fetch failed with HTTP {status}', {
52
+ status: response.status,
53
+ });
54
+ }
55
+ const parsed = await response.json();
56
+ const resolved = parseRuntimeResolve(parsed, obs);
57
+ this.deploymentProfile = resolved.profile;
58
+ this.appConfig = resolved.config;
59
+ if (Tools.isNullOrUndefined(this.appConfig[this.deploymentProfile])) {
60
+ throw new BSBError(obs.trace, 'Vault returned no config for deployment profile ({deploymentProfile})', {
61
+ deploymentProfile: this.deploymentProfile,
62
+ });
63
+ }
64
+ this.appConfig[this.deploymentProfile] = {
65
+ observable: {},
66
+ events: {},
67
+ services: {},
68
+ ...this.appConfig[this.deploymentProfile],
69
+ };
70
+ this.getRequiredServices(obs);
71
+ obs.log.info('Loaded Vault config {application}/{group}/{profile}@{version}', {
72
+ application: resolved.application,
73
+ group: resolved.group,
74
+ profile: resolved.profile,
75
+ version: resolved.version,
76
+ });
77
+ }
78
+ async getServicePluginDefinition(obs, pluginName) {
79
+ const services = this.appConfig[this.deploymentProfile].services ?? {};
80
+ const keydWithMap = Object.keys(services).map((key) => ({
81
+ mappedName: key,
82
+ ...services[key],
83
+ }));
84
+ const enabledPlugin = keydWithMap.find((plugin) => plugin.plugin === pluginName && plugin.enabled === true);
85
+ if (enabledPlugin)
86
+ return { name: enabledPlugin.mappedName, enabled: enabledPlugin.enabled };
87
+ const plugin = keydWithMap.find((item) => item.plugin === pluginName);
88
+ if (plugin)
89
+ return { name: plugin.mappedName, enabled: plugin.enabled };
90
+ throw new BSBError(obs.trace, 'Cannot find the plugin {plugin} in the Vault config', {
91
+ plugin: pluginName,
92
+ });
93
+ }
94
+ async getObservablePlugins(_obs) {
95
+ return mapEnabledPlugins(this.appConfig[this.deploymentProfile].observable ?? {});
96
+ }
97
+ async getEventsPlugins(_obs) {
98
+ return mapEnabledPlugins(this.appConfig[this.deploymentProfile].events ?? {});
99
+ }
100
+ async getServicePlugins(obs) {
101
+ return mapEnabledPlugins(this.getRequiredServices(obs));
102
+ }
103
+ async getPluginConfig(_obs, pluginType, plugin) {
104
+ if (pluginType === PluginTypes.config)
105
+ return null;
106
+ let configKey = 'services';
107
+ if (pluginType === PluginTypes.events)
108
+ configKey = 'events';
109
+ if (pluginType === PluginTypes.observable)
110
+ configKey = 'observable';
111
+ const pluginConfig = this.appConfig[this.deploymentProfile][configKey]?.[plugin]?.config;
112
+ return Tools.isNullOrUndefined(pluginConfig) ? {} : pluginConfig;
113
+ }
114
+ async getPlugins() {
115
+ const services = this.getRequiredServices();
116
+ return Object.keys(services).map((name) => ({
117
+ npmPackage: services[name].package,
118
+ plugin: services[name].plugin,
119
+ name,
120
+ enabled: services[name].enabled === true,
121
+ }));
122
+ }
123
+ dispose() {
124
+ this.appConfig = undefined;
125
+ }
126
+ getRequiredServices(obs) {
127
+ const services = this.appConfig[this.deploymentProfile].services ?? {};
128
+ const enabledServices = Object.keys(services).filter((key) => services[key].enabled === true);
129
+ if (enabledServices.length === 0) {
130
+ const message = 'No enabled service plugins found in Vault deployment profile ({deploymentProfile}); at least one service is required.';
131
+ if (obs) {
132
+ throw new BSBError(obs.trace, message, { deploymentProfile: this.deploymentProfile });
133
+ }
134
+ throw new Error(message.replace('{deploymentProfile}', this.deploymentProfile));
135
+ }
136
+ return services;
137
+ }
138
+ }
139
+ function mapEnabledPlugins(plugins) {
140
+ return Object.keys(plugins)
141
+ .filter((key) => plugins[key].enabled === true)
142
+ .reduce((acc, key) => {
143
+ acc[key] = {
144
+ version: plugins[key].version,
145
+ plugin: plugins[key].plugin,
146
+ package: plugins[key].package,
147
+ enabled: plugins[key].enabled,
148
+ filter: plugins[key].filter,
149
+ };
150
+ return acc;
151
+ }, {});
152
+ }
153
+ function parseRuntimeResolve(input, obs) {
154
+ if (typeof input !== 'object' || input === null || Array.isArray(input)) {
155
+ throw new BSBError(obs.trace, 'Invalid Vault response: expected object');
156
+ }
157
+ const value = input;
158
+ if (typeof value.profile !== 'string' || typeof value.application !== 'string' || typeof value.group !== 'string') {
159
+ throw new BSBError(obs.trace, 'Invalid Vault response: missing application, group, or profile');
160
+ }
161
+ if (typeof value.version !== 'number') {
162
+ throw new BSBError(obs.trace, 'Invalid Vault response: missing numeric version');
163
+ }
164
+ if (typeof value.config !== 'object' || value.config === null || Array.isArray(value.config)) {
165
+ throw new BSBError(obs.trace, 'Invalid Vault response: missing config object');
166
+ }
167
+ return {
168
+ application: value.application,
169
+ group: value.group,
170
+ profile: value.profile,
171
+ version: value.version,
172
+ config: value.config,
173
+ };
174
+ }
175
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/config-vault/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface EncryptedPayload {
2
+ encryptedPayload: string;
3
+ iv: string;
4
+ authTag: string;
5
+ keyVersion: string;
6
+ }
7
+ export declare function newId(): string;
8
+ export declare function newToken(bytes?: number): string;
9
+ export declare function loadMasterKey(raw: string): Buffer;
10
+ export declare function hashSecret(secret: string): Promise<string>;
11
+ export declare function verifySecret(secret: string, hash: string): Promise<boolean>;
12
+ export declare function encryptJson(value: unknown, key: Buffer, keyVersion?: string): EncryptedPayload;
13
+ export declare function decryptJson<T>(payload: EncryptedPayload, key: Buffer): T;
14
+ export declare function createTotpSecret(): string;
15
+ export declare function verifyTotp(secret: string, code: string, now?: number): boolean;
16
+ export declare function generateTotp(secret: string, step?: number): string;
17
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-config-vault/crypto.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAED,wBAAgB,QAAQ,CAAC,KAAK,SAAK,GAAG,MAAM,CAE3C;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIhE;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOjF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,SAAO,GAAG,gBAAgB,CAa5F;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,CAQxE;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,OAAO,CAKlF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,SAAiC,GAAG,MAAM,CAW1F"}
@@ -0,0 +1,76 @@
1
+ import { createCipheriv, createDecipheriv, randomBytes, randomUUID, scrypt as scryptCb, timingSafeEqual, createHmac } from 'node:crypto';
2
+ import { promisify } from 'node:util';
3
+ const scrypt = promisify(scryptCb);
4
+ export function newId() {
5
+ return randomUUID();
6
+ }
7
+ export function newToken(bytes = 32) {
8
+ return randomBytes(bytes).toString('base64url');
9
+ }
10
+ export function loadMasterKey(raw) {
11
+ const key = Buffer.from(raw, 'base64');
12
+ if (key.length !== 32) {
13
+ throw new Error('CONFIG_VAULT_MASTER_KEY must be a base64 encoded 32-byte key');
14
+ }
15
+ return key;
16
+ }
17
+ export async function hashSecret(secret) {
18
+ const salt = randomBytes(16);
19
+ const derived = await scrypt(secret, salt, 64);
20
+ return `scrypt$${salt.toString('base64url')}$${derived.toString('base64url')}`;
21
+ }
22
+ export async function verifySecret(secret, hash) {
23
+ const parts = hash.split('$');
24
+ if (parts.length !== 3 || parts[0] !== 'scrypt')
25
+ return false;
26
+ const salt = Buffer.from(parts[1], 'base64url');
27
+ const expected = Buffer.from(parts[2], 'base64url');
28
+ const actual = await scrypt(secret, salt, expected.length);
29
+ return actual.length === expected.length && timingSafeEqual(actual, expected);
30
+ }
31
+ export function encryptJson(value, key, keyVersion = 'v1') {
32
+ const iv = randomBytes(12);
33
+ const cipher = createCipheriv('aes-256-gcm', key, iv);
34
+ const encrypted = Buffer.concat([
35
+ cipher.update(JSON.stringify(value), 'utf8'),
36
+ cipher.final(),
37
+ ]);
38
+ return {
39
+ encryptedPayload: encrypted.toString('base64url'),
40
+ iv: iv.toString('base64url'),
41
+ authTag: cipher.getAuthTag().toString('base64url'),
42
+ keyVersion,
43
+ };
44
+ }
45
+ export function decryptJson(payload, key) {
46
+ const decipher = createDecipheriv('aes-256-gcm', key, Buffer.from(payload.iv, 'base64url'));
47
+ decipher.setAuthTag(Buffer.from(payload.authTag, 'base64url'));
48
+ const decrypted = Buffer.concat([
49
+ decipher.update(Buffer.from(payload.encryptedPayload, 'base64url')),
50
+ decipher.final(),
51
+ ]);
52
+ return JSON.parse(decrypted.toString('utf8'));
53
+ }
54
+ export function createTotpSecret() {
55
+ return randomBytes(20).toString('base64url');
56
+ }
57
+ export function verifyTotp(secret, code, now = Date.now()) {
58
+ const cleaned = code.replace(/\s+/g, '');
59
+ if (!/^\d{6}$/.test(cleaned))
60
+ return false;
61
+ const step = Math.floor(now / 30000);
62
+ return [-1, 0, 1].some((offset) => generateTotp(secret, step + offset) === cleaned);
63
+ }
64
+ export function generateTotp(secret, step = Math.floor(Date.now() / 30000)) {
65
+ const key = Buffer.from(secret, 'base64url');
66
+ const counter = Buffer.alloc(8);
67
+ counter.writeBigInt64BE(BigInt(step));
68
+ const hmac = createHmac('sha1', key).update(counter).digest();
69
+ const offset = hmac[hmac.length - 1] & 0xf;
70
+ const value = ((hmac[offset] & 0x7f) << 24)
71
+ | ((hmac[offset + 1] & 0xff) << 16)
72
+ | ((hmac[offset + 2] & 0xff) << 8)
73
+ | (hmac[offset + 3] & 0xff);
74
+ return String(value % 1_000_000).padStart(6, '0');
75
+ }
76
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../src/plugins/service-config-vault/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,IAAI,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzI,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AASnC,MAAM,UAAU,KAAK;IACnB,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAK,GAAG,EAAE;IACjC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACvC,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc;IAC7C,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAW,CAAC;IACzD,OAAO,UAAU,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc,EAAE,IAAY;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAW,CAAC;IACrE,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,GAAW,EAAE,UAAU,GAAG,IAAI;IACxE,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAC5C,MAAM,CAAC,KAAK,EAAE;KACf,CAAC,CAAC;IACH,OAAO;QACL,gBAAgB,EAAE,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;QACjD,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;QAClD,UAAU;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAI,OAAyB,EAAE,GAAW;IACnE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;IAC5F,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;QACnE,QAAQ,CAAC,KAAK,EAAE;KACjB,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAM,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,IAAY,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACvE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,KAAK,OAAO,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IAChF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;IAC3C,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;UACvC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;UACjC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;UAChC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { Observable } from '@bsb/base';
2
+ import type { VaultService } from './vault.js';
3
+ export interface VaultHttpOptions {
4
+ host: string;
5
+ port: number;
6
+ publicUrl: string;
7
+ production: boolean;
8
+ obs: Observable;
9
+ vault: VaultService;
10
+ }
11
+ export declare class VaultHttpServer {
12
+ private readonly options;
13
+ private server?;
14
+ constructor(options: VaultHttpOptions);
15
+ start(): Promise<void>;
16
+ stop(): Promise<void>;
17
+ private requireUser;
18
+ private page;
19
+ }
20
+ //# sourceMappingURL=http-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-config-vault/http-server.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE,UAAU,CAAC;IAChB,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,OAAO,EAAE,gBAAgB;IAI/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2ItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAUb,WAAW;IAUzB,OAAO,CAAC,IAAI;CAGb"}