A simple file sharing site with an easy to use API and online panel.
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

80 wiersze
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 verifyScope = require('../../util/verifyScope');
  9. const requireAuth = require('../../util/auth').requireAuth;
  10. const createParams = [
  11. {name: 'identifier', type: 'string', sanitize: true},
  12. {name: 'scope', instance: Array}];
  13. router.post('/create', requireAuth('key.create'), verifyBody(createParams), async (req, res) => {
  14. const keyCount = await Key.countDocuments({issuer: req.username});
  15. if (keyCount >= config.get('Key.limit'))
  16. return res.status(403).json({message: 'Key limit reached.'});
  17. const scope = req.body.scope;
  18. if (!scope.every(scope => verifyScope(req.scope, scope)))
  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: scope,
  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', requireAuth('key.get'), verifyBody(getProps), async (req, res) => {
  37. let query = {};
  38. if (req.body.identifier)
  39. query.identifier = req.body.identifier;
  40. if (!verifyScope(req.scope, '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: 'key', type: 'string'},
  49. {name: 'issuer', type: 'string', optional: true}];
  50. router.post('/delete', requireAuth('key.delete'), verifyBody(deleteProps), async (req, res) => {
  51. let query = {key : req.body.key};
  52. if (!verifyScope(req.scope, '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;