UNPKG

alapa

Version:

A cutting-edge web development framework designed to revolutionize the way developers build modern web applications.

205 lines (204 loc) 7.41 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Auth = void 0; /* eslint-disable @typescript-eslint/no-explicit-any */ // import DatabaseConnection from "../../database/connections"; const globals_1 = require("../../shared/globals"); const crypto = __importStar(require("crypto")); const hashing_1 = require("../hashing"); const data_1 = require("../../data"); const utils_1 = require("../../utils"); const api_1 = require("../../api"); class Auth { static user = null; static async check(req) { const user = this.user; return user.id == req.session.userId; } static async apiBasicAuth(username, password) { const attempt = await this.attempt(username, password); if (attempt.success) { const jwt = await api_1.JWT.generateToken({ username, password, }); return { success: true, token: jwt.token, user: attempt.user, expiresAt: jwt.expiresAt, }; } return { success: false, error: { message: attempt.errorMessage, reasons: attempt.reason, }, }; } static async getUserFromDB(username) { const authModel = new globals_1.GlobalConfig.auth.authenticatableModel(); if (authModel instanceof data_1.AuthenticatableModel) { const user = await globals_1.GlobalConfig.auth.authenticatableModel .createQueryBuilder("user") .where("user.email = :username OR user.phoneNumber = :username OR user.id = :username OR user.username = :username", { username }) .getOne(); this.user = user; return user; } else { utils_1.Logger.error("Model is not Authenticatable"); } return null; } static async authenticate(user, req, res, rememberMe = false) { user = user || this.user; if (user) { this.user = user; } const loginToken = crypto.randomBytes(32).toString("hex"); const cookieExpires = new Date(Date.now() + 360 * 24 * 60 * 60 * 1000); // One year // Set session and user properties req.session.userId = user.id; req.session.loginToken = loginToken; // Set secure cookies if rememberMe is true if (rememberMe) { res.cookie("user", user.id, { expires: cookieExpires, httpOnly: true, secure: true, sameSite: "strict", }); res.cookie("token", hashing_1.HashPassword.encrypt(user.password), { expires: cookieExpires, httpOnly: true, secure: true, sameSite: "strict", }); } let afterLogin = ""; if (req.query.next) { afterLogin = req.query.next.toString(); } else { afterLogin = globals_1.GlobalConfig.auth.dashboardUrl || "/dashboard"; delete req.session.afterLogin; } return afterLogin; } static async withCookies(user, req, res) { user = user || this.user; const token = req.cookies["userToken"]; if (user && (await hashing_1.HashPassword.verify(token, user.password))) { const authenticate = await this.authenticate(user, req, res, true); if (authenticate !== false) { return { success: true, destination: authenticate, }; } } return { success: false, message: "Invalid Cookies", }; } static async attempt(username, password, ...when) { const user = await this.getUserFromDB(username); if (!user) { return { success: false, errorMessage: "User not found", user, }; } for (const fun of when) { const callback = await fun(user); if (callback.success === false) { return callback; } } if (!password) { return { success: false, errorMessage: "Please enter a valid password." }; } if (!(await hashing_1.HashPassword.verify(password, user.password))) { return { success: false, errorMessage: "Invalid username or password." }; } if (!user.isActive) { return { success: false, errorMessage: "Your account is disabled, please contact the admin.", }; } return { success: true, user: user }; } static login = async (user, req, res, rememberMe = false) => { const authenticate = await this.authenticate(user, req, res, rememberMe); if (authenticate !== false) { return { success: true, destination: authenticate, }; } return { success: false, }; }; static logout = (req, res, destroySession = true) => { return new Promise((resolve, reject) => { delete req.session.afterLogin; delete req.session.loginToken; delete req.session.userId; delete req.session.user; Auth.user = null; req.authenticated = false; req.user = null; res.clearCookie("user"); res.clearCookie("token"); if (destroySession) { req.session.destroy((err) => { if (err) { console.error("Failed to destroy session during logout", err); reject(false); } else { resolve(true); } }); } }); }; static get isAdmin() { // Logic to check if the authenticated user is an admin return Auth.user.username === "admin"; // Replace with actual admin check logic } static get userRole() { // Logic to get the authenticated user's role return "admin"; // Replace with actual role check logic } } exports.Auth = Auth;