messages.js 5.6 KB

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