From 9f1d0c4a433ea5daa56b2fbb34d56be6f1cec4f6 Mon Sep 17 00:00:00 2001 From: Renato Alcara Date: Sun, 15 Feb 2026 23:12:14 -0300 Subject: [PATCH 1/2] fix(chats): add LID/PN dual identifier validation for updateBlockStatus WhatsApp now requires both LID and PN JID when blocking a user. Resolves identifiers via signalRepository.lidMapping and sends both for block operations. Unblock only sends LID as required by protocol. Based on WhiskeySockets/Baileys#2265 Co-Authored-By: Claude Opus 4.6 --- src/Socket/chats.ts | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/src/Socket/chats.ts b/src/Socket/chats.ts index 03db6e82..73dabfbc 100644 --- a/src/Socket/chats.ts +++ b/src/Socket/chats.ts @@ -431,6 +431,42 @@ export const makeChatsSocket = (config: SocketConfig) => { } const updateBlockStatus = async (jid: string, action: 'block' | 'unblock') => { + let lid: string + let pn_jid: string | undefined + + if (isLidUser(jid)) { + lid = jid + if (action === 'block') { + const pn = await signalRepository.lidMapping.getPNForLID(jid) + if (!pn) { + throw new Boom(`Unable to resolve PN JID for LID: ${jid}`) + } + + pn_jid = jidNormalizedUser(pn) + } + } else if (isPnUser(jid)) { + const mapped = await signalRepository.lidMapping.getLIDForPN(jid) + if (!mapped) { + throw new Boom(`Unable to resolve LID for PN JID: ${jid}`) + } + + lid = mapped + if (action === 'block') { + pn_jid = jidNormalizedUser(jid) + } + } else { + throw new Boom(`Invalid jid for block/unblock: ${jid}`) + } + + const itemAttrs: { action: 'block' | 'unblock'; jid: string; pn_jid?: string } = { + action, + jid: lid + } + + if (action === 'block' && pn_jid) { + itemAttrs.pn_jid = pn_jid + } + await query({ tag: 'iq', attrs: { @@ -441,10 +477,7 @@ export const makeChatsSocket = (config: SocketConfig) => { content: [ { tag: 'item', - attrs: { - action, - jid - } + attrs: itemAttrs } ] }) From 8f4e10289bb0051bea797a2854e65c1f29a48af2 Mon Sep 17 00:00:00 2001 From: Renato Alcara Date: Sun, 15 Feb 2026 23:22:34 -0300 Subject: [PATCH 2/2] fix(chats): normalize JID, use hosted-aware checks, add statusCode to errors Address review feedback on PR #186: - Normalize JID with jidNormalizedUser() before validation to accept @c.us format - Use isAnyPnUser/isAnyLidUser instead of isPnUser/isLidUser to support hosted JIDs - Add { statusCode: 400 } to Boom errors for proper client error classification Co-Authored-By: Claude Opus 4.6 --- src/Socket/chats.ts | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/Socket/chats.ts b/src/Socket/chats.ts index 73dabfbc..07a36845 100644 --- a/src/Socket/chats.ts +++ b/src/Socket/chats.ts @@ -50,8 +50,8 @@ import { type BinaryNode, getBinaryNodeChild, getBinaryNodeChildren, - isLidUser, - isPnUser, + isAnyLidUser, + isAnyPnUser, jidDecode, jidNormalizedUser, reduceBinaryNodeToDictionary, @@ -431,31 +431,32 @@ export const makeChatsSocket = (config: SocketConfig) => { } const updateBlockStatus = async (jid: string, action: 'block' | 'unblock') => { + const normalizedJid = jidNormalizedUser(jid) let lid: string let pn_jid: string | undefined - if (isLidUser(jid)) { - lid = jid + if (isAnyLidUser(normalizedJid)) { + lid = normalizedJid if (action === 'block') { - const pn = await signalRepository.lidMapping.getPNForLID(jid) + const pn = await signalRepository.lidMapping.getPNForLID(normalizedJid) if (!pn) { - throw new Boom(`Unable to resolve PN JID for LID: ${jid}`) + throw new Boom(`Unable to resolve PN JID for LID: ${jid}`, { statusCode: 400 }) } pn_jid = jidNormalizedUser(pn) } - } else if (isPnUser(jid)) { - const mapped = await signalRepository.lidMapping.getLIDForPN(jid) + } else if (isAnyPnUser(normalizedJid)) { + const mapped = await signalRepository.lidMapping.getLIDForPN(normalizedJid) if (!mapped) { - throw new Boom(`Unable to resolve LID for PN JID: ${jid}`) + throw new Boom(`Unable to resolve LID for PN JID: ${jid}`, { statusCode: 400 }) } lid = mapped if (action === 'block') { - pn_jid = jidNormalizedUser(jid) + pn_jid = normalizedJid } } else { - throw new Boom(`Invalid jid for block/unblock: ${jid}`) + throw new Boom(`Invalid jid for block/unblock: ${jid}`, { statusCode: 400 }) } const itemAttrs: { action: 'block' | 'unblock'; jid: string; pn_jid?: string } = { @@ -734,7 +735,7 @@ export const makeChatsSocket = (config: SocketConfig) => { // and never for own profile pic (Chat model for self has no tcToken). // Including tctoken for own JID causes the server to never respond. const normalizedJid = jidNormalizedUser(jid) - const isUserJid = isPnUser(normalizedJid) || isLidUser(normalizedJid) + const isUserJid = isAnyPnUser(normalizedJid) || isAnyLidUser(normalizedJid) const me = authState.creds.me const isSelf = me && (normalizedJid === jidNormalizedUser(me.id) || (me.lid && normalizedJid === jidNormalizedUser(me.lid)))