diff --git a/src/models/User.ts b/src/models/User.ts index 2b4f43b9..e4586088 100644 --- a/src/models/User.ts +++ b/src/models/User.ts @@ -27,6 +27,8 @@ export interface User { mfa_enabled: boolean; // if multi factor authentication is enabled created_at: Date; // registration date verified: boolean; // if the user is offically verified + disabled: boolean; // if the account is disabled + deleted: boolean; // if the user was deleted email: string | null; // email of the user flags: bigint; // UserFlags public_flags: bigint; @@ -141,6 +143,8 @@ export const UserSchema = new Schema({ mfa_enabled: Boolean, created_at: Date, verified: Boolean, + disabled: Boolean, + deleted: Boolean, email: String, flags: { type: String, get: toBigInt }, // TODO: automatically convert Types.Long to BitField of UserFlags public_flags: { type: String, get: toBigInt }, diff --git a/src/util/checkToken.ts b/src/util/checkToken.ts index 80896de7..1a52b5b9 100644 --- a/src/util/checkToken.ts +++ b/src/util/checkToken.ts @@ -1,11 +1,18 @@ import { JWTOptions } from "./Constants"; import jwt from "jsonwebtoken"; +import { UserModel } from "../models"; export function checkToken(token: string, jwtSecret: string): Promise { return new Promise((res, rej) => { - jwt.verify(token, jwtSecret, JWTOptions, (err, decoded: any) => { + jwt.verify(token, jwtSecret, JWTOptions, async (err, decoded: any) => { if (err || !decoded) return rej("Invalid Token"); + const user = await UserModel.findOne({ id: decoded.id }, { "user_data.valid_tokens_since": true }).exec(); + if (!user) return rej("User not found"); + if (decoded.iat * 1000 < user.user_data.valid_tokens_since.getTime()) return rej("Invalid Token"); + if (user.disabled) return rej("User disabled"); + if (user.deleted) return rej("User not found"); + return res(decoded); }); });