A simple file sharing site with an easy to use API and online panel.
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

90 linhas
2.8KB

  1. const express = require('express');
  2. const router = express.Router();
  3. const crypto = require('crypto');
  4. const ModelPath = '../../models/';
  5. const Invite = require(ModelPath + 'Invite.js');
  6. const User = require(ModelPath + 'User.js');
  7. const authenticate = require('../../util/auth/authenticateRequest');
  8. const verifyBody = require('../../util/verifyBody');
  9. const createParams = [{name: 'scope', instance: Array}];
  10. router.post('/create', authenticate('invite.create'), verifyBody(createParams), async (req, res, next) => {
  11. // Make sure the user has all the request scope
  12. const inviteScope = req.body.scope;
  13. if (!inviteScope.every(s => req.scope.includes(s)))
  14. return res.status(403).json({message: 'Requested scope exceeds own scope.'});
  15. const invite = {
  16. code: crypto.randomBytes(12).toString('hex'),
  17. scope: inviteScope,
  18. issuer: req.username,
  19. issued: Date.now(),
  20. expires: req.body.expires
  21. };
  22. await Promise.all([
  23. Invite.create(invite).catch(next),
  24. User.updateOne({username: req.username}, {$inc: {inviteCount: 1}})
  25. ]);
  26. res.status(200).json({
  27. message: 'Invite created.',
  28. code: invite.code
  29. });
  30. });
  31. const deleteParams = [{name: 'code', type: 'string'}];
  32. router.post('/delete', authenticate('invite.delete'), verifyBody(deleteParams), async (req, res, next) => {
  33. let query = {code: req.body.code};
  34. // Users need a permission to delete invites other than their own
  35. if (!req.scope.includes('invite.delete.others'))
  36. query.issuer = req.username;
  37. // Find the invite
  38. const invite = await Invite.findOne(query).catch(next);
  39. if (!invite)
  40. return res.status(422).json({message: 'Invite not found.'});
  41. // Users need a permission to delete invites that have been used
  42. if (!req.scope.includes('invite.delete.used') && invite.used != null && invite.recipient != null)
  43. return res.status(403).json({message: 'Forbidden to delete used invites.'});
  44. await Invite.deleteOne({_id: invite._id}).catch(next);
  45. res.status(200).json({message: 'Invite deleted.'});
  46. });
  47. const getParams = [
  48. {name: 'code', type: 'string', optional: true},
  49. {name: 'issuer', type: 'string', optional: true}];
  50. router.get('/get', authenticate('invite.get'), verifyBody(getParams), async (req, res, next) => {
  51. let query = {};
  52. // Users need a permission to list invites other than their own
  53. if (!req.scope.includes('invite.get.others'))
  54. query.issuer = req.username;
  55. else if (req.body.issuer)
  56. query.issuer = req.body.issuer;
  57. // Narrow down the query by code if specified
  58. if (req.body.code)
  59. query.code = req.body.code;
  60. const invites = await Invite.find(query).catch(next);
  61. res.status(200).json(invites);
  62. });
  63. module.exports = router;