auth.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. const User = require('../database/UserModel');
  2. const bcrypt = require('bcrypt');
  3. exports.Login = function(req,res){
  4. // check whether we have a session
  5. if(req.session.user){
  6. // Redirect to log out.
  7. res.redirect("/logout");
  8. }else{
  9. // Render the login page.
  10. res.render("pages/login",{
  11. "error":"",
  12. "isLoggedIn": false
  13. });
  14. }
  15. }
  16. exports.processLogin = async function(req,res){
  17. // get the data.
  18. let email = req.body.email;
  19. let password = req.body.password;
  20. // check if we have data.
  21. if(email && password){
  22. // check if the user exists.
  23. let existingUser = await User.findOne({ where: {email:email}});
  24. if(existingUser){
  25. // compare the password.
  26. let match = await bcrypt.compare(password,existingUser.password);
  27. if(match){
  28. // set the session.
  29. req.session.user = existingUser.username;
  30. req.session.UUID = existingUser.UUID;
  31. req.session.role = existingUser.role;
  32. // Redirect to the home page.
  33. res.redirect("/");
  34. }else{
  35. // return an error.
  36. res.render("pages/login",{
  37. "error":"Invalid password",
  38. isLoggedIn: false
  39. });
  40. }
  41. }else{
  42. // return an error.
  43. res.render("pages/login",{
  44. "error":"User with that email does not exist.",
  45. isLoggedIn:false
  46. });
  47. }
  48. }else{
  49. res.status(400);
  50. res.render("pages/login",{
  51. "error":"Please fill in all the fields.",
  52. isLoggedIn:false
  53. });
  54. }
  55. }
  56. exports.Logout = function(req,res){
  57. // clear the session.
  58. req.session.destroy();
  59. // Redirect to the login page.
  60. res.redirect("/login");
  61. }
  62. exports.Register = function(req,res){
  63. // Check whether we have a session
  64. if(req.session.user){
  65. // Redirect to log out.
  66. res.redirect("/logout");
  67. } else {
  68. // Render the signup page.
  69. res.render("pages/register",{
  70. "error":"",
  71. isLoggedIn:false
  72. });
  73. }
  74. }
  75. exports.processRegister = async function(req,res){
  76. // Get the data.
  77. let { first_name, last_name, username, email, password, avatar, tos, secret } = req.body;
  78. let role = "user";
  79. // Check the data.
  80. if((first_name && last_name && email && password && username && tos) && (secret == process.env.SECRET)){
  81. // Check if there is an existing user with that username.
  82. let existingUser = await User.findOne({ where: {username:username}});
  83. let adminUser = await User.findOne({ where: {role:"admin"}});
  84. if(!existingUser){
  85. // hash the password.
  86. let hashedPassword = bcrypt.hashSync(password,10);
  87. if(!adminUser){
  88. console.log('Creating admin User');
  89. role = "admin";
  90. }
  91. try {
  92. const user = await User.create({
  93. first_name: first_name,
  94. last_name: last_name,
  95. username: username,
  96. email: email,
  97. password: hashedPassword,
  98. role: role,
  99. group: 'all',
  100. avatar: `<img src="./static/avatars/${avatar}">`
  101. });
  102. let newUser = await User.findOne({ where: {email:email}});
  103. let match = await bcrypt.compare(password,newUser.password);
  104. if(match){
  105. console.log(`User session created for ${newUser.username}`)
  106. req.session.user = newUser.username;
  107. req.session.UUID = newUser.UUID;
  108. req.session.role = newUser.role;
  109. }
  110. // Redirect to the home page.
  111. res.redirect("/");
  112. }
  113. catch (err) {
  114. // return an error.
  115. res.render("pages/register",{
  116. "error":"Something went wrong when creating account.",
  117. isLoggedIn:false
  118. });
  119. }
  120. }else{
  121. // return an error.
  122. res.render("pages/register",{
  123. "error":"User with that username already exists.",
  124. isLoggedIn:false
  125. });
  126. }
  127. }else{
  128. // Redirect to the signup page.
  129. res.render("pages/register",{
  130. "error":"Please fill in all the fields and accept TOS.",
  131. isLoggedIn:false
  132. });
  133. }
  134. }