From 3a9ec3fc2937da5b16d5da9b98c2213ec70ad985 Mon Sep 17 00:00:00 2001 From: Arseny Smirnov Date: Tue, 9 Jul 2019 16:45:38 +0200 Subject: [PATCH] ConfigRecoverer: support tls obfuscation (not tested) GitOrigin-RevId: edc982ee6d1ce2834a80464a7b20ef712f465814 --- td/telegram/ConfigManager.cpp | 21 ++++++++----- td/telegram/net/ConnectionCreator.cpp | 43 ++++++++++++++++++++++----- td/telegram/net/ConnectionCreator.h | 3 +- 3 files changed, 51 insertions(+), 16 deletions(-) diff --git a/td/telegram/ConfigManager.cpp b/td/telegram/ConfigManager.cpp index f216e91f..95f5f3dd 100644 --- a/td/telegram/ConfigManager.cpp +++ b/td/telegram/ConfigManager.cpp @@ -197,11 +197,11 @@ ActorOwn<> get_simple_config_google_dns(Promise promise, const Con #endif } -ActorOwn<> get_full_config(DcId dc_id, IPAddress ip_address, Promise promise) { +ActorOwn<> get_full_config(DcId dc_id, IPAddress ip_address, mtproto::ProxySecret secret, Promise promise) { class SessionCallback : public Session::Callback { public: - SessionCallback(ActorShared<> parent, IPAddress address) - : parent_(std::move(parent)), address_(std::move(address)) { + SessionCallback(ActorShared<> parent, IPAddress address, mtproto::ProxySecret secret) + : parent_(std::move(parent)), address_(std::move(address)), secret_(std::move(secret)) { } void on_failed() final { } @@ -213,7 +213,7 @@ ActorOwn<> get_full_config(DcId dc_id, IPAddress ip_address, Promise VLOG(config_recoverer) << "Request full config from " << address_ << ", try = " << request_raw_connection_cnt_; if (request_raw_connection_cnt_ <= 2) { send_closure(G()->connection_creator(), &ConnectionCreator::request_raw_connection_by_ip, address_, - std::move(promise)); + mtproto::TransportType{mtproto::TransportType::ObfuscatedTcp, 0, secret_}, std::move(promise)); } else { // Delay all queries except first forever delay_forever_.push_back(std::move(promise)); @@ -229,6 +229,7 @@ ActorOwn<> get_full_config(DcId dc_id, IPAddress ip_address, Promise private: ActorShared<> parent_; IPAddress address_; + mtproto::ProxySecret secret_; size_t request_raw_connection_cnt_{0}; std::vector>> delay_forever_; }; @@ -309,13 +310,14 @@ ActorOwn<> get_full_config(DcId dc_id, IPAddress ip_address, Promise class GetConfigActor : public NetQueryCallback { public: - GetConfigActor(DcId dc_id, IPAddress ip_address, Promise promise) - : dc_id_(dc_id), ip_address_(std::move(ip_address)), promise_(std::move(promise)) { + GetConfigActor(DcId dc_id, IPAddress ip_address, mtproto::ProxySecret secret, Promise promise) + : dc_id_(dc_id), ip_address_(std::move(ip_address)), secret_(std::move(secret)), promise_(std::move(promise)) { } private: void start_up() override { - auto session_callback = make_unique(actor_shared(this, 1), std::move(ip_address_)); + auto session_callback = + make_unique(actor_shared(this, 1), std::move(ip_address_), std::move(secret_)); auto auth_data = std::make_shared(dc_id_); int32 int_dc_id = dc_id_.get_raw_id(); @@ -357,10 +359,12 @@ ActorOwn<> get_full_config(DcId dc_id, IPAddress ip_address, Promise DcId dc_id_; IPAddress ip_address_; ActorOwn session_; + mtproto::ProxySecret secret_; Promise promise_; }; - return ActorOwn<>(create_actor("GetConfigActor", dc_id, std::move(ip_address), std::move(promise))); + return ActorOwn<>(create_actor("GetConfigActor", dc_id, std::move(ip_address), std::move(secret), + std::move(promise))); } class ConfigRecoverer : public Actor { @@ -611,6 +615,7 @@ class ConfigRecoverer : public Actor { VLOG(config_recoverer) << "ASK FULL CONFIG"; full_config_query_ = get_full_config( dc_options_.dc_options[dc_options_i_].get_dc_id(), dc_options_.dc_options[dc_options_i_].get_ip_address(), + dc_options_.dc_options[dc_options_i_].get_secret(), PromiseCreator::lambda([actor_id = actor_shared(this)](Result r_full_config) { send_closure(actor_id, &ConfigRecoverer::on_full_config, std::move(r_full_config), false); })); diff --git a/td/telegram/net/ConnectionCreator.cpp b/td/telegram/net/ConnectionCreator.cpp index 66f1802b..a505900c 100644 --- a/td/telegram/net/ConnectionCreator.cpp +++ b/td/telegram/net/ConnectionCreator.cpp @@ -718,19 +718,48 @@ void ConnectionCreator::request_raw_connection(DcId dc_id, bool allow_media_only client_loop(client); } -void ConnectionCreator::request_raw_connection_by_ip(IPAddress ip_address, +void ConnectionCreator::request_raw_connection_by_ip(IPAddress ip_address, mtproto::TransportType transport_type, Promise> promise) { auto r_socket_fd = SocketFd::open(ip_address); if (r_socket_fd.is_error()) { return promise.set_error(r_socket_fd.move_as_error()); } + auto socket_fd = r_socket_fd.move_as_ok(); - // TODO TransportType is wrong - auto raw_connection = make_unique( - r_socket_fd.move_as_ok(), - mtproto::TransportType{mtproto::TransportType::ObfuscatedTcp, 0, mtproto::ProxySecret()}, nullptr); - raw_connection->extra_ = network_generation_; - promise.set_value(std::move(raw_connection)); + auto socket_fd_promise = + PromiseCreator::lambda([promise = std::move(promise), actor_id = actor_id(this), transport_type, + network_generation = network_generation_](Result r_socket_fd) mutable { + if (r_socket_fd.is_error()) { + return promise.set_error(Status::Error(400, r_socket_fd.error().public_message())); + } + auto raw_connection = make_unique(r_socket_fd.move_as_ok(), transport_type, nullptr); + raw_connection->extra_ = network_generation; + promise.set_value(std::move(raw_connection)); + }); + + if (transport_type.secret.emulate_tls()) { + class Callback : public TransparentProxy::Callback { + public: + explicit Callback(Promise promise) : promise_(std::move(promise)) { + } + void set_result(Result result) override { + promise_.set_result(std::move(result)); + } + void on_connected() override { + } + + private: + Promise promise_; + }; + auto token = next_token(); + auto callback = td::make_unique(std::move(socket_fd_promise)); + children_[token] = {false, create_actor( + "TlsInit", std::move(socket_fd), ip_address, transport_type.secret.get_domain(), + transport_type.secret.get_proxy_secret().str(), std::move(callback), + create_reference(token), G()->get_dns_time_difference())}; + } else { + socket_fd_promise.set_value(std::move(socket_fd)); + } } Result ConnectionCreator::get_transport_type(const ProxyInfo &proxy, diff --git a/td/telegram/net/ConnectionCreator.h b/td/telegram/net/ConnectionCreator.h index 1bf14537..74a5bca2 100644 --- a/td/telegram/net/ConnectionCreator.h +++ b/td/telegram/net/ConnectionCreator.h @@ -68,7 +68,8 @@ class ConnectionCreator : public NetQueryCallback { void request_raw_connection(DcId dc_id, bool allow_media_only, bool is_media, Promise> promise, size_t hash = 0, unique_ptr auth_data = {}); - void request_raw_connection_by_ip(IPAddress ip_address, Promise> promise); + void request_raw_connection_by_ip(IPAddress ip_address, mtproto::TransportType transport_type, + Promise> promise); void set_net_stats_callback(std::shared_ptr common_callback, std::shared_ptr media_callback);