@fentz26/envcp 1.1.0 → 1.2.0-exp.8d5b91b

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 (115) hide show
  1. package/README.md +65 -421
  2. package/VERSION +1 -0
  3. package/dist/adapters/base.d.ts +31 -3
  4. package/dist/adapters/base.d.ts.map +1 -1
  5. package/dist/adapters/base.js +235 -26
  6. package/dist/adapters/base.js.map +1 -1
  7. package/dist/adapters/gemini.d.ts +1 -1
  8. package/dist/adapters/gemini.d.ts.map +1 -1
  9. package/dist/adapters/gemini.js +12 -7
  10. package/dist/adapters/gemini.js.map +1 -1
  11. package/dist/adapters/openai.d.ts +1 -1
  12. package/dist/adapters/openai.d.ts.map +1 -1
  13. package/dist/adapters/openai.js +14 -9
  14. package/dist/adapters/openai.js.map +1 -1
  15. package/dist/adapters/rest.d.ts +3 -1
  16. package/dist/adapters/rest.d.ts.map +1 -1
  17. package/dist/adapters/rest.js +99 -15
  18. package/dist/adapters/rest.js.map +1 -1
  19. package/dist/cli/index.js +678 -138
  20. package/dist/cli/index.js.map +1 -1
  21. package/dist/config/config-guard.d.ts.map +1 -1
  22. package/dist/config/config-guard.js +3 -2
  23. package/dist/config/config-guard.js.map +1 -1
  24. package/dist/config/config-hmac.d.ts +5 -0
  25. package/dist/config/config-hmac.d.ts.map +1 -0
  26. package/dist/config/config-hmac.js +29 -0
  27. package/dist/config/config-hmac.js.map +1 -0
  28. package/dist/config/manager.d.ts +20 -2
  29. package/dist/config/manager.d.ts.map +1 -1
  30. package/dist/config/manager.js +103 -26
  31. package/dist/config/manager.js.map +1 -1
  32. package/dist/mcp/server.d.ts +1 -1
  33. package/dist/mcp/server.d.ts.map +1 -1
  34. package/dist/mcp/server.js +8 -4
  35. package/dist/mcp/server.js.map +1 -1
  36. package/dist/server/unified.d.ts +4 -1
  37. package/dist/server/unified.d.ts.map +1 -1
  38. package/dist/server/unified.js +108 -39
  39. package/dist/server/unified.js.map +1 -1
  40. package/dist/service/config.d.ts +21 -0
  41. package/dist/service/config.d.ts.map +1 -0
  42. package/dist/service/config.js +94 -0
  43. package/dist/service/config.js.map +1 -0
  44. package/dist/service/generators.d.ts +14 -0
  45. package/dist/service/generators.d.ts.map +1 -0
  46. package/dist/service/generators.js +92 -0
  47. package/dist/service/generators.js.map +1 -0
  48. package/dist/service/index.d.ts +23 -0
  49. package/dist/service/index.d.ts.map +1 -0
  50. package/dist/service/index.js +215 -0
  51. package/dist/service/index.js.map +1 -0
  52. package/dist/service/platform.d.ts +5 -0
  53. package/dist/service/platform.d.ts.map +1 -0
  54. package/dist/service/platform.js +25 -0
  55. package/dist/service/platform.js.map +1 -0
  56. package/dist/storage/index.d.ts +52 -10
  57. package/dist/storage/index.d.ts.map +1 -1
  58. package/dist/storage/index.js +350 -31
  59. package/dist/storage/index.js.map +1 -1
  60. package/dist/types.d.ts +574 -14
  61. package/dist/types.d.ts.map +1 -1
  62. package/dist/types.js +79 -2
  63. package/dist/types.js.map +1 -1
  64. package/dist/utils/crypto.d.ts +9 -0
  65. package/dist/utils/crypto.d.ts.map +1 -1
  66. package/dist/utils/crypto.js +88 -19
  67. package/dist/utils/crypto.js.map +1 -1
  68. package/dist/utils/fs.d.ts +1 -0
  69. package/dist/utils/fs.d.ts.map +1 -1
  70. package/dist/utils/fs.js +12 -0
  71. package/dist/utils/fs.js.map +1 -1
  72. package/dist/utils/hsm.d.ts +82 -0
  73. package/dist/utils/hsm.d.ts.map +1 -0
  74. package/dist/utils/hsm.js +344 -0
  75. package/dist/utils/hsm.js.map +1 -0
  76. package/dist/utils/http.d.ts.map +1 -1
  77. package/dist/utils/http.js +14 -4
  78. package/dist/utils/http.js.map +1 -1
  79. package/dist/utils/keychain.d.ts.map +1 -1
  80. package/dist/utils/keychain.js +0 -8
  81. package/dist/utils/keychain.js.map +1 -1
  82. package/dist/utils/lock.d.ts +1 -1
  83. package/dist/utils/lock.d.ts.map +1 -1
  84. package/dist/utils/lock.js +4 -2
  85. package/dist/utils/lock.js.map +1 -1
  86. package/dist/utils/lockout.d.ts +56 -0
  87. package/dist/utils/lockout.d.ts.map +1 -0
  88. package/dist/utils/lockout.js +209 -0
  89. package/dist/utils/lockout.js.map +1 -0
  90. package/dist/utils/prompt.d.ts +13 -0
  91. package/dist/utils/prompt.d.ts.map +1 -0
  92. package/dist/utils/prompt.js +124 -0
  93. package/dist/utils/prompt.js.map +1 -0
  94. package/dist/utils/secure-memory.d.ts +20 -0
  95. package/dist/utils/secure-memory.d.ts.map +1 -0
  96. package/dist/utils/secure-memory.js +122 -0
  97. package/dist/utils/secure-memory.js.map +1 -0
  98. package/dist/utils/session.d.ts.map +1 -1
  99. package/dist/utils/session.js +14 -4
  100. package/dist/utils/session.js.map +1 -1
  101. package/dist/utils/update-checker.d.ts +1 -1
  102. package/dist/utils/update-checker.d.ts.map +1 -1
  103. package/dist/utils/update-checker.js +7 -5
  104. package/dist/utils/update-checker.js.map +1 -1
  105. package/dist/vault/index.d.ts +2 -0
  106. package/dist/vault/index.d.ts.map +1 -1
  107. package/dist/vault/index.js +12 -2
  108. package/dist/vault/index.js.map +1 -1
  109. package/dist/version.d.ts +2 -0
  110. package/dist/version.d.ts.map +1 -0
  111. package/dist/version.js +8 -0
  112. package/dist/version.js.map +1 -0
  113. package/package.json +18 -9
  114. package/scripts/sync-version.js +88 -0
  115. package/scripts/install.sh +0 -54
@@ -3,14 +3,13 @@ import * as nodefs from 'fs/promises';
3
3
  import * as path from 'path';
4
4
  import { withLock } from '../utils/lock.js';
5
5
  import { ensureDir, pathExists } from '../utils/fs.js';
6
+ import { AuditConfigSchema } from '../types.js';
7
+ import * as crypto from 'crypto';
6
8
  import { encrypt, decrypt } from '../utils/crypto.js';
7
- /**
8
- * Manages encrypted or plaintext storage of named secret variables.
9
- * Uses atomic writes (tmp → rename) and file locking to prevent corruption
10
- * under concurrent access. Automatically rotates backups on every write.
11
- *
12
- * @security All file paths are verified with `lstat` to reject symlink attacks.
13
- */
9
+ import { execFile as execFileCallback } from 'child_process';
10
+ import { promisify } from 'util';
11
+ import { secureZero } from '../utils/secure-memory.js';
12
+ const execFile = promisify(execFileCallback);
14
13
  export class StorageManager {
15
14
  storePath;
16
15
  encrypted;
@@ -23,6 +22,7 @@ export class StorageManager {
23
22
  this.maxBackups = maxBackups;
24
23
  }
25
24
  setPassword(password) {
25
+ // eslint-disable-next-line security/detect-possible-timing-attacks -- comparing new password value to detect changes, not authenticating
26
26
  if (this.password !== password) {
27
27
  this.password = password;
28
28
  this.cache = null;
@@ -63,7 +63,6 @@ export class StorageManager {
63
63
  return this.cache;
64
64
  }
65
65
  catch (error) {
66
- // Try auto-restore from backups
67
66
  const restored = await this.tryRestoreFromBackup();
68
67
  if (restored !== null) {
69
68
  this.cache = restored;
@@ -77,12 +76,12 @@ export class StorageManager {
77
76
  }
78
77
  async save(variables) {
79
78
  this.cache = variables;
80
- const data = JSON.stringify(variables, null, 2);
79
+ const data = this.encrypted
80
+ ? JSON.stringify(variables)
81
+ : JSON.stringify(variables, null, 2);
81
82
  const storeDir = path.dirname(this.storePath);
82
83
  await ensureDir(storeDir);
83
84
  await nodefs.chmod(storeDir, 0o700);
84
- // Ensure the store file exists for locking
85
- await nodefs.writeFile(this.storePath, '', { encoding: 'utf8', flag: 'a' });
86
85
  await withLock(this.storePath, async () => {
87
86
  await this.rotateBackups();
88
87
  const content = this.encrypted && this.password
@@ -99,7 +98,6 @@ export class StorageManager {
99
98
  return;
100
99
  if (!await pathExists(this.storePath))
101
100
  return;
102
- // Shift existing backups: .bak.2 -> .bak.3, .bak.1 -> .bak.2, etc.
103
101
  for (let i = this.maxBackups; i > 1; i--) {
104
102
  const from = `${this.storePath}.bak.${i - 1}`;
105
103
  const to = `${this.storePath}.bak.${i}`;
@@ -107,16 +105,18 @@ export class StorageManager {
107
105
  await nodefs.rename(from, to);
108
106
  }
109
107
  catch (err) {
110
- if (err.code !== 'ENOENT')
108
+ const code = err.code;
109
+ /* istanbul ignore else -- non-ENOENT errors during backup rotation are rare */
110
+ if (code !== 'ENOENT')
111
111
  throw err;
112
112
  }
113
113
  }
114
- // Copy current store to .bak.1
115
114
  await nodefs.cp(this.storePath, `${this.storePath}.bak.1`);
116
115
  await nodefs.chmod(`${this.storePath}.bak.1`, 0o600);
117
116
  }
118
117
  async tryRestoreFromBackup() {
119
- if (!this.encrypted || !this.password)
118
+ /* istanbul ignore if -- password is checked before calling, null case is defensive */
119
+ if (!this.password)
120
120
  return null;
121
121
  for (let i = 1; i <= this.maxBackups; i++) {
122
122
  const bakPath = `${this.storePath}.bak.${i}`;
@@ -132,13 +132,18 @@ export class StorageManager {
132
132
  try {
133
133
  const decrypted = await decrypt(data, this.password);
134
134
  const variables = JSON.parse(decrypted);
135
- // Restore: copy backup to primary store
136
- await nodefs.cp(bakPath, this.storePath);
137
- await nodefs.chmod(this.storePath, 0o600);
135
+ // SECURITY: Surface the restore loudly. Silent restore could mask
136
+ // tampering — make sure the user sees this and can investigate.
137
+ process.stderr.write(`\n[envcp] WARNING: primary store failed to decrypt; ` +
138
+ `recovered variables from backup ${bakPath}.\n` +
139
+ `[envcp] The primary store was NOT overwritten — it still contains ` +
140
+ `corrupted data. The next save will write a fresh copy.\n` +
141
+ `[envcp] If you did not expect this, your store may have been ` +
142
+ `tampered with or corrupted. Inspect '${this.storePath}.bak.*' ` +
143
+ `before continuing.\n\n`);
138
144
  return variables;
139
145
  }
140
146
  catch {
141
- // This backup is also bad, try next
142
147
  }
143
148
  }
144
149
  return null;
@@ -174,7 +179,13 @@ export class StorageManager {
174
179
  async verify() {
175
180
  let data;
176
181
  try {
177
- data = await nodefs.readFile(this.storePath, 'utf8');
182
+ const rh = await nodefs.open(this.storePath, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);
183
+ try {
184
+ data = await rh.readFile({ encoding: 'utf8' });
185
+ }
186
+ finally {
187
+ await rh.close();
188
+ }
178
189
  }
179
190
  catch {
180
191
  return { valid: false, error: 'Store file does not exist or cannot be read' };
@@ -191,11 +202,9 @@ export class StorageManager {
191
202
  else {
192
203
  variables = JSON.parse(data);
193
204
  }
194
- // Verify structure
195
205
  if (typeof variables !== 'object' || variables === null) {
196
206
  return { valid: false, error: 'Store data is not a valid object' };
197
207
  }
198
- // Count valid backups
199
208
  let backups = 0;
200
209
  for (let i = 1; i <= this.maxBackups; i++) {
201
210
  try {
@@ -203,7 +212,6 @@ export class StorageManager {
203
212
  backups++;
204
213
  }
205
214
  catch {
206
- // backup doesn't exist
207
215
  }
208
216
  }
209
217
  return { valid: true, count: Object.keys(variables).length, backups };
@@ -213,29 +221,340 @@ export class StorageManager {
213
221
  return { valid: false, error: `Store verification failed: ${message}` };
214
222
  }
215
223
  }
224
+ destroy() {
225
+ this.cache = null;
226
+ this.password = undefined;
227
+ }
228
+ }
229
+ /**
230
+ * Resolve the absolute directory to store audit logs in.
231
+ *
232
+ * Honors `audit.log_path` with these forms:
233
+ * - unset → default `<projectPath>/.envcp/logs` (backward compatible)
234
+ * - "project:REL" → `<projectPath>/REL`
235
+ * - starts with `~` → expanded against $HOME (or projectPath if unavailable)
236
+ * - absolute path → used as-is
237
+ * - relative path → treated as project-relative
238
+ *
239
+ * Rejects `..` traversal in the `project:` form.
240
+ */
241
+ export function resolveLogPath(audit, projectPath) {
242
+ const raw = audit?.log_path;
243
+ if (!raw)
244
+ return path.join(projectPath, '.envcp', 'logs');
245
+ if (raw.startsWith('project:')) {
246
+ const rel = raw.slice('project:'.length);
247
+ const joined = path.resolve(projectPath, rel);
248
+ if (!joined.startsWith(path.resolve(projectPath) + path.sep) && joined !== path.resolve(projectPath)) {
249
+ throw new Error(`audit.log_path "${raw}" escapes project directory`);
250
+ }
251
+ return joined;
252
+ }
253
+ if (raw.startsWith('~')) {
254
+ const home = process.env.HOME || process.env.USERPROFILE || projectPath;
255
+ return path.resolve(home, raw.replace(/^~\/?/, ''));
256
+ }
257
+ if (path.isAbsolute(raw))
258
+ return raw;
259
+ return path.resolve(projectPath, raw);
216
260
  }
217
261
  export class LogManager {
218
262
  logDir;
219
- constructor(logDir) {
263
+ auditConfig;
264
+ hmacKey = null;
265
+ lastHmac = null;
266
+ chainIndex = 0;
267
+ chainLoaded = false;
268
+ constructor(logDir, auditConfig) {
220
269
  this.logDir = logDir;
270
+ this.auditConfig = auditConfig ?? AuditConfigSchema.parse({});
221
271
  }
222
272
  async init() {
223
273
  await ensureDir(this.logDir);
274
+ if (this.auditConfig.hmac) {
275
+ await this.loadOrCreateHmacKey();
276
+ }
277
+ if (this.auditConfig.hmac_chain) {
278
+ await this.loadLastChainState();
279
+ }
280
+ await this.pruneOldLogs(this.auditConfig.retain_days);
281
+ }
282
+ async loadLastChainState() {
283
+ if (this.chainLoaded)
284
+ return;
285
+ const dates = await this.getLogDates();
286
+ if (dates.length === 0) {
287
+ this.chainLoaded = true;
288
+ return;
289
+ }
290
+ for (const date of dates.slice().reverse()) {
291
+ const entries = await this.getLogs({ date });
292
+ if (entries.length > 0) {
293
+ const lastEntry = entries[entries.length - 1];
294
+ if (lastEntry.hmac) {
295
+ this.lastHmac = lastEntry.hmac;
296
+ }
297
+ if (lastEntry.chain_index !== undefined) {
298
+ this.chainIndex = lastEntry.chain_index + 1;
299
+ }
300
+ break;
301
+ }
302
+ }
303
+ this.chainLoaded = true;
304
+ }
305
+ async loadOrCreateHmacKey() {
306
+ const keyPath = path.join(path.dirname(this.logDir), path.basename(this.auditConfig.hmac_key_path));
307
+ try {
308
+ const raw = await nodefs.readFile(keyPath);
309
+ this.hmacKey = raw;
310
+ }
311
+ catch {
312
+ const key = crypto.randomBytes(32);
313
+ await ensureDir(path.dirname(keyPath));
314
+ const fh = await nodefs.open(keyPath, fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_TRUNC | fs.constants.O_NOFOLLOW, 0o600);
315
+ try {
316
+ await fh.writeFile(key);
317
+ }
318
+ finally {
319
+ await fh.close();
320
+ }
321
+ this.hmacKey = key;
322
+ }
323
+ }
324
+ signEntry(entry, prevHmac) {
325
+ /* istanbul ignore if -- hmacKey null case is fallback when HMAC disabled */
326
+ if (!this.hmacKey)
327
+ return crypto.createHash('sha256').update(JSON.stringify(entry)).digest('hex');
328
+ const dataToSign = prevHmac
329
+ ? JSON.stringify({ ...entry, prev_hmac: prevHmac })
330
+ : JSON.stringify(entry);
331
+ return crypto.createHmac('sha256', this.hmacKey).update(dataToSign).digest('hex');
332
+ }
333
+ verifyEntry(entry) {
334
+ if (!this.hmacKey || !entry.hmac)
335
+ return true;
336
+ const { hmac, ...rest } = entry;
337
+ const expected = this.signEntry(rest, entry.prev_hmac);
338
+ try {
339
+ return crypto.timingSafeEqual(Buffer.from(hmac, 'hex'), Buffer.from(expected, 'hex'));
340
+ }
341
+ catch {
342
+ return false;
343
+ }
344
+ }
345
+ async verifyLogChain(date) {
346
+ if (!this.auditConfig.hmac_chain) {
347
+ return { valid: true, entries: 0, tampered: [] };
348
+ }
349
+ const dates = date ? [date] : await this.getLogDates();
350
+ let totalEntries = 0;
351
+ const tampered = [];
352
+ let expectedPrevHmac;
353
+ for (const d of dates) {
354
+ const entries = await this.getLogs({ date: d });
355
+ for (let i = 0; i < entries.length; i++) {
356
+ const entry = entries[i];
357
+ totalEntries++;
358
+ if (!this.verifyEntry(entry)) {
359
+ tampered.push(entry.chain_index ?? totalEntries - 1);
360
+ continue;
361
+ }
362
+ if (expectedPrevHmac !== undefined && entry.prev_hmac !== expectedPrevHmac) {
363
+ tampered.push(entry.chain_index ?? totalEntries - 1);
364
+ }
365
+ if (entry.hmac) {
366
+ expectedPrevHmac = entry.hmac;
367
+ }
368
+ }
369
+ }
370
+ return { valid: tampered.length === 0, entries: totalEntries, tampered };
371
+ }
372
+ applyFieldFilter(entry) {
373
+ const f = this.auditConfig.fields;
374
+ const filtered = {
375
+ timestamp: entry.timestamp,
376
+ operation: entry.operation,
377
+ source: entry.source,
378
+ success: entry.success,
379
+ };
380
+ if (f.variable && entry.variable !== undefined)
381
+ filtered.variable = entry.variable;
382
+ if (f.message && entry.message !== undefined)
383
+ filtered.message = entry.message;
384
+ if (f.session_id && entry.session_id !== undefined)
385
+ filtered.session_id = entry.session_id;
386
+ if (f.client_id && entry.client_id !== undefined)
387
+ filtered.client_id = entry.client_id;
388
+ if (f.client_type && entry.client_type !== undefined)
389
+ filtered.client_type = entry.client_type;
390
+ if (f.ip && entry.ip !== undefined)
391
+ filtered.ip = entry.ip;
392
+ if (f.user_agent && entry.user_agent !== undefined)
393
+ filtered.user_agent = entry.user_agent;
394
+ if (f.purpose && entry.purpose !== undefined)
395
+ filtered.purpose = entry.purpose;
396
+ if (f.duration_ms && entry.duration_ms !== undefined)
397
+ filtered.duration_ms = entry.duration_ms;
398
+ if (entry.prev_hmac !== undefined)
399
+ filtered.prev_hmac = entry.prev_hmac;
400
+ if (entry.chain_index !== undefined)
401
+ filtered.chain_index = entry.chain_index;
402
+ return filtered;
403
+ }
404
+ async pruneOldLogs(retainDays = 30) {
405
+ const cutoff = Date.now() - retainDays * 24 * 60 * 60 * 1000;
406
+ let entries;
407
+ try {
408
+ entries = await nodefs.readdir(this.logDir);
409
+ }
410
+ catch {
411
+ return;
412
+ }
413
+ for (const entry of entries) {
414
+ if (!entry.startsWith('operations-') || !entry.endsWith('.log'))
415
+ continue;
416
+ const filePath = path.join(this.logDir, entry);
417
+ try {
418
+ const stat = await nodefs.stat(filePath);
419
+ if (stat.mtimeMs < cutoff)
420
+ await nodefs.unlink(filePath);
421
+ }
422
+ catch { /* ignore missing/inaccessible files */ }
423
+ }
224
424
  }
225
425
  async log(entry) {
426
+ if (!this.auditConfig.enabled)
427
+ return;
428
+ const filtered = this.applyFieldFilter(entry);
429
+ if (this.auditConfig.hmac && this.hmacKey) {
430
+ if (this.auditConfig.hmac_chain) {
431
+ if (!this.chainLoaded) {
432
+ /* istanbul ignore next -- chainLoaded is set to true in init() */
433
+ await this.loadLastChainState();
434
+ }
435
+ if (this.lastHmac) {
436
+ filtered.prev_hmac = this.lastHmac;
437
+ }
438
+ filtered.chain_index = this.chainIndex;
439
+ filtered.hmac = this.signEntry(filtered, filtered.prev_hmac);
440
+ this.lastHmac = filtered.hmac;
441
+ this.chainIndex++;
442
+ }
443
+ else {
444
+ filtered.hmac = this.signEntry(filtered);
445
+ }
446
+ }
226
447
  const date = new Date().toISOString().split('T')[0];
227
448
  const logFile = path.join(this.logDir, `operations-${date}.log`);
228
- const logLine = JSON.stringify(entry) + '\n';
229
- await nodefs.appendFile(logFile, logLine);
449
+ await nodefs.appendFile(logFile, JSON.stringify(filtered) + '\n');
230
450
  }
231
- async getLogs(date) {
232
- const logDate = date || new Date().toISOString().split('T')[0];
451
+ async getLogs(filter = {}) {
452
+ const logDate = filter.date || new Date().toISOString().split('T')[0];
233
453
  const logFile = path.join(this.logDir, `operations-${logDate}.log`);
234
- if (!await pathExists(logFile)) {
454
+ if (!await pathExists(logFile))
235
455
  return [];
236
- }
237
456
  const content = await nodefs.readFile(logFile, 'utf8');
238
- return content.trim().split('\n').map(line => JSON.parse(line));
457
+ let entries = content
458
+ .trim()
459
+ .split('\n')
460
+ .filter(Boolean)
461
+ .map(line => JSON.parse(line));
462
+ if (filter.operation)
463
+ entries = entries.filter(e => e.operation === filter.operation);
464
+ if (filter.variable)
465
+ entries = entries.filter(e => e.variable === filter.variable);
466
+ if (filter.source)
467
+ entries = entries.filter(e => e.source === filter.source);
468
+ if (filter.success !== undefined)
469
+ entries = entries.filter(e => e.success === filter.success);
470
+ if (filter.tail && filter.tail > 0)
471
+ entries = entries.slice(-filter.tail);
472
+ return entries;
473
+ }
474
+ async execChattr(filePath, flags, remove = false) {
475
+ /* istanbul ignore if -- platform check is always linux in CI */
476
+ if (process.platform !== 'linux') {
477
+ return false;
478
+ }
479
+ // Validate flags - only allow +a, +i, -a, -i
480
+ const validFlags = ['+a', '+i', '-a', '-i'];
481
+ const attr = remove ? flags.replace(/\+/g, '-') : flags;
482
+ if (!validFlags.includes(attr)) {
483
+ /* istanbul ignore next -- invalid input path */
484
+ return false;
485
+ }
486
+ try {
487
+ // Use execFile with array arguments to avoid shell injection
488
+ // chattr must be in PATH
489
+ await execFile('chattr', [attr, filePath]);
490
+ /* istanbul ignore next -- requires sudo/root to test success path */
491
+ return true;
492
+ }
493
+ catch {
494
+ return false;
495
+ }
496
+ }
497
+ async setAppendOnly(filePath) {
498
+ return this.execChattr(filePath, '+a');
499
+ }
500
+ async setImmutable(filePath) {
501
+ return this.execChattr(filePath, '+i');
502
+ }
503
+ async removeAppendOnly(filePath) {
504
+ /* istanbul ignore next -- requires sudo/root to test success path */
505
+ return this.execChattr(filePath, '+a', true);
506
+ }
507
+ async removeImmutable(filePath) {
508
+ /* istanbul ignore next -- requires sudo/root to test success path */
509
+ return this.execChattr(filePath, '+i', true);
510
+ }
511
+ async protectLogFiles() {
512
+ const result = { protected: [], failed: [] };
513
+ if (this.auditConfig.protection === 'none') {
514
+ return result;
515
+ }
516
+ const dates = await this.getLogDates();
517
+ for (const date of dates) {
518
+ const logFile = path.join(this.logDir, `operations-${date}.log`);
519
+ let success;
520
+ if (this.auditConfig.protection === 'append_only') {
521
+ success = await this.setAppendOnly(logFile);
522
+ }
523
+ else if (this.auditConfig.protection === 'immutable') {
524
+ success = await this.setImmutable(logFile);
525
+ }
526
+ else {
527
+ continue;
528
+ }
529
+ if (success) {
530
+ /* istanbul ignore next -- requires sudo/root to test success path */
531
+ result.protected.push(logFile);
532
+ }
533
+ else {
534
+ result.failed.push(logFile);
535
+ }
536
+ }
537
+ return result;
538
+ }
539
+ async getLogDates() {
540
+ let entries;
541
+ try {
542
+ entries = await nodefs.readdir(this.logDir);
543
+ }
544
+ catch {
545
+ /* istanbul ignore next -- readdir failure returns empty array */
546
+ entries = [];
547
+ }
548
+ return entries
549
+ .filter(e => e.startsWith('operations-') && e.endsWith('.log'))
550
+ .map(e => e.replace('operations-', '').replace('.log', ''))
551
+ .sort();
552
+ }
553
+ destroy() {
554
+ if (this.hmacKey) {
555
+ secureZero(this.hmacKey);
556
+ this.hmacKey = null;
557
+ }
239
558
  }
240
559
  }
241
560
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"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"}