diff options
| author | Adam Soltys <[email protected]> | 2026-03-17 01:21:48 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-03-17 01:34:28 -0700 |
| commit | 136ba2a12e87178f6d83fba2874abf4c9ad32915 (patch) | |
| tree | 347fe88201f1d708b0464b299f1ea56f2e86800d /routes | |
| parent | c21dbc2e6fb56c634351d83ddfc6fd73ce4a3de5 (diff) | |
| download | coinos-server-136ba2a12e87178f6d83fba2874abf4c9ad32915.tar.gz coinos-server-136ba2a12e87178f6d83fba2874abf4c9ad32915.zip | |
fix: add account ownership checks and harden PIN validation
- Validate account ownership (aid) before allowing ark send/sync/vault
operations and in debit/sendOnchain as defense-in-depth
- Harden PIN check to reject missing/empty pin when user has one set
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Diffstat (limited to 'routes')
| -rw-r--r-- | routes/payments.ts | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/routes/payments.ts b/routes/payments.ts index a41d187c..4648716f 100644 --- a/routes/payments.ts +++ b/routes/payments.ts @@ -1,7 +1,7 @@ import config from "$config"; import api from "$lib/api"; import { getArkAddress, sendArk, verifyArkVtxo } from "$lib/ark"; -import { requirePin } from "$lib/auth"; +import { requireAccountOwnership, requirePin } from "$lib/auth"; import { archive, db, g, gf, gfAll, s } from "$lib/db"; import { getTx } from "$lib/esplora"; import { generate } from "$lib/invoices"; @@ -854,6 +854,7 @@ export default { try { await requirePin({ body, user }); + await requireAccountOwnership(db, user.id, aid); l("ark send", user.username, address, amount); const tmpHash = v4(); @@ -915,6 +916,7 @@ export default { const body = await c.req.json(); const user = c.get("user"); const { hash, amount, aid } = body; + await requireAccountOwnership(db, user.id, aid); const { rate, currency } = await getUserRate(user); const p = await createArkPayment({ @@ -938,6 +940,7 @@ export default { const body = await c.req.json(); const user = c.get("user"); const { amount, hash, aid } = body; + await requireAccountOwnership(db, user.id, aid); if (amount <= 0) fail("Invalid amount"); await acquireArkLock(hash); @@ -1021,7 +1024,8 @@ export default { const body = await c.req.json(); const { transactions = [], aid } = body; const { id: uid } = user; - // verbose arkSync logging removed to reduce noise + + await requireAccountOwnership(db, uid, aid); const lockKey = `arksynclock:${aid}`; const gotLock = await db.set(lockKey, "1", { NX: true, EX: 30 }); |
