From 09263aa3d2882edb2ee843bc595b817241a782e1 Mon Sep 17 00:00:00 2001 From: Rajeh Taher Date: Sun, 5 Oct 2025 22:51:13 +0300 Subject: [PATCH] libsignal: Process @hosted conversions to @hosted.lid --- src/Signal/Group/sender-key-message.ts | 7 ++++--- src/Signal/libsignal.ts | 23 ++++++++++++++--------- src/Socket/messages-recv.ts | 6 ++++-- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/Signal/Group/sender-key-message.ts b/src/Signal/Group/sender-key-message.ts index 22244c7d..e6d8ac14 100644 --- a/src/Signal/Group/sender-key-message.ts +++ b/src/Signal/Group/sender-key-message.ts @@ -36,9 +36,10 @@ export class SenderKeyMessage extends CiphertextMessage { this.messageVersion = (version & 0xff) >> 4 this.keyId = senderKeyMessage.id this.iteration = senderKeyMessage.iteration - this.ciphertext = typeof senderKeyMessage.ciphertext === 'string' - ? Buffer.from(senderKeyMessage.ciphertext, 'base64') - : senderKeyMessage.ciphertext + this.ciphertext = + typeof senderKeyMessage.ciphertext === 'string' + ? Buffer.from(senderKeyMessage.ciphertext, 'base64') + : senderKeyMessage.ciphertext this.signature = signature } else { const version = (((this.CURRENT_VERSION << 4) | this.CURRENT_VERSION) & 0xff) % 256 diff --git a/src/Signal/libsignal.ts b/src/Signal/libsignal.ts index 02b675ae..719991f1 100644 --- a/src/Signal/libsignal.ts +++ b/src/Signal/libsignal.ts @@ -329,7 +329,7 @@ const jidToSignalProtocolAddress = (jid: string): libsignal.ProtocolAddress => { ) } - let signalUser = domainType !== WAJIDDomains.WHATSAPP ? `${user}_${domainType}`: user; + const signalUser = domainType !== WAJIDDomains.WHATSAPP ? `${user}_${domainType}` : user const finalDevice = device || 0 return new libsignal.ProtocolAddress(signalUser, finalDevice) @@ -344,14 +344,19 @@ function signalStorage( lidMapping: LIDMappingStore ): SenderKeyStore & libsignal.SignalStorage { // Shared function to resolve PN signal address to LID if mapping exists - const resolveSignalAddress = async (id: string): Promise => { - if (id.includes('.') && !id.includes('_1')) { - const parts = id.split('.') - const device = parts[1] || '0' - const pnJid = device === '0' ? `${parts[0]}@s.whatsapp.net` : `${parts[0]}:${device}@s.whatsapp.net` + const resolveLIDSignalAddress = async (id: string): Promise => { + if (id.includes('.')) { + const [deviceId, domainType_] = id.split('_') + const domainType = parseInt(domainType_ || '0') + const [user, device] = deviceId!.split('.') - const lidForPN = await lidMapping.getLIDForPN(pnJid) + if (domainType === WAJIDDomains.LID || domainType === WAJIDDomains.HOSTED_LID) return id + + const pnJid = `${user!}${device !== '0' ? `:${device}` : ''}@s.whatsapp.net` + + let lidForPN = await lidMapping.getLIDForPN(pnJid) if (lidForPN?.includes('@lid')) { + if (domainType === WAJIDDomains.HOSTED) lidForPN = `${lidForPN.split('@')[0]}@hosted.lid` const lidAddr = jidToSignalProtocolAddress(lidForPN) return lidAddr.toString() } @@ -363,7 +368,7 @@ function signalStorage( return { loadSession: async (id: string) => { try { - const wireJid = await resolveSignalAddress(id) + const wireJid = await resolveLIDSignalAddress(id) const { [wireJid]: sess } = await keys.get('session', [wireJid]) if (sess) { @@ -376,7 +381,7 @@ function signalStorage( return null }, storeSession: async (id: string, session: libsignal.SessionRecord) => { - const wireJid = await resolveSignalAddress(id) + const wireJid = await resolveLIDSignalAddress(id) await keys.set({ session: { [wireJid]: session.serialize() } }) }, isTrustedIdentity: () => { diff --git a/src/Socket/messages-recv.ts b/src/Socket/messages-recv.ts index d014f7ec..fd89e973 100644 --- a/src/Socket/messages-recv.ts +++ b/src/Socket/messages-recv.ts @@ -448,7 +448,9 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => { messageRetryManager.schedulePhoneRequest(msgId, async () => { try { const requestId = await requestPlaceholderResend(msgKey) - logger.debug(`sendRetryRequest: requested placeholder resend (${requestId}) for message ${msgId} (scheduled)`) + logger.debug( + `sendRetryRequest: requested placeholder resend (${requestId}) for message ${msgId} (scheduled)` + ) } catch (error) { logger.warn({ error, msgId }, 'failed to send scheduled phone request') } @@ -478,7 +480,7 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => { t: node.attrs.t!, v: '1', // ADD ERROR FIELD - error: '0' + error: '0' } }, {