@kibibit/configit 1.0.0-beta.25 → 1.0.0-beta.27

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 (98) hide show
  1. package/README.md +419 -0
  2. package/lib/scripts/test-vault-comprehensive.d.ts +2 -0
  3. package/lib/scripts/test-vault-comprehensive.d.ts.map +1 -0
  4. package/lib/scripts/test-vault-comprehensive.js +422 -0
  5. package/lib/scripts/test-vault-comprehensive.js.map +1 -0
  6. package/lib/scripts/test-vault-dynamic.d.ts +2 -0
  7. package/lib/scripts/test-vault-dynamic.d.ts.map +1 -0
  8. package/lib/scripts/test-vault-dynamic.js +193 -0
  9. package/lib/scripts/test-vault-dynamic.js.map +1 -0
  10. package/lib/scripts/test-vault-gcp-ttl.d.ts +3 -0
  11. package/lib/scripts/test-vault-gcp-ttl.d.ts.map +1 -0
  12. package/lib/scripts/test-vault-gcp-ttl.js +218 -0
  13. package/lib/scripts/test-vault-gcp-ttl.js.map +1 -0
  14. package/lib/scripts/test-vault.d.ts +2 -0
  15. package/lib/scripts/test-vault.d.ts.map +1 -0
  16. package/lib/scripts/test-vault.js +167 -0
  17. package/lib/scripts/test-vault.js.map +1 -0
  18. package/lib/src/config.errors.d.ts.map +1 -0
  19. package/lib/src/config.errors.js.map +1 -0
  20. package/lib/src/config.model.d.ts.map +1 -0
  21. package/lib/src/config.model.js.map +1 -0
  22. package/lib/{config.service.d.ts → src/config.service.d.ts} +10 -1
  23. package/lib/src/config.service.d.ts.map +1 -0
  24. package/lib/{config.service.js → src/config.service.js} +75 -9
  25. package/lib/src/config.service.js.map +1 -0
  26. package/lib/src/environment.service.d.ts.map +1 -0
  27. package/lib/src/environment.service.js.map +1 -0
  28. package/lib/{index.d.ts → src/index.d.ts} +1 -0
  29. package/lib/src/index.d.ts.map +1 -0
  30. package/lib/{index.js → src/index.js} +1 -0
  31. package/lib/src/index.js.map +1 -0
  32. package/lib/src/json-schema.validator.d.ts.map +1 -0
  33. package/lib/src/json-schema.validator.js.map +1 -0
  34. package/lib/src/vault/__tests__/vault-integration.test.d.ts +2 -0
  35. package/lib/src/vault/__tests__/vault-integration.test.d.ts.map +1 -0
  36. package/lib/src/vault/__tests__/vault-integration.test.js +190 -0
  37. package/lib/src/vault/__tests__/vault-integration.test.js.map +1 -0
  38. package/lib/src/vault/decorators.d.ts +17 -0
  39. package/lib/src/vault/decorators.d.ts.map +1 -0
  40. package/lib/src/vault/decorators.js +149 -0
  41. package/lib/src/vault/decorators.js.map +1 -0
  42. package/lib/src/vault/index.d.ts +7 -0
  43. package/lib/src/vault/index.d.ts.map +1 -0
  44. package/lib/src/vault/index.js +42 -0
  45. package/lib/src/vault/index.js.map +1 -0
  46. package/lib/src/vault/secret-refresh-manager.d.ts +23 -0
  47. package/lib/src/vault/secret-refresh-manager.d.ts.map +1 -0
  48. package/lib/src/vault/secret-refresh-manager.js +149 -0
  49. package/lib/src/vault/secret-refresh-manager.js.map +1 -0
  50. package/lib/src/vault/types.d.ts +149 -0
  51. package/lib/src/vault/types.d.ts.map +1 -0
  52. package/lib/src/vault/types.js +4 -0
  53. package/lib/src/vault/types.js.map +1 -0
  54. package/lib/src/vault/vault-cache.d.ts +20 -0
  55. package/lib/src/vault/vault-cache.d.ts.map +1 -0
  56. package/lib/src/vault/vault-cache.js +139 -0
  57. package/lib/src/vault/vault-cache.js.map +1 -0
  58. package/lib/src/vault/vault-integration.d.ts +27 -0
  59. package/lib/src/vault/vault-integration.d.ts.map +1 -0
  60. package/lib/src/vault/vault-integration.js +211 -0
  61. package/lib/src/vault/vault-integration.js.map +1 -0
  62. package/lib/src/vault/vault-provider.d.ts +37 -0
  63. package/lib/src/vault/vault-provider.d.ts.map +1 -0
  64. package/lib/src/vault/vault-provider.js +354 -0
  65. package/lib/src/vault/vault-provider.js.map +1 -0
  66. package/lib/tsconfig.tsbuildinfo +1 -1
  67. package/package.json +14 -74
  68. package/src/config.service.ts +155 -10
  69. package/src/config.service.vault.spec.ts +859 -0
  70. package/src/index.ts +1 -0
  71. package/src/vault/__tests__/vault-integration.test.ts +226 -0
  72. package/src/vault/decorators.ts +228 -0
  73. package/src/vault/index.ts +31 -0
  74. package/src/vault/secret-refresh-manager.ts +241 -0
  75. package/src/vault/types.ts +487 -0
  76. package/src/vault/vault-cache.ts +240 -0
  77. package/src/vault/vault-integration.ts +332 -0
  78. package/src/vault/vault-provider.ts +576 -0
  79. package/lib/config.errors.d.ts.map +0 -1
  80. package/lib/config.errors.js.map +0 -1
  81. package/lib/config.model.d.ts.map +0 -1
  82. package/lib/config.model.js.map +0 -1
  83. package/lib/config.service.d.ts.map +0 -1
  84. package/lib/config.service.js.map +0 -1
  85. package/lib/environment.service.d.ts.map +0 -1
  86. package/lib/environment.service.js.map +0 -1
  87. package/lib/index.d.ts.map +0 -1
  88. package/lib/index.js.map +0 -1
  89. package/lib/json-schema.validator.d.ts.map +0 -1
  90. package/lib/json-schema.validator.js.map +0 -1
  91. /package/lib/{config.errors.d.ts → src/config.errors.d.ts} +0 -0
  92. /package/lib/{config.errors.js → src/config.errors.js} +0 -0
  93. /package/lib/{config.model.d.ts → src/config.model.d.ts} +0 -0
  94. /package/lib/{config.model.js → src/config.model.js} +0 -0
  95. /package/lib/{environment.service.d.ts → src/environment.service.d.ts} +0 -0
  96. /package/lib/{environment.service.js → src/environment.service.js} +0 -0
  97. /package/lib/{json-schema.validator.d.ts → src/json-schema.validator.d.ts} +0 -0
  98. /package/lib/{json-schema.validator.js → src/json-schema.validator.js} +0 -0
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VaultIntegration = void 0;
4
+ const decorators_1 = require("./decorators");
5
+ const secret_refresh_manager_1 = require("./secret-refresh-manager");
6
+ const vault_cache_1 = require("./vault-cache");
7
+ const vault_provider_1 = require("./vault-provider");
8
+ class VaultIntegration {
9
+ constructor(config) {
10
+ this.initialized = false;
11
+ this.errors = [];
12
+ this.config = config;
13
+ this.provider = new vault_provider_1.VaultProvider(config);
14
+ this.cache = new vault_cache_1.VaultCache();
15
+ const refreshBuffer = config.refreshBuffer || 300;
16
+ this.refreshManager = new secret_refresh_manager_1.SecretRefreshManager(this.provider, this.cache, refreshBuffer);
17
+ }
18
+ async initialize() {
19
+ if (this.initialized) {
20
+ return;
21
+ }
22
+ try {
23
+ await this.provider.initialize();
24
+ this.initialized = true;
25
+ }
26
+ catch (error) {
27
+ const errorMessage = (error === null || error === void 0 ? void 0 : error.message) || 'Unknown error';
28
+ this.recordError('', this.sanitizeError(errorMessage), false);
29
+ throw error;
30
+ }
31
+ }
32
+ async loadSecrets(configOrClass) {
33
+ var _a;
34
+ if (!this.initialized) {
35
+ throw new Error('VaultIntegration not initialized. Call initialize() first.');
36
+ }
37
+ const isClass = typeof configOrClass === 'function';
38
+ const targetClass = isClass ? configOrClass : configOrClass.constructor;
39
+ const targetInstance = isClass ? null : configOrClass;
40
+ const vaultMetadata = (0, decorators_1.getAllVaultMetadata)(targetClass);
41
+ if (Object.keys(vaultMetadata).length === 0) {
42
+ return;
43
+ }
44
+ const pathGroups = this.groupByFullPath(vaultMetadata);
45
+ for (const [fullPath, properties] of pathGroups.entries()) {
46
+ try {
47
+ const secret = await this.provider.read(fullPath);
48
+ for (const property of properties) {
49
+ const propertyWithDefaults = Object.assign(Object.assign({}, property), { refreshBuffer: (_a = property.refreshBuffer) !== null && _a !== void 0 ? _a : this.config.refreshBuffer });
50
+ this.cache.set(property.propertyName, fullPath, secret, propertyWithDefaults);
51
+ if (targetInstance) {
52
+ const key = property.key || property.propertyName;
53
+ const value = secret.data[key];
54
+ targetInstance[property.propertyName] = value;
55
+ }
56
+ if (secret.leaseDuration > 0) {
57
+ this.refreshManager.scheduleRefresh(property.propertyName, propertyWithDefaults, targetInstance);
58
+ }
59
+ }
60
+ }
61
+ catch (error) {
62
+ const errorMessage = (error === null || error === void 0 ? void 0 : error.message) || 'Unknown error';
63
+ const sanitizedError = this.sanitizeError(errorMessage);
64
+ this.recordError(fullPath, sanitizedError, this.isRetryableError(error));
65
+ const fallback = this.config.fallback;
66
+ if ((fallback === null || fallback === void 0 ? void 0 : fallback.required) !== false) {
67
+ throw new Error(`Failed to load required secret from ${this.sanitizePath(fullPath)}: ${sanitizedError}`);
68
+ }
69
+ console.warn(`Failed to load optional secret from ${this.sanitizePath(fullPath)}: ${sanitizedError}`);
70
+ }
71
+ }
72
+ }
73
+ getSecret(propertyName) {
74
+ return this.cache.get(propertyName);
75
+ }
76
+ isInitialized() {
77
+ return this.initialized;
78
+ }
79
+ getHealth() {
80
+ const refreshStatus = this.refreshManager.getRefreshStatus();
81
+ const lastRefreshTime = refreshStatus.length > 0 ?
82
+ Math.max(...refreshStatus.map((s) => s.lastRefresh)) :
83
+ 0;
84
+ return {
85
+ connected: this.initialized && this.provider.isAuthenticated(),
86
+ authenticated: this.provider.isAuthenticated(),
87
+ cacheSize: this.cache.size(),
88
+ refreshQueueSize: refreshStatus.filter((s) => s.scheduled).length,
89
+ lastRefreshTime,
90
+ errors: this.errors.slice(-10)
91
+ };
92
+ }
93
+ getHealthDetails() {
94
+ const refreshStatus = this.refreshManager.getRefreshStatus();
95
+ return {
96
+ connected: this.initialized && this.provider.isAuthenticated(),
97
+ authenticated: this.provider.isAuthenticated(),
98
+ cacheSize: this.cache.size(),
99
+ refreshQueueSize: refreshStatus.filter((s) => s.scheduled).length,
100
+ lastRefreshTime: refreshStatus.length > 0 ?
101
+ Math.max(...refreshStatus.map((s) => s.lastRefresh)) :
102
+ 0,
103
+ errors: this.errors.slice(-10),
104
+ refreshStatus
105
+ };
106
+ }
107
+ invalidateCache(vaultPath) {
108
+ this.cache.invalidate(vaultPath);
109
+ const properties = this.cache.getPropertiesForPath(vaultPath);
110
+ for (const propertyName of properties) {
111
+ this.refreshManager.cancelRefresh(propertyName);
112
+ }
113
+ }
114
+ invalidateProperty(propertyName) {
115
+ this.cache.invalidateProperty(propertyName);
116
+ this.refreshManager.cancelRefresh(propertyName);
117
+ }
118
+ shutdown() {
119
+ this.refreshManager.shutdown();
120
+ this.cache.clear();
121
+ this.initialized = false;
122
+ }
123
+ groupByPath(metadata) {
124
+ const groups = new Map();
125
+ for (const property of Object.values(metadata)) {
126
+ const path = property.path;
127
+ if (!groups.has(path)) {
128
+ groups.set(path, []);
129
+ }
130
+ groups.get(path).push(property);
131
+ }
132
+ return groups;
133
+ }
134
+ groupByFullPath(metadata) {
135
+ const groups = new Map();
136
+ for (const property of Object.values(metadata)) {
137
+ const fullPath = this.constructFullPath(property.path, property.engine);
138
+ if (!groups.has(fullPath)) {
139
+ groups.set(fullPath, []);
140
+ }
141
+ groups.get(fullPath).push(property);
142
+ }
143
+ return groups;
144
+ }
145
+ constructFullPath(path, engine) {
146
+ switch (engine) {
147
+ case 'kv1':
148
+ case 'kv-v1':
149
+ return `secret/${path}`;
150
+ case 'kv2':
151
+ case 'kv-v2':
152
+ return `secret/data/${path}`;
153
+ case 'database':
154
+ return path.startsWith('database/') ? path : `database/${path}`;
155
+ default:
156
+ return path;
157
+ }
158
+ }
159
+ recordError(path, error, retryable) {
160
+ this.errors.push({
161
+ timestamp: Date.now(),
162
+ path: this.sanitizePath(path),
163
+ error,
164
+ retryable
165
+ });
166
+ if (this.errors.length > 100) {
167
+ this.errors.shift();
168
+ }
169
+ }
170
+ isRetryableError(error) {
171
+ var _a;
172
+ const errorMessage = (error === null || error === void 0 ? void 0 : error.message) || '';
173
+ const errorCode = (error === null || error === void 0 ? void 0 : error.code) || '';
174
+ const statusCode = (error === null || error === void 0 ? void 0 : error.statusCode) || ((_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.statusCode);
175
+ const retryablePatterns = ['ECONNREFUSED', 'ETIMEDOUT', 'ENOTFOUND', '5xx'];
176
+ for (const pattern of retryablePatterns) {
177
+ if (pattern.includes('xx') && statusCode) {
178
+ const codePrefix = parseInt(pattern[0]);
179
+ const statusPrefix = Math.floor(statusCode / 100);
180
+ if (statusPrefix === codePrefix) {
181
+ return true;
182
+ }
183
+ }
184
+ else if (errorMessage.includes(pattern) || errorCode.includes(pattern)) {
185
+ return true;
186
+ }
187
+ }
188
+ return false;
189
+ }
190
+ sanitizeError(message) {
191
+ const sensitivePatterns = [/password/i, /secret/i, /key/i, /token/i, /credential/i];
192
+ let sanitized = message;
193
+ sensitivePatterns.forEach((pattern) => {
194
+ sanitized = sanitized.replace(new RegExp(`${pattern.source}[:=]\\s*[^\\s,}]+`, 'gi'), `${pattern.source}: ***`);
195
+ });
196
+ return sanitized;
197
+ }
198
+ sanitizePath(path) {
199
+ const segments = path.split('/');
200
+ if (segments.length > 0) {
201
+ const lastSegment = segments[segments.length - 1];
202
+ const sensitivePatterns = [/password/i, /secret/i, /key/i, /token/i, /credential/i];
203
+ if (sensitivePatterns.some((pattern) => pattern.test(lastSegment))) {
204
+ segments[segments.length - 1] = '***';
205
+ }
206
+ }
207
+ return segments.join('/');
208
+ }
209
+ }
210
+ exports.VaultIntegration = VaultIntegration;
211
+ //# sourceMappingURL=vault-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-integration.js","sourceRoot":"","sources":["../../../src/vault/vault-integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { IVaultConfigOptions, IVaultSecret, VaultEngineType } from './types';
2
+ export declare class VaultProvider {
3
+ private client;
4
+ private config;
5
+ private currentToken;
6
+ private tokenExpiry;
7
+ private retryPolicy;
8
+ private isConnected;
9
+ constructor(config: IVaultConfigOptions);
10
+ initialize(): Promise<void>;
11
+ connect(): Promise<void>;
12
+ disconnect(): Promise<void>;
13
+ connected(): boolean;
14
+ isTokenExpired(): boolean;
15
+ ensureAuthenticated(): Promise<void>;
16
+ readSecret(path: string, engine?: VaultEngineType): Promise<IVaultSecret>;
17
+ private validateTLS;
18
+ private authenticate;
19
+ private normalizeAuthConfig;
20
+ private authenticateWithMethod;
21
+ private authenticateGCP;
22
+ private signJwtWithGoogleIAM;
23
+ private authenticateAWS;
24
+ private authenticateAppRole;
25
+ private authenticateToken;
26
+ read(path: string): Promise<IVaultSecret>;
27
+ renewLease(leaseId: string, increment?: number): Promise<void>;
28
+ private normalizeSecretResponse;
29
+ private executeWithRetry;
30
+ private isRetryableError;
31
+ private calculateBackoff;
32
+ private sleep;
33
+ private sanitizePath;
34
+ getToken(): string | null;
35
+ isAuthenticated(): boolean;
36
+ }
37
+ //# sourceMappingURL=vault-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-provider.d.ts","sourceRoot":"","sources":["../../../src/vault/vault-provider.ts"],"names":[],"mappings":"AAQA,OAAO,EAOL,mBAAmB,EACnB,YAAY,EAEZ,eAAe,EAChB,MAAM,SAAS,CAAC;AAKjB,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,mBAAmB;IAiBjC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmC3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAOxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC,SAAS,IAAI,OAAO;IAOpB,cAAc,IAAI,OAAO;IAYnB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAYpC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,eAAuB,GAAG,OAAO,CAAC,YAAY,CAAC;IA2BtF,OAAO,CAAC,WAAW;YAoBL,YAAY;IA8B1B,OAAO,CAAC,mBAAmB;YA2Bb,sBAAsB;YAuBtB,eAAe;YAkEf,oBAAoB;IAiClC,OAAO,CAAC,eAAe;YAaT,mBAAmB;YA6BnB,iBAAiB;IAmBzB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAezC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpE,OAAO,CAAC,uBAAuB;YAgBjB,gBAAgB;IA+B9B,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,YAAY;IAiBpB,QAAQ,IAAI,MAAM,GAAG,IAAI;IAOzB,eAAe,IAAI,OAAO;CAG3B"}
@@ -0,0 +1,354 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.VaultProvider = void 0;
7
+ const google_auth_library_1 = require("google-auth-library");
8
+ const node_vault_1 = __importDefault(require("node-vault"));
9
+ class VaultProvider {
10
+ constructor(config) {
11
+ this.currentToken = null;
12
+ this.tokenExpiry = 0;
13
+ this.isConnected = false;
14
+ this.config = config;
15
+ this.retryPolicy = config.retry || {
16
+ maxAttempts: 3,
17
+ backoff: {
18
+ strategy: 'exponential',
19
+ initial: 1000,
20
+ max: 10000,
21
+ multiplier: 2
22
+ },
23
+ retryableErrors: ['ECONNREFUSED', 'ETIMEDOUT', 'ENOTFOUND', '5xx']
24
+ };
25
+ }
26
+ async initialize() {
27
+ this.validateTLS();
28
+ const vaultOptions = {
29
+ endpoint: this.config.endpoint,
30
+ apiVersion: 'v1'
31
+ };
32
+ if (this.config.tls) {
33
+ vaultOptions.requestOptions = Object.assign(Object.assign({}, vaultOptions.requestOptions), { rejectUnauthorized: this.config.tls.verifyCertificate !== false });
34
+ if (this.config.tls.caCert) {
35
+ vaultOptions.requestOptions = Object.assign(Object.assign({}, vaultOptions.requestOptions), { ca: this.config.tls.caCert });
36
+ }
37
+ }
38
+ this.client = (0, node_vault_1.default)(vaultOptions);
39
+ await this.authenticate();
40
+ this.isConnected = true;
41
+ }
42
+ async connect() {
43
+ await this.initialize();
44
+ }
45
+ async disconnect() {
46
+ this.currentToken = null;
47
+ this.tokenExpiry = 0;
48
+ this.isConnected = false;
49
+ }
50
+ connected() {
51
+ return this.isConnected && this.currentToken !== null;
52
+ }
53
+ isTokenExpired() {
54
+ if (this.tokenExpiry === 0) {
55
+ return false;
56
+ }
57
+ return Date.now() >= (this.tokenExpiry - 5000);
58
+ }
59
+ async ensureAuthenticated() {
60
+ if (!this.isConnected) {
61
+ throw new Error('Not connected to Vault');
62
+ }
63
+ if (this.isTokenExpired()) {
64
+ await this.authenticate();
65
+ }
66
+ }
67
+ async readSecret(path, engine = 'kv2') {
68
+ await this.ensureAuthenticated();
69
+ let fullPath;
70
+ switch (engine) {
71
+ case 'kv1':
72
+ case 'kv-v1':
73
+ fullPath = `secret/${path}`;
74
+ break;
75
+ case 'kv2':
76
+ case 'kv-v2':
77
+ fullPath = `secret/data/${path}`;
78
+ break;
79
+ case 'database':
80
+ fullPath = path.startsWith('database/') ? path : `database/${path}`;
81
+ break;
82
+ default:
83
+ fullPath = path;
84
+ }
85
+ return this.read(fullPath);
86
+ }
87
+ validateTLS() {
88
+ const tlsConfig = this.config.tls || { enabled: true, verifyCertificate: true };
89
+ const endpoint = this.config.endpoint.toLowerCase();
90
+ if (tlsConfig.enabled !== false) {
91
+ if (!endpoint.startsWith('https://') && !endpoint.startsWith('http://127.0.0.1') && !endpoint.startsWith('http://localhost')) {
92
+ throw new Error('TLS is required for Vault communication. Use HTTPS endpoint or set tls.enabled=false for local development only.');
93
+ }
94
+ }
95
+ if (endpoint.startsWith('http://')) {
96
+ console.warn('WARNING: Using HTTP for Vault connection. This should only be used for local development.');
97
+ }
98
+ }
99
+ async authenticate() {
100
+ const methods = this.normalizeAuthConfig();
101
+ if (methods.length === 0) {
102
+ throw new Error('No authentication methods configured');
103
+ }
104
+ const errors = [];
105
+ for (const method of methods) {
106
+ try {
107
+ await this.authenticateWithMethod(method);
108
+ return;
109
+ }
110
+ catch (error) {
111
+ errors.push(error);
112
+ }
113
+ }
114
+ const errorMessages = errors.map((e) => e.message).join('; ');
115
+ throw new Error(`All authentication methods failed: ${errorMessages}`);
116
+ }
117
+ normalizeAuthConfig() {
118
+ const auth = this.config.auth;
119
+ if (!auth) {
120
+ return [];
121
+ }
122
+ if ('methods' in auth && Array.isArray(auth.methods)) {
123
+ return auth.methods;
124
+ }
125
+ if ('method' in auth) {
126
+ const simpleAuth = auth;
127
+ return [{
128
+ type: simpleAuth.method,
129
+ config: auth
130
+ }];
131
+ }
132
+ return [];
133
+ }
134
+ async authenticateWithMethod(method) {
135
+ switch (method.type) {
136
+ case 'gcp':
137
+ await this.authenticateGCP(method.config);
138
+ break;
139
+ case 'aws':
140
+ await this.authenticateAWS(method.config);
141
+ break;
142
+ case 'approle':
143
+ await this.authenticateAppRole(method.config);
144
+ break;
145
+ case 'token':
146
+ await this.authenticateToken(method.config);
147
+ break;
148
+ default:
149
+ throw new Error(`Unsupported authentication method: ${method.type}`);
150
+ }
151
+ }
152
+ async authenticateGCP(config) {
153
+ var _a;
154
+ const { role, serviceAccountKeyFile, serviceAccountEmail } = config;
155
+ if (!role) {
156
+ throw new Error('GCP IAM authentication requires a role name');
157
+ }
158
+ try {
159
+ const auth = new google_auth_library_1.GoogleAuth({
160
+ keyFile: serviceAccountKeyFile,
161
+ scopes: ['https://www.googleapis.com/auth/cloud-platform']
162
+ });
163
+ const credentials = await auth.getCredentials();
164
+ const saEmail = serviceAccountEmail || credentials.client_email;
165
+ if (!saEmail) {
166
+ throw new Error('Could not determine service account email');
167
+ }
168
+ const now = Math.floor(Date.now() / 1000);
169
+ const expiry = config.jwtExpiration || 900;
170
+ const jwtClaims = {
171
+ aud: `vault/${role}`,
172
+ sub: saEmail,
173
+ iat: now,
174
+ exp: now + expiry
175
+ };
176
+ const signedJwt = await this.signJwtWithGoogleIAM(auth, saEmail, jwtClaims);
177
+ const response = await this.client.write('auth/gcp/login', {
178
+ role,
179
+ jwt: signedJwt
180
+ });
181
+ if (!((_a = response === null || response === void 0 ? void 0 : response.auth) === null || _a === void 0 ? void 0 : _a.client_token)) {
182
+ throw new Error('GCP IAM authentication failed: No token received');
183
+ }
184
+ this.currentToken = response.auth.client_token;
185
+ this.client.token = this.currentToken;
186
+ const tokenTTL = response.auth.lease_duration || 0;
187
+ if (tokenTTL > 0) {
188
+ this.tokenExpiry = Date.now() + (tokenTTL * 1000);
189
+ }
190
+ }
191
+ catch (error) {
192
+ const message = error.message || 'Unknown GCP auth error';
193
+ throw new Error(`GCP IAM authentication failed: ${message}`);
194
+ }
195
+ }
196
+ async signJwtWithGoogleIAM(auth, serviceAccountEmail, claims) {
197
+ const client = await auth.getClient();
198
+ const payload = JSON.stringify(claims);
199
+ const iamUrl = `https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/${serviceAccountEmail}:signJwt`;
200
+ const response = await client.request({
201
+ url: iamUrl,
202
+ method: 'POST',
203
+ data: { payload }
204
+ });
205
+ const signedJwt = response.data.signedJwt;
206
+ if (!signedJwt) {
207
+ throw new Error('Failed to sign JWT with Google IAM');
208
+ }
209
+ return signedJwt;
210
+ }
211
+ authenticateAWS(_config) {
212
+ throw new Error('AWS IAM authentication not yet implemented. Use AppRole or Token for now.');
213
+ }
214
+ async authenticateAppRole(config) {
215
+ var _a;
216
+ if (!config.roleId || !config.secretId) {
217
+ throw new Error('AppRole authentication requires roleId and secretId');
218
+ }
219
+ const mountPath = config.mountPath || 'approle';
220
+ const response = await this.client.approleLogin({
221
+ role_id: config.roleId,
222
+ secret_id: config.secretId,
223
+ mount_point: mountPath
224
+ });
225
+ if (!((_a = response === null || response === void 0 ? void 0 : response.auth) === null || _a === void 0 ? void 0 : _a.client_token)) {
226
+ throw new Error('AppRole authentication failed: No token received');
227
+ }
228
+ this.currentToken = response.auth.client_token;
229
+ this.client.token = this.currentToken;
230
+ const tokenTTL = response.auth.lease_duration || 0;
231
+ if (tokenTTL > 0) {
232
+ this.tokenExpiry = Date.now() + (tokenTTL * 1000);
233
+ }
234
+ }
235
+ async authenticateToken(config) {
236
+ if (!config.token) {
237
+ throw new Error('Token authentication requires a token');
238
+ }
239
+ this.currentToken = config.token;
240
+ this.client.token = this.currentToken;
241
+ try {
242
+ await this.client.tokenLookupSelf();
243
+ }
244
+ catch (error) {
245
+ throw new Error(`Token authentication failed: Invalid token`);
246
+ }
247
+ }
248
+ async read(path) {
249
+ return this.executeWithRetry(async () => {
250
+ const response = await this.client.read(path);
251
+ if (!response) {
252
+ throw new Error(`Secret not found at path: ${this.sanitizePath(path)}`);
253
+ }
254
+ return this.normalizeSecretResponse(response);
255
+ });
256
+ }
257
+ async renewLease(leaseId, increment) {
258
+ return this.executeWithRetry(async () => {
259
+ await this.client.write('sys/leases/renew', {
260
+ lease_id: leaseId,
261
+ increment: increment
262
+ });
263
+ });
264
+ }
265
+ normalizeSecretResponse(response) {
266
+ var _a, _b;
267
+ const data = ((_a = response.data) === null || _a === void 0 ? void 0 : _a.data) || response.data || {};
268
+ return {
269
+ data,
270
+ leaseId: response.lease_id,
271
+ leaseDuration: response.lease_duration || 0,
272
+ renewable: response.renewable || false,
273
+ metadata: (_b = response.data) === null || _b === void 0 ? void 0 : _b.metadata
274
+ };
275
+ }
276
+ async executeWithRetry(operation) {
277
+ let lastError = null;
278
+ for (let attempt = 1; attempt <= this.retryPolicy.maxAttempts; attempt++) {
279
+ try {
280
+ return await operation();
281
+ }
282
+ catch (error) {
283
+ lastError = error;
284
+ if (!this.isRetryableError(error)) {
285
+ throw error;
286
+ }
287
+ if (attempt === this.retryPolicy.maxAttempts) {
288
+ break;
289
+ }
290
+ const delay = this.calculateBackoff(attempt);
291
+ await this.sleep(delay);
292
+ }
293
+ }
294
+ throw lastError || new Error('Operation failed after retries');
295
+ }
296
+ isRetryableError(error) {
297
+ var _a;
298
+ const errorMessage = error.message || '';
299
+ const errorCode = error.code || '';
300
+ const statusCode = error.statusCode || ((_a = error.response) === null || _a === void 0 ? void 0 : _a.statusCode);
301
+ for (const pattern of this.retryPolicy.retryableErrors) {
302
+ if (pattern.includes('xx') && statusCode) {
303
+ const codePrefix = parseInt(pattern[0]);
304
+ const statusPrefix = Math.floor(statusCode / 100);
305
+ if (statusPrefix === codePrefix) {
306
+ return true;
307
+ }
308
+ }
309
+ else if (errorMessage.includes(pattern) || errorCode.includes(pattern)) {
310
+ return true;
311
+ }
312
+ }
313
+ return false;
314
+ }
315
+ calculateBackoff(attempt) {
316
+ const { strategy, initial, max, multiplier } = this.retryPolicy.backoff;
317
+ let delay;
318
+ switch (strategy) {
319
+ case 'exponential':
320
+ delay = initial * Math.pow(multiplier, attempt - 1);
321
+ break;
322
+ case 'linear':
323
+ delay = initial * attempt;
324
+ break;
325
+ case 'fixed':
326
+ default:
327
+ delay = initial;
328
+ break;
329
+ }
330
+ return Math.min(delay, max);
331
+ }
332
+ sleep(ms) {
333
+ return new Promise((resolve) => setTimeout(resolve, ms));
334
+ }
335
+ sanitizePath(path) {
336
+ const segments = path.split('/');
337
+ if (segments.length > 0) {
338
+ const lastSegment = segments[segments.length - 1];
339
+ const sensitivePatterns = [/password/i, /secret/i, /key/i, /token/i, /credential/i];
340
+ if (sensitivePatterns.some((pattern) => pattern.test(lastSegment))) {
341
+ segments[segments.length - 1] = '***';
342
+ }
343
+ }
344
+ return segments.join('/');
345
+ }
346
+ getToken() {
347
+ return this.currentToken;
348
+ }
349
+ isAuthenticated() {
350
+ return this.currentToken !== null;
351
+ }
352
+ }
353
+ exports.VaultProvider = VaultProvider;
354
+ //# sourceMappingURL=vault-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-provider.js","sourceRoot":"","sources":["../../../src/vault/vault-provider.ts"],"names":[],"mappings":"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"}