From 50b36ece3b2c441ce618a40c318b1461b4f10d2e Mon Sep 17 00:00:00 2001 From: Rajeh Taher Date: Fri, 3 Oct 2025 00:05:01 +0300 Subject: [PATCH] decode-wa-message, process-message: Fix @hosted lids processing --- src/Signal/lid-mapping.ts | 4 +--- src/Socket/messages-recv.ts | 2 -- src/Socket/messages-send.ts | 3 ++- src/Socket/socket.ts | 2 +- src/Utils/decode-wa-message.ts | 10 ++++++---- src/Utils/process-message.ts | 32 +++++++++++++++++++++++++++++--- 6 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/Signal/lid-mapping.ts b/src/Signal/lid-mapping.ts index 39c8cd7a..f80dfec4 100644 --- a/src/Signal/lid-mapping.ts +++ b/src/Signal/lid-mapping.ts @@ -113,7 +113,7 @@ export class LIDMappingStore { } else { this.logger.trace(`No LID mapping found for PN user ${pnUser}; batch getting from USync`) usyncFetch.push(pn) - continue; + continue } } @@ -131,9 +131,7 @@ export class LIDMappingStore { successfulPairs[pn] = { lid: deviceSpecificLid, pn } } - console.log(this.pnToLIDFunc) if (usyncFetch.length > 0) { - console.log(usyncFetch) const result = await this.pnToLIDFunc?.(usyncFetch) // this function already adds LIDs to mapping if (result && result.length > 0) { this.storeLIDPNMappings(result) diff --git a/src/Socket/messages-recv.ts b/src/Socket/messages-recv.ts index 043c1c68..363a11fc 100644 --- a/src/Socket/messages-recv.ts +++ b/src/Socket/messages-recv.ts @@ -1122,7 +1122,6 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => { decrypt } = decryptMessageNode(node, authState.creds.me!.id, authState.creds.me!.lid || '', signalRepository, logger) - const alt = msg.key.participantAlt || msg.key.remoteJidAlt // store new mappings we didn't have before if (!!alt) { @@ -1235,7 +1234,6 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => { cleanMessage(msg, authState.creds.me!.id) - await upsertMessage(msg, node.attrs.offline ? 'append' : 'notify') }) ]) diff --git a/src/Socket/messages-send.ts b/src/Socket/messages-send.ts index a38ed728..2f83e4c3 100644 --- a/src/Socket/messages-send.ts +++ b/src/Socket/messages-send.ts @@ -295,8 +295,9 @@ export const makeMessagesSocket = (config: SocketConfig) => { const lidResults = result.list.filter(a => !!a.lid) if (lidResults.length > 0) { logger.trace('Storing LID maps from device call') - await signalRepository.lidMapping.storeLIDPNMappings(lidResults.map(a => ({lid: a.lid as string, pn: a.id}))) + await signalRepository.lidMapping.storeLIDPNMappings(lidResults.map(a => ({ lid: a.lid as string, pn: a.id }))) } + const extracted = extractDeviceJids(result?.list, authState.creds.me!.id, ignoreZeroDevices) const deviceMap: { [_: string]: FullJid[] } = {} diff --git a/src/Socket/socket.ts b/src/Socket/socket.ts index 316baf3f..689558bc 100644 --- a/src/Socket/socket.ts +++ b/src/Socket/socket.ts @@ -289,7 +289,7 @@ export const makeSocket = (config: SocketConfig) => { } const pnFromLIDUSync = async (jids: string[]): Promise => { - let usyncQuery = new USyncQuery().withLIDProtocol().withContext('background') + const usyncQuery = new USyncQuery().withLIDProtocol().withContext('background') for (const jid of jids) { if (isLidUser(jid)) { diff --git a/src/Utils/decode-wa-message.ts b/src/Utils/decode-wa-message.ts index 0f1c5fd3..8e1991cd 100644 --- a/src/Utils/decode-wa-message.ts +++ b/src/Utils/decode-wa-message.ts @@ -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 }) diff --git a/src/Utils/process-message.ts b/src/Utils/process-message.ts index 07a835a5..3384c24c 100644 --- a/src/Utils/process-message.ts +++ b/src/Utils/process-message.ts @@ -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