decode-wa-message, process-message: Fix @hosted lids processing

This commit is contained in:
Rajeh Taher
2025-10-03 00:05:01 +03:00
parent 592f70b81d
commit 50b36ece3b
6 changed files with 39 additions and 14 deletions
+6 -4
View File
@@ -7,12 +7,14 @@ import {
type BinaryNode,
isJidBroadcast,
isJidGroup,
isJidHostedLidUser,
isJidHostedPnUser,
isJidMetaAI,
isJidNewsletter,
isJidStatusBroadcast,
isLidUser,
isPnUser,
transferDevice
// transferDevice
} from '../WABinary'
import { unpadRandomMax16 } from './generics'
import type { ILogger } from './logger'
@@ -95,7 +97,7 @@ export const extractAddressingContext = (stanza: BinaryNode) => {
senderAlt = stanza.attrs.participant_pn || stanza.attrs.sender_pn || stanza.attrs.peer_recipient_pn
recipientAlt = stanza.attrs.recipient_pn
// with device data
if (sender && senderAlt) senderAlt = transferDevice(sender, senderAlt)
//if (sender && senderAlt) senderAlt = transferDevice(sender, senderAlt)
} else {
// Message is PN-addressed: sender is PN, extract corresponding LID
// without device data
@@ -103,7 +105,7 @@ export const extractAddressingContext = (stanza: BinaryNode) => {
recipientAlt = stanza.attrs.recipient_lid
//with device data
if (sender && senderAlt) senderAlt = transferDevice(sender, senderAlt)
//if (sender && senderAlt) senderAlt = transferDevice(sender, senderAlt)
}
return {
@@ -133,7 +135,7 @@ export function decodeMessageNode(stanza: BinaryNode, meId: string, meLid: strin
const isMe = (jid: string) => areJidsSameUser(jid, meId)
const isMeLid = (jid: string) => areJidsSameUser(jid, meLid)
if (isPnUser(from) || isLidUser(from)) {
if (isPnUser(from) || isLidUser(from) || isJidHostedLidUser(from) || isJidHostedPnUser(from)) {
if (recipient && !isJidMetaAI(recipient)) {
if (!isMe(from!) && !isMeLid(from!)) {
throw new Boom('receipient present, but msg not from me', { data: stanza })
+29 -3
View File
@@ -13,7 +13,16 @@ import type {
} from '../Types'
import { WAMessageStubType } from '../Types'
import { getContentType, normalizeMessageContent } from '../Utils/messages'
import { areJidsSameUser, isJidBroadcast, isJidStatusBroadcast, jidNormalizedUser } from '../WABinary'
import {
areJidsSameUser,
isJidBroadcast,
isJidHostedLidUser,
isJidHostedPnUser,
isJidStatusBroadcast,
jidDecode,
jidEncode,
jidNormalizedUser
} from '../WABinary'
import { aesDecryptGCM, hmacSign } from './crypto'
import { toNumber } from './generics'
import { downloadAndProcessHistorySyncNotification } from './history'
@@ -43,8 +52,24 @@ const REAL_MSG_REQ_ME_STUB_TYPES = new Set([WAMessageStubType.GROUP_PARTICIPANT_
/** Cleans a received message to further processing */
export const cleanMessage = (message: proto.IWebMessageInfo, meId: string) => {
// ensure remoteJid and participant doesn't have device or agent in it
message.key.remoteJid = jidNormalizedUser(message.key.remoteJid!)
message.key.participant = message.key.participant ? jidNormalizedUser(message.key.participant) : undefined
if (isJidHostedPnUser(message.key.remoteJid!) || isJidHostedLidUser(message.key.remoteJid!)) {
message.key.remoteJid = jidEncode(
jidDecode(message.key.remoteJid!)?.user!,
isJidHostedPnUser(message.key.remoteJid!) ? 's.whatsapp.net' : 'lid'
)
} else {
message.key.remoteJid = jidNormalizedUser(message.key.remoteJid!)
}
if (isJidHostedPnUser(message.key.participant!) || isJidHostedLidUser(message.key.participant!)) {
message.key.participant = jidEncode(
jidDecode(message.key.participant!)?.user!,
isJidHostedPnUser(message.key.participant!) ? 's.whatsapp.net' : 'lid'
)
} else {
message.key.participant = jidNormalizedUser(message.key.participant!)
}
const content = normalizeMessageContent(message.message)
// if the message has a reaction, ensure fromMe & remoteJid are from our perspective
if (content?.reactionMessage) {
@@ -67,6 +92,7 @@ export const cleanMessage = (message: proto.IWebMessageInfo, meId: string) => {
// fromMe automatically becomes false
false
// set the remoteJid to being the same as the chat the message came from
// TODO: investigate inconsistencies
msgKey.remoteJid = message.key.remoteJid
// set participant of the message
msgKey.participant = msgKey.participant || message.key.participant