@pan-sec/notebooklm-mcp 1.4.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -7
- package/SECURITY.md +40 -6
- package/dist/auth/mcp-auth.d.ts.map +1 -1
- package/dist/auth/mcp-auth.js +3 -6
- package/dist/auth/mcp-auth.js.map +1 -1
- package/dist/compliance/alert-manager.d.ts +120 -0
- package/dist/compliance/alert-manager.d.ts.map +1 -0
- package/dist/compliance/alert-manager.js +420 -0
- package/dist/compliance/alert-manager.js.map +1 -0
- package/dist/compliance/breach-detection.d.ts +134 -0
- package/dist/compliance/breach-detection.d.ts.map +1 -0
- package/dist/compliance/breach-detection.js +456 -0
- package/dist/compliance/breach-detection.js.map +1 -0
- package/dist/compliance/change-log.d.ts +113 -0
- package/dist/compliance/change-log.d.ts.map +1 -0
- package/dist/compliance/change-log.js +275 -0
- package/dist/compliance/change-log.js.map +1 -0
- package/dist/compliance/compliance-logger.d.ts +136 -0
- package/dist/compliance/compliance-logger.d.ts.map +1 -0
- package/dist/compliance/compliance-logger.js +425 -0
- package/dist/compliance/compliance-logger.js.map +1 -0
- package/dist/compliance/compliance-tools.d.ts +18 -0
- package/dist/compliance/compliance-tools.d.ts.map +1 -0
- package/dist/compliance/compliance-tools.js +673 -0
- package/dist/compliance/compliance-tools.js.map +1 -0
- package/dist/compliance/consent-manager.d.ts +130 -0
- package/dist/compliance/consent-manager.d.ts.map +1 -0
- package/dist/compliance/consent-manager.js +386 -0
- package/dist/compliance/consent-manager.js.map +1 -0
- package/dist/compliance/dashboard.d.ts +243 -0
- package/dist/compliance/dashboard.d.ts.map +1 -0
- package/dist/compliance/dashboard.js +519 -0
- package/dist/compliance/dashboard.js.map +1 -0
- package/dist/compliance/data-classification.d.ts +117 -0
- package/dist/compliance/data-classification.d.ts.map +1 -0
- package/dist/compliance/data-classification.js +469 -0
- package/dist/compliance/data-classification.js.map +1 -0
- package/dist/compliance/data-erasure.d.ts +110 -0
- package/dist/compliance/data-erasure.d.ts.map +1 -0
- package/dist/compliance/data-erasure.js +501 -0
- package/dist/compliance/data-erasure.js.map +1 -0
- package/dist/compliance/data-export.d.ts +85 -0
- package/dist/compliance/data-export.d.ts.map +1 -0
- package/dist/compliance/data-export.js +394 -0
- package/dist/compliance/data-export.js.map +1 -0
- package/dist/compliance/data-inventory.d.ts +136 -0
- package/dist/compliance/data-inventory.d.ts.map +1 -0
- package/dist/compliance/data-inventory.js +335 -0
- package/dist/compliance/data-inventory.js.map +1 -0
- package/dist/compliance/dsar-handler.d.ts +123 -0
- package/dist/compliance/dsar-handler.d.ts.map +1 -0
- package/dist/compliance/dsar-handler.js +371 -0
- package/dist/compliance/dsar-handler.js.map +1 -0
- package/dist/compliance/evidence-collector.d.ts +187 -0
- package/dist/compliance/evidence-collector.d.ts.map +1 -0
- package/dist/compliance/evidence-collector.js +656 -0
- package/dist/compliance/evidence-collector.js.map +1 -0
- package/dist/compliance/health-monitor.d.ts +111 -0
- package/dist/compliance/health-monitor.d.ts.map +1 -0
- package/dist/compliance/health-monitor.js +509 -0
- package/dist/compliance/health-monitor.js.map +1 -0
- package/dist/compliance/incident-manager.d.ts +131 -0
- package/dist/compliance/incident-manager.d.ts.map +1 -0
- package/dist/compliance/incident-manager.js +418 -0
- package/dist/compliance/incident-manager.js.map +1 -0
- package/dist/compliance/index.d.ts +32 -0
- package/dist/compliance/index.d.ts.map +1 -0
- package/dist/compliance/index.js +35 -0
- package/dist/compliance/index.js.map +1 -0
- package/dist/compliance/policy-docs.d.ts +108 -0
- package/dist/compliance/policy-docs.d.ts.map +1 -0
- package/dist/compliance/policy-docs.js +464 -0
- package/dist/compliance/policy-docs.js.map +1 -0
- package/dist/compliance/privacy-notice-text.d.ts +58 -0
- package/dist/compliance/privacy-notice-text.d.ts.map +1 -0
- package/dist/compliance/privacy-notice-text.js +161 -0
- package/dist/compliance/privacy-notice-text.js.map +1 -0
- package/dist/compliance/privacy-notice.d.ts +128 -0
- package/dist/compliance/privacy-notice.d.ts.map +1 -0
- package/dist/compliance/privacy-notice.js +250 -0
- package/dist/compliance/privacy-notice.js.map +1 -0
- package/dist/compliance/report-generator.d.ts +168 -0
- package/dist/compliance/report-generator.d.ts.map +1 -0
- package/dist/compliance/report-generator.js +830 -0
- package/dist/compliance/report-generator.js.map +1 -0
- package/dist/compliance/retention-engine.d.ts +130 -0
- package/dist/compliance/retention-engine.d.ts.map +1 -0
- package/dist/compliance/retention-engine.js +510 -0
- package/dist/compliance/retention-engine.js.map +1 -0
- package/dist/compliance/siem-exporter.d.ts +150 -0
- package/dist/compliance/siem-exporter.d.ts.map +1 -0
- package/dist/compliance/siem-exporter.js +509 -0
- package/dist/compliance/siem-exporter.js.map +1 -0
- package/dist/compliance/types.d.ts +601 -0
- package/dist/compliance/types.d.ts.map +1 -0
- package/dist/compliance/types.js +22 -0
- package/dist/compliance/types.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +8 -1
- package/dist/config.js.map +1 -1
- package/dist/library/notebook-library.d.ts.map +1 -1
- package/dist/library/notebook-library.js +2 -1
- package/dist/library/notebook-library.js.map +1 -1
- package/dist/session/shared-context-manager.d.ts.map +1 -1
- package/dist/session/shared-context-manager.js +2 -1
- package/dist/session/shared-context-manager.js.map +1 -1
- package/dist/utils/audit-logger.d.ts +21 -1
- package/dist/utils/audit-logger.d.ts.map +1 -1
- package/dist/utils/audit-logger.js +53 -4
- package/dist/utils/audit-logger.js.map +1 -1
- package/dist/utils/crypto.d.ts.map +1 -1
- package/dist/utils/crypto.js +8 -15
- package/dist/utils/crypto.js.map +1 -1
- package/dist/utils/file-permissions.d.ts +85 -0
- package/dist/utils/file-permissions.d.ts.map +1 -0
- package/dist/utils/file-permissions.js +180 -0
- package/dist/utils/file-permissions.js.map +1 -0
- package/dist/utils/settings-manager.d.ts.map +1 -1
- package/dist/utils/settings-manager.js +6 -11
- package/dist/utils/settings-manager.js.map +1 -1
- package/docs/COMPLIANCE-SPEC.md +1452 -0
- package/package.json +30 -4
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retention Policy Engine
|
|
3
|
+
*
|
|
4
|
+
* Enforces data retention policies automatically.
|
|
5
|
+
* Supports GDPR storage limitation and CSSF 7-year retention requirements.
|
|
6
|
+
*
|
|
7
|
+
* Added by Pantheon Security for enterprise compliance support.
|
|
8
|
+
*/
|
|
9
|
+
import crypto from "crypto";
|
|
10
|
+
import path from "path";
|
|
11
|
+
import fs from "fs";
|
|
12
|
+
import { getConfig } from "../config.js";
|
|
13
|
+
import { mkdirSecure, writeFileSecure } from "../utils/file-permissions.js";
|
|
14
|
+
import { getComplianceLogger } from "./compliance-logger.js";
|
|
15
|
+
import { getAuditLogger } from "../utils/audit-logger.js";
|
|
16
|
+
import { DataClassification } from "./types.js";
|
|
17
|
+
/**
|
|
18
|
+
* Generate a UUID v4
|
|
19
|
+
*/
|
|
20
|
+
function generateUUID() {
|
|
21
|
+
return crypto.randomUUID();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Default retention policies
|
|
25
|
+
*/
|
|
26
|
+
const DEFAULT_POLICIES = [
|
|
27
|
+
{
|
|
28
|
+
id: "policy_audit_logs",
|
|
29
|
+
name: "Audit Log Retention",
|
|
30
|
+
data_types: ["audit_logs", "compliance_events", "security_logs"],
|
|
31
|
+
classifications: [DataClassification.REGULATED],
|
|
32
|
+
retention_days: 7 * 365, // 7 years (CSSF requirement)
|
|
33
|
+
action: "archive",
|
|
34
|
+
schedule: "monthly",
|
|
35
|
+
regulatory_requirement: "CSSF Circular 20/750",
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: "policy_consent",
|
|
39
|
+
name: "Consent Record Retention",
|
|
40
|
+
data_types: ["consent_records"],
|
|
41
|
+
retention_days: 7 * 365, // 7 years
|
|
42
|
+
action: "archive",
|
|
43
|
+
schedule: "monthly",
|
|
44
|
+
regulatory_requirement: "GDPR Article 7",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: "policy_session",
|
|
48
|
+
name: "Session Data Cleanup",
|
|
49
|
+
data_types: ["session_state", "browser_local_storage"],
|
|
50
|
+
retention_days: 1, // 24 hours
|
|
51
|
+
action: "delete",
|
|
52
|
+
schedule: "daily",
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: "policy_browser_cache",
|
|
56
|
+
name: "Browser Cache Cleanup",
|
|
57
|
+
data_types: ["browser_cache"],
|
|
58
|
+
retention_days: 7,
|
|
59
|
+
action: "delete",
|
|
60
|
+
schedule: "weekly",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: "policy_error_logs",
|
|
64
|
+
name: "Error Log Cleanup",
|
|
65
|
+
data_types: ["error_logs"],
|
|
66
|
+
retention_days: 30,
|
|
67
|
+
action: "delete",
|
|
68
|
+
schedule: "monthly",
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
/**
|
|
72
|
+
* Retention Engine class
|
|
73
|
+
*/
|
|
74
|
+
export class RetentionEngine {
|
|
75
|
+
static instance;
|
|
76
|
+
policiesFile;
|
|
77
|
+
policies = new Map();
|
|
78
|
+
loaded = false;
|
|
79
|
+
archiveDir;
|
|
80
|
+
lastRunFile;
|
|
81
|
+
constructor() {
|
|
82
|
+
const config = getConfig();
|
|
83
|
+
this.policiesFile = path.join(config.configDir, "retention-policies.json");
|
|
84
|
+
this.archiveDir = path.join(config.dataDir, "archive");
|
|
85
|
+
this.lastRunFile = path.join(config.configDir, "retention-last-run.json");
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get singleton instance
|
|
89
|
+
*/
|
|
90
|
+
static getInstance() {
|
|
91
|
+
if (!RetentionEngine.instance) {
|
|
92
|
+
RetentionEngine.instance = new RetentionEngine();
|
|
93
|
+
}
|
|
94
|
+
return RetentionEngine.instance;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Load policies from storage
|
|
98
|
+
*/
|
|
99
|
+
async load() {
|
|
100
|
+
if (this.loaded)
|
|
101
|
+
return;
|
|
102
|
+
// Load default policies first
|
|
103
|
+
for (const policy of DEFAULT_POLICIES) {
|
|
104
|
+
this.policies.set(policy.id, policy);
|
|
105
|
+
}
|
|
106
|
+
// Load custom policies
|
|
107
|
+
try {
|
|
108
|
+
if (fs.existsSync(this.policiesFile)) {
|
|
109
|
+
const content = fs.readFileSync(this.policiesFile, "utf-8");
|
|
110
|
+
const data = JSON.parse(content);
|
|
111
|
+
if (data.policies && Array.isArray(data.policies)) {
|
|
112
|
+
for (const policy of data.policies) {
|
|
113
|
+
this.policies.set(policy.id, policy);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Use defaults if file is corrupted
|
|
120
|
+
}
|
|
121
|
+
this.loaded = true;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Save policies to storage
|
|
125
|
+
*/
|
|
126
|
+
async save() {
|
|
127
|
+
const dir = path.dirname(this.policiesFile);
|
|
128
|
+
mkdirSecure(dir);
|
|
129
|
+
// Only save custom policies (not default ones)
|
|
130
|
+
const customPolicies = Array.from(this.policies.values()).filter(p => !DEFAULT_POLICIES.find(dp => dp.id === p.id));
|
|
131
|
+
const data = {
|
|
132
|
+
version: "1.0.0",
|
|
133
|
+
last_updated: new Date().toISOString(),
|
|
134
|
+
policies: customPolicies,
|
|
135
|
+
};
|
|
136
|
+
writeFileSecure(this.policiesFile, JSON.stringify(data, null, 2));
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Add a custom retention policy
|
|
140
|
+
*/
|
|
141
|
+
async addPolicy(policy) {
|
|
142
|
+
await this.load();
|
|
143
|
+
const newPolicy = {
|
|
144
|
+
...policy,
|
|
145
|
+
id: `policy_${generateUUID().slice(0, 8)}`,
|
|
146
|
+
};
|
|
147
|
+
this.policies.set(newPolicy.id, newPolicy);
|
|
148
|
+
await this.save();
|
|
149
|
+
return newPolicy;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Update an existing policy
|
|
153
|
+
*/
|
|
154
|
+
async updatePolicy(policyId, updates) {
|
|
155
|
+
await this.load();
|
|
156
|
+
const policy = this.policies.get(policyId);
|
|
157
|
+
if (!policy)
|
|
158
|
+
return null;
|
|
159
|
+
const updatedPolicy = {
|
|
160
|
+
...policy,
|
|
161
|
+
...updates,
|
|
162
|
+
};
|
|
163
|
+
this.policies.set(policyId, updatedPolicy);
|
|
164
|
+
await this.save();
|
|
165
|
+
return updatedPolicy;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Remove a policy
|
|
169
|
+
*/
|
|
170
|
+
async removePolicy(policyId) {
|
|
171
|
+
await this.load();
|
|
172
|
+
// Don't allow removing default policies
|
|
173
|
+
if (DEFAULT_POLICIES.find(p => p.id === policyId)) {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
if (!this.policies.has(policyId)) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
this.policies.delete(policyId);
|
|
180
|
+
await this.save();
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get all policies
|
|
185
|
+
*/
|
|
186
|
+
async getPolicies() {
|
|
187
|
+
await this.load();
|
|
188
|
+
return Array.from(this.policies.values());
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Get policy by ID
|
|
192
|
+
*/
|
|
193
|
+
async getPolicy(policyId) {
|
|
194
|
+
await this.load();
|
|
195
|
+
return this.policies.get(policyId) || null;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Check if retention should run based on schedule
|
|
199
|
+
*/
|
|
200
|
+
shouldRun(policy) {
|
|
201
|
+
try {
|
|
202
|
+
if (!fs.existsSync(this.lastRunFile)) {
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
const content = fs.readFileSync(this.lastRunFile, "utf-8");
|
|
206
|
+
const data = JSON.parse(content);
|
|
207
|
+
const lastRun = data.runs?.[policy.id];
|
|
208
|
+
if (!lastRun)
|
|
209
|
+
return true;
|
|
210
|
+
const lastRunDate = new Date(lastRun);
|
|
211
|
+
const now = new Date();
|
|
212
|
+
const diffMs = now.getTime() - lastRunDate.getTime();
|
|
213
|
+
const diffDays = diffMs / (1000 * 60 * 60 * 24);
|
|
214
|
+
switch (policy.schedule) {
|
|
215
|
+
case "daily":
|
|
216
|
+
return diffDays >= 1;
|
|
217
|
+
case "weekly":
|
|
218
|
+
return diffDays >= 7;
|
|
219
|
+
case "monthly":
|
|
220
|
+
return diffDays >= 30;
|
|
221
|
+
default:
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Record policy execution time
|
|
231
|
+
*/
|
|
232
|
+
recordRun(policyId) {
|
|
233
|
+
try {
|
|
234
|
+
let data = { runs: {} };
|
|
235
|
+
if (fs.existsSync(this.lastRunFile)) {
|
|
236
|
+
const content = fs.readFileSync(this.lastRunFile, "utf-8");
|
|
237
|
+
data = JSON.parse(content);
|
|
238
|
+
}
|
|
239
|
+
data.runs = data.runs || {};
|
|
240
|
+
data.runs[policyId] = new Date().toISOString();
|
|
241
|
+
const dir = path.dirname(this.lastRunFile);
|
|
242
|
+
mkdirSecure(dir);
|
|
243
|
+
writeFileSecure(this.lastRunFile, JSON.stringify(data, null, 2));
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
// Ignore errors
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Execute a single retention policy
|
|
251
|
+
*/
|
|
252
|
+
async executePolicy(policy) {
|
|
253
|
+
const results = [];
|
|
254
|
+
const config = getConfig();
|
|
255
|
+
for (const dataType of policy.data_types) {
|
|
256
|
+
const result = {
|
|
257
|
+
policy_id: policy.id,
|
|
258
|
+
policy_name: policy.name,
|
|
259
|
+
executed_at: new Date().toISOString(),
|
|
260
|
+
data_type: dataType,
|
|
261
|
+
action: policy.action,
|
|
262
|
+
items_processed: 0,
|
|
263
|
+
bytes_freed: 0,
|
|
264
|
+
success: true,
|
|
265
|
+
};
|
|
266
|
+
try {
|
|
267
|
+
// Determine the data location based on data type
|
|
268
|
+
const location = this.getDataLocation(dataType, config);
|
|
269
|
+
if (!location || !fs.existsSync(location)) {
|
|
270
|
+
results.push(result);
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
// Get files to process
|
|
274
|
+
const cutoffDate = new Date();
|
|
275
|
+
cutoffDate.setDate(cutoffDate.getDate() - policy.retention_days);
|
|
276
|
+
const files = this.getExpiredFiles(location, cutoffDate, dataType);
|
|
277
|
+
for (const file of files) {
|
|
278
|
+
try {
|
|
279
|
+
const stats = fs.statSync(file);
|
|
280
|
+
result.bytes_freed += stats.size;
|
|
281
|
+
result.items_processed++;
|
|
282
|
+
switch (policy.action) {
|
|
283
|
+
case "delete":
|
|
284
|
+
fs.unlinkSync(file);
|
|
285
|
+
break;
|
|
286
|
+
case "archive":
|
|
287
|
+
await this.archiveFile(file, dataType);
|
|
288
|
+
fs.unlinkSync(file);
|
|
289
|
+
break;
|
|
290
|
+
case "anonymize":
|
|
291
|
+
// Anonymization would depend on data type
|
|
292
|
+
// For now, we just log that it should be anonymized
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
// Continue with other files
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
// Log retention event
|
|
301
|
+
const logger = getComplianceLogger();
|
|
302
|
+
await logger.logRetention(policy.action === "delete" ? "delete" : policy.action === "archive" ? "archive" : "cleanup", dataType, result.items_processed, {
|
|
303
|
+
policy_id: policy.id,
|
|
304
|
+
bytes_freed: result.bytes_freed,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
result.success = false;
|
|
309
|
+
result.error = error instanceof Error ? error.message : String(error);
|
|
310
|
+
}
|
|
311
|
+
results.push(result);
|
|
312
|
+
}
|
|
313
|
+
return results;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Get the storage location for a data type
|
|
317
|
+
*/
|
|
318
|
+
getDataLocation(dataType, config) {
|
|
319
|
+
const locations = {
|
|
320
|
+
"audit_logs": path.join(config.dataDir, "audit"),
|
|
321
|
+
"compliance_events": path.join(config.dataDir, "compliance"),
|
|
322
|
+
"security_logs": path.join(config.dataDir, "security"),
|
|
323
|
+
"session_state": path.join(config.dataDir, "sessions"),
|
|
324
|
+
"browser_cache": path.join(config.dataDir, "browser_cache"),
|
|
325
|
+
"browser_local_storage": path.join(config.dataDir, "browser_state"),
|
|
326
|
+
"error_logs": path.join(config.dataDir, "logs"),
|
|
327
|
+
};
|
|
328
|
+
return locations[dataType] || null;
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Get files that have exceeded retention period
|
|
332
|
+
*/
|
|
333
|
+
getExpiredFiles(location, cutoffDate, dataType) {
|
|
334
|
+
const expiredFiles = [];
|
|
335
|
+
try {
|
|
336
|
+
const stats = fs.statSync(location);
|
|
337
|
+
if (stats.isFile()) {
|
|
338
|
+
// Single file
|
|
339
|
+
if (stats.mtime < cutoffDate) {
|
|
340
|
+
expiredFiles.push(location);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
else if (stats.isDirectory()) {
|
|
344
|
+
// Directory - check all files
|
|
345
|
+
const files = fs.readdirSync(location);
|
|
346
|
+
for (const file of files) {
|
|
347
|
+
const filePath = path.join(location, file);
|
|
348
|
+
try {
|
|
349
|
+
const fileStats = fs.statSync(filePath);
|
|
350
|
+
// For dated log files, extract date from filename
|
|
351
|
+
if (dataType.includes("logs") || dataType.includes("events")) {
|
|
352
|
+
const dateMatch = file.match(/(\d{4}-\d{2}-\d{2})/);
|
|
353
|
+
if (dateMatch) {
|
|
354
|
+
const fileDate = new Date(dateMatch[1]);
|
|
355
|
+
if (fileDate < cutoffDate) {
|
|
356
|
+
expiredFiles.push(filePath);
|
|
357
|
+
}
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
// Fall back to modification time
|
|
362
|
+
if (fileStats.mtime < cutoffDate) {
|
|
363
|
+
expiredFiles.push(filePath);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
// Skip files we can't access
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
catch {
|
|
373
|
+
// Location doesn't exist or can't be accessed
|
|
374
|
+
}
|
|
375
|
+
return expiredFiles;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Archive a file
|
|
379
|
+
*/
|
|
380
|
+
async archiveFile(filePath, dataType) {
|
|
381
|
+
mkdirSecure(this.archiveDir);
|
|
382
|
+
const timestamp = new Date().toISOString().split("T")[0];
|
|
383
|
+
const fileName = path.basename(filePath);
|
|
384
|
+
const archiveSubDir = path.join(this.archiveDir, dataType, timestamp);
|
|
385
|
+
mkdirSecure(archiveSubDir);
|
|
386
|
+
const archivePath = path.join(archiveSubDir, fileName);
|
|
387
|
+
fs.copyFileSync(filePath, archivePath);
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Run all due retention policies
|
|
391
|
+
*/
|
|
392
|
+
async runDuePolicies() {
|
|
393
|
+
await this.load();
|
|
394
|
+
const allResults = [];
|
|
395
|
+
for (const policy of this.policies.values()) {
|
|
396
|
+
if (this.shouldRun(policy)) {
|
|
397
|
+
const results = await this.executePolicy(policy);
|
|
398
|
+
allResults.push(...results);
|
|
399
|
+
this.recordRun(policy.id);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
// Log to audit logger
|
|
403
|
+
const auditLogger = getAuditLogger();
|
|
404
|
+
if (allResults.length > 0) {
|
|
405
|
+
const totalItems = allResults.reduce((sum, r) => sum + r.items_processed, 0);
|
|
406
|
+
const totalBytes = allResults.reduce((sum, r) => sum + r.bytes_freed, 0);
|
|
407
|
+
await auditLogger.logRetentionEvent("cleanup", "multiple", totalItems, {
|
|
408
|
+
policies_executed: allResults.length,
|
|
409
|
+
bytes_freed: totalBytes,
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
return allResults;
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Force run a specific policy (ignoring schedule)
|
|
416
|
+
*/
|
|
417
|
+
async forceRunPolicy(policyId) {
|
|
418
|
+
await this.load();
|
|
419
|
+
const policy = this.policies.get(policyId);
|
|
420
|
+
if (!policy) {
|
|
421
|
+
return [];
|
|
422
|
+
}
|
|
423
|
+
const results = await this.executePolicy(policy);
|
|
424
|
+
this.recordRun(policyId);
|
|
425
|
+
return results;
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Get retention status summary
|
|
429
|
+
*/
|
|
430
|
+
async getStatus() {
|
|
431
|
+
await this.load();
|
|
432
|
+
const policies = Array.from(this.policies.values());
|
|
433
|
+
let lastRuns = {};
|
|
434
|
+
try {
|
|
435
|
+
if (fs.existsSync(this.lastRunFile)) {
|
|
436
|
+
const content = fs.readFileSync(this.lastRunFile, "utf-8");
|
|
437
|
+
const data = JSON.parse(content);
|
|
438
|
+
lastRuns = data.runs || {};
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
catch {
|
|
442
|
+
lastRuns = {};
|
|
443
|
+
}
|
|
444
|
+
// Calculate next due
|
|
445
|
+
const nextDue = [];
|
|
446
|
+
for (const policy of policies) {
|
|
447
|
+
const lastRun = lastRuns[policy.id];
|
|
448
|
+
let dueInDays = 0;
|
|
449
|
+
if (lastRun) {
|
|
450
|
+
const lastRunDate = new Date(lastRun);
|
|
451
|
+
const now = new Date();
|
|
452
|
+
const daysSinceRun = (now.getTime() - lastRunDate.getTime()) / (1000 * 60 * 60 * 24);
|
|
453
|
+
switch (policy.schedule) {
|
|
454
|
+
case "daily":
|
|
455
|
+
dueInDays = Math.max(0, 1 - daysSinceRun);
|
|
456
|
+
break;
|
|
457
|
+
case "weekly":
|
|
458
|
+
dueInDays = Math.max(0, 7 - daysSinceRun);
|
|
459
|
+
break;
|
|
460
|
+
case "monthly":
|
|
461
|
+
dueInDays = Math.max(0, 30 - daysSinceRun);
|
|
462
|
+
break;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
nextDue.push({
|
|
466
|
+
policy_id: policy.id,
|
|
467
|
+
policy_name: policy.name,
|
|
468
|
+
due_in_days: Math.round(dueInDays * 10) / 10,
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
nextDue.sort((a, b) => a.due_in_days - b.due_in_days);
|
|
472
|
+
return {
|
|
473
|
+
total_policies: policies.length,
|
|
474
|
+
active_policies: policies.length,
|
|
475
|
+
last_runs: lastRuns,
|
|
476
|
+
next_due: nextDue,
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
// ============================================
|
|
481
|
+
// SINGLETON ACCESS
|
|
482
|
+
// ============================================
|
|
483
|
+
/**
|
|
484
|
+
* Get the retention engine instance
|
|
485
|
+
*/
|
|
486
|
+
export function getRetentionEngine() {
|
|
487
|
+
return RetentionEngine.getInstance();
|
|
488
|
+
}
|
|
489
|
+
// ============================================
|
|
490
|
+
// CONVENIENCE EXPORTS
|
|
491
|
+
// ============================================
|
|
492
|
+
/**
|
|
493
|
+
* Run all due retention policies
|
|
494
|
+
*/
|
|
495
|
+
export async function runRetentionPolicies() {
|
|
496
|
+
return getRetentionEngine().runDuePolicies();
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Get all retention policies
|
|
500
|
+
*/
|
|
501
|
+
export async function getRetentionPolicies() {
|
|
502
|
+
return getRetentionEngine().getPolicies();
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Get retention status
|
|
506
|
+
*/
|
|
507
|
+
export async function getRetentionStatus() {
|
|
508
|
+
return getRetentionEngine().getStatus();
|
|
509
|
+
}
|
|
510
|
+
//# sourceMappingURL=retention-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention-engine.js","sourceRoot":"","sources":["../../src/compliance/retention-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SIEM Exporter
|
|
3
|
+
*
|
|
4
|
+
* Exports logs to external Security Information and Event Management systems.
|
|
5
|
+
* Supports CEF, LEEF, Syslog, Splunk HEC, and JSON formats.
|
|
6
|
+
*
|
|
7
|
+
* Added by Pantheon Security for enterprise compliance support.
|
|
8
|
+
*/
|
|
9
|
+
import type { SIEMFormat, AlertSeverity } from "./types.js";
|
|
10
|
+
/**
|
|
11
|
+
* SIEM event structure
|
|
12
|
+
*/
|
|
13
|
+
interface SIEMEvent {
|
|
14
|
+
timestamp: string;
|
|
15
|
+
event_type: string;
|
|
16
|
+
event_name: string;
|
|
17
|
+
severity: AlertSeverity;
|
|
18
|
+
source: string;
|
|
19
|
+
message: string;
|
|
20
|
+
details: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* SIEM Exporter class
|
|
24
|
+
*/
|
|
25
|
+
export declare class SIEMExporter {
|
|
26
|
+
private static instance;
|
|
27
|
+
private config;
|
|
28
|
+
private eventQueue;
|
|
29
|
+
private flushTimer;
|
|
30
|
+
private isExporting;
|
|
31
|
+
private failedDir;
|
|
32
|
+
private constructor();
|
|
33
|
+
/**
|
|
34
|
+
* Get singleton instance
|
|
35
|
+
*/
|
|
36
|
+
static getInstance(): SIEMExporter;
|
|
37
|
+
/**
|
|
38
|
+
* Start the flush timer
|
|
39
|
+
*/
|
|
40
|
+
private startFlushTimer;
|
|
41
|
+
/**
|
|
42
|
+
* Stop the flush timer
|
|
43
|
+
*/
|
|
44
|
+
stop(): void;
|
|
45
|
+
/**
|
|
46
|
+
* Check if event meets minimum severity
|
|
47
|
+
*/
|
|
48
|
+
private meetsMinimumSeverity;
|
|
49
|
+
/**
|
|
50
|
+
* Check if event type is allowed
|
|
51
|
+
*/
|
|
52
|
+
private isEventTypeAllowed;
|
|
53
|
+
/**
|
|
54
|
+
* Queue an event for export
|
|
55
|
+
*/
|
|
56
|
+
queueEvent(event: SIEMEvent): Promise<boolean>;
|
|
57
|
+
/**
|
|
58
|
+
* Flush queued events
|
|
59
|
+
*/
|
|
60
|
+
flush(): Promise<{
|
|
61
|
+
sent: number;
|
|
62
|
+
failed: number;
|
|
63
|
+
}>;
|
|
64
|
+
/**
|
|
65
|
+
* Export a single event
|
|
66
|
+
*/
|
|
67
|
+
private exportEvent;
|
|
68
|
+
/**
|
|
69
|
+
* Format event as CEF (Common Event Format)
|
|
70
|
+
*/
|
|
71
|
+
private formatCEF;
|
|
72
|
+
/**
|
|
73
|
+
* Export event as CEF
|
|
74
|
+
*/
|
|
75
|
+
private exportCEF;
|
|
76
|
+
/**
|
|
77
|
+
* Format event as LEEF (Log Event Extended Format)
|
|
78
|
+
*/
|
|
79
|
+
private formatLEEF;
|
|
80
|
+
/**
|
|
81
|
+
* Export event as LEEF
|
|
82
|
+
*/
|
|
83
|
+
private exportLEEF;
|
|
84
|
+
/**
|
|
85
|
+
* Format event as RFC 5424 syslog
|
|
86
|
+
*/
|
|
87
|
+
private formatSyslog;
|
|
88
|
+
/**
|
|
89
|
+
* Export event as syslog
|
|
90
|
+
*/
|
|
91
|
+
private exportSyslog;
|
|
92
|
+
/**
|
|
93
|
+
* Export event to Splunk HEC
|
|
94
|
+
*/
|
|
95
|
+
private exportSplunkHEC;
|
|
96
|
+
/**
|
|
97
|
+
* Export event as JSON
|
|
98
|
+
*/
|
|
99
|
+
private exportJSON;
|
|
100
|
+
/**
|
|
101
|
+
* Send message to configured endpoint
|
|
102
|
+
*/
|
|
103
|
+
private sendToEndpoint;
|
|
104
|
+
/**
|
|
105
|
+
* HTTP POST request
|
|
106
|
+
*/
|
|
107
|
+
private httpPost;
|
|
108
|
+
/**
|
|
109
|
+
* Escape CEF extension value
|
|
110
|
+
*/
|
|
111
|
+
private escapeExtension;
|
|
112
|
+
/**
|
|
113
|
+
* Save failed event for later retry
|
|
114
|
+
*/
|
|
115
|
+
private saveFailedEvent;
|
|
116
|
+
/**
|
|
117
|
+
* Retry failed events
|
|
118
|
+
*/
|
|
119
|
+
retryFailed(): Promise<{
|
|
120
|
+
sent: number;
|
|
121
|
+
failed: number;
|
|
122
|
+
}>;
|
|
123
|
+
/**
|
|
124
|
+
* Get exporter statistics
|
|
125
|
+
*/
|
|
126
|
+
getStats(): {
|
|
127
|
+
enabled: boolean;
|
|
128
|
+
format: SIEMFormat;
|
|
129
|
+
queue_size: number;
|
|
130
|
+
endpoint_configured: boolean;
|
|
131
|
+
syslog_configured: boolean;
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get the SIEM exporter instance
|
|
136
|
+
*/
|
|
137
|
+
export declare function getSIEMExporter(): SIEMExporter;
|
|
138
|
+
/**
|
|
139
|
+
* Queue an event for SIEM export
|
|
140
|
+
*/
|
|
141
|
+
export declare function exportToSIEM(eventType: string, eventName: string, severity: AlertSeverity, message: string, source: string, details?: Record<string, unknown>): Promise<boolean>;
|
|
142
|
+
/**
|
|
143
|
+
* Flush SIEM event queue
|
|
144
|
+
*/
|
|
145
|
+
export declare function flushSIEM(): Promise<{
|
|
146
|
+
sent: number;
|
|
147
|
+
failed: number;
|
|
148
|
+
}>;
|
|
149
|
+
export {};
|
|
150
|
+
//# sourceMappingURL=siem-exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"siem-exporter.d.ts","sourceRoot":"","sources":["../../src/compliance/siem-exporter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,KAAK,EAAc,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAoDxE;;GAEG;AACH,UAAU,SAAS;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAe;IACtC,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO;IAWP;;OAEG;WACW,WAAW,IAAI,YAAY;IAOzC;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACI,IAAI,IAAI,IAAI;IAOnB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAO1B;;OAEG;IACU,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IA8B3D;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IA6B/D;;OAEG;YACW,WAAW;IAgBzB;;OAEG;IACH,OAAO,CAAC,SAAS;IA6BjB;;OAEG;YACW,SAAS;IAKvB;;OAEG;IACH,OAAO,CAAC,UAAU;IA2BlB;;OAEG;YACW,UAAU;IAKxB;;OAEG;IACH,OAAO,CAAC,YAAY;IAYpB;;OAEG;YACW,YAAY;IAmC1B;;OAEG;YACW,eAAe;IAsB7B;;OAEG;YACW,UAAU;IAIxB;;OAEG;YACW,cAAc;IAwB5B;;OAEG;YACW,QAAQ;IA0CtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;YACW,eAAe;IAU7B;;OAEG;IACU,WAAW,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAkDrE;;OAEG;IACI,QAAQ,IAAI;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,UAAU,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,mBAAmB,EAAE,OAAO,CAAC;QAC7B,iBAAiB,EAAE,OAAO,CAAC;KAC5B;CASF;AAMD;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAE9C;AAMD;;GAEG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAE3E"}
|