A simple file sharing site with an easy to use API and online panel.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

74 lignes
2.5KB

  1. const ModelPath = '../models/';
  2. const Key = require(ModelPath + 'Key.js');
  3. const User = require(ModelPath + 'User.js');
  4. const fs = require('fs').promises;
  5. const wrap = require('./wrap.js');
  6. const verifyScope = require('./verifyScope.js');
  7. const checkSession = (req, scope, status) => {
  8. if (req.isAuthenticated()) {
  9. status.authenticated = true;
  10. if (!scope || verifyScope(req.session.passport.scope, scope)) {
  11. req.username = req.session.passport.user;
  12. req.displayname = req.session.passport.displayname;
  13. req.scope = req.session.passport.scope;
  14. req.key = null;
  15. status.permission = true;
  16. }
  17. }
  18. };
  19. const checkKey = async (req, scope, status) => {
  20. if (req.body.key) {
  21. const key = await Key.findOne({key: req.body.key});
  22. if (key) {
  23. status.authenticated = true;
  24. if (!scope || verifyScope(key.scope, scope)) {
  25. req.username = key.issuer;
  26. req.displayname = key.issuer;
  27. req.scope = key.scope;
  28. req.key = key.key;
  29. status.permission = true;
  30. }
  31. } else {
  32. // Log failure
  33. await fs.appendFile('auth.log', `${new Date().toISOString()} key ${req.connection.remoteAddress}\n`);
  34. }
  35. }
  36. };
  37. // Middleware that checks for authentication by either API key or session
  38. // sets req.username, req.displayname, req.scope, and req.key if authenticated properly,
  39. // otherwise throws an error code.
  40. // If the user is banned, also throw an error.
  41. const requireAuth = scope =>
  42. wrap(async (req, res, next) => {
  43. const status = {
  44. authenticated: false,
  45. permission: false
  46. };
  47. // First, check the session
  48. checkSession(req, scope, status);
  49. // If not authenticated yet, check for a key
  50. if (!status.authenticated)
  51. await checkKey(req, scope, status);
  52. if (!status.authenticated)
  53. return res.status(401).json({message: 'Unauthorized.'});
  54. else if (!status.permission)
  55. return res.status(403).json({message: 'Forbidden.'});
  56. // Check if the user is banned
  57. const user = await User.findOne({username: req.username});
  58. if(user && user.banned)
  59. return res.status(403).json({message: 'Forbidden.'});
  60. next();
  61. });
  62. module.exports.checkSession = checkSession;
  63. module.exports.checkKey = checkKey;
  64. module.exports.requireAuth = requireAuth;