slidge-whatsapp 0.2.5__cp311-cp311-manylinux_2_36_aarch64.whl → 0.2.7__cp311-cp311-manylinux_2_36_aarch64.whl

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 slidge-whatsapp might be problematic. Click here for more details.

Files changed (357) hide show
  1. slidge_whatsapp/config.py +3 -0
  2. slidge_whatsapp/event.go +31 -26
  3. slidge_whatsapp/gateway.go +13 -9
  4. slidge_whatsapp/gateway.py +2 -2
  5. slidge_whatsapp/generated/_whatsapp.cpython-311-aarch64-linux-gnu.h +170 -170
  6. slidge_whatsapp/generated/_whatsapp.cpython-311-aarch64-linux-gnu.so +0 -0
  7. slidge_whatsapp/generated/build.py +135 -135
  8. slidge_whatsapp/generated/whatsapp.c +1496 -1496
  9. slidge_whatsapp/generated/whatsapp.go +1137 -1137
  10. slidge_whatsapp/generated/whatsapp.py +1216 -1216
  11. slidge_whatsapp/generated/whatsapp_go.h +170 -170
  12. slidge_whatsapp/go.mod +15 -12
  13. slidge_whatsapp/go.sum +35 -29
  14. slidge_whatsapp/media/media.go +21 -11
  15. slidge_whatsapp/session.go +73 -66
  16. slidge_whatsapp/vendor/github.com/ebitengine/purego/dlfcn.go +4 -4
  17. slidge_whatsapp/vendor/github.com/ebitengine/purego/dlfcn_darwin.go +0 -5
  18. slidge_whatsapp/vendor/github.com/ebitengine/purego/internal/fakecgo/go_libinit.go +3 -0
  19. slidge_whatsapp/vendor/github.com/ebitengine/purego/internal/fakecgo/symbols.go +40 -20
  20. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/CHANGELOG.md +14 -1
  21. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/ffi.go +2 -2
  22. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/fun.go +10 -2
  23. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib.go +1 -1
  24. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib_unix.go +1 -1
  25. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib_windows.go +1 -1
  26. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/README.md +2 -7
  27. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/callback.go +2 -1
  28. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c +8510 -5090
  29. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h +344 -150
  30. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3.go +57 -23
  31. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.c +4 -0
  32. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.go +4 -0
  33. slidge_whatsapp/vendor/github.com/petermattis/goid/.gitignore +4 -0
  34. slidge_whatsapp/vendor/github.com/petermattis/goid/LICENSE +202 -0
  35. slidge_whatsapp/vendor/github.com/petermattis/goid/README.md +4 -0
  36. slidge_whatsapp/vendor/github.com/petermattis/goid/goid.go +35 -0
  37. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_gccgo.go +26 -0
  38. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.3.c +23 -0
  39. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.3.go +22 -0
  40. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.4.go +35 -0
  41. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.4.s +18 -0
  42. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.5.go +28 -0
  43. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.5.s +44 -0
  44. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_slow.go +24 -0
  45. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_gccgo_go1.8.go +17 -0
  46. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.23.go +38 -0
  47. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.5.go +57 -0
  48. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.6.go +43 -0
  49. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.9.go +37 -0
  50. slidge_whatsapp/vendor/github.com/rs/zerolog/CONTRIBUTING.md +43 -0
  51. slidge_whatsapp/vendor/github.com/rs/zerolog/README.md +31 -0
  52. slidge_whatsapp/vendor/github.com/rs/zerolog/console.go +20 -5
  53. slidge_whatsapp/vendor/github.com/rs/zerolog/log/log.go +131 -0
  54. slidge_whatsapp/vendor/github.com/rs/zerolog/log.go +1 -1
  55. slidge_whatsapp/vendor/github.com/rs/zerolog/sampler.go +4 -1
  56. slidge_whatsapp/vendor/github.com/rs/zerolog/writer.go +9 -0
  57. slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/GroupCipher.go +17 -6
  58. slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/GroupSessionBuilder.go +17 -7
  59. slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/state/store/SenderKeyStore.go +4 -2
  60. slidge_whatsapp/vendor/go.mau.fi/libsignal/keys/chain/ChainKey.go +1 -0
  61. slidge_whatsapp/vendor/go.mau.fi/libsignal/keys/identity/IdentityKey.go +1 -0
  62. slidge_whatsapp/vendor/go.mau.fi/libsignal/logger/DefaultLogger.go +2 -2
  63. slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/FingerprintProtocol.pb.go +3 -2
  64. slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/LocalStorageProtocol.pb.go +3 -2
  65. slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/WhisperTextProtocol.pb.go +3 -2
  66. slidge_whatsapp/vendor/go.mau.fi/libsignal/session/Session.go +41 -17
  67. slidge_whatsapp/vendor/go.mau.fi/libsignal/session/SessionCipher.go +64 -30
  68. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/IdentityKeyStore.go +5 -3
  69. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/MessageKeyStore.go +6 -4
  70. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/PreKeyStore.go +6 -4
  71. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/SessionStore.go +8 -6
  72. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/SignedPreKeyStore.go +7 -5
  73. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/connlog.go +257 -0
  74. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/database.go +309 -0
  75. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/iter.go +233 -0
  76. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/json.go +47 -0
  77. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/log.go +129 -0
  78. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/massinsert.go +164 -0
  79. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/queryhelper.go +137 -0
  80. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/reflectscan.go +30 -0
  81. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/transaction.go +180 -0
  82. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/upgrades.go +250 -0
  83. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/upgradetable.go +331 -0
  84. slidge_whatsapp/vendor/go.mau.fi/util/exerrors/dualerror.go +33 -0
  85. slidge_whatsapp/vendor/go.mau.fi/util/exerrors/must.go +23 -0
  86. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/cors.go +32 -0
  87. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/handleerrors.go +64 -0
  88. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/json.go +36 -0
  89. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/middleware.go +30 -0
  90. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/networkerror.go +37 -0
  91. slidge_whatsapp/vendor/go.mau.fi/util/exstrings/stringutil.go +76 -0
  92. slidge_whatsapp/vendor/go.mau.fi/util/exsync/event.go +88 -0
  93. slidge_whatsapp/vendor/go.mau.fi/util/exsync/returnonce.go +25 -0
  94. slidge_whatsapp/vendor/go.mau.fi/util/exsync/ringbuffer.go +139 -0
  95. slidge_whatsapp/vendor/go.mau.fi/util/exsync/syncmap.go +94 -0
  96. slidge_whatsapp/vendor/go.mau.fi/util/exsync/syncset.go +136 -0
  97. slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/callermarshal.go +28 -0
  98. slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/defaults.go +32 -0
  99. slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/generics.go +45 -0
  100. slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/writer.go +81 -0
  101. slidge_whatsapp/vendor/go.mau.fi/util/ptr/ptr.go +43 -0
  102. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/decode.go +27 -26
  103. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/encode.go +4 -3
  104. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/keys.go +5 -4
  105. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate.go +27 -25
  106. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/armadillomessage.go +40 -7
  107. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/binary/encoder.go +1 -1
  108. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/broadcast.go +5 -4
  109. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/call.go +1 -1
  110. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/client.go +119 -37
  111. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/connectionevents.go +29 -11
  112. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/download-to-file.go +63 -30
  113. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/download.go +74 -34
  114. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/errors.go +1 -0
  115. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/group.go +61 -31
  116. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/internals.go +188 -152
  117. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/keepalive.go +3 -2
  118. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/mediaconn.go +5 -3
  119. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/mediaretry.go +2 -1
  120. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/message.go +444 -135
  121. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/msgsecret.go +118 -31
  122. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/notification.go +78 -42
  123. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/pair-code.go +7 -4
  124. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/pair.go +42 -18
  125. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/prekeys.go +9 -5
  126. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/presence.go +2 -1
  127. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/privacysettings.go +10 -11
  128. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/extra.go +7 -0
  129. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloAddMessage/InstamadilloAddMessage.pb.go +983 -0
  130. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloAddMessage/InstamadilloAddMessage.proto +85 -0
  131. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloAddMessage/extra.go +3 -0
  132. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeActionLog/InstamadilloCoreTypeActionLog.pb.go +197 -0
  133. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeActionLog/InstamadilloCoreTypeActionLog.proto +13 -0
  134. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeAdminMessage/InstamadilloCoreTypeAdminMessage.pb.go +279 -0
  135. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeAdminMessage/InstamadilloCoreTypeAdminMessage.proto +21 -0
  136. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeCollection/InstamadilloCoreTypeCollection.pb.go +137 -0
  137. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeCollection/InstamadilloCoreTypeCollection.proto +10 -0
  138. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeLink/InstamadilloCoreTypeLink.pb.go +313 -0
  139. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeLink/InstamadilloCoreTypeLink.proto +27 -0
  140. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeMedia/InstamadilloCoreTypeMedia.pb.go +1299 -0
  141. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeMedia/InstamadilloCoreTypeMedia.proto +112 -0
  142. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeText/InstamadilloCoreTypeText.pb.go +514 -0
  143. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeText/InstamadilloCoreTypeText.proto +47 -0
  144. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloDeleteMessage/InstamadilloDeleteMessage.pb.go +123 -0
  145. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloDeleteMessage/InstamadilloDeleteMessage.proto +7 -0
  146. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloDeleteMessage/extra.go +3 -0
  147. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloSupplementMessage/InstamadilloSupplementMessage.pb.go +720 -0
  148. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloSupplementMessage/InstamadilloSupplementMessage.proto +59 -0
  149. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloSupplementMessage/extra.go +3 -0
  150. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloTransportPayload/InstamadilloTransportPayload.pb.go +365 -0
  151. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloTransportPayload/InstamadilloTransportPayload.proto +33 -0
  152. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloXmaContentRef/InstamadilloXmaContentRef.pb.go +1238 -0
  153. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloXmaContentRef/InstamadilloXmaContentRef.proto +105 -0
  154. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waAdv/WAAdv.pb.go +39 -9
  155. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.pb.go +354 -175
  156. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.proto +5 -5
  157. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.pb.go +170 -15
  158. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.proto +4 -0
  159. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCert/WACert.pb.go +29 -9
  160. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waChatLockSettings/WAProtobufsChatLockSettings.pb.go +13 -9
  161. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.pb.go +344 -31
  162. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.proto +26 -0
  163. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/{WAWebProtobufsCompanionReg.pb.go → WACompanionReg.pb.go} +184 -89
  164. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/{WAWebProtobufsCompanionReg.proto → WACompanionReg.proto} +2 -1
  165. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waConsumerApplication/WAConsumerApplication.pb.go +173 -9
  166. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.pb.go +78 -16
  167. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.proto +5 -0
  168. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.pb.go +7428 -2151
  169. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.proto +373 -44
  170. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.pb.go +456 -135
  171. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.proto +14 -0
  172. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waLidMigrationSyncPayload/WAWebProtobufLidMigrationSyncPayload.pb.go +198 -0
  173. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waLidMigrationSyncPayload/WAWebProtobufLidMigrationSyncPayload.proto +14 -0
  174. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.pb.go +162 -9
  175. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.proto +1 -0
  176. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.pb.go +32 -9
  177. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.proto +1 -0
  178. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.pb.go +192 -52
  179. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.proto +8 -0
  180. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/WAMsgTransport.pb.go +60 -9
  181. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/extra.go +7 -6
  182. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMultiDevice/WAMultiDevice.pb.go +39 -9
  183. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waServerSync/WAServerSync.pb.go +61 -9
  184. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waStatusAttributions/WAStatusAttributions.pb.go +800 -0
  185. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waStatusAttributions/WAStatusAttributions.proto +72 -0
  186. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.pb.go +1344 -438
  187. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.proto +52 -0
  188. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waUserPassword/WAProtobufsUserPassword.pb.go +27 -9
  189. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waVnameCert/WAWebProtobufsVnameCert.pb.go +59 -9
  190. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.pb.go +382 -78
  191. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.proto +8 -0
  192. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.pb.go +563 -9
  193. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.proto +4 -0
  194. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/receipt.go +25 -9
  195. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/reportingfields.json +1 -0
  196. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/reportingtoken.go +176 -0
  197. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/retry.go +39 -21
  198. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/send.go +261 -75
  199. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/sendfb.go +28 -16
  200. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/clientpayload.go +3 -1
  201. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/noop.go +85 -43
  202. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/signal.go +75 -88
  203. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/container.go +86 -65
  204. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/lidmap.go +186 -0
  205. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/store.go +291 -167
  206. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/00-latest-schema.sql +155 -0
  207. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/03-message-secrets.sql +11 -0
  208. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/04-privacy-tokens.sql +8 -0
  209. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/05-account-jid-format.sql +2 -0
  210. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/06-facebook-uuid.sql +2 -0
  211. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/07-account-lid.sql +2 -0
  212. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/08-lid-mapping.sql +5 -0
  213. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/09-decryption-buffer.sql +10 -0
  214. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/10-chat-db-lid-migration-ts.sql +2 -0
  215. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/upgrades.go +22 -0
  216. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/store.go +107 -56
  217. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/botmap.go +210 -0
  218. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/events/events.go +13 -2
  219. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/group.go +15 -6
  220. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/jid.go +7 -8
  221. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/message.go +18 -0
  222. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/update.go +3 -2
  223. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/upload.go +1 -1
  224. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/user.go +47 -29
  225. slidge_whatsapp/vendor/golang.org/x/exp/LICENSE +27 -0
  226. slidge_whatsapp/vendor/golang.org/x/exp/PATENTS +22 -0
  227. slidge_whatsapp/vendor/golang.org/x/exp/constraints/constraints.go +54 -0
  228. slidge_whatsapp/vendor/golang.org/x/net/http/httpguts/guts.go +50 -0
  229. slidge_whatsapp/vendor/golang.org/x/net/http/httpguts/httplex.go +347 -0
  230. slidge_whatsapp/vendor/golang.org/x/net/http2/.gitignore +2 -0
  231. slidge_whatsapp/vendor/golang.org/x/net/http2/ascii.go +53 -0
  232. slidge_whatsapp/vendor/golang.org/x/net/http2/ciphers.go +641 -0
  233. slidge_whatsapp/vendor/golang.org/x/net/http2/client_conn_pool.go +311 -0
  234. slidge_whatsapp/vendor/golang.org/x/net/http2/config.go +122 -0
  235. slidge_whatsapp/vendor/golang.org/x/net/http2/config_go124.go +61 -0
  236. slidge_whatsapp/vendor/golang.org/x/net/http2/config_pre_go124.go +16 -0
  237. slidge_whatsapp/vendor/golang.org/x/net/http2/databuffer.go +149 -0
  238. slidge_whatsapp/vendor/golang.org/x/net/http2/errors.go +145 -0
  239. slidge_whatsapp/vendor/golang.org/x/net/http2/flow.go +120 -0
  240. slidge_whatsapp/vendor/golang.org/x/net/http2/frame.go +1702 -0
  241. slidge_whatsapp/vendor/golang.org/x/net/http2/gotrack.go +170 -0
  242. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/encode.go +245 -0
  243. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/hpack.go +523 -0
  244. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/huffman.go +226 -0
  245. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/static_table.go +188 -0
  246. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/tables.go +403 -0
  247. slidge_whatsapp/vendor/golang.org/x/net/http2/http2.go +432 -0
  248. slidge_whatsapp/vendor/golang.org/x/net/http2/pipe.go +184 -0
  249. slidge_whatsapp/vendor/golang.org/x/net/http2/server.go +3350 -0
  250. slidge_whatsapp/vendor/golang.org/x/net/http2/timer.go +20 -0
  251. slidge_whatsapp/vendor/golang.org/x/net/http2/transport.go +3287 -0
  252. slidge_whatsapp/vendor/golang.org/x/net/http2/unencrypted.go +32 -0
  253. slidge_whatsapp/vendor/golang.org/x/net/http2/write.go +381 -0
  254. slidge_whatsapp/vendor/golang.org/x/net/http2/writesched.go +251 -0
  255. slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_priority.go +451 -0
  256. slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_random.go +77 -0
  257. slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_roundrobin.go +119 -0
  258. slidge_whatsapp/vendor/golang.org/x/net/idna/go118.go +13 -0
  259. slidge_whatsapp/vendor/golang.org/x/net/idna/idna10.0.0.go +769 -0
  260. slidge_whatsapp/vendor/golang.org/x/net/idna/idna9.0.0.go +717 -0
  261. slidge_whatsapp/vendor/golang.org/x/net/idna/pre_go118.go +11 -0
  262. slidge_whatsapp/vendor/golang.org/x/net/idna/punycode.go +217 -0
  263. slidge_whatsapp/vendor/golang.org/x/net/idna/tables10.0.0.go +4559 -0
  264. slidge_whatsapp/vendor/golang.org/x/net/idna/tables11.0.0.go +4653 -0
  265. slidge_whatsapp/vendor/golang.org/x/net/idna/tables12.0.0.go +4733 -0
  266. slidge_whatsapp/vendor/golang.org/x/net/idna/tables13.0.0.go +4959 -0
  267. slidge_whatsapp/vendor/golang.org/x/net/idna/tables15.0.0.go +5144 -0
  268. slidge_whatsapp/vendor/golang.org/x/net/idna/tables9.0.0.go +4486 -0
  269. slidge_whatsapp/vendor/golang.org/x/net/idna/trie.go +51 -0
  270. slidge_whatsapp/vendor/golang.org/x/net/idna/trie12.0.0.go +30 -0
  271. slidge_whatsapp/vendor/golang.org/x/net/idna/trie13.0.0.go +30 -0
  272. slidge_whatsapp/vendor/golang.org/x/net/idna/trieval.go +119 -0
  273. slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/ascii.go +53 -0
  274. slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/headermap.go +115 -0
  275. slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/request.go +467 -0
  276. slidge_whatsapp/vendor/golang.org/x/sys/unix/syscall_darwin.go +148 -1
  277. slidge_whatsapp/vendor/golang.org/x/sys/unix/syscall_linux.go +16 -26
  278. slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +84 -0
  279. slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +20 -0
  280. slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +84 -0
  281. slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +20 -0
  282. slidge_whatsapp/vendor/golang.org/x/sys/windows/security_windows.go +44 -5
  283. slidge_whatsapp/vendor/golang.org/x/sys/windows/syscall_windows.go +4 -2
  284. slidge_whatsapp/vendor/golang.org/x/sys/windows/types_windows.go +239 -0
  285. slidge_whatsapp/vendor/golang.org/x/sys/windows/zsyscall_windows.go +9 -0
  286. slidge_whatsapp/vendor/golang.org/x/text/LICENSE +27 -0
  287. slidge_whatsapp/vendor/golang.org/x/text/PATENTS +22 -0
  288. slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule.go +336 -0
  289. slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go +11 -0
  290. slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go +14 -0
  291. slidge_whatsapp/vendor/golang.org/x/text/transform/transform.go +709 -0
  292. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/bidi.go +359 -0
  293. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/bracket.go +335 -0
  294. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/core.go +1071 -0
  295. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/prop.go +206 -0
  296. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go +1815 -0
  297. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go +1887 -0
  298. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go +1923 -0
  299. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go +1955 -0
  300. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go +2042 -0
  301. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go +1781 -0
  302. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/trieval.go +48 -0
  303. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/composition.go +512 -0
  304. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/forminfo.go +279 -0
  305. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/input.go +109 -0
  306. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/iter.go +458 -0
  307. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/normalize.go +610 -0
  308. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/readwriter.go +125 -0
  309. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go +7657 -0
  310. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go +7693 -0
  311. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables12.0.0.go +7710 -0
  312. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go +7760 -0
  313. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go +7907 -0
  314. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables9.0.0.go +7637 -0
  315. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/transform.go +88 -0
  316. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/trie.go +54 -0
  317. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpb +0 -0
  318. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/filedesc/editions.go +3 -0
  319. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +16 -0
  320. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/strs/{strings_unsafe_go121.go → strings_unsafe.go} +0 -2
  321. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/version/version.go +1 -1
  322. slidge_whatsapp/vendor/google.golang.org/protobuf/proto/merge.go +6 -0
  323. slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go +2 -0
  324. slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/{value_unsafe_go121.go → value_unsafe.go} +0 -2
  325. slidge_whatsapp/vendor/modules.txt +52 -13
  326. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/METADATA +1 -1
  327. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/RECORD +330 -184
  328. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/WHEEL +1 -1
  329. slidge_whatsapp/vendor/github.com/rs/zerolog/CNAME +0 -1
  330. slidge_whatsapp/vendor/github.com/rs/zerolog/_config.yml +0 -1
  331. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waAdv/WAAdv.pb.raw +0 -0
  332. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.pb.raw +0 -0
  333. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.pb.raw +0 -0
  334. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCert/WACert.pb.raw +0 -23
  335. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waChatLockSettings/WAProtobufsChatLockSettings.pb.raw +0 -7
  336. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.pb.raw +0 -0
  337. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/WAWebProtobufsCompanionReg.pb.raw +0 -0
  338. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waConsumerApplication/WAConsumerApplication.pb.raw +0 -0
  339. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.pb.raw +0 -0
  340. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.pb.raw +0 -0
  341. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.pb.raw +0 -0
  342. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.pb.raw +0 -0
  343. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.pb.raw +0 -0
  344. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.pb.raw +0 -0
  345. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/WAMsgTransport.pb.raw +0 -0
  346. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMultiDevice/WAMultiDevice.pb.raw +0 -0
  347. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waServerSync/WAServerSync.pb.raw +0 -0
  348. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.pb.raw +0 -0
  349. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waUserPassword/WAProtobufsUserPassword.pb.raw +0 -0
  350. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waVnameCert/WAWebProtobufsVnameCert.pb.raw +0 -0
  351. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.pb.raw +0 -0
  352. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.pb.raw +0 -0
  353. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrade.go +0 -296
  354. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go120.go +0 -94
  355. slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go120.go +0 -98
  356. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/LICENSE +0 -0
  357. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/entry_points.txt +0 -0
@@ -9,13 +9,17 @@ package whatsmeow
9
9
  import (
10
10
  "bytes"
11
11
  "compress/zlib"
12
+ "context"
13
+ "crypto/sha256"
12
14
  "encoding/hex"
13
15
  "errors"
14
16
  "fmt"
15
17
  "io"
16
18
  "runtime/debug"
19
+ "strconv"
17
20
  "time"
18
21
 
22
+ "github.com/rs/zerolog"
19
23
  "go.mau.fi/libsignal/groups"
20
24
  "go.mau.fi/libsignal/protocol"
21
25
  "go.mau.fi/libsignal/session"
@@ -27,6 +31,7 @@ import (
27
31
  waBinary "go.mau.fi/whatsmeow/binary"
28
32
  "go.mau.fi/whatsmeow/proto/waE2E"
29
33
  "go.mau.fi/whatsmeow/proto/waHistorySync"
34
+ "go.mau.fi/whatsmeow/proto/waLidMigrationSyncPayload"
30
35
  "go.mau.fi/whatsmeow/proto/waWeb"
31
36
  "go.mau.fi/whatsmeow/store"
32
37
  "go.mau.fi/whatsmeow/types"
@@ -36,33 +41,42 @@ import (
36
41
  var pbSerializer = store.SignalProtobufSerializer
37
42
 
38
43
  func (cli *Client) handleEncryptedMessage(node *waBinary.Node) {
44
+ ctx := cli.BackgroundEventCtx
39
45
  info, err := cli.parseMessageInfo(node)
40
46
  if err != nil {
41
47
  cli.Log.Warnf("Failed to parse message: %v", err)
42
48
  } else {
49
+ if !info.SenderAlt.IsEmpty() {
50
+ cli.StoreLIDPNMapping(ctx, info.SenderAlt, info.Sender)
51
+ } else if !info.RecipientAlt.IsEmpty() {
52
+ cli.StoreLIDPNMapping(ctx, info.RecipientAlt, info.Chat)
53
+ }
43
54
  if info.VerifiedName != nil && len(info.VerifiedName.Details.GetVerifiedName()) > 0 {
44
- go cli.updateBusinessName(info.Sender, info, info.VerifiedName.Details.GetVerifiedName())
55
+ go cli.updateBusinessName(cli.BackgroundEventCtx, info.Sender, info, info.VerifiedName.Details.GetVerifiedName())
45
56
  }
46
- if len(info.PushName) > 0 && info.PushName != "-" {
47
- go cli.updatePushName(info.Sender, info, info.PushName)
57
+ if len(info.PushName) > 0 && info.PushName != "-" && (cli.MessengerConfig == nil || info.PushName != "username") {
58
+ go cli.updatePushName(cli.BackgroundEventCtx, info.Sender, info, info.PushName)
48
59
  }
49
- defer cli.maybeDeferredAck(node)()
60
+ var cancelled bool
61
+ defer cli.maybeDeferredAck(ctx, node)(&cancelled)
50
62
  if info.Sender.Server == types.NewsletterServer {
51
- cli.handlePlaintextMessage(info, node)
63
+ cancelled = cli.handlePlaintextMessage(ctx, info, node)
52
64
  } else {
53
- cli.decryptMessages(info, node)
65
+ cancelled = cli.decryptMessages(ctx, info, node)
54
66
  }
55
67
  }
56
68
  }
57
69
 
58
70
  func (cli *Client) parseMessageSource(node *waBinary.Node, requireParticipant bool) (source types.MessageSource, err error) {
59
71
  clientID := cli.getOwnID()
72
+ clientLID := cli.Store.GetLID()
60
73
  if clientID.IsEmpty() {
61
74
  err = ErrNotLoggedIn
62
75
  return
63
76
  }
64
77
  ag := node.AttrGetter()
65
78
  from := ag.JID("from")
79
+ source.AddressingMode = types.AddressingMode(ag.OptionalString("addressing_mode"))
66
80
  if from.Server == types.GroupServer || from.Server == types.BroadcastServer {
67
81
  source.IsGroup = true
68
82
  source.Chat = from
@@ -71,7 +85,12 @@ func (cli *Client) parseMessageSource(node *waBinary.Node, requireParticipant bo
71
85
  } else {
72
86
  source.Sender = ag.OptionalJIDOrEmpty("participant")
73
87
  }
74
- if source.Sender.User == clientID.User {
88
+ if source.AddressingMode == types.AddressingModeLID {
89
+ source.SenderAlt = ag.OptionalJIDOrEmpty("participant_pn")
90
+ } else {
91
+ source.SenderAlt = ag.OptionalJIDOrEmpty("participant_lid")
92
+ }
93
+ if source.Sender.User == clientID.User || source.Sender.User == clientLID.User {
75
94
  source.IsFromMe = true
76
95
  }
77
96
  if from.Server == types.BroadcastServer {
@@ -81,7 +100,7 @@ func (cli *Client) parseMessageSource(node *waBinary.Node, requireParticipant bo
81
100
  source.Chat = from
82
101
  source.Sender = from
83
102
  // TODO IsFromMe?
84
- } else if from.User == clientID.User {
103
+ } else if from.User == clientID.User || from.User == clientLID.User {
85
104
  source.IsFromMe = true
86
105
  source.Sender = from
87
106
  recipient := ag.OptionalJID("recipient")
@@ -90,6 +109,11 @@ func (cli *Client) parseMessageSource(node *waBinary.Node, requireParticipant bo
90
109
  } else {
91
110
  source.Chat = from.ToNonAD()
92
111
  }
112
+ if source.Chat.Server == types.HiddenUserServer {
113
+ source.RecipientAlt = ag.OptionalJIDOrEmpty("peer_recipient_pn")
114
+ } else {
115
+ source.RecipientAlt = ag.OptionalJIDOrEmpty("peer_recipient_lid")
116
+ }
93
117
  } else if from.IsBot() {
94
118
  source.Sender = from
95
119
  meta := node.GetChildByTag("meta")
@@ -103,6 +127,14 @@ func (cli *Client) parseMessageSource(node *waBinary.Node, requireParticipant bo
103
127
  } else {
104
128
  source.Chat = from.ToNonAD()
105
129
  source.Sender = from
130
+ if source.Sender.Server == types.HiddenUserServer {
131
+ source.SenderAlt = ag.OptionalJIDOrEmpty("sender_pn")
132
+ } else {
133
+ source.SenderAlt = ag.OptionalJIDOrEmpty("sender_lid")
134
+ }
135
+ }
136
+ if !source.SenderAlt.IsEmpty() && source.SenderAlt.Device == 0 {
137
+ source.SenderAlt.Device = source.Sender.Device
106
138
  }
107
139
  err = ag.Error()
108
140
  return
@@ -125,11 +157,15 @@ func (cli *Client) parseMsgMetaInfo(node waBinary.Node) (metaInfo types.MsgMetaI
125
157
  metaNode := node.GetChildByTag("meta")
126
158
 
127
159
  ag := metaNode.AttrGetter()
128
- metaInfo.TargetID = types.MessageID(ag.String("target_id"))
129
- targetSenderJID := ag.OptionalJIDOrEmpty("target_sender_jid")
130
- if targetSenderJID.User != "" {
131
- metaInfo.TargetSender = targetSenderJID
160
+ metaInfo.TargetID = types.MessageID(ag.OptionalString("target_id"))
161
+ metaInfo.TargetSender = ag.OptionalJIDOrEmpty("target_sender_jid")
162
+ metaInfo.TargetChat = ag.OptionalJIDOrEmpty("target_chat_jid")
163
+ deprecatedLIDSession, ok := ag.GetBool("deprecated_lid_session", false)
164
+ if ok {
165
+ metaInfo.DeprecatedLIDSession = &deprecatedLIDSession
132
166
  }
167
+ metaInfo.ThreadMessageID = types.MessageID(ag.OptionalString("thread_msg_id"))
168
+ metaInfo.ThreadMessageSenderJID = ag.OptionalJIDOrEmpty("thread_msg_sender_jid")
133
169
  err = ag.Error()
134
170
  return
135
171
  }
@@ -168,8 +204,10 @@ func (cli *Client) parseMessageInfo(node *waBinary.Node) (*types.MessageInfo, er
168
204
  cli.Log.Warnf("Failed to parse <bot> node in %s: %v", info.ID, err)
169
205
  }
170
206
  case "meta":
171
- // TODO parse non-bot metadata too
172
- info.MsgMetaInfo, _ = cli.parseMsgMetaInfo(child)
207
+ info.MsgMetaInfo, err = cli.parseMsgMetaInfo(child)
208
+ if err != nil {
209
+ cli.Log.Warnf("Failed to parse <meta> node in %s: %v", info.ID, err)
210
+ }
173
211
  case "franking":
174
212
  // TODO
175
213
  case "trace":
@@ -184,7 +222,7 @@ func (cli *Client) parseMessageInfo(node *waBinary.Node) (*types.MessageInfo, er
184
222
  return &info, nil
185
223
  }
186
224
 
187
- func (cli *Client) handlePlaintextMessage(info *types.MessageInfo, node *waBinary.Node) {
225
+ func (cli *Client) handlePlaintextMessage(ctx context.Context, info *types.MessageInfo, node *waBinary.Node) (handlerFailed bool) {
188
226
  // TODO edits have an additional <meta msg_edit_t="1696321271735" original_msg_t="1696321248"/> node
189
227
  plaintext, ok := node.GetOptionalChildByTag("plaintext")
190
228
  if !ok {
@@ -203,7 +241,7 @@ func (cli *Client) handlePlaintextMessage(info *types.MessageInfo, node *waBinar
203
241
  cli.Log.Warnf("Error unmarshaling plaintext message from %s: %v", info.SourceString(), err)
204
242
  return
205
243
  }
206
- cli.storeMessageSecret(info, &msg)
244
+ cli.storeMessageSecret(ctx, info, &msg)
207
245
  evt := &events.Message{
208
246
  Info: *info,
209
247
  RawMessage: &msg,
@@ -215,16 +253,26 @@ func (cli *Client) handlePlaintextMessage(info *types.MessageInfo, node *waBinar
215
253
  OriginalTS: meta.AttrGetter().UnixTime("original_msg_t"),
216
254
  }
217
255
  }
218
- cli.dispatchEvent(evt.UnwrapRaw())
219
- return
256
+ return cli.dispatchEvent(evt.UnwrapRaw())
220
257
  }
221
258
 
222
- func (cli *Client) decryptMessages(info *types.MessageInfo, node *waBinary.Node) {
259
+ func (cli *Client) migrateSessionStore(ctx context.Context, pn, lid types.JID) {
260
+ err := cli.Store.Sessions.MigratePNToLID(ctx, pn, lid)
261
+ if err != nil {
262
+ cli.Log.Errorf("Failed to migrate signal store from %s to %s: %v", pn, lid, err)
263
+ }
264
+ }
265
+
266
+ func (cli *Client) decryptMessages(ctx context.Context, info *types.MessageInfo, node *waBinary.Node) (handlerFailed bool) {
223
267
  unavailableNode, ok := node.GetOptionalChildByTag("unavailable")
224
268
  if ok && len(node.GetChildrenByTag("enc")) == 0 {
225
269
  uType := events.UnavailableType(unavailableNode.AttrGetter().String("type"))
226
270
  cli.Log.Warnf("Unavailable message %s from %s (type: %q)", info.ID, info.SourceString(), uType)
227
- go cli.delayedRequestMessageFromPhone(info)
271
+ if cli.SynchronousAck {
272
+ cli.immediateRequestMessageFromPhone(ctx, info)
273
+ } else {
274
+ go cli.delayedRequestMessageFromPhone(info)
275
+ }
228
276
  cli.dispatchEvent(&events.UndecryptableMessage{Info: *info, IsUnavailable: true, UnavailableType: uType})
229
277
  return
230
278
  }
@@ -233,6 +281,21 @@ func (cli *Client) decryptMessages(info *types.MessageInfo, node *waBinary.Node)
233
281
  cli.Log.Debugf("Decrypting message from %s", info.SourceString())
234
282
  handled := false
235
283
  containsDirectMsg := false
284
+ senderEncryptionJID := info.Sender
285
+ if info.Sender.Server == types.DefaultUserServer && !info.Sender.IsBot() {
286
+ if info.SenderAlt.Server == types.HiddenUserServer {
287
+ senderEncryptionJID = info.SenderAlt
288
+ cli.migrateSessionStore(ctx, info.Sender, info.SenderAlt)
289
+ } else if lid, err := cli.Store.LIDs.GetLIDForPN(ctx, info.Sender); err != nil {
290
+ cli.Log.Errorf("Failed to get LID for %s: %v", info.Sender, err)
291
+ } else if !lid.IsEmpty() {
292
+ cli.migrateSessionStore(ctx, info.Sender, lid)
293
+ senderEncryptionJID = lid
294
+ info.SenderAlt = lid
295
+ } else {
296
+ cli.Log.Warnf("No LID found for %s", info.Sender)
297
+ }
298
+ }
236
299
  for _, child := range children {
237
300
  if child.Tag != "enc" {
238
301
  continue
@@ -243,61 +306,64 @@ func (cli *Client) decryptMessages(info *types.MessageInfo, node *waBinary.Node)
243
306
  continue
244
307
  }
245
308
  var decrypted []byte
309
+ var ciphertextHash *[32]byte
246
310
  var err error
247
311
  if encType == "pkmsg" || encType == "msg" {
248
- decrypted, err = cli.decryptDM(&child, info.Sender, encType == "pkmsg")
312
+ decrypted, ciphertextHash, err = cli.decryptDM(ctx, &child, senderEncryptionJID, encType == "pkmsg", info.Timestamp)
249
313
  containsDirectMsg = true
250
314
  } else if info.IsGroup && encType == "skmsg" {
251
- decrypted, err = cli.decryptGroupMsg(&child, info.Sender, info.Chat)
315
+ decrypted, ciphertextHash, err = cli.decryptGroupMsg(ctx, &child, senderEncryptionJID, info.Chat, info.Timestamp)
252
316
  } else if encType == "msmsg" && info.Sender.IsBot() {
253
- // Meta AI / other bots (biz?):
254
-
255
- // step 1: get message secret
256
317
  targetSenderJID := info.MsgMetaInfo.TargetSender
318
+ messageSecretSenderJID := targetSenderJID
257
319
  if targetSenderJID.User == "" {
258
- // if no targetSenderJID in <meta> this must be ourselves (one-one-one mode)
259
- targetSenderJID = cli.getOwnID()
320
+ if info.Sender.Server == types.BotServer {
321
+ targetSenderJID = cli.Store.GetLID()
322
+ } else {
323
+ targetSenderJID = cli.getOwnID()
324
+ }
325
+ messageSecretSenderJID = cli.getOwnID()
260
326
  }
261
-
262
- messageSecret, err := cli.Store.MsgSecrets.GetMessageSecret(info.Chat, targetSenderJID, info.MsgMetaInfo.TargetID)
263
- if err != nil || messageSecret == nil {
264
- cli.Log.Warnf("Error getting message secret for bot msg with id %s", node.AttrGetter().String("id"))
265
- continue
327
+ var decryptMessageID string
328
+ if info.MsgBotInfo.EditType == types.EditTypeInner || info.MsgBotInfo.EditType == types.EditTypeLast {
329
+ decryptMessageID = info.MsgBotInfo.EditTargetID
330
+ } else {
331
+ decryptMessageID = info.ID
266
332
  }
267
-
268
- // step 2: get MessageSecretMessage
269
- byteContents := child.Content.([]byte) // <enc> contents
270
333
  var msMsg waE2E.MessageSecretMessage
271
-
272
- err = proto.Unmarshal(byteContents, &msMsg)
273
- if err != nil {
274
- cli.Log.Warnf("Error decoding MessageSecretMesage protobuf %v", err)
275
- continue
276
- }
277
-
278
- // step 3: determine best message id for decryption
279
- var messageID string
280
- if info.MsgBotInfo.EditType == types.EditTypeInner || info.MsgBotInfo.EditType == types.EditTypeLast {
281
- messageID = info.MsgBotInfo.EditTargetID
334
+ var messageSecret []byte
335
+ if messageSecret, err = cli.Store.MsgSecrets.GetMessageSecret(ctx, info.Chat, messageSecretSenderJID, info.MsgMetaInfo.TargetID); err != nil {
336
+ err = fmt.Errorf("failed to get message secret for %s: %v", info.MsgMetaInfo.TargetID, err)
337
+ } else if messageSecret == nil {
338
+ err = fmt.Errorf("message secret for %s not found", info.MsgMetaInfo.TargetID)
339
+ } else if err = proto.Unmarshal(child.Content.([]byte), &msMsg); err != nil {
340
+ err = fmt.Errorf("failed to unmarshal MessageSecretMessage protobuf: %v", err)
282
341
  } else {
283
- messageID = info.ID
342
+ decrypted, err = cli.decryptBotMessage(ctx, messageSecret, &msMsg, decryptMessageID, targetSenderJID, info)
284
343
  }
285
-
286
- // step 4: decrypt and voila
287
- decrypted, err = cli.decryptBotMessage(messageSecret, &msMsg, messageID, targetSenderJID, info)
288
344
  } else {
289
345
  cli.Log.Warnf("Unhandled encrypted message (type %s) from %s", encType, info.SourceString())
290
346
  continue
291
347
  }
292
348
 
293
- if err != nil {
294
- cli.Log.Warnf("Error decrypting message from %s: %v", info.SourceString(), err)
349
+ if errors.Is(err, EventAlreadyProcessed) {
350
+ cli.Log.Debugf("Ignoring message %s from %s: %v", info.ID, info.SourceString(), err)
351
+ return
352
+ } else if err != nil {
353
+ cli.Log.Warnf("Error decrypting message %s from %s: %v", info.ID, info.SourceString(), err)
354
+ if ctx.Err() != nil {
355
+ handlerFailed = true
356
+ return
357
+ }
295
358
  isUnavailable := encType == "skmsg" && !containsDirectMsg && errors.Is(err, signalerror.ErrNoSenderKeyForUser)
296
- // TODO figure out why @bot messages fail to decrypt
297
- if info.Chat.Server != types.BotServer {
298
- go cli.sendRetryReceipt(node, info, isUnavailable)
359
+ if encType != "msmsg" {
360
+ if cli.SynchronousAck {
361
+ cli.sendRetryReceipt(ctx, node, info, isUnavailable)
362
+ } else {
363
+ go cli.sendRetryReceipt(context.WithoutCancel(ctx), node, info, isUnavailable)
364
+ }
299
365
  }
300
- cli.dispatchEvent(&events.UndecryptableMessage{
366
+ handlerFailed = cli.dispatchEvent(&events.UndecryptableMessage{
301
367
  Info: *info,
302
368
  IsUnavailable: isUnavailable,
303
369
  DecryptFailMode: events.DecryptFailMode(ag.OptionalString("decrypt-fail")),
@@ -315,85 +381,184 @@ func (cli *Client) decryptMessages(info *types.MessageInfo, node *waBinary.Node)
315
381
  cli.Log.Warnf("Error unmarshaling decrypted message from %s: %v", info.SourceString(), err)
316
382
  continue
317
383
  }
318
- cli.handleDecryptedMessage(info, &msg, retryCount)
384
+ handlerFailed = cli.handleDecryptedMessage(ctx, info, &msg, retryCount)
319
385
  handled = true
320
386
  case 3:
321
- handled = cli.handleDecryptedArmadillo(info, decrypted, retryCount)
387
+ handled, handlerFailed = cli.handleDecryptedArmadillo(ctx, info, decrypted, retryCount)
322
388
  default:
323
389
  cli.Log.Warnf("Unknown version %d in decrypted message from %s", ag.Int("v"), info.SourceString())
324
390
  }
391
+ if ciphertextHash != nil && cli.EnableDecryptedEventBuffer {
392
+ // Use the context passed to decryptMessages
393
+ err = cli.Store.EventBuffer.ClearBufferedEventPlaintext(ctx, *ciphertextHash)
394
+ if err != nil {
395
+ zerolog.Ctx(ctx).Err(err).
396
+ Hex("ciphertext_hash", ciphertextHash[:]).
397
+ Msg("Failed to clear buffered event plaintext")
398
+ } else {
399
+ zerolog.Ctx(ctx).Debug().
400
+ Hex("ciphertext_hash", ciphertextHash[:]).
401
+ Msg("Deleted event plaintext from buffer")
402
+ }
403
+
404
+ if time.Since(cli.lastDecryptedBufferClear) > 12*time.Hour && ctx.Err() == nil {
405
+ cli.lastDecryptedBufferClear = time.Now()
406
+ go func() {
407
+ err := cli.Store.EventBuffer.DeleteOldBufferedHashes(context.WithoutCancel(ctx))
408
+ if err != nil {
409
+ zerolog.Ctx(ctx).Err(err).Msg("Failed to delete old buffered hashes")
410
+ }
411
+ }()
412
+ }
413
+ }
325
414
  }
326
415
  if handled {
327
416
  go cli.sendMessageReceipt(info)
328
417
  }
418
+ return
329
419
  }
330
420
 
331
- func (cli *Client) clearUntrustedIdentity(target types.JID) {
332
- err := cli.Store.Identities.DeleteIdentity(target.SignalAddress().String())
421
+ func (cli *Client) clearUntrustedIdentity(ctx context.Context, target types.JID) error {
422
+ err := cli.Store.Identities.DeleteIdentity(ctx, target.SignalAddress().String())
333
423
  if err != nil {
334
- cli.Log.Warnf("Failed to delete untrusted identity of %s from store: %v", target, err)
424
+ return fmt.Errorf("failed to delete identity: %w", err)
335
425
  }
336
- err = cli.Store.Sessions.DeleteSession(target.SignalAddress().String())
426
+ err = cli.Store.Sessions.DeleteSession(ctx, target.SignalAddress().String())
337
427
  if err != nil {
338
- cli.Log.Warnf("Failed to delete session with %s (untrusted identity) from store: %v", target, err)
428
+ return fmt.Errorf("failed to delete session: %w", err)
429
+ }
430
+ go cli.dispatchEvent(&events.IdentityChange{JID: target, Timestamp: time.Now(), Implicit: true})
431
+ return nil
432
+ }
433
+
434
+ var EventAlreadyProcessed = errors.New("event was already processed")
435
+
436
+ func (cli *Client) bufferedDecrypt(
437
+ ctx context.Context,
438
+ ciphertext []byte,
439
+ serverTimestamp time.Time,
440
+ decrypt func(context.Context) ([]byte, error),
441
+ ) (plaintext []byte, ciphertextHash [32]byte, err error) {
442
+ if !cli.EnableDecryptedEventBuffer {
443
+ plaintext, err = decrypt(ctx)
444
+ return
445
+ }
446
+ ciphertextHash = sha256.Sum256(ciphertext)
447
+ var buf *store.BufferedEvent
448
+ buf, err = cli.Store.EventBuffer.GetBufferedEvent(ctx, ciphertextHash)
449
+ if err != nil {
450
+ err = fmt.Errorf("failed to get buffered event: %w", err)
451
+ return
452
+ } else if buf != nil {
453
+ if buf.Plaintext == nil {
454
+ zerolog.Ctx(ctx).Debug().
455
+ Hex("ciphertext_hash", ciphertextHash[:]).
456
+ Time("insertion_time", buf.InsertTime).
457
+ Msg("Returning event already processed error")
458
+ err = fmt.Errorf("%w at %s", EventAlreadyProcessed, buf.InsertTime.String())
459
+ return
460
+ }
461
+ zerolog.Ctx(ctx).Debug().
462
+ Hex("ciphertext_hash", ciphertextHash[:]).
463
+ Time("insertion_time", buf.InsertTime).
464
+ Msg("Returning previously decrypted plaintext")
465
+ plaintext = buf.Plaintext
466
+ return
467
+ }
468
+
469
+ err = cli.Store.EventBuffer.DoDecryptionTxn(ctx, func(ctx context.Context) (innerErr error) {
470
+ plaintext, innerErr = decrypt(ctx)
471
+ if innerErr != nil {
472
+ return
473
+ }
474
+ innerErr = cli.Store.EventBuffer.PutBufferedEvent(ctx, ciphertextHash, plaintext, serverTimestamp)
475
+ if innerErr != nil {
476
+ innerErr = fmt.Errorf("failed to save decrypted event to buffer: %w", innerErr)
477
+ }
478
+ return
479
+ })
480
+ if err == nil {
481
+ zerolog.Ctx(ctx).Debug().
482
+ Hex("ciphertext_hash", ciphertextHash[:]).
483
+ Msg("Successfully decrypted and saved event")
339
484
  }
340
- cli.dispatchEvent(&events.IdentityChange{JID: target, Timestamp: time.Now(), Implicit: true})
485
+ return
341
486
  }
342
487
 
343
- func (cli *Client) decryptDM(child *waBinary.Node, from types.JID, isPreKey bool) ([]byte, error) {
344
- content, _ := child.Content.([]byte)
488
+ func (cli *Client) decryptDM(ctx context.Context, child *waBinary.Node, from types.JID, isPreKey bool, serverTS time.Time) ([]byte, *[32]byte, error) {
489
+ content, ok := child.Content.([]byte)
490
+ if !ok {
491
+ return nil, nil, fmt.Errorf("message content is not a byte slice")
492
+ }
345
493
 
346
494
  builder := session.NewBuilderFromSignal(cli.Store, from.SignalAddress(), pbSerializer)
347
495
  cipher := session.NewCipher(builder, from.SignalAddress())
348
496
  var plaintext []byte
497
+ var ciphertextHash [32]byte
349
498
  if isPreKey {
350
499
  preKeyMsg, err := protocol.NewPreKeySignalMessageFromBytes(content, pbSerializer.PreKeySignalMessage, pbSerializer.SignalMessage)
351
500
  if err != nil {
352
- return nil, fmt.Errorf("failed to parse prekey message: %w", err)
353
- }
354
- plaintext, _, err = cipher.DecryptMessageReturnKey(preKeyMsg)
355
- if cli.AutoTrustIdentity && errors.Is(err, signalerror.ErrUntrustedIdentity) {
356
- cli.Log.Warnf("Got %v error while trying to decrypt prekey message from %s, clearing stored identity and retrying", err, from)
357
- cli.clearUntrustedIdentity(from)
358
- plaintext, _, err = cipher.DecryptMessageReturnKey(preKeyMsg)
359
- }
501
+ return nil, nil, fmt.Errorf("failed to parse prekey message: %w", err)
502
+ }
503
+ plaintext, ciphertextHash, err = cli.bufferedDecrypt(ctx, content, serverTS, func(decryptCtx context.Context) ([]byte, error) {
504
+ pt, innerErr := cipher.DecryptMessage(decryptCtx, preKeyMsg)
505
+ if cli.AutoTrustIdentity && errors.Is(innerErr, signalerror.ErrUntrustedIdentity) {
506
+ cli.Log.Warnf("Got %v error while trying to decrypt prekey message from %s, clearing stored identity and retrying", innerErr, from)
507
+ if innerErr = cli.clearUntrustedIdentity(decryptCtx, from); innerErr != nil {
508
+ innerErr = fmt.Errorf("failed to clear untrusted identity: %w", innerErr)
509
+ return nil, innerErr
510
+ }
511
+ pt, innerErr = cipher.DecryptMessage(decryptCtx, preKeyMsg)
512
+ }
513
+ return pt, innerErr
514
+ })
360
515
  if err != nil {
361
- return nil, fmt.Errorf("failed to decrypt prekey message: %w", err)
516
+ return nil, nil, fmt.Errorf("failed to decrypt prekey message: %w", err)
362
517
  }
363
518
  } else {
364
519
  msg, err := protocol.NewSignalMessageFromBytes(content, pbSerializer.SignalMessage)
365
520
  if err != nil {
366
- return nil, fmt.Errorf("failed to parse normal message: %w", err)
521
+ return nil, nil, fmt.Errorf("failed to parse normal message: %w", err)
367
522
  }
368
- plaintext, err = cipher.Decrypt(msg)
523
+ plaintext, ciphertextHash, err = cli.bufferedDecrypt(ctx, content, serverTS, func(decryptCtx context.Context) ([]byte, error) {
524
+ return cipher.Decrypt(decryptCtx, msg)
525
+ })
369
526
  if err != nil {
370
- return nil, fmt.Errorf("failed to decrypt normal message: %w", err)
527
+ return nil, nil, fmt.Errorf("failed to decrypt normal message: %w", err)
371
528
  }
372
529
  }
373
- if child.AttrGetter().Int("v") == 3 {
374
- return plaintext, nil
530
+ var err error
531
+ plaintext, err = unpadMessage(plaintext, child.AttrGetter().Int("v"))
532
+ if err != nil {
533
+ return nil, nil, fmt.Errorf("failed to unpad message: %w", err)
375
534
  }
376
- return unpadMessage(plaintext)
535
+ return plaintext, &ciphertextHash, nil
377
536
  }
378
537
 
379
- func (cli *Client) decryptGroupMsg(child *waBinary.Node, from types.JID, chat types.JID) ([]byte, error) {
380
- content, _ := child.Content.([]byte)
538
+ func (cli *Client) decryptGroupMsg(ctx context.Context, child *waBinary.Node, from types.JID, chat types.JID, serverTS time.Time) ([]byte, *[32]byte, error) {
539
+ content, ok := child.Content.([]byte)
540
+ if !ok {
541
+ return nil, nil, fmt.Errorf("message content is not a byte slice")
542
+ }
381
543
 
382
544
  senderKeyName := protocol.NewSenderKeyName(chat.String(), from.SignalAddress())
383
545
  builder := groups.NewGroupSessionBuilder(cli.Store, pbSerializer)
384
546
  cipher := groups.NewGroupCipher(builder, senderKeyName, cli.Store)
385
547
  msg, err := protocol.NewSenderKeyMessageFromBytes(content, pbSerializer.SenderKeyMessage)
386
548
  if err != nil {
387
- return nil, fmt.Errorf("failed to parse group message: %w", err)
549
+ return nil, nil, fmt.Errorf("failed to parse group message: %w", err)
388
550
  }
389
- plaintext, err := cipher.Decrypt(msg)
551
+ plaintext, ciphertextHash, err := cli.bufferedDecrypt(ctx, content, serverTS, func(decryptCtx context.Context) ([]byte, error) {
552
+ return cipher.Decrypt(decryptCtx, msg)
553
+ })
390
554
  if err != nil {
391
- return nil, fmt.Errorf("failed to decrypt group message: %w", err)
555
+ return nil, nil, fmt.Errorf("failed to decrypt group message: %w", err)
392
556
  }
393
- if child.AttrGetter().Int("v") == 3 {
394
- return plaintext, nil
557
+ plaintext, err = unpadMessage(plaintext, child.AttrGetter().Int("v"))
558
+ if err != nil {
559
+ return nil, nil, err
395
560
  }
396
- return unpadMessage(plaintext)
561
+ return plaintext, &ciphertextHash, nil
397
562
  }
398
563
 
399
564
  const checkPadding = true
@@ -404,14 +569,16 @@ func isValidPadding(plaintext []byte) bool {
404
569
  return bytes.HasSuffix(plaintext, expectedPadding)
405
570
  }
406
571
 
407
- func unpadMessage(plaintext []byte) ([]byte, error) {
408
- if len(plaintext) == 0 {
572
+ func unpadMessage(plaintext []byte, version int) ([]byte, error) {
573
+ if version == 3 {
574
+ return plaintext, nil
575
+ } else if len(plaintext) == 0 {
409
576
  return nil, fmt.Errorf("plaintext is empty")
410
- }
411
- if checkPadding && !isValidPadding(plaintext) {
577
+ } else if checkPadding && !isValidPadding(plaintext) {
412
578
  return nil, fmt.Errorf("plaintext doesn't have expected padding")
579
+ } else {
580
+ return plaintext[:len(plaintext)-int(plaintext[len(plaintext)-1])], nil
413
581
  }
414
- return plaintext[:len(plaintext)-int(plaintext[len(plaintext)-1])], nil
415
582
  }
416
583
 
417
584
  func padMessage(plaintext []byte) []byte {
@@ -424,7 +591,7 @@ func padMessage(plaintext []byte) []byte {
424
591
  return plaintext
425
592
  }
426
593
 
427
- func (cli *Client) handleSenderKeyDistributionMessage(chat, from types.JID, axolotlSKDM []byte) {
594
+ func (cli *Client) handleSenderKeyDistributionMessage(ctx context.Context, chat, from types.JID, axolotlSKDM []byte) {
428
595
  builder := groups.NewGroupSessionBuilder(cli.Store, pbSerializer)
429
596
  senderKeyName := protocol.NewSenderKeyName(chat.String(), from.SignalAddress())
430
597
  sdkMsg, err := protocol.NewSenderKeyDistributionMessageFromBytes(axolotlSKDM, pbSerializer.SenderKeyDistributionMessage)
@@ -432,7 +599,11 @@ func (cli *Client) handleSenderKeyDistributionMessage(chat, from types.JID, axol
432
599
  cli.Log.Errorf("Failed to parse sender key distribution message from %s for %s: %v", from, chat, err)
433
600
  return
434
601
  }
435
- builder.Process(senderKeyName, sdkMsg)
602
+ err = builder.Process(ctx, senderKeyName, sdkMsg)
603
+ if err != nil {
604
+ cli.Log.Errorf("Failed to process sender key distribution message from %s for %s: %v", from, chat, err)
605
+ return
606
+ }
436
607
  cli.Log.Debugf("Processed sender key distribution message from %s in %s", senderKeyName.Sender().String(), senderKeyName.GroupID())
437
608
  }
438
609
 
@@ -451,35 +622,56 @@ func (cli *Client) handleHistorySyncNotificationLoop() {
451
622
  go cli.handleHistorySyncNotificationLoop()
452
623
  }
453
624
  }()
625
+ ctx := cli.BackgroundEventCtx
454
626
  for notif := range cli.historySyncNotifications {
455
- cli.handleHistorySyncNotification(notif)
627
+ blob, err := cli.DownloadHistorySync(ctx, notif, false)
628
+ if err != nil {
629
+ cli.Log.Errorf("Failed to download history sync: %v", err)
630
+ } else {
631
+ cli.dispatchEvent(&events.HistorySync{Data: blob})
632
+ }
456
633
  }
457
634
  }
458
635
 
459
- func (cli *Client) handleHistorySyncNotification(notif *waE2E.HistorySyncNotification) {
636
+ // DownloadHistorySync will download and parse the history sync blob from the given history sync notification.
637
+ //
638
+ // You only need to call this manually if you set [Client.ManualHistorySyncDownload] to true.
639
+ // By default, whatsmeow will call this automatically and dispatch an [events.HistorySync] with the parsed data.
640
+ func (cli *Client) DownloadHistorySync(ctx context.Context, notif *waE2E.HistorySyncNotification, synchronousStorage bool) (*waHistorySync.HistorySync, error) {
460
641
  var historySync waHistorySync.HistorySync
461
- if data, err := cli.Download(notif); err != nil {
462
- cli.Log.Errorf("Failed to download history sync data: %v", err)
642
+ if data, err := cli.Download(ctx, notif); err != nil {
643
+ return nil, fmt.Errorf("failed to download: %w", err)
463
644
  } else if reader, err := zlib.NewReader(bytes.NewReader(data)); err != nil {
464
- cli.Log.Errorf("Failed to create zlib reader for history sync data: %v", err)
645
+ return nil, fmt.Errorf("failed to prepare to decompress: %w", err)
465
646
  } else if rawData, err := io.ReadAll(reader); err != nil {
466
- cli.Log.Errorf("Failed to decompress history sync data: %v", err)
647
+ return nil, fmt.Errorf("failed to decompress: %w", err)
467
648
  } else if err = proto.Unmarshal(rawData, &historySync); err != nil {
468
- cli.Log.Errorf("Failed to unmarshal history sync data: %v", err)
649
+ return nil, fmt.Errorf("failed to unmarshal: %w", err)
469
650
  } else {
470
651
  cli.Log.Debugf("Received history sync (type %s, chunk %d)", historySync.GetSyncType(), historySync.GetChunkOrder())
471
- if historySync.GetSyncType() == waHistorySync.HistorySync_PUSH_NAME {
472
- go cli.handleHistoricalPushNames(historySync.GetPushnames())
473
- } else if len(historySync.GetConversations()) > 0 {
474
- go cli.storeHistoricalMessageSecrets(historySync.GetConversations())
652
+ doStorage := func(ctx context.Context) {
653
+ if historySync.GetSyncType() == waHistorySync.HistorySync_PUSH_NAME {
654
+ cli.handleHistoricalPushNames(ctx, historySync.GetPushnames())
655
+ } else if len(historySync.GetConversations()) > 0 {
656
+ cli.storeHistoricalMessageSecrets(ctx, historySync.GetConversations())
657
+ }
658
+ if len(historySync.GetPhoneNumberToLidMappings()) > 0 {
659
+ cli.storeHistoricalPNLIDMappings(ctx, historySync.GetPhoneNumberToLidMappings())
660
+ }
661
+ if historySync.GlobalSettings != nil {
662
+ cli.storeGlobalSettings(ctx, historySync.GlobalSettings)
663
+ }
475
664
  }
476
- cli.dispatchEvent(&events.HistorySync{
477
- Data: &historySync,
478
- })
665
+ if synchronousStorage {
666
+ doStorage(ctx)
667
+ } else {
668
+ go doStorage(context.WithoutCancel(ctx))
669
+ }
670
+ return &historySync, nil
479
671
  }
480
672
  }
481
673
 
482
- func (cli *Client) handleAppStateSyncKeyShare(keys *waE2E.AppStateSyncKeyShare) {
674
+ func (cli *Client) handleAppStateSyncKeyShare(ctx context.Context, keys *waE2E.AppStateSyncKeyShare) {
483
675
  onlyResyncIfNotSynced := true
484
676
 
485
677
  cli.Log.Debugf("Got %d new app state keys", len(keys.GetKeys()))
@@ -494,7 +686,7 @@ func (cli *Client) handleAppStateSyncKeyShare(keys *waE2E.AppStateSyncKeyShare)
494
686
  if isReRequest {
495
687
  onlyResyncIfNotSynced = false
496
688
  }
497
- err = cli.Store.AppStateKeys.PutAppStateSyncKey(key.GetKeyID().GetKeyID(), store.AppStateSyncKey{
689
+ err = cli.Store.AppStateKeys.PutAppStateSyncKey(ctx, key.GetKeyID().GetKeyID(), store.AppStateSyncKey{
498
690
  Data: key.GetKeyData().GetKeyData(),
499
691
  Fingerprint: marshaledFingerprint,
500
692
  Timestamp: key.GetKeyData().GetTimestamp(),
@@ -508,17 +700,18 @@ func (cli *Client) handleAppStateSyncKeyShare(keys *waE2E.AppStateSyncKeyShare)
508
700
  cli.appStateKeyRequestsLock.RUnlock()
509
701
 
510
702
  for _, name := range appstate.AllPatchNames {
511
- err := cli.FetchAppState(name, false, onlyResyncIfNotSynced)
703
+ err := cli.FetchAppState(ctx, name, false, onlyResyncIfNotSynced)
512
704
  if err != nil {
513
705
  cli.Log.Errorf("Failed to do initial fetch of app state %s: %v", name, err)
514
706
  }
515
707
  }
516
708
  }
517
709
 
518
- func (cli *Client) handlePlaceholderResendResponse(msg *waE2E.PeerDataOperationRequestResponseMessage) {
710
+ func (cli *Client) handlePlaceholderResendResponse(msg *waE2E.PeerDataOperationRequestResponseMessage) (ok bool) {
519
711
  reqID := msg.GetStanzaID()
520
712
  parts := msg.GetPeerDataOperationResult()
521
713
  cli.Log.Debugf("Handling response to placeholder resend request %s with %d items", reqID, len(parts))
714
+ ok = true
522
715
  for i, part := range parts {
523
716
  var webMsg waWeb.WebMessageInfo
524
717
  if resp := part.GetPlaceholderMessageResendResponse(); resp == nil {
@@ -529,36 +722,51 @@ func (cli *Client) handlePlaceholderResendResponse(msg *waE2E.PeerDataOperationR
529
722
  cli.Log.Warnf("Failed to parse web message info in item #%d of response to %s: %v", i+1, reqID, err)
530
723
  } else {
531
724
  msgEvt.UnavailableRequestID = reqID
532
- cli.dispatchEvent(msgEvt)
725
+ ok = cli.dispatchEvent(msgEvt) && ok
533
726
  }
534
727
  }
728
+ return
535
729
  }
536
730
 
537
- func (cli *Client) handleProtocolMessage(info *types.MessageInfo, msg *waE2E.Message) {
731
+ func (cli *Client) handleProtocolMessage(ctx context.Context, info *types.MessageInfo, msg *waE2E.Message) (ok bool) {
732
+ ok = true
538
733
  protoMsg := msg.GetProtocolMessage()
539
734
 
540
- if protoMsg.GetHistorySyncNotification() != nil && info.IsFromMe {
541
- cli.historySyncNotifications <- protoMsg.HistorySyncNotification
542
- if cli.historySyncHandlerStarted.CompareAndSwap(false, true) {
543
- go cli.handleHistorySyncNotificationLoop()
735
+ if !info.IsFromMe {
736
+ return
737
+ }
738
+
739
+ if protoMsg.GetHistorySyncNotification() != nil {
740
+ if !cli.ManualHistorySyncDownload {
741
+ cli.historySyncNotifications <- protoMsg.HistorySyncNotification
742
+ if cli.historySyncHandlerStarted.CompareAndSwap(false, true) {
743
+ go cli.handleHistorySyncNotificationLoop()
744
+ }
544
745
  }
545
746
  go cli.sendProtocolMessageReceipt(info.ID, types.ReceiptTypeHistorySync)
546
747
  }
547
748
 
749
+ if protoMsg.GetLidMigrationMappingSyncMessage() != nil {
750
+ cli.storeLIDSyncMessage(ctx, protoMsg.GetLidMigrationMappingSyncMessage().GetEncodedMappingPayload())
751
+ }
752
+
548
753
  if protoMsg.GetPeerDataOperationRequestResponseMessage().GetPeerDataOperationRequestType() == waE2E.PeerDataOperationRequestType_PLACEHOLDER_MESSAGE_RESEND {
549
- go cli.handlePlaceholderResendResponse(protoMsg.GetPeerDataOperationRequestResponseMessage())
754
+ ok = cli.handlePlaceholderResendResponse(protoMsg.GetPeerDataOperationRequestResponseMessage()) && ok
550
755
  }
551
756
 
552
- if protoMsg.GetAppStateSyncKeyShare() != nil && info.IsFromMe {
553
- go cli.handleAppStateSyncKeyShare(protoMsg.AppStateSyncKeyShare)
757
+ if protoMsg.GetAppStateSyncKeyShare() != nil {
758
+ go cli.handleAppStateSyncKeyShare(context.WithoutCancel(ctx), protoMsg.AppStateSyncKeyShare)
554
759
  }
555
760
 
556
761
  if info.Category == "peer" {
557
762
  go cli.sendProtocolMessageReceipt(info.ID, types.ReceiptTypePeerMsg)
558
763
  }
764
+ return
559
765
  }
560
766
 
561
- func (cli *Client) processProtocolParts(info *types.MessageInfo, msg *waE2E.Message) {
767
+ func (cli *Client) processProtocolParts(ctx context.Context, info *types.MessageInfo, msg *waE2E.Message) (ok bool) {
768
+ ok = true
769
+ cli.storeMessageSecret(ctx, info, msg)
562
770
  // Hopefully sender key distribution messages and protocol messages can't be inside ephemeral messages
563
771
  if msg.GetDeviceSentMessage().GetMessage() != nil {
564
772
  msg = msg.GetDeviceSentMessage().GetMessage()
@@ -567,20 +775,24 @@ func (cli *Client) processProtocolParts(info *types.MessageInfo, msg *waE2E.Mess
567
775
  if !info.IsGroup {
568
776
  cli.Log.Warnf("Got sender key distribution message in non-group chat from %s", info.Sender)
569
777
  } else {
570
- cli.handleSenderKeyDistributionMessage(info.Chat, info.Sender, msg.SenderKeyDistributionMessage.AxolotlSenderKeyDistributionMessage)
778
+ encryptionIdentity := info.Sender
779
+ if encryptionIdentity.Server == types.DefaultUserServer && info.SenderAlt.Server == types.HiddenUserServer {
780
+ encryptionIdentity = info.SenderAlt
781
+ }
782
+ cli.handleSenderKeyDistributionMessage(ctx, info.Chat, encryptionIdentity, msg.SenderKeyDistributionMessage.AxolotlSenderKeyDistributionMessage)
571
783
  }
572
784
  }
573
785
  // N.B. Edits are protocol messages, but they're also wrapped inside EditedMessage,
574
786
  // which is only unwrapped after processProtocolParts, so this won't trigger for edits.
575
787
  if msg.GetProtocolMessage() != nil {
576
- cli.handleProtocolMessage(info, msg)
788
+ ok = cli.handleProtocolMessage(ctx, info, msg) && ok
577
789
  }
578
- cli.storeMessageSecret(info, msg)
790
+ return
579
791
  }
580
792
 
581
- func (cli *Client) storeMessageSecret(info *types.MessageInfo, msg *waE2E.Message) {
793
+ func (cli *Client) storeMessageSecret(ctx context.Context, info *types.MessageInfo, msg *waE2E.Message) {
582
794
  if msgSecret := msg.GetMessageContextInfo().GetMessageSecret(); len(msgSecret) > 0 {
583
- err := cli.Store.MsgSecrets.PutMessageSecret(info.Chat, info.Sender, info.ID, msgSecret)
795
+ err := cli.Store.MsgSecrets.PutMessageSecret(ctx, info.Chat, info.Sender, info.ID, msgSecret)
584
796
  if err != nil {
585
797
  cli.Log.Errorf("Failed to store message secret key for %s: %v", info.ID, err)
586
798
  } else {
@@ -589,7 +801,7 @@ func (cli *Client) storeMessageSecret(info *types.MessageInfo, msg *waE2E.Messag
589
801
  }
590
802
  }
591
803
 
592
- func (cli *Client) storeHistoricalMessageSecrets(conversations []*waHistorySync.Conversation) {
804
+ func (cli *Client) storeHistoricalMessageSecrets(ctx context.Context, conversations []*waHistorySync.Conversation) {
593
805
  var secrets []store.MessageSecretInsert
594
806
  var privacyTokens []store.PrivacyToken
595
807
  ownID := cli.getOwnID().ToNonAD()
@@ -639,7 +851,7 @@ func (cli *Client) storeHistoricalMessageSecrets(conversations []*waHistorySync.
639
851
  }
640
852
  if len(secrets) > 0 {
641
853
  cli.Log.Debugf("Storing %d message secret keys in history sync", len(secrets))
642
- err := cli.Store.MsgSecrets.PutMessageSecrets(secrets)
854
+ err := cli.Store.MsgSecrets.PutMessageSecrets(ctx, secrets)
643
855
  if err != nil {
644
856
  cli.Log.Errorf("Failed to store message secret keys in history sync: %v", err)
645
857
  } else {
@@ -648,7 +860,7 @@ func (cli *Client) storeHistoricalMessageSecrets(conversations []*waHistorySync.
648
860
  }
649
861
  if len(privacyTokens) > 0 {
650
862
  cli.Log.Debugf("Storing %d privacy tokens in history sync", len(privacyTokens))
651
- err := cli.Store.PrivacyTokens.PutPrivacyTokens(privacyTokens...)
863
+ err := cli.Store.PrivacyTokens.PutPrivacyTokens(ctx, privacyTokens...)
652
864
  if err != nil {
653
865
  cli.Log.Errorf("Failed to store privacy tokens in history sync: %v", err)
654
866
  } else {
@@ -657,10 +869,107 @@ func (cli *Client) storeHistoricalMessageSecrets(conversations []*waHistorySync.
657
869
  }
658
870
  }
659
871
 
660
- func (cli *Client) handleDecryptedMessage(info *types.MessageInfo, msg *waE2E.Message, retryCount int) {
661
- cli.processProtocolParts(info, msg)
872
+ func (cli *Client) storeLIDSyncMessage(ctx context.Context, msg []byte) {
873
+ var decoded waLidMigrationSyncPayload.LIDMigrationMappingSyncPayload
874
+ err := proto.Unmarshal(msg, &decoded)
875
+ if err != nil {
876
+ zerolog.Ctx(ctx).Err(err).Msg("Failed to unmarshal LID migration mapping sync payload")
877
+ return
878
+ }
879
+ if cli.Store.LIDMigrationTimestamp == 0 && decoded.GetChatDbMigrationTimestamp() > 0 {
880
+ cli.Store.LIDMigrationTimestamp = int64(decoded.GetChatDbMigrationTimestamp())
881
+ err = cli.Store.Save(ctx)
882
+ if err != nil {
883
+ zerolog.Ctx(ctx).Err(err).
884
+ Int64("lid_migration_timestamp", cli.Store.LIDMigrationTimestamp).
885
+ Msg("Failed to save chat DB LID migration timestamp")
886
+ } else {
887
+ zerolog.Ctx(ctx).Debug().
888
+ Int64("lid_migration_timestamp", cli.Store.LIDMigrationTimestamp).
889
+ Msg("Saved chat DB LID migration timestamp")
890
+ }
891
+ }
892
+ lidPairs := make([]store.LIDMapping, len(decoded.PnToLidMappings))
893
+ for i, mapping := range decoded.PnToLidMappings {
894
+ lidPairs[i] = store.LIDMapping{
895
+ LID: types.JID{User: strconv.FormatUint(mapping.GetAssignedLid(), 10), Server: types.HiddenUserServer},
896
+ PN: types.JID{User: strconv.FormatUint(mapping.GetPn(), 10), Server: types.DefaultUserServer},
897
+ }
898
+ }
899
+ err = cli.Store.LIDs.PutManyLIDMappings(ctx, lidPairs)
900
+ if err != nil {
901
+ zerolog.Ctx(ctx).Err(err).
902
+ Int("pair_count", len(lidPairs)).
903
+ Msg("Failed to store phone number to LID mappings from sync message")
904
+ } else {
905
+ zerolog.Ctx(ctx).Debug().
906
+ Int("pair_count", len(lidPairs)).
907
+ Msg("Stored PN-LID mappings from sync message")
908
+ }
909
+ }
910
+
911
+ func (cli *Client) storeGlobalSettings(ctx context.Context, settings *waHistorySync.GlobalSettings) {
912
+ if cli.Store.LIDMigrationTimestamp == 0 && settings.GetChatDbLidMigrationTimestamp() > 0 {
913
+ cli.Store.LIDMigrationTimestamp = settings.GetChatDbLidMigrationTimestamp()
914
+ err := cli.Store.Save(ctx)
915
+ if err != nil {
916
+ zerolog.Ctx(ctx).Err(err).
917
+ Int64("lid_migration_timestamp", cli.Store.LIDMigrationTimestamp).
918
+ Msg("Failed to save chat DB LID migration timestamp")
919
+ } else {
920
+ zerolog.Ctx(ctx).Debug().
921
+ Int64("lid_migration_timestamp", cli.Store.LIDMigrationTimestamp).
922
+ Msg("Saved chat DB LID migration timestamp")
923
+ }
924
+ }
925
+ }
926
+
927
+ func (cli *Client) storeHistoricalPNLIDMappings(ctx context.Context, mappings []*waHistorySync.PhoneNumberToLIDMapping) {
928
+ lidPairs := make([]store.LIDMapping, 0, len(mappings))
929
+ for _, mapping := range mappings {
930
+ pn, err := types.ParseJID(mapping.GetPnJID())
931
+ if err != nil {
932
+ zerolog.Ctx(ctx).Err(err).
933
+ Str("pn_jid", mapping.GetPnJID()).
934
+ Str("lid_jid", mapping.GetLidJID()).
935
+ Msg("Failed to parse phone number from history sync")
936
+ continue
937
+ }
938
+ if pn.Server == types.LegacyUserServer {
939
+ pn.Server = types.DefaultUserServer
940
+ }
941
+ lid, err := types.ParseJID(mapping.GetLidJID())
942
+ if err != nil {
943
+ zerolog.Ctx(ctx).Err(err).
944
+ Str("pn_jid", mapping.GetPnJID()).
945
+ Str("lid_jid", mapping.GetLidJID()).
946
+ Msg("Failed to parse LID from history sync")
947
+ continue
948
+ }
949
+ lidPairs = append(lidPairs, store.LIDMapping{
950
+ LID: lid,
951
+ PN: pn,
952
+ })
953
+ }
954
+ err := cli.Store.LIDs.PutManyLIDMappings(ctx, lidPairs)
955
+ if err != nil {
956
+ zerolog.Ctx(ctx).Err(err).
957
+ Int("pair_count", len(lidPairs)).
958
+ Msg("Failed to store phone number to LID mappings from history sync")
959
+ } else {
960
+ zerolog.Ctx(ctx).Debug().
961
+ Int("pair_count", len(lidPairs)).
962
+ Msg("Stored PN-LID mappings from history sync")
963
+ }
964
+ }
965
+
966
+ func (cli *Client) handleDecryptedMessage(ctx context.Context, info *types.MessageInfo, msg *waE2E.Message, retryCount int) bool {
967
+ ok := cli.processProtocolParts(ctx, info, msg)
968
+ if !ok {
969
+ return false
970
+ }
662
971
  evt := &events.Message{Info: *info, RawMessage: msg, RetryCount: retryCount}
663
- cli.dispatchEvent(evt.UnwrapRaw())
972
+ return cli.dispatchEvent(evt.UnwrapRaw())
664
973
  }
665
974
 
666
975
  func (cli *Client) sendProtocolMessageReceipt(id types.MessageID, msgType types.ReceiptType) {