fix bad http credentials causing a dos attack cause firefox is the best browser

This commit is contained in:
2026-08-22 22:00:02 -04:00
parent c301dc05ee
commit 72f27922a8

View File

@@ -12,6 +12,7 @@ var global_ws = null;
var container_count = 0; var container_count = 0;
var proxy_map = {}; var proxy_map = {};
var proxy_map_http_attempts = new Map();
var web_response_whitelist = ["main_frame", "xmlhttprequest"]; var web_response_whitelist = ["main_frame", "xmlhttprequest"];
@@ -201,6 +202,12 @@ function attach_ws_events(ws){
ws.addEventListener("open", async function(){ 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"); console.log("ws: connected");
await set_status(STATUS_CONNECTED); await set_status(STATUS_CONNECTED);
}); });
@@ -421,6 +428,15 @@ function attach_ws_events(ws){
break; break;
case "container_delete": 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; var deleted_containers = 0;
switch(typeof msg.id){ switch(typeof msg.id){
@@ -505,7 +521,6 @@ function attach_ws_events(ws){
ws.addEventListener("close", async function(e){ ws.addEventListener("close", async function(e){
console.log("ws: offline"); console.log("ws: offline");
webreq_completed = new Map();
await set_status(STATUS_OFFLINE); await set_status(STATUS_OFFLINE);
}); });
} }
@@ -604,6 +619,7 @@ browser.webRequest.onBeforeRequest.addListener(
resolve_func({success: false}); resolve_func({success: false});
webreq_completed.delete(details.requestId); webreq_completed.delete(details.requestId);
proxy_map_http_attempts.delete(details.requestId);
return; return;
} }
@@ -643,6 +659,7 @@ browser.webRequest.onBeforeRequest.addListener(
resolve_func({success: false}); resolve_func({success: false});
webreq_completed.delete(details.requestId); webreq_completed.delete(details.requestId);
proxy_map_http_attempts.delete(details.requestId);
} }
}, },
{ urls: ["<all_urls>"] }, { urls: ["<all_urls>"] },
@@ -690,6 +707,7 @@ browser.webRequest.onCompleted.addListener(
// clean up // clean up
webreq_completed.delete(details.requestId); webreq_completed.delete(details.requestId);
proxy_map_http_attempts.delete(details.requestId);
}, },
{ urls: ["<all_urls>"] } { urls: ["<all_urls>"] }
); );
@@ -703,9 +721,12 @@ browser.webRequest.onErrorOccurred.addListener(
if(!web_response_whitelist.includes(page.type)){ if(!web_response_whitelist.includes(page.type)){
webreq_completed.delete(page.requestId); webreq_completed.delete(page.requestId);
proxy_map_http_attempts.delete(page.requestId);
return; return;
} }
const proxy_config = proxy_map[page.cookieStoreId];
send_event( send_event(
global_ws, global_ws,
{ {
@@ -719,6 +740,7 @@ browser.webRequest.onErrorOccurred.addListener(
); );
webreq_completed.delete(page.requestId); webreq_completed.delete(page.requestId);
proxy_map_http_attempts.delete(page.requestId);
}, },
{ urls: ["<all_urls>"] } { urls: ["<all_urls>"] }
); );
@@ -728,8 +750,11 @@ browser.proxy.onRequest.addListener(function(request){
const proxy_config = proxy_map[request.cookieStoreId]; const proxy_config = proxy_map[request.cookieStoreId];
if( if(
proxy_config &&
(
proxy_config.type == "http" || proxy_config.type == "http" ||
proxy_config.type == "https" proxy_config.type == "https"
)
){ ){
return { return {
@@ -775,6 +800,31 @@ browser.webRequest.onAuthRequired.addListener(
proxy_config.password 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 { return {
authCredentials: { authCredentials: {
username: proxy_config.username, username: proxy_config.username,