/opt/canhelp/apps/api/src/lib
NameSizeModeActions
activity.ts13240644editdlrm
apple-client-secret.ts40730644editdlrm
balance.ts35060644editdlrm
daily-limits.ts42820644editdlrm
email.ts527080644editdlrm
fomo.ts113660644editdlrm
google-oauth.ts105260644editdlrm
helper-capability.ts42070644editdlrm
messaging-rules.ts31230644editdlrm
nameUtils.ts7090644editdlrm
notif.ts189290644editdlrm
plan-history.ts10200644editdlrm
push.ts63860644editdlrm
referral.ts61100644editdlrm
telegram.ts62070644editdlrm
turnstile.ts7410644editdlrm
Edit: /opt/canhelp/apps/api/src/lib/turnstile.ts (741B)
const SECRET = process.env.TURNSTILE_SECRET_KEY ?? '' /** * Verifies a Cloudflare Turnstile token. * Returns true if valid (or if secret is not configured — dev mode). */ export async function verifyTurnstile(token: string | undefined, ip?: string): Promise { if (!SECRET) return true // skip in dev when key is not set if (!token) return false const body = new URLSearchParams({ secret: SECRET, response: token }) if (ip) body.set('remoteip', ip) try { const res = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', { method: 'POST', body, }) const data = (await res.json()) as { success: boolean } return data.success === true } catch { return false } }