@kibibit/configit 1.0.0-beta.26 → 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.
- package/README.md +419 -0
- package/lib/scripts/test-vault-comprehensive.d.ts +2 -0
- package/lib/scripts/test-vault-comprehensive.d.ts.map +1 -0
- package/lib/scripts/test-vault-comprehensive.js +422 -0
- package/lib/scripts/test-vault-comprehensive.js.map +1 -0
- package/lib/scripts/test-vault-dynamic.d.ts +2 -0
- package/lib/scripts/test-vault-dynamic.d.ts.map +1 -0
- package/lib/scripts/test-vault-dynamic.js +193 -0
- package/lib/scripts/test-vault-dynamic.js.map +1 -0
- package/lib/scripts/test-vault-gcp-ttl.d.ts +3 -0
- package/lib/scripts/test-vault-gcp-ttl.d.ts.map +1 -0
- package/lib/scripts/test-vault-gcp-ttl.js +218 -0
- package/lib/scripts/test-vault-gcp-ttl.js.map +1 -0
- package/lib/scripts/test-vault.d.ts +2 -0
- package/lib/scripts/test-vault.d.ts.map +1 -0
- package/lib/scripts/test-vault.js +167 -0
- package/lib/scripts/test-vault.js.map +1 -0
- package/lib/src/config.errors.d.ts.map +1 -0
- package/lib/src/config.errors.js.map +1 -0
- package/lib/src/config.model.d.ts.map +1 -0
- package/lib/src/config.model.js.map +1 -0
- package/lib/{config.service.d.ts → src/config.service.d.ts} +10 -1
- package/lib/src/config.service.d.ts.map +1 -0
- package/lib/{config.service.js → src/config.service.js} +75 -9
- package/lib/src/config.service.js.map +1 -0
- package/lib/src/environment.service.d.ts.map +1 -0
- package/lib/src/environment.service.js.map +1 -0
- package/lib/{index.d.ts → src/index.d.ts} +1 -0
- package/lib/src/index.d.ts.map +1 -0
- package/lib/{index.js → src/index.js} +1 -0
- package/lib/src/index.js.map +1 -0
- package/lib/src/json-schema.validator.d.ts.map +1 -0
- package/lib/src/json-schema.validator.js.map +1 -0
- package/lib/src/vault/__tests__/vault-integration.test.d.ts +2 -0
- package/lib/src/vault/__tests__/vault-integration.test.d.ts.map +1 -0
- package/lib/src/vault/__tests__/vault-integration.test.js +190 -0
- package/lib/src/vault/__tests__/vault-integration.test.js.map +1 -0
- package/lib/src/vault/decorators.d.ts +17 -0
- package/lib/src/vault/decorators.d.ts.map +1 -0
- package/lib/src/vault/decorators.js +149 -0
- package/lib/src/vault/decorators.js.map +1 -0
- package/lib/src/vault/index.d.ts +7 -0
- package/lib/src/vault/index.d.ts.map +1 -0
- package/lib/src/vault/index.js +42 -0
- package/lib/src/vault/index.js.map +1 -0
- package/lib/src/vault/secret-refresh-manager.d.ts +23 -0
- package/lib/src/vault/secret-refresh-manager.d.ts.map +1 -0
- package/lib/src/vault/secret-refresh-manager.js +149 -0
- package/lib/src/vault/secret-refresh-manager.js.map +1 -0
- package/lib/src/vault/types.d.ts +149 -0
- package/lib/src/vault/types.d.ts.map +1 -0
- package/lib/src/vault/types.js +4 -0
- package/lib/src/vault/types.js.map +1 -0
- package/lib/src/vault/vault-cache.d.ts +20 -0
- package/lib/src/vault/vault-cache.d.ts.map +1 -0
- package/lib/src/vault/vault-cache.js +139 -0
- package/lib/src/vault/vault-cache.js.map +1 -0
- package/lib/src/vault/vault-integration.d.ts +27 -0
- package/lib/src/vault/vault-integration.d.ts.map +1 -0
- package/lib/src/vault/vault-integration.js +211 -0
- package/lib/src/vault/vault-integration.js.map +1 -0
- package/lib/src/vault/vault-provider.d.ts +37 -0
- package/lib/src/vault/vault-provider.d.ts.map +1 -0
- package/lib/src/vault/vault-provider.js +354 -0
- package/lib/src/vault/vault-provider.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -65
- package/src/config.service.ts +155 -10
- package/src/config.service.vault.spec.ts +859 -0
- package/src/index.ts +1 -0
- package/src/vault/__tests__/vault-integration.test.ts +226 -0
- package/src/vault/decorators.ts +228 -0
- package/src/vault/index.ts +31 -0
- package/src/vault/secret-refresh-manager.ts +241 -0
- package/src/vault/types.ts +487 -0
- package/src/vault/vault-cache.ts +240 -0
- package/src/vault/vault-integration.ts +332 -0
- package/src/vault/vault-provider.ts +576 -0
- package/lib/config.errors.d.ts.map +0 -1
- package/lib/config.errors.js.map +0 -1
- package/lib/config.model.d.ts.map +0 -1
- package/lib/config.model.js.map +0 -1
- package/lib/config.service.d.ts.map +0 -1
- package/lib/config.service.js.map +0 -1
- package/lib/environment.service.d.ts.map +0 -1
- package/lib/environment.service.js.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/json-schema.validator.d.ts.map +0 -1
- package/lib/json-schema.validator.js.map +0 -1
- /package/lib/{config.errors.d.ts → src/config.errors.d.ts} +0 -0
- /package/lib/{config.errors.js → src/config.errors.js} +0 -0
- /package/lib/{config.model.d.ts → src/config.model.d.ts} +0 -0
- /package/lib/{config.model.js → src/config.model.js} +0 -0
- /package/lib/{environment.service.d.ts → src/environment.service.d.ts} +0 -0
- /package/lib/{environment.service.js → src/environment.service.js} +0 -0
- /package/lib/{json-schema.validator.d.ts → src/json-schema.validator.d.ts} +0 -0
- /package/lib/{json-schema.validator.js → src/json-schema.validator.js} +0 -0
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
25
|
+
if (mod && mod.__esModule) return mod;
|
|
26
|
+
var result = {};
|
|
27
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
28
|
+
__setModuleDefault(result, mod);
|
|
29
|
+
return result;
|
|
30
|
+
};
|
|
31
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
32
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
33
|
+
};
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
require("reflect-metadata");
|
|
36
|
+
const class_validator_1 = require("class-validator");
|
|
37
|
+
const vault_1 = require("../src/vault");
|
|
38
|
+
const results = [];
|
|
39
|
+
function logTest(name, passed, error) {
|
|
40
|
+
results.push({ test: name, passed, error });
|
|
41
|
+
const status = passed ? '✓' : '✗';
|
|
42
|
+
const color = passed ? '\x1b[32m' : '\x1b[31m';
|
|
43
|
+
console.log(` ${color}${status}\x1b[0m ${name}${error ? `: ${error}` : ''}`);
|
|
44
|
+
}
|
|
45
|
+
async function testTokenAuth() {
|
|
46
|
+
console.log('\n\x1b[1;33mTest Suite 1: Token Authentication\x1b[0m');
|
|
47
|
+
const config = {
|
|
48
|
+
endpoint: 'http://127.0.0.1:8200',
|
|
49
|
+
auth: {
|
|
50
|
+
methods: [
|
|
51
|
+
{
|
|
52
|
+
type: 'token',
|
|
53
|
+
config: {
|
|
54
|
+
type: 'token',
|
|
55
|
+
token: 'configit-dev-token'
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
tls: { enabled: false, verifyCertificate: false }
|
|
61
|
+
};
|
|
62
|
+
try {
|
|
63
|
+
const provider = new vault_1.VaultProvider(config);
|
|
64
|
+
await provider.initialize();
|
|
65
|
+
logTest('Token authentication succeeds', true);
|
|
66
|
+
const secret = await provider.read('secret/data/configit/api');
|
|
67
|
+
const hasData = secret.data && secret.data.api_key;
|
|
68
|
+
logTest('Can read KV v2 secret', !!hasData, hasData ? undefined : 'No data returned');
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
logTest('Token authentication succeeds', false, error.message);
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function testAppRoleAuth() {
|
|
77
|
+
console.log('\n\x1b[1;33mTest Suite 2: AppRole Authentication\x1b[0m');
|
|
78
|
+
let secretId;
|
|
79
|
+
let roleId;
|
|
80
|
+
try {
|
|
81
|
+
const setupProvider = new vault_1.VaultProvider({
|
|
82
|
+
endpoint: 'http://127.0.0.1:8200',
|
|
83
|
+
auth: { methods: [{ type: 'token', config: { type: 'token', token: 'configit-dev-token' } }] },
|
|
84
|
+
tls: { enabled: false, verifyCertificate: false }
|
|
85
|
+
});
|
|
86
|
+
await setupProvider.initialize();
|
|
87
|
+
const roleIdResponse = await setupProvider.client.read('auth/approle/role/configit-role/role-id');
|
|
88
|
+
roleId = roleIdResponse.data.role_id;
|
|
89
|
+
const secretIdResponse = await setupProvider.client.write('auth/approle/role/configit-role/secret-id', {});
|
|
90
|
+
secretId = secretIdResponse.data.secret_id;
|
|
91
|
+
logTest('Generated fresh AppRole credentials', true);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
logTest('Generated fresh AppRole credentials', false, error.message);
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
const config = {
|
|
98
|
+
endpoint: 'http://127.0.0.1:8200',
|
|
99
|
+
auth: {
|
|
100
|
+
methods: [
|
|
101
|
+
{
|
|
102
|
+
type: 'approle',
|
|
103
|
+
config: {
|
|
104
|
+
type: 'approle',
|
|
105
|
+
roleId,
|
|
106
|
+
secretId
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
tls: { enabled: false, verifyCertificate: false }
|
|
112
|
+
};
|
|
113
|
+
try {
|
|
114
|
+
const provider = new vault_1.VaultProvider(config);
|
|
115
|
+
await provider.initialize();
|
|
116
|
+
logTest('AppRole authentication succeeds', true);
|
|
117
|
+
const secret = await provider.read('secret/data/configit/api');
|
|
118
|
+
const hasData = secret.data && secret.data.api_key;
|
|
119
|
+
logTest('Can read secret with AppRole token', !!hasData, hasData ? undefined : 'No data returned');
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
logTest('AppRole authentication succeeds', false, error.message);
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async function testAuthFallback() {
|
|
128
|
+
console.log('\n\x1b[1;33mTest Suite 3: Authentication Fallback\x1b[0m');
|
|
129
|
+
const config = {
|
|
130
|
+
endpoint: 'http://127.0.0.1:8200',
|
|
131
|
+
auth: {
|
|
132
|
+
methods: [
|
|
133
|
+
{
|
|
134
|
+
type: 'token',
|
|
135
|
+
config: {
|
|
136
|
+
type: 'token',
|
|
137
|
+
token: 'invalid-token-12345'
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
type: 'token',
|
|
142
|
+
config: {
|
|
143
|
+
type: 'token',
|
|
144
|
+
token: 'configit-dev-token'
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
]
|
|
148
|
+
},
|
|
149
|
+
tls: { enabled: false, verifyCertificate: false }
|
|
150
|
+
};
|
|
151
|
+
try {
|
|
152
|
+
const provider = new vault_1.VaultProvider(config);
|
|
153
|
+
await provider.initialize();
|
|
154
|
+
logTest('Falls back to second auth method when first fails', true);
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
logTest('Falls back to second auth method when first fails', false, error.message);
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async function testKvV1Engine() {
|
|
163
|
+
var _a;
|
|
164
|
+
console.log('\n\x1b[1;33mTest Suite 4: KV v1 Engine\x1b[0m');
|
|
165
|
+
const setupConfig = {
|
|
166
|
+
endpoint: 'http://127.0.0.1:8200',
|
|
167
|
+
auth: {
|
|
168
|
+
methods: [{ type: 'token', config: { type: 'token', token: 'configit-dev-token' } }]
|
|
169
|
+
},
|
|
170
|
+
tls: { enabled: false, verifyCertificate: false }
|
|
171
|
+
};
|
|
172
|
+
try {
|
|
173
|
+
const provider = new vault_1.VaultProvider(setupConfig);
|
|
174
|
+
await provider.initialize();
|
|
175
|
+
try {
|
|
176
|
+
await provider.client.write('cubbyhole/test', { test_key: 'test_value' });
|
|
177
|
+
logTest('Can write to cubbyhole (KV v1-like)', true);
|
|
178
|
+
const response = await provider.client.read('cubbyhole/test');
|
|
179
|
+
const hasData = ((_a = response === null || response === void 0 ? void 0 : response.data) === null || _a === void 0 ? void 0 : _a.test_key) === 'test_value';
|
|
180
|
+
logTest('Can read from cubbyhole (KV v1-like)', hasData, hasData ? undefined : 'Data mismatch');
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
logTest('KV v1-like operations work', false, error.message);
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
logTest('KV v1 test setup', false, error.message);
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
async function testVaultIntegrationDecorators() {
|
|
194
|
+
console.log('\n\x1b[1;33mTest Suite 5: VaultIntegration with Decorators\x1b[0m');
|
|
195
|
+
class TestConfig {
|
|
196
|
+
}
|
|
197
|
+
__decorate([
|
|
198
|
+
(0, vault_1.VaultPath)('configit/api'),
|
|
199
|
+
(0, vault_1.VaultKey)('api_key'),
|
|
200
|
+
(0, vault_1.VaultEngine)('kv-v2'),
|
|
201
|
+
(0, class_validator_1.IsString)(),
|
|
202
|
+
__metadata("design:type", String)
|
|
203
|
+
], TestConfig.prototype, "API_KEY", void 0);
|
|
204
|
+
__decorate([
|
|
205
|
+
(0, vault_1.VaultPath)('configit/database'),
|
|
206
|
+
(0, vault_1.VaultKey)('password'),
|
|
207
|
+
(0, vault_1.VaultEngine)('kv-v2'),
|
|
208
|
+
(0, class_validator_1.IsString)(),
|
|
209
|
+
__metadata("design:type", String)
|
|
210
|
+
], TestConfig.prototype, "DB_PASSWORD", void 0);
|
|
211
|
+
const config = {
|
|
212
|
+
endpoint: 'http://127.0.0.1:8200',
|
|
213
|
+
auth: {
|
|
214
|
+
methods: [{ type: 'token', config: { type: 'token', token: 'configit-dev-token' } }]
|
|
215
|
+
},
|
|
216
|
+
tls: { enabled: false, verifyCertificate: false }
|
|
217
|
+
};
|
|
218
|
+
const integration = new vault_1.VaultIntegration(config);
|
|
219
|
+
try {
|
|
220
|
+
await integration.initialize();
|
|
221
|
+
logTest('VaultIntegration initializes', true);
|
|
222
|
+
await integration.loadSecrets(TestConfig);
|
|
223
|
+
logTest('VaultIntegration loads secrets', true);
|
|
224
|
+
const apiKey = integration.getSecret('API_KEY');
|
|
225
|
+
logTest('API_KEY loaded correctly', apiKey === 'test-api-key-123', apiKey ? undefined : 'No value');
|
|
226
|
+
const dbPassword = integration.getSecret('DB_PASSWORD');
|
|
227
|
+
logTest('DB_PASSWORD loaded correctly', dbPassword === 'testpassword', dbPassword ? undefined : 'No value');
|
|
228
|
+
const health = integration.getHealth();
|
|
229
|
+
logTest('Health check returns valid data', health.connected && health.cacheSize > 0);
|
|
230
|
+
integration.shutdown();
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
logTest('VaultIntegration test', false, error.message);
|
|
235
|
+
integration.shutdown();
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
async function testTTLRefreshScheduling() {
|
|
240
|
+
console.log('\n\x1b[1;33mTest Suite 6: TTL and Refresh Scheduling\x1b[0m');
|
|
241
|
+
class TTLTestConfig {
|
|
242
|
+
}
|
|
243
|
+
__decorate([
|
|
244
|
+
(0, vault_1.VaultPath)('configit/api'),
|
|
245
|
+
(0, vault_1.VaultKey)('api_key'),
|
|
246
|
+
(0, vault_1.VaultEngine)('kv-v2'),
|
|
247
|
+
(0, class_validator_1.IsString)(),
|
|
248
|
+
__metadata("design:type", String)
|
|
249
|
+
], TTLTestConfig.prototype, "API_KEY", void 0);
|
|
250
|
+
const config = {
|
|
251
|
+
endpoint: 'http://127.0.0.1:8200',
|
|
252
|
+
auth: {
|
|
253
|
+
methods: [{ type: 'token', config: { type: 'token', token: 'configit-dev-token' } }]
|
|
254
|
+
},
|
|
255
|
+
tls: { enabled: false, verifyCertificate: false },
|
|
256
|
+
refreshBuffer: 60
|
|
257
|
+
};
|
|
258
|
+
const integration = new vault_1.VaultIntegration(config);
|
|
259
|
+
try {
|
|
260
|
+
await integration.initialize();
|
|
261
|
+
await integration.loadSecrets(TTLTestConfig);
|
|
262
|
+
const healthDetails = integration.getHealthDetails();
|
|
263
|
+
logTest('Health details available', !!healthDetails);
|
|
264
|
+
logTest('Refresh status tracked', Array.isArray(healthDetails.refreshStatus));
|
|
265
|
+
logTest('KV v2 secrets have no TTL (expected)', healthDetails.refreshQueueSize === 0);
|
|
266
|
+
integration.shutdown();
|
|
267
|
+
return true;
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
logTest('TTL refresh test', false, error.message);
|
|
271
|
+
integration.shutdown();
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
async function testErrorHandling() {
|
|
276
|
+
console.log('\n\x1b[1;33mTest Suite 7: Error Handling\x1b[0m');
|
|
277
|
+
const config = {
|
|
278
|
+
endpoint: 'http://127.0.0.1:8200',
|
|
279
|
+
auth: {
|
|
280
|
+
methods: [{ type: 'token', config: { type: 'token', token: 'configit-dev-token' } }]
|
|
281
|
+
},
|
|
282
|
+
tls: { enabled: false, verifyCertificate: false }
|
|
283
|
+
};
|
|
284
|
+
const provider = new vault_1.VaultProvider(config);
|
|
285
|
+
try {
|
|
286
|
+
await provider.initialize();
|
|
287
|
+
try {
|
|
288
|
+
await provider.read('secret/data/nonexistent/path');
|
|
289
|
+
logTest('Handles missing secret gracefully', false, 'Should have thrown');
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
const isExpectedError = error.message.includes('not found') || error.message.includes('404');
|
|
293
|
+
logTest('Handles missing secret gracefully', true);
|
|
294
|
+
}
|
|
295
|
+
try {
|
|
296
|
+
await provider.read('invalid///path');
|
|
297
|
+
logTest('Handles invalid path', false, 'Should have thrown');
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
logTest('Handles invalid path', true);
|
|
301
|
+
}
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
catch (error) {
|
|
305
|
+
logTest('Error handling test setup', false, error.message);
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
async function testTLSEnforcement() {
|
|
310
|
+
console.log('\n\x1b[1;33mTest Suite 8: TLS Enforcement\x1b[0m');
|
|
311
|
+
const configWithTLS = {
|
|
312
|
+
endpoint: 'http://some-remote-vault:8200',
|
|
313
|
+
auth: {
|
|
314
|
+
methods: [{ type: 'token', config: { type: 'token', token: 'test' } }]
|
|
315
|
+
}
|
|
316
|
+
};
|
|
317
|
+
try {
|
|
318
|
+
const provider = new vault_1.VaultProvider(configWithTLS);
|
|
319
|
+
await provider.initialize();
|
|
320
|
+
logTest('Rejects HTTP for non-localhost', false, 'Should have thrown');
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
const isTLSError = error.message.includes('TLS') || error.message.includes('HTTPS');
|
|
324
|
+
logTest('Rejects HTTP for non-localhost', isTLSError, isTLSError ? undefined : error.message);
|
|
325
|
+
}
|
|
326
|
+
const configLocalhost = {
|
|
327
|
+
endpoint: 'http://localhost:8200',
|
|
328
|
+
auth: {
|
|
329
|
+
methods: [{ type: 'token', config: { type: 'token', token: 'configit-dev-token' } }]
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
try {
|
|
333
|
+
const provider = new vault_1.VaultProvider(configLocalhost);
|
|
334
|
+
await provider.initialize();
|
|
335
|
+
logTest('Allows HTTP for localhost', true);
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
const isTLSError = error.message.includes('TLS') || error.message.includes('HTTPS');
|
|
339
|
+
logTest('Allows HTTP for localhost', !isTLSError, isTLSError ? 'TLS error unexpected' : undefined);
|
|
340
|
+
}
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
async function testGCPAuth() {
|
|
344
|
+
console.log('\n\x1b[1;33mTest Suite 9: GCP IAM Authentication\x1b[0m');
|
|
345
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs')));
|
|
346
|
+
const keyFilePath = './secrets/gcp-sa-key.json';
|
|
347
|
+
if (!fs.existsSync(keyFilePath)) {
|
|
348
|
+
logTest('GCP key file exists', false, `${keyFilePath} not found - skipping GCP tests`);
|
|
349
|
+
return false;
|
|
350
|
+
}
|
|
351
|
+
logTest('GCP key file exists', true);
|
|
352
|
+
const config = {
|
|
353
|
+
endpoint: 'http://127.0.0.1:8200',
|
|
354
|
+
auth: {
|
|
355
|
+
methods: [
|
|
356
|
+
{
|
|
357
|
+
type: 'gcp',
|
|
358
|
+
config: {
|
|
359
|
+
type: 'gcp',
|
|
360
|
+
role: 'configit-gcp-role',
|
|
361
|
+
serviceAccountKeyFile: keyFilePath
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
]
|
|
365
|
+
},
|
|
366
|
+
tls: { enabled: false, verifyCertificate: false }
|
|
367
|
+
};
|
|
368
|
+
try {
|
|
369
|
+
const provider = new vault_1.VaultProvider(config);
|
|
370
|
+
await provider.initialize();
|
|
371
|
+
logTest('GCP IAM authentication succeeds', true);
|
|
372
|
+
const secret = await provider.read('secret/data/configit/api');
|
|
373
|
+
const hasData = secret.data && secret.data.api_key;
|
|
374
|
+
logTest('Can read secret with GCP IAM token', !!hasData, hasData ? undefined : 'No data returned');
|
|
375
|
+
return true;
|
|
376
|
+
}
|
|
377
|
+
catch (error) {
|
|
378
|
+
logTest('GCP IAM authentication succeeds', false, error.message);
|
|
379
|
+
return false;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
async function runAllTests() {
|
|
383
|
+
console.log('\x1b[1;34m' + '='.repeat(60) + '\x1b[0m');
|
|
384
|
+
console.log('\x1b[1;34m Comprehensive Vault Integration Tests\x1b[0m');
|
|
385
|
+
console.log('\x1b[1;34m' + '='.repeat(60) + '\x1b[0m');
|
|
386
|
+
await testTokenAuth();
|
|
387
|
+
await testAppRoleAuth();
|
|
388
|
+
await testGCPAuth();
|
|
389
|
+
await testAuthFallback();
|
|
390
|
+
await testKvV1Engine();
|
|
391
|
+
await testVaultIntegrationDecorators();
|
|
392
|
+
await testTTLRefreshScheduling();
|
|
393
|
+
await testErrorHandling();
|
|
394
|
+
await testTLSEnforcement();
|
|
395
|
+
console.log('\n\x1b[1;34m' + '='.repeat(60) + '\x1b[0m');
|
|
396
|
+
console.log('\x1b[1;34m Test Summary\x1b[0m');
|
|
397
|
+
console.log('\x1b[1;34m' + '='.repeat(60) + '\x1b[0m\n');
|
|
398
|
+
const passed = results.filter((r) => r.passed).length;
|
|
399
|
+
const failed = results.filter((r) => !r.passed).length;
|
|
400
|
+
const total = results.length;
|
|
401
|
+
console.log(` Total: ${total}`);
|
|
402
|
+
console.log(` \x1b[32mPassed: ${passed}\x1b[0m`);
|
|
403
|
+
console.log(` \x1b[31mFailed: ${failed}\x1b[0m\n`);
|
|
404
|
+
if (failed > 0) {
|
|
405
|
+
console.log(' \x1b[1;31mFailed Tests:\x1b[0m');
|
|
406
|
+
results.filter((r) => !r.passed).forEach((r) => {
|
|
407
|
+
console.log(` - ${r.test}${r.error ? `: ${r.error}` : ''}`);
|
|
408
|
+
});
|
|
409
|
+
console.log('');
|
|
410
|
+
}
|
|
411
|
+
const success = failed === 0;
|
|
412
|
+
console.log(success ? ' \x1b[32m✓ All tests passed!\x1b[0m' : ' \x1b[31m✗ Some tests failed\x1b[0m');
|
|
413
|
+
console.log('\x1b[1;34m' + '='.repeat(60) + '\x1b[0m\n');
|
|
414
|
+
return success;
|
|
415
|
+
}
|
|
416
|
+
runAllTests()
|
|
417
|
+
.then((success) => process.exit(success ? 0 : 1))
|
|
418
|
+
.catch((error) => {
|
|
419
|
+
console.error('Unexpected error:', error);
|
|
420
|
+
process.exit(1);
|
|
421
|
+
});
|
|
422
|
+
//# sourceMappingURL=test-vault-comprehensive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-vault-comprehensive.js","sourceRoot":"","sources":["../../scripts/test-vault-comprehensive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-vault-dynamic.d.ts","sourceRoot":"","sources":["../../scripts/test-vault-dynamic.ts"],"names":[],"mappings":"AAWA,OAAO,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
require("reflect-metadata");
|
|
13
|
+
const class_validator_1 = require("class-validator");
|
|
14
|
+
const vault_1 = require("../src/vault");
|
|
15
|
+
class DynamicSecretsConfig {
|
|
16
|
+
}
|
|
17
|
+
__decorate([
|
|
18
|
+
(0, vault_1.VaultPath)('secret/data/configit/api'),
|
|
19
|
+
(0, vault_1.VaultKey)('api_key'),
|
|
20
|
+
(0, vault_1.VaultEngine)('kv-v2'),
|
|
21
|
+
(0, class_validator_1.IsString)(),
|
|
22
|
+
__metadata("design:type", String)
|
|
23
|
+
], DynamicSecretsConfig.prototype, "API_KEY", void 0);
|
|
24
|
+
__decorate([
|
|
25
|
+
(0, vault_1.VaultPath)('database/creds/configit-readonly'),
|
|
26
|
+
(0, vault_1.VaultKey)('username'),
|
|
27
|
+
(0, vault_1.VaultEngine)('database'),
|
|
28
|
+
(0, class_validator_1.IsString)(),
|
|
29
|
+
__metadata("design:type", String)
|
|
30
|
+
], DynamicSecretsConfig.prototype, "DB_USERNAME", void 0);
|
|
31
|
+
__decorate([
|
|
32
|
+
(0, vault_1.VaultPath)('database/creds/configit-readonly'),
|
|
33
|
+
(0, vault_1.VaultKey)('password'),
|
|
34
|
+
(0, vault_1.VaultEngine)('database'),
|
|
35
|
+
(0, class_validator_1.IsString)(),
|
|
36
|
+
__metadata("design:type", String)
|
|
37
|
+
], DynamicSecretsConfig.prototype, "DB_PASSWORD", void 0);
|
|
38
|
+
const VAULT_CONFIG = {
|
|
39
|
+
endpoint: 'http://127.0.0.1:8200',
|
|
40
|
+
auth: {
|
|
41
|
+
methods: [{ type: 'token', config: { type: 'token', token: 'configit-dev-token' } }]
|
|
42
|
+
},
|
|
43
|
+
tls: { enabled: false, verifyCertificate: false },
|
|
44
|
+
refreshBuffer: 30
|
|
45
|
+
};
|
|
46
|
+
async function runDynamicSecretsTest() {
|
|
47
|
+
console.log('\x1b[1;34m' + '='.repeat(60) + '\x1b[0m');
|
|
48
|
+
console.log('\x1b[1;34m Dynamic Secrets Test (TTL-based Refresh)\x1b[0m');
|
|
49
|
+
console.log('\x1b[1;34m' + '='.repeat(60) + '\x1b[0m\n');
|
|
50
|
+
const integration = new vault_1.VaultIntegration(VAULT_CONFIG);
|
|
51
|
+
try {
|
|
52
|
+
console.log('\x1b[1;33mStep 1: Initializing VaultIntegration...\x1b[0m');
|
|
53
|
+
await integration.initialize();
|
|
54
|
+
console.log(' \x1b[32m✓\x1b[0m Initialized\n');
|
|
55
|
+
console.log('\x1b[1;33mStep 2: Loading secrets (static + dynamic)...\x1b[0m');
|
|
56
|
+
await integration.loadSecrets(DynamicSecretsConfig);
|
|
57
|
+
console.log(' \x1b[32m✓\x1b[0m Secrets loaded\n');
|
|
58
|
+
console.log('\x1b[1;33mStep 3: Initial secret values:\x1b[0m');
|
|
59
|
+
const initialApiKey = integration.getSecret('API_KEY');
|
|
60
|
+
const initialDbUser = integration.getSecret('DB_USERNAME');
|
|
61
|
+
const initialDbPass = integration.getSecret('DB_PASSWORD');
|
|
62
|
+
console.log(` API_KEY (static): ${initialApiKey}`);
|
|
63
|
+
console.log(` DB_USERNAME (dynamic): ${initialDbUser}`);
|
|
64
|
+
console.log(` DB_PASSWORD (dynamic): ${initialDbPass === null || initialDbPass === void 0 ? void 0 : initialDbPass.substring(0, 8)}...`);
|
|
65
|
+
console.log('');
|
|
66
|
+
console.log('\x1b[1;33mStep 4: Checking health details...\x1b[0m');
|
|
67
|
+
const health = integration.getHealthDetails();
|
|
68
|
+
console.log(` Connected: ${health.connected}`);
|
|
69
|
+
console.log(` Cache size: ${health.cacheSize}`);
|
|
70
|
+
console.log(` Refresh queue size: ${health.refreshQueueSize}`);
|
|
71
|
+
console.log('');
|
|
72
|
+
console.log(' \x1b[1;33mRefresh status per secret:\x1b[0m');
|
|
73
|
+
for (const status of health.refreshStatus) {
|
|
74
|
+
const timeUntil = Math.round(status.timeUntilRefresh / 1000);
|
|
75
|
+
console.log(` - ${status.propertyName}:`);
|
|
76
|
+
console.log(` Scheduled: ${status.scheduled}`);
|
|
77
|
+
console.log(` Time until refresh: ${timeUntil}s`);
|
|
78
|
+
}
|
|
79
|
+
console.log('');
|
|
80
|
+
console.log('\x1b[1;33mStep 5: Observing TTL behavior (waiting 35 seconds)...\x1b[0m');
|
|
81
|
+
console.log(' Dynamic credentials have 60s TTL, refresh buffer is 30s');
|
|
82
|
+
console.log(' So refresh should trigger at ~30s mark\n');
|
|
83
|
+
for (let i = 1; i <= 4; i++) {
|
|
84
|
+
await sleep(10000);
|
|
85
|
+
const elapsed = i * 10;
|
|
86
|
+
console.log(` \x1b[36m[${elapsed}s elapsed]\x1b[0m`);
|
|
87
|
+
const currentDbUser = integration.getSecret('DB_USERNAME');
|
|
88
|
+
const currentDbPass = integration.getSecret('DB_PASSWORD');
|
|
89
|
+
const currentHealth = integration.getHealthDetails();
|
|
90
|
+
const userChanged = currentDbUser !== initialDbUser;
|
|
91
|
+
const passChanged = currentDbPass !== initialDbPass;
|
|
92
|
+
if (userChanged) {
|
|
93
|
+
console.log(` DB_USERNAME: \x1b[33mCHANGED\x1b[0m ${initialDbUser} → ${currentDbUser}`);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
console.log(` DB_USERNAME: ${currentDbUser} (unchanged)`);
|
|
97
|
+
}
|
|
98
|
+
if (passChanged) {
|
|
99
|
+
console.log(` DB_PASSWORD: \x1b[33mCHANGED\x1b[0m`);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
console.log(` DB_PASSWORD: ...${currentDbPass === null || currentDbPass === void 0 ? void 0 : currentDbPass.slice(-4)} (unchanged)`);
|
|
103
|
+
}
|
|
104
|
+
const dbUserStatus = currentHealth.refreshStatus.find((s) => s.propertyName === 'DB_USERNAME');
|
|
105
|
+
if (dbUserStatus) {
|
|
106
|
+
const timeUntil = Math.max(0, Math.round(dbUserStatus.timeUntilRefresh / 1000));
|
|
107
|
+
console.log(` Refresh in: ${timeUntil}s, Count: ${dbUserStatus.refreshCount}`);
|
|
108
|
+
}
|
|
109
|
+
console.log('');
|
|
110
|
+
}
|
|
111
|
+
console.log('\x1b[1;33mStep 6: Verifying credential rotation...\x1b[0m');
|
|
112
|
+
const finalDbUser = integration.getSecret('DB_USERNAME');
|
|
113
|
+
const finalDbPass = integration.getSecret('DB_PASSWORD');
|
|
114
|
+
const apiKeyUnchanged = integration.getSecret('API_KEY') === initialApiKey;
|
|
115
|
+
const dbRotated = finalDbUser !== initialDbUser || finalDbPass !== initialDbPass;
|
|
116
|
+
console.log(` API_KEY unchanged: ${apiKeyUnchanged ? '\x1b[32m✓\x1b[0m' : '\x1b[31m✗\x1b[0m'}`);
|
|
117
|
+
console.log(` DB credentials rotated: ${dbRotated ? '\x1b[32m✓\x1b[0m' : '\x1b[31m✗\x1b[0m (may need more time)'}`);
|
|
118
|
+
console.log('');
|
|
119
|
+
console.log('\x1b[1;34m' + '='.repeat(60) + '\x1b[0m');
|
|
120
|
+
if (apiKeyUnchanged) {
|
|
121
|
+
console.log('\x1b[32m ✓ Test completed!\x1b[0m');
|
|
122
|
+
console.log('\x1b[32m - Static secrets remain stable\x1b[0m');
|
|
123
|
+
if (dbRotated) {
|
|
124
|
+
console.log('\x1b[32m - Dynamic secrets were rotated based on TTL\x1b[0m');
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
console.log('\x1b[33m - Dynamic secrets not rotated yet (TTL ~60s, may need more time)\x1b[0m');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
console.log('\x1b[31m ✗ Unexpected behavior\x1b[0m');
|
|
132
|
+
}
|
|
133
|
+
console.log('\x1b[1;34m' + '='.repeat(60) + '\x1b[0m\n');
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
console.error('\n\x1b[31m✗ Test failed:\x1b[0m', error.message);
|
|
138
|
+
if (error.message.includes('connection refused') || error.message.includes('ECONNREFUSED')) {
|
|
139
|
+
console.log('\n\x1b[33mMake sure Vault and PostgreSQL are running:\x1b[0m');
|
|
140
|
+
console.log(' docker compose -f docker-compose.vault.yml up -d');
|
|
141
|
+
console.log(' bash scripts/vault-setup.sh');
|
|
142
|
+
}
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
integration.shutdown();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function sleep(ms) {
|
|
150
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
151
|
+
}
|
|
152
|
+
async function testDirectDynamicRead() {
|
|
153
|
+
var _a, _b, _c;
|
|
154
|
+
console.log('\n\x1b[1;34m' + '='.repeat(60) + '\x1b[0m');
|
|
155
|
+
console.log('\x1b[1;34m Direct Dynamic Credential Read Test\x1b[0m');
|
|
156
|
+
console.log('\x1b[1;34m' + '='.repeat(60) + '\x1b[0m\n');
|
|
157
|
+
const provider = new vault_1.VaultProvider(VAULT_CONFIG);
|
|
158
|
+
try {
|
|
159
|
+
await provider.initialize();
|
|
160
|
+
console.log('\x1b[32m✓\x1b[0m Provider initialized\n');
|
|
161
|
+
console.log('Reading database/creds/configit-readonly (1st time)...');
|
|
162
|
+
const creds1 = await provider.read('database/creds/configit-readonly');
|
|
163
|
+
console.log(` Username: ${creds1.data.username}`);
|
|
164
|
+
console.log(` Password: ${(_a = creds1.data.password) === null || _a === void 0 ? void 0 : _a.substring(0, 8)}...`);
|
|
165
|
+
console.log(` TTL: ${creds1.leaseDuration}s`);
|
|
166
|
+
console.log(` Lease ID: ${(_b = creds1.leaseId) === null || _b === void 0 ? void 0 : _b.substring(0, 30)}...`);
|
|
167
|
+
console.log(` Renewable: ${creds1.renewable}`);
|
|
168
|
+
console.log('');
|
|
169
|
+
console.log('Reading database/creds/configit-readonly (2nd time)...');
|
|
170
|
+
const creds2 = await provider.read('database/creds/configit-readonly');
|
|
171
|
+
console.log(` Username: ${creds2.data.username}`);
|
|
172
|
+
console.log(` Password: ${(_c = creds2.data.password) === null || _c === void 0 ? void 0 : _c.substring(0, 8)}...`);
|
|
173
|
+
console.log('');
|
|
174
|
+
const different = creds1.data.username !== creds2.data.username;
|
|
175
|
+
console.log(`Credentials different on each read: ${different ? '\x1b[32m✓ Yes (expected)\x1b[0m' : '\x1b[31m✗ No\x1b[0m'}`);
|
|
176
|
+
console.log('\n\x1b[33mNote: Each read generates NEW credentials (this is how dynamic secrets work)\x1b[0m\n');
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
console.error('\x1b[31m✗ Error:\x1b[0m', error.message);
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async function main() {
|
|
185
|
+
const directTestPassed = await testDirectDynamicRead();
|
|
186
|
+
const integrationTestPassed = await runDynamicSecretsTest();
|
|
187
|
+
process.exit(directTestPassed && integrationTestPassed ? 0 : 1);
|
|
188
|
+
}
|
|
189
|
+
main().catch((error) => {
|
|
190
|
+
console.error('Unexpected error:', error);
|
|
191
|
+
process.exit(1);
|
|
192
|
+
});
|
|
193
|
+
//# sourceMappingURL=test-vault-dynamic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-vault-dynamic.js","sourceRoot":"","sources":["../../scripts/test-vault-dynamic.ts"],"names":[],"mappings":"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"}
|