You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.6 KiB
81 lines
2.6 KiB
import { Request, Response } from "express" |
|
import User, { IUser } from "../../models/user"; |
|
import { randomBytes } from "crypto"; |
|
import moment = require("moment"); |
|
import LoginToken from "../../models/login_token"; |
|
import RequestError, { HttpStatusCode } from "../../helper/request_error"; |
|
import promiseMiddleware from "../../helper/promiseMiddleware"; |
|
|
|
const Login = promiseMiddleware(async (req: Request, res: Response) => { |
|
let type = req.query.type; |
|
if (type === "username") { |
|
let { username, uid } = req.query; |
|
let user = await User.findOne(username ? { username: username.toLowerCase() } : { uid: uid }); |
|
if (!user) { |
|
res.json({ error: req.__("User not found") }) |
|
} else { |
|
res.json({ salt: user.salt, uid: user.uid }); |
|
} |
|
return; |
|
} |
|
|
|
const sendToken = async (user: IUser) => { |
|
let token_str = randomBytes(16).toString("hex"); |
|
let token_exp = moment().add(6, "months").toDate() |
|
let token = LoginToken.new({ |
|
token: token_str, |
|
valid: true, |
|
validTill: token_exp, |
|
user: user._id |
|
}); |
|
await LoginToken.save(token); |
|
|
|
let special_str = randomBytes(24).toString("hex"); |
|
let special_exp = moment().add(30, "minutes").toDate() |
|
let special = LoginToken.new({ |
|
token: special_str, |
|
valid: true, |
|
validTill: special_exp, |
|
special: true, |
|
user: user._id |
|
}); |
|
await LoginToken.save(special); |
|
|
|
res.json({ |
|
login: { token: token_str, expires: token_exp.toUTCString() }, |
|
special: { token: special_str, expires: special_exp.toUTCString() } |
|
}); |
|
} |
|
|
|
if (type === "password" || type === "twofactor") { |
|
let { username, password, uid } = req.body; |
|
|
|
let user = await User.findOne(username ? { username: username.toLowerCase() } : { uid: uid }) |
|
if (!user) { |
|
res.json({ error: req.__("User not found") }) |
|
} else { |
|
if (user.password !== password) { |
|
res.json({ error: req.__("Password or username wrong") }) |
|
} else { |
|
if (type === "twofactor") { |
|
|
|
} else { |
|
if (user.twofactor && user.twofactor.length > 0) { |
|
let types = user.twofactor.map(f => { |
|
return { type: f.type }; |
|
}) |
|
res.json({ |
|
types: types |
|
}); |
|
} else { |
|
await sendToken(user); |
|
} |
|
} |
|
} |
|
} |
|
} else { |
|
throw new RequestError("Invalid type!", HttpStatusCode.BAD_REQUEST); |
|
} |
|
}); |
|
|
|
export default Login; |