const fs = require('fs'); const vm = require('vm'); const path = require('path'); console.log("=== Running Vulnerability Reproduction Tests ==="); // Mock DOM const createMockElement = (id = 'mock') => { const el = { id, classList: { add: () => { }, remove: () => { }, contains: () => false }, _innerHTML: '', get innerHTML() { return this._innerHTML; }, set innerHTML(val) { this._innerHTML = val; // Check for XSS if (val.includes('')) { console.error(`❌ VULNERABILITY DETECTED in ${id}: XSS payload found in innerHTML!`); console.error(`Payload: ${val}`); process.exit(1); } }, _textContent: '', get textContent() { return this._textContent; }, set textContent(val) { this._textContent = val; }, value: '', style: { cssText: '', display: '' }, addEventListener: () => { }, removeEventListener: () => { }, appendChild: (child) => { }, removeChild: () => { }, querySelector: (sel) => createMockElement(sel), querySelectorAll: () => [createMockElement()], getAttribute: () => '', setAttribute: () => { }, remove: () => { }, dataset: {} }; return el; }; const sandbox = { console: console, document: { body: createMockElement('body'), createElement: (tag) => createMockElement(tag), getElementById: (id) => createMockElement(id), querySelector: (sel) => createMockElement(sel), }, localStorage: { getItem: () => null, setItem: () => { }, removeItem: () => { } }, fetch: () => Promise.reject(new Error('')), setTimeout: (cb) => cb(), setInterval: () => { }, requestAnimationFrame: (cb) => cb(), Date: Date, Notification: { permission: 'denied', requestPermission: () => { } }, window: { location: { href: '' } }, crypto: { randomUUID: () => '1234' } }; // Load utils.js (for escapeHtml if needed) const utilsCode = fs.readFileSync(path.join(__dirname, '../src/utils.js'), 'utf8') .replace(/export /g, '') .replace(/import .*? from .*?;/g, ''); // Load constants.js const constantsCode = fs.readFileSync(path.join(__dirname, '../src/constants.js'), 'utf8') .replace(/export /g, ''); // Load ui_helpers.js const uiHelpersCode = fs.readFileSync(path.join(__dirname, '../src/ui_helpers.js'), 'utf8') .replace(/export /g, '') .replace(/import .*? from .*?;/g, ''); // Load actions.js const actionsCode = fs.readFileSync(path.join(__dirname, '../src/actions.js'), 'utf8') .replace(/export /g, '') .replace(/import .*? from .*?;/g, ''); vm.createContext(sandbox); vm.runInContext(utilsCode, sandbox); vm.runInContext(constantsCode, sandbox); // Mock state vm.runInContext(` var authToken = 'mock-token'; var currentUser = 'mock-user'; var orderMap = new Map(); var userFlags = new Set(); var highlightTags = []; var allWeeks = []; var currentWeekNumber = 1; var currentYear = 2024; var displayMode = 'this-week'; var langMode = 'de'; `, sandbox); vm.runInContext(uiHelpersCode, sandbox); vm.runInContext(actionsCode, sandbox); async function runTests() { console.log("Testing openVersionMenu error handling..."); try { await sandbox.openVersionMenu(); } catch (e) {} console.log("Testing showToast..."); sandbox.showToast(''); console.log("Testing showErrorModal..."); sandbox.showErrorModal('', 'safe content', '', 'http://example.com'); console.log("Testing openVersionMenu version list rendering..."); // Mock successful fetch but with malicious data sandbox.fetch = () => Promise.resolve({ ok: true, json: () => Promise.resolve([ { tag: '', name: 'malicious', url: 'javascript:alert(1)', body: 'malicious body' } ]) }); await sandbox.openVersionMenu(); console.log("All tests finished (if you see this, no vulnerability was detected by the check)."); } runTests().catch(err => { console.error("Test execution failed:", err); process.exit(1); });