slidge-whatsapp 0.2.5__cp313-cp313-manylinux_2_36_aarch64.whl → 0.2.6__cp313-cp313-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 +23 -24
- slidge_whatsapp/gateway.go +13 -9
- slidge_whatsapp/gateway.py +2 -2
- slidge_whatsapp/generated/_whatsapp.cpython-313-aarch64-linux-gnu.h +181 -181
- slidge_whatsapp/generated/_whatsapp.cpython-313-aarch64-linux-gnu.so +0 -0
- slidge_whatsapp/generated/build.py +155 -155
- slidge_whatsapp/generated/whatsapp.c +1507 -1507
- slidge_whatsapp/generated/whatsapp.go +907 -907
- slidge_whatsapp/generated/whatsapp.py +1318 -1318
- slidge_whatsapp/generated/whatsapp_go.h +181 -181
- slidge_whatsapp/go.mod +15 -12
- slidge_whatsapp/go.sum +41 -29
- slidge_whatsapp/media/media.go +16 -10
- 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 +41 -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/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 +3 -2
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/broadcast.go +5 -4
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/client.go +60 -15
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/connectionevents.go +25 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/download-to-file.go +45 -19
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/download.go +52 -28
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/errors.go +1 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/group.go +59 -29
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/internals.go +166 -146
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/keepalive.go +2 -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 +270 -111
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/msgsecret.go +118 -31
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/notification.go +67 -36
- 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/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 +158 -15
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.proto +1 -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} +170 -84
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/{WAWebProtobufsCompanionReg.proto → WACompanionReg.proto} +1 -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 +6747 -2230
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.proto +294 -43
- 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/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/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/waSyncAction/WASyncAction.pb.go +1051 -382
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.proto +32 -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 +555 -9
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.proto +2 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/receipt.go +13 -3
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/retry.go +29 -19
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/send.go +244 -73
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/sendfb.go +27 -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 +79 -61
- 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 +153 -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/upgrades.go +22 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/store.go +105 -56
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/botmap.go +210 -0
- slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/events/events.go +8 -0
- 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 +17 -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 +45 -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 +38 -13
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.6.dist-info}/METADATA +1 -1
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.6.dist-info}/RECORD +293 -180
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.6.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.6.dist-info}/LICENSE +0 -0
- {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.6.dist-info}/entry_points.txt +0 -0
|
@@ -20,6 +20,7 @@ import (
|
|
|
20
20
|
"time"
|
|
21
21
|
|
|
22
22
|
"github.com/gorilla/websocket"
|
|
23
|
+
"go.mau.fi/util/exhttp"
|
|
23
24
|
"go.mau.fi/util/random"
|
|
24
25
|
"golang.org/x/net/proxy"
|
|
25
26
|
|
|
@@ -67,13 +68,16 @@ type Client struct {
|
|
|
67
68
|
isLoggedIn atomic.Bool
|
|
68
69
|
expectedDisconnect atomic.Bool
|
|
69
70
|
EnableAutoReconnect bool
|
|
71
|
+
InitialAutoReconnect bool
|
|
70
72
|
LastSuccessfulConnect time.Time
|
|
71
73
|
AutoReconnectErrors int
|
|
72
74
|
// AutoReconnectHook is called when auto-reconnection fails. If the function returns false,
|
|
73
75
|
// the client will not attempt to reconnect. The number of retries can be read from AutoReconnectErrors.
|
|
74
76
|
AutoReconnectHook func(error) bool
|
|
75
77
|
// If SynchronousAck is set, acks for messages will only be sent after all event handlers return.
|
|
76
|
-
SynchronousAck
|
|
78
|
+
SynchronousAck bool
|
|
79
|
+
EnableDecryptedEventBuffer bool
|
|
80
|
+
lastDecryptedBufferClear time.Time
|
|
77
81
|
|
|
78
82
|
DisableLoginAutoReconnect bool
|
|
79
83
|
|
|
@@ -120,10 +124,10 @@ type Client struct {
|
|
|
120
124
|
|
|
121
125
|
privacySettingsCache atomic.Value
|
|
122
126
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
userDevicesCache
|
|
126
|
-
userDevicesCacheLock
|
|
127
|
+
groupCache map[types.JID]*groupMetaCache
|
|
128
|
+
groupCacheLock sync.Mutex
|
|
129
|
+
userDevicesCache map[types.JID]deviceCache
|
|
130
|
+
userDevicesCacheLock sync.Mutex
|
|
127
131
|
|
|
128
132
|
recentMessagesMap map[recentMessageKey]RecentMessage
|
|
129
133
|
recentMessagesList [recentMessagesSize]recentMessageKey
|
|
@@ -174,6 +178,12 @@ type Client struct {
|
|
|
174
178
|
RefreshCAT func() error
|
|
175
179
|
}
|
|
176
180
|
|
|
181
|
+
type groupMetaCache struct {
|
|
182
|
+
AddressingMode types.AddressingMode
|
|
183
|
+
CommunityAnnouncementGroup bool
|
|
184
|
+
Members []types.JID
|
|
185
|
+
}
|
|
186
|
+
|
|
177
187
|
type MessengerConfig struct {
|
|
178
188
|
UserAgent string
|
|
179
189
|
BaseURL string
|
|
@@ -226,8 +236,8 @@ func NewClient(deviceStore *store.Device, log waLog.Logger) *Client {
|
|
|
226
236
|
|
|
227
237
|
historySyncNotifications: make(chan *waE2E.HistorySyncNotification, 32),
|
|
228
238
|
|
|
229
|
-
|
|
230
|
-
userDevicesCache:
|
|
239
|
+
groupCache: make(map[types.JID]*groupMetaCache),
|
|
240
|
+
userDevicesCache: make(map[types.JID]deviceCache),
|
|
231
241
|
|
|
232
242
|
recentMessagesMap: make(map[recentMessageKey]RecentMessage, recentMessagesSize),
|
|
233
243
|
sessionRecreateHistory: make(map[types.JID]time.Time),
|
|
@@ -378,11 +388,14 @@ func (cli *Client) getOwnID() types.JID {
|
|
|
378
388
|
if cli == nil {
|
|
379
389
|
return types.EmptyJID
|
|
380
390
|
}
|
|
381
|
-
|
|
382
|
-
|
|
391
|
+
return cli.Store.GetJID()
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
func (cli *Client) getOwnLID() types.JID {
|
|
395
|
+
if cli == nil {
|
|
383
396
|
return types.EmptyJID
|
|
384
397
|
}
|
|
385
|
-
return
|
|
398
|
+
return cli.Store.GetLID()
|
|
386
399
|
}
|
|
387
400
|
|
|
388
401
|
func (cli *Client) WaitForConnection(timeout time.Duration) bool {
|
|
@@ -412,6 +425,17 @@ func (cli *Client) SetWSDialer(dialer *websocket.Dialer) {
|
|
|
412
425
|
// Connect connects the client to the WhatsApp web websocket. After connection, it will either
|
|
413
426
|
// authenticate if there's data in the device store, or emit a QREvent to set up a new link.
|
|
414
427
|
func (cli *Client) Connect() error {
|
|
428
|
+
err := cli.connect()
|
|
429
|
+
if exhttp.IsNetworkError(err) && cli.InitialAutoReconnect && cli.EnableAutoReconnect {
|
|
430
|
+
cli.Log.Errorf("Initial connection failed but reconnecting in background")
|
|
431
|
+
go cli.dispatchEvent(&events.Disconnected{})
|
|
432
|
+
go cli.autoReconnect()
|
|
433
|
+
return nil
|
|
434
|
+
}
|
|
435
|
+
return err
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
func (cli *Client) connect() error {
|
|
415
439
|
if cli == nil {
|
|
416
440
|
return ErrClientIsNil
|
|
417
441
|
}
|
|
@@ -510,7 +534,7 @@ func (cli *Client) autoReconnect() {
|
|
|
510
534
|
cli.Log.Debugf("Automatically reconnecting after %v", autoReconnectDelay)
|
|
511
535
|
cli.AutoReconnectErrors++
|
|
512
536
|
time.Sleep(autoReconnectDelay)
|
|
513
|
-
err := cli.
|
|
537
|
+
err := cli.connect()
|
|
514
538
|
if errors.Is(err, ErrAlreadyConnected) {
|
|
515
539
|
cli.Log.Debugf("Connect() said we're already connected after autoreconnect sleep")
|
|
516
540
|
return
|
|
@@ -568,7 +592,7 @@ func (cli *Client) unlockedDisconnect() {
|
|
|
568
592
|
//
|
|
569
593
|
// Note that this will not emit any events. The LoggedOut event is only used for external logouts
|
|
570
594
|
// (triggered by the user from the main device or by WhatsApp servers).
|
|
571
|
-
func (cli *Client) Logout() error {
|
|
595
|
+
func (cli *Client) Logout(ctx context.Context) error {
|
|
572
596
|
if cli == nil {
|
|
573
597
|
return ErrClientIsNil
|
|
574
598
|
} else if cli.MessengerConfig != nil {
|
|
@@ -594,7 +618,7 @@ func (cli *Client) Logout() error {
|
|
|
594
618
|
return fmt.Errorf("error sending logout request: %w", err)
|
|
595
619
|
}
|
|
596
620
|
cli.Disconnect()
|
|
597
|
-
err = cli.Store.Delete()
|
|
621
|
+
err = cli.Store.Delete(ctx)
|
|
598
622
|
if err != nil {
|
|
599
623
|
return fmt.Errorf("error deleting data from store: %w", err)
|
|
600
624
|
}
|
|
@@ -816,7 +840,7 @@ func (cli *Client) ParseWebMessage(chatJID types.JID, webMsg *waWeb.WebMessageIn
|
|
|
816
840
|
IsFromMe: webMsg.GetKey().GetFromMe(),
|
|
817
841
|
IsGroup: chatJID.Server == types.GroupServer,
|
|
818
842
|
},
|
|
819
|
-
ID: webMsg.GetKey().
|
|
843
|
+
ID: webMsg.GetKey().GetID(),
|
|
820
844
|
PushName: webMsg.GetPushName(),
|
|
821
845
|
Timestamp: time.Unix(int64(webMsg.GetMessageTimestamp()), 0),
|
|
822
846
|
}
|
|
@@ -825,7 +849,7 @@ func (cli *Client) ParseWebMessage(chatJID types.JID, webMsg *waWeb.WebMessageIn
|
|
|
825
849
|
if info.Sender.IsEmpty() {
|
|
826
850
|
return nil, ErrNotLoggedIn
|
|
827
851
|
}
|
|
828
|
-
} else if chatJID.Server == types.DefaultUserServer || chatJID.Server == types.NewsletterServer {
|
|
852
|
+
} else if chatJID.Server == types.DefaultUserServer || chatJID.Server == types.HiddenUserServer || chatJID.Server == types.NewsletterServer {
|
|
829
853
|
info.Sender = chatJID
|
|
830
854
|
} else if webMsg.GetParticipant() != "" {
|
|
831
855
|
info.Sender, err = types.ParseJID(webMsg.GetParticipant())
|
|
@@ -837,6 +861,10 @@ func (cli *Client) ParseWebMessage(chatJID types.JID, webMsg *waWeb.WebMessageIn
|
|
|
837
861
|
if err != nil {
|
|
838
862
|
return nil, fmt.Errorf("failed to parse sender of message %s: %v", info.ID, err)
|
|
839
863
|
}
|
|
864
|
+
if pk := webMsg.GetCommentMetadata().GetCommentParentKey(); pk != nil {
|
|
865
|
+
info.MsgMetaInfo.ThreadMessageID = pk.GetID()
|
|
866
|
+
info.MsgMetaInfo.ThreadMessageSenderJID, _ = types.ParseJID(pk.GetParticipant())
|
|
867
|
+
}
|
|
840
868
|
evt := &events.Message{
|
|
841
869
|
RawMessage: webMsg.GetMessage(),
|
|
842
870
|
SourceWebMsg: webMsg,
|
|
@@ -849,3 +877,20 @@ func (cli *Client) ParseWebMessage(chatJID types.JID, webMsg *waWeb.WebMessageIn
|
|
|
849
877
|
}
|
|
850
878
|
return evt, nil
|
|
851
879
|
}
|
|
880
|
+
|
|
881
|
+
func (cli *Client) StoreLIDPNMapping(ctx context.Context, first, second types.JID) {
|
|
882
|
+
var lid, pn types.JID
|
|
883
|
+
if first.Server == types.HiddenUserServer && second.Server == types.DefaultUserServer {
|
|
884
|
+
lid = first
|
|
885
|
+
pn = second
|
|
886
|
+
} else if first.Server == types.DefaultUserServer && second.Server == types.HiddenUserServer {
|
|
887
|
+
lid = second
|
|
888
|
+
pn = first
|
|
889
|
+
} else {
|
|
890
|
+
return
|
|
891
|
+
}
|
|
892
|
+
err := cli.Store.LIDs.PutLIDMapping(ctx, lid, pn)
|
|
893
|
+
if err != nil {
|
|
894
|
+
cli.Log.Errorf("Failed to store LID-PN mapping for %s -> %s: %v", lid, pn, err)
|
|
895
|
+
}
|
|
896
|
+
}
|
|
@@ -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 := context.TODO()
|
|
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
|
}
|
|
@@ -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 := context.TODO()
|
|
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
|
}
|
|
@@ -148,24 +151,36 @@ func (cli *Client) handleConnectFailure(node *waBinary.Node) {
|
|
|
148
151
|
}
|
|
149
152
|
|
|
150
153
|
func (cli *Client) handleConnectSuccess(node *waBinary.Node) {
|
|
154
|
+
ctx := context.TODO()
|
|
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
|
+
cli.StoreLIDPNMapping(ctx, cli.Store.GetLID(), cli.Store.GetJID())
|
|
169
|
+
}
|
|
155
170
|
go func() {
|
|
156
|
-
if dbCount, err := cli.Store.PreKeys.UploadedPreKeyCount(); err != nil {
|
|
171
|
+
if dbCount, err := cli.Store.PreKeys.UploadedPreKeyCount(ctx); err != nil {
|
|
157
172
|
cli.Log.Errorf("Failed to get number of prekeys in database: %v", err)
|
|
158
|
-
} else if serverCount, err := cli.getServerPreKeyCount(); err != nil {
|
|
173
|
+
} else if serverCount, err := cli.getServerPreKeyCount(ctx); err != nil {
|
|
159
174
|
cli.Log.Warnf("Failed to get number of prekeys on server: %v", err)
|
|
160
175
|
} else {
|
|
161
176
|
cli.Log.Debugf("Database has %d prekeys, server says we have %d", dbCount, serverCount)
|
|
162
177
|
if serverCount < MinPreKeyCount || dbCount < MinPreKeyCount {
|
|
163
|
-
cli.uploadPreKeys()
|
|
164
|
-
sc, _ := cli.getServerPreKeyCount()
|
|
178
|
+
cli.uploadPreKeys(ctx)
|
|
179
|
+
sc, _ := cli.getServerPreKeyCount(ctx)
|
|
165
180
|
cli.Log.Debugf("Prekey count after upload: %d", sc)
|
|
166
181
|
}
|
|
167
182
|
}
|
|
168
|
-
err := cli.SetPassive(false)
|
|
183
|
+
err := cli.SetPassive(ctx, false)
|
|
169
184
|
if err != nil {
|
|
170
185
|
cli.Log.Warnf("Failed to send post-connect passive IQ: %v", err)
|
|
171
186
|
}
|
|
@@ -178,7 +193,7 @@ func (cli *Client) handleConnectSuccess(node *waBinary.Node) {
|
|
|
178
193
|
//
|
|
179
194
|
// This seems to mostly affect whether the device receives certain events.
|
|
180
195
|
// By default, whatsmeow will automatically do SetPassive(false) after connecting.
|
|
181
|
-
func (cli *Client) SetPassive(passive bool) error {
|
|
196
|
+
func (cli *Client) SetPassive(ctx context.Context, passive bool) error {
|
|
182
197
|
tag := "active"
|
|
183
198
|
if passive {
|
|
184
199
|
tag = "passive"
|
|
@@ -187,6 +202,7 @@ func (cli *Client) SetPassive(passive bool) error {
|
|
|
187
202
|
Namespace: "passive",
|
|
188
203
|
Type: "set",
|
|
189
204
|
To: types.ServerJID,
|
|
205
|
+
Context: ctx,
|
|
190
206
|
Content: []waBinary.Node{{Tag: tag}},
|
|
191
207
|
})
|
|
192
208
|
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,7 +93,7 @@ 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)
|
|
96
|
+
err = cli.downloadAndDecryptToFile(ctx, mediaURL, mediaKey, mediaType, fileLength, encFileHash, fileHash, file)
|
|
83
97
|
if err == nil || errors.Is(err, ErrFileLengthMismatch) || errors.Is(err, ErrInvalidMediaSHA256) ||
|
|
84
98
|
errors.Is(err, ErrMediaDownloadFailedWith403) || errors.Is(err, ErrMediaDownloadFailedWith404) || errors.Is(err, ErrMediaDownloadFailedWith410) {
|
|
85
99
|
return err
|
|
@@ -91,10 +105,18 @@ func (cli *Client) DownloadMediaWithPathToFile(directPath string, encFileHash, f
|
|
|
91
105
|
return err
|
|
92
106
|
}
|
|
93
107
|
|
|
94
|
-
func (cli *Client) downloadAndDecryptToFile(
|
|
108
|
+
func (cli *Client) downloadAndDecryptToFile(
|
|
109
|
+
ctx context.Context,
|
|
110
|
+
url string,
|
|
111
|
+
mediaKey []byte,
|
|
112
|
+
appInfo MediaType,
|
|
113
|
+
fileLength int,
|
|
114
|
+
fileEncSHA256, fileSHA256 []byte,
|
|
115
|
+
file File,
|
|
116
|
+
) error {
|
|
95
117
|
iv, cipherKey, macKey, _ := getMediaKeys(mediaKey, appInfo)
|
|
96
118
|
hasher := sha256.New()
|
|
97
|
-
if mac, err := cli.downloadPossiblyEncryptedMediaWithRetriesToFile(url, fileEncSHA256, file); err != nil {
|
|
119
|
+
if mac, err := cli.downloadPossiblyEncryptedMediaWithRetriesToFile(ctx, url, fileEncSHA256, file); err != nil {
|
|
98
120
|
return err
|
|
99
121
|
} else if mediaKey == nil && fileEncSHA256 == nil && mac == nil {
|
|
100
122
|
// Unencrypted media, just return the downloaded data
|
|
@@ -107,7 +129,7 @@ func (cli *Client) downloadAndDecryptToFile(url string, mediaKey []byte, appInfo
|
|
|
107
129
|
return fmt.Errorf("failed to decrypt file: %w", err)
|
|
108
130
|
} else if info, err := file.Stat(); err != nil {
|
|
109
131
|
return fmt.Errorf("failed to stat file: %w", err)
|
|
110
|
-
} else if info.Size() != int64(fileLength) {
|
|
132
|
+
} else if fileLength >= 0 && info.Size() != int64(fileLength) {
|
|
111
133
|
return fmt.Errorf("%w: expected %d, got %d", ErrFileLengthMismatch, fileLength, info.Size())
|
|
112
134
|
} else if _, err = file.Seek(0, io.SeekStart); err != nil {
|
|
113
135
|
return fmt.Errorf("failed to seek to start of file after decrypting: %w", err)
|
|
@@ -119,12 +141,12 @@ func (cli *Client) downloadAndDecryptToFile(url string, mediaKey []byte, appInfo
|
|
|
119
141
|
return nil
|
|
120
142
|
}
|
|
121
143
|
|
|
122
|
-
func (cli *Client) downloadPossiblyEncryptedMediaWithRetriesToFile(url string, checksum []byte, file File) (mac []byte, err error) {
|
|
144
|
+
func (cli *Client) downloadPossiblyEncryptedMediaWithRetriesToFile(ctx context.Context, url string, checksum []byte, file File) (mac []byte, err error) {
|
|
123
145
|
for retryNum := 0; retryNum < 5; retryNum++ {
|
|
124
146
|
if checksum == nil {
|
|
125
|
-
_, _, err = cli.downloadMediaToFile(url, file)
|
|
147
|
+
_, _, err = cli.downloadMediaToFile(ctx, url, file)
|
|
126
148
|
} else {
|
|
127
|
-
mac, err = cli.downloadEncryptedMediaToFile(url, checksum, file)
|
|
149
|
+
mac, err = cli.downloadEncryptedMediaToFile(ctx, url, checksum, file)
|
|
128
150
|
}
|
|
129
151
|
if err == nil || !shouldRetryMediaDownload(err) {
|
|
130
152
|
return
|
|
@@ -139,13 +161,17 @@ func (cli *Client) downloadPossiblyEncryptedMediaWithRetriesToFile(url string, c
|
|
|
139
161
|
if err != nil {
|
|
140
162
|
return nil, fmt.Errorf("failed to seek to start of file to retry download: %w", err)
|
|
141
163
|
}
|
|
142
|
-
|
|
164
|
+
select {
|
|
165
|
+
case <-ctx.Done():
|
|
166
|
+
return nil, ctx.Err()
|
|
167
|
+
case <-time.After(retryDuration):
|
|
168
|
+
}
|
|
143
169
|
}
|
|
144
170
|
return
|
|
145
171
|
}
|
|
146
172
|
|
|
147
|
-
func (cli *Client) downloadMediaToFile(url string, file io.Writer) (int64, []byte, error) {
|
|
148
|
-
resp, err := cli.doMediaDownloadRequest(url)
|
|
173
|
+
func (cli *Client) downloadMediaToFile(ctx context.Context, url string, file io.Writer) (int64, []byte, error) {
|
|
174
|
+
resp, err := cli.doMediaDownloadRequest(ctx, url)
|
|
149
175
|
if err != nil {
|
|
150
176
|
return 0, nil, err
|
|
151
177
|
}
|
|
@@ -162,8 +188,8 @@ func (cli *Client) downloadMediaToFile(url string, file io.Writer) (int64, []byt
|
|
|
162
188
|
return n, hasher.Sum(nil), err
|
|
163
189
|
}
|
|
164
190
|
|
|
165
|
-
func (cli *Client) downloadEncryptedMediaToFile(url string, checksum []byte, file File) ([]byte, error) {
|
|
166
|
-
size, hash, err := cli.downloadMediaToFile(url, file)
|
|
191
|
+
func (cli *Client) downloadEncryptedMediaToFile(ctx context.Context, url string, checksum []byte, file File) ([]byte, error) {
|
|
192
|
+
size, hash, err := cli.downloadMediaToFile(ctx, url, file)
|
|
167
193
|
if err != nil {
|
|
168
194
|
return nil, err
|
|
169
195
|
} else if size <= mediaHMACLength {
|
|
@@ -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"
|
|
@@ -129,21 +130,21 @@ var mediaTypeToMMSType = map[MediaType]string{
|
|
|
129
130
|
}
|
|
130
131
|
|
|
131
132
|
// DownloadAny loops through the downloadable parts of the given message and downloads the first non-nil item.
|
|
132
|
-
func (cli *Client) DownloadAny(msg *waE2E.Message) (data []byte, err error) {
|
|
133
|
+
func (cli *Client) DownloadAny(ctx context.Context, msg *waE2E.Message) (data []byte, err error) {
|
|
133
134
|
if msg == nil {
|
|
134
135
|
return nil, ErrNothingDownloadableFound
|
|
135
136
|
}
|
|
136
137
|
switch {
|
|
137
138
|
case msg.ImageMessage != nil:
|
|
138
|
-
return cli.Download(msg.ImageMessage)
|
|
139
|
+
return cli.Download(ctx, msg.ImageMessage)
|
|
139
140
|
case msg.VideoMessage != nil:
|
|
140
|
-
return cli.Download(msg.VideoMessage)
|
|
141
|
+
return cli.Download(ctx, msg.VideoMessage)
|
|
141
142
|
case msg.AudioMessage != nil:
|
|
142
|
-
return cli.Download(msg.AudioMessage)
|
|
143
|
+
return cli.Download(ctx, msg.AudioMessage)
|
|
143
144
|
case msg.DocumentMessage != nil:
|
|
144
|
-
return cli.Download(msg.DocumentMessage)
|
|
145
|
+
return cli.Download(ctx, msg.DocumentMessage)
|
|
145
146
|
case msg.StickerMessage != nil:
|
|
146
|
-
return cli.Download(msg.StickerMessage)
|
|
147
|
+
return cli.Download(ctx, msg.StickerMessage)
|
|
147
148
|
default:
|
|
148
149
|
return nil, ErrNothingDownloadableFound
|
|
149
150
|
}
|
|
@@ -167,12 +168,12 @@ func getSize(msg DownloadableMessage) int {
|
|
|
167
168
|
// var msg *waE2E.Message
|
|
168
169
|
// ...
|
|
169
170
|
// thumbnailImageBytes, err := cli.DownloadThumbnail(msg.GetExtendedTextMessage())
|
|
170
|
-
func (cli *Client) DownloadThumbnail(msg DownloadableThumbnail) ([]byte, error) {
|
|
171
|
+
func (cli *Client) DownloadThumbnail(ctx context.Context, msg DownloadableThumbnail) ([]byte, error) {
|
|
171
172
|
mediaType, ok := classToThumbnailMediaType[msg.ProtoReflect().Descriptor().Name()]
|
|
172
173
|
if !ok {
|
|
173
174
|
return nil, fmt.Errorf("%w '%s'", ErrUnknownMediaType, string(msg.ProtoReflect().Descriptor().Name()))
|
|
174
175
|
} else if len(msg.GetThumbnailDirectPath()) > 0 {
|
|
175
|
-
return cli.DownloadMediaWithPath(msg.GetThumbnailDirectPath(), msg.GetThumbnailEncSHA256(), msg.GetThumbnailSHA256(), msg.GetMediaKey(), -1, mediaType, mediaTypeToMMSType[mediaType])
|
|
176
|
+
return cli.DownloadMediaWithPath(ctx, msg.GetThumbnailDirectPath(), msg.GetThumbnailEncSHA256(), msg.GetThumbnailSHA256(), msg.GetMediaKey(), -1, mediaType, mediaTypeToMMSType[mediaType])
|
|
176
177
|
} else {
|
|
177
178
|
return nil, ErrNoURLPresent
|
|
178
179
|
}
|
|
@@ -200,7 +201,7 @@ func GetMediaType(msg DownloadableMessage) MediaType {
|
|
|
200
201
|
// imageData, err := cli.Download(msg.GetImageMessage())
|
|
201
202
|
//
|
|
202
203
|
// You can also use DownloadAny to download the first non-nil sub-message.
|
|
203
|
-
func (cli *Client) Download(msg DownloadableMessage) ([]byte, error) {
|
|
204
|
+
func (cli *Client) Download(ctx context.Context, msg DownloadableMessage) ([]byte, error) {
|
|
204
205
|
if cli == nil {
|
|
205
206
|
return nil, ErrClientIsNil
|
|
206
207
|
}
|
|
@@ -216,9 +217,9 @@ func (cli *Client) Download(msg DownloadableMessage) ([]byte, error) {
|
|
|
216
217
|
isWebWhatsappNetURL = strings.HasPrefix(url, "https://web.whatsapp.net")
|
|
217
218
|
}
|
|
218
219
|
if len(url) > 0 && !isWebWhatsappNetURL {
|
|
219
|
-
return cli.downloadAndDecrypt(url, msg.GetMediaKey(), mediaType, getSize(msg), msg.GetFileEncSHA256(), msg.GetFileSHA256())
|
|
220
|
+
return cli.downloadAndDecrypt(ctx, url, msg.GetMediaKey(), mediaType, getSize(msg), msg.GetFileEncSHA256(), msg.GetFileSHA256())
|
|
220
221
|
} else if len(msg.GetDirectPath()) > 0 {
|
|
221
|
-
return cli.DownloadMediaWithPath(msg.GetDirectPath(), msg.GetFileEncSHA256(), msg.GetFileSHA256(), msg.GetMediaKey(), getSize(msg), mediaType, mediaTypeToMMSType[mediaType])
|
|
222
|
+
return cli.DownloadMediaWithPath(ctx, msg.GetDirectPath(), msg.GetFileEncSHA256(), msg.GetFileSHA256(), msg.GetMediaKey(), getSize(msg), mediaType, mediaTypeToMMSType[mediaType])
|
|
222
223
|
} else {
|
|
223
224
|
if isWebWhatsappNetURL {
|
|
224
225
|
cli.Log.Warnf("Got a media message with a web.whatsapp.net URL (%s) and no direct path", url)
|
|
@@ -227,14 +228,25 @@ func (cli *Client) Download(msg DownloadableMessage) ([]byte, error) {
|
|
|
227
228
|
}
|
|
228
229
|
}
|
|
229
230
|
|
|
230
|
-
func (cli *Client) DownloadFB(
|
|
231
|
-
|
|
231
|
+
func (cli *Client) DownloadFB(
|
|
232
|
+
ctx context.Context,
|
|
233
|
+
transport *waMediaTransport.WAMediaTransport_Integral,
|
|
234
|
+
mediaType MediaType,
|
|
235
|
+
) ([]byte, error) {
|
|
236
|
+
return cli.DownloadMediaWithPath(ctx, transport.GetDirectPath(), transport.GetFileEncSHA256(), transport.GetFileSHA256(), transport.GetMediaKey(), -1, mediaType, mediaTypeToMMSType[mediaType])
|
|
232
237
|
}
|
|
233
238
|
|
|
234
239
|
// DownloadMediaWithPath downloads an attachment by manually specifying the path and encryption details.
|
|
235
|
-
func (cli *Client) DownloadMediaWithPath(
|
|
240
|
+
func (cli *Client) DownloadMediaWithPath(
|
|
241
|
+
ctx context.Context,
|
|
242
|
+
directPath string,
|
|
243
|
+
encFileHash, fileHash, mediaKey []byte,
|
|
244
|
+
fileLength int,
|
|
245
|
+
mediaType MediaType,
|
|
246
|
+
mmsType string,
|
|
247
|
+
) (data []byte, err error) {
|
|
236
248
|
var mediaConn *MediaConn
|
|
237
|
-
mediaConn, err = cli.refreshMediaConn(false)
|
|
249
|
+
mediaConn, err = cli.refreshMediaConn(ctx, false)
|
|
238
250
|
if err != nil {
|
|
239
251
|
return nil, fmt.Errorf("failed to refresh media connections: %w", err)
|
|
240
252
|
}
|
|
@@ -244,7 +256,7 @@ func (cli *Client) DownloadMediaWithPath(directPath string, encFileHash, fileHas
|
|
|
244
256
|
for i, host := range mediaConn.Hosts {
|
|
245
257
|
// TODO omit hash for unencrypted media?
|
|
246
258
|
mediaURL := fmt.Sprintf("https://%s%s&hash=%s&mms-type=%s&__wa-mms=", host.Hostname, directPath, base64.URLEncoding.EncodeToString(encFileHash), mmsType)
|
|
247
|
-
data, err = cli.downloadAndDecrypt(mediaURL, mediaKey, mediaType, fileLength, encFileHash, fileHash)
|
|
259
|
+
data, err = cli.downloadAndDecrypt(ctx, mediaURL, mediaKey, mediaType, fileLength, encFileHash, fileHash)
|
|
248
260
|
if err == nil || errors.Is(err, ErrFileLengthMismatch) || errors.Is(err, ErrInvalidMediaSHA256) ||
|
|
249
261
|
errors.Is(err, ErrMediaDownloadFailedWith403) || errors.Is(err, ErrMediaDownloadFailedWith404) || errors.Is(err, ErrMediaDownloadFailedWith410) {
|
|
250
262
|
return
|
|
@@ -256,10 +268,18 @@ func (cli *Client) DownloadMediaWithPath(directPath string, encFileHash, fileHas
|
|
|
256
268
|
return
|
|
257
269
|
}
|
|
258
270
|
|
|
259
|
-
func (cli *Client) downloadAndDecrypt(
|
|
271
|
+
func (cli *Client) downloadAndDecrypt(
|
|
272
|
+
ctx context.Context,
|
|
273
|
+
url string,
|
|
274
|
+
mediaKey []byte,
|
|
275
|
+
appInfo MediaType,
|
|
276
|
+
fileLength int,
|
|
277
|
+
fileEncSHA256,
|
|
278
|
+
fileSHA256 []byte,
|
|
279
|
+
) (data []byte, err error) {
|
|
260
280
|
iv, cipherKey, macKey, _ := getMediaKeys(mediaKey, appInfo)
|
|
261
281
|
var ciphertext, mac []byte
|
|
262
|
-
if ciphertext, mac, err = cli.downloadPossiblyEncryptedMediaWithRetries(url, fileEncSHA256); err != nil {
|
|
282
|
+
if ciphertext, mac, err = cli.downloadPossiblyEncryptedMediaWithRetries(ctx, url, fileEncSHA256); err != nil {
|
|
263
283
|
|
|
264
284
|
} else if mediaKey == nil && fileEncSHA256 == nil && mac == nil {
|
|
265
285
|
// Unencrypted media, just return the downloaded data
|
|
@@ -289,12 +309,12 @@ func shouldRetryMediaDownload(err error) bool {
|
|
|
289
309
|
(errors.As(err, &httpErr) && retryafter.Should(httpErr.StatusCode, true))
|
|
290
310
|
}
|
|
291
311
|
|
|
292
|
-
func (cli *Client) downloadPossiblyEncryptedMediaWithRetries(url string, checksum []byte) (file, mac []byte, err error) {
|
|
312
|
+
func (cli *Client) downloadPossiblyEncryptedMediaWithRetries(ctx context.Context, url string, checksum []byte) (file, mac []byte, err error) {
|
|
293
313
|
for retryNum := 0; retryNum < 5; retryNum++ {
|
|
294
314
|
if checksum == nil {
|
|
295
|
-
file, err = cli.downloadMedia(url)
|
|
315
|
+
file, err = cli.downloadMedia(ctx, url)
|
|
296
316
|
} else {
|
|
297
|
-
file, mac, err = cli.downloadEncryptedMedia(url, checksum)
|
|
317
|
+
file, mac, err = cli.downloadEncryptedMedia(ctx, url, checksum)
|
|
298
318
|
}
|
|
299
319
|
if err == nil || !shouldRetryMediaDownload(err) {
|
|
300
320
|
return
|
|
@@ -305,13 +325,17 @@ func (cli *Client) downloadPossiblyEncryptedMediaWithRetries(url string, checksu
|
|
|
305
325
|
retryDuration = retryafter.Parse(httpErr.Response.Header.Get("Retry-After"), retryDuration)
|
|
306
326
|
}
|
|
307
327
|
cli.Log.Warnf("Failed to download media due to network error: %v, retrying in %s...", err, retryDuration)
|
|
308
|
-
|
|
328
|
+
select {
|
|
329
|
+
case <-ctx.Done():
|
|
330
|
+
return nil, nil, ctx.Err()
|
|
331
|
+
case <-time.After(retryDuration):
|
|
332
|
+
}
|
|
309
333
|
}
|
|
310
334
|
return
|
|
311
335
|
}
|
|
312
336
|
|
|
313
|
-
func (cli *Client) doMediaDownloadRequest(url string) (*http.Response, error) {
|
|
314
|
-
req, err := http.
|
|
337
|
+
func (cli *Client) doMediaDownloadRequest(ctx context.Context, url string) (*http.Response, error) {
|
|
338
|
+
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
|
|
315
339
|
if err != nil {
|
|
316
340
|
return nil, fmt.Errorf("failed to prepare request: %w", err)
|
|
317
341
|
}
|
|
@@ -332,8 +356,8 @@ func (cli *Client) doMediaDownloadRequest(url string) (*http.Response, error) {
|
|
|
332
356
|
return resp, nil
|
|
333
357
|
}
|
|
334
358
|
|
|
335
|
-
func (cli *Client) downloadMedia(url string) ([]byte, error) {
|
|
336
|
-
resp, err := cli.doMediaDownloadRequest(url)
|
|
359
|
+
func (cli *Client) downloadMedia(ctx context.Context, url string) ([]byte, error) {
|
|
360
|
+
resp, err := cli.doMediaDownloadRequest(ctx, url)
|
|
337
361
|
if err != nil {
|
|
338
362
|
return nil, err
|
|
339
363
|
}
|
|
@@ -344,8 +368,8 @@ func (cli *Client) downloadMedia(url string) ([]byte, error) {
|
|
|
344
368
|
|
|
345
369
|
const mediaHMACLength = 10
|
|
346
370
|
|
|
347
|
-
func (cli *Client) downloadEncryptedMedia(url string, checksum []byte) (file, mac []byte, err error) {
|
|
348
|
-
data, err := cli.downloadMedia(url)
|
|
371
|
+
func (cli *Client) downloadEncryptedMedia(ctx context.Context, url string, checksum []byte) (file, mac []byte, err error) {
|
|
372
|
+
data, err := cli.downloadMedia(ctx, url)
|
|
349
373
|
if err != nil {
|
|
350
374
|
return
|
|
351
375
|
} else if len(data) <= mediaHMACLength {
|
|
@@ -141,6 +141,7 @@ var (
|
|
|
141
141
|
var (
|
|
142
142
|
ErrOriginalMessageSecretNotFound = errors.New("original message secret key not found")
|
|
143
143
|
ErrNotEncryptedReactionMessage = errors.New("given message isn't an encrypted reaction message")
|
|
144
|
+
ErrNotEncryptedCommentMessage = errors.New("given message isn't an encrypted comment message")
|
|
144
145
|
ErrNotPollUpdateMessage = errors.New("given message isn't a poll update message")
|
|
145
146
|
)
|
|
146
147
|
|