mirror of
https://gitgud.io/fatchan/haproxy-protection.git
synced 2025-05-09 02:05:37 +00:00
Add and improve auto background solve
This commit is contained in:
238
src/js/auto.js
238
src/js/auto.js
@ -1,98 +1,148 @@
|
|||||||
(() => {
|
if (!window._basedflareAuto) {
|
||||||
const doBotCheck = async () => {
|
|
||||||
try {
|
class BasedFlareAuto {
|
||||||
const json = await fetch("/.basedflare/bot-check", { headers: { "accept": "application/json" }})
|
|
||||||
.then(res => res.json());
|
constuctor(cookieMinLife=600, maxFails=3) {
|
||||||
if (json && json.ch) {
|
this.finished = false;
|
||||||
if (json.ca) {
|
this.workers = [];
|
||||||
// TODO: captcha popup
|
this.fails = 0;
|
||||||
} else {
|
this.cookieMinLife = cookieMinLife;
|
||||||
const [ userkey, challenge, _expiry, _signature ] = json.ch.split("#");
|
this.maxFails = maxFails;
|
||||||
const [ mode, diff, argon_time, argon_kb ] = json.pow.split("#");
|
this.timeout = null;
|
||||||
if (mode === "argon2") {
|
this.scriptSrc = "/.basedflare/js/argon2.min.js";
|
||||||
if (!window.argon2) {
|
this.checkCookie();
|
||||||
await new Promise((res) => {
|
}
|
||||||
const script = document.createElement("script");
|
|
||||||
script.onload = () => res();
|
checkCookie() {
|
||||||
script.src = "/.basedflare/js/argon2.min.js";
|
const powCookie = document.cookie
|
||||||
document.head.appendChild(script);
|
.split("; ")
|
||||||
})
|
.find((row) => row.startsWith("_basedflare_pow="));
|
||||||
}
|
if (powCookie) {
|
||||||
}
|
const powCookieValue = powCookie.split("=")[1];
|
||||||
console.log(json)
|
const expiry = powCookieValue.split("#")[2];
|
||||||
const diffString = "0".repeat(diff);
|
const remainingSecs = ((expiry*1000) - Date.now()) / 1000;
|
||||||
const cpuThreads = window.navigator.hardwareConcurrency;
|
console.log('Basedflare cookie check, valid for', remainingSecs, 'seconds');
|
||||||
const isTor = location.hostname.endsWith(".onion");
|
if (remainingSecs <= this.cookieMinLife) {
|
||||||
const workerThreads = (isTor || cpuThreads === 2) ? cpuThreads : Math.max(Math.ceil(cpuThreads / 2), cpuThreads - 1);
|
return this.doBotCheck();
|
||||||
const workers = [];
|
}
|
||||||
let finished = false;
|
this.timeout = setTimeout(this.checkCookie, Math.floor(((remainingSecs-this.cookieMinLife+(Math.random()*300))*1000)));
|
||||||
const messageHandler = (e) => {
|
}
|
||||||
if (e.data.length === 1) {
|
}
|
||||||
return console.log(e.data[0]);
|
|
||||||
}
|
includeScript(scriptSrc) {
|
||||||
if (finished) return;
|
return new Promise((res) => {
|
||||||
finished = true;
|
const script = document.createElement("script");
|
||||||
workers.forEach((w) => w.terminate());
|
script.onload = () => res();
|
||||||
const [_workerId, answer] = e.data;
|
script.src = scriptSrc;
|
||||||
fetch("/.basedflare/bot-check", {
|
document.head.appendChild(script);
|
||||||
method: "POST",
|
});
|
||||||
headers: {
|
}
|
||||||
"Content-Type": "application/x-www-form-urlencoded",
|
|
||||||
},
|
messageHandler(e, json) {
|
||||||
body: new URLSearchParams({
|
if (e.data.length === 1) { return; }
|
||||||
"pow_response": `${json.ch}#${answer}`,
|
if (this.finished) return;
|
||||||
}),
|
this.finished = true;
|
||||||
redirect: "manual",
|
this.workers.forEach((w) => w.terminate());
|
||||||
}).then((res) => {
|
const [_workerId, answer] = e.data;
|
||||||
if (res.status >= 400) {
|
fetch("/.basedflare/bot-check", {
|
||||||
console.error("basedflare post status >= 400", res);
|
method: "POST",
|
||||||
}
|
headers: {
|
||||||
}).catch((e) => {
|
"Content-Type": "application/x-www-form-urlencoded",
|
||||||
console.error(e)
|
},
|
||||||
});
|
body: new URLSearchParams({
|
||||||
};
|
"pow_response": `${json.ch}#${answer}`,
|
||||||
for (let i = 0; i < workerThreads; i++) {
|
}),
|
||||||
const powWorker = new Worker("/.basedflare/js/worker.min.js");
|
redirect: "manual",
|
||||||
powWorker.onmessage = messageHandler;
|
}).then((res) => {
|
||||||
workers.push(powWorker);
|
if (res.status >= 400) {
|
||||||
powWorker.postMessage([
|
this.fails++;
|
||||||
userkey,
|
console.error("basedflare post status >= 400", res);
|
||||||
challenge,
|
}
|
||||||
diff,
|
}).catch((e) => {
|
||||||
diffString,
|
console.error(e)
|
||||||
{
|
});
|
||||||
time: argon_time,
|
}
|
||||||
mem: argon_kb,
|
|
||||||
hashLen: 32,
|
checkRunning() {
|
||||||
parallelism: 1,
|
const lastCheckTime = localStorage.getItem('_basedflare-auto');
|
||||||
type: window.argon2 ? window.argon2.ArgonType.Argon2id : null,
|
if (lastCheckTime) {
|
||||||
mode: mode,
|
const lastCheckInt = parseInt(lastCheckTime);
|
||||||
},
|
if (Date.now() - lastCheckInt < 120) {
|
||||||
i,
|
return true;
|
||||||
workerThreads,
|
} //else its too old, we just continue
|
||||||
]);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async doProofOfWork(json) {
|
||||||
|
this.workers = [];
|
||||||
|
this.finished = true;
|
||||||
|
const [ userkey, challenge, _expiry, _signature ] = json.ch.split("#");
|
||||||
|
const [ mode, diff, argon_time, argon_kb ] = json.pow.split("#");
|
||||||
|
if (mode === "argon2") {
|
||||||
|
if (!window.argon2) {
|
||||||
|
await this.includeScript(this.scriptSrc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch(e) {
|
const diffString = "0".repeat(diff);
|
||||||
console.error(e);
|
const cpuThreads = window.navigator.hardwareConcurrency;
|
||||||
}
|
const isTor = location.hostname.endsWith(".onion");
|
||||||
};
|
const workerThreads = (isTor || cpuThreads === 2) ? cpuThreads : Math.max(Math.ceil(cpuThreads / 2), cpuThreads - 1);
|
||||||
const cookieMinLife = 600;
|
for (let i = 0; i < workerThreads; i++) {
|
||||||
const checkCookie = () => {
|
const powWorker = new Worker("/.basedflare/js/worker.min.js");
|
||||||
const powCookie = document.cookie
|
powWorker.onmessage = (e) => this.messageHandler(e, json);
|
||||||
.split("; ")
|
this.workers.push(powWorker);
|
||||||
.find((row) => row.startsWith("_basedflare_pow="));
|
powWorker.postMessage([
|
||||||
if (powCookie) {
|
userkey,
|
||||||
powCookieValue = powCookie.split("=")[1];
|
challenge,
|
||||||
const expiry = powCookieValue.split("#")[2];
|
diff,
|
||||||
const remainingSecs = ((expiry*1000) - Date.now()) / 1000;
|
diffString,
|
||||||
console.log('Basedflare cookie check, valid for', remainingSecs, 'seconds');
|
{
|
||||||
if (remainingSecs < cookieMinLife) {
|
time: argon_time,
|
||||||
return doBotCheck();
|
mem: argon_kb,
|
||||||
|
hashLen: 32,
|
||||||
|
parallelism: 1,
|
||||||
|
type: window.argon2 ? window.argon2.ArgonType.Argon2id : null,
|
||||||
|
mode: mode,
|
||||||
|
},
|
||||||
|
i,
|
||||||
|
workerThreads,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
setTimeout(checkCookie, Math.floor(((remainingSecs-cookieMinLife-(Math.random()*300))*1000)));
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
checkCookie();
|
async doBotCheck() {
|
||||||
})();
|
try {
|
||||||
|
if (this.checkRunning()) { return; }
|
||||||
|
localStorage.setItem('_basedflare-auto', Date.now());
|
||||||
|
const json = await fetch("/.basedflare/bot-check", {
|
||||||
|
headers: {
|
||||||
|
"accept": "application/json"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then(res => res.json());
|
||||||
|
if (!json || !json.ch) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log('Basedflare challenge successfully fetched', json);
|
||||||
|
if (json.ca) {
|
||||||
|
// TODO: doCaptchaPopup();
|
||||||
|
console.warn('Basedflare auto captcha not yet supported');
|
||||||
|
} else {
|
||||||
|
this.doProofOfWork(json);
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
console.error(e);
|
||||||
|
this.fails++;
|
||||||
|
} finally {
|
||||||
|
localStorage.removeItem('_basedflare-auto');
|
||||||
|
if (this.fails < this.maxFails) {
|
||||||
|
this.timeout = setTimeout(this.checkCookie, 5000*this.fails);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
window._basedflareAuto = new BasedFlareAuto();
|
||||||
|
|
||||||
|
}
|
||||||
|
2
src/js/auto.min.js
vendored
2
src/js/auto.min.js
vendored
@ -1 +1 @@
|
|||||||
(()=>{const doBotCheck=async()=>{try{const json=await fetch("/.basedflare/bot-check",{headers:{"accept":"application/json"}}).then(res=>res.json());if(json&&json.ch){if(json.ca){}else{const[userkey,challenge,_expiry,_signature]=json.ch.split("#");const[mode,diff,argon_time,argon_kb]=json.pow.split("#");if(mode==="argon2"){if(!window.argon2){await new Promise((res)=>{const script=document.createElement("script");script.onload=()=>res();script.src="/.basedflare/js/argon2.min.js";document.head.appendChild(script)})}}console.log(json);const diffString="0".repeat(diff);const cpuThreads=window.navigator.hardwareConcurrency;const isTor=location.hostname.endsWith(".onion");const workerThreads=(isTor||cpuThreads===2)?cpuThreads:Math.max(Math.ceil(cpuThreads/2),cpuThreads-1);const workers=[];let finished=false;const messageHandler=(e)=>{if(e.data.length===1){return console.log(e.data[0])}if(finished){return}finished=true;workers.forEach((w)=>w.terminate());const[_workerId,answer]=e.data;fetch("/.basedflare/bot-check",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({"pow_response":`${json.ch }#${ answer }`}),redirect:"manual"}).then((res)=>{if(res.status>=400){console.error("basedflare post status >= 400",res)}}).catch((e)=>{console.error(e)})};for(let i=0;i<workerThreads;i+=1){const powWorker=new Worker("/.basedflare/js/worker.min.js");powWorker.onmessage=messageHandler;workers.push(powWorker);powWorker.postMessage([userkey,challenge,diff,diffString,{time:argon_time,mem:argon_kb,hashLen:32,parallelism:1,type:window.argon2?window.argon2.ArgonType.Argon2id:null,mode:mode},i,workerThreads])}}}}catch(e){console.error(e)}};const cookieMinLife=600;const checkCookie=()=>{const powCookie=document.cookie.split("; ").find((row)=>row.startsWith("_basedflare_pow="));if(powCookie){powCookieValue=powCookie.split("=")[1];const expiry=powCookieValue.split("#")[2];const remainingSecs=((expiry*1000)-Date.now())/1000;console.log('Basedflare cookie check, valid for',remainingSecs,'seconds');if(remainingSecs<cookieMinLife){return doBotCheck()}setTimeout(checkCookie,Math.floor(((remainingSecs-cookieMinLife-(Math.random()*300))*1000)))}};checkCookie()})();
|
if(!window._basedflareAuto){class BasedFlareAuto{constuctor(cookieMinLife=600,maxFails=3){this.finished=false;this.workers=[];this.fails=0;this.cookieMinLife=cookieMinLife;this.maxFails=maxFails;this.timeout=null;this.scriptSrc="/.basedflare/js/argon2.min.js";this.checkCookie()}checkCookie(){const powCookie=document.cookie.split("; ").find((row)=>row.startsWith("_basedflare_pow="));if(powCookie){const powCookieValue=powCookie.split("=")[1];const expiry=powCookieValue.split("#")[2];const remainingSecs=((expiry*1000)-Date.now())/1000;console.log('Basedflare cookie check, valid for',remainingSecs,'seconds');if(remainingSecs<=this.cookieMinLife){return this.doBotCheck()}this.timeout=setTimeout(this.checkCookie,Math.floor(((remainingSecs-this.cookieMinLife+(Math.random()*300))*1000)))}}includeScript(scriptSrc){return new Promise((res)=>{const script=document.createElement("script");script.onload=()=>res();script.src=scriptSrc;document.head.appendChild(script)})}messageHandler(e,json){if(e.data.length===1){return}if(this.finished){return}this.finished=true;this.workers.forEach((w)=>w.terminate());const[_workerId,answer]=e.data;fetch("/.basedflare/bot-check",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({"pow_response":`${json.ch }#${ answer }`}),redirect:"manual"}).then((res)=>{if(res.status>=400){this.fails+=1;console.error("basedflare post status >= 400",res)}}).catch((e)=>{console.error(e)})}checkRunning(){const lastCheckTime=localStorage.getItem('_basedflare-auto');if(lastCheckTime){const lastCheckInt=parseInt(lastCheckTime);if(Date.now()-lastCheckInt<120){return true}}}async doProofOfWork(json){this.workers=[];this.finished=true;const[userkey,challenge,_expiry,_signature]=json.ch.split("#");const[mode,diff,argon_time,argon_kb]=json.pow.split("#");if(mode==="argon2"){if(!window.argon2){await this.includeScript(this.scriptSrc)}}const diffString="0".repeat(diff);const cpuThreads=window.navigator.hardwareConcurrency;const isTor=location.hostname.endsWith(".onion");const workerThreads=(isTor||cpuThreads===2)?cpuThreads:Math.max(Math.ceil(cpuThreads/2),cpuThreads-1);for(let i=0;i<workerThreads;i+=1){const powWorker=new Worker("/.basedflare/js/worker.min.js");powWorker.onmessage=(e)=>this.messageHandler(e,json);this.workers.push(powWorker);powWorker.postMessage([userkey,challenge,diff,diffString,{time:argon_time,mem:argon_kb,hashLen:32,parallelism:1,type:window.argon2?window.argon2.ArgonType.Argon2id:null,mode:mode},i,workerThreads])}}async doBotCheck(){try{if(this.checkRunning()){return}localStorage.setItem('_basedflare-auto',Date.now());const json=await fetch("/.basedflare/bot-check",{headers:{"accept":"application/json"}}).then(res=>res.json());if(!json||!json.ch){return}console.log('Basedflare challenge successfully fetched',json);if(json.ca){console.warn('Basedflare auto captcha not yet supported')}else{this.doProofOfWork(json)}}catch(e){console.error(e);this.fails+=1}finally{localStorage.removeItem('_basedflare-auto');if(this.fails<this.maxFails){this.timeout=setTimeout(this.checkCookie,5000*this.fails)}}}}window._basedflareAuto=new BasedFlareAuto()}
|
||||||
|
@ -91,7 +91,7 @@ function postResponse(powResponse, captchaResponse) {
|
|||||||
} else if (s >= 500) {
|
} else if (s >= 500) {
|
||||||
return insertError("Server encountered an error.");
|
return insertError("Server encountered an error.");
|
||||||
}
|
}
|
||||||
window.localStorage.setItem("basedflare-redirect", Math.random());
|
window.localStorage.setItem("_basedflare-redirect", Math.random());
|
||||||
finishRedirect();
|
finishRedirect();
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
insertError("Failed to send request to server.");
|
insertError("Failed to send request to server.");
|
||||||
@ -114,7 +114,7 @@ const powFinished = new Promise((resolve) => {
|
|||||||
workers.forEach((w) => w.terminate());
|
workers.forEach((w) => w.terminate());
|
||||||
};
|
};
|
||||||
const submitPow = (answer) => {
|
const submitPow = (answer) => {
|
||||||
window.localStorage.setItem("basedflare-pow-response", answer);
|
window.localStorage.setItem("_basedflare-pow-response", answer);
|
||||||
stopPow();
|
stopPow();
|
||||||
const dummyTime = 3500 - (Date.now() - start);
|
const dummyTime = 3500 - (Date.now() - start);
|
||||||
window.setTimeout(() => {
|
window.setTimeout(() => {
|
||||||
@ -135,14 +135,14 @@ const powFinished = new Promise((resolve) => {
|
|||||||
} =
|
} =
|
||||||
document.querySelector("[data-pow]").dataset;
|
document.querySelector("[data-pow]").dataset;
|
||||||
window.addEventListener("storage", (event) => {
|
window.addEventListener("storage", (event) => {
|
||||||
if (event.key === "basedflare-pow-response" && !finished) {
|
if (event.key === "_basedflare-pow-response" && !finished) {
|
||||||
console.log("Got answer", event.newValue, "from storage event");
|
console.log("Got answer", event.newValue, "from storage event");
|
||||||
stopPow();
|
stopPow();
|
||||||
resolve({
|
resolve({
|
||||||
answer: event.newValue,
|
answer: event.newValue,
|
||||||
localStorage: true
|
localStorage: true
|
||||||
});
|
});
|
||||||
} else if (event.key === "basedflare-redirect") {
|
} else if (event.key === "_basedflare-redirect") {
|
||||||
console.log("Redirecting, solved in another tab");
|
console.log("Redirecting, solved in another tab");
|
||||||
finishRedirect();
|
finishRedirect();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user