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.
- slidge_whatsapp/config.py +3 -0
- slidge_whatsapp/event.go +31 -26
- slidge_whatsapp/gateway.go +13 -9
- slidge_whatsapp/gateway.py +2 -2
- slidge_whatsapp/generated/_whatsapp.cpython-311-aarch64-linux-gnu.h +170 -170
- slidge_whatsapp/generated/_whatsapp.cpython-311-aarch64-linux-gnu.so +0 -0
- slidge_whatsapp/generated/build.py +135 -135
- slidge_whatsapp/generated/whatsapp.c +1496 -1496
- slidge_whatsapp/generated/whatsapp.go +1137 -1137
- slidge_whatsapp/generated/whatsapp.py +1216 -1216
- slidge_whatsapp/generated/whatsapp_go.h +170 -170
- slidge_whatsapp/go.mod +15 -12
- slidge_whatsapp/go.sum +35 -29
- slidge_whatsapp/media/media.go +21 -11
- slidge_whatsapp/session.go +73 -66
- slidge_whatsapp/vendor/github.com/ebitengine/purego/dlfcn.go +4 -4
- slidge_whatsapp/vendor/github.com/ebitengine/purego/dlfcn_darwin.go +0 -5
- slidge_whatsapp/vendor/github.com/ebitengine/purego/internal/fakecgo/go_libinit.go +3 -0
- slidge_whatsapp/vendor/github.com/ebitengine/purego/internal/fakecgo/symbols.go +40 -20
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/CHANGELOG.md +14 -1
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/ffi.go +2 -2
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/fun.go +10 -2
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib.go +1 -1
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib_unix.go +1 -1
- slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib_windows.go +1 -1
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/README.md +2 -7
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/callback.go +2 -1
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c +8510 -5090
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h +344 -150
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3.go +57 -23
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.c +4 -0
- slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.go +4 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/.gitignore +4 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/LICENSE +202 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/README.md +4 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid.go +35 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_gccgo.go +26 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.3.c +23 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.3.go +22 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.4.go +35 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.4.s +18 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.5.go +28 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.5.s +44 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/goid_slow.go +24 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_gccgo_go1.8.go +17 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.23.go +38 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.5.go +57 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.6.go +43 -0
- slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.9.go +37 -0
- slidge_whatsapp/vendor/github.com/rs/zerolog/CONTRIBUTING.md +43 -0
- slidge_whatsapp/vendor/github.com/rs/zerolog/README.md +31 -0
- slidge_whatsapp/vendor/github.com/rs/zerolog/console.go +20 -5
- slidge_whatsapp/vendor/github.com/rs/zerolog/log/log.go +131 -0
- slidge_whatsapp/vendor/github.com/rs/zerolog/log.go +1 -1
- slidge_whatsapp/vendor/github.com/rs/zerolog/sampler.go +4 -1
- slidge_whatsapp/vendor/github.com/rs/zerolog/writer.go +9 -0
- slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/GroupCipher.go +17 -6
- slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/GroupSessionBuilder.go +17 -7
- slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/state/store/SenderKeyStore.go +4 -2
- slidge_whatsapp/vendor/go.mau.fi/libsignal/keys/chain/ChainKey.go +1 -0
- slidge_whatsapp/vendor/go.mau.fi/libsignal/keys/identity/IdentityKey.go +1 -0
- slidge_whatsapp/vendor/go.mau.fi/libsignal/logger/DefaultLogger.go +2 -2
- slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/FingerprintProtocol.pb.go +3 -2
- slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/LocalStorageProtocol.pb.go +3 -2
- slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/WhisperTextProtocol.pb.go +3 -2
- slidge_whatsapp/vendor/go.mau.fi/libsignal/session/Session.go +41 -17
- slidge_whatsapp/vendor/go.mau.fi/libsignal/session/SessionCipher.go +64 -30
- slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/IdentityKeyStore.go +5 -3
- slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/MessageKeyStore.go +6 -4
- slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/PreKeyStore.go +6 -4
- slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/SessionStore.go +8 -6
- slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/SignedPreKeyStore.go +7 -5
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/connlog.go +257 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/database.go +309 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/iter.go +233 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/json.go +47 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/log.go +129 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/massinsert.go +164 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/queryhelper.go +137 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/reflectscan.go +30 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/transaction.go +180 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/upgrades.go +250 -0
- slidge_whatsapp/vendor/go.mau.fi/util/dbutil/upgradetable.go +331 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exerrors/dualerror.go +33 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exerrors/must.go +23 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exhttp/cors.go +32 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exhttp/handleerrors.go +64 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exhttp/json.go +36 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exhttp/middleware.go +30 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exhttp/networkerror.go +37 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exstrings/stringutil.go +76 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exsync/event.go +88 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exsync/returnonce.go +25 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exsync/ringbuffer.go +139 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exsync/syncmap.go +94 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exsync/syncset.go +136 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/callermarshal.go +28 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/defaults.go +32 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/generics.go +45 -0
- slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/writer.go +81 -0
- slidge_whatsapp/vendor/go.mau.fi/util/ptr/ptr.go +43 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/decode.go +27 -26
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/encode.go +4 -3
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/keys.go +5 -4
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate.go +27 -25
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/armadillomessage.go +40 -7
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/binary/encoder.go +1 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/broadcast.go +5 -4
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/call.go +1 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/client.go +119 -37
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/connectionevents.go +29 -11
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/download-to-file.go +63 -30
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/download.go +74 -34
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/errors.go +1 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/group.go +61 -31
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/internals.go +188 -152
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/keepalive.go +3 -2
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/mediaconn.go +5 -3
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/mediaretry.go +2 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/message.go +444 -135
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/msgsecret.go +118 -31
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/notification.go +78 -42
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/pair-code.go +7 -4
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/pair.go +42 -18
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/prekeys.go +9 -5
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/presence.go +2 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/privacysettings.go +10 -11
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/extra.go +7 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloAddMessage/InstamadilloAddMessage.pb.go +983 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloAddMessage/InstamadilloAddMessage.proto +85 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloAddMessage/extra.go +3 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeActionLog/InstamadilloCoreTypeActionLog.pb.go +197 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeActionLog/InstamadilloCoreTypeActionLog.proto +13 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeAdminMessage/InstamadilloCoreTypeAdminMessage.pb.go +279 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeAdminMessage/InstamadilloCoreTypeAdminMessage.proto +21 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeCollection/InstamadilloCoreTypeCollection.pb.go +137 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeCollection/InstamadilloCoreTypeCollection.proto +10 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeLink/InstamadilloCoreTypeLink.pb.go +313 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeLink/InstamadilloCoreTypeLink.proto +27 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeMedia/InstamadilloCoreTypeMedia.pb.go +1299 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeMedia/InstamadilloCoreTypeMedia.proto +112 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeText/InstamadilloCoreTypeText.pb.go +514 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeText/InstamadilloCoreTypeText.proto +47 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloDeleteMessage/InstamadilloDeleteMessage.pb.go +123 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloDeleteMessage/InstamadilloDeleteMessage.proto +7 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloDeleteMessage/extra.go +3 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloSupplementMessage/InstamadilloSupplementMessage.pb.go +720 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloSupplementMessage/InstamadilloSupplementMessage.proto +59 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloSupplementMessage/extra.go +3 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloTransportPayload/InstamadilloTransportPayload.pb.go +365 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloTransportPayload/InstamadilloTransportPayload.proto +33 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloXmaContentRef/InstamadilloXmaContentRef.pb.go +1238 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloXmaContentRef/InstamadilloXmaContentRef.proto +105 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waAdv/WAAdv.pb.go +39 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.pb.go +354 -175
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.proto +5 -5
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.pb.go +170 -15
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.proto +4 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCert/WACert.pb.go +29 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waChatLockSettings/WAProtobufsChatLockSettings.pb.go +13 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.pb.go +344 -31
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.proto +26 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/{WAWebProtobufsCompanionReg.pb.go → WACompanionReg.pb.go} +184 -89
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/{WAWebProtobufsCompanionReg.proto → WACompanionReg.proto} +2 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waConsumerApplication/WAConsumerApplication.pb.go +173 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.pb.go +78 -16
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.proto +5 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.pb.go +7428 -2151
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.proto +373 -44
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.pb.go +456 -135
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.proto +14 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waLidMigrationSyncPayload/WAWebProtobufLidMigrationSyncPayload.pb.go +198 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waLidMigrationSyncPayload/WAWebProtobufLidMigrationSyncPayload.proto +14 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.pb.go +162 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.proto +1 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.pb.go +32 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.proto +1 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.pb.go +192 -52
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.proto +8 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/WAMsgTransport.pb.go +60 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/extra.go +7 -6
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMultiDevice/WAMultiDevice.pb.go +39 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waServerSync/WAServerSync.pb.go +61 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waStatusAttributions/WAStatusAttributions.pb.go +800 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waStatusAttributions/WAStatusAttributions.proto +72 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.pb.go +1344 -438
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.proto +52 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waUserPassword/WAProtobufsUserPassword.pb.go +27 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waVnameCert/WAWebProtobufsVnameCert.pb.go +59 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.pb.go +382 -78
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.proto +8 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.pb.go +563 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.proto +4 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/receipt.go +25 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/reportingfields.json +1 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/reportingtoken.go +176 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/retry.go +39 -21
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/send.go +261 -75
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/sendfb.go +28 -16
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/clientpayload.go +3 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/noop.go +85 -43
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/signal.go +75 -88
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/container.go +86 -65
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/lidmap.go +186 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/store.go +291 -167
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/00-latest-schema.sql +155 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/03-message-secrets.sql +11 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/04-privacy-tokens.sql +8 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/05-account-jid-format.sql +2 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/06-facebook-uuid.sql +2 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/07-account-lid.sql +2 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/08-lid-mapping.sql +5 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/09-decryption-buffer.sql +10 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/10-chat-db-lid-migration-ts.sql +2 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/upgrades.go +22 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/store.go +107 -56
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/botmap.go +210 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/events/events.go +13 -2
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/group.go +15 -6
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/jid.go +7 -8
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/message.go +18 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/update.go +3 -2
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/upload.go +1 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/user.go +47 -29
- slidge_whatsapp/vendor/golang.org/x/exp/LICENSE +27 -0
- slidge_whatsapp/vendor/golang.org/x/exp/PATENTS +22 -0
- slidge_whatsapp/vendor/golang.org/x/exp/constraints/constraints.go +54 -0
- slidge_whatsapp/vendor/golang.org/x/net/http/httpguts/guts.go +50 -0
- slidge_whatsapp/vendor/golang.org/x/net/http/httpguts/httplex.go +347 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/.gitignore +2 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/ascii.go +53 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/ciphers.go +641 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/client_conn_pool.go +311 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/config.go +122 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/config_go124.go +61 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/config_pre_go124.go +16 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/databuffer.go +149 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/errors.go +145 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/flow.go +120 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/frame.go +1702 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/gotrack.go +170 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/encode.go +245 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/hpack.go +523 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/huffman.go +226 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/static_table.go +188 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/tables.go +403 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/http2.go +432 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/pipe.go +184 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/server.go +3350 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/timer.go +20 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/transport.go +3287 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/unencrypted.go +32 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/write.go +381 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/writesched.go +251 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_priority.go +451 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_random.go +77 -0
- slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_roundrobin.go +119 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/go118.go +13 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/idna10.0.0.go +769 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/idna9.0.0.go +717 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/pre_go118.go +11 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/punycode.go +217 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/tables10.0.0.go +4559 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/tables11.0.0.go +4653 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/tables12.0.0.go +4733 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/tables13.0.0.go +4959 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/tables15.0.0.go +5144 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/tables9.0.0.go +4486 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/trie.go +51 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/trie12.0.0.go +30 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/trie13.0.0.go +30 -0
- slidge_whatsapp/vendor/golang.org/x/net/idna/trieval.go +119 -0
- slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/ascii.go +53 -0
- slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/headermap.go +115 -0
- slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/request.go +467 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/syscall_darwin.go +148 -1
- slidge_whatsapp/vendor/golang.org/x/sys/unix/syscall_linux.go +16 -26
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +84 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +20 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +84 -0
- slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +20 -0
- slidge_whatsapp/vendor/golang.org/x/sys/windows/security_windows.go +44 -5
- slidge_whatsapp/vendor/golang.org/x/sys/windows/syscall_windows.go +4 -2
- slidge_whatsapp/vendor/golang.org/x/sys/windows/types_windows.go +239 -0
- slidge_whatsapp/vendor/golang.org/x/sys/windows/zsyscall_windows.go +9 -0
- slidge_whatsapp/vendor/golang.org/x/text/LICENSE +27 -0
- slidge_whatsapp/vendor/golang.org/x/text/PATENTS +22 -0
- slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule.go +336 -0
- slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go +11 -0
- slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go +14 -0
- slidge_whatsapp/vendor/golang.org/x/text/transform/transform.go +709 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/bidi.go +359 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/bracket.go +335 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/core.go +1071 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/prop.go +206 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go +1815 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go +1887 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go +1923 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go +1955 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go +2042 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go +1781 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/trieval.go +48 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/composition.go +512 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/forminfo.go +279 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/input.go +109 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/iter.go +458 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/normalize.go +610 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/readwriter.go +125 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go +7657 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go +7693 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables12.0.0.go +7710 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go +7760 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go +7907 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables9.0.0.go +7637 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/transform.go +88 -0
- slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/trie.go +54 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpb +0 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/filedesc/editions.go +3 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +16 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/strs/{strings_unsafe_go121.go → strings_unsafe.go} +0 -2
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/version/version.go +1 -1
- slidge_whatsapp/vendor/google.golang.org/protobuf/proto/merge.go +6 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go +2 -0
- slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/{value_unsafe_go121.go → value_unsafe.go} +0 -2
- slidge_whatsapp/vendor/modules.txt +52 -13
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/METADATA +1 -1
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/RECORD +330 -184
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/WHEEL +1 -1
- slidge_whatsapp/vendor/github.com/rs/zerolog/CNAME +0 -1
- slidge_whatsapp/vendor/github.com/rs/zerolog/_config.yml +0 -1
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waAdv/WAAdv.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCert/WACert.pb.raw +0 -23
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waChatLockSettings/WAProtobufsChatLockSettings.pb.raw +0 -7
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/WAWebProtobufsCompanionReg.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waConsumerApplication/WAConsumerApplication.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/WAMsgTransport.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMultiDevice/WAMultiDevice.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waServerSync/WAServerSync.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waUserPassword/WAProtobufsUserPassword.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waVnameCert/WAWebProtobufsVnameCert.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.pb.raw +0 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrade.go +0 -296
- slidge_whatsapp/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go120.go +0 -94
- slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go120.go +0 -98
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/LICENSE +0 -0
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.7.dist-info}/entry_points.txt +0 -0
|
@@ -20,6 +20,8 @@ import (
|
|
|
20
20
|
"time"
|
|
21
21
|
|
|
22
22
|
"github.com/gorilla/websocket"
|
|
23
|
+
"go.mau.fi/util/exhttp"
|
|
24
|
+
"go.mau.fi/util/exsync"
|
|
23
25
|
"go.mau.fi/util/random"
|
|
24
26
|
"golang.org/x/net/proxy"
|
|
25
27
|
|
|
@@ -38,12 +40,13 @@ import (
|
|
|
38
40
|
|
|
39
41
|
// EventHandler is a function that can handle events from WhatsApp.
|
|
40
42
|
type EventHandler func(evt any)
|
|
43
|
+
type EventHandlerWithSuccessStatus func(evt any) bool
|
|
41
44
|
type nodeHandler func(node *waBinary.Node)
|
|
42
45
|
|
|
43
46
|
var nextHandlerID uint32
|
|
44
47
|
|
|
45
48
|
type wrappedEventHandler struct {
|
|
46
|
-
fn
|
|
49
|
+
fn EventHandlerWithSuccessStatus
|
|
47
50
|
id uint32
|
|
48
51
|
}
|
|
49
52
|
|
|
@@ -65,15 +68,18 @@ type Client struct {
|
|
|
65
68
|
wsDialer *websocket.Dialer
|
|
66
69
|
|
|
67
70
|
isLoggedIn atomic.Bool
|
|
68
|
-
expectedDisconnect
|
|
71
|
+
expectedDisconnect *exsync.Event
|
|
69
72
|
EnableAutoReconnect bool
|
|
73
|
+
InitialAutoReconnect bool
|
|
70
74
|
LastSuccessfulConnect time.Time
|
|
71
75
|
AutoReconnectErrors int
|
|
72
76
|
// AutoReconnectHook is called when auto-reconnection fails. If the function returns false,
|
|
73
77
|
// the client will not attempt to reconnect. The number of retries can be read from AutoReconnectErrors.
|
|
74
78
|
AutoReconnectHook func(error) bool
|
|
75
79
|
// If SynchronousAck is set, acks for messages will only be sent after all event handlers return.
|
|
76
|
-
SynchronousAck
|
|
80
|
+
SynchronousAck bool
|
|
81
|
+
EnableDecryptedEventBuffer bool
|
|
82
|
+
lastDecryptedBufferClear time.Time
|
|
77
83
|
|
|
78
84
|
DisableLoginAutoReconnect bool
|
|
79
85
|
|
|
@@ -92,6 +98,7 @@ type Client struct {
|
|
|
92
98
|
|
|
93
99
|
historySyncNotifications chan *waE2E.HistorySyncNotification
|
|
94
100
|
historySyncHandlerStarted atomic.Bool
|
|
101
|
+
ManualHistorySyncDownload bool
|
|
95
102
|
|
|
96
103
|
uploadPreKeysLock sync.Mutex
|
|
97
104
|
lastPreKeyUpload time.Time
|
|
@@ -120,10 +127,10 @@ type Client struct {
|
|
|
120
127
|
|
|
121
128
|
privacySettingsCache atomic.Value
|
|
122
129
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
userDevicesCache
|
|
126
|
-
userDevicesCacheLock
|
|
130
|
+
groupCache map[types.JID]*groupMetaCache
|
|
131
|
+
groupCacheLock sync.Mutex
|
|
132
|
+
userDevicesCache map[types.JID]deviceCache
|
|
133
|
+
userDevicesCacheLock sync.Mutex
|
|
127
134
|
|
|
128
135
|
recentMessagesMap map[recentMessageKey]RecentMessage
|
|
129
136
|
recentMessagesList [recentMessagesSize]recentMessageKey
|
|
@@ -155,6 +162,10 @@ type Client struct {
|
|
|
155
162
|
// Should SubscribePresence return an error if no privacy token is stored for the user?
|
|
156
163
|
ErrorOnSubscribePresenceWithoutToken bool
|
|
157
164
|
|
|
165
|
+
SendReportingTokens bool
|
|
166
|
+
|
|
167
|
+
BackgroundEventCtx context.Context
|
|
168
|
+
|
|
158
169
|
phoneLinkingCache *phoneLinkingCache
|
|
159
170
|
|
|
160
171
|
uniqueID string
|
|
@@ -171,7 +182,13 @@ type Client struct {
|
|
|
171
182
|
// separate library for all the non-e2ee-related stuff like logging in.
|
|
172
183
|
// The library is currently embedded in mautrix-meta (https://github.com/mautrix/meta), but may be separated later.
|
|
173
184
|
MessengerConfig *MessengerConfig
|
|
174
|
-
RefreshCAT func() error
|
|
185
|
+
RefreshCAT func(context.Context) error
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
type groupMetaCache struct {
|
|
189
|
+
AddressingMode types.AddressingMode
|
|
190
|
+
CommunityAnnouncementGroup bool
|
|
191
|
+
Members []types.JID
|
|
175
192
|
}
|
|
176
193
|
|
|
177
194
|
type MessengerConfig struct {
|
|
@@ -209,25 +226,26 @@ func NewClient(deviceStore *store.Device, log waLog.Logger) *Client {
|
|
|
209
226
|
http: &http.Client{
|
|
210
227
|
Transport: (http.DefaultTransport.(*http.Transport)).Clone(),
|
|
211
228
|
},
|
|
212
|
-
proxy:
|
|
213
|
-
Store:
|
|
214
|
-
Log:
|
|
215
|
-
recvLog:
|
|
216
|
-
sendLog:
|
|
217
|
-
uniqueID:
|
|
218
|
-
responseWaiters:
|
|
219
|
-
eventHandlers:
|
|
220
|
-
messageRetries:
|
|
221
|
-
handlerQueue:
|
|
222
|
-
appStateProc:
|
|
223
|
-
socketWait:
|
|
229
|
+
proxy: http.ProxyFromEnvironment,
|
|
230
|
+
Store: deviceStore,
|
|
231
|
+
Log: log,
|
|
232
|
+
recvLog: log.Sub("Recv"),
|
|
233
|
+
sendLog: log.Sub("Send"),
|
|
234
|
+
uniqueID: fmt.Sprintf("%d.%d-", uniqueIDPrefix[0], uniqueIDPrefix[1]),
|
|
235
|
+
responseWaiters: make(map[string]chan<- *waBinary.Node),
|
|
236
|
+
eventHandlers: make([]wrappedEventHandler, 0, 1),
|
|
237
|
+
messageRetries: make(map[string]int),
|
|
238
|
+
handlerQueue: make(chan *waBinary.Node, handlerQueueSize),
|
|
239
|
+
appStateProc: appstate.NewProcessor(deviceStore, log.Sub("AppState")),
|
|
240
|
+
socketWait: make(chan struct{}),
|
|
241
|
+
expectedDisconnect: exsync.NewEvent(),
|
|
224
242
|
|
|
225
243
|
incomingRetryRequestCounter: make(map[incomingRetryKey]int),
|
|
226
244
|
|
|
227
245
|
historySyncNotifications: make(chan *waE2E.HistorySyncNotification, 32),
|
|
228
246
|
|
|
229
|
-
|
|
230
|
-
userDevicesCache:
|
|
247
|
+
groupCache: make(map[types.JID]*groupMetaCache),
|
|
248
|
+
userDevicesCache: make(map[types.JID]deviceCache),
|
|
231
249
|
|
|
232
250
|
recentMessagesMap: make(map[recentMessageKey]RecentMessage, recentMessagesSize),
|
|
233
251
|
sessionRecreateHistory: make(map[types.JID]time.Time),
|
|
@@ -238,6 +256,8 @@ func NewClient(deviceStore *store.Device, log waLog.Logger) *Client {
|
|
|
238
256
|
|
|
239
257
|
EnableAutoReconnect: true,
|
|
240
258
|
AutoTrustIdentity: true,
|
|
259
|
+
|
|
260
|
+
BackgroundEventCtx: context.Background(),
|
|
241
261
|
}
|
|
242
262
|
cli.nodeHandlers = map[string]nodeHandler{
|
|
243
263
|
"message": cli.handleEncryptedMessage,
|
|
@@ -378,11 +398,14 @@ func (cli *Client) getOwnID() types.JID {
|
|
|
378
398
|
if cli == nil {
|
|
379
399
|
return types.EmptyJID
|
|
380
400
|
}
|
|
381
|
-
|
|
382
|
-
|
|
401
|
+
return cli.Store.GetJID()
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
func (cli *Client) getOwnLID() types.JID {
|
|
405
|
+
if cli == nil {
|
|
383
406
|
return types.EmptyJID
|
|
384
407
|
}
|
|
385
|
-
return
|
|
408
|
+
return cli.Store.GetLID()
|
|
386
409
|
}
|
|
387
410
|
|
|
388
411
|
func (cli *Client) WaitForConnection(timeout time.Duration) bool {
|
|
@@ -398,6 +421,8 @@ func (cli *Client) WaitForConnection(timeout time.Duration) bool {
|
|
|
398
421
|
case <-ch:
|
|
399
422
|
case <-timeoutChan:
|
|
400
423
|
return false
|
|
424
|
+
case <-cli.expectedDisconnect.GetChan():
|
|
425
|
+
return false
|
|
401
426
|
}
|
|
402
427
|
cli.socketLock.RLock()
|
|
403
428
|
}
|
|
@@ -415,8 +440,28 @@ func (cli *Client) Connect() error {
|
|
|
415
440
|
if cli == nil {
|
|
416
441
|
return ErrClientIsNil
|
|
417
442
|
}
|
|
443
|
+
|
|
444
|
+
cli.socketLock.Lock()
|
|
445
|
+
defer cli.socketLock.Unlock()
|
|
446
|
+
|
|
447
|
+
err := cli.unlockedConnect()
|
|
448
|
+
if exhttp.IsNetworkError(err) && cli.InitialAutoReconnect && cli.EnableAutoReconnect {
|
|
449
|
+
cli.Log.Errorf("Initial connection failed but reconnecting in background (%v)", err)
|
|
450
|
+
go cli.dispatchEvent(&events.Disconnected{})
|
|
451
|
+
go cli.autoReconnect()
|
|
452
|
+
return nil
|
|
453
|
+
}
|
|
454
|
+
return err
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
func (cli *Client) connect() error {
|
|
418
458
|
cli.socketLock.Lock()
|
|
419
459
|
defer cli.socketLock.Unlock()
|
|
460
|
+
|
|
461
|
+
return cli.unlockedConnect()
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
func (cli *Client) unlockedConnect() error {
|
|
420
465
|
if cli.socket != nil {
|
|
421
466
|
if !cli.socket.IsConnected() {
|
|
422
467
|
cli.unlockedDisconnect()
|
|
@@ -490,15 +535,15 @@ func (cli *Client) onDisconnect(ns *socket.NoiseSocket, remote bool) {
|
|
|
490
535
|
}
|
|
491
536
|
|
|
492
537
|
func (cli *Client) expectDisconnect() {
|
|
493
|
-
cli.expectedDisconnect.
|
|
538
|
+
cli.expectedDisconnect.Set()
|
|
494
539
|
}
|
|
495
540
|
|
|
496
541
|
func (cli *Client) resetExpectedDisconnect() {
|
|
497
|
-
cli.expectedDisconnect.
|
|
542
|
+
cli.expectedDisconnect.Clear()
|
|
498
543
|
}
|
|
499
544
|
|
|
500
545
|
func (cli *Client) isExpectedDisconnect() bool {
|
|
501
|
-
return cli.expectedDisconnect.
|
|
546
|
+
return cli.expectedDisconnect.IsSet()
|
|
502
547
|
}
|
|
503
548
|
|
|
504
549
|
func (cli *Client) autoReconnect() {
|
|
@@ -509,12 +554,17 @@ func (cli *Client) autoReconnect() {
|
|
|
509
554
|
autoReconnectDelay := time.Duration(cli.AutoReconnectErrors) * 2 * time.Second
|
|
510
555
|
cli.Log.Debugf("Automatically reconnecting after %v", autoReconnectDelay)
|
|
511
556
|
cli.AutoReconnectErrors++
|
|
512
|
-
|
|
513
|
-
|
|
557
|
+
if cli.expectedDisconnect.WaitTimeout(autoReconnectDelay) {
|
|
558
|
+
return
|
|
559
|
+
}
|
|
560
|
+
err := cli.connect()
|
|
514
561
|
if errors.Is(err, ErrAlreadyConnected) {
|
|
515
562
|
cli.Log.Debugf("Connect() said we're already connected after autoreconnect sleep")
|
|
516
563
|
return
|
|
517
564
|
} else if err != nil {
|
|
565
|
+
if cli.expectedDisconnect.IsSet() {
|
|
566
|
+
return
|
|
567
|
+
}
|
|
518
568
|
cli.Log.Errorf("Error reconnecting after autoreconnect sleep: %v", err)
|
|
519
569
|
if cli.AutoReconnectHook != nil && !cli.AutoReconnectHook(err) {
|
|
520
570
|
cli.Log.Debugf("AutoReconnectHook returned false, not reconnecting")
|
|
@@ -543,10 +593,11 @@ func (cli *Client) IsConnected() bool {
|
|
|
543
593
|
// This will not emit any events, the Disconnected event is only used when the
|
|
544
594
|
// connection is closed by the server or a network error.
|
|
545
595
|
func (cli *Client) Disconnect() {
|
|
546
|
-
if cli == nil
|
|
596
|
+
if cli == nil {
|
|
547
597
|
return
|
|
548
598
|
}
|
|
549
599
|
cli.socketLock.Lock()
|
|
600
|
+
cli.expectDisconnect()
|
|
550
601
|
cli.unlockedDisconnect()
|
|
551
602
|
cli.socketLock.Unlock()
|
|
552
603
|
cli.clearDelayedMessageRequests()
|
|
@@ -568,7 +619,7 @@ func (cli *Client) unlockedDisconnect() {
|
|
|
568
619
|
//
|
|
569
620
|
// Note that this will not emit any events. The LoggedOut event is only used for external logouts
|
|
570
621
|
// (triggered by the user from the main device or by WhatsApp servers).
|
|
571
|
-
func (cli *Client) Logout() error {
|
|
622
|
+
func (cli *Client) Logout(ctx context.Context) error {
|
|
572
623
|
if cli == nil {
|
|
573
624
|
return ErrClientIsNil
|
|
574
625
|
} else if cli.MessengerConfig != nil {
|
|
@@ -594,7 +645,7 @@ func (cli *Client) Logout() error {
|
|
|
594
645
|
return fmt.Errorf("error sending logout request: %w", err)
|
|
595
646
|
}
|
|
596
647
|
cli.Disconnect()
|
|
597
|
-
err = cli.Store.Delete()
|
|
648
|
+
err = cli.Store.Delete(ctx)
|
|
598
649
|
if err != nil {
|
|
599
650
|
return fmt.Errorf("error deleting data from store: %w", err)
|
|
600
651
|
}
|
|
@@ -633,6 +684,13 @@ func (cli *Client) Logout() error {
|
|
|
633
684
|
// // Handle event and access mycli.WAClient
|
|
634
685
|
// }
|
|
635
686
|
func (cli *Client) AddEventHandler(handler EventHandler) uint32 {
|
|
687
|
+
return cli.AddEventHandlerWithSuccessStatus(func(evt any) bool {
|
|
688
|
+
handler(evt)
|
|
689
|
+
return true
|
|
690
|
+
})
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
func (cli *Client) AddEventHandlerWithSuccessStatus(handler EventHandlerWithSuccessStatus) uint32 {
|
|
636
694
|
nextID := atomic.AddUint32(&nextHandlerID, 1)
|
|
637
695
|
cli.eventHandlersLock.Lock()
|
|
638
696
|
cli.eventHandlers = append(cli.eventHandlers, wrappedEventHandler{handler, nextID})
|
|
@@ -779,7 +837,7 @@ func (cli *Client) sendNode(node waBinary.Node) error {
|
|
|
779
837
|
return err
|
|
780
838
|
}
|
|
781
839
|
|
|
782
|
-
func (cli *Client) dispatchEvent(evt any) {
|
|
840
|
+
func (cli *Client) dispatchEvent(evt any) (handlerFailed bool) {
|
|
783
841
|
cli.eventHandlersLock.RLock()
|
|
784
842
|
defer func() {
|
|
785
843
|
cli.eventHandlersLock.RUnlock()
|
|
@@ -789,8 +847,11 @@ func (cli *Client) dispatchEvent(evt any) {
|
|
|
789
847
|
}
|
|
790
848
|
}()
|
|
791
849
|
for _, handler := range cli.eventHandlers {
|
|
792
|
-
handler.fn(evt)
|
|
850
|
+
if !handler.fn(evt) {
|
|
851
|
+
return true
|
|
852
|
+
}
|
|
793
853
|
}
|
|
854
|
+
return false
|
|
794
855
|
}
|
|
795
856
|
|
|
796
857
|
// ParseWebMessage parses a WebMessageInfo object into *events.Message to match what real-time messages have.
|
|
@@ -816,7 +877,7 @@ func (cli *Client) ParseWebMessage(chatJID types.JID, webMsg *waWeb.WebMessageIn
|
|
|
816
877
|
IsFromMe: webMsg.GetKey().GetFromMe(),
|
|
817
878
|
IsGroup: chatJID.Server == types.GroupServer,
|
|
818
879
|
},
|
|
819
|
-
ID: webMsg.GetKey().
|
|
880
|
+
ID: webMsg.GetKey().GetID(),
|
|
820
881
|
PushName: webMsg.GetPushName(),
|
|
821
882
|
Timestamp: time.Unix(int64(webMsg.GetMessageTimestamp()), 0),
|
|
822
883
|
}
|
|
@@ -825,7 +886,7 @@ func (cli *Client) ParseWebMessage(chatJID types.JID, webMsg *waWeb.WebMessageIn
|
|
|
825
886
|
if info.Sender.IsEmpty() {
|
|
826
887
|
return nil, ErrNotLoggedIn
|
|
827
888
|
}
|
|
828
|
-
} else if chatJID.Server == types.DefaultUserServer || chatJID.Server == types.NewsletterServer {
|
|
889
|
+
} else if chatJID.Server == types.DefaultUserServer || chatJID.Server == types.HiddenUserServer || chatJID.Server == types.NewsletterServer {
|
|
829
890
|
info.Sender = chatJID
|
|
830
891
|
} else if webMsg.GetParticipant() != "" {
|
|
831
892
|
info.Sender, err = types.ParseJID(webMsg.GetParticipant())
|
|
@@ -837,6 +898,10 @@ func (cli *Client) ParseWebMessage(chatJID types.JID, webMsg *waWeb.WebMessageIn
|
|
|
837
898
|
if err != nil {
|
|
838
899
|
return nil, fmt.Errorf("failed to parse sender of message %s: %v", info.ID, err)
|
|
839
900
|
}
|
|
901
|
+
if pk := webMsg.GetCommentMetadata().GetCommentParentKey(); pk != nil {
|
|
902
|
+
info.MsgMetaInfo.ThreadMessageID = pk.GetID()
|
|
903
|
+
info.MsgMetaInfo.ThreadMessageSenderJID, _ = types.ParseJID(pk.GetParticipant())
|
|
904
|
+
}
|
|
840
905
|
evt := &events.Message{
|
|
841
906
|
RawMessage: webMsg.GetMessage(),
|
|
842
907
|
SourceWebMsg: webMsg,
|
|
@@ -849,3 +914,20 @@ func (cli *Client) ParseWebMessage(chatJID types.JID, webMsg *waWeb.WebMessageIn
|
|
|
849
914
|
}
|
|
850
915
|
return evt, nil
|
|
851
916
|
}
|
|
917
|
+
|
|
918
|
+
func (cli *Client) StoreLIDPNMapping(ctx context.Context, first, second types.JID) {
|
|
919
|
+
var lid, pn types.JID
|
|
920
|
+
if first.Server == types.HiddenUserServer && second.Server == types.DefaultUserServer {
|
|
921
|
+
lid = first
|
|
922
|
+
pn = second
|
|
923
|
+
} else if first.Server == types.DefaultUserServer && second.Server == types.HiddenUserServer {
|
|
924
|
+
lid = second
|
|
925
|
+
pn = first
|
|
926
|
+
} else {
|
|
927
|
+
return
|
|
928
|
+
}
|
|
929
|
+
err := cli.Store.LIDs.PutLIDMapping(ctx, lid, pn)
|
|
930
|
+
if err != nil {
|
|
931
|
+
cli.Log.Errorf("Failed to store LID-PN mapping for %s -> %s: %v", lid, pn, err)
|
|
932
|
+
}
|
|
933
|
+
}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
package whatsmeow
|
|
8
8
|
|
|
9
9
|
import (
|
|
10
|
+
"context"
|
|
10
11
|
"time"
|
|
11
12
|
|
|
12
13
|
waBinary "go.mau.fi/whatsmeow/binary"
|
|
@@ -16,6 +17,7 @@ import (
|
|
|
16
17
|
)
|
|
17
18
|
|
|
18
19
|
func (cli *Client) handleStreamError(node *waBinary.Node) {
|
|
20
|
+
ctx := cli.BackgroundEventCtx
|
|
19
21
|
cli.isLoggedIn.Store(false)
|
|
20
22
|
cli.clearResponseWaiters(node)
|
|
21
23
|
code, _ := node.Attrs["code"].(string)
|
|
@@ -31,7 +33,7 @@ func (cli *Client) handleStreamError(node *waBinary.Node) {
|
|
|
31
33
|
cli.Log.Infof("Got 515 code, reconnecting...")
|
|
32
34
|
go func() {
|
|
33
35
|
cli.Disconnect()
|
|
34
|
-
err := cli.
|
|
36
|
+
err := cli.connect()
|
|
35
37
|
if err != nil {
|
|
36
38
|
cli.Log.Errorf("Failed to reconnect after 515 code: %v", err)
|
|
37
39
|
}
|
|
@@ -40,7 +42,7 @@ func (cli *Client) handleStreamError(node *waBinary.Node) {
|
|
|
40
42
|
cli.expectDisconnect()
|
|
41
43
|
cli.Log.Infof("Got device removed stream error, sending LoggedOut event and deleting session")
|
|
42
44
|
go cli.dispatchEvent(&events.LoggedOut{OnConnect: false, Reason: events.ConnectFailureLoggedOut})
|
|
43
|
-
err := cli.Store.Delete()
|
|
45
|
+
err := cli.Store.Delete(ctx)
|
|
44
46
|
if err != nil {
|
|
45
47
|
cli.Log.Warnf("Failed to delete store after device_removed error: %v", err)
|
|
46
48
|
}
|
|
@@ -56,7 +58,7 @@ func (cli *Client) handleStreamError(node *waBinary.Node) {
|
|
|
56
58
|
cli.Log.Infof("Got %s stream error, refreshing CAT before reconnecting...", code)
|
|
57
59
|
cli.socketLock.RLock()
|
|
58
60
|
defer cli.socketLock.RUnlock()
|
|
59
|
-
err := cli.RefreshCAT()
|
|
61
|
+
err := cli.RefreshCAT(ctx)
|
|
60
62
|
if err != nil {
|
|
61
63
|
cli.Log.Errorf("Failed to refresh CAT: %v", err)
|
|
62
64
|
cli.expectDisconnect()
|
|
@@ -92,6 +94,7 @@ func (cli *Client) handleIB(node *waBinary.Node) {
|
|
|
92
94
|
}
|
|
93
95
|
|
|
94
96
|
func (cli *Client) handleConnectFailure(node *waBinary.Node) {
|
|
97
|
+
ctx := cli.BackgroundEventCtx
|
|
95
98
|
ag := node.AttrGetter()
|
|
96
99
|
reason := events.ConnectFailureReason(ag.Int("reason"))
|
|
97
100
|
message := ag.OptionalString("message")
|
|
@@ -118,7 +121,7 @@ func (cli *Client) handleConnectFailure(node *waBinary.Node) {
|
|
|
118
121
|
if reason.IsLoggedOut() {
|
|
119
122
|
cli.Log.Infof("Got %s connect failure, sending LoggedOut event and deleting session", reason)
|
|
120
123
|
go cli.dispatchEvent(&events.LoggedOut{OnConnect: true, Reason: reason})
|
|
121
|
-
err := cli.Store.Delete()
|
|
124
|
+
err := cli.Store.Delete(ctx)
|
|
122
125
|
if err != nil {
|
|
123
126
|
cli.Log.Warnf("Failed to delete store after %d failure: %v", int(reason), err)
|
|
124
127
|
}
|
|
@@ -133,7 +136,7 @@ func (cli *Client) handleConnectFailure(node *waBinary.Node) {
|
|
|
133
136
|
go cli.dispatchEvent(&events.ClientOutdated{})
|
|
134
137
|
} else if reason == events.ConnectFailureCATInvalid || reason == events.ConnectFailureCATExpired {
|
|
135
138
|
cli.Log.Infof("Got %d/%s connect failure, refreshing CAT before reconnecting...", int(reason), message)
|
|
136
|
-
err := cli.RefreshCAT()
|
|
139
|
+
err := cli.RefreshCAT(ctx)
|
|
137
140
|
if err != nil {
|
|
138
141
|
cli.Log.Errorf("Failed to refresh CAT: %v", err)
|
|
139
142
|
cli.expectDisconnect()
|
|
@@ -148,24 +151,38 @@ func (cli *Client) handleConnectFailure(node *waBinary.Node) {
|
|
|
148
151
|
}
|
|
149
152
|
|
|
150
153
|
func (cli *Client) handleConnectSuccess(node *waBinary.Node) {
|
|
154
|
+
ctx := cli.BackgroundEventCtx
|
|
151
155
|
cli.Log.Infof("Successfully authenticated")
|
|
152
156
|
cli.LastSuccessfulConnect = time.Now()
|
|
153
157
|
cli.AutoReconnectErrors = 0
|
|
154
158
|
cli.isLoggedIn.Store(true)
|
|
159
|
+
nodeLID := node.AttrGetter().JID("lid")
|
|
160
|
+
if cli.Store.LID.IsEmpty() && !nodeLID.IsEmpty() {
|
|
161
|
+
cli.Store.LID = nodeLID
|
|
162
|
+
err := cli.Store.Save(ctx)
|
|
163
|
+
if err != nil {
|
|
164
|
+
cli.Log.Warnf("Failed to save device after updating LID: %v", err)
|
|
165
|
+
} else {
|
|
166
|
+
cli.Log.Infof("Updated LID to %s", cli.Store.LID)
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Some users are missing their own LID-PN mapping even though it's already in the device table,
|
|
170
|
+
// so do this unconditionally for a few months to ensure everyone gets the row.
|
|
171
|
+
cli.StoreLIDPNMapping(ctx, cli.Store.GetLID(), cli.Store.GetJID())
|
|
155
172
|
go func() {
|
|
156
|
-
if dbCount, err := cli.Store.PreKeys.UploadedPreKeyCount(); err != nil {
|
|
173
|
+
if dbCount, err := cli.Store.PreKeys.UploadedPreKeyCount(ctx); err != nil {
|
|
157
174
|
cli.Log.Errorf("Failed to get number of prekeys in database: %v", err)
|
|
158
|
-
} else if serverCount, err := cli.getServerPreKeyCount(); err != nil {
|
|
175
|
+
} else if serverCount, err := cli.getServerPreKeyCount(ctx); err != nil {
|
|
159
176
|
cli.Log.Warnf("Failed to get number of prekeys on server: %v", err)
|
|
160
177
|
} else {
|
|
161
178
|
cli.Log.Debugf("Database has %d prekeys, server says we have %d", dbCount, serverCount)
|
|
162
179
|
if serverCount < MinPreKeyCount || dbCount < MinPreKeyCount {
|
|
163
|
-
cli.uploadPreKeys()
|
|
164
|
-
sc, _ := cli.getServerPreKeyCount()
|
|
180
|
+
cli.uploadPreKeys(ctx)
|
|
181
|
+
sc, _ := cli.getServerPreKeyCount(ctx)
|
|
165
182
|
cli.Log.Debugf("Prekey count after upload: %d", sc)
|
|
166
183
|
}
|
|
167
184
|
}
|
|
168
|
-
err := cli.SetPassive(false)
|
|
185
|
+
err := cli.SetPassive(ctx, false)
|
|
169
186
|
if err != nil {
|
|
170
187
|
cli.Log.Warnf("Failed to send post-connect passive IQ: %v", err)
|
|
171
188
|
}
|
|
@@ -178,7 +195,7 @@ func (cli *Client) handleConnectSuccess(node *waBinary.Node) {
|
|
|
178
195
|
//
|
|
179
196
|
// This seems to mostly affect whether the device receives certain events.
|
|
180
197
|
// By default, whatsmeow will automatically do SetPassive(false) after connecting.
|
|
181
|
-
func (cli *Client) SetPassive(passive bool) error {
|
|
198
|
+
func (cli *Client) SetPassive(ctx context.Context, passive bool) error {
|
|
182
199
|
tag := "active"
|
|
183
200
|
if passive {
|
|
184
201
|
tag = "passive"
|
|
@@ -187,6 +204,7 @@ func (cli *Client) SetPassive(passive bool) error {
|
|
|
187
204
|
Namespace: "passive",
|
|
188
205
|
Type: "set",
|
|
189
206
|
To: types.ServerJID,
|
|
207
|
+
Context: ctx,
|
|
190
208
|
Content: []waBinary.Node{{Tag: tag}},
|
|
191
209
|
})
|
|
192
210
|
if err != nil {
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
package whatsmeow
|
|
8
8
|
|
|
9
9
|
import (
|
|
10
|
+
"context"
|
|
10
11
|
"crypto/hmac"
|
|
11
12
|
"crypto/sha256"
|
|
12
13
|
"encoding/base64"
|
|
@@ -37,7 +38,7 @@ type File interface {
|
|
|
37
38
|
// DownloadToFile downloads the attachment from the given protobuf message.
|
|
38
39
|
//
|
|
39
40
|
// This is otherwise identical to [Download], but writes the attachment to a file instead of returning it as a byte slice.
|
|
40
|
-
func (cli *Client) DownloadToFile(msg DownloadableMessage, file File) error {
|
|
41
|
+
func (cli *Client) DownloadToFile(ctx context.Context, msg DownloadableMessage, file File) error {
|
|
41
42
|
if cli == nil {
|
|
42
43
|
return ErrClientIsNil
|
|
43
44
|
}
|
|
@@ -53,9 +54,9 @@ func (cli *Client) DownloadToFile(msg DownloadableMessage, file File) error {
|
|
|
53
54
|
isWebWhatsappNetURL = strings.HasPrefix(url, "https://web.whatsapp.net")
|
|
54
55
|
}
|
|
55
56
|
if len(url) > 0 && !isWebWhatsappNetURL {
|
|
56
|
-
return cli.downloadAndDecryptToFile(url, msg.GetMediaKey(), mediaType, getSize(msg), msg.GetFileEncSHA256(), msg.GetFileSHA256(), file)
|
|
57
|
+
return cli.downloadAndDecryptToFile(ctx, url, msg.GetMediaKey(), mediaType, getSize(msg), msg.GetFileEncSHA256(), msg.GetFileSHA256(), file)
|
|
57
58
|
} else if len(msg.GetDirectPath()) > 0 {
|
|
58
|
-
return cli.DownloadMediaWithPathToFile(msg.GetDirectPath(), msg.GetFileEncSHA256(), msg.GetFileSHA256(), msg.GetMediaKey(), getSize(msg), mediaType, mediaTypeToMMSType[mediaType], file)
|
|
59
|
+
return cli.DownloadMediaWithPathToFile(ctx, msg.GetDirectPath(), msg.GetFileEncSHA256(), msg.GetFileSHA256(), msg.GetMediaKey(), getSize(msg), mediaType, mediaTypeToMMSType[mediaType], file)
|
|
59
60
|
} else {
|
|
60
61
|
if isWebWhatsappNetURL {
|
|
61
62
|
cli.Log.Warnf("Got a media message with a web.whatsapp.net URL (%s) and no direct path", url)
|
|
@@ -64,12 +65,25 @@ func (cli *Client) DownloadToFile(msg DownloadableMessage, file File) error {
|
|
|
64
65
|
}
|
|
65
66
|
}
|
|
66
67
|
|
|
67
|
-
func (cli *Client) DownloadFBToFile(
|
|
68
|
-
|
|
68
|
+
func (cli *Client) DownloadFBToFile(
|
|
69
|
+
ctx context.Context,
|
|
70
|
+
transport *waMediaTransport.WAMediaTransport_Integral,
|
|
71
|
+
mediaType MediaType,
|
|
72
|
+
file File,
|
|
73
|
+
) error {
|
|
74
|
+
return cli.DownloadMediaWithPathToFile(ctx, transport.GetDirectPath(), transport.GetFileEncSHA256(), transport.GetFileSHA256(), transport.GetMediaKey(), -1, mediaType, mediaTypeToMMSType[mediaType], file)
|
|
69
75
|
}
|
|
70
76
|
|
|
71
|
-
func (cli *Client) DownloadMediaWithPathToFile(
|
|
72
|
-
|
|
77
|
+
func (cli *Client) DownloadMediaWithPathToFile(
|
|
78
|
+
ctx context.Context,
|
|
79
|
+
directPath string,
|
|
80
|
+
encFileHash, fileHash, mediaKey []byte,
|
|
81
|
+
fileLength int,
|
|
82
|
+
mediaType MediaType,
|
|
83
|
+
mmsType string,
|
|
84
|
+
file File,
|
|
85
|
+
) error {
|
|
86
|
+
mediaConn, err := cli.refreshMediaConn(ctx, false)
|
|
73
87
|
if err != nil {
|
|
74
88
|
return fmt.Errorf("failed to refresh media connections: %w", err)
|
|
75
89
|
}
|
|
@@ -79,9 +93,14 @@ func (cli *Client) DownloadMediaWithPathToFile(directPath string, encFileHash, f
|
|
|
79
93
|
for i, host := range mediaConn.Hosts {
|
|
80
94
|
// TODO omit hash for unencrypted media?
|
|
81
95
|
mediaURL := fmt.Sprintf("https://%s%s&hash=%s&mms-type=%s&__wa-mms=", host.Hostname, directPath, base64.URLEncoding.EncodeToString(encFileHash), mmsType)
|
|
82
|
-
err = cli.downloadAndDecryptToFile(mediaURL, mediaKey, mediaType, fileLength, encFileHash, fileHash, file)
|
|
83
|
-
if err == nil ||
|
|
84
|
-
errors.Is(err,
|
|
96
|
+
err = cli.downloadAndDecryptToFile(ctx, mediaURL, mediaKey, mediaType, fileLength, encFileHash, fileHash, file)
|
|
97
|
+
if err == nil ||
|
|
98
|
+
errors.Is(err, ErrFileLengthMismatch) ||
|
|
99
|
+
errors.Is(err, ErrInvalidMediaSHA256) ||
|
|
100
|
+
errors.Is(err, ErrMediaDownloadFailedWith403) ||
|
|
101
|
+
errors.Is(err, ErrMediaDownloadFailedWith404) ||
|
|
102
|
+
errors.Is(err, ErrMediaDownloadFailedWith410) ||
|
|
103
|
+
errors.Is(err, context.Canceled) {
|
|
85
104
|
return err
|
|
86
105
|
} else if i >= len(mediaConn.Hosts)-1 {
|
|
87
106
|
return fmt.Errorf("failed to download media from last host: %w", err)
|
|
@@ -91,10 +110,18 @@ func (cli *Client) DownloadMediaWithPathToFile(directPath string, encFileHash, f
|
|
|
91
110
|
return err
|
|
92
111
|
}
|
|
93
112
|
|
|
94
|
-
func (cli *Client) downloadAndDecryptToFile(
|
|
113
|
+
func (cli *Client) downloadAndDecryptToFile(
|
|
114
|
+
ctx context.Context,
|
|
115
|
+
url string,
|
|
116
|
+
mediaKey []byte,
|
|
117
|
+
appInfo MediaType,
|
|
118
|
+
fileLength int,
|
|
119
|
+
fileEncSHA256, fileSHA256 []byte,
|
|
120
|
+
file File,
|
|
121
|
+
) error {
|
|
95
122
|
iv, cipherKey, macKey, _ := getMediaKeys(mediaKey, appInfo)
|
|
96
123
|
hasher := sha256.New()
|
|
97
|
-
if mac, err := cli.downloadPossiblyEncryptedMediaWithRetriesToFile(url, fileEncSHA256, file); err != nil {
|
|
124
|
+
if mac, err := cli.downloadPossiblyEncryptedMediaWithRetriesToFile(ctx, url, fileEncSHA256, file); err != nil {
|
|
98
125
|
return err
|
|
99
126
|
} else if mediaKey == nil && fileEncSHA256 == nil && mac == nil {
|
|
100
127
|
// Unencrypted media, just return the downloaded data
|
|
@@ -105,26 +132,28 @@ func (cli *Client) downloadAndDecryptToFile(url string, mediaKey []byte, appInfo
|
|
|
105
132
|
return fmt.Errorf("failed to seek to start of file after validating mac: %w", err)
|
|
106
133
|
} else if err = cbcutil.DecryptFile(cipherKey, iv, file); err != nil {
|
|
107
134
|
return fmt.Errorf("failed to decrypt file: %w", err)
|
|
108
|
-
} else if
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
135
|
+
} else if ReturnDownloadWarnings {
|
|
136
|
+
if info, err := file.Stat(); err != nil {
|
|
137
|
+
return fmt.Errorf("failed to stat file: %w", err)
|
|
138
|
+
} else if fileLength >= 0 && info.Size() != int64(fileLength) {
|
|
139
|
+
return fmt.Errorf("%w: expected %d, got %d", ErrFileLengthMismatch, fileLength, info.Size())
|
|
140
|
+
} else if _, err = file.Seek(0, io.SeekStart); err != nil {
|
|
141
|
+
return fmt.Errorf("failed to seek to start of file after decrypting: %w", err)
|
|
142
|
+
} else if _, err = io.Copy(hasher, file); err != nil {
|
|
143
|
+
return fmt.Errorf("failed to hash file: %w", err)
|
|
144
|
+
} else if !hmac.Equal(fileSHA256, hasher.Sum(nil)) {
|
|
145
|
+
return ErrInvalidMediaSHA256
|
|
146
|
+
}
|
|
118
147
|
}
|
|
119
148
|
return nil
|
|
120
149
|
}
|
|
121
150
|
|
|
122
|
-
func (cli *Client) downloadPossiblyEncryptedMediaWithRetriesToFile(url string, checksum []byte, file File) (mac []byte, err error) {
|
|
151
|
+
func (cli *Client) downloadPossiblyEncryptedMediaWithRetriesToFile(ctx context.Context, url string, checksum []byte, file File) (mac []byte, err error) {
|
|
123
152
|
for retryNum := 0; retryNum < 5; retryNum++ {
|
|
124
153
|
if checksum == nil {
|
|
125
|
-
_, _, err = cli.downloadMediaToFile(url, file)
|
|
154
|
+
_, _, err = cli.downloadMediaToFile(ctx, url, file)
|
|
126
155
|
} else {
|
|
127
|
-
mac, err = cli.downloadEncryptedMediaToFile(url, checksum, file)
|
|
156
|
+
mac, err = cli.downloadEncryptedMediaToFile(ctx, url, checksum, file)
|
|
128
157
|
}
|
|
129
158
|
if err == nil || !shouldRetryMediaDownload(err) {
|
|
130
159
|
return
|
|
@@ -139,13 +168,17 @@ func (cli *Client) downloadPossiblyEncryptedMediaWithRetriesToFile(url string, c
|
|
|
139
168
|
if err != nil {
|
|
140
169
|
return nil, fmt.Errorf("failed to seek to start of file to retry download: %w", err)
|
|
141
170
|
}
|
|
142
|
-
|
|
171
|
+
select {
|
|
172
|
+
case <-ctx.Done():
|
|
173
|
+
return nil, ctx.Err()
|
|
174
|
+
case <-time.After(retryDuration):
|
|
175
|
+
}
|
|
143
176
|
}
|
|
144
177
|
return
|
|
145
178
|
}
|
|
146
179
|
|
|
147
|
-
func (cli *Client) downloadMediaToFile(url string, file io.Writer) (int64, []byte, error) {
|
|
148
|
-
resp, err := cli.doMediaDownloadRequest(url)
|
|
180
|
+
func (cli *Client) downloadMediaToFile(ctx context.Context, url string, file io.Writer) (int64, []byte, error) {
|
|
181
|
+
resp, err := cli.doMediaDownloadRequest(ctx, url)
|
|
149
182
|
if err != nil {
|
|
150
183
|
return 0, nil, err
|
|
151
184
|
}
|
|
@@ -162,8 +195,8 @@ func (cli *Client) downloadMediaToFile(url string, file io.Writer) (int64, []byt
|
|
|
162
195
|
return n, hasher.Sum(nil), err
|
|
163
196
|
}
|
|
164
197
|
|
|
165
|
-
func (cli *Client) downloadEncryptedMediaToFile(url string, checksum []byte, file File) ([]byte, error) {
|
|
166
|
-
size, hash, err := cli.downloadMediaToFile(url, file)
|
|
198
|
+
func (cli *Client) downloadEncryptedMediaToFile(ctx context.Context, url string, checksum []byte, file File) ([]byte, error) {
|
|
199
|
+
size, hash, err := cli.downloadMediaToFile(ctx, url, file)
|
|
167
200
|
if err != nil {
|
|
168
201
|
return nil, err
|
|
169
202
|
} else if size <= mediaHMACLength {
|