incognitolm commited on
Commit ·
b312272
1
Parent(s): caef4d9
Update turnstile.js
Browse files- public/js/turnstile.js +58 -12
public/js/turnstile.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
| 1 |
// turnstile.js — show overlay and handle verification
|
| 2 |
(function() {
|
|
|
|
| 3 |
function hasTurnstileCookie() {
|
| 4 |
return document.cookie.split(';').some(c => c.trim().startsWith('turnstile='));
|
| 5 |
}
|
|
@@ -16,21 +17,66 @@
|
|
| 16 |
if (pageRoot) pageRoot.classList.add('page-faded');
|
| 17 |
}
|
| 18 |
|
| 19 |
-
//
|
| 20 |
-
|
| 21 |
-
try {
|
| 22 |
-
// Try REST verify first (sets cookie)
|
| 23 |
-
await fetch('/api/turnstile', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token }) });
|
| 24 |
-
} catch (e) {
|
| 25 |
-
console.error('Turnstile REST verify failed', e);
|
| 26 |
-
}
|
| 27 |
-
// Also notify server over websocket (if connected)
|
| 28 |
try {
|
| 29 |
-
|
| 30 |
} catch (e) { /* ignore */ }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
|
| 32 |
-
|
| 33 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
};
|
| 35 |
|
| 36 |
// Initialize visibility
|
|
|
|
| 1 |
// turnstile.js — show overlay and handle verification
|
| 2 |
(function() {
|
| 3 |
+
let handled = false;
|
| 4 |
function hasTurnstileCookie() {
|
| 5 |
return document.cookie.split(';').some(c => c.trim().startsWith('turnstile='));
|
| 6 |
}
|
|
|
|
| 17 |
if (pageRoot) pageRoot.classList.add('page-faded');
|
| 18 |
}
|
| 19 |
|
| 20 |
+
// Helper: set local cookie so reload won't re-show challenge
|
| 21 |
+
function setLocalTurnstileCookie() {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
try {
|
| 23 |
+
document.cookie = 'turnstile=1; path=/; max-age=' + (24 * 3600);
|
| 24 |
} catch (e) { /* ignore */ }
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
// Attempt websocket verify first, then fallback to REST if needed.
|
| 28 |
+
async function doWebsocketVerify(token) {
|
| 29 |
+
return new Promise(resolve => {
|
| 30 |
+
if (!window.ws || !window.ws.send || !window.ws.isConnected || !window.ws.on) return resolve(false);
|
| 31 |
+
// If websocket not connected, bail
|
| 32 |
+
if (!window.ws.isConnected()) return resolve(false);
|
| 33 |
+
|
| 34 |
+
let done = false;
|
| 35 |
+
const onOk = () => { if (done) return; done = true; try { unsub(); unsubErr(); } catch {} resolve(true); };
|
| 36 |
+
const onErr = () => { if (done) return; done = true; try { unsub(); unsubErr(); } catch {} resolve(false); };
|
| 37 |
+
|
| 38 |
+
// Listen for server ack
|
| 39 |
+
const unsub = window.ws.on('turnstile:ok', () => { onOk(); });
|
| 40 |
+
const unsubErr = window.ws.on('turnstile:error', () => { onErr(); });
|
| 41 |
+
|
| 42 |
+
// Send verify message
|
| 43 |
+
try { window.ws.send({ type: 'turnstile:verify', token }); }
|
| 44 |
+
catch (e) { unsub(); unsubErr(); resolve(false); }
|
| 45 |
+
|
| 46 |
+
// Fallback timeout
|
| 47 |
+
setTimeout(() => { if (!done) { try { unsub(); unsubErr(); } catch {} resolve(false); } }, 3500);
|
| 48 |
+
});
|
| 49 |
+
}
|
| 50 |
|
| 51 |
+
async function doRestVerify(token) {
|
| 52 |
+
try {
|
| 53 |
+
const r = await fetch('/api/turnstile', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token }) });
|
| 54 |
+
if (r.ok) return true;
|
| 55 |
+
} catch (e) { console.error('Turnstile REST verify failed', e); }
|
| 56 |
+
return false;
|
| 57 |
+
}
|
| 58 |
+
|
| 59 |
+
// Global callback for Cloudflare Turnstile — ensure single handling
|
| 60 |
+
window.onTurnstileSuccess = async function(token) {
|
| 61 |
+
if (!token || handled) return; handled = true;
|
| 62 |
+
|
| 63 |
+
// Prefer websocket verify for immediate session validation
|
| 64 |
+
let ok = await doWebsocketVerify(token);
|
| 65 |
+
if (ok) {
|
| 66 |
+
setLocalTurnstileCookie();
|
| 67 |
+
hideOverlay();
|
| 68 |
+
return;
|
| 69 |
+
}
|
| 70 |
+
|
| 71 |
+
// Fallback to REST verify (sets cookie server-side)
|
| 72 |
+
ok = await doRestVerify(token);
|
| 73 |
+
if (ok) setLocalTurnstileCookie();
|
| 74 |
+
if (ok) hideOverlay();
|
| 75 |
+
else {
|
| 76 |
+
// If both failed, allow retry by resetting handled after short delay
|
| 77 |
+
handled = false;
|
| 78 |
+
showOverlay();
|
| 79 |
+
}
|
| 80 |
};
|
| 81 |
|
| 82 |
// Initialize visibility
|