PasteViewer.js 6.2 KB

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