@dimzxzzx07/file-watcher 1.0.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.
Files changed (100) hide show
  1. package/.env +13 -0
  2. package/.eslintrc.json +128 -0
  3. package/.prettierrc +18 -0
  4. package/Dimzxzzx07.png +0 -0
  5. package/README.md +1024 -0
  6. package/dist/core/BackupManager.d.ts +25 -0
  7. package/dist/core/BackupManager.d.ts.map +1 -0
  8. package/dist/core/BackupManager.js +290 -0
  9. package/dist/core/BackupManager.js.map +1 -0
  10. package/dist/core/IntegrityValidator.d.ts +18 -0
  11. package/dist/core/IntegrityValidator.d.ts.map +1 -0
  12. package/dist/core/IntegrityValidator.js +212 -0
  13. package/dist/core/IntegrityValidator.js.map +1 -0
  14. package/dist/core/SecurityManager.d.ts +40 -0
  15. package/dist/core/SecurityManager.d.ts.map +1 -0
  16. package/dist/core/SecurityManager.js +320 -0
  17. package/dist/core/SecurityManager.js.map +1 -0
  18. package/dist/core/WatcherEngine.d.ts +44 -0
  19. package/dist/core/WatcherEngine.d.ts.map +1 -0
  20. package/dist/core/WatcherEngine.js +470 -0
  21. package/dist/core/WatcherEngine.js.map +1 -0
  22. package/dist/crypto/HashGenerator.d.ts +26 -0
  23. package/dist/crypto/HashGenerator.d.ts.map +1 -0
  24. package/dist/crypto/HashGenerator.js +220 -0
  25. package/dist/crypto/HashGenerator.js.map +1 -0
  26. package/dist/crypto/KeyManager.d.ts +30 -0
  27. package/dist/crypto/KeyManager.d.ts.map +1 -0
  28. package/dist/crypto/KeyManager.js +235 -0
  29. package/dist/crypto/KeyManager.js.map +1 -0
  30. package/dist/crypto/SignatureValidator.d.ts +11 -0
  31. package/dist/crypto/SignatureValidator.d.ts.map +1 -0
  32. package/dist/crypto/SignatureValidator.js +102 -0
  33. package/dist/crypto/SignatureValidator.js.map +1 -0
  34. package/dist/detectors/AnomalyDetector.d.ts +24 -0
  35. package/dist/detectors/AnomalyDetector.d.ts.map +1 -0
  36. package/dist/detectors/AnomalyDetector.js +209 -0
  37. package/dist/detectors/AnomalyDetector.js.map +1 -0
  38. package/dist/detectors/InjectionDetector.d.ts +14 -0
  39. package/dist/detectors/InjectionDetector.d.ts.map +1 -0
  40. package/dist/detectors/InjectionDetector.js +204 -0
  41. package/dist/detectors/InjectionDetector.js.map +1 -0
  42. package/dist/detectors/PatternMatcher.d.ts +28 -0
  43. package/dist/detectors/PatternMatcher.d.ts.map +1 -0
  44. package/dist/detectors/PatternMatcher.js +283 -0
  45. package/dist/detectors/PatternMatcher.js.map +1 -0
  46. package/dist/guards/FileGuard.d.ts +35 -0
  47. package/dist/guards/FileGuard.d.ts.map +1 -0
  48. package/dist/guards/FileGuard.js +357 -0
  49. package/dist/guards/FileGuard.js.map +1 -0
  50. package/dist/guards/MemoryGuard.d.ts +28 -0
  51. package/dist/guards/MemoryGuard.d.ts.map +1 -0
  52. package/dist/guards/MemoryGuard.js +256 -0
  53. package/dist/guards/MemoryGuard.js.map +1 -0
  54. package/dist/guards/ProcessGuard.d.ts +25 -0
  55. package/dist/guards/ProcessGuard.d.ts.map +1 -0
  56. package/dist/guards/ProcessGuard.js +221 -0
  57. package/dist/guards/ProcessGuard.js.map +1 -0
  58. package/dist/index.d.ts +19 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +186 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/types/index.d.ts +69 -0
  63. package/dist/types/index.d.ts.map +1 -0
  64. package/dist/types/index.js +3 -0
  65. package/dist/types/index.js.map +1 -0
  66. package/dist/utils/Constants.d.ts +407 -0
  67. package/dist/utils/Constants.d.ts.map +1 -0
  68. package/dist/utils/Constants.js +505 -0
  69. package/dist/utils/Constants.js.map +1 -0
  70. package/dist/utils/Logger.d.ts +45 -0
  71. package/dist/utils/Logger.d.ts.map +1 -0
  72. package/dist/utils/Logger.js +285 -0
  73. package/dist/utils/Logger.js.map +1 -0
  74. package/dist/utils/Validator.d.ts +27 -0
  75. package/dist/utils/Validator.d.ts.map +1 -0
  76. package/dist/utils/Validator.js +245 -0
  77. package/dist/utils/Validator.js.map +1 -0
  78. package/favicon.png +0 -0
  79. package/jest.config.js +69 -0
  80. package/package.json +69 -0
  81. package/src/core/BackupManager.ts +305 -0
  82. package/src/core/IntegrityValidator.ts +200 -0
  83. package/src/core/SecurityManager.ts +348 -0
  84. package/src/core/WatcherEngine.ts +537 -0
  85. package/src/crypto/HashGenerator.ts +234 -0
  86. package/src/crypto/KeyManager.ts +249 -0
  87. package/src/crypto/SignatureValidator.ts +76 -0
  88. package/src/detectors/AnomalyDetector.ts +247 -0
  89. package/src/detectors/InjectionDetector.ts +233 -0
  90. package/src/detectors/PatternMatcher.ts +319 -0
  91. package/src/guards/FileGuard.ts +385 -0
  92. package/src/guards/MemoryGuard.ts +263 -0
  93. package/src/guards/ProcessGuard.ts +219 -0
  94. package/src/index.ts +189 -0
  95. package/src/types/index.ts +72 -0
  96. package/src/utils/Constants.ts +532 -0
  97. package/src/utils/Logger.ts +279 -0
  98. package/src/utils/Validator.ts +248 -0
  99. package/tests/setup.ts +80 -0
  100. package/tsconfig.json +42 -0
@@ -0,0 +1,357 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.FileGuard = void 0;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const crypto = __importStar(require("crypto"));
40
+ const Logger_1 = require("../utils/Logger");
41
+ class FileGuard {
42
+ static instance;
43
+ logger;
44
+ fileLocks;
45
+ filePermissions;
46
+ watchedFiles;
47
+ quarantineDir;
48
+ isActive = true;
49
+ constructor() {
50
+ this.logger = Logger_1.Logger.getInstance();
51
+ this.fileLocks = new Map();
52
+ this.filePermissions = new Map();
53
+ this.watchedFiles = new Set();
54
+ this.quarantineDir = path.join(process.cwd(), '.quarantine');
55
+ this.initializeQuarantine();
56
+ this.startFileMonitoring();
57
+ }
58
+ static getInstance() {
59
+ if (!FileGuard.instance) {
60
+ FileGuard.instance = new FileGuard();
61
+ }
62
+ return FileGuard.instance;
63
+ }
64
+ async initializeQuarantine() {
65
+ try {
66
+ await fs.mkdir(this.quarantineDir, { recursive: true, mode: 0o700 });
67
+ }
68
+ catch (error) {
69
+ this.logger.error('Failed to create quarantine directory', { error });
70
+ }
71
+ }
72
+ startFileMonitoring() {
73
+ setInterval(() => {
74
+ this.checkFileIntegrity();
75
+ }, 10000);
76
+ }
77
+ async protectFile(filePath) {
78
+ try {
79
+ if (!await this.fileExists(filePath)) {
80
+ this.logger.warning(`File not found: ${filePath}`);
81
+ return false;
82
+ }
83
+ const stats = await fs.stat(filePath);
84
+ this.filePermissions.set(filePath, stats.mode);
85
+ await fs.chmod(filePath, 0o444);
86
+ this.watchedFiles.add(filePath);
87
+ await this.createBackup(filePath);
88
+ await this.calculateFileHash(filePath);
89
+ this.fileLocks.set(filePath, { locked: true, pid: process.pid });
90
+ this.logger.info(`File protected: ${filePath}`);
91
+ return true;
92
+ }
93
+ catch (error) {
94
+ this.logger.error(`Failed to protect file: ${filePath}`, { error });
95
+ return false;
96
+ }
97
+ }
98
+ async lockFile(filePath) {
99
+ try {
100
+ const lock = this.fileLocks.get(filePath);
101
+ if (lock && lock.pid !== process.pid) {
102
+ this.logger.warning(`File already locked by process ${lock.pid}: ${filePath}`);
103
+ return false;
104
+ }
105
+ await fs.chmod(filePath, 0o444);
106
+ this.fileLocks.set(filePath, { locked: true, pid: process.pid });
107
+ this.logger.debug(`File locked: ${filePath}`);
108
+ return true;
109
+ }
110
+ catch (error) {
111
+ this.logger.error(`Failed to lock file: ${filePath}`, { error });
112
+ return false;
113
+ }
114
+ }
115
+ async unlockFile(filePath) {
116
+ try {
117
+ const lock = this.fileLocks.get(filePath);
118
+ if (lock && lock.pid !== process.pid) {
119
+ this.logger.warning(`File locked by different process: ${filePath}`);
120
+ return false;
121
+ }
122
+ const originalMode = this.filePermissions.get(filePath) || 0o644;
123
+ await fs.chmod(filePath, originalMode);
124
+ this.fileLocks.delete(filePath);
125
+ this.logger.debug(`File unlocked: ${filePath}`);
126
+ return true;
127
+ }
128
+ catch (error) {
129
+ this.logger.error(`Failed to unlock file: ${filePath}`, { error });
130
+ return false;
131
+ }
132
+ }
133
+ async quarantineFile(filePath, reason) {
134
+ try {
135
+ const quarantineName = `${path.basename(filePath)}.${Date.now()}.quarantine`;
136
+ const quarantinePath = path.join(this.quarantineDir, quarantineName);
137
+ await fs.copyFile(filePath, quarantinePath);
138
+ await fs.chmod(quarantinePath, 0o400);
139
+ const metadata = {
140
+ originalPath: filePath,
141
+ quarantinedAt: new Date().toISOString(),
142
+ reason,
143
+ pid: process.pid,
144
+ hash: await this.calculateFileHash(filePath)
145
+ };
146
+ const metadataPath = quarantinePath + '.meta';
147
+ await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2));
148
+ this.logger.warning(`File quarantined: ${filePath} -> ${quarantinePath}`);
149
+ return quarantinePath;
150
+ }
151
+ catch (error) {
152
+ this.logger.error(`Failed to quarantine file: ${filePath}`, { error });
153
+ throw error;
154
+ }
155
+ }
156
+ async restoreFromQuarantine(quarantinePath) {
157
+ try {
158
+ const metadataPath = quarantinePath + '.meta';
159
+ const metadata = JSON.parse(await fs.readFile(metadataPath, 'utf8'));
160
+ await fs.copyFile(quarantinePath, metadata.originalPath);
161
+ await fs.chmod(metadata.originalPath, 0o644);
162
+ this.logger.info(`File restored from quarantine: ${metadata.originalPath}`);
163
+ return true;
164
+ }
165
+ catch (error) {
166
+ this.logger.error(`Failed to restore from quarantine: ${quarantinePath}`, { error });
167
+ return false;
168
+ }
169
+ }
170
+ async verifyFileIntegrity(filePath) {
171
+ try {
172
+ if (!await this.fileExists(filePath)) {
173
+ return false;
174
+ }
175
+ const lock = this.fileLocks.get(filePath);
176
+ if (lock && lock.locked) {
177
+ if (lock.pid !== process.pid) {
178
+ this.logger.warning(`File locked by different process: ${filePath}`);
179
+ return false;
180
+ }
181
+ }
182
+ const stats = await fs.stat(filePath);
183
+ if ((stats.mode & 0o222) !== 0) {
184
+ this.logger.warning(`File is writable: ${filePath}`);
185
+ return false;
186
+ }
187
+ const currentHash = await this.calculateFileHash(filePath);
188
+ const storedHash = await this.getStoredHash(filePath);
189
+ if (storedHash && currentHash !== storedHash) {
190
+ this.logger.warning(`File hash mismatch: ${filePath}`);
191
+ return false;
192
+ }
193
+ return true;
194
+ }
195
+ catch (error) {
196
+ this.logger.error(`Integrity check failed: ${filePath}`, { error });
197
+ return false;
198
+ }
199
+ }
200
+ async createBackup(filePath) {
201
+ const backupDir = path.join(process.cwd(), '.backups');
202
+ await fs.mkdir(backupDir, { recursive: true });
203
+ const backupName = `${path.basename(filePath)}.${Date.now()}.backup`;
204
+ const backupPath = path.join(backupDir, backupName);
205
+ await fs.copyFile(filePath, backupPath);
206
+ const hash = await this.calculateFileHash(filePath);
207
+ const hashPath = backupPath + '.hash';
208
+ await fs.writeFile(hashPath, hash);
209
+ return backupPath;
210
+ }
211
+ async restoreFromBackup(backupPath, targetPath) {
212
+ try {
213
+ const hashPath = backupPath + '.hash';
214
+ const storedHash = await fs.readFile(hashPath, 'utf8');
215
+ const currentHash = await this.calculateFileHash(backupPath);
216
+ if (currentHash !== storedHash) {
217
+ this.logger.error(`Backup integrity check failed: ${backupPath}`);
218
+ return false;
219
+ }
220
+ await fs.copyFile(backupPath, targetPath);
221
+ this.logger.info(`File restored from backup: ${targetPath}`);
222
+ return true;
223
+ }
224
+ catch (error) {
225
+ this.logger.error(`Failed to restore from backup: ${backupPath}`, { error });
226
+ return false;
227
+ }
228
+ }
229
+ async monitorFile(filePath) {
230
+ try {
231
+ const watcher = require('fs').watch(filePath, (eventType) => {
232
+ if (eventType === 'change') {
233
+ this.handleFileChange(filePath);
234
+ }
235
+ else if (eventType === 'rename') {
236
+ this.handleFileDelete(filePath);
237
+ }
238
+ });
239
+ this.logger.debug(`Monitoring file: ${filePath}`);
240
+ global.fileWatchers = global.fileWatchers || new Map();
241
+ global.fileWatchers.set(filePath, watcher);
242
+ }
243
+ catch (error) {
244
+ this.logger.error(`Failed to monitor file: ${filePath}`, { error });
245
+ }
246
+ }
247
+ async handleFileChange(filePath) {
248
+ this.logger.info(`File changed: ${filePath}`);
249
+ const isValid = await this.verifyFileIntegrity(filePath);
250
+ if (!isValid) {
251
+ this.logger.critical(`File integrity compromised: ${filePath}`);
252
+ await this.quarantineFile(filePath, 'integrity_violation');
253
+ const backups = await this.findBackups(filePath);
254
+ if (backups.length > 0) {
255
+ await this.restoreFromBackup(backups[0], filePath);
256
+ }
257
+ }
258
+ }
259
+ async handleFileDelete(filePath) {
260
+ this.logger.warning(`File deleted: ${filePath}`);
261
+ const backups = await this.findBackups(filePath);
262
+ if (backups.length > 0) {
263
+ await this.restoreFromBackup(backups[0], filePath);
264
+ this.logger.info(`File restored after deletion: ${filePath}`);
265
+ }
266
+ }
267
+ async checkFileIntegrity() {
268
+ for (const filePath of this.watchedFiles) {
269
+ if (!await this.verifyFileIntegrity(filePath)) {
270
+ this.logger.critical(`Integrity check failed for: ${filePath}`);
271
+ await this.quarantineFile(filePath, 'periodic_check_failed');
272
+ this.watchedFiles.delete(filePath);
273
+ }
274
+ }
275
+ }
276
+ async fileExists(filePath) {
277
+ try {
278
+ await fs.access(filePath);
279
+ return true;
280
+ }
281
+ catch {
282
+ return false;
283
+ }
284
+ }
285
+ async calculateFileHash(filePath) {
286
+ const content = await fs.readFile(filePath);
287
+ return crypto.createHash('sha512')
288
+ .update(content)
289
+ .digest('hex');
290
+ }
291
+ async getStoredHash(filePath) {
292
+ const hashFile = filePath + '.hash';
293
+ try {
294
+ return await fs.readFile(hashFile, 'utf8');
295
+ }
296
+ catch {
297
+ return null;
298
+ }
299
+ }
300
+ async findBackups(filePath) {
301
+ const backupDir = path.join(process.cwd(), '.backups');
302
+ const baseName = path.basename(filePath);
303
+ const pattern = new RegExp(`^${baseName}\\.[0-9]+\\.backup$`);
304
+ try {
305
+ const files = await fs.readdir(backupDir);
306
+ return files
307
+ .filter(f => pattern.test(f))
308
+ .map(f => path.join(backupDir, f))
309
+ .sort()
310
+ .reverse();
311
+ }
312
+ catch {
313
+ return [];
314
+ }
315
+ }
316
+ getLockedFiles() {
317
+ return Array.from(this.fileLocks.entries())
318
+ .filter(([_, lock]) => lock.pid === process.pid)
319
+ .map(([file]) => file);
320
+ }
321
+ getWatchedFiles() {
322
+ return Array.from(this.watchedFiles);
323
+ }
324
+ async getQuarantinedFiles() {
325
+ try {
326
+ const files = await fs.readdir(this.quarantineDir);
327
+ return files.filter(f => !f.endsWith('.meta'));
328
+ }
329
+ catch {
330
+ return [];
331
+ }
332
+ }
333
+ deactivate() {
334
+ this.isActive = false;
335
+ for (const [filePath, lock] of this.fileLocks) {
336
+ if (lock.pid === process.pid) {
337
+ this.unlockFile(filePath);
338
+ }
339
+ }
340
+ const watchers = global.fileWatchers;
341
+ if (watchers) {
342
+ for (const [_, watcher] of watchers) {
343
+ watcher.close();
344
+ }
345
+ }
346
+ }
347
+ getStatus() {
348
+ return {
349
+ isActive: this.isActive,
350
+ lockedFiles: this.fileLocks.size,
351
+ watchedFiles: this.watchedFiles.size,
352
+ quarantineDir: this.quarantineDir
353
+ };
354
+ }
355
+ }
356
+ exports.FileGuard = FileGuard;
357
+ //# sourceMappingURL=FileGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileGuard.js","sourceRoot":"","sources":["../../src/guards/FileGuard.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport { Logger } from '../utils/Logger';\n\nexport class FileGuard {\n private static instance: FileGuard;\n private readonly logger: Logger;\n private readonly fileLocks: Map<string, { locked: boolean; pid: number }>;\n private readonly filePermissions: Map<string, number>;\n private readonly watchedFiles: Set<string>;\n private readonly quarantineDir: string;\n private isActive: boolean = true;\n\n private constructor() {\n this.logger = Logger.getInstance();\n this.fileLocks = new Map();\n this.filePermissions = new Map();\n this.watchedFiles = new Set();\n this.quarantineDir = path.join(process.cwd(), '.quarantine');\n \n this.initializeQuarantine();\n this.startFileMonitoring();\n }\n\n public static getInstance(): FileGuard {\n if (!FileGuard.instance) {\n FileGuard.instance = new FileGuard();\n }\n return FileGuard.instance;\n }\n\n private async initializeQuarantine(): Promise<void> {\n try {\n await fs.mkdir(this.quarantineDir, { recursive: true, mode: 0o700 });\n } catch (error) {\n this.logger.error('Failed to create quarantine directory', { error });\n }\n }\n\n private startFileMonitoring(): void {\n setInterval(() => {\n this.checkFileIntegrity();\n }, 10000);\n }\n\n public async protectFile(filePath: string): Promise<boolean> {\n try {\n if (!await this.fileExists(filePath)) {\n this.logger.warning(`File not found: ${filePath}`);\n return false;\n }\n\n const stats = await fs.stat(filePath);\n \n this.filePermissions.set(filePath, stats.mode);\n \n await fs.chmod(filePath, 0o444);\n \n this.watchedFiles.add(filePath);\n \n await this.createBackup(filePath);\n \n await this.calculateFileHash(filePath);\n this.fileLocks.set(filePath, { locked: true, pid: process.pid });\n \n this.logger.info(`File protected: ${filePath}`);\n return true;\n \n } catch (error) {\n this.logger.error(`Failed to protect file: ${filePath}`, { error });\n return false;\n }\n }\n\n public async lockFile(filePath: string): Promise<boolean> {\n try {\n const lock = this.fileLocks.get(filePath);\n if (lock && lock.pid !== process.pid) {\n this.logger.warning(`File already locked by process ${lock.pid}: ${filePath}`);\n return false;\n }\n\n await fs.chmod(filePath, 0o444);\n \n this.fileLocks.set(filePath, { locked: true, pid: process.pid });\n \n this.logger.debug(`File locked: ${filePath}`);\n return true;\n \n } catch (error) {\n this.logger.error(`Failed to lock file: ${filePath}`, { error });\n return false;\n }\n }\n\n public async unlockFile(filePath: string): Promise<boolean> {\n try {\n const lock = this.fileLocks.get(filePath);\n if (lock && lock.pid !== process.pid) {\n this.logger.warning(`File locked by different process: ${filePath}`);\n return false;\n }\n\n const originalMode = this.filePermissions.get(filePath) || 0o644;\n await fs.chmod(filePath, originalMode);\n \n this.fileLocks.delete(filePath);\n \n this.logger.debug(`File unlocked: ${filePath}`);\n return true;\n \n } catch (error) {\n this.logger.error(`Failed to unlock file: ${filePath}`, { error });\n return false;\n }\n }\n\n public async quarantineFile(filePath: string, reason: string): Promise<string> {\n try {\n const quarantineName = `${path.basename(filePath)}.${Date.now()}.quarantine`;\n const quarantinePath = path.join(this.quarantineDir, quarantineName);\n \n await fs.copyFile(filePath, quarantinePath);\n \n await fs.chmod(quarantinePath, 0o400);\n \n const metadata = {\n originalPath: filePath,\n quarantinedAt: new Date().toISOString(),\n reason,\n pid: process.pid,\n hash: await this.calculateFileHash(filePath)\n };\n \n const metadataPath = quarantinePath + '.meta';\n await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2));\n \n this.logger.warning(`File quarantined: ${filePath} -> ${quarantinePath}`);\n \n return quarantinePath;\n \n } catch (error) {\n this.logger.error(`Failed to quarantine file: ${filePath}`, { error });\n throw error;\n }\n }\n\n public async restoreFromQuarantine(quarantinePath: string): Promise<boolean> {\n try {\n const metadataPath = quarantinePath + '.meta';\n const metadata = JSON.parse(await fs.readFile(metadataPath, 'utf8'));\n \n await fs.copyFile(quarantinePath, metadata.originalPath);\n \n await fs.chmod(metadata.originalPath, 0o644);\n \n this.logger.info(`File restored from quarantine: ${metadata.originalPath}`);\n return true;\n \n } catch (error) {\n this.logger.error(`Failed to restore from quarantine: ${quarantinePath}`, { error });\n return false;\n }\n }\n\n public async verifyFileIntegrity(filePath: string): Promise<boolean> {\n try {\n if (!await this.fileExists(filePath)) {\n return false;\n }\n\n const lock = this.fileLocks.get(filePath);\n if (lock && lock.locked) {\n if (lock.pid !== process.pid) {\n this.logger.warning(`File locked by different process: ${filePath}`);\n return false;\n }\n }\n\n const stats = await fs.stat(filePath);\n if ((stats.mode & 0o222) !== 0) {\n this.logger.warning(`File is writable: ${filePath}`);\n return false;\n }\n\n const currentHash = await this.calculateFileHash(filePath);\n const storedHash = await this.getStoredHash(filePath);\n \n if (storedHash && currentHash !== storedHash) {\n this.logger.warning(`File hash mismatch: ${filePath}`);\n return false;\n }\n\n return true;\n \n } catch (error) {\n this.logger.error(`Integrity check failed: ${filePath}`, { error });\n return false;\n }\n }\n\n public async createBackup(filePath: string): Promise<string> {\n const backupDir = path.join(process.cwd(), '.backups');\n await fs.mkdir(backupDir, { recursive: true });\n \n const backupName = `${path.basename(filePath)}.${Date.now()}.backup`;\n const backupPath = path.join(backupDir, backupName);\n \n await fs.copyFile(filePath, backupPath);\n \n const hash = await this.calculateFileHash(filePath);\n const hashPath = backupPath + '.hash';\n await fs.writeFile(hashPath, hash);\n \n return backupPath;\n }\n\n public async restoreFromBackup(backupPath: string, targetPath: string): Promise<boolean> {\n try {\n const hashPath = backupPath + '.hash';\n const storedHash = await fs.readFile(hashPath, 'utf8');\n const currentHash = await this.calculateFileHash(backupPath);\n \n if (currentHash !== storedHash) {\n this.logger.error(`Backup integrity check failed: ${backupPath}`);\n return false;\n }\n\n await fs.copyFile(backupPath, targetPath);\n \n this.logger.info(`File restored from backup: ${targetPath}`);\n return true;\n \n } catch (error) {\n this.logger.error(`Failed to restore from backup: ${backupPath}`, { error });\n return false;\n }\n }\n\n public async monitorFile(filePath: string): Promise<void> {\n try {\n const watcher = require('fs').watch(filePath, (eventType: string) => {\n if (eventType === 'change') {\n this.handleFileChange(filePath);\n } else if (eventType === 'rename') {\n this.handleFileDelete(filePath);\n }\n });\n \n this.logger.debug(`Monitoring file: ${filePath}`);\n \n (global as any).fileWatchers = (global as any).fileWatchers || new Map();\n (global as any).fileWatchers.set(filePath, watcher);\n \n } catch (error) {\n this.logger.error(`Failed to monitor file: ${filePath}`, { error });\n }\n }\n\n private async handleFileChange(filePath: string): Promise<void> {\n this.logger.info(`File changed: ${filePath}`);\n \n const isValid = await this.verifyFileIntegrity(filePath);\n \n if (!isValid) {\n this.logger.critical(`File integrity compromised: ${filePath}`);\n await this.quarantineFile(filePath, 'integrity_violation');\n \n const backups = await this.findBackups(filePath);\n if (backups.length > 0) {\n await this.restoreFromBackup(backups[0] as string, filePath);\n }\n }\n }\n\n private async handleFileDelete(filePath: string): Promise<void> {\n this.logger.warning(`File deleted: ${filePath}`);\n \n const backups = await this.findBackups(filePath);\n if (backups.length > 0) {\n await this.restoreFromBackup(backups[0] as string, filePath);\n this.logger.info(`File restored after deletion: ${filePath}`);\n }\n }\n\n private async checkFileIntegrity(): Promise<void> {\n for (const filePath of this.watchedFiles) {\n if (!await this.verifyFileIntegrity(filePath)) {\n this.logger.critical(`Integrity check failed for: ${filePath}`);\n \n await this.quarantineFile(filePath, 'periodic_check_failed');\n \n this.watchedFiles.delete(filePath);\n }\n }\n }\n\n private async fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n private async calculateFileHash(filePath: string): Promise<string> {\n const content = await fs.readFile(filePath);\n return crypto.createHash('sha512')\n .update(content)\n .digest('hex');\n }\n\n private async getStoredHash(filePath: string): Promise<string | null> {\n const hashFile = filePath + '.hash';\n try {\n return await fs.readFile(hashFile, 'utf8');\n } catch {\n return null;\n }\n }\n\n private async findBackups(filePath: string): Promise<string[]> {\n const backupDir = path.join(process.cwd(), '.backups');\n const baseName = path.basename(filePath);\n const pattern = new RegExp(`^${baseName}\\\\.[0-9]+\\\\.backup$`);\n \n try {\n const files = await fs.readdir(backupDir);\n return files\n .filter(f => pattern.test(f))\n .map(f => path.join(backupDir, f))\n .sort()\n .reverse();\n } catch {\n return [];\n }\n }\n\n public getLockedFiles(): string[] {\n return Array.from(this.fileLocks.entries())\n .filter(([_, lock]) => lock.pid === process.pid)\n .map(([file]) => file);\n }\n\n public getWatchedFiles(): string[] {\n return Array.from(this.watchedFiles);\n }\n\n public async getQuarantinedFiles(): Promise<string[]> {\n try {\n const files = await fs.readdir(this.quarantineDir);\n return files.filter(f => !f.endsWith('.meta'));\n } catch {\n return [];\n }\n }\n\n public deactivate(): void {\n this.isActive = false;\n \n for (const [filePath, lock] of this.fileLocks) {\n if (lock.pid === process.pid) {\n this.unlockFile(filePath);\n }\n }\n \n const watchers = (global as any).fileWatchers;\n if (watchers) {\n for (const [_, watcher] of watchers) {\n watcher.close();\n }\n }\n }\n\n public getStatus(): any {\n return {\n isActive: this.isActive,\n lockedFiles: this.fileLocks.size,\n watchedFiles: this.watchedFiles.size,\n quarantineDir: this.quarantineDir\n };\n }\n}"]}
@@ -0,0 +1,28 @@
1
+ export declare class MemoryGuard {
2
+ private static instance;
3
+ private readonly logger;
4
+ private readonly memorySnapshots;
5
+ private readonly secureHeap;
6
+ private isCompromised;
7
+ private readonly encryptionKey;
8
+ private constructor();
9
+ static getInstance(): MemoryGuard;
10
+ private initializeSecureHeap;
11
+ private lockMemory;
12
+ private startMemoryMonitoring;
13
+ takeMemorySnapshot(name: string): void;
14
+ private encryptSnapshot;
15
+ private checkMemoryIntegrity;
16
+ private checkHeapAnomalies;
17
+ private checkStackIntegrity;
18
+ private checkSecureHeap;
19
+ private checkForDebugger;
20
+ protectSensitiveData(data: Buffer): Buffer;
21
+ retrieveSensitiveData(id: Buffer): Buffer | null;
22
+ wipeSensitiveData(id: Buffer): void;
23
+ forceGarbageCollection(): void;
24
+ private calculateChecksum;
25
+ private terminateCompromised;
26
+ getStatus(): any;
27
+ }
28
+ //# sourceMappingURL=MemoryGuard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryGuard.d.ts","sourceRoot":"","sources":["../../src/guards/MemoryGuard.ts"],"names":[],"mappings":"AAIA,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IACjD,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,OAAO;WAUO,WAAW,IAAI,WAAW;IAOxC,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,qBAAqB;IAQtB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA4B7C,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,gBAAgB;IAejB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAc1C,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAqBhD,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAUnC,sBAAsB,IAAI,IAAI;IAOrC,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,oBAAoB;IAarB,SAAS,IAAI,GAAG;CAS1B"}