import cookie from "cookie"; import * as jwt from "jsonwebtoken"; import { Action } from "routing-controllers"; import { getConnectionManager } from 'typeorm'; import { config } from './config'; import { IllegalJWTError, NoPermissionError, UserNonexistantOrRefreshtokenInvalidError } from './errors/AuthError'; import { JwtCreator, JwtUser } from './JwtCreator'; import { User } from './models/entities/User'; const authchecker = async (action: Action, permissions: string[] | string) => { let required_permissions = undefined; if (typeof permissions === "string") { required_permissions = [permissions] } else { required_permissions = permissions } let provided_token = "" + action.request.headers["authorization"]; try { provided_token = provided_token.replace("Bearer ", ""); } catch { } let jwtPayload = undefined try { jwtPayload = jwt.verify(provided_token, config.jwt_secret); jwtPayload = jwtPayload["userdetails"]; } catch (error) { jwtPayload = await refresh(action); } const user = await getConnectionManager().get().getRepository(User).findOne({ id: jwtPayload["id"], refreshTokenCount: jwtPayload["refreshTokenCount"] }, { relations: ['permissions'] }) if (!user) { throw new UserNonexistantOrRefreshtokenInvalidError() } if (!jwtPayload["permissions"]) { throw new NoPermissionError(); } action.response.local = {} action.response.local.jwtPayload = jwtPayload; for (let required_permission of required_permissions) { if (!(jwtPayload["permissions"].includes(required_permission))) { return false; } } return true; } const refresh = async (action: Action) => { let refresh_token = undefined; try { cookie.parse(action.request.headers["cookie"])["lfk_backend__refresh_token"]; } catch { throw new IllegalJWTError(); } let jwtPayload = undefined; try { jwtPayload = jwt.verify(refresh_token, config.jwt_secret); } catch (error) { throw new IllegalJWTError(); } const user = await getConnectionManager().get().getRepository(User).findOne({ id: jwtPayload["id"], refreshTokenCount: jwtPayload["refreshTokenCount"] }, { relations: ['permissions'] }) if (!user) { throw new UserNonexistantOrRefreshtokenInvalidError() } let newAccess = JwtCreator.createAccess(user); action.response.header("authorization", "Bearer " + newAccess); return await new JwtUser(user); } export default authchecker