From 77ffda3e42b32dc163f87d18e3c47121da7b97cf Mon Sep 17 00:00:00 2001 From: Timo <6156589+Shik3i@users.noreply.github.com> Date: Sat, 25 Apr 2026 16:08:12 +0200 Subject: [PATCH] fix: address phase 1 audit findings (xss, cors, dead code) --- extension/background.js | 35 +++-------------------------------- server/index.js | 2 +- website/app.js | 32 +++++++++++++++++++++++++------- 3 files changed, 29 insertions(+), 40 deletions(-) diff --git a/extension/background.js b/extension/background.js index e616b5b..dfbef9e 100644 --- a/extension/background.js +++ b/extension/background.js @@ -8,7 +8,6 @@ let isConnecting = false; let peerId = null; // initialized via getPeerId() let currentRoom = null; let lastPeersJson = null; -let heartbeatInterval = null; let currentTabId = null; let currentTabTitle = null; // New: for Smart Matching let logs = []; @@ -101,17 +100,6 @@ let forceSyncAcks = new Set(); let forceSyncTimeout = null; // --- Storage Utils --- -function startHeartbeat() { - // Session heartbeats are now handled by the chrome.alarms 'keepAlive' listener - // to ensure they survive Service Worker suspension in MV3. -} - -function stopHeartbeat() { - if (heartbeatInterval) { - clearInterval(heartbeatInterval); - heartbeatInterval = null; - } -} async function getPeerId() { const data = await chrome.storage.local.get(['peerId']); @@ -426,8 +414,7 @@ function handleServerEvent(event, data) { addLog(`Joined Room: ${data.roomId}`, 'success'); chrome.runtime.sendMessage({ type: 'PEER_UPDATE', peers: data.peers }).catch(() => {}); - // Start background heartbeat - startHeartbeat(); + // Inform Website Bridge & Popup const joinStatusMsg = { type: 'JOIN_STATUS', success: true, message: 'Joined' }; @@ -656,23 +643,7 @@ chrome.alarms.onAlarm.addListener(async (alarm) => { } }); -setInterval(async () => { - await ensureState(); - // Calling a chrome API keeps the SW alive in MV3 (Chrome 110+) - chrome.storage.session.get('keepAlive', () => {}); - if (!socket || socket.readyState !== WebSocket.OPEN) { - connect(); - } else if (currentRoom) { - // Redundant heartbeat for active SW state - const settings = await getSettings(); - emit(EVENTS.PEER_STATUS, { - peerId, - status: 'heartbeat', - username: settings.username, - tabTitle: currentTabTitle - }); - } -}, 30000); // every 30s + // --- Extension Message Listeners --- chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { @@ -724,7 +695,7 @@ async function handleAsyncMessage(message, sender, sendResponse) { emit(EVENTS.LEAVE_ROOM, { peerId }); currentRoom = null; currentTabId = null; - stopHeartbeat(); + updateBadgeStatus(); isForceSyncInitiator = false; diff --git a/server/index.js b/server/index.js index 9cef0fd..26f9228 100644 --- a/server/index.js +++ b/server/index.js @@ -23,7 +23,7 @@ const httpServer = createServer(app); // Socket.IO setup with security constraints const io = new Server(httpServer, { cors: { - origin: "*", + origin: ["https://koalasync.shik3i.net"], methods: ["GET", "POST"] }, maxHttpBufferSize: 1024, // 1KB max per message diff --git a/website/app.js b/website/app.js index 0c52d66..2b96792 100644 --- a/website/app.js +++ b/website/app.js @@ -104,12 +104,26 @@ document.addEventListener('DOMContentLoaded', () => { const banner = document.createElement('div'); banner.className = 'invite-banner'; banner.id = 'koala-banner'; - banner.innerHTML = ` -