register.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import bcrypt from 'bcrypt';
  2. import { User, Syslog, Permission, ServerSettings } from '../database/models.js';
  3. export const Register = async function (req,res) {
  4. // Redirect to dashboard if user is already logged in.
  5. if(req.session.user){ res.redirect("/dashboard"); return; }
  6. // Continue to registration page if no users have been created.
  7. let users = await User.count();
  8. if (users == 0) {
  9. const disable_passphrase = await ServerSettings.create({ key: 'registration', value: ''});
  10. res.render("register",{
  11. "error": "Creating admin account. Leave passphrase blank.",
  12. });
  13. } else {
  14. // Check if registration is enabled.
  15. let registration = await ServerSettings.findOne({ where: {key: 'registration'}});
  16. if (registration.value == 'off') {
  17. res.render("login",{
  18. "error":"User registration is disabled.",
  19. });
  20. } else {
  21. res.render("register",{
  22. "error":"",
  23. });
  24. }
  25. }
  26. }
  27. export const submitRegister = async function (req,res) {
  28. // Grab values from the form.
  29. let { name, username, email, password1, password2, passphrase } = req.body;
  30. // Convert the email to lowercase.
  31. email = email.toLowerCase();
  32. // Get the registration passphrase.
  33. let registration_passphrase = await ServerSettings.findOne({ where: { key: 'registration' }});
  34. registration_passphrase = registration_passphrase.value;
  35. // Create a log entry if the form is submitted with an invalid passphrase.
  36. if (passphrase != registration_passphrase) {
  37. const syslog = await Syslog.create({
  38. user: username,
  39. email: email,
  40. event: "Failed Registration",
  41. message: "Invalid secret",
  42. ip: req.socket.remoteAddress
  43. });
  44. res.render("register",{
  45. "error":"Invalid passphrase",
  46. });
  47. return;
  48. }
  49. // Check that all fields are filled out correctly.
  50. if ((!name || !username || !email || !password1 || !password2) || (password1 != password2)) {
  51. res.render("register",{
  52. "error":"Missing field or password mismatch.",
  53. });
  54. return;
  55. }
  56. // Make sure the username and email are unique.
  57. let existing_username = await User.findOne({ where: {username:username}});
  58. let existing_email = await User.findOne({ where: {email:email}});
  59. if (existing_username || existing_email) {
  60. res.render("register",{
  61. "error":"Username or email already exists.",
  62. });
  63. return;
  64. }
  65. // Make the user an admin and disable registration if there are no other users.
  66. async function userRole () {
  67. let userCount = await User.count();
  68. if (userCount == 0) {
  69. await ServerSettings.update({ value: 'off' }, { where: { key: 'registration' }});
  70. return "admin";
  71. } else {
  72. return "user";
  73. }
  74. }
  75. // Create the user.
  76. const user = await User.create({
  77. name: name,
  78. username: username,
  79. email: email,
  80. password: bcrypt.hashSync(password1,10),
  81. role: await userRole(),
  82. group: 'all',
  83. lastLogin: new Date().toLocaleString(),
  84. });
  85. // make sure the user was created and get the UUID.
  86. let newUser = await User.findOne({ where: { email: email }});
  87. let match = await bcrypt.compare( password1, newUser.password);
  88. if (match) {
  89. // Create the user session.
  90. req.session.username = newUser.username;
  91. req.session.userID = newUser.userID;
  92. req.session.role = newUser.role;
  93. // Create an entry in the permissions table.
  94. await Permission.create({ username: req.session.username, userID: req.session.userID });
  95. // Create a log entry.
  96. const syslog = await Syslog.create({
  97. user: req.session.username,
  98. email: email,
  99. event: "Successful Registration",
  100. message: "User registered successfully",
  101. ip: req.socket.remoteAddress
  102. });
  103. res.redirect("/dashboard");
  104. } else {
  105. // Create a log entry.
  106. const syslog = await Syslog.create({
  107. user: req.session.username,
  108. email: email,
  109. event: "Failed Registration",
  110. message: "User not created",
  111. ip: req.socket.remoteAddress
  112. });
  113. res.render("register",{
  114. "error":"User not created",
  115. });
  116. }
  117. }