@fentz26/envcp 1.1.0 → 1.2.0-exp.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 (105) hide show
  1. package/README.md +59 -422
  2. package/VERSION +1 -0
  3. package/dist/adapters/base.d.ts +13 -0
  4. package/dist/adapters/base.d.ts.map +1 -1
  5. package/dist/adapters/base.js +153 -9
  6. package/dist/adapters/base.js.map +1 -1
  7. package/dist/adapters/gemini.d.ts.map +1 -1
  8. package/dist/adapters/gemini.js +7 -4
  9. package/dist/adapters/gemini.js.map +1 -1
  10. package/dist/adapters/openai.d.ts.map +1 -1
  11. package/dist/adapters/openai.js +9 -6
  12. package/dist/adapters/openai.js.map +1 -1
  13. package/dist/adapters/rest.d.ts +2 -0
  14. package/dist/adapters/rest.d.ts.map +1 -1
  15. package/dist/adapters/rest.js +72 -4
  16. package/dist/adapters/rest.js.map +1 -1
  17. package/dist/cli/index.js +519 -103
  18. package/dist/cli/index.js.map +1 -1
  19. package/dist/config/config-guard.d.ts.map +1 -1
  20. package/dist/config/config-guard.js +3 -2
  21. package/dist/config/config-guard.js.map +1 -1
  22. package/dist/config/config-hmac.d.ts +5 -0
  23. package/dist/config/config-hmac.d.ts.map +1 -0
  24. package/dist/config/config-hmac.js +29 -0
  25. package/dist/config/config-hmac.js.map +1 -0
  26. package/dist/config/manager.d.ts +14 -0
  27. package/dist/config/manager.d.ts.map +1 -1
  28. package/dist/config/manager.js +72 -13
  29. package/dist/config/manager.js.map +1 -1
  30. package/dist/mcp/server.d.ts.map +1 -1
  31. package/dist/mcp/server.js +2 -1
  32. package/dist/mcp/server.js.map +1 -1
  33. package/dist/server/unified.d.ts +4 -1
  34. package/dist/server/unified.d.ts.map +1 -1
  35. package/dist/server/unified.js +102 -33
  36. package/dist/server/unified.js.map +1 -1
  37. package/dist/service/config.d.ts +21 -0
  38. package/dist/service/config.d.ts.map +1 -0
  39. package/dist/service/config.js +94 -0
  40. package/dist/service/config.js.map +1 -0
  41. package/dist/service/generators.d.ts +14 -0
  42. package/dist/service/generators.d.ts.map +1 -0
  43. package/dist/service/generators.js +92 -0
  44. package/dist/service/generators.js.map +1 -0
  45. package/dist/service/index.d.ts +23 -0
  46. package/dist/service/index.d.ts.map +1 -0
  47. package/dist/service/index.js +215 -0
  48. package/dist/service/index.js.map +1 -0
  49. package/dist/service/platform.d.ts +5 -0
  50. package/dist/service/platform.d.ts.map +1 -0
  51. package/dist/service/platform.js +25 -0
  52. package/dist/service/platform.js.map +1 -0
  53. package/dist/storage/index.d.ts +39 -10
  54. package/dist/storage/index.d.ts.map +1 -1
  55. package/dist/storage/index.js +318 -31
  56. package/dist/storage/index.js.map +1 -1
  57. package/dist/types.d.ts +545 -14
  58. package/dist/types.d.ts.map +1 -1
  59. package/dist/types.js +74 -2
  60. package/dist/types.js.map +1 -1
  61. package/dist/utils/crypto.d.ts +9 -0
  62. package/dist/utils/crypto.d.ts.map +1 -1
  63. package/dist/utils/crypto.js +88 -19
  64. package/dist/utils/crypto.js.map +1 -1
  65. package/dist/utils/hsm.d.ts +82 -0
  66. package/dist/utils/hsm.d.ts.map +1 -0
  67. package/dist/utils/hsm.js +344 -0
  68. package/dist/utils/hsm.js.map +1 -0
  69. package/dist/utils/http.d.ts.map +1 -1
  70. package/dist/utils/http.js +14 -4
  71. package/dist/utils/http.js.map +1 -1
  72. package/dist/utils/keychain.d.ts.map +1 -1
  73. package/dist/utils/keychain.js +0 -8
  74. package/dist/utils/keychain.js.map +1 -1
  75. package/dist/utils/lock.d.ts +1 -1
  76. package/dist/utils/lock.d.ts.map +1 -1
  77. package/dist/utils/lock.js +4 -2
  78. package/dist/utils/lock.js.map +1 -1
  79. package/dist/utils/lockout.d.ts +56 -0
  80. package/dist/utils/lockout.d.ts.map +1 -0
  81. package/dist/utils/lockout.js +209 -0
  82. package/dist/utils/lockout.js.map +1 -0
  83. package/dist/utils/prompt.d.ts +13 -0
  84. package/dist/utils/prompt.d.ts.map +1 -0
  85. package/dist/utils/prompt.js +124 -0
  86. package/dist/utils/prompt.js.map +1 -0
  87. package/dist/utils/secure-memory.d.ts +20 -0
  88. package/dist/utils/secure-memory.d.ts.map +1 -0
  89. package/dist/utils/secure-memory.js +122 -0
  90. package/dist/utils/secure-memory.js.map +1 -0
  91. package/dist/utils/session.d.ts.map +1 -1
  92. package/dist/utils/session.js +14 -4
  93. package/dist/utils/session.js.map +1 -1
  94. package/dist/utils/update-checker.d.ts +1 -1
  95. package/dist/utils/update-checker.d.ts.map +1 -1
  96. package/dist/utils/update-checker.js +7 -5
  97. package/dist/utils/update-checker.js.map +1 -1
  98. package/dist/vault/index.d.ts.map +1 -1
  99. package/dist/version.d.ts +2 -0
  100. package/dist/version.d.ts.map +1 -0
  101. package/dist/version.js +8 -0
  102. package/dist/version.js.map +1 -0
  103. package/package.json +18 -9
  104. package/scripts/sync-version.js +88 -0
  105. package/scripts/install.sh +0 -54
@@ -1,11 +1,4 @@
1
- import { Variable, OperationLog } from '../types.js';
2
- /**
3
- * Manages encrypted or plaintext storage of named secret variables.
4
- * Uses atomic writes (tmp → rename) and file locking to prevent corruption
5
- * under concurrent access. Automatically rotates backups on every write.
6
- *
7
- * @security All file paths are verified with `lstat` to reject symlink attacks.
8
- */
1
+ import { Variable, OperationLog, AuditConfig } from '../types.js';
9
2
  export declare class StorageManager {
10
3
  private storePath;
11
4
  readonly encrypted: boolean;
@@ -30,12 +23,48 @@ export declare class StorageManager {
30
23
  count?: number;
31
24
  backups?: number;
32
25
  }>;
26
+ destroy(): void;
27
+ }
28
+ export interface LogFilter {
29
+ date?: string;
30
+ operation?: string;
31
+ variable?: string;
32
+ source?: string;
33
+ success?: boolean;
34
+ tail?: number;
33
35
  }
34
36
  export declare class LogManager {
35
37
  private logDir;
36
- constructor(logDir: string);
38
+ private auditConfig;
39
+ private hmacKey;
40
+ private lastHmac;
41
+ private chainIndex;
42
+ private chainLoaded;
43
+ constructor(logDir: string, auditConfig?: AuditConfig);
37
44
  init(): Promise<void>;
45
+ private loadLastChainState;
46
+ private loadOrCreateHmacKey;
47
+ private signEntry;
48
+ verifyEntry(entry: OperationLog): boolean;
49
+ verifyLogChain(date?: string): Promise<{
50
+ valid: boolean;
51
+ entries: number;
52
+ tampered: number[];
53
+ }>;
54
+ private applyFieldFilter;
55
+ pruneOldLogs(retainDays?: number): Promise<void>;
38
56
  log(entry: OperationLog): Promise<void>;
39
- getLogs(date?: string): Promise<OperationLog[]>;
57
+ getLogs(filter?: LogFilter): Promise<OperationLog[]>;
58
+ private execChattr;
59
+ setAppendOnly(filePath: string): Promise<boolean>;
60
+ setImmutable(filePath: string): Promise<boolean>;
61
+ removeAppendOnly(filePath: string): Promise<boolean>;
62
+ removeImmutable(filePath: string): Promise<boolean>;
63
+ protectLogFiles(): Promise<{
64
+ protected: string[];
65
+ failed: string[];
66
+ }>;
67
+ getLogDates(): Promise<string[]>;
68
+ destroy(): void;
40
69
  }
41
70
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGrD;;;;;;GAMG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,SAAgB,SAAS,EAAE,OAAO,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAyC;IACtD,OAAO,CAAC,UAAU,CAAS;gBAEf,SAAS,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc,EAAE,UAAU,GAAE,MAAU;IAMhF,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAO7B,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAgDzC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAyBhD,aAAa;YAoBb,oBAAoB;IA8B5B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAKhD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUtC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKzB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC,eAAe,IAAI,IAAI;IAIjB,MAAM,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CA2C9F;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAIpB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,GAAG,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAWtD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"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"}
@@ -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,308 @@ 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
+ }
216
228
  }
217
229
  export class LogManager {
218
230
  logDir;
219
- constructor(logDir) {
231
+ auditConfig;
232
+ hmacKey = null;
233
+ lastHmac = null;
234
+ chainIndex = 0;
235
+ chainLoaded = false;
236
+ constructor(logDir, auditConfig) {
220
237
  this.logDir = logDir;
238
+ this.auditConfig = auditConfig ?? AuditConfigSchema.parse({});
221
239
  }
222
240
  async init() {
223
241
  await ensureDir(this.logDir);
242
+ if (this.auditConfig.hmac) {
243
+ await this.loadOrCreateHmacKey();
244
+ }
245
+ if (this.auditConfig.hmac_chain) {
246
+ await this.loadLastChainState();
247
+ }
248
+ await this.pruneOldLogs(this.auditConfig.retain_days);
249
+ }
250
+ async loadLastChainState() {
251
+ if (this.chainLoaded)
252
+ return;
253
+ const dates = await this.getLogDates();
254
+ if (dates.length === 0) {
255
+ this.chainLoaded = true;
256
+ return;
257
+ }
258
+ for (const date of dates.slice().reverse()) {
259
+ const entries = await this.getLogs({ date });
260
+ if (entries.length > 0) {
261
+ const lastEntry = entries[entries.length - 1];
262
+ if (lastEntry.hmac) {
263
+ this.lastHmac = lastEntry.hmac;
264
+ }
265
+ if (lastEntry.chain_index !== undefined) {
266
+ this.chainIndex = lastEntry.chain_index + 1;
267
+ }
268
+ break;
269
+ }
270
+ }
271
+ this.chainLoaded = true;
272
+ }
273
+ async loadOrCreateHmacKey() {
274
+ const keyPath = path.join(path.dirname(this.logDir), path.basename(this.auditConfig.hmac_key_path));
275
+ try {
276
+ const raw = await nodefs.readFile(keyPath);
277
+ this.hmacKey = raw;
278
+ }
279
+ catch {
280
+ const key = crypto.randomBytes(32);
281
+ await ensureDir(path.dirname(keyPath));
282
+ const fh = await nodefs.open(keyPath, fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_TRUNC | fs.constants.O_NOFOLLOW, 0o600);
283
+ try {
284
+ await fh.writeFile(key);
285
+ }
286
+ finally {
287
+ await fh.close();
288
+ }
289
+ this.hmacKey = key;
290
+ }
291
+ }
292
+ signEntry(entry, prevHmac) {
293
+ /* istanbul ignore if -- hmacKey null case is fallback when HMAC disabled */
294
+ if (!this.hmacKey)
295
+ return crypto.createHash('sha256').update(JSON.stringify(entry)).digest('hex');
296
+ const dataToSign = prevHmac
297
+ ? JSON.stringify({ ...entry, prev_hmac: prevHmac })
298
+ : JSON.stringify(entry);
299
+ return crypto.createHmac('sha256', this.hmacKey).update(dataToSign).digest('hex');
300
+ }
301
+ verifyEntry(entry) {
302
+ if (!this.hmacKey || !entry.hmac)
303
+ return true;
304
+ const { hmac, ...rest } = entry;
305
+ const expected = this.signEntry(rest, entry.prev_hmac);
306
+ try {
307
+ return crypto.timingSafeEqual(Buffer.from(hmac, 'hex'), Buffer.from(expected, 'hex'));
308
+ }
309
+ catch {
310
+ return false;
311
+ }
312
+ }
313
+ async verifyLogChain(date) {
314
+ if (!this.auditConfig.hmac_chain) {
315
+ return { valid: true, entries: 0, tampered: [] };
316
+ }
317
+ const dates = date ? [date] : await this.getLogDates();
318
+ let totalEntries = 0;
319
+ const tampered = [];
320
+ let expectedPrevHmac;
321
+ for (const d of dates) {
322
+ const entries = await this.getLogs({ date: d });
323
+ for (let i = 0; i < entries.length; i++) {
324
+ const entry = entries[i];
325
+ totalEntries++;
326
+ if (!this.verifyEntry(entry)) {
327
+ tampered.push(entry.chain_index ?? totalEntries - 1);
328
+ continue;
329
+ }
330
+ if (expectedPrevHmac !== undefined && entry.prev_hmac !== expectedPrevHmac) {
331
+ tampered.push(entry.chain_index ?? totalEntries - 1);
332
+ }
333
+ if (entry.hmac) {
334
+ expectedPrevHmac = entry.hmac;
335
+ }
336
+ }
337
+ }
338
+ return { valid: tampered.length === 0, entries: totalEntries, tampered };
339
+ }
340
+ applyFieldFilter(entry) {
341
+ const f = this.auditConfig.fields;
342
+ const filtered = {
343
+ timestamp: entry.timestamp,
344
+ operation: entry.operation,
345
+ source: entry.source,
346
+ success: entry.success,
347
+ };
348
+ if (f.variable && entry.variable !== undefined)
349
+ filtered.variable = entry.variable;
350
+ if (f.message && entry.message !== undefined)
351
+ filtered.message = entry.message;
352
+ if (f.session_id && entry.session_id !== undefined)
353
+ filtered.session_id = entry.session_id;
354
+ if (f.client_id && entry.client_id !== undefined)
355
+ filtered.client_id = entry.client_id;
356
+ if (f.client_type && entry.client_type !== undefined)
357
+ filtered.client_type = entry.client_type;
358
+ if (f.ip && entry.ip !== undefined)
359
+ filtered.ip = entry.ip;
360
+ if (f.user_agent && entry.user_agent !== undefined)
361
+ filtered.user_agent = entry.user_agent;
362
+ if (f.purpose && entry.purpose !== undefined)
363
+ filtered.purpose = entry.purpose;
364
+ if (f.duration_ms && entry.duration_ms !== undefined)
365
+ filtered.duration_ms = entry.duration_ms;
366
+ if (entry.prev_hmac !== undefined)
367
+ filtered.prev_hmac = entry.prev_hmac;
368
+ if (entry.chain_index !== undefined)
369
+ filtered.chain_index = entry.chain_index;
370
+ return filtered;
371
+ }
372
+ async pruneOldLogs(retainDays = 30) {
373
+ const cutoff = Date.now() - retainDays * 24 * 60 * 60 * 1000;
374
+ let entries;
375
+ try {
376
+ entries = await nodefs.readdir(this.logDir);
377
+ }
378
+ catch {
379
+ return;
380
+ }
381
+ for (const entry of entries) {
382
+ if (!entry.startsWith('operations-') || !entry.endsWith('.log'))
383
+ continue;
384
+ const filePath = path.join(this.logDir, entry);
385
+ try {
386
+ const stat = await nodefs.stat(filePath);
387
+ if (stat.mtimeMs < cutoff)
388
+ await nodefs.unlink(filePath);
389
+ }
390
+ catch { /* ignore missing/inaccessible files */ }
391
+ }
224
392
  }
225
393
  async log(entry) {
394
+ if (!this.auditConfig.enabled)
395
+ return;
396
+ const filtered = this.applyFieldFilter(entry);
397
+ if (this.auditConfig.hmac && this.hmacKey) {
398
+ if (this.auditConfig.hmac_chain) {
399
+ if (!this.chainLoaded) {
400
+ /* istanbul ignore next -- chainLoaded is set to true in init() */
401
+ await this.loadLastChainState();
402
+ }
403
+ if (this.lastHmac) {
404
+ filtered.prev_hmac = this.lastHmac;
405
+ }
406
+ filtered.chain_index = this.chainIndex;
407
+ filtered.hmac = this.signEntry(filtered, filtered.prev_hmac);
408
+ this.lastHmac = filtered.hmac;
409
+ this.chainIndex++;
410
+ }
411
+ else {
412
+ filtered.hmac = this.signEntry(filtered);
413
+ }
414
+ }
226
415
  const date = new Date().toISOString().split('T')[0];
227
416
  const logFile = path.join(this.logDir, `operations-${date}.log`);
228
- const logLine = JSON.stringify(entry) + '\n';
229
- await nodefs.appendFile(logFile, logLine);
417
+ await nodefs.appendFile(logFile, JSON.stringify(filtered) + '\n');
230
418
  }
231
- async getLogs(date) {
232
- const logDate = date || new Date().toISOString().split('T')[0];
419
+ async getLogs(filter = {}) {
420
+ const logDate = filter.date || new Date().toISOString().split('T')[0];
233
421
  const logFile = path.join(this.logDir, `operations-${logDate}.log`);
234
- if (!await pathExists(logFile)) {
422
+ if (!await pathExists(logFile))
235
423
  return [];
236
- }
237
424
  const content = await nodefs.readFile(logFile, 'utf8');
238
- return content.trim().split('\n').map(line => JSON.parse(line));
425
+ let entries = content
426
+ .trim()
427
+ .split('\n')
428
+ .filter(Boolean)
429
+ .map(line => JSON.parse(line));
430
+ if (filter.operation)
431
+ entries = entries.filter(e => e.operation === filter.operation);
432
+ if (filter.variable)
433
+ entries = entries.filter(e => e.variable === filter.variable);
434
+ if (filter.source)
435
+ entries = entries.filter(e => e.source === filter.source);
436
+ if (filter.success !== undefined)
437
+ entries = entries.filter(e => e.success === filter.success);
438
+ if (filter.tail && filter.tail > 0)
439
+ entries = entries.slice(-filter.tail);
440
+ return entries;
441
+ }
442
+ async execChattr(filePath, flags, remove = false) {
443
+ /* istanbul ignore if -- platform check is always linux in CI */
444
+ if (process.platform !== 'linux') {
445
+ return false;
446
+ }
447
+ // Validate flags - only allow +a, +i, -a, -i
448
+ const validFlags = ['+a', '+i', '-a', '-i'];
449
+ const attr = remove ? flags.replace(/\+/g, '-') : flags;
450
+ if (!validFlags.includes(attr)) {
451
+ /* istanbul ignore next -- invalid input path */
452
+ return false;
453
+ }
454
+ try {
455
+ // Use execFile with array arguments to avoid shell injection
456
+ // chattr must be in PATH
457
+ await execFile('chattr', [attr, filePath]);
458
+ /* istanbul ignore next -- requires sudo/root to test success path */
459
+ return true;
460
+ }
461
+ catch {
462
+ return false;
463
+ }
464
+ }
465
+ async setAppendOnly(filePath) {
466
+ return this.execChattr(filePath, '+a');
467
+ }
468
+ async setImmutable(filePath) {
469
+ return this.execChattr(filePath, '+i');
470
+ }
471
+ async removeAppendOnly(filePath) {
472
+ /* istanbul ignore next -- requires sudo/root to test success path */
473
+ return this.execChattr(filePath, '+a', true);
474
+ }
475
+ async removeImmutable(filePath) {
476
+ /* istanbul ignore next -- requires sudo/root to test success path */
477
+ return this.execChattr(filePath, '+i', true);
478
+ }
479
+ async protectLogFiles() {
480
+ const result = { protected: [], failed: [] };
481
+ if (this.auditConfig.protection === 'none') {
482
+ return result;
483
+ }
484
+ const dates = await this.getLogDates();
485
+ for (const date of dates) {
486
+ const logFile = path.join(this.logDir, `operations-${date}.log`);
487
+ let success;
488
+ if (this.auditConfig.protection === 'append_only') {
489
+ success = await this.setAppendOnly(logFile);
490
+ }
491
+ else if (this.auditConfig.protection === 'immutable') {
492
+ success = await this.setImmutable(logFile);
493
+ }
494
+ else {
495
+ continue;
496
+ }
497
+ if (success) {
498
+ /* istanbul ignore next -- requires sudo/root to test success path */
499
+ result.protected.push(logFile);
500
+ }
501
+ else {
502
+ result.failed.push(logFile);
503
+ }
504
+ }
505
+ return result;
506
+ }
507
+ async getLogDates() {
508
+ let entries;
509
+ try {
510
+ entries = await nodefs.readdir(this.logDir);
511
+ }
512
+ catch {
513
+ /* istanbul ignore next -- readdir failure returns empty array */
514
+ entries = [];
515
+ }
516
+ return entries
517
+ .filter(e => e.startsWith('operations-') && e.endsWith('.log'))
518
+ .map(e => e.replace('operations-', '').replace('.log', ''))
519
+ .sort();
520
+ }
521
+ destroy() {
522
+ if (this.hmacKey) {
523
+ secureZero(this.hmacKey);
524
+ this.hmacKey = null;
525
+ }
239
526
  }
240
527
  }
241
528
  //# 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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"}