claude-flow-novice 2.0.3 → 2.0.4
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/dist/src/cli/commands/guidance.js +487 -668
- package/dist/src/cli/commands/index-validate.js +18 -29
- package/dist/src/cli/commands/mcp-troubleshoot.js +230 -282
- package/dist/src/cli/commands/neural-goal-init.js +92 -125
- package/dist/src/cli/commands/swarm-exec.js +317 -393
- package/dist/src/cli/commands/swarm.js +1 -1
- package/dist/src/cli/commands/validate-framework.js +983 -1100
- package/dist/src/cli/commands/validate.js +144 -223
- package/dist/src/cli/simple-commands/__tests__/agent.test.js +265 -277
- package/dist/src/cli/simple-commands/__tests__/memory.test.js +6 -7
- package/dist/src/cli/simple-commands/__tests__/swarm.test.js +373 -356
- package/dist/src/cli/simple-commands/__tests__/task.test.js +6 -7
- package/dist/src/cli/simple-commands/agent.js +157 -193
- package/dist/src/cli/simple-commands/analysis.js +336 -446
- package/dist/src/cli/simple-commands/automation-executor.js +1095 -1339
- package/dist/src/cli/simple-commands/automation.js +481 -469
- package/dist/src/cli/simple-commands/batch-manager.js +261 -313
- package/dist/src/cli/simple-commands/claude-telemetry.js +241 -267
- package/dist/src/cli/simple-commands/claude-track.js +68 -90
- package/dist/src/cli/simple-commands/concurrent-display.js +266 -320
- package/dist/src/cli/simple-commands/config.js +245 -290
- package/dist/src/cli/simple-commands/coordination.js +182 -234
- package/dist/src/cli/simple-commands/enhanced-ui-views.js +812 -615
- package/dist/src/cli/simple-commands/enhanced-webui-complete.js +922 -981
- package/dist/src/cli/simple-commands/fix-hook-variables.js +274 -294
- package/dist/src/cli/simple-commands/github/gh-coordinator.js +378 -457
- package/dist/src/cli/simple-commands/github/github-api.js +535 -574
- package/dist/src/cli/simple-commands/github/init.js +276 -303
- package/dist/src/cli/simple-commands/github.js +222 -247
- package/dist/src/cli/simple-commands/goal.js +51 -63
- package/dist/src/cli/simple-commands/hive-mind/auto-save-middleware.js +208 -278
- package/dist/src/cli/simple-commands/hive-mind/communication.js +601 -696
- package/dist/src/cli/simple-commands/hive-mind/core.js +907 -979
- package/dist/src/cli/simple-commands/hive-mind/db-optimizer.js +406 -655
- package/dist/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1125 -1245
- package/dist/src/cli/simple-commands/hive-mind/memory.js +854 -1090
- package/dist/src/cli/simple-commands/hive-mind/performance-optimizer.js +459 -574
- package/dist/src/cli/simple-commands/hive-mind/performance-test.js +263 -347
- package/dist/src/cli/simple-commands/hive-mind/queen.js +727 -768
- package/dist/src/cli/simple-commands/hive-mind/session-manager.js +745 -1049
- package/dist/src/cli/simple-commands/hive-mind-optimize.js +227 -283
- package/dist/src/cli/simple-commands/hive-mind-wizard.js +174 -217
- package/dist/src/cli/simple-commands/hive-mind.js +1842 -2283
- package/dist/src/cli/simple-commands/hive.js +90 -79
- package/dist/src/cli/simple-commands/hook-safety.js +431 -521
- package/dist/src/cli/simple-commands/hooks/session-start-soul.js +203 -254
- package/dist/src/cli/simple-commands/hooks.js +1064 -1204
- package/dist/src/cli/simple-commands/init/agent-copier.js +294 -319
- package/dist/src/cli/simple-commands/init/batch-init.js +496 -562
- package/dist/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +61 -88
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +125 -150
- package/dist/src/cli/simple-commands/init/claude-commands/slash-commands.js +42 -49
- package/dist/src/cli/simple-commands/init/claude-commands/sparc-commands.js +43 -61
- package/dist/src/cli/simple-commands/init/copy-revised-templates.js +141 -147
- package/dist/src/cli/simple-commands/init/executable-wrapper.js +31 -44
- package/dist/src/cli/simple-commands/init/gitignore-updater.js +64 -90
- package/dist/src/cli/simple-commands/init/help.js +104 -107
- package/dist/src/cli/simple-commands/init/hive-mind-init.js +509 -528
- package/dist/src/cli/simple-commands/init/index.js +1510 -1759
- package/dist/src/cli/simple-commands/init/performance-monitor.js +234 -317
- package/dist/src/cli/simple-commands/init/rollback/backup-manager.js +441 -504
- package/dist/src/cli/simple-commands/init/rollback/index.js +289 -364
- package/dist/src/cli/simple-commands/init/rollback/recovery-manager.js +652 -728
- package/dist/src/cli/simple-commands/init/rollback/rollback-executor.js +416 -481
- package/dist/src/cli/simple-commands/init/rollback/state-tracker.js +369 -448
- package/dist/src/cli/simple-commands/init/sparc/roo-readme.js +1 -2
- package/dist/src/cli/simple-commands/init/sparc/roomodes-config.js +122 -99
- package/dist/src/cli/simple-commands/init/sparc/workflows.js +32 -37
- package/dist/src/cli/simple-commands/init/sparc-structure.js +55 -62
- package/dist/src/cli/simple-commands/init/template-copier.js +421 -533
- package/dist/src/cli/simple-commands/init/templates/coordination-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/enhanced-templates.js +344 -318
- package/dist/src/cli/simple-commands/init/templates/github-safe-enhanced.js +173 -218
- package/dist/src/cli/simple-commands/init/templates/github-safe.js +65 -75
- package/dist/src/cli/simple-commands/init/templates/memory-bank-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/readme-files.js +2 -4
- package/dist/src/cli/simple-commands/init/templates/safe-hook-patterns.js +187 -230
- package/dist/src/cli/simple-commands/init/templates/sparc-modes.js +53 -80
- package/dist/src/cli/simple-commands/init/templates/verification-claude-md.js +101 -85
- package/dist/src/cli/simple-commands/init/validation/config-validator.js +283 -330
- package/dist/src/cli/simple-commands/init/validation/health-checker.js +495 -561
- package/dist/src/cli/simple-commands/init/validation/index.js +302 -358
- package/dist/src/cli/simple-commands/init/validation/mode-validator.js +308 -359
- package/dist/src/cli/simple-commands/init/validation/post-init-validator.js +389 -366
- package/dist/src/cli/simple-commands/init/validation/pre-init-validator.js +270 -268
- package/dist/src/cli/simple-commands/init/validation/test-runner.js +427 -447
- package/dist/src/cli/simple-commands/init.js +1 -2
- package/dist/src/cli/simple-commands/mcp-health.js +131 -158
- package/dist/src/cli/simple-commands/mcp-integration-layer.js +533 -634
- package/dist/src/cli/simple-commands/mcp.js +345 -400
- package/dist/src/cli/simple-commands/memory-consolidation.js +426 -537
- package/dist/src/cli/simple-commands/memory.js +247 -311
- package/dist/src/cli/simple-commands/migrate-hooks.js +39 -46
- package/dist/src/cli/simple-commands/monitor.js +294 -363
- package/dist/src/cli/simple-commands/neural.js +51 -65
- package/dist/src/cli/simple-commands/pair-autofix-only.js +538 -662
- package/dist/src/cli/simple-commands/pair-basic.js +528 -656
- package/dist/src/cli/simple-commands/pair-old.js +430 -543
- package/dist/src/cli/simple-commands/pair-working.js +615 -751
- package/dist/src/cli/simple-commands/pair.js +615 -751
- package/dist/src/cli/simple-commands/performance-hooks.js +83 -111
- package/dist/src/cli/simple-commands/performance-metrics.js +348 -433
- package/dist/src/cli/simple-commands/process-ui-enhanced.js +708 -787
- package/dist/src/cli/simple-commands/process-ui.js +230 -254
- package/dist/src/cli/simple-commands/realtime-update-system.js +525 -611
- package/dist/src/cli/simple-commands/sparc/architecture.js +1704 -1530
- package/dist/src/cli/simple-commands/sparc/commands.js +438 -516
- package/dist/src/cli/simple-commands/sparc/completion.js +1224 -1481
- package/dist/src/cli/simple-commands/sparc/coordinator.js +913 -978
- package/dist/src/cli/simple-commands/sparc/index.js +241 -298
- package/dist/src/cli/simple-commands/sparc/phase-base.js +314 -390
- package/dist/src/cli/simple-commands/sparc/pseudocode.js +965 -869
- package/dist/src/cli/simple-commands/sparc/refinement.js +980 -1273
- package/dist/src/cli/simple-commands/sparc/specification.js +559 -645
- package/dist/src/cli/simple-commands/sparc-modes/architect.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/ask.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/code.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/debug.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/devops.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/docs-writer.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/generic.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/index.js +47 -55
- package/dist/src/cli/simple-commands/sparc-modes/integration.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/mcp.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/monitoring.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/optimization.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/security-review.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/supabase-admin.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/swarm.js +101 -87
- package/dist/src/cli/simple-commands/sparc-modes/tdd.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/tutorial.js +1 -1
- package/dist/src/cli/simple-commands/sparc.js +465 -493
- package/dist/src/cli/simple-commands/start-ui.js +108 -132
- package/dist/src/cli/simple-commands/start-wrapper.js +240 -268
- package/dist/src/cli/simple-commands/start.js +1 -1
- package/dist/src/cli/simple-commands/status.js +254 -275
- package/dist/src/cli/simple-commands/stream-chain-clean.js +128 -171
- package/dist/src/cli/simple-commands/stream-chain-fixed.js +61 -82
- package/dist/src/cli/simple-commands/stream-chain-real.js +267 -331
- package/dist/src/cli/simple-commands/stream-chain-working.js +211 -263
- package/dist/src/cli/simple-commands/stream-chain.js +260 -318
- package/dist/src/cli/simple-commands/stream-processor.js +290 -315
- package/dist/src/cli/simple-commands/swarm-executor.js +189 -222
- package/dist/src/cli/simple-commands/swarm-metrics-integration.js +208 -300
- package/dist/src/cli/simple-commands/swarm-ui.js +623 -703
- package/dist/src/cli/simple-commands/swarm-webui-integration.js +258 -286
- package/dist/src/cli/simple-commands/swarm.js +887 -1082
- package/dist/src/cli/simple-commands/task.js +161 -206
- package/dist/src/cli/simple-commands/timestamp-fix.js +59 -89
- package/dist/src/cli/simple-commands/token-tracker.js +258 -316
- package/dist/src/cli/simple-commands/tool-execution-framework.js +433 -519
- package/dist/src/cli/simple-commands/train-and-stream.js +275 -331
- package/dist/src/cli/simple-commands/training-pipeline.js +619 -725
- package/dist/src/cli/simple-commands/training.js +170 -227
- package/dist/src/cli/simple-commands/verification-hooks.js +261 -284
- package/dist/src/cli/simple-commands/verification-integration.js +389 -417
- package/dist/src/cli/simple-commands/verification-training-integration.js +486 -606
- package/dist/src/cli/simple-commands/verification.js +493 -513
- package/dist/src/cli/simple-commands/web-server.js +766 -836
- package/dist/src/cli/simple-commands/webui-validator.js +106 -124
- package/dist/src/coordination/event-bus/demo-wasm-integration.js +212 -251
- package/dist/src/coordination/event-bus/qe-event-bus.js +608 -748
- package/dist/src/coordination/event-bus/qe-event-bus.test.js +379 -454
- package/dist/src/coordination/iteration-tracker.js +363 -454
- package/dist/src/enterprise/analytics-manager.js +1135 -0
- package/dist/src/enterprise/audit-manager.js +1115 -0
- package/dist/src/enterprise/cloud-manager.js +891 -0
- package/dist/src/enterprise/deployment-manager.js +966 -0
- package/dist/src/enterprise/index.js +6 -0
- package/dist/src/enterprise/project-manager.js +584 -0
- package/dist/src/enterprise/security-manager.js +991 -0
- package/dist/src/index.js +1 -1
- package/dist/src/mcp/DEPRECATED.js +46 -60
- package/dist/src/mcp/fixes/mcp-error-fixes.js +115 -134
- package/dist/src/mcp/implementations/agent-tracker.js +114 -128
- package/dist/src/mcp/implementations/daa-tools.js +292 -350
- package/dist/src/mcp/implementations/workflow-tools.js +329 -361
- package/dist/src/mcp/mcp-config-manager.js +1183 -1331
- package/dist/src/mcp/mcp-server-novice-simplified.js +11 -17
- package/dist/src/mcp/mcp-server-novice.js +11 -17
- package/dist/src/mcp/mcp-server-sdk.js +11 -17
- package/dist/src/mcp/mcp-server.js +1620 -1484
- package/dist/src/mcp/ruv-swarm-wrapper.js +209 -239
- package/dist/src/memory/advanced-serializer.js +609 -589
- package/dist/src/memory/enhanced-examples.js +220 -305
- package/dist/src/memory/enhanced-memory.js +295 -336
- package/dist/src/memory/enhanced-session-serializer.js +408 -492
- package/dist/src/memory/fallback-memory-system.js +900 -1021
- package/dist/src/memory/fallback-store.js +93 -131
- package/dist/src/memory/high-performance-serialization.js +592 -730
- package/dist/src/memory/in-memory-store.js +161 -213
- package/dist/src/memory/index.js +123 -157
- package/dist/src/memory/lock-free-structures.js +578 -764
- package/dist/src/memory/memory-mapped-persistence.js +585 -766
- package/dist/src/memory/memory-pressure-manager.js +569 -707
- package/dist/src/memory/migration.js +358 -445
- package/dist/src/memory/shared-memory.js +641 -768
- package/dist/src/memory/sqlite-store.js +245 -325
- package/dist/src/memory/sqlite-wrapper.js +122 -151
- package/dist/src/memory/swarm-memory.js +470 -603
- package/dist/src/memory/test-example.js +126 -134
- package/dist/src/memory/ultra-fast-memory-store.js +622 -821
- package/dist/src/memory/unified-memory-manager.js +356 -437
- package/dist/src/migration/index.js +92 -0
- package/dist/src/migration/logger.js +121 -0
- package/dist/src/migration/migration-analyzer.js +268 -0
- package/dist/src/migration/migration-runner.js +522 -0
- package/dist/src/migration/migration-validator.js +285 -0
- package/dist/src/migration/progress-reporter.js +150 -0
- package/dist/src/migration/rollback-manager.js +321 -0
- package/dist/src/migration/tests/migration-system.test.js +7 -0
- package/dist/src/migration/types.js +3 -0
- package/dist/src/swarm/CodeRefactoringSwarm.js +777 -952
- package/dist/src/swarm/__tests__/integration.test.js +227 -0
- package/dist/src/swarm/__tests__/prompt-copier.test.js +344 -0
- package/dist/src/swarm/advanced-orchestrator.js +1095 -0
- package/dist/src/swarm/claude-code-interface.js +961 -0
- package/dist/src/swarm/claude-flow-executor.js +229 -0
- package/dist/src/swarm/consensus-coordinator.js +475 -0
- package/dist/src/swarm/coordinator.js +2993 -0
- package/dist/src/swarm/direct-executor.js +1180 -0
- package/dist/src/swarm/error-recovery/advanced-error-detection.js +691 -0
- package/dist/src/swarm/error-recovery/automated-recovery-workflows.js +998 -0
- package/dist/src/swarm/error-recovery/error-recovery-coordinator.js +1197 -0
- package/dist/src/swarm/error-recovery/recovery-monitoring.js +772 -0
- package/dist/src/swarm/error-recovery/resilience-architecture.js +714 -0
- package/dist/src/swarm/error-recovery/self-healing-mechanisms.js +1319 -0
- package/dist/src/swarm/error-recovery/test-error-recovery-effectiveness.js +808 -0
- package/dist/src/swarm/executor-v2.js +322 -0
- package/dist/src/swarm/executor.js +815 -0
- package/dist/src/swarm/hive-mind-integration.js +703 -0
- package/dist/src/swarm/index.js +41 -0
- package/dist/src/swarm/json-output-aggregator.js +267 -0
- package/dist/src/swarm/large-scale-coordinator.js +542 -0
- package/dist/src/swarm/mcp-integration-wrapper.js +628 -0
- package/dist/src/swarm/memory.js +1117 -0
- package/dist/src/swarm/optimizations/__tests__/optimization.test.js +348 -0
- package/dist/src/swarm/optimizations/async-file-manager.js +285 -0
- package/dist/src/swarm/optimizations/circular-buffer.js +162 -0
- package/dist/src/swarm/optimizations/connection-pool.js +244 -0
- package/dist/src/swarm/optimizations/index.js +28 -0
- package/dist/src/swarm/optimizations/optimized-executor.js +320 -0
- package/dist/src/swarm/optimizations/ttl-map.js +234 -0
- package/dist/src/swarm/prompt-cli.js +200 -0
- package/dist/src/swarm/prompt-copier-enhanced.js +202 -0
- package/dist/src/swarm/prompt-copier.js +381 -0
- package/dist/src/swarm/prompt-manager.js +295 -0
- package/dist/src/swarm/prompt-utils.js +310 -0
- package/dist/src/swarm/result-aggregator.js +718 -0
- package/dist/src/swarm/sparc-executor.js +1568 -0
- package/dist/src/swarm/strategies/auto.js +758 -0
- package/dist/src/swarm/strategies/base.js +128 -0
- package/dist/src/swarm/strategies/research.js +914 -0
- package/dist/src/swarm/strategies/strategy-metrics-patch.js +2 -0
- package/dist/src/swarm/types.js +52 -0
- package/dist/src/swarm/workers/copy-worker.js +56 -0
- package/dist/src/utils/__tests__/github-cli-safety-wrapper.test.js +332 -400
- package/dist/src/utils/github-cli-safe.js +56 -64
- package/dist/src/utils/github-cli-safety-wrapper.js +451 -546
- package/dist/src/utils/npx-isolated-cache.js +104 -119
- package/dist/src/utils/preference-manager.js +622 -652
- package/dist/src/utils/timezone-utils.js +86 -105
- package/dist/src/validators/epic-config-schema.js +214 -0
- package/dist/src/validators/index.js +10 -0
- package/dist/src/validators/swarm-init-validator.js +259 -0
- package/dist/src/validators/todowrite-batching-validator.js +215 -0
- package/dist/src/validators/todowrite-integration.js +187 -0
- package/package.json +2 -2
|
@@ -0,0 +1,1115 @@
|
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) {
|
|
3
|
+
Object.defineProperty(obj, key, {
|
|
4
|
+
value: value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
} else {
|
|
10
|
+
obj[key] = value;
|
|
11
|
+
}
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
import { EventEmitter } from "events";
|
|
15
|
+
import { writeFile, readFile, mkdir, readdir } from "node:fs/promises";
|
|
16
|
+
import { join } from "path";
|
|
17
|
+
import { createHash } from "crypto";
|
|
18
|
+
import { Logger } from "../core/logger.js";
|
|
19
|
+
import { ConfigManager } from "../core/config.js";
|
|
20
|
+
export class AuditManager extends EventEmitter {
|
|
21
|
+
async initialize() {
|
|
22
|
+
try {
|
|
23
|
+
await mkdir(this.auditPath, {
|
|
24
|
+
recursive: true
|
|
25
|
+
});
|
|
26
|
+
await mkdir(join(this.auditPath, 'trails'), {
|
|
27
|
+
recursive: true
|
|
28
|
+
});
|
|
29
|
+
await mkdir(join(this.auditPath, 'frameworks'), {
|
|
30
|
+
recursive: true
|
|
31
|
+
});
|
|
32
|
+
await mkdir(join(this.auditPath, 'reports'), {
|
|
33
|
+
recursive: true
|
|
34
|
+
});
|
|
35
|
+
await mkdir(join(this.auditPath, 'evidence'), {
|
|
36
|
+
recursive: true
|
|
37
|
+
});
|
|
38
|
+
await mkdir(join(this.auditPath, 'exports'), {
|
|
39
|
+
recursive: true
|
|
40
|
+
});
|
|
41
|
+
await this.loadConfigurations();
|
|
42
|
+
await this.initializeDefaultFrameworks();
|
|
43
|
+
await this.startAuditProcessing();
|
|
44
|
+
this.logger.info('Audit Manager initialized successfully');
|
|
45
|
+
} catch (error) {
|
|
46
|
+
this.logger.error('Failed to initialize Audit Manager', {
|
|
47
|
+
error
|
|
48
|
+
});
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async logAuditEvent(eventData) {
|
|
53
|
+
const entry = {
|
|
54
|
+
id: `audit-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
55
|
+
timestamp: new Date(),
|
|
56
|
+
eventType: eventData.eventType,
|
|
57
|
+
category: eventData.category,
|
|
58
|
+
severity: eventData.severity || 'medium',
|
|
59
|
+
userId: eventData.userId,
|
|
60
|
+
sessionId: eventData.sessionId,
|
|
61
|
+
resource: eventData.resource,
|
|
62
|
+
action: eventData.action,
|
|
63
|
+
outcome: eventData.outcome,
|
|
64
|
+
details: eventData.details,
|
|
65
|
+
context: {
|
|
66
|
+
source: 'system',
|
|
67
|
+
...eventData.context
|
|
68
|
+
},
|
|
69
|
+
compliance: {
|
|
70
|
+
frameworks: eventData.compliance?.frameworks || [],
|
|
71
|
+
controls: eventData.compliance?.controls || [],
|
|
72
|
+
retention: this.calculateRetentionPeriod(eventData.category, eventData.compliance?.frameworks),
|
|
73
|
+
classification: eventData.compliance?.classification || 'internal'
|
|
74
|
+
},
|
|
75
|
+
integrity: {
|
|
76
|
+
hash: '',
|
|
77
|
+
verified: false
|
|
78
|
+
},
|
|
79
|
+
metadata: {}
|
|
80
|
+
};
|
|
81
|
+
// Calculate integrity hash
|
|
82
|
+
entry.integrity.hash = this.calculateHash(entry);
|
|
83
|
+
entry.integrity.verified = true;
|
|
84
|
+
// Add to buffer for batch processing
|
|
85
|
+
this.auditBuffer.push(entry);
|
|
86
|
+
// Immediate processing for critical events
|
|
87
|
+
if (entry.severity === 'critical') {
|
|
88
|
+
await this.processAuditEntry(entry);
|
|
89
|
+
await this.generateSecurityAlert(entry);
|
|
90
|
+
}
|
|
91
|
+
// Batch process if buffer is full
|
|
92
|
+
if (this.auditBuffer.length >= this.configuration.collection.batchSize) {
|
|
93
|
+
await this.flushAuditBuffer();
|
|
94
|
+
}
|
|
95
|
+
this.emit('audit:logged', entry);
|
|
96
|
+
return entry;
|
|
97
|
+
}
|
|
98
|
+
async createComplianceFramework(frameworkData) {
|
|
99
|
+
const framework = {
|
|
100
|
+
id: `framework-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
101
|
+
name: frameworkData.name,
|
|
102
|
+
version: frameworkData.version,
|
|
103
|
+
description: frameworkData.description,
|
|
104
|
+
type: frameworkData.type,
|
|
105
|
+
requirements: frameworkData.requirements.map((req, index)=>({
|
|
106
|
+
id: `req-${Date.now()}-${index}`,
|
|
107
|
+
...req,
|
|
108
|
+
automatedCheck: {
|
|
109
|
+
enabled: false,
|
|
110
|
+
frequency: 'daily',
|
|
111
|
+
query: '',
|
|
112
|
+
...req.automatedCheck
|
|
113
|
+
}
|
|
114
|
+
})),
|
|
115
|
+
auditFrequency: frameworkData.auditFrequency,
|
|
116
|
+
retentionPeriod: frameworkData.retentionPeriod,
|
|
117
|
+
reportingRequirements: {
|
|
118
|
+
frequency: 'quarterly',
|
|
119
|
+
recipients: [],
|
|
120
|
+
format: [
|
|
121
|
+
'pdf',
|
|
122
|
+
'json'
|
|
123
|
+
],
|
|
124
|
+
automated: false
|
|
125
|
+
},
|
|
126
|
+
controls: frameworkData.controls.map((control, index)=>({
|
|
127
|
+
id: `control-${Date.now()}-${index}`,
|
|
128
|
+
...control
|
|
129
|
+
})),
|
|
130
|
+
status: 'active',
|
|
131
|
+
implementationDate: new Date(),
|
|
132
|
+
nextReview: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000),
|
|
133
|
+
responsible: frameworkData.responsible
|
|
134
|
+
};
|
|
135
|
+
this.frameworks.set(framework.id, framework);
|
|
136
|
+
await this.saveFramework(framework);
|
|
137
|
+
await this.logAuditEvent({
|
|
138
|
+
eventType: 'compliance_framework_created',
|
|
139
|
+
category: 'compliance',
|
|
140
|
+
severity: 'medium',
|
|
141
|
+
resource: {
|
|
142
|
+
type: 'compliance-framework',
|
|
143
|
+
id: framework.id,
|
|
144
|
+
name: framework.name
|
|
145
|
+
},
|
|
146
|
+
action: 'create',
|
|
147
|
+
outcome: 'success',
|
|
148
|
+
details: {
|
|
149
|
+
frameworkType: framework.type,
|
|
150
|
+
requirementsCount: framework.requirements.length
|
|
151
|
+
},
|
|
152
|
+
context: {
|
|
153
|
+
source: 'audit-manager'
|
|
154
|
+
},
|
|
155
|
+
compliance: {
|
|
156
|
+
frameworks: [
|
|
157
|
+
framework.id
|
|
158
|
+
]
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
this.emit('framework:created', framework);
|
|
162
|
+
this.logger.info(`Compliance framework created: ${framework.name} (${framework.id})`);
|
|
163
|
+
return framework;
|
|
164
|
+
}
|
|
165
|
+
async generateAuditReport(reportConfig) {
|
|
166
|
+
const report = {
|
|
167
|
+
id: `report-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
168
|
+
title: reportConfig.title,
|
|
169
|
+
description: reportConfig.description,
|
|
170
|
+
type: reportConfig.type,
|
|
171
|
+
scope: reportConfig.scope,
|
|
172
|
+
findings: [],
|
|
173
|
+
recommendations: [],
|
|
174
|
+
summary: {
|
|
175
|
+
totalEvents: 0,
|
|
176
|
+
criticalFindings: 0,
|
|
177
|
+
complianceScore: 0,
|
|
178
|
+
riskLevel: 'low'
|
|
179
|
+
},
|
|
180
|
+
methodology: 'Automated analysis of audit trail data with manual review of findings',
|
|
181
|
+
limitations: [],
|
|
182
|
+
reviewers: [],
|
|
183
|
+
approvers: [],
|
|
184
|
+
status: 'draft',
|
|
185
|
+
confidentiality: reportConfig.confidentiality || 'internal',
|
|
186
|
+
createdAt: new Date(),
|
|
187
|
+
updatedAt: new Date(),
|
|
188
|
+
createdBy: 'audit-manager'
|
|
189
|
+
};
|
|
190
|
+
// Collect relevant audit entries
|
|
191
|
+
const auditEntries = await this.queryAuditEntries(reportConfig.scope);
|
|
192
|
+
report.summary.totalEvents = auditEntries.length;
|
|
193
|
+
// Analyze entries for findings
|
|
194
|
+
const findings = await this.analyzeAuditEntries(auditEntries, reportConfig.type);
|
|
195
|
+
report.findings = findings;
|
|
196
|
+
report.summary.criticalFindings = findings.filter((f)=>f.severity === 'critical').length;
|
|
197
|
+
// Calculate compliance score
|
|
198
|
+
if (reportConfig.scope.compliance && reportConfig.scope.compliance.length > 0) {
|
|
199
|
+
report.summary.complianceScore = await this.calculateComplianceScore(reportConfig.scope.compliance, auditEntries);
|
|
200
|
+
}
|
|
201
|
+
// Determine risk level
|
|
202
|
+
report.summary.riskLevel = this.calculateRiskLevel(findings);
|
|
203
|
+
// Generate recommendations
|
|
204
|
+
if (reportConfig.includeRecommendations !== false) {
|
|
205
|
+
report.recommendations = await this.generateRecommendations(findings, reportConfig.type);
|
|
206
|
+
}
|
|
207
|
+
this.reports.set(report.id, report);
|
|
208
|
+
await this.saveReport(report);
|
|
209
|
+
await this.logAuditEvent({
|
|
210
|
+
eventType: 'audit_report_generated',
|
|
211
|
+
category: 'compliance',
|
|
212
|
+
severity: 'medium',
|
|
213
|
+
resource: {
|
|
214
|
+
type: 'audit-report',
|
|
215
|
+
id: report.id,
|
|
216
|
+
name: report.title
|
|
217
|
+
},
|
|
218
|
+
action: 'generate',
|
|
219
|
+
outcome: 'success',
|
|
220
|
+
details: {
|
|
221
|
+
reportType: report.type,
|
|
222
|
+
totalEvents: report.summary.totalEvents,
|
|
223
|
+
findingsCount: report.findings.length,
|
|
224
|
+
complianceScore: report.summary.complianceScore
|
|
225
|
+
},
|
|
226
|
+
context: {
|
|
227
|
+
source: 'audit-manager'
|
|
228
|
+
},
|
|
229
|
+
compliance: {
|
|
230
|
+
frameworks: reportConfig.scope.compliance || []
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
this.emit('report:generated', report);
|
|
234
|
+
this.logger.info(`Audit report generated: ${report.title} (${report.id})`);
|
|
235
|
+
return report;
|
|
236
|
+
}
|
|
237
|
+
async exportAuditData(exportConfig) {
|
|
238
|
+
const entries = await this.queryAuditEntries(exportConfig.scope);
|
|
239
|
+
let exportData;
|
|
240
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
241
|
+
const filename = `audit-export-${timestamp}.${exportConfig.format}`;
|
|
242
|
+
const filepath = join(this.auditPath, 'exports', filename);
|
|
243
|
+
switch(exportConfig.format){
|
|
244
|
+
case 'json':
|
|
245
|
+
exportData = JSON.stringify(entries, null, 2);
|
|
246
|
+
break;
|
|
247
|
+
case 'csv':
|
|
248
|
+
exportData = this.convertToCSV(entries);
|
|
249
|
+
break;
|
|
250
|
+
case 'xml':
|
|
251
|
+
exportData = this.convertToXML(entries);
|
|
252
|
+
break;
|
|
253
|
+
case 'pdf':
|
|
254
|
+
exportData = await this.convertToPDF(entries);
|
|
255
|
+
break;
|
|
256
|
+
default:
|
|
257
|
+
throw new Error(`Unsupported export format: ${exportConfig.format}`);
|
|
258
|
+
}
|
|
259
|
+
// Apply compression if requested
|
|
260
|
+
if (exportConfig.compression) {
|
|
261
|
+
// Would implement compression here
|
|
262
|
+
}
|
|
263
|
+
// Apply encryption if requested
|
|
264
|
+
if (exportConfig.encryption) {
|
|
265
|
+
// Would implement encryption here
|
|
266
|
+
}
|
|
267
|
+
await writeFile(filepath, exportData);
|
|
268
|
+
await this.logAuditEvent({
|
|
269
|
+
eventType: 'audit_data_exported',
|
|
270
|
+
category: 'data-access',
|
|
271
|
+
severity: 'medium',
|
|
272
|
+
resource: {
|
|
273
|
+
type: 'audit-data',
|
|
274
|
+
id: 'export',
|
|
275
|
+
path: filepath
|
|
276
|
+
},
|
|
277
|
+
action: 'export',
|
|
278
|
+
outcome: 'success',
|
|
279
|
+
details: {
|
|
280
|
+
format: exportConfig.format,
|
|
281
|
+
recordCount: entries.length,
|
|
282
|
+
timeRange: exportConfig.scope.timeRange,
|
|
283
|
+
compressed: exportConfig.compression || false,
|
|
284
|
+
encrypted: exportConfig.encryption || false
|
|
285
|
+
},
|
|
286
|
+
context: {
|
|
287
|
+
source: 'audit-manager'
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
this.emit('data:exported', {
|
|
291
|
+
filepath,
|
|
292
|
+
format: exportConfig.format,
|
|
293
|
+
recordCount: entries.length
|
|
294
|
+
});
|
|
295
|
+
this.logger.info(`Audit data exported: ${filename} (${entries.length} records)`);
|
|
296
|
+
return filepath;
|
|
297
|
+
}
|
|
298
|
+
async verifyAuditIntegrity(trailId) {
|
|
299
|
+
const issues = [];
|
|
300
|
+
let totalEntries = 0;
|
|
301
|
+
let verifiedEntries = 0;
|
|
302
|
+
let corruptedEntries = 0;
|
|
303
|
+
let missingEntries = 0;
|
|
304
|
+
const trails = trailId ? [
|
|
305
|
+
this.auditTrails.get(trailId)
|
|
306
|
+
].filter(Boolean) : Array.from(this.auditTrails.values());
|
|
307
|
+
for (const trail of trails){
|
|
308
|
+
for (const entry of trail.entries){
|
|
309
|
+
totalEntries++;
|
|
310
|
+
// Verify hash
|
|
311
|
+
const calculatedHash = this.calculateHash(entry);
|
|
312
|
+
if (calculatedHash === entry.integrity.hash) {
|
|
313
|
+
verifiedEntries++;
|
|
314
|
+
} else {
|
|
315
|
+
corruptedEntries++;
|
|
316
|
+
issues.push({
|
|
317
|
+
timestamp: new Date(),
|
|
318
|
+
type: 'checksum-mismatch',
|
|
319
|
+
description: `Hash mismatch for audit entry ${entry.id}`,
|
|
320
|
+
severity: 'high',
|
|
321
|
+
investigationStatus: 'pending',
|
|
322
|
+
evidence: [
|
|
323
|
+
`Expected: ${entry.integrity.hash}`,
|
|
324
|
+
`Calculated: ${calculatedHash}`
|
|
325
|
+
]
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
// Update trail integrity status
|
|
330
|
+
trail.integrity.verified = issues.length === 0;
|
|
331
|
+
trail.integrity.lastVerification = new Date();
|
|
332
|
+
trail.integrity.tamperEvidence = issues;
|
|
333
|
+
await this.saveAuditTrail(trail);
|
|
334
|
+
}
|
|
335
|
+
const verified = issues.length === 0;
|
|
336
|
+
await this.logAuditEvent({
|
|
337
|
+
eventType: 'audit_integrity_verification',
|
|
338
|
+
category: 'security',
|
|
339
|
+
severity: verified ? 'low' : 'high',
|
|
340
|
+
resource: {
|
|
341
|
+
type: 'audit-trail',
|
|
342
|
+
id: trailId || 'all'
|
|
343
|
+
},
|
|
344
|
+
action: 'verify',
|
|
345
|
+
outcome: verified ? 'success' : 'failure',
|
|
346
|
+
details: {
|
|
347
|
+
totalEntries,
|
|
348
|
+
verifiedEntries,
|
|
349
|
+
corruptedEntries,
|
|
350
|
+
issuesFound: issues.length
|
|
351
|
+
},
|
|
352
|
+
context: {
|
|
353
|
+
source: 'audit-manager'
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
if (!verified) {
|
|
357
|
+
this.emit('integrity:compromised', {
|
|
358
|
+
issues,
|
|
359
|
+
summary: {
|
|
360
|
+
totalEntries,
|
|
361
|
+
verifiedEntries,
|
|
362
|
+
corruptedEntries,
|
|
363
|
+
missingEntries
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
this.logger.error(`Audit integrity verification failed: ${issues.length} issues found`);
|
|
367
|
+
} else {
|
|
368
|
+
this.logger.info(`Audit integrity verification successful: ${totalEntries} entries verified`);
|
|
369
|
+
}
|
|
370
|
+
return {
|
|
371
|
+
verified,
|
|
372
|
+
issues,
|
|
373
|
+
summary: {
|
|
374
|
+
totalEntries,
|
|
375
|
+
verifiedEntries,
|
|
376
|
+
corruptedEntries,
|
|
377
|
+
missingEntries
|
|
378
|
+
}
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
async getAuditMetrics(timeRange) {
|
|
382
|
+
const range = timeRange || {
|
|
383
|
+
start: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),
|
|
384
|
+
end: new Date()
|
|
385
|
+
};
|
|
386
|
+
const entries = await this.queryAuditEntries({
|
|
387
|
+
timeRange: range
|
|
388
|
+
});
|
|
389
|
+
// Volume metrics
|
|
390
|
+
const volumeMetrics = {
|
|
391
|
+
totalEntries: entries.length,
|
|
392
|
+
dailyAverage: entries.length / 30,
|
|
393
|
+
peakHourly: this.calculatePeakHourly(entries),
|
|
394
|
+
byCategory: this.groupBy(entries, 'category'),
|
|
395
|
+
bySeverity: this.groupBy(entries, 'severity')
|
|
396
|
+
};
|
|
397
|
+
// Compliance metrics
|
|
398
|
+
const complianceMetrics = {
|
|
399
|
+
overallScore: 85,
|
|
400
|
+
byFramework: {},
|
|
401
|
+
trending: 'stable'
|
|
402
|
+
};
|
|
403
|
+
// Calculate compliance scores by framework
|
|
404
|
+
for (const framework of this.frameworks.values()){
|
|
405
|
+
const score = await this.calculateComplianceScore([
|
|
406
|
+
framework.id
|
|
407
|
+
], entries);
|
|
408
|
+
complianceMetrics.byFramework[framework.id] = {
|
|
409
|
+
score,
|
|
410
|
+
compliant: framework.requirements.filter((r)=>r.status === 'compliant').length,
|
|
411
|
+
nonCompliant: framework.requirements.filter((r)=>r.status === 'non-compliant').length,
|
|
412
|
+
total: framework.requirements.length
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
// Integrity metrics
|
|
416
|
+
const integrityMetrics = {
|
|
417
|
+
verificationSuccess: 99.5,
|
|
418
|
+
tamperAttempts: entries.filter((e)=>e.eventType === 'unauthorized_access').length,
|
|
419
|
+
dataLoss: 0,
|
|
420
|
+
corruptionEvents: 0
|
|
421
|
+
};
|
|
422
|
+
// Performance metrics
|
|
423
|
+
const performanceMetrics = {
|
|
424
|
+
ingestionRate: entries.length / 24,
|
|
425
|
+
queryResponseTime: 150,
|
|
426
|
+
storageEfficiency: 85,
|
|
427
|
+
availabilityPercentage: 99.9
|
|
428
|
+
};
|
|
429
|
+
// Security metrics
|
|
430
|
+
const securityMetrics = {
|
|
431
|
+
unauthorizedAccess: entries.filter((e)=>e.outcome === 'denied' || e.eventType === 'unauthorized_access').length,
|
|
432
|
+
privilegedActions: entries.filter((e)=>e.details.privileged === true).length,
|
|
433
|
+
suspiciousPatterns: entries.filter((e)=>e.severity === 'critical').length,
|
|
434
|
+
escalatedIncidents: entries.filter((e)=>e.category === 'security' && e.severity === 'critical').length
|
|
435
|
+
};
|
|
436
|
+
return {
|
|
437
|
+
volume: volumeMetrics,
|
|
438
|
+
compliance: complianceMetrics,
|
|
439
|
+
integrity: integrityMetrics,
|
|
440
|
+
performance: performanceMetrics,
|
|
441
|
+
security: securityMetrics
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
// Private helper methods
|
|
445
|
+
getDefaultConfiguration() {
|
|
446
|
+
return {
|
|
447
|
+
general: {
|
|
448
|
+
enabled: true,
|
|
449
|
+
defaultRetention: '7y',
|
|
450
|
+
compressionEnabled: true,
|
|
451
|
+
encryptionEnabled: true,
|
|
452
|
+
realTimeProcessing: true
|
|
453
|
+
},
|
|
454
|
+
collection: {
|
|
455
|
+
automaticCapture: true,
|
|
456
|
+
bufferSize: 10000,
|
|
457
|
+
batchSize: 1000,
|
|
458
|
+
flushInterval: 60000,
|
|
459
|
+
failureHandling: 'retry'
|
|
460
|
+
},
|
|
461
|
+
storage: {
|
|
462
|
+
primaryLocation: join(this.auditPath, 'trails'),
|
|
463
|
+
partitioning: 'daily',
|
|
464
|
+
indexing: true
|
|
465
|
+
},
|
|
466
|
+
integrity: {
|
|
467
|
+
checksumAlgorithm: 'sha256',
|
|
468
|
+
verificationFrequency: 'daily',
|
|
469
|
+
digitalSignatures: false,
|
|
470
|
+
immutableStorage: true
|
|
471
|
+
},
|
|
472
|
+
compliance: {
|
|
473
|
+
frameworks: [],
|
|
474
|
+
automaticClassification: true,
|
|
475
|
+
retentionPolicies: {
|
|
476
|
+
authentication: '3y',
|
|
477
|
+
'data-access': '7y',
|
|
478
|
+
'system-change': '5y',
|
|
479
|
+
security: '7y',
|
|
480
|
+
compliance: '10y'
|
|
481
|
+
},
|
|
482
|
+
exportFormats: [
|
|
483
|
+
'json',
|
|
484
|
+
'csv',
|
|
485
|
+
'pdf'
|
|
486
|
+
]
|
|
487
|
+
},
|
|
488
|
+
monitoring: {
|
|
489
|
+
alerting: {
|
|
490
|
+
enabled: true,
|
|
491
|
+
channels: [
|
|
492
|
+
'email',
|
|
493
|
+
'webhook'
|
|
494
|
+
],
|
|
495
|
+
thresholds: {
|
|
496
|
+
failedLogins: 5,
|
|
497
|
+
privilegedAccess: 10,
|
|
498
|
+
dataExfiltration: 1,
|
|
499
|
+
configChanges: 20
|
|
500
|
+
}
|
|
501
|
+
},
|
|
502
|
+
reporting: {
|
|
503
|
+
automated: true,
|
|
504
|
+
frequency: 'weekly',
|
|
505
|
+
recipients: [],
|
|
506
|
+
dashboards: []
|
|
507
|
+
}
|
|
508
|
+
},
|
|
509
|
+
privacy: {
|
|
510
|
+
piiDetection: true,
|
|
511
|
+
anonymization: false,
|
|
512
|
+
masking: {
|
|
513
|
+
enabled: true,
|
|
514
|
+
patterns: [
|
|
515
|
+
'\\b\\d{4}[- ]?\\d{4}[- ]?\\d{4}[- ]?\\d{4}\\b'
|
|
516
|
+
]
|
|
517
|
+
},
|
|
518
|
+
consent: {
|
|
519
|
+
required: false,
|
|
520
|
+
tracking: false
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
async loadConfigurations() {
|
|
526
|
+
try {
|
|
527
|
+
// Load frameworks
|
|
528
|
+
const frameworkFiles = await readdir(join(this.auditPath, 'frameworks'));
|
|
529
|
+
for (const file of frameworkFiles.filter((f)=>f.endsWith('.json'))){
|
|
530
|
+
const content = await readFile(join(this.auditPath, 'frameworks', file), 'utf-8');
|
|
531
|
+
const framework = JSON.parse(content);
|
|
532
|
+
this.frameworks.set(framework.id, framework);
|
|
533
|
+
}
|
|
534
|
+
// Load audit trails
|
|
535
|
+
const trailFiles = await readdir(join(this.auditPath, 'trails'));
|
|
536
|
+
for (const file of trailFiles.filter((f)=>f.endsWith('.json'))){
|
|
537
|
+
const content = await readFile(join(this.auditPath, 'trails', file), 'utf-8');
|
|
538
|
+
const trail = JSON.parse(content);
|
|
539
|
+
this.auditTrails.set(trail.id, trail);
|
|
540
|
+
}
|
|
541
|
+
// Load reports
|
|
542
|
+
const reportFiles = await readdir(join(this.auditPath, 'reports'));
|
|
543
|
+
for (const file of reportFiles.filter((f)=>f.endsWith('.json'))){
|
|
544
|
+
const content = await readFile(join(this.auditPath, 'reports', file), 'utf-8');
|
|
545
|
+
const report = JSON.parse(content);
|
|
546
|
+
this.reports.set(report.id, report);
|
|
547
|
+
}
|
|
548
|
+
this.logger.info(`Loaded ${this.frameworks.size} frameworks, ${this.auditTrails.size} trails, ${this.reports.size} reports`);
|
|
549
|
+
} catch (error) {
|
|
550
|
+
this.logger.warn('Failed to load some audit configurations', {
|
|
551
|
+
error
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
async initializeDefaultFrameworks() {
|
|
556
|
+
const defaultFrameworks = [
|
|
557
|
+
{
|
|
558
|
+
name: 'SOC 2 Type II',
|
|
559
|
+
version: '2017',
|
|
560
|
+
description: 'Service Organization Control 2 Type II compliance framework',
|
|
561
|
+
type: 'certification',
|
|
562
|
+
requirements: [
|
|
563
|
+
{
|
|
564
|
+
title: 'Security Principle - Logical and Physical Access Controls',
|
|
565
|
+
description: 'The entity restricts logical and physical access to the system',
|
|
566
|
+
category: 'access-control',
|
|
567
|
+
priority: 'high',
|
|
568
|
+
status: 'compliant',
|
|
569
|
+
evidence: [],
|
|
570
|
+
gaps: [],
|
|
571
|
+
remediation: {
|
|
572
|
+
actions: [],
|
|
573
|
+
owner: 'security-team',
|
|
574
|
+
dueDate: new Date(Date.now() + 90 * 24 * 60 * 60 * 1000)
|
|
575
|
+
},
|
|
576
|
+
lastAssessed: new Date(),
|
|
577
|
+
nextAssessment: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000),
|
|
578
|
+
automatedCheck: {
|
|
579
|
+
enabled: true,
|
|
580
|
+
frequency: 'daily',
|
|
581
|
+
query: 'category:authentication AND outcome:failure',
|
|
582
|
+
threshold: 10
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
],
|
|
586
|
+
controls: [
|
|
587
|
+
{
|
|
588
|
+
name: 'Multi-Factor Authentication',
|
|
589
|
+
description: 'MFA is required for all user accounts',
|
|
590
|
+
type: 'preventive',
|
|
591
|
+
automationType: 'automated',
|
|
592
|
+
effectiveness: 'high',
|
|
593
|
+
frequency: 'continuous',
|
|
594
|
+
owner: 'security-team',
|
|
595
|
+
evidence: [],
|
|
596
|
+
testingProcedure: 'Verify MFA is enabled for all user accounts',
|
|
597
|
+
lastTested: new Date(),
|
|
598
|
+
nextTest: new Date(Date.now() + 90 * 24 * 60 * 60 * 1000),
|
|
599
|
+
status: 'effective'
|
|
600
|
+
}
|
|
601
|
+
],
|
|
602
|
+
auditFrequency: 'quarterly',
|
|
603
|
+
retentionPeriod: '7y',
|
|
604
|
+
responsible: 'compliance-officer'
|
|
605
|
+
},
|
|
606
|
+
{
|
|
607
|
+
name: 'GDPR',
|
|
608
|
+
version: '2018',
|
|
609
|
+
description: 'General Data Protection Regulation compliance framework',
|
|
610
|
+
type: 'regulatory',
|
|
611
|
+
requirements: [
|
|
612
|
+
{
|
|
613
|
+
title: 'Data Processing Records',
|
|
614
|
+
description: 'Maintain records of all data processing activities',
|
|
615
|
+
category: 'data-protection',
|
|
616
|
+
priority: 'critical',
|
|
617
|
+
status: 'compliant',
|
|
618
|
+
evidence: [],
|
|
619
|
+
gaps: [],
|
|
620
|
+
remediation: {
|
|
621
|
+
actions: [],
|
|
622
|
+
owner: 'data-protection-officer',
|
|
623
|
+
dueDate: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000)
|
|
624
|
+
},
|
|
625
|
+
lastAssessed: new Date(),
|
|
626
|
+
nextAssessment: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000),
|
|
627
|
+
automatedCheck: {
|
|
628
|
+
enabled: true,
|
|
629
|
+
frequency: 'daily',
|
|
630
|
+
query: 'category:data-access AND details.pii:true'
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
],
|
|
634
|
+
controls: [],
|
|
635
|
+
auditFrequency: 'annually',
|
|
636
|
+
retentionPeriod: '6y',
|
|
637
|
+
responsible: 'data-protection-officer'
|
|
638
|
+
}
|
|
639
|
+
];
|
|
640
|
+
for (const frameworkData of defaultFrameworks){
|
|
641
|
+
if (!Array.from(this.frameworks.values()).some((f)=>f.name === frameworkData.name)) {
|
|
642
|
+
await this.createComplianceFramework(frameworkData);
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
async startAuditProcessing() {
|
|
647
|
+
// Start buffer flush timer
|
|
648
|
+
setInterval(async ()=>{
|
|
649
|
+
if (this.auditBuffer.length > 0) {
|
|
650
|
+
await this.flushAuditBuffer();
|
|
651
|
+
}
|
|
652
|
+
}, this.configuration.collection.flushInterval);
|
|
653
|
+
// Start integrity verification timer
|
|
654
|
+
setInterval(async ()=>{
|
|
655
|
+
await this.verifyAuditIntegrity();
|
|
656
|
+
}, 24 * 60 * 60 * 1000); // Daily
|
|
657
|
+
this.logger.info('Started audit processing timers');
|
|
658
|
+
}
|
|
659
|
+
async flushAuditBuffer() {
|
|
660
|
+
if (this.auditBuffer.length === 0) return;
|
|
661
|
+
const entries = [
|
|
662
|
+
...this.auditBuffer
|
|
663
|
+
];
|
|
664
|
+
this.auditBuffer = [];
|
|
665
|
+
try {
|
|
666
|
+
for (const entry of entries){
|
|
667
|
+
await this.processAuditEntry(entry);
|
|
668
|
+
}
|
|
669
|
+
this.logger.debug(`Flushed ${entries.length} audit entries`);
|
|
670
|
+
} catch (error) {
|
|
671
|
+
this.logger.error('Failed to flush audit buffer', {
|
|
672
|
+
error
|
|
673
|
+
});
|
|
674
|
+
// Re-add entries to buffer for retry if configured
|
|
675
|
+
if (this.configuration.collection.failureHandling === 'retry') {
|
|
676
|
+
this.auditBuffer.unshift(...entries);
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
async processAuditEntry(entry) {
|
|
681
|
+
// Determine which trail to add the entry to
|
|
682
|
+
const trailId = this.determineAuditTrail(entry);
|
|
683
|
+
let trail = this.auditTrails.get(trailId);
|
|
684
|
+
if (!trail) {
|
|
685
|
+
trail = await this.createAuditTrail(trailId, entry.category);
|
|
686
|
+
}
|
|
687
|
+
// Add entry to trail
|
|
688
|
+
trail.entries.push(entry);
|
|
689
|
+
trail.updatedAt = new Date();
|
|
690
|
+
// Update trail integrity
|
|
691
|
+
trail.integrity.checksum = this.calculateTrailChecksum(trail);
|
|
692
|
+
trail.integrity.lastVerification = new Date();
|
|
693
|
+
await this.saveAuditTrail(trail);
|
|
694
|
+
// Check for compliance violations
|
|
695
|
+
await this.checkComplianceViolations(entry);
|
|
696
|
+
// Check for security alerts
|
|
697
|
+
await this.checkSecurityAlerts(entry);
|
|
698
|
+
}
|
|
699
|
+
determineAuditTrail(entry) {
|
|
700
|
+
// Use category and date for trail determination
|
|
701
|
+
const date = entry.timestamp.toISOString().split('T')[0];
|
|
702
|
+
return `${entry.category}-${date}`;
|
|
703
|
+
}
|
|
704
|
+
async createAuditTrail(id, category) {
|
|
705
|
+
const trail = {
|
|
706
|
+
id,
|
|
707
|
+
name: `${category} audit trail`,
|
|
708
|
+
description: `Audit trail for ${category} events`,
|
|
709
|
+
category,
|
|
710
|
+
entries: [],
|
|
711
|
+
configuration: {
|
|
712
|
+
retention: this.configuration.compliance.retentionPolicies[category] || this.configuration.general.defaultRetention,
|
|
713
|
+
compression: this.configuration.general.compressionEnabled,
|
|
714
|
+
encryption: this.configuration.general.encryptionEnabled,
|
|
715
|
+
archival: {
|
|
716
|
+
enabled: true,
|
|
717
|
+
location: join(this.auditPath, 'archive'),
|
|
718
|
+
schedule: 'yearly'
|
|
719
|
+
},
|
|
720
|
+
monitoring: {
|
|
721
|
+
realTime: this.configuration.general.realTimeProcessing,
|
|
722
|
+
alerting: this.configuration.monitoring.alerting.enabled,
|
|
723
|
+
dashboards: []
|
|
724
|
+
}
|
|
725
|
+
},
|
|
726
|
+
integrity: {
|
|
727
|
+
verified: true,
|
|
728
|
+
lastVerification: new Date(),
|
|
729
|
+
checksum: '',
|
|
730
|
+
tamperEvidence: []
|
|
731
|
+
},
|
|
732
|
+
access: {
|
|
733
|
+
viewers: [],
|
|
734
|
+
admins: [
|
|
735
|
+
'audit-admin'
|
|
736
|
+
],
|
|
737
|
+
readonly: false,
|
|
738
|
+
auditAccess: true
|
|
739
|
+
},
|
|
740
|
+
compliance: {
|
|
741
|
+
frameworks: [],
|
|
742
|
+
retention: this.configuration.compliance.retentionPolicies[category] || this.configuration.general.defaultRetention,
|
|
743
|
+
exportRequirements: [],
|
|
744
|
+
immutable: this.configuration.integrity.immutableStorage
|
|
745
|
+
},
|
|
746
|
+
createdAt: new Date(),
|
|
747
|
+
updatedAt: new Date()
|
|
748
|
+
};
|
|
749
|
+
this.auditTrails.set(trail.id, trail);
|
|
750
|
+
await this.saveAuditTrail(trail);
|
|
751
|
+
return trail;
|
|
752
|
+
}
|
|
753
|
+
calculateHash(entry) {
|
|
754
|
+
// Create a deterministic string representation of the entry
|
|
755
|
+
const data = {
|
|
756
|
+
timestamp: entry.timestamp.toISOString(),
|
|
757
|
+
eventType: entry.eventType,
|
|
758
|
+
category: entry.category,
|
|
759
|
+
userId: entry.userId,
|
|
760
|
+
resource: entry.resource,
|
|
761
|
+
action: entry.action,
|
|
762
|
+
outcome: entry.outcome,
|
|
763
|
+
details: entry.details
|
|
764
|
+
};
|
|
765
|
+
return createHash(this.configuration.integrity.checksumAlgorithm).update(JSON.stringify(data)).digest('hex');
|
|
766
|
+
}
|
|
767
|
+
calculateTrailChecksum(trail) {
|
|
768
|
+
const data = trail.entries.map((e)=>e.integrity.hash).join('');
|
|
769
|
+
return createHash(this.configuration.integrity.checksumAlgorithm).update(data).digest('hex');
|
|
770
|
+
}
|
|
771
|
+
calculateRetentionPeriod(category, frameworks) {
|
|
772
|
+
const categoryRetention = this.configuration.compliance.retentionPolicies[category];
|
|
773
|
+
if (categoryRetention) return categoryRetention;
|
|
774
|
+
// Check framework requirements
|
|
775
|
+
if (frameworks) {
|
|
776
|
+
let maxRetention = this.configuration.general.defaultRetention;
|
|
777
|
+
for (const frameworkId of frameworks){
|
|
778
|
+
const framework = this.frameworks.get(frameworkId);
|
|
779
|
+
if (framework && this.parseRetentionPeriod(framework.retentionPeriod) > this.parseRetentionPeriod(maxRetention)) {
|
|
780
|
+
maxRetention = framework.retentionPeriod;
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
return maxRetention;
|
|
784
|
+
}
|
|
785
|
+
return this.configuration.general.defaultRetention;
|
|
786
|
+
}
|
|
787
|
+
parseRetentionPeriod(period) {
|
|
788
|
+
const match = period.match(/(\d+)([ymd])/);
|
|
789
|
+
if (!match) return 0;
|
|
790
|
+
const value = parseInt(match[1]);
|
|
791
|
+
const unit = match[2];
|
|
792
|
+
switch(unit){
|
|
793
|
+
case 'y':
|
|
794
|
+
return value * 365;
|
|
795
|
+
case 'm':
|
|
796
|
+
return value * 30;
|
|
797
|
+
case 'd':
|
|
798
|
+
return value;
|
|
799
|
+
default:
|
|
800
|
+
return 0;
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
async queryAuditEntries(scope) {
|
|
804
|
+
let entries = [];
|
|
805
|
+
// Collect entries from all trails
|
|
806
|
+
for (const trail of this.auditTrails.values()){
|
|
807
|
+
entries.push(...trail.entries);
|
|
808
|
+
}
|
|
809
|
+
// Apply filters
|
|
810
|
+
if (scope.timeRange) {
|
|
811
|
+
entries = entries.filter((e)=>e.timestamp >= scope.timeRange.start && e.timestamp <= scope.timeRange.end);
|
|
812
|
+
}
|
|
813
|
+
if (scope.categories) {
|
|
814
|
+
entries = entries.filter((e)=>scope.categories.includes(e.category));
|
|
815
|
+
}
|
|
816
|
+
if (scope.severity) {
|
|
817
|
+
entries = entries.filter((e)=>scope.severity.includes(e.severity));
|
|
818
|
+
}
|
|
819
|
+
if (scope.users) {
|
|
820
|
+
entries = entries.filter((e)=>e.userId && scope.users.includes(e.userId));
|
|
821
|
+
}
|
|
822
|
+
if (scope.events) {
|
|
823
|
+
entries = entries.filter((e)=>scope.events.includes(e.eventType));
|
|
824
|
+
}
|
|
825
|
+
if (scope.compliance) {
|
|
826
|
+
entries = entries.filter((e)=>e.compliance.frameworks.some((f)=>scope.compliance.includes(f)));
|
|
827
|
+
}
|
|
828
|
+
return entries.sort((a, b)=>a.timestamp.getTime() - b.timestamp.getTime());
|
|
829
|
+
}
|
|
830
|
+
async analyzeAuditEntries(entries, reportType) {
|
|
831
|
+
const findings = [];
|
|
832
|
+
// Security-focused analysis
|
|
833
|
+
if (reportType === 'security') {
|
|
834
|
+
// Check for failed login patterns
|
|
835
|
+
const failedLogins = entries.filter((e)=>e.eventType === 'user_login' && e.outcome === 'failure');
|
|
836
|
+
if (failedLogins.length > 10) {
|
|
837
|
+
findings.push({
|
|
838
|
+
id: `finding-${Date.now()}-1`,
|
|
839
|
+
title: 'Excessive Failed Login Attempts',
|
|
840
|
+
description: `${failedLogins.length} failed login attempts detected`,
|
|
841
|
+
severity: 'high',
|
|
842
|
+
category: 'authentication',
|
|
843
|
+
risk: 'Potential brute force attack',
|
|
844
|
+
impact: 'Unauthorized access attempt',
|
|
845
|
+
likelihood: 'medium',
|
|
846
|
+
evidence: [],
|
|
847
|
+
relatedEvents: failedLogins.map((e)=>e.id),
|
|
848
|
+
complianceImpact: {
|
|
849
|
+
frameworks: [
|
|
850
|
+
'SOC2'
|
|
851
|
+
],
|
|
852
|
+
violations: [
|
|
853
|
+
'Access Control'
|
|
854
|
+
],
|
|
855
|
+
penalties: []
|
|
856
|
+
},
|
|
857
|
+
remediation: {
|
|
858
|
+
priority: 'high',
|
|
859
|
+
owner: 'security-team',
|
|
860
|
+
actions: [
|
|
861
|
+
'Implement account lockout',
|
|
862
|
+
'Enable MFA',
|
|
863
|
+
'Review access logs'
|
|
864
|
+
],
|
|
865
|
+
timeline: '7 days'
|
|
866
|
+
},
|
|
867
|
+
status: 'open'
|
|
868
|
+
});
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
// Compliance-focused analysis
|
|
872
|
+
if (reportType === 'compliance') {
|
|
873
|
+
// Check for data access patterns
|
|
874
|
+
const dataAccess = entries.filter((e)=>e.category === 'data-access' && e.details.pii === true);
|
|
875
|
+
if (dataAccess.length > 0) {
|
|
876
|
+
findings.push({
|
|
877
|
+
id: `finding-${Date.now()}-2`,
|
|
878
|
+
title: 'PII Data Access Events',
|
|
879
|
+
description: `${dataAccess.length} events involving PII data access`,
|
|
880
|
+
severity: 'medium',
|
|
881
|
+
category: 'data-protection',
|
|
882
|
+
risk: 'Privacy compliance risk',
|
|
883
|
+
impact: 'Potential GDPR violation',
|
|
884
|
+
likelihood: 'low',
|
|
885
|
+
evidence: [],
|
|
886
|
+
relatedEvents: dataAccess.map((e)=>e.id),
|
|
887
|
+
complianceImpact: {
|
|
888
|
+
frameworks: [
|
|
889
|
+
'GDPR'
|
|
890
|
+
],
|
|
891
|
+
violations: [
|
|
892
|
+
'Data Processing'
|
|
893
|
+
],
|
|
894
|
+
penalties: [
|
|
895
|
+
'Administrative fine'
|
|
896
|
+
]
|
|
897
|
+
},
|
|
898
|
+
remediation: {
|
|
899
|
+
priority: 'medium',
|
|
900
|
+
owner: 'data-protection-officer',
|
|
901
|
+
actions: [
|
|
902
|
+
'Review data access justification',
|
|
903
|
+
'Update privacy notices'
|
|
904
|
+
],
|
|
905
|
+
timeline: '30 days'
|
|
906
|
+
},
|
|
907
|
+
status: 'open'
|
|
908
|
+
});
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
return findings;
|
|
912
|
+
}
|
|
913
|
+
async calculateComplianceScore(frameworks, entries) {
|
|
914
|
+
let totalRequirements = 0;
|
|
915
|
+
let metRequirements = 0;
|
|
916
|
+
for (const frameworkId of frameworks){
|
|
917
|
+
const framework = this.frameworks.get(frameworkId);
|
|
918
|
+
if (!framework) continue;
|
|
919
|
+
for (const requirement of framework.requirements){
|
|
920
|
+
totalRequirements++;
|
|
921
|
+
if (requirement.status === 'compliant') {
|
|
922
|
+
metRequirements++;
|
|
923
|
+
} else if (requirement.automatedCheck.enabled) {
|
|
924
|
+
// Check if automated requirement is met based on audit data
|
|
925
|
+
const violations = this.checkAutomatedRequirement(requirement, entries);
|
|
926
|
+
if (violations.length === 0) {
|
|
927
|
+
metRequirements++;
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
return totalRequirements > 0 ? metRequirements / totalRequirements * 100 : 0;
|
|
933
|
+
}
|
|
934
|
+
checkAutomatedRequirement(requirement, entries) {
|
|
935
|
+
// Simplified automated compliance checking
|
|
936
|
+
// In a real implementation, this would parse the query and evaluate against entries
|
|
937
|
+
const violations = entries.filter((e)=>{
|
|
938
|
+
if (requirement.automatedCheck.query.includes('outcome:failure')) {
|
|
939
|
+
return e.outcome === 'failure';
|
|
940
|
+
}
|
|
941
|
+
return false;
|
|
942
|
+
});
|
|
943
|
+
return violations;
|
|
944
|
+
}
|
|
945
|
+
calculateRiskLevel(findings) {
|
|
946
|
+
const criticalFindings = findings.filter((f)=>f.severity === 'critical').length;
|
|
947
|
+
const highFindings = findings.filter((f)=>f.severity === 'high').length;
|
|
948
|
+
if (criticalFindings > 0) return 'critical';
|
|
949
|
+
if (highFindings > 2) return 'high';
|
|
950
|
+
if (findings.length > 5) return 'medium';
|
|
951
|
+
return 'low';
|
|
952
|
+
}
|
|
953
|
+
async generateRecommendations(findings, reportType) {
|
|
954
|
+
const recommendations = [];
|
|
955
|
+
// Generic security recommendations
|
|
956
|
+
if (findings.some((f)=>f.category === 'authentication')) {
|
|
957
|
+
recommendations.push({
|
|
958
|
+
id: `rec-${Date.now()}-1`,
|
|
959
|
+
title: 'Strengthen Authentication Controls',
|
|
960
|
+
description: 'Implement additional authentication security measures',
|
|
961
|
+
priority: 'high',
|
|
962
|
+
category: 'technology',
|
|
963
|
+
implementation: {
|
|
964
|
+
effort: 'medium',
|
|
965
|
+
cost: 'medium',
|
|
966
|
+
timeline: '30 days',
|
|
967
|
+
dependencies: [
|
|
968
|
+
'Identity Provider Integration'
|
|
969
|
+
],
|
|
970
|
+
risks: [
|
|
971
|
+
'User experience impact'
|
|
972
|
+
]
|
|
973
|
+
},
|
|
974
|
+
expectedBenefit: 'Reduced risk of unauthorized access',
|
|
975
|
+
owner: 'security-team',
|
|
976
|
+
status: 'proposed',
|
|
977
|
+
tracking: {
|
|
978
|
+
milestones: [
|
|
979
|
+
'MFA deployment',
|
|
980
|
+
'Policy update',
|
|
981
|
+
'User training'
|
|
982
|
+
],
|
|
983
|
+
progress: 0,
|
|
984
|
+
nextReview: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000)
|
|
985
|
+
}
|
|
986
|
+
});
|
|
987
|
+
}
|
|
988
|
+
return recommendations;
|
|
989
|
+
}
|
|
990
|
+
async checkComplianceViolations(entry) {
|
|
991
|
+
for (const frameworkId of entry.compliance.frameworks){
|
|
992
|
+
const framework = this.frameworks.get(frameworkId);
|
|
993
|
+
if (!framework) continue;
|
|
994
|
+
for (const requirement of framework.requirements){
|
|
995
|
+
if (requirement.automatedCheck.enabled) {
|
|
996
|
+
const violations = this.checkAutomatedRequirement(requirement, [
|
|
997
|
+
entry
|
|
998
|
+
]);
|
|
999
|
+
if (violations.length > 0) {
|
|
1000
|
+
this.emit('compliance:violation', {
|
|
1001
|
+
framework: frameworkId,
|
|
1002
|
+
requirement: requirement.id,
|
|
1003
|
+
entry,
|
|
1004
|
+
severity: requirement.priority
|
|
1005
|
+
});
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
async checkSecurityAlerts(entry) {
|
|
1012
|
+
const thresholds = this.configuration.monitoring.alerting.thresholds;
|
|
1013
|
+
// Check for specific alert conditions
|
|
1014
|
+
if (entry.eventType === 'user_login' && entry.outcome === 'failure') {
|
|
1015
|
+
// Would implement failed login threshold checking
|
|
1016
|
+
}
|
|
1017
|
+
if (entry.category === 'data-access' && entry.details.privileged) {
|
|
1018
|
+
this.emit('security:alert', {
|
|
1019
|
+
type: 'privileged-access',
|
|
1020
|
+
entry,
|
|
1021
|
+
severity: 'medium'
|
|
1022
|
+
});
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
async generateSecurityAlert(entry) {
|
|
1026
|
+
this.emit('security:critical', {
|
|
1027
|
+
entry,
|
|
1028
|
+
message: `Critical security event: ${entry.eventType}`,
|
|
1029
|
+
action: 'immediate-review-required'
|
|
1030
|
+
});
|
|
1031
|
+
}
|
|
1032
|
+
calculatePeakHourly(entries) {
|
|
1033
|
+
const hourlyBuckets = {};
|
|
1034
|
+
for (const entry of entries){
|
|
1035
|
+
const hour = entry.timestamp.toISOString().substr(0, 13); // YYYY-MM-DDTHH
|
|
1036
|
+
hourlyBuckets[hour] = (hourlyBuckets[hour] || 0) + 1;
|
|
1037
|
+
}
|
|
1038
|
+
return Math.max(...Object.values(hourlyBuckets), 0);
|
|
1039
|
+
}
|
|
1040
|
+
groupBy(array, key) {
|
|
1041
|
+
return array.reduce((groups, item)=>{
|
|
1042
|
+
const value = String(item[key]);
|
|
1043
|
+
groups[value] = (groups[value] || 0) + 1;
|
|
1044
|
+
return groups;
|
|
1045
|
+
}, {});
|
|
1046
|
+
}
|
|
1047
|
+
convertToCSV(entries) {
|
|
1048
|
+
const headers = [
|
|
1049
|
+
'timestamp',
|
|
1050
|
+
'eventType',
|
|
1051
|
+
'category',
|
|
1052
|
+
'severity',
|
|
1053
|
+
'userId',
|
|
1054
|
+
'action',
|
|
1055
|
+
'outcome',
|
|
1056
|
+
'resource'
|
|
1057
|
+
];
|
|
1058
|
+
const rows = entries.map((entry)=>[
|
|
1059
|
+
entry.timestamp.toISOString(),
|
|
1060
|
+
entry.eventType,
|
|
1061
|
+
entry.category,
|
|
1062
|
+
entry.severity,
|
|
1063
|
+
entry.userId || '',
|
|
1064
|
+
entry.action,
|
|
1065
|
+
entry.outcome,
|
|
1066
|
+
`${entry.resource.type}:${entry.resource.id}`
|
|
1067
|
+
]);
|
|
1068
|
+
return [
|
|
1069
|
+
headers,
|
|
1070
|
+
...rows
|
|
1071
|
+
].map((row)=>row.join(',')).join('\n');
|
|
1072
|
+
}
|
|
1073
|
+
convertToXML(entries) {
|
|
1074
|
+
let xml = '<?xml version="1.0" encoding="UTF-8"?>\n<auditEntries>\n';
|
|
1075
|
+
for (const entry of entries){
|
|
1076
|
+
xml += ` <entry id="${entry.id}">\n`;
|
|
1077
|
+
xml += ` <timestamp>${entry.timestamp.toISOString()}</timestamp>\n`;
|
|
1078
|
+
xml += ` <eventType>${entry.eventType}</eventType>\n`;
|
|
1079
|
+
xml += ` <category>${entry.category}</category>\n`;
|
|
1080
|
+
xml += ` <severity>${entry.severity}</severity>\n`;
|
|
1081
|
+
xml += ` <action>${entry.action}</action>\n`;
|
|
1082
|
+
xml += ` <outcome>${entry.outcome}</outcome>\n`;
|
|
1083
|
+
xml += ` </entry>\n`;
|
|
1084
|
+
}
|
|
1085
|
+
xml += '</auditEntries>';
|
|
1086
|
+
return xml;
|
|
1087
|
+
}
|
|
1088
|
+
async convertToPDF(entries) {
|
|
1089
|
+
// Would implement PDF generation
|
|
1090
|
+
return 'PDF generation not implemented';
|
|
1091
|
+
}
|
|
1092
|
+
async saveFramework(framework) {
|
|
1093
|
+
const filePath = join(this.auditPath, 'frameworks', `${framework.id}.json`);
|
|
1094
|
+
await writeFile(filePath, JSON.stringify(framework, null, 2));
|
|
1095
|
+
}
|
|
1096
|
+
async saveAuditTrail(trail) {
|
|
1097
|
+
const filePath = join(this.auditPath, 'trails', `${trail.id}.json`);
|
|
1098
|
+
await writeFile(filePath, JSON.stringify(trail, null, 2));
|
|
1099
|
+
}
|
|
1100
|
+
async saveReport(report) {
|
|
1101
|
+
const filePath = join(this.auditPath, 'reports', `${report.id}.json`);
|
|
1102
|
+
await writeFile(filePath, JSON.stringify(report, null, 2));
|
|
1103
|
+
}
|
|
1104
|
+
constructor(auditPath = './audit', logger, config){
|
|
1105
|
+
super(), _define_property(this, "auditTrails", new Map()), _define_property(this, "frameworks", new Map()), _define_property(this, "reports", new Map()), _define_property(this, "auditBuffer", []), _define_property(this, "auditPath", void 0), _define_property(this, "logger", void 0), _define_property(this, "config", void 0), _define_property(this, "configuration", void 0);
|
|
1106
|
+
this.auditPath = auditPath;
|
|
1107
|
+
this.logger = logger || new Logger({
|
|
1108
|
+
level: 'info',
|
|
1109
|
+
format: 'text',
|
|
1110
|
+
destination: 'console'
|
|
1111
|
+
});
|
|
1112
|
+
this.config = config || ConfigManager.getInstance();
|
|
1113
|
+
this.configuration = this.getDefaultConfiguration();
|
|
1114
|
+
}
|
|
1115
|
+
}
|