shield-firewall
Version:
AI-Powered Client-Side Web Application Firewall - Zero-Knowledge, Predictive Security Protection
12 lines (10 loc) • 12 kB
JavaScript
/*! SHIELD.js v1.0.0 | MIT License | https://github.com/shield-js/shield */
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = typeof globalThis !== 'undefined' ? globalThis :
global || self, global.ShieldFirewall = factory());
})(this, (function () { 'use strict';
import logger from '../utils/logger.js';import storage from '../utils/storage.js';import crypto from '../utils/crypto.js';import patterns from '../utils/patterns.js';import BehaviorEngine from './core/behavior-engine.js';import DOMProtector from './core/dom-protector.js';import ThreatDetector from './core/threat-detector.js';import NetworkInterceptor from './core/network-interceptor.js';import RecoveryEngine from './core/recovery-engine.js';import ConfigManager from './core/config-manager.js';class ShieldFirewall{constructor(options ={}){this.config = null;this.behaviorEngine = null;this.domProtector = null;this.threatDetector = null;this.networkInterceptor = null;this.recoveryEngine = null;this.isInitialized = false;this.isActive = false;this.initializationPromise = null;this.performanceMetrics ={initializationTime: 0,threatsBlocked: 0,falsePositives: 0,recoveryCount: 0};this.options ={autoStart: true,debug: false,...options};this.handleThreatDetected = this.handleThreatDetected.bind(this);this.handleConfigChange = this.handleConfigChange.bind(this);}async initialize(config ={}){if(this.initializationPromise){return this.initializationPromise;}const startTime = performance.now();this.initializationPromise = this._initialize(config);try{const success = await this.initializationPromise;this.performanceMetrics.initializationTime = performance.now()- startTime;if(success && this.options.autoStart){await this.start();}return success;}catch(error){logger.error('SHIELD initialization failed',{error: error.message});return false;}}async _initialize(config){try{logger.info('Initializing SHIELD.js firewall...');this.config = new ConfigManager();await this.config.initialize();if(Object.keys(config).length > 0){await this.config.update(config);}await this.initializeComponents();this.setupEventListeners();await this.loadMetrics();this.isInitialized = true;logger.info('SHIELD.js firewall initialized successfully',{version: '1.0.0',protectionLevel: this.config.get('protectionLevel')});return true;}catch(error){logger.error('SHIELD initialization error',{error: error.message});return false;}}async initializeComponents(){const config = this.config.getConfig();if(config.features.behaviorLearning){this.behaviorEngine = new BehaviorEngine();await this.behaviorEngine.initialize();}if(config.features.threatDetection){this.threatDetector = new ThreatDetector();await this.threatDetector.initialize();}if(config.features.domProtection){this.domProtector = new DOMProtector(this.threatDetector);await this.domProtector.initialize();}if(config.features.networkInterception){this.networkInterceptor = new NetworkInterceptor(this.threatDetector);this.networkInterceptor.initialize();}if(config.features.autoRecovery){this.recoveryEngine = new RecoveryEngine(this.domProtector);await this.recoveryEngine.initialize();await this.recoveryEngine.loadRecoveryHistory();}}setupEventListeners(){document.addEventListener('shield:threat-detected',this.handleThreatDetected);this.config.addListener('*',this.handleConfigChange);document.addEventListener('shield:recovery',(event)=>{this.performanceMetrics.recoveryCount++;logger.info('Recovery event triggered',event.detail);});}handleThreatDetected(event){const{threatType,severity,details}= event.detail;this.performanceMetrics.threatsBlocked++;logger.threatDetected(threatType,{severity,details,timestamp: Date.now()});if(severity >= 8 && this.recoveryEngine && this.config.get('recovery.autoRecovery')){this.recoveryEngine.triggerAutoRecovery(threatType);}}handleConfigChange(path,value){logger.debug('Configuration changed',{path,value});if(path.startsWith('features.')){this.handleFeatureToggle(path,value);}else if(path.startsWith('threatDetection.')){this.updateThreatDetection(path,value);}else if(path.startsWith('network.')){this.updateNetworkConfig(path,value);}else if(path.startsWith('behavior.')){this.updateBehaviorConfig(path,value);}else if(path.startsWith('recovery.')){this.updateRecoveryConfig(path,value);}}handleFeatureToggle(path,enabled){const feature = path.split('.')[1];switch(feature){case 'behaviorLearning': if(enabled && !this.behaviorEngine){this.behaviorEngine = new BehaviorEngine();this.behaviorEngine.initialize();}else if(!enabled && this.behaviorEngine){this.behaviorEngine.destroy();this.behaviorEngine = null;}break;case 'domProtection': if(enabled && !this.domProtector){this.domProtector = new DOMProtector(this.threatDetector);this.domProtector.initialize();}else if(!enabled && this.domProtector){this.domProtector.destroy();this.domProtector = null;}break;case 'networkInterception': if(enabled && !this.networkInterceptor){this.networkInterceptor = new NetworkInterceptor(this.threatDetector);this.networkInterceptor.initialize();}else if(!enabled && this.networkInterceptor){this.networkInterceptor.destroy();this.networkInterceptor = null;}break;case 'autoRecovery': if(enabled && !this.recoveryEngine){this.recoveryEngine = new RecoveryEngine(this.domProtector);this.recoveryEngine.initialize();}else if(!enabled && this.recoveryEngine){this.recoveryEngine.destroy();this.recoveryEngine = null;}break;}}updateThreatDetection(path,value){if(this.threatDetector){const configKey = path.split('.')[1];this.threatDetector.configure({[configKey]: value});}}updateNetworkConfig(path,value){if(this.networkInterceptor){const configKey = path.split('.')[1];if(configKey === 'rateLimitMax' || configKey === 'rateLimitWindow'){const max = this.config.get('network.rateLimitMax');const window = this.config.get('network.rateLimitWindow');this.networkInterceptor.setRateLimit(max,window);}}}updateBehaviorConfig(path,value){if(this.behaviorEngine){const configKey = path.split('.')[1];this.behaviorEngine.configure({[configKey]: value});}}updateRecoveryConfig(path,value){if(this.recoveryEngine){const configKey = path.split('.')[1];this.recoveryEngine.configure({[configKey]: value});}}async start(){if(!this.isInitialized){logger.error('SHIELD must be initialized before starting');return false;}if(this.isActive){logger.warn('SHIELD is already active');return true;}try{logger.info('Starting SHIELD protection...');const promises = [];if(this.behaviorEngine){promises.push(this.behaviorEngine.start());}if(this.domProtector){promises.push(this.domProtector.start());}if(this.networkInterceptor){}if(this.recoveryEngine){}await Promise.allSettled(promises);this.isActive = true;logger.info('SHIELD protection started successfully');document.dispatchEvent(new CustomEvent('shield:started',{detail:{timestamp: Date.now()}}));return true;}catch(error){logger.error('Failed to start SHIELD protection',{error: error.message});return false;}}async stop(){if(!this.isActive){logger.warn('SHIELD is not active');return true;}try{logger.info('Stopping SHIELD protection...');const promises = [];if(this.behaviorEngine){promises.push(this.behaviorEngine.stop());}if(this.domProtector){promises.push(this.domProtector.stop());}await Promise.allSettled(promises);this.isActive = false;logger.info('SHIELD protection stopped');document.dispatchEvent(new CustomEvent('shield:stopped',{detail:{timestamp: Date.now()}}));return true;}catch(error){logger.error('Failed to stop SHIELD protection',{error: error.message});return false;}}getStatus(){return{initialized: this.isInitialized,active: this.isActive,version: '1.0.0',protectionLevel: this.config ? this.config.get('protectionLevel'): null,components:{behaviorEngine: !!this.behaviorEngine,domProtector: !!this.domProtector,threatDetector: !!this.threatDetector,networkInterceptor: !!this.networkInterceptor,recoveryEngine: !!this.recoveryEngine,configManager: !!this.config},performance: this.performanceMetrics};}getStats(){const stats ={shield: this.getStatus(),components:{}};if(this.behaviorEngine){stats.components.behaviorEngine = this.behaviorEngine.getStats();}if(this.domProtector){stats.components.domProtector = this.domProtector.getStats();}if(this.threatDetector){stats.components.threatDetector = this.threatDetector.getStats();}if(this.networkInterceptor){stats.components.networkInterceptor = this.networkInterceptor.getStats();}if(this.recoveryEngine){stats.components.recoveryEngine = this.recoveryEngine.getStats();}if(this.config){stats.components.configManager = this.config.getStats();}return stats;}async scan(){if(!this.isActive){throw new Error('SHIELD is not active');}logger.info('Manual threat scan initiated');const results ={timestamp: Date.now(),components:{}};const promises = [];if(this.domProtector){promises.push(this.domProtector.scan().then(result =>{results.components.dom = result;}));}if(this.threatDetector){promises.push(this.threatDetector.scan().then(result =>{results.components.threats = result;}));}if(this.behaviorEngine){promises.push(this.behaviorEngine.analyzeCurrentBehavior().then(result =>{results.components.behavior = result;}));}await Promise.allSettled(promises);logger.info('Manual threat scan completed',results);return results;}createSnapshot(reason = 'manual'){if(this.recoveryEngine){return this.recoveryEngine.createSnapshot(reason);}return null;}async restoreFromSnapshot(snapshotId,reason = 'manual'){if(this.recoveryEngine){return await this.recoveryEngine.restoreFromSnapshot(snapshotId,reason);}return false;}getSnapshots(){if(this.recoveryEngine){return this.recoveryEngine.getSnapshots();}return [];}async configure(config){if(!this.config){return false;}return await this.config.update(config);}getConfig(){if(!this.config){return null;}return this.config.getConfig();}async setProtectionLevel(level){if(!this.config){return false;}return await this.config.setProtectionLevel(level);}exportConfig(){if(!this.config){return null;}return this.config.export();}async importConfig(configJson){if(!this.config){return false;}return await this.config.import(configJson);}async reset(){try{logger.info('Resetting SHIELD...');await this.stop();await storage.clearAll();if(this.config){await this.config.reset();}this.destroyComponents();this.isInitialized = false;this.isActive = false;this.initializationPromise = null;this.performanceMetrics ={initializationTime: 0,threatsBlocked: 0,falsePositives: 0,recoveryCount: 0};logger.info('SHIELD reset completed');return true;}catch(error){logger.error('SHIELD reset failed',{error: error.message});return false;}}destroyComponents(){if(this.behaviorEngine){this.behaviorEngine.destroy();this.behaviorEngine = null;}if(this.domProtector){this.domProtector.destroy();this.domProtector = null;}if(this.threatDetector){this.threatDetector.destroy();this.threatDetector = null;}if(this.networkInterceptor){this.networkInterceptor.destroy();this.networkInterceptor = null;}if(this.recoveryEngine){this.recoveryEngine.destroy();this.recoveryEngine = null;}if(this.config){this.config.destroy();this.config = null;}}async loadMetrics(){try{const metrics = await storage.getPerformanceMetrics();if(metrics){this.performanceMetrics ={...this.performanceMetrics,...metrics};}}catch(error){logger.debug('Could not load performance metrics',{error: error.message});}}async saveMetrics(){try{await storage.savePerformanceMetrics(this.performanceMetrics);}catch(error){logger.debug('Could not save performance metrics',{error: error.message});}}async destroy(){try{await this.saveMetrics();await this.stop();document.removeEventListener('shield:threat-detected',this.handleThreatDetected);this.destroyComponents();logger.info('SHIELD destroyed');}catch(error){logger.error('Error during SHIELD destruction',{error: error.message});}}}const shield = new ShieldFirewall();export{ShieldFirewall};export default shield;
return ShieldFirewall;
}));