Take from_real_jid
into account when determining sender
of MUC messages. This is safer than simply checking nicknames when the XEP-0421 occupant-id is not available.
This commit is contained in:
parent
34927b5b77
commit
5231262bda
|
@ -117,6 +117,27 @@ function getOccupantID (stanza, chatbox) {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether the sender of this MUC message is the current user or
|
||||
* someone else.
|
||||
* @param { MUCMessageAttributes } attrs
|
||||
* @param { _converse.ChatRoom } chatbox
|
||||
* @returns { 'me'|'them' }
|
||||
*/
|
||||
function getSender (attrs, chatbox) {
|
||||
let is_me;
|
||||
const own_occupant_id = chatbox.get('occupant_id');
|
||||
|
||||
if (own_occupant_id) {
|
||||
is_me = attrs.occupant_id === own_occupant_id;
|
||||
} else if (attrs.from_real_jid) {
|
||||
is_me = Strophe.getBareJidFromJid(attrs.from_real_jid) === _converse.bare_jid;
|
||||
} else {
|
||||
is_me = attrs.nick === chatbox.get('nick')
|
||||
}
|
||||
return is_me ? 'me' : 'them';
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a passed in message stanza and returns an object of attributes.
|
||||
* @param { XMLElement } stanza - The message stanza
|
||||
|
@ -141,10 +162,8 @@ export async function parseMUCMessage (stanza, chatbox) {
|
|||
}
|
||||
const delay = sizzle(`delay[xmlns="${Strophe.NS.DELAY}"]`, original_stanza).pop();
|
||||
const from = stanza.getAttribute('from');
|
||||
const from_muc = Strophe.getBareJidFromJid(from);
|
||||
const nick = Strophe.unescapeNode(Strophe.getResourceFromJid(from));
|
||||
const marker = getChatMarker(stanza);
|
||||
const now = new Date().toISOString();
|
||||
|
||||
/**
|
||||
* @typedef { Object } MUCMessageAttributes
|
||||
* The object which {@link parseMUCMessage} returns
|
||||
|
@ -204,28 +223,28 @@ export async function parseMUCMessage (stanza, chatbox) {
|
|||
let attrs = Object.assign(
|
||||
{
|
||||
from,
|
||||
from_muc,
|
||||
nick,
|
||||
'is_forwarded': !!stanza.querySelector('forwarded'),
|
||||
'activities': getMEPActivities(stanza),
|
||||
'body': stanza.querySelector('body')?.textContent?.trim(),
|
||||
'chat_state': getChatState(stanza),
|
||||
'from_muc': Strophe.getBareJidFromJid(from),
|
||||
'is_archived': isArchived(original_stanza),
|
||||
'is_carbon': isCarbon(original_stanza),
|
||||
'is_delayed': !!delay,
|
||||
'is_forwarded': !!stanza.querySelector('forwarded'),
|
||||
'is_headline': isHeadline(stanza),
|
||||
'is_markable': !!sizzle(`markable[xmlns="${Strophe.NS.MARKERS}"]`, stanza).length,
|
||||
'is_marker': !!marker,
|
||||
'is_unstyled': !!sizzle(`unstyled[xmlns="${Strophe.NS.STYLING}"]`, stanza).length,
|
||||
'marker_id': marker && marker.getAttribute('id'),
|
||||
'msgid': stanza.getAttribute('id') || original_stanza.getAttribute('id'),
|
||||
'nick': Strophe.unescapeNode(Strophe.getResourceFromJid(from)),
|
||||
'occupant_id': getOccupantID(stanza, chatbox),
|
||||
'receipt_id': getReceiptId(stanza),
|
||||
'received': new Date().toISOString(),
|
||||
'references': getReferences(stanza),
|
||||
'subject': stanza.querySelector('subject')?.textContent,
|
||||
'thread': stanza.querySelector('thread')?.textContent,
|
||||
'time': delay ? dayjs(delay.getAttribute('stamp')).toISOString() : now,
|
||||
'time': delay ? dayjs(delay.getAttribute('stamp')).toISOString() : new Date().toISOString(),
|
||||
'to': stanza.getAttribute('to'),
|
||||
'type': stanza.getAttribute('type')
|
||||
},
|
||||
|
@ -242,18 +261,14 @@ export async function parseMUCMessage (stanza, chatbox) {
|
|||
|
||||
await api.emojis.initialize();
|
||||
|
||||
const from_real_jid = attrs.is_archived && getJIDFromMUCUserData(stanza, attrs) ||
|
||||
attrs.from_real_jid = attrs.is_archived && getJIDFromMUCUserData(stanza) ||
|
||||
chatbox.occupants.findOccupant(attrs)?.get('jid');
|
||||
|
||||
const own_occupant_id = chatbox.get('occupant_id');
|
||||
const is_me = attrs.occupant_id && own_occupant_id ? own_occupant_id === attrs.occupant_id : attrs.nick === chatbox.get('nick');
|
||||
|
||||
attrs = Object.assign( {
|
||||
from_real_jid,
|
||||
'is_only_emojis': attrs.body ? u.isOnlyEmojis(attrs.body) : false,
|
||||
'is_valid_receipt_request': isValidReceiptRequest(stanza, attrs),
|
||||
'message': attrs.body || attrs.error, // TODO: Should only be used for error and info messages
|
||||
'sender': is_me ? 'me' : 'them',
|
||||
'sender': getSender(attrs, chatbox),
|
||||
}, attrs);
|
||||
|
||||
if (attrs.is_archived && original_stanza.getAttribute('from') !== attrs.from_muc) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user