incognitolm commited on
Commit
b312272
·
1 Parent(s): caef4d9

Update turnstile.js

Browse files
Files changed (1) hide show
  1. 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
- // Global callback for Cloudflare Turnstile
20
- window.onTurnstileSuccess = async function(token) {
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
- if (window.ws?.send) window.ws.send({ type: 'turnstile:verify', token });
30
  } catch (e) { /* ignore */ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
 
32
- // Hide overlay
33
- hideOverlay();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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