aboutsummaryrefslogtreecommitdiffstats
path: root/routes
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2025-10-10 10:35:21 -0700
committerAdam Soltys <[email protected]>2025-10-10 10:35:21 -0700
commitbc7a71360128539b6c5c42b5173fa8a2e4e9b9d6 (patch)
tree00cb5350495e5f908dcdea651cb1b4876afd652f /routes
parentba2cb303557429a110e0922c34b5d86b2dc51ba4 (diff)
downloadcoinos-server-bc7a71360128539b6c5c42b5173fa8a2e4e9b9d6.tar.gz
coinos-server-bc7a71360128539b6c5c42b5173fa8a2e4e9b9d6.zip
require challenge after login failures
Diffstat (limited to 'routes')
-rw-r--r--routes/users.ts16
1 files changed, 9 insertions, 7 deletions
diff --git a/routes/users.ts b/routes/users.ts
index bdce2cd5..ad2dd204 100644
--- a/routes/users.ts
+++ b/routes/users.ts
@@ -327,8 +327,13 @@ export default {
try {
let { challenge, username, password, token: twofa } = req.body;
- const verified = await db.exists(`challenge:${challenge}`);
- if (!verified) return res.code(401).send({});
+ const fk = `${username}:failures`;
+ const failures = await g(fk);
+
+ if (failures > 3) {
+ const verified = await db.exists(`challenge:${challenge}`);
+ if (!verified) return res.code(401).send({});
+ }
username = username.toLowerCase().replace(/\s/g, "");
let user = await getUser(username);
@@ -339,11 +344,8 @@ export default {
!user.password ||
!(await Bun.password.verify(password, user.password))
) {
- // warn("invalid username or password attempt", username);
- await appendFile(
- "failedlogins.txt",
- `${Date.now()} : ${username} : ${password}\n`,
- );
+ await db.incrBy(fk, 1);
+ setTimeout(() => db.decrBy(fk, 1), 120000);
return res.code(401).send({});
}