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.

91 linhas
2.5KB

  1. const express = require('express');
  2. const router = express.Router();
  3. const config = require('config');
  4. const crypto = require('crypto');
  5. const ModelPath = '../../models/';
  6. const Key = require(ModelPath + 'Key.js');
  7. const verifyBody = require('../../util/verifyBody');
  8. const authenticate = require('../../util/auth/authenticateRequest');
  9. const createParams = [
  10. {name: 'identifier', type: 'string', sanitize: true},
  11. {name: 'scope', instance: Array}];
  12. router.post('/create', authenticate('key.create'), verifyBody(createParams), async (req, res) => {
  13. const keyCount = await Key.countDocuments({issuer: req.username});
  14. if (keyCount >= config.get('Key.limit'))
  15. return res.status(403).json({message: 'Key limit reached.'});
  16. // Make sure the user has all the request scope
  17. const keyScope = req.body.scope;
  18. if (!keyScope.every(s => req.scope.includes(s)))
  19. return res.status(403).json({message: 'Requested scope exceeds own scope.'});
  20. const key = {
  21. key: await crypto.randomBytes(32).toString('hex'),
  22. identifier: req.body.identifier,
  23. scope: keyScope,
  24. issuer: req.username,
  25. date: Date.now()
  26. };
  27. await Key.create(key);
  28. res.status(200).json({
  29. message: 'Key created.',
  30. key: key.key
  31. });
  32. });
  33. const getProps = [
  34. {name: 'identifier', type: 'string', optional: true},
  35. {name: 'issuer', type: 'string', optional: true}];
  36. router.get('/get', authenticate('key.get'), verifyBody(getProps), async (req, res) => {
  37. let query = {};
  38. if (req.body.identifier)
  39. query.identifier = req.body.identifier;
  40. if (!req.scope.includes('key.get.others'))
  41. query.issuer = req.username;
  42. else if (req.body.issuer)
  43. query.issuer = req.body.issuer;
  44. const keys = await Key.find(query);
  45. res.status(200).json(keys);
  46. });
  47. const deleteProps = [
  48. {name: 'keyid', type: 'string'},
  49. {name: 'issuer', type: 'string', optional: true}];
  50. router.post('/delete', authenticate('key.delete'), verifyBody(deleteProps), async (req, res) => {
  51. let query = {key : req.body.keyid};
  52. if (!req.scope.includes('key.delete.others'))
  53. query.issuer = req.username;
  54. else if (req.body.issuer)
  55. query.issuer = req.body.issuer;
  56. const key = await Key.findOne(query);
  57. if (!key)
  58. return res.status(422).json({message: 'Key not found.'});
  59. await Key.deleteOne({_id: key._id});
  60. res.status(200).json({message: 'Key deleted.'});
  61. });
  62. module.exports = router;