sunrise-cms/routes/login.js

87 lines
3.3 KiB
JavaScript

import { Router } from "express";
import * as configFunctions from "../helpers/functions.config.js";
import * as authenticationFunctions from "../helpers/functions.authentication.js";
import { useTestDatabases } from "../data/databasePaths.js";
import { getApiKey } from "../helpers/functions.api.js";
import Debug from "debug";
const debug = Debug("lot-occupancy-system:login");
export const router = Router();
router
.route("/")
.get((request, response) => {
const sessionCookieName = configFunctions.getProperty("session.cookieName");
if (request.session.user && request.cookies[sessionCookieName]) {
const redirectURL = authenticationFunctions.getSafeRedirectURL((request.query.redirect || ""));
response.redirect(redirectURL);
}
else {
response.render("login", {
userName: "",
message: "",
redirect: request.query.redirect,
useTestDatabases
});
}
})
.post(async (request, response) => {
const userName = (typeof request.body.userName === "string" ? request.body.userName : "");
const passwordPlain = (typeof request.body.password === "string" ? request.body.password : "");
const unsafeRedirectURL = request.body.redirect;
const redirectURL = authenticationFunctions.getSafeRedirectURL(typeof unsafeRedirectURL === "string" ? unsafeRedirectURL : "");
let isAuthenticated = false;
if (userName.charAt(0) === "*") {
if (useTestDatabases && userName === passwordPlain) {
isAuthenticated = configFunctions.getProperty("users.testing").includes(userName);
if (isAuthenticated) {
debug("Authenticated testing user: " + userName);
}
}
}
else if (userName !== "" && passwordPlain !== "") {
isAuthenticated = await authenticationFunctions.authenticate(userName, passwordPlain);
}
let userObject;
if (isAuthenticated) {
const userNameLowerCase = userName.toLowerCase();
const canLogin = configFunctions
.getProperty("users.canLogin")
.some((currentUserName) => {
return userNameLowerCase === currentUserName.toLowerCase();
});
if (canLogin) {
const canUpdate = configFunctions
.getProperty("users.canUpdate")
.some((currentUserName) => {
return userNameLowerCase === currentUserName.toLowerCase();
});
const isAdmin = configFunctions
.getProperty("users.isAdmin")
.some((currentUserName) => {
return userNameLowerCase === currentUserName.toLowerCase();
});
const apiKey = await getApiKey(userNameLowerCase);
userObject = {
userName: userNameLowerCase,
userProperties: {
canUpdate,
isAdmin,
apiKey
}
};
}
}
if (isAuthenticated && userObject) {
request.session.user = userObject;
response.redirect(redirectURL);
}
else {
response.render("login", {
userName,
message: "Login Failed",
redirect: redirectURL,
useTestDatabases
});
}
});
export default router;