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.

46 lines
1.8KB

  1. const sanitizer = require('sanitizer');
  2. // Verifies a single property is well formed.
  3. // expected follows the format:
  4. // ex. {name: 'myList', type: 'array', maxLength: 10}
  5. // ex. {name: 'myVar', type: 'string', optional: true}
  6. const verify = async (prop, expected) => {
  7. if (!expected.optional && !prop)
  8. throw {code: 400, message: expected.name + ' not specified.'};
  9. else if (!prop)
  10. return;
  11. if (expected.type) {
  12. if (expected.type === 'date') {
  13. if (isNaN(new Date(prop)))
  14. throw {code: 400, message: `${expected.name} malformed.`};
  15. } else if (expected.type === 'array') {
  16. if (!(prop instanceof Array))
  17. throw {code: 400, message: `${expected.name} malformed.`};
  18. } else if (expected.type === 'number') {
  19. if (isNaN(parseInt(prop)))
  20. throw {code: 400, message: `${expected.name} malformed.`};
  21. } else {
  22. if (typeof prop !== expected.type)
  23. throw {code: 400, message: `${expected.name} malformed.`};
  24. }
  25. }
  26. if (expected.min && parseInt(prop) < expected.min)
  27. throw {code: 400, message: `${expected.name} too small.`};
  28. if (expected.max && parseInt(prop) > expected.max)
  29. throw {code: 400, message: `${expected.name} too large.`};
  30. if (expected.maxLength && prop.length > expected.maxLength)
  31. throw {code: 400, message: `${expected.name} too long.`};
  32. if (expected.sanitize && sanitizer.sanitize(prop) !== prop)
  33. throw {code: 400, message: `${expected.name} contains invalid characters.`};
  34. if (expected.restrict && prop.replace(expected.restrict, '') !== prop)
  35. throw {code: 400, message: `${expected.name} contains invalid characters.`};
  36. };
  37. module.exports = verify;