"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
Object.defineProperty(exports, "RuntimeSecurity", {
    enumerable: true,
    get: function() {
        return RuntimeSecurity;
    }
});
const _security = require("./security");
let RuntimeSecurity = class RuntimeSecurity {
    /**
   * 应用 CSP
   * 
   * 注意：通过 meta 标签设置 CSP 不如 HTTP 头安全，建议在服务器端设置 CSP 头。
   * 此方法仅作为补充措施。
   */ static applyCSP(config) {
        if (typeof document === 'undefined') {
            return;
        }
        try {
            const cspHeader = _security.SecurityUtils.generateCSP(config);
            // 创建或更新 meta 标签
            let metaCSP = document.querySelector('meta[http-equiv="Content-Security-Policy"]');
            if (!metaCSP) {
                metaCSP = document.createElement('meta');
                metaCSP.setAttribute('http-equiv', 'Content-Security-Policy');
                // 插入到 head 的开头，确保优先级
                document.head.insertBefore(metaCSP, document.head.firstChild);
            }
            metaCSP.setAttribute('content', cspHeader);
            // 添加 CSP 违规报告（如果支持）
            if (typeof window !== 'undefined' && 'reporting' in window) {
                // 可以添加 CSP 违规监听器
                window.addEventListener('securitypolicyviolation', (event)=>{
                    console.warn('CSP 违规:', {
                        violatedDirective: event.violatedDirective,
                        blockedURI: event.blockedURI
                    });
                });
            }
        } catch (error) {
            console.error('应用 CSP 失败:', error);
        }
    }
    /**
   * 应用安全头（通过 meta 标签，实际应该由服务器设置）
   */ static applySecurityHeaders(config) {
        if (typeof document === 'undefined') {
            return;
        }
        // X-Frame-Options
        if (config.xFrameOptions) {
            let meta = document.querySelector('meta[http-equiv="X-Frame-Options"]');
            if (!meta) {
                meta = document.createElement('meta');
                meta.setAttribute('http-equiv', 'X-Frame-Options');
                document.head.appendChild(meta);
            }
            meta.setAttribute('content', config.xFrameOptions);
        }
        // X-Content-Type-Options
        if (config.xContentTypeOptions !== false) {
            let meta = document.querySelector('meta[http-equiv="X-Content-Type-Options"]');
            if (!meta) {
                meta = document.createElement('meta');
                meta.setAttribute('http-equiv', 'X-Content-Type-Options');
                document.head.appendChild(meta);
            }
            meta.setAttribute('content', 'nosniff');
        }
        // X-XSS-Protection
        if (config.xXSSProtection !== false) {
            let meta = document.querySelector('meta[http-equiv="X-XSS-Protection"]');
            if (!meta) {
                meta = document.createElement('meta');
                meta.setAttribute('http-equiv', 'X-XSS-Protection');
                document.head.appendChild(meta);
            }
            meta.setAttribute('content', '1; mode=block');
        }
        // Referrer-Policy
        if (config.referrerPolicy) {
            let meta = document.querySelector('meta[name="referrer"]');
            if (!meta) {
                meta = document.createElement('meta');
                meta.setAttribute('name', 'referrer');
                document.head.appendChild(meta);
            }
            meta.setAttribute('content', config.referrerPolicy);
        }
    }
    /**
   * 检查运行时安全
   */ static checkRuntimeSecurity() {
        const issues = [];
        if (typeof window === 'undefined') {
            return {
                safe: true,
                issues: []
            };
        }
        // 检查是否在 HTTPS 环境下
        if (window.location.protocol !== 'https:' && window.location.hostname !== 'localhost') {
            issues.push('应用未在 HTTPS 环境下运行');
        }
        // 检查是否有危险的全局对象
        if (window.eval) {
            issues.push('检测到危险的 eval 函数');
        }
        // 检查是否有危险的 innerHTML 使用
        // 这个检查需要在代码层面进行，这里只是示例
        return {
            safe: issues.length === 0,
            issues
        };
    }
    /**
   * 初始化运行时安全
   */ static initialize(options = {}) {
        const { enableCSP = false, enableSecurityHeaders = false, enableRuntimeChecks = false, csp, securityHeaders } = options;
        // 应用 CSP
        if (enableCSP && csp) {
            this.applyCSP(csp);
        }
        // 应用安全头
        if (enableSecurityHeaders && securityHeaders) {
            this.applySecurityHeaders(securityHeaders);
        }
        // 运行时检查
        if (enableRuntimeChecks) {
            const checkResult = this.checkRuntimeSecurity();
            if (!checkResult.safe) {
                console.warn('运行时安全检查发现问题:', checkResult.issues);
            }
        }
    }
    /**
   * 验证 URL 安全性
   */ static validateUrl(url) {
        return _security.SecurityUtils.isSafeUrl(url);
    }
    /**
   * 验证并清理用户输入
   */ static sanitizeUserInput(input) {
        return _security.SecurityUtils.validateInput(input);
    }
};

//# sourceMappingURL=runtimeSecurity.js.map