PasteViewer.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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>">' +
  77. '</plaintext\\></|\\><plaintext/onmouseover=prompt(1)>' +
  78. '<script>prompt(1)</script>@gmail.com<isindex formaction=' +
  79. 'javascript:alert(/XSS/) type=submit>\'-->"></script>' +
  80. '<script>alert(document.cookie)</script>"><img/id="confirm' +
  81. '&lpar;1)"/alt="/"src="/"onerror=eval(id)>\'">',
  82. '<IMG SRC="javascript:alert(\'XSS\');">',
  83. '<IMG SRC=javascript:alert(\'XSS\')>',
  84. '<IMG SRC=JaVaScRiPt:alert(\'XSS\')>',
  85. '<IMG SRC=javascript:alert(&quot;XSS&quot;)>',
  86. '<IMG SRC=`javascript:alert("RSnake says, \'XSS\'")`>',
  87. '<a onmouseover="alert(document.cookie)">xxs link</a>',
  88. '<a onmouseover=alert(document.cookie)>xxs link</a>',
  89. '<IMG """><SCRIPT>alert("XSS")</SCRIPT>">',
  90. '<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>',
  91. '<IMG STYLE="xss:expr/*XSS*/ession(alert(\'XSS\'))">',
  92. '<FRAMESET><FRAME SRC="javascript:alert(\'XSS\');"></FRAMESET>',
  93. '<TABLE BACKGROUND="javascript:alert(\'XSS\')">',
  94. '<TABLE><TD BACKGROUND="javascript:alert(\'XSS\')">',
  95. '<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="httx://xss.rocks/xss.js"></SCRIPT>'
  96. ]),
  97. 'string',
  98. function (format, prefix, xss, suffix) {
  99. var clean = jsdom(),
  100. text = prefix + xss + suffix;
  101. $('body').html(
  102. '<div id="placeholder" class="hidden">+++ no paste text ' +
  103. '+++</div><div id="prettymessage" class="hidden"><pre ' +
  104. 'id="prettyprint" class="prettyprint linenums:1"></pre>' +
  105. '</div><div id="plaintext" class="hidden"></div>'
  106. );
  107. $.PrivateBin.PasteViewer.init();
  108. $.PrivateBin.PasteViewer.setFormat(format);
  109. $.PrivateBin.PasteViewer.setText(text);
  110. $.PrivateBin.PasteViewer.run();
  111. var result = $('body').html().indexOf(xss) === -1;
  112. clean();
  113. return result;
  114. }
  115. );
  116. });
  117. });