PasteViewer.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. 'use strict';
  2. var common = require('../common');
  3. describe('PasteViewer', function () {
  4. describe('run, hide, getText, setText, getFormat, setFormat & isPrettyPrinted', function () {
  5. this.timeout(30000);
  6. jsc.property(
  7. 'displays text according to format',
  8. common.jscFormats(),
  9. 'nestring',
  10. function (format, text) {
  11. var clean = jsdom(),
  12. results = [];
  13. $('body').html(
  14. '<div id="placeholder" class="hidden">+++ no paste text ' +
  15. '+++</div><div id="prettymessage" class="hidden"><pre ' +
  16. 'id="prettyprint" class="prettyprint linenums:1"></pre>' +
  17. '</div><div id="plaintext" class="hidden"></div>'
  18. );
  19. $.PrivateBin.PasteViewer.init();
  20. $.PrivateBin.PasteViewer.setFormat(format);
  21. $.PrivateBin.PasteViewer.setText('');
  22. results.push(
  23. $('#placeholder').hasClass('hidden') &&
  24. $('#prettymessage').hasClass('hidden') &&
  25. $('#plaintext').hasClass('hidden') &&
  26. $.PrivateBin.PasteViewer.getFormat() === format &&
  27. $.PrivateBin.PasteViewer.getText() === ''
  28. );
  29. $.PrivateBin.PasteViewer.run();
  30. results.push(
  31. !$('#placeholder').hasClass('hidden') &&
  32. $('#prettymessage').hasClass('hidden') &&
  33. $('#plaintext').hasClass('hidden')
  34. );
  35. $.PrivateBin.PasteViewer.hide();
  36. results.push(
  37. $('#placeholder').hasClass('hidden') &&
  38. $('#prettymessage').hasClass('hidden') &&
  39. $('#plaintext').hasClass('hidden')
  40. );
  41. $.PrivateBin.PasteViewer.setText(text);
  42. $.PrivateBin.PasteViewer.run();
  43. results.push(
  44. $('#placeholder').hasClass('hidden') &&
  45. !$.PrivateBin.PasteViewer.isPrettyPrinted() &&
  46. $.PrivateBin.PasteViewer.getText() === text
  47. );
  48. if (format === 'markdown') {
  49. results.push(
  50. $('#prettymessage').hasClass('hidden') &&
  51. !$('#plaintext').hasClass('hidden')
  52. );
  53. } else {
  54. results.push(
  55. !$('#prettymessage').hasClass('hidden') &&
  56. $('#plaintext').hasClass('hidden')
  57. );
  58. }
  59. clean();
  60. return results.every(element => element);
  61. }
  62. );
  63. jsc.property(
  64. 'sanitizes XSS',
  65. common.jscFormats(),
  66. 'string',
  67. // @see {@link https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet}
  68. jsc.elements([
  69. '<PLAINTEXT>',
  70. '></SCRIPT>">\'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>',
  71. '\'\';!--"<XSS>=&{()}',
  72. '<SCRIPT SRC=http://example.com/xss.js></SCRIPT>',
  73. '\'">><marquee><img src=x onerror=confirm(1)></marquee>">' +
  74. '</plaintext\\></|\\><plaintext/onmouseover=prompt(1)>' +
  75. '<script>prompt(1)</script>@gmail.com<isindex formaction=' +
  76. 'javascript:alert(/XSS/) type=submit>\'-->"></script>' +
  77. '<script>alert(document.cookie)</script>"><img/id="confirm' +
  78. '&lpar;1)"/alt="/"src="/"onerror=eval(id)>\'">',
  79. '<IMG SRC="javascript:alert(\'XSS\');">',
  80. '<IMG SRC=javascript:alert(\'XSS\')>',
  81. '<IMG SRC=JaVaScRiPt:alert(\'XSS\')>',
  82. '<IMG SRC=javascript:alert(&quot;XSS&quot;)>',
  83. '<IMG SRC=`javascript:alert("RSnake says, \'XSS\'")`>',
  84. '<a onmouseover="alert(document.cookie)">xxs link</a>',
  85. '<a onmouseover=alert(document.cookie)>xxs link</a>',
  86. '<IMG """><SCRIPT>alert("XSS")</SCRIPT>">',
  87. '<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>',
  88. '<IMG STYLE="xss:expr/*XSS*/ession(alert(\'XSS\'))">',
  89. '<FRAMESET><FRAME SRC="javascript:alert(\'XSS\');"></FRAMESET>',
  90. '<TABLE BACKGROUND="javascript:alert(\'XSS\')">',
  91. '<TABLE><TD BACKGROUND="javascript:alert(\'XSS\')">',
  92. '<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="httx://xss.rocks/xss.js"></SCRIPT>'
  93. ]),
  94. 'string',
  95. function (format, prefix, xss, suffix) {
  96. var clean = jsdom(),
  97. text = prefix + xss + suffix;
  98. $('body').html(
  99. '<div id="placeholder" class="hidden">+++ no paste text ' +
  100. '+++</div><div id="prettymessage" class="hidden"><pre ' +
  101. 'id="prettyprint" class="prettyprint linenums:1"></pre>' +
  102. '</div><div id="plaintext" class="hidden"></div>'
  103. );
  104. $.PrivateBin.PasteViewer.init();
  105. $.PrivateBin.PasteViewer.setFormat(format);
  106. $.PrivateBin.PasteViewer.setText(text);
  107. $.PrivateBin.PasteViewer.run();
  108. var result = $('body').html().indexOf(xss) === -1;
  109. clean();
  110. return result;
  111. }
  112. );
  113. });
  114. });