otr.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. (function (root, factory) {
  2. define(["jquery", "jasmine", "mock", "test-utils"], factory);
  3. } (this, function ($, jasmine, mock, test_utils) {
  4. var Strophe = converse.env.Strophe;
  5. var b64_sha1 = converse.env.b64_sha1;
  6. var $pres = converse.env.$pres;
  7. var _ = converse.env._;
  8. describe("A chatbox", function() {
  9. it("contains a button for starting an encrypted chat session",
  10. mock.initConverseWithPromises(
  11. null, ['rosterGroupsFetched'], {},
  12. function (done, _converse) {
  13. var timeout = true, $toolbar, view;
  14. test_utils.createContacts(_converse, 'current');
  15. test_utils.openControlBox();
  16. test_utils.waitUntil(function () {
  17. return $(_converse.rosterview.el).find('.roster-group').length;
  18. }, 300).then(function () {
  19. // TODO: More tests can be added here...
  20. var contact_jid = mock.cur_names[2].replace(/ /g,'.').toLowerCase() + '@localhost';
  21. test_utils.openChatBoxFor(_converse, contact_jid);
  22. view = _converse.chatboxviews.get(contact_jid);
  23. $toolbar = $(view.el).find('ul.chat-toolbar');
  24. expect($toolbar.find('.toggle-otr').length).toBe(1);
  25. // Register spies
  26. spyOn(view, 'toggleOTRMenu').and.callThrough();
  27. view.delegateEvents(); // We need to rebind all events otherwise our spy won't be called
  28. timeout = false;
  29. $toolbar[0].querySelector('.toggle-otr').click();
  30. return test_utils.waitUntil(function () {
  31. return view.el.querySelector('.otr-menu').offsetHeight;
  32. }, 300)
  33. }).then(function () {
  34. expect(view.toggleOTRMenu).toHaveBeenCalled();
  35. done();
  36. });
  37. }));
  38. describe("with an active OTR session", function() {
  39. it("will not show the spoiler toolbar button",
  40. mock.initConverseWithPromises(
  41. null, ['rosterGroupsFetched'], {},
  42. function (done, _converse) {
  43. test_utils.createContacts(_converse, 'current');
  44. var contact_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost';
  45. // XXX: We need to send a presence from the contact, so that we
  46. // have a resource, that resource is then queried to see
  47. // whether Strophe.NS.SPOILER is supported, in which case
  48. // the spoiler button will appear.
  49. var presence = $pres({
  50. 'from': contact_jid+'/phone',
  51. 'to': 'dummy@localhost'
  52. });
  53. _converse.connection._dataRecv(test_utils.createRequest(presence));
  54. test_utils.openChatBoxFor(_converse, contact_jid);
  55. test_utils.waitUntilDiscoConfirmed(_converse, contact_jid+'/phone', [], [Strophe.NS.SPOILER]).then(function () {
  56. var spoiler_toggle;
  57. var view = _converse.chatboxviews.get(contact_jid);
  58. spyOn(view, 'addSpoilerButton').and.callThrough();
  59. view.model.set('otr_status', 1);
  60. test_utils.waitUntil(function () {
  61. return _.isNull(view.el.querySelector('.toggle-compose-spoiler'));
  62. }).then(function () {
  63. spoiler_toggle = view.el.querySelector('.toggle-compose-spoiler');
  64. expect(spoiler_toggle).toBe(null);
  65. view.model.set('otr_status', 3);
  66. return test_utils.waitUntil(function () {
  67. return !_.isNull(view.el.querySelector('.toggle-compose-spoiler'));
  68. });
  69. }).then(function () {
  70. spoiler_toggle = view.el.querySelector('.toggle-compose-spoiler');
  71. expect(spoiler_toggle).not.toBe(null);
  72. view.model.set('otr_status', 2);
  73. return test_utils.waitUntil(function () {
  74. return _.isNull(view.el.querySelector('.toggle-compose-spoiler'));
  75. });
  76. }).then(function () {
  77. spoiler_toggle = view.el.querySelector('.toggle-compose-spoiler');
  78. expect(spoiler_toggle).toBe(null);
  79. view.model.set('otr_status', 4);
  80. return test_utils.waitUntil(function () {
  81. return !_.isNull(view.el.querySelector('.toggle-compose-spoiler'));
  82. });
  83. }).then(function () {
  84. spoiler_toggle = view.el.querySelector('.toggle-compose-spoiler');
  85. expect(spoiler_toggle).not.toBe(null);
  86. done();
  87. });
  88. });
  89. }));
  90. });
  91. });
  92. describe("The OTR module", function() {
  93. it("will add processing hints to sent out encrypted <message> stanzas",
  94. mock.initConverseWithPromises(
  95. null, ['rosterGroupsFetched'], {},
  96. function (done, _converse) {
  97. test_utils.openControlBox();
  98. test_utils.createContacts(_converse, 'current');
  99. var UNVERIFIED = 1, UNENCRYPTED = 0;
  100. var contact_name = mock.cur_names[0];
  101. var contact_jid = contact_name.replace(/ /g,'.').toLowerCase() + '@localhost';
  102. test_utils.openChatBoxFor(_converse, contact_jid);
  103. var chatview = _converse.chatboxviews.get(contact_jid);
  104. chatview.model.set('otr_status', UNVERIFIED);
  105. var stanza = chatview.model.createMessageStanza(new _converse.Message({ message: 'hello world'}));
  106. var $hints = $(stanza.nodeTree).find('[xmlns="'+Strophe.NS.HINTS+'"]');
  107. expect($hints.length).toBe(3);
  108. expect($hints.get(0).tagName).toBe('no-store');
  109. expect($hints.get(1).tagName).toBe('no-permanent-store');
  110. expect($hints.get(2).tagName).toBe('no-copy');
  111. chatview.model.set('otr_status', UNENCRYPTED); // Reset again to UNENCRYPTED
  112. done();
  113. }));
  114. describe("An OTR Chat Message", function () {
  115. it("will not be carbon copied when it's sent out",
  116. mock.initConverseWithPromises(
  117. null, ['rosterGroupsFetched'], {},
  118. function (done, _converse) {
  119. test_utils.openControlBox();
  120. test_utils.createContacts(_converse, 'current');
  121. var msgtext = "?OTR,1,3,?OTR:AAIDAAAAAAEAAAABAAAAwCQ8HKsag0y0DGKsneo0kzKu1ua5L93M4UKTkCf1I2kbm2RgS5kIxDTxrTj3wVRB+H5Si86E1fKtuBgsDf/bKkGTM0h/49vh5lOD9HkE8cnSrFEn5GN,";
  122. var sender_jid = mock.cur_names[3].replace(/ /g,'.').toLowerCase() + '@localhost';
  123. _converse.api.chats.open(sender_jid);
  124. var chatbox = _converse.chatboxes.get(sender_jid);
  125. spyOn(_converse.connection, 'send');
  126. chatbox.set('otr_status', 1); // Set OTR status to UNVERIFIED, to mock an encrypted session
  127. chatbox.sendMessage(new _converse.Message({'message': msgtext}));
  128. var $sent = $(_converse.connection.send.calls.argsFor(0)[0].tree());
  129. expect($sent.find('body').siblings('private').length).toBe(1);
  130. expect($sent.find('private').length).toBe(1);
  131. expect($sent.find('private').attr('xmlns')).toBe('urn:xmpp:carbons:2');
  132. chatbox.set('otr_status', 0); // Reset again to UNENCRYPTED
  133. done();
  134. }));
  135. });
  136. });
  137. }));