messages.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /*global mock, converse */
  2. const { Strophe, u, $msg, stx } = converse.env;
  3. describe("A MUC message", function () {
  4. it("saves the user's real JID as looked up via the XEP-0421 occupant id",
  5. mock.initConverse([], {}, async function (_converse) {
  6. await mock.waitUntilBookmarksReturned(_converse);
  7. const muc_jid = 'lounge@montague.lit';
  8. const nick = 'romeo';
  9. const features = [...mock.default_muc_features, Strophe.NS.OCCUPANTID];
  10. const model = await mock.openAndEnterMUC(_converse, muc_jid, nick, features);
  11. const occupant_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@montague.lit';
  12. const presence = stx`
  13. <presence from="${muc_jid}/thirdwitch"
  14. id="${u.getUniqueId()}"
  15. to="${_converse.bare_jid}"
  16. xmlns="jabber:client">
  17. <x xmlns="http://jabber.org/protocol/muc#user">
  18. <item jid="${occupant_jid}" />
  19. </x>
  20. <occupant-id xmlns="urn:xmpp:occupant-id:0" id="dd72603deec90a38ba552f7c68cbcc61bca202cd" />
  21. </presence>`;
  22. _converse.api.connection.get()._dataRecv(mock.createRequest(presence));
  23. const occupant = await u.waitUntil(() => model.getOccupantByNickname('thirdwitch'));
  24. expect(occupant.get('occupant_id')).toBe('dd72603deec90a38ba552f7c68cbcc61bca202cd');
  25. const stanza = stx`
  26. <message from='${muc_jid}/thirdwitch'
  27. id='hysf1v37'
  28. to='${_converse.bare_jid}'
  29. type='groupchat'
  30. xmlns="jabber:client">
  31. <body>Harpier cries: 'tis time, 'tis time.</body>
  32. <occupant-id xmlns="urn:xmpp:occupant-id:0" id="dd72603deec90a38ba552f7c68cbcc61bca202cd" />
  33. </message>`;
  34. _converse.api.connection.get()._dataRecv(mock.createRequest(stanza));
  35. await u.waitUntil(() => model.messages.length);
  36. expect(model.messages.at(0).get('occupant_id')).toBe("dd72603deec90a38ba552f7c68cbcc61bca202cd");
  37. expect(model.messages.at(0).get('from_real_jid')).toBe(occupant_jid);
  38. }));
  39. it("keeps track whether you are the sender or not",
  40. mock.initConverse([], {}, async function (_converse) {
  41. const muc_jid = 'lounge@montague.lit';
  42. const model = await mock.openAndEnterMUC(_converse, muc_jid, 'romeo');
  43. const msg = $msg({
  44. from: 'lounge@montague.lit/romeo',
  45. id: u.getUniqueId(),
  46. to: 'romeo@montague.lit',
  47. type: 'groupchat'
  48. }).c('body').t('I wrote this message!').tree();
  49. await model.handleMessageStanza(msg);
  50. await u.waitUntil(() => model.messages.last()?.get('received'));
  51. expect(model.messages.last().get('sender')).toBe('me');
  52. }));
  53. it("gets updated with its stanza-id upon MUC reflection",
  54. mock.initConverse([], {}, async function (_converse) {
  55. const muc_jid = 'room@muc.example.com';
  56. const model = await mock.openAndEnterMUC(_converse, muc_jid, 'romeo');
  57. model.sendMessage({'body': 'hello world'});
  58. await u.waitUntil(() => model.messages.length === 1);
  59. const msg = model.messages.at(0);
  60. expect(msg.get('stanza_id')).toBeUndefined();
  61. expect(msg.get('origin_id')).toBe(msg.get('origin_id'));
  62. const stanza = u.toStanza(`
  63. <message xmlns="jabber:client"
  64. from="room@muc.example.com/romeo"
  65. to="${_converse.api.connection.get().jid}"
  66. type="groupchat">
  67. <body>Hello world</body>
  68. <stanza-id xmlns="urn:xmpp:sid:0"
  69. id="5f3dbc5e-e1d3-4077-a492-693f3769c7ad"
  70. by="room@muc.example.com"/>
  71. <origin-id xmlns="urn:xmpp:sid:0" id="${msg.get('origin_id')}"/>
  72. </message>`);
  73. spyOn(model, 'updateMessage').and.callThrough();
  74. _converse.api.connection.get()._dataRecv(mock.createRequest(stanza));
  75. await u.waitUntil(() => model.updateMessage.calls.count() === 1);
  76. expect(model.messages.length).toBe(1);
  77. expect(model.messages.at(0).get('stanza_id room@muc.example.com')).toBe("5f3dbc5e-e1d3-4077-a492-693f3769c7ad");
  78. expect(model.messages.at(0).get('origin_id')).toBe(msg.get('origin_id'));
  79. }));
  80. it("is rejected if it's an unencapsulated forwarded message",
  81. mock.initConverse(['chatBoxesFetched'], {}, async function (_converse) {
  82. const muc_jid = 'lounge@montague.lit';
  83. await mock.openAndEnterMUC(_converse, muc_jid, 'romeo');
  84. const impersonated_jid = `${muc_jid}/alice`;
  85. const received_stanza = stx`
  86. <message to='${_converse.jid}'
  87. xmlns="jabber:client"
  88. from='${muc_jid}/mallory'
  89. type='groupchat'
  90. id='${_converse.api.connection.get().getUniqueId()}'>
  91. <forwarded xmlns='urn:xmpp:forward:0'>
  92. <delay xmlns='urn:xmpp:delay' stamp='2019-07-10T23:08:25Z'/>
  93. <message from='${impersonated_jid}'
  94. id='0202197'
  95. to='${_converse.bare_jid}'
  96. type='groupchat'
  97. xmlns='jabber:client'>
  98. <body>Yet I should kill thee with much cherishing.</body>
  99. </message>
  100. </forwarded>
  101. </message>`;
  102. spyOn(converse.env.log, 'error').and.callThrough();
  103. _converse.api.connection.get()._dataRecv(mock.createRequest(received_stanza));
  104. await u.waitUntil(() => converse.env.log.error.calls.count() === 1);
  105. expect(converse.env.log.error.calls.argsFor(0)[0]?.message).toBe(
  106. `Ignoring unencapsulated forwarded message from ${muc_jid}/mallory`
  107. );
  108. const model = _converse.chatboxes.get(muc_jid);
  109. expect(model.messages.length).toBe(0);
  110. }));
  111. it('parses the correct body element',
  112. mock.initConverse(['chatBoxesFetched'], {}, async function(_converse) {
  113. const muc_jid = 'lounge@montague.lit';
  114. const model = await mock.openAndEnterMUC(_converse, muc_jid, 'romeo');
  115. const received_stanza = stx`
  116. <message xmlns="jabber:client" to='${_converse.jid}' from='${muc_jid}/mallory' type='groupchat' id='${_converse.api.connection.get().getUniqueId()}' >
  117. <reply xmlns='urn:xmpp:reply:0' id='${_converse.api.connection.get().getUniqueId()}' to='${_converse.jid}'/>
  118. <fallback xmlns='urn:xmpp:feature-fallback:0' for='urn:xmpp:reply:0'>
  119. <body start='0' end='10'/>
  120. </fallback>
  121. <active xmlns='http://jabber.org/protocol/chatstates'/>
  122. <body>&gt; ping
  123. pong</body>
  124. <request xmlns='urn:xmpp:receipts'/>
  125. </message>
  126. `;
  127. await model.handleMessageStanza(received_stanza);
  128. await u.waitUntil(() => model.messages.last());
  129. expect(model.messages.last().get('body')).toBe('> ping\n pong');
  130. }));
  131. });