PasteViewer.js 5.4 KB

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