@alannxd/baileys 6.0.5 → 6.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/WAProto/fix-import.js +29 -0
- package/WAProto/index.js +160 -201
- package/engine-requirements.js +1 -1
- package/lib/Defaults/baileys-version.json +3 -0
- package/lib/Defaults/index.d.ts +15 -37
- package/lib/Defaults/index.js +136 -119
- package/lib/Defaults/phonenumber-mcc.json +223 -0
- package/lib/Signal/Group/ciphertext-message.d.ts +0 -1
- package/lib/Signal/Group/ciphertext-message.js +5 -2
- package/lib/Signal/Group/group-session-builder.d.ts +3 -4
- package/lib/Signal/Group/group-session-builder.js +41 -7
- package/lib/Signal/Group/group_cipher.d.ts +4 -4
- package/lib/Signal/Group/group_cipher.js +51 -37
- package/lib/Signal/Group/index.d.ts +11 -12
- package/lib/Signal/Group/index.js +57 -12
- package/lib/Signal/Group/keyhelper.d.ts +1 -2
- package/lib/Signal/Group/keyhelper.js +44 -7
- package/lib/Signal/Group/queue-job.d.ts +1 -0
- package/lib/Signal/Group/queue-job.js +57 -0
- package/lib/Signal/Group/sender-chain-key.d.ts +2 -3
- package/lib/Signal/Group/sender-chain-key.js +15 -7
- package/lib/Signal/Group/sender-key-distribution-message.d.ts +1 -2
- package/lib/Signal/Group/sender-key-distribution-message.js +11 -8
- package/lib/Signal/Group/sender-key-message.d.ts +1 -2
- package/lib/Signal/Group/sender-key-message.js +12 -9
- package/lib/Signal/Group/sender-key-name.d.ts +0 -1
- package/lib/Signal/Group/sender-key-name.js +5 -2
- package/lib/Signal/Group/sender-key-record.d.ts +2 -3
- package/lib/Signal/Group/sender-key-record.js +21 -9
- package/lib/Signal/Group/sender-key-state.d.ts +6 -7
- package/lib/Signal/Group/sender-key-state.js +42 -27
- package/lib/Signal/Group/sender-message-key.d.ts +0 -1
- package/lib/Signal/Group/sender-message-key.js +7 -4
- package/lib/Signal/libsignal.d.ts +3 -5
- package/lib/Signal/libsignal.js +90 -347
- package/lib/Socket/Client/{types.d.ts → abstract-socket-client.d.ts} +5 -4
- package/lib/Socket/Client/abstract-socket-client.js +13 -0
- package/lib/Socket/Client/index.d.ts +3 -3
- package/lib/Socket/Client/index.js +19 -3
- package/lib/Socket/Client/mobile-socket-client.d.ts +13 -0
- package/lib/Socket/Client/mobile-socket-client.js +65 -0
- package/lib/Socket/Client/{websocket.d.ts → web-socket-client.d.ts} +2 -3
- package/lib/Socket/Client/web-socket-client.js +62 -0
- package/lib/Socket/business.d.ts +108 -154
- package/lib/Socket/business.js +43 -162
- package/lib/Socket/chats.d.ts +239 -96
- package/lib/Socket/chats.js +427 -627
- package/lib/Socket/communities.d.ts +146 -239
- package/lib/Socket/communities.js +80 -90
- package/lib/Socket/groups.d.ts +57 -104
- package/lib/Socket/groups.js +161 -154
- package/lib/Socket/index.d.ts +115 -202
- package/lib/Socket/index.js +10 -11
- package/lib/Socket/luxu.d.ts +266 -22
- package/lib/Socket/luxu.js +465 -422
- package/lib/Socket/messages-recv.d.ts +84 -136
- package/lib/Socket/messages-recv.js +615 -1421
- package/lib/Socket/messages-send.d.ts +126 -142
- package/lib/Socket/messages-send.js +671 -878
- package/lib/Socket/newsletter.d.ts +85 -121
- package/lib/Socket/newsletter.js +272 -147
- package/lib/Socket/registration.d.ts +267 -0
- package/lib/Socket/registration.js +166 -0
- package/lib/Socket/socket.d.ts +19 -34
- package/lib/Socket/socket.js +313 -544
- package/lib/Socket/usync.d.ts +36 -0
- package/lib/Socket/usync.js +70 -0
- package/lib/Store/index.d.ts +3 -10
- package/lib/Store/index.js +10 -10
- package/lib/Store/make-cache-manager-store.d.ts +11 -17
- package/lib/Store/make-cache-manager-store.js +41 -43
- package/lib/Store/make-in-memory-store.d.ts +118 -39
- package/lib/Store/make-in-memory-store.js +341 -112
- package/lib/Store/make-ordered-dictionary.d.ts +10 -11
- package/lib/Store/make-ordered-dictionary.js +20 -14
- package/lib/Store/object-repository.d.ts +9 -10
- package/lib/Store/object-repository.js +6 -11
- package/lib/Types/Auth.d.ts +12 -19
- package/lib/Types/Auth.js +2 -2
- package/lib/Types/Call.d.ts +1 -3
- package/lib/Types/Call.js +2 -2
- package/lib/Types/Chat.d.ts +13 -35
- package/lib/Types/Chat.js +4 -8
- package/lib/Types/Contact.d.ts +1 -8
- package/lib/Types/Contact.js +2 -2
- package/lib/Types/Events.d.ts +17 -116
- package/lib/Types/Events.js +2 -2
- package/lib/Types/GroupMetadata.d.ts +5 -21
- package/lib/Types/GroupMetadata.js +2 -2
- package/lib/Types/Label.d.ts +0 -12
- package/lib/Types/Label.js +5 -3
- package/lib/Types/LabelAssociation.d.ts +0 -1
- package/lib/Types/LabelAssociation.js +5 -3
- package/lib/Types/Message.d.ts +58 -105
- package/lib/Types/Message.js +9 -11
- package/lib/Types/Newsletter.d.ts +103 -0
- package/lib/Types/Newsletter.js +38 -0
- package/lib/Types/Product.d.ts +1 -2
- package/lib/Types/Product.js +2 -2
- package/lib/Types/Signal.d.ts +2 -32
- package/lib/Types/Signal.js +2 -2
- package/lib/Types/Socket.d.ts +25 -50
- package/lib/Types/Socket.js +2 -3
- package/lib/Types/State.d.ts +2 -72
- package/lib/Types/State.js +2 -56
- package/lib/Types/USync.d.ts +2 -3
- package/lib/Types/USync.js +2 -2
- package/lib/Types/index.d.ts +14 -22
- package/lib/Types/index.js +31 -15
- package/lib/Utils/auth-utils.d.ts +6 -12
- package/lib/Utils/auth-utils.js +143 -239
- package/lib/Utils/baileys-event-stream.d.ts +16 -0
- package/lib/Utils/baileys-event-stream.js +63 -0
- package/lib/Utils/business.d.ts +2 -3
- package/lib/Utils/business.js +69 -66
- package/lib/Utils/chat-utils.d.ts +23 -52
- package/lib/Utils/chat-utils.js +253 -396
- package/lib/Utils/crypto.d.ts +22 -18
- package/lib/Utils/crypto.js +90 -57
- package/lib/Utils/decode-wa-message.d.ts +8 -55
- package/lib/Utils/decode-wa-message.js +84 -203
- package/lib/Utils/event-buffer.d.ts +8 -9
- package/lib/Utils/event-buffer.js +77 -185
- package/lib/Utils/generics.d.ts +29 -28
- package/lib/Utils/generics.js +210 -180
- package/lib/Utils/history.d.ts +9 -18
- package/lib/Utils/history.js +55 -93
- package/lib/Utils/index.d.ts +17 -22
- package/lib/Utils/index.js +33 -22
- package/lib/Utils/link-preview.d.ts +5 -5
- package/lib/Utils/link-preview.js +24 -16
- package/lib/Utils/logger.d.ts +3 -11
- package/lib/Utils/logger.js +7 -3
- package/lib/Utils/lt-hash.d.ts +12 -8
- package/lib/Utils/lt-hash.js +46 -3
- package/lib/Utils/make-mutex.d.ts +2 -4
- package/lib/Utils/make-mutex.js +34 -24
- package/lib/Utils/messages-media.d.ts +44 -61
- package/lib/Utils/messages-media.js +482 -451
- package/lib/Utils/messages.d.ts +18 -32
- package/lib/Utils/messages.js +369 -458
- package/lib/Utils/noise-handler.d.ts +14 -13
- package/lib/Utils/noise-handler.js +99 -145
- package/lib/Utils/process-message.d.ts +12 -31
- package/lib/Utils/process-message.js +150 -459
- package/lib/Utils/signal.d.ts +5 -20
- package/lib/Utils/signal.js +72 -120
- package/lib/Utils/use-multi-file-auth-state.d.ts +2 -2
- package/lib/Utils/use-multi-file-auth-state.js +27 -29
- package/lib/Utils/validate-connection.d.ts +7 -7
- package/lib/Utils/validate-connection.js +99 -73
- package/lib/WABinary/constants.d.ts +27 -25
- package/lib/WABinary/constants.js +20 -1281
- package/lib/WABinary/decode.d.ts +5 -5
- package/lib/WABinary/decode.js +42 -52
- package/lib/WABinary/encode.d.ts +3 -3
- package/lib/WABinary/encode.js +155 -110
- package/lib/WABinary/generic-utils.d.ts +7 -8
- package/lib/WABinary/generic-utils.js +49 -48
- package/lib/WABinary/index.d.ts +5 -6
- package/lib/WABinary/index.js +21 -6
- package/lib/WABinary/jid-utils.d.ts +8 -25
- package/lib/WABinary/jid-utils.js +40 -74
- package/lib/WABinary/types.d.ts +1 -2
- package/lib/WABinary/types.js +2 -2
- package/lib/WAM/BinaryInfo.d.ts +11 -3
- package/lib/WAM/BinaryInfo.js +5 -2
- package/lib/WAM/constants.d.ts +3 -5
- package/lib/WAM/constants.js +11958 -19461
- package/lib/WAM/encode.d.ts +3 -3
- package/lib/WAM/encode.js +22 -17
- package/lib/WAM/index.d.ts +3 -4
- package/lib/WAM/index.js +19 -4
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +3 -4
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +13 -33
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +2 -3
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +14 -11
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +2 -3
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +12 -9
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +2 -3
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js +13 -9
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +3 -4
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +22 -20
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +3 -5
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +8 -13
- package/lib/WAUSync/Protocols/index.d.ts +4 -6
- package/lib/WAUSync/Protocols/index.js +20 -6
- package/lib/WAUSync/USyncQuery.d.ts +4 -6
- package/lib/WAUSync/USyncQuery.js +35 -44
- package/lib/WAUSync/USyncUser.d.ts +5 -10
- package/lib/WAUSync/USyncUser.js +5 -10
- package/lib/WAUSync/index.js +19 -4
- package/lib/index.d.ts +9 -10
- package/lib/index.js +34 -12
- package/package.json +50 -83
- package/WAProto/GenerateStatics.sh +0 -3
- package/WAProto/WAProto.proto +0 -5479
- package/WAProto/fix-imports.js +0 -85
- package/WAProto/index.d.ts +0 -14017
- package/lib/Signal/lid-mapping.d.ts +0 -23
- package/lib/Signal/lid-mapping.js +0 -277
- package/lib/Socket/Client/types.js +0 -11
- package/lib/Socket/Client/websocket.js +0 -54
- package/lib/Socket/mex.d.ts +0 -3
- package/lib/Socket/mex.js +0 -42
- package/lib/Store/keyed-db.d.ts +0 -22
- package/lib/Store/keyed-db.js +0 -108
- package/lib/Types/Bussines.d.ts +0 -25
- package/lib/Types/Bussines.js +0 -2
- package/lib/Types/Mex.d.ts +0 -141
- package/lib/Types/Mex.js +0 -37
- package/lib/Utils/browser-utils.d.ts +0 -4
- package/lib/Utils/browser-utils.js +0 -28
- package/lib/Utils/companion-reg-client-utils.d.ts +0 -17
- package/lib/Utils/companion-reg-client-utils.js +0 -35
- package/lib/Utils/identity-change-handler.d.ts +0 -44
- package/lib/Utils/identity-change-handler.js +0 -50
- package/lib/Utils/message-retry-manager.d.ts +0 -115
- package/lib/Utils/message-retry-manager.js +0 -265
- package/lib/Utils/offline-node-processor.d.ts +0 -17
- package/lib/Utils/offline-node-processor.js +0 -40
- package/lib/Utils/pre-key-manager.d.ts +0 -28
- package/lib/Utils/pre-key-manager.js +0 -106
- package/lib/Utils/reporting-utils.d.ts +0 -11
- package/lib/Utils/reporting-utils.js +0 -258
- package/lib/Utils/stanza-ack.d.ts +0 -11
- package/lib/Utils/stanza-ack.js +0 -38
- package/lib/Utils/sync-action-utils.d.ts +0 -19
- package/lib/Utils/sync-action-utils.js +0 -49
- package/lib/Utils/tc-token-utils.d.ts +0 -37
- package/lib/Utils/tc-token-utils.js +0 -163
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +0 -10
- package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +0 -25
- package/lib/WAUSync/index.d.ts +0 -4
|
@@ -1,87 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.decryptPollVote = exports.getChatId = exports.shouldIncrementChatUnread = exports.isRealMessage = exports.cleanMessage = void 0;
|
|
4
|
+
const WAProto_1 = require("../../WAProto");
|
|
5
|
+
const Types_1 = require("../Types");
|
|
6
|
+
const messages_1 = require("../Utils/messages");
|
|
7
|
+
const WABinary_1 = require("../WABinary");
|
|
8
|
+
const crypto_1 = require("./crypto");
|
|
9
|
+
const generics_1 = require("./generics");
|
|
10
|
+
const history_1 = require("./history");
|
|
10
11
|
const REAL_MSG_STUB_TYPES = new Set([
|
|
11
|
-
WAMessageStubType.CALL_MISSED_GROUP_VIDEO,
|
|
12
|
-
WAMessageStubType.CALL_MISSED_GROUP_VOICE,
|
|
13
|
-
WAMessageStubType.CALL_MISSED_VIDEO,
|
|
14
|
-
WAMessageStubType.CALL_MISSED_VOICE
|
|
12
|
+
Types_1.WAMessageStubType.CALL_MISSED_GROUP_VIDEO,
|
|
13
|
+
Types_1.WAMessageStubType.CALL_MISSED_GROUP_VOICE,
|
|
14
|
+
Types_1.WAMessageStubType.CALL_MISSED_VIDEO,
|
|
15
|
+
Types_1.WAMessageStubType.CALL_MISSED_VOICE
|
|
16
|
+
]);
|
|
17
|
+
const REAL_MSG_REQ_ME_STUB_TYPES = new Set([
|
|
18
|
+
Types_1.WAMessageStubType.GROUP_PARTICIPANT_ADD
|
|
15
19
|
]);
|
|
16
|
-
const REAL_MSG_REQ_ME_STUB_TYPES = new Set([WAMessageStubType.GROUP_PARTICIPANT_ADD]);
|
|
17
|
-
async function storeTcTokensFromHistorySync(chats, signalRepository, keyStore, logger) {
|
|
18
|
-
const getLIDForPN = signalRepository.lidMapping.getLIDForPN.bind(signalRepository.lidMapping);
|
|
19
|
-
const candidates = [];
|
|
20
|
-
for (const chat of chats) {
|
|
21
|
-
const ts = chat.tcTokenTimestamp ? toNumber(chat.tcTokenTimestamp) : 0;
|
|
22
|
-
if (chat.tcToken?.length && ts > 0) {
|
|
23
|
-
const jid = jidNormalizedUser(chat.id);
|
|
24
|
-
const storageJid = await resolveTcTokenJid(jid, getLIDForPN);
|
|
25
|
-
candidates.push({
|
|
26
|
-
storageJid,
|
|
27
|
-
token: Buffer.from(chat.tcToken),
|
|
28
|
-
ts,
|
|
29
|
-
senderTs: chat.tcTokenSenderTimestamp ? toNumber(chat.tcTokenSenderTimestamp) : undefined
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
if (!candidates.length) {
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
const jids = candidates.map(c => c.storageJid);
|
|
37
|
-
const existing = await keyStore.get('tctoken', jids);
|
|
38
|
-
const entries = {};
|
|
39
|
-
for (const c of candidates) {
|
|
40
|
-
const existingEntry = existing[c.storageJid];
|
|
41
|
-
const existingTs = existingEntry?.timestamp ? Number(existingEntry.timestamp) : 0;
|
|
42
|
-
if (existingTs > 0 && existingTs >= c.ts) {
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
entries[c.storageJid] = {
|
|
46
|
-
...existingEntry,
|
|
47
|
-
token: c.token,
|
|
48
|
-
timestamp: String(c.ts),
|
|
49
|
-
...(c.senderTs !== undefined ? { senderTimestamp: c.senderTs } : {})
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
if (Object.keys(entries).length) {
|
|
53
|
-
logger?.debug({ count: Object.keys(entries).length }, 'storing tctokens from history sync');
|
|
54
|
-
try {
|
|
55
|
-
// Include updated __index so cross-session pruning picks these JIDs up.
|
|
56
|
-
const indexWrite = await buildMergedTcTokenIndexWrite(keyStore, Object.keys(entries));
|
|
57
|
-
await keyStore.set({ tctoken: { ...entries, ...indexWrite } });
|
|
58
|
-
}
|
|
59
|
-
catch (err) {
|
|
60
|
-
logger?.warn({ err }, 'failed to store tctokens from history sync');
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
20
|
/** Cleans a received message to further processing */
|
|
65
|
-
|
|
21
|
+
const cleanMessage = (message, meId) => {
|
|
66
22
|
// ensure remoteJid and participant doesn't have device or agent in it
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
else {
|
|
71
|
-
message.key.remoteJid = jidNormalizedUser(message.key.remoteJid);
|
|
72
|
-
}
|
|
73
|
-
if (isHostedPnUser(message.key.participant) || isHostedLidUser(message.key.participant)) {
|
|
74
|
-
message.key.participant = jidEncode(jidDecode(message.key.participant)?.user, isHostedPnUser(message.key.participant) ? 's.whatsapp.net' : 'lid');
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
message.key.participant = jidNormalizedUser(message.key.participant);
|
|
78
|
-
}
|
|
79
|
-
const content = normalizeMessageContent(message.message);
|
|
23
|
+
message.key.remoteJid = (0, WABinary_1.jidNormalizedUser)(message.key.remoteJid);
|
|
24
|
+
message.key.participant = message.key.participant ? (0, WABinary_1.jidNormalizedUser)(message.key.participant) : undefined;
|
|
25
|
+
const content = (0, messages_1.normalizeMessageContent)(message.message);
|
|
80
26
|
// if the message has a reaction, ensure fromMe & remoteJid are from our perspective
|
|
81
|
-
if (content
|
|
27
|
+
if (content === null || content === void 0 ? void 0 : content.reactionMessage) {
|
|
82
28
|
normaliseKey(content.reactionMessage.key);
|
|
83
29
|
}
|
|
84
|
-
if (content
|
|
30
|
+
if (content === null || content === void 0 ? void 0 : content.pollUpdateMessage) {
|
|
85
31
|
normaliseKey(content.pollUpdateMessage.pollCreationMessageKey);
|
|
86
32
|
}
|
|
87
33
|
function normaliseKey(msgKey) {
|
|
@@ -91,59 +37,54 @@ export const cleanMessage = (message, meId, meLid) => {
|
|
|
91
37
|
// if the sender believed the message being reacted to is not from them
|
|
92
38
|
// we've to correct the key to be from them, or some other participant
|
|
93
39
|
msgKey.fromMe = !msgKey.fromMe
|
|
94
|
-
? areJidsSameUser(msgKey.participant || msgKey.remoteJid, meId)
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
false;
|
|
40
|
+
? (0, WABinary_1.areJidsSameUser)(msgKey.participant || msgKey.remoteJid, meId)
|
|
41
|
+
// if the message being reacted to, was from them
|
|
42
|
+
// fromMe automatically becomes false
|
|
43
|
+
: false;
|
|
99
44
|
// set the remoteJid to being the same as the chat the message came from
|
|
100
|
-
// TODO: investigate inconsistencies
|
|
101
45
|
msgKey.remoteJid = message.key.remoteJid;
|
|
102
46
|
// set participant of the message
|
|
103
47
|
msgKey.participant = msgKey.participant || message.key.participant;
|
|
104
48
|
}
|
|
105
49
|
}
|
|
106
50
|
};
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
!normalizedContent
|
|
51
|
+
exports.cleanMessage = cleanMessage;
|
|
52
|
+
const isRealMessage = (message, meId) => {
|
|
53
|
+
var _a;
|
|
54
|
+
const normalizedContent = (0, messages_1.normalizeMessageContent)(message.message);
|
|
55
|
+
const hasSomeContent = !!(0, messages_1.getContentType)(normalizedContent);
|
|
56
|
+
return (!!normalizedContent
|
|
57
|
+
|| REAL_MSG_STUB_TYPES.has(message.messageStubType)
|
|
58
|
+
|| (REAL_MSG_REQ_ME_STUB_TYPES.has(message.messageStubType)
|
|
59
|
+
&& ((_a = message.messageStubParameters) === null || _a === void 0 ? void 0 : _a.some(p => (0, WABinary_1.areJidsSameUser)(meId, p)))))
|
|
60
|
+
&& hasSomeContent
|
|
61
|
+
&& !(normalizedContent === null || normalizedContent === void 0 ? void 0 : normalizedContent.protocolMessage)
|
|
62
|
+
&& !(normalizedContent === null || normalizedContent === void 0 ? void 0 : normalizedContent.reactionMessage)
|
|
63
|
+
&& !(normalizedContent === null || normalizedContent === void 0 ? void 0 : normalizedContent.pollUpdateMessage);
|
|
118
64
|
};
|
|
119
|
-
|
|
65
|
+
exports.isRealMessage = isRealMessage;
|
|
66
|
+
const shouldIncrementChatUnread = (message) => (!message.key.fromMe && !message.messageStubType);
|
|
67
|
+
exports.shouldIncrementChatUnread = shouldIncrementChatUnread;
|
|
120
68
|
/**
|
|
121
69
|
* Get the ID of the chat from the given key.
|
|
122
70
|
* Typically -- that'll be the remoteJid, but for broadcasts, it'll be the participant
|
|
123
71
|
*/
|
|
124
|
-
|
|
125
|
-
if (
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
if (isJidBroadcast(remoteJid) && !isJidStatusBroadcast(remoteJid) && !fromMe) {
|
|
131
|
-
if (!participant) {
|
|
132
|
-
throw new Boom('Cannot derive chat id: broadcast message key is missing participant', {
|
|
133
|
-
data: { remoteJid, fromMe }
|
|
134
|
-
});
|
|
135
|
-
}
|
|
72
|
+
const getChatId = ({ remoteJid, participant, fromMe }) => {
|
|
73
|
+
if ((0, WABinary_1.isJidBroadcast)(remoteJid)
|
|
74
|
+
&& !(0, WABinary_1.isJidStatusBroadcast)(remoteJid)
|
|
75
|
+
&& !fromMe) {
|
|
136
76
|
return participant;
|
|
137
77
|
}
|
|
138
78
|
return remoteJid;
|
|
139
79
|
};
|
|
80
|
+
exports.getChatId = getChatId;
|
|
140
81
|
/**
|
|
141
82
|
* Decrypt a poll vote
|
|
142
83
|
* @param vote encrypted vote
|
|
143
84
|
* @param ctx additional info about the poll required for decryption
|
|
144
85
|
* @returns list of SHA256 options
|
|
145
86
|
*/
|
|
146
|
-
|
|
87
|
+
function decryptPollVote({ encPayload, encIv }, { pollCreatorJid, pollMsgId, pollEncKey, voterJid, }) {
|
|
147
88
|
const sign = Buffer.concat([
|
|
148
89
|
toBinary(pollMsgId),
|
|
149
90
|
toBinary(pollCreatorJid),
|
|
@@ -151,133 +92,64 @@ export function decryptPollVote({ encPayload, encIv }, { pollCreatorJid, pollMsg
|
|
|
151
92
|
toBinary('Poll Vote'),
|
|
152
93
|
new Uint8Array([1])
|
|
153
94
|
]);
|
|
154
|
-
const key0 = hmacSign(pollEncKey, new Uint8Array(32), 'sha256');
|
|
155
|
-
const decKey = hmacSign(sign, key0, 'sha256');
|
|
95
|
+
const key0 = (0, crypto_1.hmacSign)(pollEncKey, new Uint8Array(32), 'sha256');
|
|
96
|
+
const decKey = (0, crypto_1.hmacSign)(sign, key0, 'sha256');
|
|
156
97
|
const aad = toBinary(`${pollMsgId}\u0000${voterJid}`);
|
|
157
|
-
const decrypted = aesDecryptGCM(encPayload, decKey, encIv, aad);
|
|
158
|
-
return proto.Message.PollVoteMessage.decode(decrypted);
|
|
98
|
+
const decrypted = (0, crypto_1.aesDecryptGCM)(encPayload, decKey, encIv, aad);
|
|
99
|
+
return WAProto_1.proto.Message.PollVoteMessage.decode(decrypted);
|
|
159
100
|
function toBinary(txt) {
|
|
160
101
|
return Buffer.from(txt);
|
|
161
102
|
}
|
|
162
103
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
* @param ctx additional info about the event required for decryption
|
|
167
|
-
* @returns event response message
|
|
168
|
-
*/
|
|
169
|
-
export function decryptEventResponse({ encPayload, encIv }, { eventCreatorJid, eventMsgId, eventEncKey, responderJid }) {
|
|
170
|
-
const sign = Buffer.concat([
|
|
171
|
-
toBinary(eventMsgId),
|
|
172
|
-
toBinary(eventCreatorJid),
|
|
173
|
-
toBinary(responderJid),
|
|
174
|
-
toBinary('Event Response'),
|
|
175
|
-
new Uint8Array([1])
|
|
176
|
-
]);
|
|
177
|
-
const key0 = hmacSign(eventEncKey, new Uint8Array(32), 'sha256');
|
|
178
|
-
const decKey = hmacSign(sign, key0, 'sha256');
|
|
179
|
-
const aad = toBinary(`${eventMsgId}\u0000${responderJid}`);
|
|
180
|
-
const decrypted = aesDecryptGCM(encPayload, decKey, encIv, aad);
|
|
181
|
-
return proto.Message.EventResponseMessage.decode(decrypted);
|
|
182
|
-
function toBinary(txt) {
|
|
183
|
-
return Buffer.from(txt);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
const processMessage = async (message, { shouldProcessHistoryMsg, placeholderResendCache, ev, creds, signalRepository, keyStore, logger, options, getMessage }) => {
|
|
104
|
+
exports.decryptPollVote = decryptPollVote;
|
|
105
|
+
const processMessage = async (message, { shouldProcessHistoryMsg, ev, creds, keyStore, logger, options, getMessage }) => {
|
|
106
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
187
107
|
const meId = creds.me.id;
|
|
188
108
|
const { accountSettings } = creds;
|
|
189
|
-
const chat = { id: jidNormalizedUser(getChatId(message.key)) };
|
|
190
|
-
const isRealMsg = isRealMessage(message);
|
|
109
|
+
const chat = { id: (0, WABinary_1.jidNormalizedUser)((0, exports.getChatId)(message.key)) };
|
|
110
|
+
const isRealMsg = (0, exports.isRealMessage)(message, meId);
|
|
191
111
|
if (isRealMsg) {
|
|
192
|
-
chat.
|
|
193
|
-
chat.conversationTimestamp = toNumber(message.messageTimestamp);
|
|
112
|
+
chat.conversationTimestamp = (0, generics_1.toNumber)(message.messageTimestamp);
|
|
194
113
|
// only increment unread count if not CIPHERTEXT and from another person
|
|
195
|
-
if (shouldIncrementChatUnread(message)) {
|
|
114
|
+
if ((0, exports.shouldIncrementChatUnread)(message)) {
|
|
196
115
|
chat.unreadCount = (chat.unreadCount || 0) + 1;
|
|
197
116
|
}
|
|
198
117
|
}
|
|
199
|
-
const content = normalizeMessageContent(message.message);
|
|
118
|
+
const content = (0, messages_1.normalizeMessageContent)(message.message);
|
|
200
119
|
// unarchive chat if it's a real message, or someone reacted to our message
|
|
201
120
|
// and we've the unarchive chats setting on
|
|
202
|
-
if ((isRealMsg || content
|
|
121
|
+
if ((isRealMsg || ((_b = (_a = content === null || content === void 0 ? void 0 : content.reactionMessage) === null || _a === void 0 ? void 0 : _a.key) === null || _b === void 0 ? void 0 : _b.fromMe))
|
|
122
|
+
&& (accountSettings === null || accountSettings === void 0 ? void 0 : accountSettings.unarchiveChats)) {
|
|
203
123
|
chat.archived = false;
|
|
204
124
|
chat.readOnly = false;
|
|
205
125
|
}
|
|
206
|
-
const protocolMsg = content
|
|
126
|
+
const protocolMsg = content === null || content === void 0 ? void 0 : content.protocolMessage;
|
|
207
127
|
if (protocolMsg) {
|
|
208
|
-
// Mirror whatsmeow's `handleProtocolMessage` guard, but applied only to
|
|
209
|
-
// the protocol message types that originate from our own device — an
|
|
210
|
-
// attacker could otherwise spoof any of these to manipulate local state.
|
|
211
|
-
//
|
|
212
|
-
// Self-only types (drop if `!fromMe`):
|
|
213
|
-
// - HISTORY_SYNC_NOTIFICATION (our phone driving history sync)
|
|
214
|
-
// - APP_STATE_SYNC_KEY_SHARE (key share between our devices)
|
|
215
|
-
// - LID_MIGRATION_MAPPING_SYNC (server-initiated via our phone)
|
|
216
|
-
// - PEER_DATA_OPERATION_REQUEST_RESPONSE_MESSAGE (response from our phone to our PDO request)
|
|
217
|
-
//
|
|
218
|
-
// Cross-user types (must NOT be dropped — legitimately arrive from others):
|
|
219
|
-
// - REVOKE
|
|
220
|
-
// - MESSAGE_EDIT
|
|
221
|
-
// - EPHEMERAL_SETTING
|
|
222
|
-
// - GROUP_MEMBER_LABEL_CHANGE
|
|
223
|
-
//
|
|
224
|
-
// See https://github.com/tulir/whatsmeow/blob/8d3700152a/message.go#L842-L845
|
|
225
|
-
// for the reference architecture — whatsmeow's `handleProtocolMessage`
|
|
226
|
-
// only contains self-only types because edits are unwrapped from
|
|
227
|
-
// `EditedMessage` BEFORE this dispatch and revokes aren't routed here.
|
|
228
|
-
const SELF_ONLY_TYPES = new Set([
|
|
229
|
-
proto.Message.ProtocolMessage.Type.HISTORY_SYNC_NOTIFICATION,
|
|
230
|
-
proto.Message.ProtocolMessage.Type.APP_STATE_SYNC_KEY_SHARE,
|
|
231
|
-
proto.Message.ProtocolMessage.Type.LID_MIGRATION_MAPPING_SYNC,
|
|
232
|
-
proto.Message.ProtocolMessage.Type.PEER_DATA_OPERATION_REQUEST_RESPONSE_MESSAGE
|
|
233
|
-
]);
|
|
234
|
-
if (protocolMsg.type !== null &&
|
|
235
|
-
protocolMsg.type !== undefined &&
|
|
236
|
-
SELF_ONLY_TYPES.has(protocolMsg.type) &&
|
|
237
|
-
!message.key.fromMe) {
|
|
238
|
-
logger?.warn({ msgId: message.key.id, type: protocolMsg.type, from: message.key.participant || message.key.remoteJid }, 'dropping spoofed self-only protocolMessage from non-self origin');
|
|
239
|
-
return;
|
|
240
|
-
}
|
|
241
128
|
switch (protocolMsg.type) {
|
|
242
|
-
case proto.Message.ProtocolMessage.Type.HISTORY_SYNC_NOTIFICATION:
|
|
129
|
+
case WAProto_1.proto.Message.ProtocolMessage.Type.HISTORY_SYNC_NOTIFICATION:
|
|
243
130
|
const histNotification = protocolMsg.historySyncNotification;
|
|
244
131
|
const process = shouldProcessHistoryMsg;
|
|
245
|
-
const isLatest = !creds.processedHistoryMessages
|
|
246
|
-
logger
|
|
132
|
+
const isLatest = !((_c = creds.processedHistoryMessages) === null || _c === void 0 ? void 0 : _c.length);
|
|
133
|
+
logger === null || logger === void 0 ? void 0 : logger.info({
|
|
247
134
|
histNotification,
|
|
248
135
|
process,
|
|
249
136
|
id: message.key.id,
|
|
250
|
-
isLatest
|
|
137
|
+
isLatest,
|
|
251
138
|
}, 'got history notification');
|
|
252
139
|
if (process) {
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
{ key: message.key, messageTimestamp: message.messageTimestamp }
|
|
259
|
-
]
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
const data = await downloadAndProcessHistorySyncNotification(histNotification, options, logger);
|
|
263
|
-
if (data.lidPnMappings?.length) {
|
|
264
|
-
logger?.debug({ count: data.lidPnMappings.length }, 'processing LID-PN mappings from history sync');
|
|
265
|
-
await signalRepository.lidMapping
|
|
266
|
-
.storeLIDPNMappings(data.lidPnMappings)
|
|
267
|
-
.catch(err => logger?.warn({ err }, 'failed to store LID-PN mappings from history sync'));
|
|
268
|
-
}
|
|
269
|
-
await storeTcTokensFromHistorySync(data.chats, signalRepository, keyStore, logger);
|
|
270
|
-
ev.emit('messaging-history.set', {
|
|
271
|
-
...data,
|
|
272
|
-
isLatest: histNotification.syncType !== proto.HistorySync.HistorySyncType.ON_DEMAND ? isLatest : undefined,
|
|
273
|
-
chunkOrder: histNotification.chunkOrder,
|
|
274
|
-
peerDataRequestSessionId: histNotification.peerDataRequestSessionId
|
|
140
|
+
ev.emit('creds.update', {
|
|
141
|
+
processedHistoryMessages: [
|
|
142
|
+
...(creds.processedHistoryMessages || []),
|
|
143
|
+
{ key: message.key, messageTimestamp: message.messageTimestamp }
|
|
144
|
+
]
|
|
275
145
|
});
|
|
146
|
+
const data = await (0, history_1.downloadAndProcessHistorySyncNotification)(histNotification, options);
|
|
147
|
+
ev.emit('messaging-history.set', { ...data, isLatest });
|
|
276
148
|
}
|
|
277
149
|
break;
|
|
278
|
-
case proto.Message.ProtocolMessage.Type.APP_STATE_SYNC_KEY_SHARE:
|
|
150
|
+
case WAProto_1.proto.Message.ProtocolMessage.Type.APP_STATE_SYNC_KEY_SHARE:
|
|
279
151
|
const keys = protocolMsg.appStateSyncKeyShare.keys;
|
|
280
|
-
if (keys
|
|
152
|
+
if (keys === null || keys === void 0 ? void 0 : keys.length) {
|
|
281
153
|
let newAppStateSyncKeyId = '';
|
|
282
154
|
await keyStore.transaction(async () => {
|
|
283
155
|
const newKeys = [];
|
|
@@ -287,314 +159,138 @@ const processMessage = async (message, { shouldProcessHistoryMsg, placeholderRes
|
|
|
287
159
|
await keyStore.set({ 'app-state-sync-key': { [strKeyId]: keyData } });
|
|
288
160
|
newAppStateSyncKeyId = strKeyId;
|
|
289
161
|
}
|
|
290
|
-
logger
|
|
291
|
-
}
|
|
162
|
+
logger === null || logger === void 0 ? void 0 : logger.info({ newAppStateSyncKeyId, newKeys }, 'injecting new app state sync keys');
|
|
163
|
+
});
|
|
292
164
|
ev.emit('creds.update', { myAppStateKeyId: newAppStateSyncKeyId });
|
|
293
165
|
}
|
|
294
166
|
else {
|
|
295
|
-
logger
|
|
167
|
+
logger === null || logger === void 0 ? void 0 : logger.info({ protocolMsg }, 'recv app state sync with 0 keys');
|
|
296
168
|
}
|
|
297
169
|
break;
|
|
298
|
-
case proto.Message.ProtocolMessage.Type.REVOKE:
|
|
170
|
+
case WAProto_1.proto.Message.ProtocolMessage.Type.REVOKE:
|
|
299
171
|
ev.emit('messages.update', [
|
|
300
172
|
{
|
|
301
173
|
key: {
|
|
302
174
|
...message.key,
|
|
303
175
|
id: protocolMsg.key.id
|
|
304
176
|
},
|
|
305
|
-
update: { message: null, messageStubType: WAMessageStubType.REVOKE, key: message.key }
|
|
177
|
+
update: { message: null, messageStubType: Types_1.WAMessageStubType.REVOKE, key: message.key }
|
|
306
178
|
}
|
|
307
179
|
]);
|
|
308
180
|
break;
|
|
309
|
-
case proto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING:
|
|
181
|
+
case WAProto_1.proto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING:
|
|
310
182
|
Object.assign(chat, {
|
|
311
|
-
ephemeralSettingTimestamp: toNumber(message.messageTimestamp),
|
|
183
|
+
ephemeralSettingTimestamp: (0, generics_1.toNumber)(message.messageTimestamp),
|
|
312
184
|
ephemeralExpiration: protocolMsg.ephemeralExpiration || null
|
|
313
185
|
});
|
|
314
186
|
break;
|
|
315
|
-
case proto.Message.ProtocolMessage.Type.PEER_DATA_OPERATION_REQUEST_RESPONSE_MESSAGE:
|
|
187
|
+
case WAProto_1.proto.Message.ProtocolMessage.Type.PEER_DATA_OPERATION_REQUEST_RESPONSE_MESSAGE:
|
|
316
188
|
const response = protocolMsg.peerDataOperationRequestResponseMessage;
|
|
317
189
|
if (response) {
|
|
318
|
-
|
|
319
|
-
const peerDataOperationResult = response.peerDataOperationResult || [];
|
|
190
|
+
const { peerDataOperationResult } = response;
|
|
320
191
|
for (const result of peerDataOperationResult) {
|
|
321
|
-
const retryResponse = result
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
try {
|
|
328
|
-
const webMessageInfo = proto.WebMessageInfo.decode(retryResponse.webMessageInfoBytes);
|
|
329
|
-
const msgId = webMessageInfo.key?.id;
|
|
330
|
-
// Retrieve cached original message data (preserves LID details,
|
|
331
|
-
// timestamps, etc. that the phone may omit in its PDO response)
|
|
332
|
-
const cachedData = msgId ? await placeholderResendCache?.get(msgId) : undefined;
|
|
333
|
-
//eslint-disable-next-line max-depth
|
|
334
|
-
if (msgId) {
|
|
335
|
-
await placeholderResendCache?.del(msgId);
|
|
336
|
-
}
|
|
337
|
-
let finalMsg;
|
|
338
|
-
//eslint-disable-next-line max-depth
|
|
339
|
-
if (cachedData && typeof cachedData === 'object') {
|
|
340
|
-
// Apply decoded message content onto cached metadata (preserves LID etc.)
|
|
341
|
-
cachedData.message = webMessageInfo.message;
|
|
342
|
-
//eslint-disable-next-line max-depth
|
|
343
|
-
if (webMessageInfo.messageTimestamp) {
|
|
344
|
-
cachedData.messageTimestamp = webMessageInfo.messageTimestamp;
|
|
345
|
-
}
|
|
346
|
-
finalMsg = cachedData;
|
|
347
|
-
}
|
|
348
|
-
else {
|
|
349
|
-
finalMsg = webMessageInfo;
|
|
350
|
-
}
|
|
351
|
-
logger?.debug({ msgId, requestId: response.stanzaId }, 'received placeholder resend');
|
|
352
|
-
ev.emit('messages.upsert', {
|
|
353
|
-
messages: [finalMsg],
|
|
354
|
-
type: 'notify',
|
|
355
|
-
requestId: response.stanzaId
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
catch (err) {
|
|
359
|
-
logger?.warn({ err, stanzaId: response.stanzaId }, 'failed to decode placeholder resend response');
|
|
192
|
+
const { placeholderMessageResendResponse: retryResponse } = result;
|
|
193
|
+
if (retryResponse) {
|
|
194
|
+
const webMessageInfo = WAProto_1.proto.WebMessageInfo.decode(retryResponse.webMessageInfoBytes);
|
|
195
|
+
ev.emit('messages.update', [
|
|
196
|
+
{ key: webMessageInfo.key, update: { message: webMessageInfo.message } }
|
|
197
|
+
]);
|
|
360
198
|
}
|
|
361
199
|
}
|
|
362
200
|
}
|
|
363
201
|
break;
|
|
364
|
-
case proto.Message.ProtocolMessage.Type.MESSAGE_EDIT:
|
|
365
|
-
ev.emit('messages.update', [
|
|
366
|
-
{
|
|
367
|
-
// flip the sender / fromMe properties because they're in the perspective of the sender
|
|
368
|
-
key: { ...message.key, id: protocolMsg.key?.id },
|
|
369
|
-
update: {
|
|
370
|
-
message: {
|
|
371
|
-
editedMessage: {
|
|
372
|
-
message: protocolMsg.editedMessage
|
|
373
|
-
}
|
|
374
|
-
},
|
|
375
|
-
messageTimestamp: protocolMsg.timestampMs
|
|
376
|
-
? Math.floor(toNumber(protocolMsg.timestampMs) / 1000)
|
|
377
|
-
: message.messageTimestamp
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
]);
|
|
381
|
-
break;
|
|
382
|
-
case proto.Message.ProtocolMessage.Type.GROUP_MEMBER_LABEL_CHANGE:
|
|
383
|
-
const labelAssociationMsg = protocolMsg.memberLabel;
|
|
384
|
-
if (labelAssociationMsg?.label) {
|
|
385
|
-
ev.emit('group.member-tag.update', {
|
|
386
|
-
groupId: chat.id,
|
|
387
|
-
label: labelAssociationMsg.label,
|
|
388
|
-
participant: message.key.participant,
|
|
389
|
-
participantAlt: message.key.participantAlt,
|
|
390
|
-
messageTimestamp: Number(message.messageTimestamp)
|
|
391
|
-
});
|
|
392
|
-
}
|
|
393
|
-
break;
|
|
394
|
-
case proto.Message.ProtocolMessage.Type.LID_MIGRATION_MAPPING_SYNC:
|
|
395
|
-
const encodedPayload = protocolMsg.lidMigrationMappingSyncMessage?.encodedMappingPayload;
|
|
396
|
-
const { pnToLidMappings, chatDbMigrationTimestamp } = proto.LIDMigrationMappingSyncPayload.decode(encodedPayload);
|
|
397
|
-
logger?.debug({ pnToLidMappings, chatDbMigrationTimestamp }, 'got lid mappings and chat db migration timestamp');
|
|
398
|
-
const pairs = [];
|
|
399
|
-
for (const { pn, latestLid, assignedLid } of pnToLidMappings) {
|
|
400
|
-
const lid = latestLid || assignedLid;
|
|
401
|
-
pairs.push({ lid: `${lid}@lid`, pn: `${pn}@s.whatsapp.net` });
|
|
402
|
-
}
|
|
403
|
-
await signalRepository.lidMapping.storeLIDPNMappings(pairs);
|
|
404
|
-
if (pairs.length) {
|
|
405
|
-
for (const { pn, lid } of pairs) {
|
|
406
|
-
await signalRepository.migrateSession(pn, lid);
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
202
|
}
|
|
410
203
|
}
|
|
411
|
-
else if (content
|
|
204
|
+
else if (content === null || content === void 0 ? void 0 : content.reactionMessage) {
|
|
412
205
|
const reaction = {
|
|
413
206
|
...content.reactionMessage,
|
|
414
|
-
key: message.key
|
|
207
|
+
key: message.key,
|
|
415
208
|
};
|
|
416
|
-
ev.emit('messages.reaction', [
|
|
417
|
-
{
|
|
209
|
+
ev.emit('messages.reaction', [{
|
|
418
210
|
reaction,
|
|
419
|
-
key: content.reactionMessage
|
|
420
|
-
}
|
|
421
|
-
]);
|
|
422
|
-
}
|
|
423
|
-
else if (content?.encEventResponseMessage) {
|
|
424
|
-
const encEventResponse = content.encEventResponseMessage;
|
|
425
|
-
const creationMsgKey = encEventResponse.eventCreationMessageKey;
|
|
426
|
-
// we need to fetch the event creation message to get the event enc key
|
|
427
|
-
const eventMsg = await getMessage(creationMsgKey);
|
|
428
|
-
if (eventMsg) {
|
|
429
|
-
try {
|
|
430
|
-
const meIdNormalised = jidNormalizedUser(meId);
|
|
431
|
-
// all jids need to be PN
|
|
432
|
-
const eventCreatorKey = creationMsgKey.participant || creationMsgKey.remoteJid;
|
|
433
|
-
const eventCreatorPn = isLidUser(eventCreatorKey)
|
|
434
|
-
? await signalRepository.lidMapping.getPNForLID(eventCreatorKey)
|
|
435
|
-
: eventCreatorKey;
|
|
436
|
-
const eventCreatorJid = getKeyAuthor({ remoteJid: jidNormalizedUser(eventCreatorPn), fromMe: meIdNormalised === eventCreatorPn }, meIdNormalised);
|
|
437
|
-
const responderJid = getKeyAuthor(message.key, meIdNormalised);
|
|
438
|
-
const eventEncKey = eventMsg?.messageContextInfo?.messageSecret;
|
|
439
|
-
if (!eventEncKey) {
|
|
440
|
-
logger?.warn({ creationMsgKey }, 'event response: missing messageSecret for decryption');
|
|
441
|
-
}
|
|
442
|
-
else {
|
|
443
|
-
const responseMsg = decryptEventResponse(encEventResponse, {
|
|
444
|
-
eventEncKey,
|
|
445
|
-
eventCreatorJid,
|
|
446
|
-
eventMsgId: creationMsgKey.id,
|
|
447
|
-
responderJid
|
|
448
|
-
});
|
|
449
|
-
const eventResponse = {
|
|
450
|
-
eventResponseMessageKey: message.key,
|
|
451
|
-
senderTimestampMs: responseMsg.timestampMs,
|
|
452
|
-
response: responseMsg
|
|
453
|
-
};
|
|
454
|
-
ev.emit('messages.update', [
|
|
455
|
-
{
|
|
456
|
-
key: creationMsgKey,
|
|
457
|
-
update: {
|
|
458
|
-
eventResponses: [eventResponse]
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
]);
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
catch (err) {
|
|
465
|
-
logger?.warn({ err, creationMsgKey }, 'failed to decrypt event response');
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
else {
|
|
469
|
-
logger?.warn({ creationMsgKey }, 'event creation message not found, cannot decrypt response');
|
|
470
|
-
}
|
|
211
|
+
key: content.reactionMessage.key,
|
|
212
|
+
}]);
|
|
471
213
|
}
|
|
472
214
|
else if (message.messageStubType) {
|
|
473
|
-
const jid = message.key
|
|
215
|
+
const jid = message.key.remoteJid;
|
|
474
216
|
//let actor = whatsappID (message.participant)
|
|
475
217
|
let participants;
|
|
476
|
-
const emitParticipantsUpdate = (action) => ev.emit('group-participants.update', {
|
|
477
|
-
id: jid,
|
|
478
|
-
author: message.key.participant,
|
|
479
|
-
authorPn: message.key.participantAlt,
|
|
480
|
-
authorUsername: message.key.participantUsername,
|
|
481
|
-
participants,
|
|
482
|
-
action
|
|
483
|
-
});
|
|
218
|
+
const emitParticipantsUpdate = (action) => (ev.emit('group-participants.update', { id: jid, author: message.participant, participants, action }));
|
|
484
219
|
const emitGroupUpdate = (update) => {
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
id: jid,
|
|
488
|
-
...update,
|
|
489
|
-
author: message.key.participant ?? undefined,
|
|
490
|
-
authorPn: message.key.participantAlt,
|
|
491
|
-
authorUsername: message.key.participantUsername
|
|
492
|
-
}
|
|
493
|
-
]);
|
|
220
|
+
var _a;
|
|
221
|
+
ev.emit('groups.update', [{ id: jid, ...update, author: (_a = message.participant) !== null && _a !== void 0 ? _a : undefined }]);
|
|
494
222
|
};
|
|
495
|
-
const
|
|
496
|
-
ev.emit('group.join-request', {
|
|
497
|
-
id: jid,
|
|
498
|
-
author: message.key.participant,
|
|
499
|
-
authorPn: message.key.participantAlt,
|
|
500
|
-
authorUsername: message.key.participantUsername,
|
|
501
|
-
participant: participant.lid,
|
|
502
|
-
participantPn: participant.pn,
|
|
503
|
-
action,
|
|
504
|
-
method: method
|
|
505
|
-
});
|
|
506
|
-
};
|
|
507
|
-
const participantsIncludesMe = () => participants.find(jid => areJidsSameUser(meId, jid.phoneNumber)); // ADD SUPPORT FOR LID
|
|
223
|
+
const participantsIncludesMe = () => participants.find(jid => (0, WABinary_1.areJidsSameUser)(meId, jid));
|
|
508
224
|
switch (message.messageStubType) {
|
|
509
|
-
case WAMessageStubType.
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
break;
|
|
513
|
-
case WAMessageStubType.GROUP_PARTICIPANT_LEAVE:
|
|
514
|
-
case WAMessageStubType.GROUP_PARTICIPANT_REMOVE:
|
|
515
|
-
participants = message.messageStubParameters.map((a) => JSON.parse(a)) || [];
|
|
225
|
+
case Types_1.WAMessageStubType.GROUP_PARTICIPANT_LEAVE:
|
|
226
|
+
case Types_1.WAMessageStubType.GROUP_PARTICIPANT_REMOVE:
|
|
227
|
+
participants = message.messageStubParameters || [];
|
|
516
228
|
emitParticipantsUpdate('remove');
|
|
517
229
|
// mark the chat read only if you left the group
|
|
518
230
|
if (participantsIncludesMe()) {
|
|
519
231
|
chat.readOnly = true;
|
|
520
232
|
}
|
|
521
233
|
break;
|
|
522
|
-
case WAMessageStubType.GROUP_PARTICIPANT_ADD:
|
|
523
|
-
case WAMessageStubType.GROUP_PARTICIPANT_INVITE:
|
|
524
|
-
case WAMessageStubType.GROUP_PARTICIPANT_ADD_REQUEST_JOIN:
|
|
525
|
-
participants = message.messageStubParameters
|
|
234
|
+
case Types_1.WAMessageStubType.GROUP_PARTICIPANT_ADD:
|
|
235
|
+
case Types_1.WAMessageStubType.GROUP_PARTICIPANT_INVITE:
|
|
236
|
+
case Types_1.WAMessageStubType.GROUP_PARTICIPANT_ADD_REQUEST_JOIN:
|
|
237
|
+
participants = message.messageStubParameters || [];
|
|
526
238
|
if (participantsIncludesMe()) {
|
|
527
239
|
chat.readOnly = false;
|
|
528
240
|
}
|
|
529
241
|
emitParticipantsUpdate('add');
|
|
530
242
|
break;
|
|
531
|
-
case WAMessageStubType.GROUP_PARTICIPANT_DEMOTE:
|
|
532
|
-
participants = message.messageStubParameters
|
|
243
|
+
case Types_1.WAMessageStubType.GROUP_PARTICIPANT_DEMOTE:
|
|
244
|
+
participants = message.messageStubParameters || [];
|
|
533
245
|
emitParticipantsUpdate('demote');
|
|
534
246
|
break;
|
|
535
|
-
case WAMessageStubType.GROUP_PARTICIPANT_PROMOTE:
|
|
536
|
-
participants = message.messageStubParameters
|
|
247
|
+
case Types_1.WAMessageStubType.GROUP_PARTICIPANT_PROMOTE:
|
|
248
|
+
participants = message.messageStubParameters || [];
|
|
537
249
|
emitParticipantsUpdate('promote');
|
|
538
250
|
break;
|
|
539
|
-
case WAMessageStubType.GROUP_CHANGE_ANNOUNCE:
|
|
540
|
-
const announceValue = message.messageStubParameters
|
|
251
|
+
case Types_1.WAMessageStubType.GROUP_CHANGE_ANNOUNCE:
|
|
252
|
+
const announceValue = (_d = message.messageStubParameters) === null || _d === void 0 ? void 0 : _d[0];
|
|
541
253
|
emitGroupUpdate({ announce: announceValue === 'true' || announceValue === 'on' });
|
|
542
254
|
break;
|
|
543
|
-
case WAMessageStubType.GROUP_CHANGE_RESTRICT:
|
|
544
|
-
const restrictValue = message.messageStubParameters
|
|
255
|
+
case Types_1.WAMessageStubType.GROUP_CHANGE_RESTRICT:
|
|
256
|
+
const restrictValue = (_e = message.messageStubParameters) === null || _e === void 0 ? void 0 : _e[0];
|
|
545
257
|
emitGroupUpdate({ restrict: restrictValue === 'true' || restrictValue === 'on' });
|
|
546
258
|
break;
|
|
547
|
-
case WAMessageStubType.GROUP_CHANGE_SUBJECT:
|
|
548
|
-
const name = message.messageStubParameters
|
|
259
|
+
case Types_1.WAMessageStubType.GROUP_CHANGE_SUBJECT:
|
|
260
|
+
const name = (_f = message.messageStubParameters) === null || _f === void 0 ? void 0 : _f[0];
|
|
549
261
|
chat.name = name;
|
|
550
262
|
emitGroupUpdate({ subject: name });
|
|
551
263
|
break;
|
|
552
|
-
case WAMessageStubType.
|
|
553
|
-
const
|
|
554
|
-
chat.description = description;
|
|
555
|
-
emitGroupUpdate({ desc: description });
|
|
556
|
-
break;
|
|
557
|
-
case WAMessageStubType.GROUP_CHANGE_INVITE_LINK:
|
|
558
|
-
const code = message.messageStubParameters?.[0];
|
|
264
|
+
case Types_1.WAMessageStubType.GROUP_CHANGE_INVITE_LINK:
|
|
265
|
+
const code = (_g = message.messageStubParameters) === null || _g === void 0 ? void 0 : _g[0];
|
|
559
266
|
emitGroupUpdate({ inviteCode: code });
|
|
560
267
|
break;
|
|
561
|
-
case WAMessageStubType.GROUP_MEMBER_ADD_MODE:
|
|
562
|
-
const memberAddValue = message.messageStubParameters
|
|
268
|
+
case Types_1.WAMessageStubType.GROUP_MEMBER_ADD_MODE:
|
|
269
|
+
const memberAddValue = (_h = message.messageStubParameters) === null || _h === void 0 ? void 0 : _h[0];
|
|
563
270
|
emitGroupUpdate({ memberAddMode: memberAddValue === 'all_member_add' });
|
|
564
271
|
break;
|
|
565
|
-
case WAMessageStubType.GROUP_MEMBERSHIP_JOIN_APPROVAL_MODE:
|
|
566
|
-
const approvalMode = message.messageStubParameters
|
|
272
|
+
case Types_1.WAMessageStubType.GROUP_MEMBERSHIP_JOIN_APPROVAL_MODE:
|
|
273
|
+
const approvalMode = (_j = message.messageStubParameters) === null || _j === void 0 ? void 0 : _j[0];
|
|
567
274
|
emitGroupUpdate({ joinApprovalMode: approvalMode === 'on' });
|
|
568
275
|
break;
|
|
569
|
-
case WAMessageStubType.GROUP_MEMBERSHIP_JOIN_APPROVAL_REQUEST_NON_ADMIN_ADD: // TODO: Add other events
|
|
570
|
-
const participant = JSON.parse(message.messageStubParameters?.[0]);
|
|
571
|
-
const action = message.messageStubParameters?.[1];
|
|
572
|
-
const method = message.messageStubParameters?.[2];
|
|
573
|
-
emitGroupRequestJoin(participant, action, method);
|
|
574
|
-
break;
|
|
575
276
|
}
|
|
576
|
-
}
|
|
577
|
-
|
|
277
|
+
}
|
|
278
|
+
else if (content === null || content === void 0 ? void 0 : content.pollUpdateMessage) {
|
|
279
|
+
const creationMsgKey = content.pollUpdateMessage.pollCreationMessageKey;
|
|
578
280
|
// we need to fetch the poll creation message to get the poll enc key
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
const
|
|
584
|
-
const
|
|
585
|
-
const voterJid = getKeyAuthor(message.key, meIdNormalised)
|
|
586
|
-
const pollEncKey = pollMsg.messageContextInfo?.messageSecret!
|
|
587
|
-
|
|
281
|
+
const pollMsg = await getMessage(creationMsgKey);
|
|
282
|
+
if (pollMsg) {
|
|
283
|
+
const meIdNormalised = (0, WABinary_1.jidNormalizedUser)(meId);
|
|
284
|
+
const pollCreatorJid = (0, generics_1.getKeyAuthor)(creationMsgKey, meIdNormalised);
|
|
285
|
+
const voterJid = (0, generics_1.getKeyAuthor)(message.key, meIdNormalised);
|
|
286
|
+
const pollEncKey = (_k = pollMsg.messageContextInfo) === null || _k === void 0 ? void 0 : _k.messageSecret;
|
|
588
287
|
try {
|
|
589
|
-
const voteMsg = decryptPollVote(
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
voterJid,
|
|
596
|
-
}
|
|
597
|
-
)
|
|
288
|
+
const voteMsg = decryptPollVote(content.pollUpdateMessage.vote, {
|
|
289
|
+
pollEncKey,
|
|
290
|
+
pollCreatorJid,
|
|
291
|
+
pollMsgId: creationMsgKey.id,
|
|
292
|
+
voterJid,
|
|
293
|
+
});
|
|
598
294
|
ev.emit('messages.update', [
|
|
599
295
|
{
|
|
600
296
|
key: creationMsgKey,
|
|
@@ -603,28 +299,23 @@ const processMessage = async (message, { shouldProcessHistoryMsg, placeholderRes
|
|
|
603
299
|
{
|
|
604
300
|
pollUpdateMessageKey: message.key,
|
|
605
301
|
vote: voteMsg,
|
|
606
|
-
senderTimestampMs:
|
|
302
|
+
senderTimestampMs: content.pollUpdateMessage.senderTimestampMs.toNumber(),
|
|
607
303
|
}
|
|
608
304
|
]
|
|
609
305
|
}
|
|
610
306
|
}
|
|
611
|
-
])
|
|
612
|
-
} catch(err) {
|
|
613
|
-
logger?.warn(
|
|
614
|
-
{ err, creationMsgKey },
|
|
615
|
-
'failed to decrypt poll vote'
|
|
616
|
-
)
|
|
307
|
+
]);
|
|
617
308
|
}
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
309
|
+
catch (err) {
|
|
310
|
+
logger === null || logger === void 0 ? void 0 : logger.warn({ err, creationMsgKey }, 'failed to decrypt poll vote');
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
logger === null || logger === void 0 ? void 0 : logger.warn({ creationMsgKey }, 'poll creation message not found, cannot decrypt update');
|
|
623
315
|
}
|
|
624
|
-
|
|
316
|
+
}
|
|
625
317
|
if (Object.keys(chat).length > 1) {
|
|
626
318
|
ev.emit('chats.update', [chat]);
|
|
627
319
|
}
|
|
628
320
|
};
|
|
629
|
-
|
|
630
|
-
//# sourceMappingURL=process-message.js.map
|
|
321
|
+
exports.default = processMessage;
|