From 72f27922a8cdcfaae24531db5db2cd6f17470a02 Mon Sep 17 00:00:00 2001 From: lolcat Date: Sat, 22 Aug 2026 22:00:02 -0400 Subject: [PATCH] fix bad http credentials causing a dos attack cause firefox is the best browser --- ext/bg.js | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/ext/bg.js b/ext/bg.js index f9d7942..5b305a3 100644 --- a/ext/bg.js +++ b/ext/bg.js @@ -12,6 +12,7 @@ var global_ws = null; var container_count = 0; var proxy_map = {}; +var proxy_map_http_attempts = new Map(); var web_response_whitelist = ["main_frame", "xmlhttprequest"]; @@ -201,6 +202,12 @@ function attach_ws_events(ws){ ws.addEventListener("open", async function(){ + // clean up internal previous garbage + webreq_completed = new Map(); + proxy_map = {}; + proxy_map_http_attempts = new Map(); + web_response_whitelist = ["main_frame", "xmlhttprequest"]; + console.log("ws: connected"); await set_status(STATUS_CONNECTED); }); @@ -421,6 +428,15 @@ function attach_ws_events(ws){ break; case "container_delete": + // clear http proxy cache + try{ + + await browser.webRequest.handlerBehaviorChanged(); + }catch(err){ + + console.log("warn: http proxy cache flush failed: " + err); + } + var deleted_containers = 0; switch(typeof msg.id){ @@ -505,7 +521,6 @@ function attach_ws_events(ws){ ws.addEventListener("close", async function(e){ console.log("ws: offline"); - webreq_completed = new Map(); await set_status(STATUS_OFFLINE); }); } @@ -604,6 +619,7 @@ browser.webRequest.onBeforeRequest.addListener( resolve_func({success: false}); webreq_completed.delete(details.requestId); + proxy_map_http_attempts.delete(details.requestId); return; } @@ -643,6 +659,7 @@ browser.webRequest.onBeforeRequest.addListener( resolve_func({success: false}); webreq_completed.delete(details.requestId); + proxy_map_http_attempts.delete(details.requestId); } }, { urls: [""] }, @@ -690,6 +707,7 @@ browser.webRequest.onCompleted.addListener( // clean up webreq_completed.delete(details.requestId); + proxy_map_http_attempts.delete(details.requestId); }, { urls: [""] } ); @@ -703,9 +721,12 @@ browser.webRequest.onErrorOccurred.addListener( if(!web_response_whitelist.includes(page.type)){ webreq_completed.delete(page.requestId); + proxy_map_http_attempts.delete(page.requestId); return; } + const proxy_config = proxy_map[page.cookieStoreId]; + send_event( global_ws, { @@ -719,6 +740,7 @@ browser.webRequest.onErrorOccurred.addListener( ); webreq_completed.delete(page.requestId); + proxy_map_http_attempts.delete(page.requestId); }, { urls: [""] } ); @@ -728,8 +750,11 @@ browser.proxy.onRequest.addListener(function(request){ const proxy_config = proxy_map[request.cookieStoreId]; if( - proxy_config.type == "http" || - proxy_config.type == "https" + proxy_config && + ( + proxy_config.type == "http" || + proxy_config.type == "https" + ) ){ return { @@ -775,6 +800,31 @@ browser.webRequest.onAuthRequired.addListener( proxy_config.password ){ + // check if creds have been tried before... + var attempts = proxy_map_http_attempts.get(details.requestId); + + if(typeof attempts == "undefined"){ + + proxy_map_http_attempts.set(details.requestId, 1); + }else{ + + send_event( + global_ws, + { + "action": "dom_load_fail", + "data": { + id: details.tabId, + url: details.url, + error: "HTTP proxy refused the connection" + } + } + ); + + webreq_completed.delete(details.requestId); + proxy_map_http_attempts.delete(details.requestId); + return; + } + return { authCredentials: { username: proxy_config.username,