PasteViewer.js 6.7 KB

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