OpenAuth_server/src/api/middlewares/user.ts

74 lines
2.7 KiB
TypeScript
Raw Normal View History

2018-11-06 19:48:50 +00:00
import { NextFunction, Request, Response } from "express";
2019-03-13 01:06:09 +00:00
import LoginToken, { CheckToken } from "../../models/login_token";
2018-11-06 19:48:50 +00:00
import Logging from "@hibas123/nodelogging";
import RequestError, { HttpStatusCode } from "../../helper/request_error";
import User from "../../models/user";
import promiseMiddleware from "../../helper/promiseMiddleware";
class Invalid extends Error { }
/**
* Returns customized Middleware function, that could also be called directly
* by code and will return true or false depending on the token. In the false
* case it will also send error and redirect if json is not set
* @param json Checks if requests wants an json or html for returning errors
* @param redirect_uri Sets the uri to redirect, if json is not set and user not logged in
*/
2019-03-13 01:06:09 +00:00
export function GetUserMiddleware(json = false, special_required: boolean = false, redirect_uri?: string, validated = true) {
2018-11-06 19:48:50 +00:00
return promiseMiddleware(async function (req: Request, res: Response, next?: NextFunction) {
const invalid = () => {
throw new Invalid();
}
try {
let { login, special } = req.cookies
if (!login) invalid()
let token = await LoginToken.findOne({ token: login, valid: true })
2019-03-13 01:06:09 +00:00
if (!await CheckToken(token, validated)) invalid();
2018-11-06 19:48:50 +00:00
let user = await User.findById(token.user);
if (!user) {
token.valid = false;
await LoginToken.save(token);
invalid();
}
2019-03-13 01:06:09 +00:00
let special_token;
2018-11-06 19:48:50 +00:00
if (special) {
Logging.debug("Special found")
2019-03-13 01:06:09 +00:00
special_token = await LoginToken.findOne({ token: special, special: true, valid: true, user: token.user })
if (!await CheckToken(special_token, validated))
invalid();
req.special = true;
2018-11-06 19:48:50 +00:00
}
2019-03-13 01:06:09 +00:00
if (special_required && !req.special) invalid();
2018-11-06 19:48:50 +00:00
req.user = user
req.isAdmin = user.admin;
2019-03-13 01:06:09 +00:00
req.token = {
login: token,
special: special_token
}
2018-11-06 19:48:50 +00:00
if (next)
next()
return true;
} catch (e) {
if (e instanceof Invalid) {
if (req.method === "GET" && !json) {
res.status(HttpStatusCode.UNAUTHORIZED)
2019-03-13 01:06:09 +00:00
res.redirect("/login?base64=true&state=" + Buffer.from(redirect_uri ? redirect_uri : req.originalUrl).toString("base64"))
2018-11-06 19:48:50 +00:00
} else {
throw new RequestError(req.__("You are not logged in or your login is expired"), HttpStatusCode.UNAUTHORIZED)
}
} else {
if (next) next(e);
else throw e;
}
return false;
}
});
}
export const UserMiddleware = GetUserMiddleware();