otr.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. (function (root, factory) {
  2. define(["jquery", "jasmine", "mock", "converse-core", "test-utils"], factory);
  3. } (this, function ($, jasmine, mock, converse, 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 with an active OTR session", function() {
  9. it("will not show the spoiler toolbar button",
  10. mock.initConverseWithPromises(
  11. null, ['rosterGroupsFetched'], {},
  12. function (done, _converse) {
  13. test_utils.createContacts(_converse, 'current');
  14. var contact_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost';
  15. // XXX: We need to send a presence from the contact, so that we
  16. // have a resource, that resource is then queried to see
  17. // whether Strophe.NS.SPOILER is supported, in which case
  18. // the spoiler button will appear.
  19. var presence = $pres({
  20. 'from': contact_jid+'/phone',
  21. 'to': 'dummy@localhost'
  22. });
  23. _converse.connection._dataRecv(test_utils.createRequest(presence));
  24. test_utils.openChatBoxFor(_converse, contact_jid);
  25. test_utils.waitUntilDiscoConfirmed(_converse, contact_jid+'/phone', [], [Strophe.NS.SPOILER]).then(function () {
  26. var spoiler_toggle;
  27. var view = _converse.chatboxviews.get(contact_jid);
  28. spyOn(view, 'addSpoilerButton').and.callThrough();
  29. view.model.set('otr_status', 1);
  30. test_utils.waitUntil(function () {
  31. return _.isNull(view.el.querySelector('.toggle-compose-spoiler'));
  32. }).then(function () {
  33. spoiler_toggle = view.el.querySelector('.toggle-compose-spoiler');
  34. expect(spoiler_toggle).toBe(null);
  35. view.model.set('otr_status', 3);
  36. return test_utils.waitUntil(function () {
  37. return !_.isNull(view.el.querySelector('.toggle-compose-spoiler'));
  38. });
  39. }).then(function () {
  40. spoiler_toggle = view.el.querySelector('.toggle-compose-spoiler');
  41. expect(spoiler_toggle).not.toBe(null);
  42. view.model.set('otr_status', 2);
  43. return test_utils.waitUntil(function () {
  44. return _.isNull(view.el.querySelector('.toggle-compose-spoiler'));
  45. });
  46. }).then(function () {
  47. spoiler_toggle = view.el.querySelector('.toggle-compose-spoiler');
  48. expect(spoiler_toggle).toBe(null);
  49. view.model.set('otr_status', 4);
  50. return test_utils.waitUntil(function () {
  51. return !_.isNull(view.el.querySelector('.toggle-compose-spoiler'));
  52. });
  53. }).then(function () {
  54. spoiler_toggle = view.el.querySelector('.toggle-compose-spoiler');
  55. expect(spoiler_toggle).not.toBe(null);
  56. done();
  57. });
  58. });
  59. }));
  60. });
  61. describe("The OTR module", function() {
  62. it("will add processing hints to sent out encrypted <message> stanzas",
  63. mock.initConverseWithPromises(
  64. null, ['rosterGroupsFetched'], {},
  65. function (done, _converse) {
  66. test_utils.openControlBox();
  67. test_utils.createContacts(_converse, 'current');
  68. var UNVERIFIED = 1, UNENCRYPTED = 0;
  69. var contact_name = mock.cur_names[0];
  70. var contact_jid = contact_name.replace(/ /g,'.').toLowerCase() + '@localhost';
  71. test_utils.openChatBoxFor(_converse, contact_jid);
  72. var chatview = _converse.chatboxviews.get(contact_jid);
  73. chatview.model.set('otr_status', UNVERIFIED);
  74. var stanza = chatview.createMessageStanza(new _converse.Message({ message: 'hello world'}));
  75. var $hints = $(stanza.nodeTree).find('[xmlns="'+Strophe.NS.HINTS+'"]');
  76. expect($hints.length).toBe(3);
  77. expect($hints.get(0).tagName).toBe('no-store');
  78. expect($hints.get(1).tagName).toBe('no-permanent-store');
  79. expect($hints.get(2).tagName).toBe('no-copy');
  80. chatview.model.set('otr_status', UNENCRYPTED); // Reset again to UNENCRYPTED
  81. done();
  82. }));
  83. describe("An OTR Chat Message", function () {
  84. it("will not be carbon copied when it's sent out",
  85. mock.initConverseWithPromises(
  86. null, ['rosterGroupsFetched'], {},
  87. function (done, _converse) {
  88. test_utils.openControlBox();
  89. test_utils.createContacts(_converse, 'current');
  90. var msgtext = "?OTR,1,3,?OTR:AAIDAAAAAAEAAAABAAAAwCQ8HKsag0y0DGKsneo0kzKu1ua5L93M4UKTkCf1I2kbm2RgS5kIxDTxrTj3wVRB+H5Si86E1fKtuBgsDf/bKkGTM0h/49vh5lOD9HkE8cnSrFEn5GN,";
  91. var sender_jid = mock.cur_names[3].replace(/ /g,'.').toLowerCase() + '@localhost';
  92. _converse.api.chats.open(sender_jid);
  93. var chatbox = _converse.chatboxes.get(sender_jid);
  94. spyOn(_converse.connection, 'send');
  95. chatbox.set('otr_status', 1); // Set OTR status to UNVERIFIED, to mock an encrypted session
  96. chatbox.trigger('sendMessage', new _converse.Message({ message: msgtext }));
  97. var $sent = $(_converse.connection.send.calls.argsFor(0)[0].tree());
  98. expect($sent.find('body').siblings('private').length).toBe(1);
  99. expect($sent.find('private').length).toBe(1);
  100. expect($sent.find('private').attr('xmlns')).toBe('urn:xmpp:carbons:2');
  101. chatbox.set('otr_status', 0); // Reset again to UNENCRYPTED
  102. done();
  103. }));
  104. });
  105. });
  106. }));