From 4bc3b380b8c27ca0a38ebdab1d038f94e656157e Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 7 Mar 2024 18:37:28 +0300 Subject: [PATCH] Support sending of queries with a prefix. --- td/generate/scheme/telegram_api.tl | 3 ++- td/telegram/SecretChatActor.cpp | 2 +- td/telegram/files/FileDownloader.cpp | 8 +++---- td/telegram/net/DcAuthManager.cpp | 7 +++--- td/telegram/net/NetQueryCreator.cpp | 33 ++++++++++++++++++++++------ td/telegram/net/NetQueryCreator.h | 9 ++++++-- td/telegram/net/Session.cpp | 6 ++--- 7 files changed, 47 insertions(+), 21 deletions(-) diff --git a/td/generate/scheme/telegram_api.tl b/td/generate/scheme/telegram_api.tl index 19dddee16..b4887882a 100644 --- a/td/generate/scheme/telegram_api.tl +++ b/td/generate/scheme/telegram_api.tl @@ -24,10 +24,11 @@ inputStickerSetThumbLegacy#dbaeae9 stickerset:InputStickerSet volume_id:long loc ---functions--- -test.useError = Error; test.useConfigSimple = help.ConfigSimple; test.parseInputAppEvent = InputAppEvent; +invokeWithBusinessConnectionPrefix connection_id:string = Error; + ---types--- inputPeerEmpty#7f3b18ea = InputPeer; diff --git a/td/telegram/SecretChatActor.cpp b/td/telegram/SecretChatActor.cpp index 421dc9f73..2acd2dc5d 100644 --- a/td/telegram/SecretChatActor.cpp +++ b/td/telegram/SecretChatActor.cpp @@ -67,7 +67,7 @@ SecretChatActor::SecretChatActor(int32 id, unique_ptr context, bool can template NetQueryPtr SecretChatActor::create_net_query(QueryType type, const T &function) { return context_->net_query_creator().create(UniqueId::next(UniqueId::Type::Default, static_cast(type)), - function, {}, DcId::main(), NetQuery::Type::Common, + nullptr, function, {}, DcId::main(), NetQuery::Type::Common, NetQuery::AuthFlag::On); } diff --git a/td/telegram/files/FileDownloader.cpp b/td/telegram/files/FileDownloader.cpp index 62f0c691a..1ddd27fcc 100644 --- a/td/telegram/files/FileDownloader.cpp +++ b/td/telegram/files/FileDownloader.cpp @@ -253,12 +253,12 @@ Result> FileDownloader::start_part(Part part, int32 net_query = remote_.is_web() ? G()->net_query_creator().create( - unique_id, + unique_id, nullptr, telegram_api::upload_getWebFile(remote_.as_input_web_file_location(), narrow_cast(part.offset), narrow_cast(size)), {}, dc_id, net_query_type, NetQuery::AuthFlag::On) : G()->net_query_creator().create( - unique_id, + unique_id, nullptr, telegram_api::upload_getFile(flags, false /*ignored*/, false /*ignored*/, remote_.as_input_file_location(), part.offset, narrow_cast(size)), {}, dc_id, net_query_type, NetQuery::AuthFlag::On); @@ -272,11 +272,11 @@ Result> FileDownloader::start_part(Part part, int32 cdn_part_file_token_generation_[part.id] = cdn_file_token_generation_; net_query = G()->net_query_creator().create(UniqueId::next(UniqueId::Type::Default, static_cast(QueryType::CDN)), - query, {}, cdn_dc_id_, net_query_type, NetQuery::AuthFlag::Off); + nullptr, query, {}, cdn_dc_id_, net_query_type, NetQuery::AuthFlag::Off); } else { auto query = telegram_api::upload_reuploadCdnFile(BufferSlice(cdn_file_token_), BufferSlice(it->second)); net_query = G()->net_query_creator().create( - UniqueId::next(UniqueId::Type::Default, static_cast(QueryType::ReuploadCDN)), query, {}, + UniqueId::next(UniqueId::Type::Default, static_cast(QueryType::ReuploadCDN)), nullptr, query, {}, remote_.get_dc_id(), net_query_type, NetQuery::AuthFlag::On); cdn_part_reupload_token_.erase(it); } diff --git a/td/telegram/net/DcAuthManager.cpp b/td/telegram/net/DcAuthManager.cpp index a24a1c81f..86f6409dc 100644 --- a/td/telegram/net/DcAuthManager.cpp +++ b/td/telegram/net/DcAuthManager.cpp @@ -156,8 +156,9 @@ void DcAuthManager::dc_loop(DcInfo &dc) { // send auth.exportAuthorization to auth_dc VLOG(dc) << "Send exportAuthorization to " << dc.dc_id; auto id = UniqueId::next(); - auto query = G()->net_query_creator().create(id, telegram_api::auth_exportAuthorization(dc.dc_id.get_raw_id()), - {}, DcId::main(), NetQuery::Type::Common, NetQuery::AuthFlag::On); + auto query = + G()->net_query_creator().create(id, nullptr, telegram_api::auth_exportAuthorization(dc.dc_id.get_raw_id()), + {}, DcId::main(), NetQuery::Type::Common, NetQuery::AuthFlag::On); query->total_timeout_limit_ = 60 * 60 * 24; G()->net_query_dispatcher().dispatch_with_callback(std::move(query), actor_shared(this, dc.dc_id.get_raw_id())); dc.wait_id = id; @@ -173,7 +174,7 @@ void DcAuthManager::dc_loop(DcInfo &dc) { uint64 id = UniqueId::next(); VLOG(dc) << "Send importAuthorization to " << dc.dc_id; auto query = G()->net_query_creator().create( - id, telegram_api::auth_importAuthorization(dc.export_id, std::move(dc.export_bytes)), {}, dc.dc_id, + id, nullptr, telegram_api::auth_importAuthorization(dc.export_id, std::move(dc.export_bytes)), {}, dc.dc_id, NetQuery::Type::Common, NetQuery::AuthFlag::Off); query->total_timeout_limit_ = 60 * 60 * 24; G()->net_query_dispatcher().dispatch_with_callback(std::move(query), actor_shared(this, dc.dc_id.get_raw_id())); diff --git a/td/telegram/net/NetQueryCreator.cpp b/td/telegram/net/NetQueryCreator.cpp index 05715c3da..2b78d699a 100644 --- a/td/telegram/net/NetQueryCreator.cpp +++ b/td/telegram/net/NetQueryCreator.cpp @@ -29,17 +29,36 @@ NetQueryCreator::NetQueryCreator(std::shared_ptr net_query_stats) NetQueryPtr NetQueryCreator::create(const telegram_api::Function &function, vector chain_ids, DcId dc_id, NetQuery::Type type) { - return create(UniqueId::next(), function, std::move(chain_ids), dc_id, type, NetQuery::AuthFlag::On); + return create(UniqueId::next(), nullptr, function, std::move(chain_ids), dc_id, type, NetQuery::AuthFlag::On); } -NetQueryPtr NetQueryCreator::create(uint64 id, const telegram_api::Function &function, vector &&chain_ids, - DcId dc_id, NetQuery::Type type, NetQuery::AuthFlag auth_flag) { +NetQueryPtr NetQueryCreator::create_with_prefix(const unique_ptr &prefix, + const telegram_api::Function &function, DcId dc_id, + NetQuery::Type type) { + return create(UniqueId::next(), prefix, function, {}, dc_id, type, NetQuery::AuthFlag::On); +} + +NetQueryPtr NetQueryCreator::create(uint64 id, const unique_ptr &prefix, + const telegram_api::Function &function, vector &&chain_ids, DcId dc_id, + NetQuery::Type type, NetQuery::AuthFlag auth_flag) { LOG(INFO) << "Create query " << to_string(function); + string prefix_str; + if (prefix != nullptr) { + auto storer = DefaultStorer(*prefix); + prefix_str.resize(storer.size()); + auto real_size = storer.store(MutableSlice(prefix_str).ubegin()); + CHECK(real_size == prefix_str.size()); + } + auto storer = DefaultStorer(function); - BufferSlice slice(storer.size()); - auto real_size = storer.store(slice.as_mutable_slice().ubegin()); - LOG_CHECK(real_size == slice.size()) << real_size << " " << slice.size() << " " - << format::as_hex_dump<4>(slice.as_slice()); + BufferSlice slice(prefix_str.size() + storer.size()); + auto real_size = storer.store(slice.as_mutable_slice().ubegin() + prefix_str.size()); + LOG_CHECK(prefix_str.size() + real_size == slice.size()) + << prefix_str.size() << ' ' << real_size << ' ' << slice.size() << ' ' + << format::as_hex_dump<4>(slice.as_slice()); + if (prefix != nullptr) { + slice.as_mutable_slice().copy_from(prefix_str); + } size_t min_gzipped_size = 128; int32 tl_constructor = function.get_id(); diff --git a/td/telegram/net/NetQueryCreator.h b/td/telegram/net/NetQueryCreator.h index 04c851e0f..da2a9a912 100644 --- a/td/telegram/net/NetQueryCreator.h +++ b/td/telegram/net/NetQueryCreator.h @@ -35,10 +35,15 @@ class NetQueryCreator { NetQuery::Type type = NetQuery::Type::Common); NetQueryPtr create_unauth(const telegram_api::Function &function, DcId dc_id = DcId::main()) { - return create(UniqueId::next(), function, {}, dc_id, NetQuery::Type::Common, NetQuery::AuthFlag::Off); + return create(UniqueId::next(), nullptr, function, {}, dc_id, NetQuery::Type::Common, NetQuery::AuthFlag::Off); } - NetQueryPtr create(uint64 id, const telegram_api::Function &function, vector &&chain_ids, DcId dc_id, + NetQueryPtr create_with_prefix(const unique_ptr &prefix, + const telegram_api::Function &function, DcId dc_id, + NetQuery::Type type = NetQuery::Type::Common); + + NetQueryPtr create(uint64 id, const unique_ptr &prefix, + const telegram_api::Function &function, vector &&chain_ids, DcId dc_id, NetQuery::Type type, NetQuery::AuthFlag auth_flag); private: diff --git a/td/telegram/net/Session.cpp b/td/telegram/net/Session.cpp index 6bb84a8d5..8e3d5ec80 100644 --- a/td/telegram/net/Session.cpp +++ b/td/telegram/net/Session.cpp @@ -1345,8 +1345,8 @@ bool Session::connection_send_check_main_key(ConnectionInfo *info) { LOG(INFO) << "Check main key"; being_checked_main_auth_key_id_ = key_id; last_check_query_id_ = UniqueId::next(UniqueId::BindKey); - NetQueryPtr query = G()->net_query_creator().create(last_check_query_id_, telegram_api::help_getNearestDc(), {}, - DcId::main(), NetQuery::Type::Common, NetQuery::AuthFlag::On); + NetQueryPtr query = G()->net_query_creator().create(last_check_query_id_, nullptr, telegram_api::help_getNearestDc(), + {}, DcId::main(), NetQuery::Type::Common, NetQuery::AuthFlag::On); query->dispatch_ttl_ = 0; query->set_callback(actor_shared(this)); connection_send_query(info, std::move(query)); @@ -1382,7 +1382,7 @@ bool Session::connection_send_bind_key(ConnectionInfo *info) { LOG(INFO) << "Bind key: " << tag("tmp", key_id) << tag("perm", static_cast(perm_auth_key_id)); NetQueryPtr query = G()->net_query_creator().create( - last_bind_query_id_, + last_bind_query_id_, nullptr, telegram_api::auth_bindTempAuthKey(perm_auth_key_id, nonce, expires_at, std::move(encrypted)), {}, DcId::main(), NetQuery::Type::Common, NetQuery::AuthFlag::On); query->dispatch_ttl_ = 0;