sanitize.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. "use strict";
  2. module.exports = {
  3. /**
  4. * Sanitizes input string by handling escape characters according to request body type
  5. *
  6. * @param {String} inputString - Input String to sanitize
  7. * @param {String} escapeCharFor - Escape for headers, body: raw, formdata etc
  8. * @param {Boolean} [inputTrim] - Whether to trim the input
  9. * @returns {String} Sanitized String handling escape characters
  10. */
  11. sanitize: function (inputString, escapeCharFor, inputTrim) {
  12. if (typeof inputString !== 'string') {
  13. return '';
  14. }
  15. inputString = inputTrim && typeof inputTrim === 'boolean' ? inputString.trim() : inputString;
  16. if (escapeCharFor && typeof escapeCharFor === 'string') {
  17. switch (escapeCharFor) {
  18. case 'raw':
  19. return JSON.stringify(inputString);
  20. case 'urlencoded':
  21. return encodeURIComponent(inputString).replace(/'/g, '\\\'');
  22. /* istanbul ignore next */
  23. case 'formdata':
  24. return inputString.replace(/\\/g, '\\\\').replace(/'/g, '\\\'');
  25. /* istanbul ignore next */
  26. case 'file':
  27. return inputString.replace(/\\/g, '\\\\').replace(/'/g, '\\\'');
  28. case 'header':
  29. return inputString.replace(/\\/g, '\\\\').replace(/'/g, '\\\'');
  30. default:
  31. return inputString.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
  32. }
  33. }
  34. return inputString.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
  35. },
  36. /**
  37. * sanitizes input options
  38. *
  39. * @param {Object} options - Options provided by the user
  40. * @param {Array} optionsArray - options array received from getOptions function
  41. *
  42. * @returns {Object} - Sanitized options object
  43. */
  44. sanitizeOptions: function (options, optionsArray) {
  45. var result = {}, defaultOptions = {}, id;
  46. optionsArray.forEach((option) => {
  47. defaultOptions[option.id] = {
  48. default: option.default,
  49. type: option.type
  50. };
  51. if (option.type === 'enum') {
  52. defaultOptions[option.id].availableOptions = option.availableOptions;
  53. }
  54. });
  55. for (id in options) {
  56. if (options.hasOwnProperty(id)) {
  57. if (defaultOptions[id] === undefined) {
  58. continue;
  59. }
  60. switch (defaultOptions[id].type) {
  61. case 'boolean':
  62. if (typeof options[id] !== 'boolean') {
  63. result[id] = defaultOptions[id].default;
  64. }
  65. else {
  66. result[id] = options[id];
  67. }
  68. break;
  69. case 'positiveInteger':
  70. if (typeof options[id] !== 'number' || options[id] < 0) {
  71. result[id] = defaultOptions[id].default;
  72. }
  73. else {
  74. result[id] = options[id];
  75. }
  76. break;
  77. case 'enum':
  78. if (!defaultOptions[id].availableOptions.includes(options[id])) {
  79. result[id] = defaultOptions[id].default;
  80. }
  81. else {
  82. result[id] = options[id];
  83. }
  84. break;
  85. default:
  86. result[id] = options[id];
  87. }
  88. }
  89. }
  90. for (id in defaultOptions) {
  91. if (defaultOptions.hasOwnProperty(id)) {
  92. if (result[id] === undefined) {
  93. result[id] = defaultOptions[id].default;
  94. }
  95. }
  96. }
  97. return result;
  98. },
  99. /**
  100. *
  101. * @param {Array} array - form data array
  102. * @param {String} key - key of form data param
  103. * @param {String} type - type of form data param(file/text)
  104. * @param {String} val - value/src property of form data param
  105. * @param {String} disabled - Boolean denoting whether the param is disabled or not
  106. * @param {String} contentType - content type header of the param
  107. *
  108. * Appends a single param to form data array
  109. */
  110. addFormParam: function (array, key, type, val, disabled, contentType) {
  111. if (type === 'file') {
  112. array.push({
  113. key: key,
  114. type: type,
  115. src: val,
  116. disabled: disabled,
  117. contentType: contentType
  118. });
  119. }
  120. else {
  121. array.push({
  122. key: key,
  123. type: type,
  124. value: val,
  125. disabled: disabled,
  126. contentType: contentType
  127. });
  128. }
  129. }
  130. };