A simple file sharing site with an easy to use API and online panel.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
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;