From cc3cd17392a10a70508e415a90a471e7b917a563 Mon Sep 17 00:00:00 2001 From: Rajeh Taher Date: Mon, 20 Oct 2025 00:05:54 +0300 Subject: [PATCH] cleanup: remove string lid / jid refs and improve hosted support --- src/Signal/lid-mapping.ts | 2 +- src/Socket/chats.ts | 2 +- src/Socket/messages-recv.ts | 22 +++------------------- src/Socket/messages-send.ts | 6 +++--- src/Utils/decode-wa-message.ts | 12 ++++++------ src/Utils/noise-handler.ts | 4 ++-- 6 files changed, 16 insertions(+), 32 deletions(-) diff --git a/src/Signal/lid-mapping.ts b/src/Signal/lid-mapping.ts index 960b80eb..ac02273c 100644 --- a/src/Signal/lid-mapping.ts +++ b/src/Signal/lid-mapping.ts @@ -122,7 +122,7 @@ export class LIDMappingStore { this.logger.trace(`No LID mapping found for PN user ${pnUser}; batch getting from USync`) const device = decoded.device || 0 let normalizedPn = jidNormalizedUser(pn) - if (isHostedLidUser(normalizedPn) || isHostedPnUser(normalizedPn)) { + if (isHostedPnUser(normalizedPn)) { normalizedPn = `${pnUser}@s.whatsapp.net` } diff --git a/src/Socket/chats.ts b/src/Socket/chats.ts index 7e900480..cae897fd 100644 --- a/src/Socket/chats.ts +++ b/src/Socket/chats.ts @@ -707,7 +707,7 @@ export const makeChatsSocket = (config: SocketConfig) => { const jid = attrs.from const participant = attrs.participant || attrs.from - if (shouldIgnoreJid(jid!) && jid !== '@s.whatsapp.net') { + if (shouldIgnoreJid(jid!) && jid !== S_WHATSAPP_NET) { return } diff --git a/src/Socket/messages-recv.ts b/src/Socket/messages-recv.ts index 31fffc23..68a09a02 100644 --- a/src/Socket/messages-recv.ts +++ b/src/Socket/messages-recv.ts @@ -1021,7 +1021,7 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => { participant: attrs.participant } - if (shouldIgnoreJid(remoteJid!) && remoteJid !== '@s.whatsapp.net') { + if (shouldIgnoreJid(remoteJid!) && remoteJid !== S_WHATSAPP_NET) { logger.debug({ remoteJid }, 'ignoring receipt from jid') await sendMessageAck(node) return @@ -1101,7 +1101,7 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => { const handleNotification = async (node: BinaryNode) => { const remoteJid = node.attrs.from - if (shouldIgnoreJid(remoteJid!) && remoteJid !== '@s.whatsapp.net') { + if (shouldIgnoreJid(remoteJid!) && remoteJid !== S_WHATSAPP_NET) { logger.debug({ remoteJid, id: node.attrs.id }, 'ignored notification') await sendMessageAck(node) return @@ -1137,7 +1137,7 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => { } const handleMessage = async (node: BinaryNode) => { - if (shouldIgnoreJid(node.attrs.from!) && node.attrs.from !== '@s.whatsapp.net') { + if (shouldIgnoreJid(node.attrs.from!) && node.attrs.from !== S_WHATSAPP_NET) { logger.debug({ key: node.attrs.key }, 'ignored message') await sendMessageAck(node, NACK_REASONS.UnhandledError) return @@ -1290,22 +1290,6 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => { const from = infoChild.attrs.from! || infoChild.attrs['call-creator']! status = getCallStatusFromNode(infoChild) - if (isLidUser(from) && infoChild.tag === 'relaylatency') { - const verify = await callOfferCache.get(callId) - if (!verify) { - status = 'offer' - const callLid: WACallEvent = { - chatId: attrs.from!, - from, - id: callId, - date: new Date(+attrs.t! * 1000), - offline: !!attrs.offline, - status - } - await callOfferCache.set(callId, callLid) - } - } - const call: WACallEvent = { chatId: attrs.from!, from, diff --git a/src/Socket/messages-send.ts b/src/Socket/messages-send.ts index 73b29a87..cef7fc99 100644 --- a/src/Socket/messages-send.ts +++ b/src/Socket/messages-send.ts @@ -281,7 +281,7 @@ export const makeMessagesSocket = (config: SocketConfig) => { const requestedLidUsers = new Set() for (const jid of toFetch) { - if (jid.includes('@lid') || jid.includes('@hosted.lid')) { + if (isLidUser(jid) || isHostedLidUser(jid)) { const user = jidDecode(jid)?.user if (user) requestedLidUsers.add(user) } @@ -405,10 +405,10 @@ export const makeMessagesSocket = (config: SocketConfig) => { if (jidsRequiringFetch.length) { // LID if mapped, otherwise original const wireJids = [ - ...jidsRequiringFetch.filter(jid => !!jid.includes('@lid') || !!jid.includes('@hosted.lid')), + ...jidsRequiringFetch.filter(jid => !!isLidUser(jid) || !!isHostedLidUser(jid)), ...( (await signalRepository.lidMapping.getLIDsForPNs( - jidsRequiringFetch.filter(jid => !!jid.includes('@s.whatsapp.net') || !!jid.includes('@hosted')) + jidsRequiringFetch.filter(jid => !!isPnUser(jid) || !!isHostedPnUser(jid) )) || [] ).map(a => a.lid) ] diff --git a/src/Utils/decode-wa-message.ts b/src/Utils/decode-wa-message.ts index 621a30f0..99d7dc7c 100644 --- a/src/Utils/decode-wa-message.ts +++ b/src/Utils/decode-wa-message.ts @@ -19,8 +19,8 @@ import { import { unpadRandomMax16 } from './generics' import type { ILogger } from './logger' -const getDecryptionJid = async (sender: string, repository: SignalRepositoryWithLIDStore): Promise => { - if (sender.includes('@lid')) { +export const getDecryptionJid = async (sender: string, repository: SignalRepositoryWithLIDStore): Promise => { + if (isLidUser(sender) || isHostedLidUser(sender)) { return sender } @@ -35,6 +35,7 @@ const storeMappingFromEnvelope = async ( decryptionJid: string, logger: ILogger ): Promise => { + // TODO: Handle hosted IDs const { senderAlt } = extractAddressingContext(stanza) if (senderAlt && isLidUser(senderAlt) && isPnUser(sender) && decryptionJid === sender) { @@ -259,12 +260,11 @@ export const decryptMessageNode = ( let msgBuffer: Uint8Array - const user = isPnUser(sender) ? sender : author // TODO: flaky logic - - const decryptionJid = await getDecryptionJid(user, repository) + const decryptionJid = await getDecryptionJid(author, repository) if (tag !== 'plaintext') { - await storeMappingFromEnvelope(stanza, user, repository, decryptionJid, logger) + // TODO: Handle hosted devices + await storeMappingFromEnvelope(stanza, author, repository, decryptionJid, logger) } try { diff --git a/src/Utils/noise-handler.ts b/src/Utils/noise-handler.ts index d0f5e1c1..6e2d632e 100644 --- a/src/Utils/noise-handler.ts +++ b/src/Utils/noise-handler.ts @@ -112,8 +112,8 @@ export const makeNoiseHandler = ({ const certDecoded = decrypt(serverHello!.payload!) - const { intermediate: certIntermediate } = proto.CertChain.decode(certDecoded) - + const { intermediate: certIntermediate, leaf } = proto.CertChain.decode(certDecoded) + // TODO: handle this leaf stuff const { issuerSerial } = proto.CertChain.NoiseCertificate.Details.decode(certIntermediate!.details!) if (issuerSerial !== WA_CERT_DETAILS.SERIAL) {