Prompt.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. 'use strict';
  2. require('../common');
  3. const fc = require('fast-check');
  4. describe('Prompt', function () {
  5. describe('requestPassword & getPassword', function () {
  6. this.timeout(30000);
  7. it('returns the password fed into the dialog', () => {
  8. fc.assert(fc.property(
  9. fc.string(),
  10. function (password) {
  11. password = password.replace(/\r+|\n+/g, '');
  12. const clean = globalThis.cleanup('', {url: 'ftp://example.com/?0000000000000000'});
  13. document.body.innerHTML = `
  14. <div id="passwordmodal" class="modal fade" role="dialog">
  15. <div class="modal-dialog">
  16. <div class="modal-content">
  17. <div class="modal-body">
  18. <form id="passwordform" role="form">
  19. <div class="form-group">
  20. <input id="passworddecrypt" type="password"
  21. class="form-control" placeholder="Enter password">
  22. </div>
  23. <button type="submit">Decrypt</button>
  24. </form>
  25. </div>
  26. </div>
  27. </div>
  28. </div>
  29. <nav class="navbar navbar-inverse navbar-static-top">
  30. <div id="navbar" class="navbar-collapse collapse">
  31. <ul class="nav navbar-nav"><li><button id="newbutton" type="button" class="hidden btn btn-warning navbar-btn">
  32. <span class="glyphicon glyphicon-file" aria-hidden="true">
  33. </span> New</button><button id="clonebutton" type="button" class="hidden btn btn-warning navbar-btn">
  34. <span class="glyphicon glyphicon-duplicate" aria-hidden="true"></span> Clone</button>
  35. <button id="rawtextbutton" type="button" class="hidden btn btn-warning navbar-btn">
  36. <span class="glyphicon glyphicon-text-background" aria-hidden="true"></span> Raw text</button>
  37. <button id="downloadtextbutton" type="button" class="hidden btn btn-default navbar-btn"></button>
  38. <button id="qrcodelink" type="button" data-toggle="modal" data-target="#qrcodemodal" class="hidden btn btn-warning navbar-btn"/>
  39. <span class="glyphicon glyphicon-qrcode" aria-hidden="true"></span> QR code</button></li></ul></div>
  40. </nav>
  41. <div id="errormessage"></div>
  42. <div id="loadingindicator"></div>
  43. <div id="status"></div>
  44. `;
  45. // Initialize the Prompt module to set up event listeners
  46. PrivateBin.Alert.init();
  47. PrivateBin.TopNav.init();
  48. PrivateBin.Prompt.init();
  49. PrivateBin.Prompt.requestPassword();
  50. // mock request response
  51. const originalFetch = globalThis.fetch;
  52. globalThis.fetch = function (url) {
  53. assert.strictEqual(url, 'ftp://example.com/?pasteid=0000000000000000');
  54. return Promise.resolve({
  55. ok: true,
  56. status: 200,
  57. statusText: 'OK',
  58. json: function () {
  59. return Promise.resolve({});
  60. }
  61. });
  62. };
  63. // Simulate user input
  64. const passwordInput = document.getElementById('passworddecrypt');
  65. passwordInput.value = password;
  66. // Simulate form submission to trigger password capture
  67. const passwordForm = document.getElementById('passwordform');
  68. /** {@type SubmitEvent} */
  69. const submitEvent = new Event('submit', { bubbles: true, cancelable: true });
  70. passwordForm.dispatchEvent(submitEvent);
  71. // Verify that getPassword returns the submitted password
  72. const result = PrivateBin.Prompt.getPassword();
  73. globalThis.fetch = originalFetch;
  74. clean();
  75. return result === password;
  76. }
  77. ));
  78. });
  79. });
  80. });