prastzyy 0.0.1-security → 1.0.0

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.

Potentially problematic release.


This version of prastzyy might be problematic. Click here for more details.

Files changed (116) hide show
  1. package/LICENSE +30 -0
  2. package/README.md +478 -3
  3. package/WAProto/GenerateStatics.sh +3 -0
  4. package/WAProto/WAProto.proto +6902 -0
  5. package/WAProto/fix-imports.js +85 -0
  6. package/WAProto/index.d.ts +79257 -0
  7. package/WAProto/index.js +242946 -0
  8. package/engine-requirements.js +10 -0
  9. package/lib/Defaults/index.js +130 -0
  10. package/lib/Signal/Group/ciphertext-message.js +12 -0
  11. package/lib/Signal/Group/group-session-builder.js +30 -0
  12. package/lib/Signal/Group/group_cipher.js +82 -0
  13. package/lib/Signal/Group/index.js +12 -0
  14. package/lib/Signal/Group/keyhelper.js +18 -0
  15. package/lib/Signal/Group/sender-chain-key.js +26 -0
  16. package/lib/Signal/Group/sender-key-distribution-message.js +63 -0
  17. package/lib/Signal/Group/sender-key-message.js +66 -0
  18. package/lib/Signal/Group/sender-key-name.js +48 -0
  19. package/lib/Signal/Group/sender-key-record.js +41 -0
  20. package/lib/Signal/Group/sender-key-state.js +84 -0
  21. package/lib/Signal/Group/sender-message-key.js +26 -0
  22. package/lib/Signal/libsignal.js +431 -0
  23. package/lib/Signal/lid-mapping.js +277 -0
  24. package/lib/Socket/Client/index.js +3 -0
  25. package/lib/Socket/Client/types.js +11 -0
  26. package/lib/Socket/Client/websocket.js +84 -0
  27. package/lib/Socket/business.js +379 -0
  28. package/lib/Socket/chats.js +1193 -0
  29. package/lib/Socket/communities.js +431 -0
  30. package/lib/Socket/groups.js +374 -0
  31. package/lib/Socket/index.js +12 -0
  32. package/lib/Socket/luxu.js +386 -0
  33. package/lib/Socket/messages-recv.js +1916 -0
  34. package/lib/Socket/messages-send.js +1453 -0
  35. package/lib/Socket/mex.js +41 -0
  36. package/lib/Socket/newsletter.js +295 -0
  37. package/lib/Socket/socket.js +980 -0
  38. package/lib/Socket/username.js +234 -0
  39. package/lib/Store/index.js +10 -0
  40. package/lib/Store/keyed-db.js +108 -0
  41. package/lib/Store/make-cache-manager-store.js +85 -0
  42. package/lib/Store/make-in-memory-store.js +198 -0
  43. package/lib/Store/make-ordered-dictionary.js +75 -0
  44. package/lib/Store/object-repository.js +32 -0
  45. package/lib/Types/Auth.js +2 -0
  46. package/lib/Types/Bussines.js +2 -0
  47. package/lib/Types/Call.js +2 -0
  48. package/lib/Types/Chat.js +8 -0
  49. package/lib/Types/Contact.js +2 -0
  50. package/lib/Types/Events.js +2 -0
  51. package/lib/Types/GroupMetadata.js +2 -0
  52. package/lib/Types/Label.js +25 -0
  53. package/lib/Types/LabelAssociation.js +7 -0
  54. package/lib/Types/Message.js +11 -0
  55. package/lib/Types/Mex.js +37 -0
  56. package/lib/Types/Product.js +2 -0
  57. package/lib/Types/Signal.js +2 -0
  58. package/lib/Types/Socket.js +3 -0
  59. package/lib/Types/State.js +56 -0
  60. package/lib/Types/USync.js +2 -0
  61. package/lib/Types/index.js +26 -0
  62. package/lib/Utils/auth-utils.js +302 -0
  63. package/lib/Utils/browser-utils.js +49 -0
  64. package/lib/Utils/business.js +231 -0
  65. package/lib/Utils/chat-utils.js +872 -0
  66. package/lib/Utils/companion-reg-client-utils.js +35 -0
  67. package/lib/Utils/crypto.js +118 -0
  68. package/lib/Utils/decode-wa-message.js +350 -0
  69. package/lib/Utils/event-buffer.js +622 -0
  70. package/lib/Utils/generics.js +403 -0
  71. package/lib/Utils/history.js +134 -0
  72. package/lib/Utils/identity-change-handler.js +50 -0
  73. package/lib/Utils/index.js +23 -0
  74. package/lib/Utils/link-preview.js +85 -0
  75. package/lib/Utils/logger.js +3 -0
  76. package/lib/Utils/lt-hash.js +8 -0
  77. package/lib/Utils/make-mutex.js +33 -0
  78. package/lib/Utils/message-composer.js +273 -0
  79. package/lib/Utils/message-retry-manager.js +265 -0
  80. package/lib/Utils/messages-media.js +788 -0
  81. package/lib/Utils/messages.js +1260 -0
  82. package/lib/Utils/noise-handler.js +201 -0
  83. package/lib/Utils/offline-node-processor.js +40 -0
  84. package/lib/Utils/pre-key-manager.js +106 -0
  85. package/lib/Utils/process-message.js +630 -0
  86. package/lib/Utils/reporting-utils.js +258 -0
  87. package/lib/Utils/signal.js +201 -0
  88. package/lib/Utils/stanza-ack.js +38 -0
  89. package/lib/Utils/sync-action-utils.js +49 -0
  90. package/lib/Utils/tc-token-utils.js +163 -0
  91. package/lib/Utils/use-multi-file-auth-state.js +121 -0
  92. package/lib/Utils/validate-connection.js +203 -0
  93. package/lib/WABinary/constants.js +1301 -0
  94. package/lib/WABinary/decode.js +262 -0
  95. package/lib/WABinary/encode.js +220 -0
  96. package/lib/WABinary/generic-utils.js +204 -0
  97. package/lib/WABinary/index.js +6 -0
  98. package/lib/WABinary/jid-utils.js +98 -0
  99. package/lib/WABinary/types.js +2 -0
  100. package/lib/WAM/BinaryInfo.js +10 -0
  101. package/lib/WAM/constants.js +22853 -0
  102. package/lib/WAM/encode.js +150 -0
  103. package/lib/WAM/index.js +4 -0
  104. package/lib/WAUSync/Protocols/USyncContactProtocol.js +52 -0
  105. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +54 -0
  106. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +27 -0
  107. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +38 -0
  108. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +25 -0
  109. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +51 -0
  110. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +29 -0
  111. package/lib/WAUSync/Protocols/index.js +6 -0
  112. package/lib/WAUSync/USyncQuery.js +98 -0
  113. package/lib/WAUSync/USyncUser.js +31 -0
  114. package/lib/WAUSync/index.js +4 -0
  115. package/lib/index.js +28 -0
  116. package/package.json +140 -4
@@ -0,0 +1,386 @@
1
+ import { proto } from '../../WAProto/index.js'
2
+ import * as Utils from '../Utils/index.js'
3
+ import crypto from 'crypto'
4
+
5
+ export default class imup {
6
+ constructor(utils, waUploadToServer, relayMessageFn) {
7
+ this.utils = utils
8
+ this.relayMessage = relayMessageFn
9
+ this.waUploadToServer = waUploadToServer
10
+ }
11
+
12
+ detectType(content) {
13
+ if (content.requestPaymentMessage) return 'PAYMENT'
14
+ if (content.productMessage) return 'PRODUCT'
15
+ if (content.albumMessage) return 'ALBUM'
16
+ if (content.eventMessage) return 'EVENT'
17
+ if (content.pollResultMessage) return 'POLL_RESULT'
18
+ if (content.orderMessage) return 'ORDER'
19
+ if (content.groupStatus) return 'GROUP_STATUS'
20
+ if (content.groupLabel) return 'GROUP_LABEL'
21
+ return null
22
+ }
23
+
24
+ async handlePayment(content, quoted) {
25
+ const data = content.requestPaymentMessage
26
+ let notes = {}
27
+
28
+ if (data.sticker?.stickerMessage) {
29
+ notes = {
30
+ stickerMessage: {
31
+ ...data.sticker.stickerMessage,
32
+ contextInfo: {
33
+ stanzaId: quoted?.key?.id,
34
+ participant: quoted?.key?.participant || content.sender,
35
+ quotedMessage: quoted?.message
36
+ }
37
+ }
38
+ }
39
+ } else if (data.note) {
40
+ notes = {
41
+ extendedTextMessage: {
42
+ text: data.note,
43
+ contextInfo: {
44
+ stanzaId: quoted?.key?.id,
45
+ participant: quoted?.key?.participant || content.sender,
46
+ quotedMessage: quoted?.message
47
+ }
48
+ }
49
+ }
50
+ }
51
+
52
+ return {
53
+ requestPaymentMessage: proto.Message.RequestPaymentMessage.fromObject({
54
+ expiryTimestamp: data.expiry || 0,
55
+ amount1000: data.amount || 0,
56
+ currencyCodeIso4217: data.currency || "IDR",
57
+ requestFrom: data.from || "0@s.whatsapp.net",
58
+ noteMessage: notes,
59
+ background: data.background?? {
60
+ id: "DEFAULT",
61
+ placeholderArgb: 0xFFF0F0F0
62
+ }
63
+ })
64
+ }
65
+ }
66
+
67
+ async handleProduct(content, jid, quoted) {
68
+ const {
69
+ title,
70
+ description,
71
+ thumbnail,
72
+ productId,
73
+ retailerId,
74
+ url,
75
+ body = "",
76
+ footer = "",
77
+ buttons = [],
78
+ priceAmount1000 = null,
79
+ currencyCode = "IDR"
80
+ } = content.productMessage
81
+
82
+ let productImage
83
+
84
+ if (Buffer.isBuffer(thumbnail)) {
85
+ const { imageMessage } = await this.utils.generateWAMessageContent(
86
+ { image: thumbnail },
87
+ { upload: this.waUploadToServer }
88
+ )
89
+ productImage = imageMessage
90
+ } else if (typeof thumbnail === 'object' && thumbnail.url) {
91
+ const { imageMessage } = await this.utils.generateWAMessageContent(
92
+ { image: { url: thumbnail.url } },
93
+ { upload: this.waUploadToServer }
94
+ )
95
+ productImage = imageMessage
96
+ }
97
+
98
+ return {
99
+ viewOnceMessage: {
100
+ message: {
101
+ interactiveMessage: {
102
+ body: { text: body },
103
+ footer: { text: footer },
104
+ header: {
105
+ title,
106
+ hasMediaAttachment: true,
107
+ productMessage: {
108
+ product: {
109
+ productImage,
110
+ productId,
111
+ title,
112
+ description,
113
+ currencyCode,
114
+ priceAmount1000,
115
+ retailerId,
116
+ url,
117
+ productImageCount: 1
118
+ },
119
+ businessOwnerJid: "0@s.whatsapp.net"
120
+ }
121
+ },
122
+ nativeFlowMessage: { buttons }
123
+ }
124
+ }
125
+ }
126
+ }
127
+ }
128
+
129
+ async handleAlbum(content, jid, quoted) {
130
+ const array = content.albumMessage
131
+ const album = await this.utils.generateWAMessageFromContent(jid, {
132
+ messageContextInfo: {
133
+ messageSecret: crypto.randomBytes(32),
134
+ },
135
+ albumMessage: {
136
+ expectedImageCount: array.filter((a) => a.hasOwnProperty("image")).length,
137
+ expectedVideoCount: array.filter((a) => a.hasOwnProperty("video")).length,
138
+ },
139
+ }, {
140
+ userJid: this.utils.generateMessageID().split('@')[0] + '@s.whatsapp.net',
141
+ quoted,
142
+ upload: this.waUploadToServer
143
+ })
144
+
145
+ await this.relayMessage(jid, album.message, {
146
+ messageId: album.key.id,
147
+ })
148
+
149
+ for (let content of array) {
150
+ const img = await this.utils.generateWAMessage(jid, content, {
151
+ upload: this.waUploadToServer,
152
+ })
153
+
154
+ img.message.messageContextInfo = {
155
+ messageSecret: crypto.randomBytes(32),
156
+ messageAssociation: {
157
+ associationType: 1,
158
+ parentMessageKey: album.key,
159
+ },
160
+ participant: "0@s.whatsapp.net",
161
+ remoteJid: "status@broadcast",
162
+ forwardingScore: 99999,
163
+ isForwarded: true,
164
+ mentionedJid: [jid],
165
+ starred: true,
166
+ labels: ["Y", "Important"],
167
+ isHighlighted: true,
168
+ businessMessageForwardInfo: {
169
+ businessOwnerJid: jid,
170
+ },
171
+ dataSharingContext: {
172
+ showMmDisclosure: true,
173
+ },
174
+ }
175
+
176
+ img.message.forwardedNewsletterMessageInfo = {
177
+ newsletterJid: "0@newsletter",
178
+ serverMessageId: 1,
179
+ newsletterName: `WhatsApp`,
180
+ timestamp: new Date().toISOString(),
181
+ senderName: "7-Yuukey",
182
+ contentType: "UPDATE_CARD",
183
+ priority: "high",
184
+ status: "sent",
185
+ }
186
+
187
+ img.message.disappearingMode = {
188
+ initiator: 3,
189
+ trigger: 4,
190
+ initiatorDeviceJid: jid,
191
+ initiatedByExternalService: true,
192
+ initiatedByUserDevice: true,
193
+ initiatedBySystem: true,
194
+ initiatedByServer: true,
195
+ initiatedByAdmin: true,
196
+ initiatedByUser: true,
197
+ initiatedByApp: true,
198
+ initiatedByBot: true,
199
+ initiatedByMe: true,
200
+ }
201
+
202
+ await this.relayMessage(jid, img.message, {
203
+ messageId: img.key.id,
204
+ quoted: {
205
+ key: {
206
+ remoteJid: album.key.remoteJid,
207
+ id: album.key.id,
208
+ fromMe: true,
209
+ participant: this.utils.generateMessageID().split('@')[0] + '@s.whatsapp.net',
210
+ },
211
+ message: album.message,
212
+ },
213
+ })
214
+ }
215
+ return album
216
+ }
217
+
218
+ async handleEvent(content, jid, quoted) {
219
+ const eventData = content.eventMessage
220
+
221
+ const msg = await this.utils.generateWAMessageFromContent(jid, {
222
+ viewOnceMessage: {
223
+ message: {
224
+ messageContextInfo: {
225
+ deviceListMetadata: {},
226
+ deviceListMetadataVersion: 2,
227
+ messageSecret: crypto.randomBytes(32),
228
+ supportPayload: JSON.stringify({
229
+ version: 2,
230
+ is_ai_message: true,
231
+ should_show_system_message: true,
232
+ ticket_id: crypto.randomBytes(16).toString('hex')
233
+ })
234
+ },
235
+ eventMessage: {
236
+ contextInfo: {
237
+ mentionedJid: [jid],
238
+ participant: jid,
239
+ remoteJid: "status@broadcast",
240
+ forwardedNewsletterMessageInfo: {
241
+ newsletterName: "PouCode",
242
+ newsletterJid: "120363421563597486@newsletter",
243
+ serverMessageId: 1
244
+ }
245
+ },
246
+ isCanceled: eventData.isCanceled || false,
247
+ name: eventData.name,
248
+ description: eventData.description,
249
+ location: eventData.location || {
250
+ degreesLatitude: 0,
251
+ degreesLongitude: 0,
252
+ name: "Location"
253
+ },
254
+ joinLink: eventData.joinLink || '',
255
+ startTime: typeof eventData.startTime === 'string'? parseInt(eventData.startTime) : eventData.startTime || Date.now(),
256
+ endTime: typeof eventData.endTime === 'string'? parseInt(eventData.endTime) : eventData.endTime || Date.now() + 3600000,
257
+ extraGuestsAllowed: eventData.extraGuestsAllowed!== false
258
+ }
259
+ }
260
+ }
261
+ }, { quoted })
262
+
263
+ await this.relayMessage(jid, msg.message, {
264
+ messageId: msg.key.id
265
+ })
266
+ return msg
267
+ }
268
+
269
+ async handlePollResult(content, jid, quoted) {
270
+ const pollData = content.pollResultMessage
271
+ const msg = await this.utils.generateWAMessageFromContent(jid, {
272
+ pollResultSnapshotMessage: {
273
+ name: pollData.name,
274
+ pollVotes: pollData.pollVotes.map(vote => ({
275
+ optionName: vote.optionName,
276
+ optionVoteCount: typeof vote.optionVoteCount === 'number'
277
+ ? vote.optionVoteCount.toString()
278
+ : vote.optionVoteCount
279
+ })),
280
+ contextInfo: {
281
+ isForwarded: true,
282
+ forwardingScore: 1,
283
+ forwardedNewsletterMessageInfo: {
284
+ newsletterName: pollData.newsletter.newsletterName || "120363399602691477@newsletter",
285
+ newsletterJid: pollData.newsletter.newsletterJid || "Newsletter",
286
+ serverMessageId: 1000,
287
+ contentType: "UPDATE"
288
+ }
289
+ }
290
+ }
291
+ }, {
292
+ userJid: this.utils.generateMessageID().split('@')[0] + '@s.whatsapp.net',
293
+ quoted
294
+ })
295
+
296
+ await this.relayMessage(jid, msg.message, {
297
+ messageId: msg.key.id
298
+ })
299
+
300
+ return msg
301
+ }
302
+
303
+ async handleOrderMessage(content, jid, quoted) {
304
+ const orderData = content.orderMessage
305
+
306
+ const Haha = await this.utils.generateWAMessageFromContent(jid, {
307
+ orderMessage: {
308
+ orderId: orderData.orderId || ("POUCODE" + Date.now()),
309
+ thumbnail: orderData.thumbnail || null,
310
+ itemCount: orderData.itemCount || 0,
311
+ status: "ACCEPTED",
312
+ surface: "CATALOG",
313
+ message: orderData.message,
314
+ orderTitle: orderData.orderTitle,
315
+ sellerJid: "0@whatsapp.net",
316
+ token: orderData.token || "POUCODE_EXAMPLE_TOKEN",
317
+ totalAmount1000: orderData.totalAmount1000 || 0,
318
+ totalCurrencyCode: orderData.totalCurrencyCode || "IDR",
319
+ messageVersion: 2
320
+ }
321
+ }, { quoted: quoted })
322
+
323
+ await this.relayMessage(jid, Haha.message, {})
324
+ return Haha
325
+ }
326
+
327
+ async handleGroupStory(content, jid, quoted) {
328
+ const storyData = content.groupStatus
329
+ let messageContent
330
+
331
+ if (storyData.message) {
332
+ messageContent = storyData
333
+ } else {
334
+ if (typeof this.utils?.generateWAMessageContent === "function") {
335
+ messageContent = await this.utils.generateWAMessageContent(storyData, {
336
+ upload: this.waUploadToServer
337
+ })
338
+ } else {
339
+ messageContent = await Utils.generateWAMessageContent(storyData, {
340
+ upload: this.waUploadToServer
341
+ })
342
+ }
343
+ }
344
+
345
+ let msg = {
346
+ message: {
347
+ groupStatusMessageV2: {
348
+ message: messageContent.message || messageContent
349
+ }
350
+ }
351
+ }
352
+
353
+ return await this.relayMessage(jid, msg.message, {
354
+ messageId: this.utils.generateMessageID()
355
+ })
356
+ }
357
+
358
+ async handleGbLabel(content, jid) {
359
+ const x = content.groupLabel
360
+ if (!jid.endsWith('@g.us')) {
361
+ throw new Error('group required!')
362
+ }
363
+
364
+ const msg = await this.utils.generateWAMessageFromContent(jid, {
365
+ protocolMessage: {
366
+ type: "GROUP_MEMBER_LABEL_CHANGE",
367
+ memberLabel: {
368
+ label: x.labelText.slice(0, 30)
369
+ }
370
+ }
371
+ }, {})
372
+
373
+ await this.relayMessage(jid, msg.message, {
374
+ additionalNodes: [
375
+ {
376
+ tag: 'meta',
377
+ attrs: {
378
+ tag_reason: 'user_update',
379
+ appdata: 'member_tag'
380
+ },
381
+ content: undefined
382
+ }
383
+ ]
384
+ })
385
+ }
386
+ }