import bcrypt from "bcrypt"; import { Op } from "sequelize"; import { User, ServerSettings, Permission, Syslog } from "../database/config.js"; export const Register = async function(req,res){ if (req.session.username) { res.redirect("/dashboard"); } let secret_input = ''; let user_registration = await ServerSettings.findOne({ where: { key: 'user_registration' }}); if (user_registration == null ) { user_registration = false; } else { user_registration = user_registration.value; } if (user_registration) { secret_input = `
`} // If there are no users, or registration has been enabled, display the registration page. if ((await User.count() == 0) || (user_registration)) { res.render("register",{ "error": "", "reg_secret": secret_input, }); } else { res.render("login", { "error": "User registration is disabled." }); } } export const submitRegister = async function(req,res){ const { name, username, password, confirm, secret } = req.body; let email = req.body.email.toLowerCase(); let registration_secret = await ServerSettings.findOne({ where: { key: 'registration_secret' }}).value; let error = ''; if (!name || !username || !email || !password || !confirm) { error = "All fields are required"; } else if (password !== confirm) { error = "Passwords do not match"; } else if (registration_secret && secret !== registration_secret) { error = "Invalid secret"; await Syslog.create({ username: user.username, uniqueID: email, event: "Failed Registration", message: "Invalid Secret", ip: req.socket.remoteAddress }); } else if (await User.findOne({ where: { [Op.or]: [{ username: username }, { email: email }] }})) { error = "Username or email already exists"; await Syslog.create({ username: username, uniqueID: email, event: "Failed Registration", message: "Username or email already exists", ip: req.socket.remoteAddress }); } if (error != '') { let secret_input = ''; let user_registration = await ServerSettings.findOne({ where: { key: 'user_registration' }}); if (user_registration == null ) { user_registration = false; } else { user_registration = user_registration.value; } if (user_registration) { secret_input = `
`} res.render("register", { "error": error, "reg_secret": secret_input, }); return; } // Returns 'admin' if no users have been created. async function Role() { if (await User.count() == 0) { return "admin"; } else { return "user"; } } // Create the user. await User.create({ name: name, username: username, email: email, password: bcrypt.hashSync(password, 10), role: await Role(), preferences: JSON.stringify({ language: "english", hidden_profile: false }), lastLogin: new Date().toLocaleString(), }); // Make sure the user was created and get the UUID. let user = await User.findOne({ where: { email: email }}); let match = await bcrypt.compare(password, user.password); if (match) { req.session.username = user.username; req.session.userID = user.userID; req.session.role = user.role; await Syslog.create({ username: user.username, uniqueID: user.email, event: "Registration", message: "User created", ip: req.socket.remoteAddress }); console.log(`User ${username} created`); res.redirect("/dashboard"); } else { await Syslog.create({ username: user.username, uniqueID: user.email, event: "Failed Registration", message: "Error. User not created", ip: req.socket.remoteAddress }); res.render("register", { "error": "Error. User not created" }); } }