A simple file sharing site with an easy to use API and online panel.
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

90 líneas
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;