ConfigRecoverer: support tls obfuscation (not tested)
GitOrigin-RevId: edc982ee6d1ce2834a80464a7b20ef712f465814
This commit is contained in:
parent
b9e5ebd222
commit
3a9ec3fc29
@ -197,11 +197,11 @@ ActorOwn<> get_simple_config_google_dns(Promise<SimpleConfig> promise, const Con
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
ActorOwn<> get_full_config(DcId dc_id, IPAddress ip_address, Promise<FullConfig> promise) {
|
ActorOwn<> get_full_config(DcId dc_id, IPAddress ip_address, mtproto::ProxySecret secret, Promise<FullConfig> promise) {
|
||||||
class SessionCallback : public Session::Callback {
|
class SessionCallback : public Session::Callback {
|
||||||
public:
|
public:
|
||||||
SessionCallback(ActorShared<> parent, IPAddress address)
|
SessionCallback(ActorShared<> parent, IPAddress address, mtproto::ProxySecret secret)
|
||||||
: parent_(std::move(parent)), address_(std::move(address)) {
|
: parent_(std::move(parent)), address_(std::move(address)), secret_(std::move(secret)) {
|
||||||
}
|
}
|
||||||
void on_failed() final {
|
void on_failed() final {
|
||||||
}
|
}
|
||||||
@ -213,7 +213,7 @@ ActorOwn<> get_full_config(DcId dc_id, IPAddress ip_address, Promise<FullConfig>
|
|||||||
VLOG(config_recoverer) << "Request full config from " << address_ << ", try = " << request_raw_connection_cnt_;
|
VLOG(config_recoverer) << "Request full config from " << address_ << ", try = " << request_raw_connection_cnt_;
|
||||||
if (request_raw_connection_cnt_ <= 2) {
|
if (request_raw_connection_cnt_ <= 2) {
|
||||||
send_closure(G()->connection_creator(), &ConnectionCreator::request_raw_connection_by_ip, address_,
|
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 {
|
} else {
|
||||||
// Delay all queries except first forever
|
// Delay all queries except first forever
|
||||||
delay_forever_.push_back(std::move(promise));
|
delay_forever_.push_back(std::move(promise));
|
||||||
@ -229,6 +229,7 @@ ActorOwn<> get_full_config(DcId dc_id, IPAddress ip_address, Promise<FullConfig>
|
|||||||
private:
|
private:
|
||||||
ActorShared<> parent_;
|
ActorShared<> parent_;
|
||||||
IPAddress address_;
|
IPAddress address_;
|
||||||
|
mtproto::ProxySecret secret_;
|
||||||
size_t request_raw_connection_cnt_{0};
|
size_t request_raw_connection_cnt_{0};
|
||||||
std::vector<Promise<unique_ptr<mtproto::RawConnection>>> delay_forever_;
|
std::vector<Promise<unique_ptr<mtproto::RawConnection>>> delay_forever_;
|
||||||
};
|
};
|
||||||
@ -309,13 +310,14 @@ ActorOwn<> get_full_config(DcId dc_id, IPAddress ip_address, Promise<FullConfig>
|
|||||||
|
|
||||||
class GetConfigActor : public NetQueryCallback {
|
class GetConfigActor : public NetQueryCallback {
|
||||||
public:
|
public:
|
||||||
GetConfigActor(DcId dc_id, IPAddress ip_address, Promise<FullConfig> promise)
|
GetConfigActor(DcId dc_id, IPAddress ip_address, mtproto::ProxySecret secret, Promise<FullConfig> promise)
|
||||||
: dc_id_(dc_id), ip_address_(std::move(ip_address)), promise_(std::move(promise)) {
|
: dc_id_(dc_id), ip_address_(std::move(ip_address)), secret_(std::move(secret)), promise_(std::move(promise)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void start_up() override {
|
void start_up() override {
|
||||||
auto session_callback = make_unique<SessionCallback>(actor_shared(this, 1), std::move(ip_address_));
|
auto session_callback =
|
||||||
|
make_unique<SessionCallback>(actor_shared(this, 1), std::move(ip_address_), std::move(secret_));
|
||||||
|
|
||||||
auto auth_data = std::make_shared<SimpleAuthData>(dc_id_);
|
auto auth_data = std::make_shared<SimpleAuthData>(dc_id_);
|
||||||
int32 int_dc_id = dc_id_.get_raw_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<FullConfig>
|
|||||||
DcId dc_id_;
|
DcId dc_id_;
|
||||||
IPAddress ip_address_;
|
IPAddress ip_address_;
|
||||||
ActorOwn<Session> session_;
|
ActorOwn<Session> session_;
|
||||||
|
mtproto::ProxySecret secret_;
|
||||||
Promise<FullConfig> promise_;
|
Promise<FullConfig> promise_;
|
||||||
};
|
};
|
||||||
|
|
||||||
return ActorOwn<>(create_actor<GetConfigActor>("GetConfigActor", dc_id, std::move(ip_address), std::move(promise)));
|
return ActorOwn<>(create_actor<GetConfigActor>("GetConfigActor", dc_id, std::move(ip_address), std::move(secret),
|
||||||
|
std::move(promise)));
|
||||||
}
|
}
|
||||||
|
|
||||||
class ConfigRecoverer : public Actor {
|
class ConfigRecoverer : public Actor {
|
||||||
@ -611,6 +615,7 @@ class ConfigRecoverer : public Actor {
|
|||||||
VLOG(config_recoverer) << "ASK FULL CONFIG";
|
VLOG(config_recoverer) << "ASK FULL CONFIG";
|
||||||
full_config_query_ = get_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_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<FullConfig> r_full_config) {
|
PromiseCreator::lambda([actor_id = actor_shared(this)](Result<FullConfig> r_full_config) {
|
||||||
send_closure(actor_id, &ConfigRecoverer::on_full_config, std::move(r_full_config), false);
|
send_closure(actor_id, &ConfigRecoverer::on_full_config, std::move(r_full_config), false);
|
||||||
}));
|
}));
|
||||||
|
@ -718,19 +718,48 @@ void ConnectionCreator::request_raw_connection(DcId dc_id, bool allow_media_only
|
|||||||
client_loop(client);
|
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<unique_ptr<mtproto::RawConnection>> promise) {
|
Promise<unique_ptr<mtproto::RawConnection>> promise) {
|
||||||
auto r_socket_fd = SocketFd::open(ip_address);
|
auto r_socket_fd = SocketFd::open(ip_address);
|
||||||
if (r_socket_fd.is_error()) {
|
if (r_socket_fd.is_error()) {
|
||||||
return promise.set_error(r_socket_fd.move_as_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 socket_fd_promise =
|
||||||
auto raw_connection = make_unique<mtproto::RawConnection>(
|
PromiseCreator::lambda([promise = std::move(promise), actor_id = actor_id(this), transport_type,
|
||||||
r_socket_fd.move_as_ok(),
|
network_generation = network_generation_](Result<SocketFd> r_socket_fd) mutable {
|
||||||
mtproto::TransportType{mtproto::TransportType::ObfuscatedTcp, 0, mtproto::ProxySecret()}, nullptr);
|
if (r_socket_fd.is_error()) {
|
||||||
raw_connection->extra_ = network_generation_;
|
return promise.set_error(Status::Error(400, r_socket_fd.error().public_message()));
|
||||||
promise.set_value(std::move(raw_connection));
|
}
|
||||||
|
auto raw_connection = make_unique<mtproto::RawConnection>(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<SocketFd> promise) : promise_(std::move(promise)) {
|
||||||
|
}
|
||||||
|
void set_result(Result<SocketFd> result) override {
|
||||||
|
promise_.set_result(std::move(result));
|
||||||
|
}
|
||||||
|
void on_connected() override {
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Promise<SocketFd> promise_;
|
||||||
|
};
|
||||||
|
auto token = next_token();
|
||||||
|
auto callback = td::make_unique<Callback>(std::move(socket_fd_promise));
|
||||||
|
children_[token] = {false, create_actor<mtproto::TlsInit>(
|
||||||
|
"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<mtproto::TransportType> ConnectionCreator::get_transport_type(const ProxyInfo &proxy,
|
Result<mtproto::TransportType> ConnectionCreator::get_transport_type(const ProxyInfo &proxy,
|
||||||
|
@ -68,7 +68,8 @@ class ConnectionCreator : public NetQueryCallback {
|
|||||||
void request_raw_connection(DcId dc_id, bool allow_media_only, bool is_media,
|
void request_raw_connection(DcId dc_id, bool allow_media_only, bool is_media,
|
||||||
Promise<unique_ptr<mtproto::RawConnection>> promise, size_t hash = 0,
|
Promise<unique_ptr<mtproto::RawConnection>> promise, size_t hash = 0,
|
||||||
unique_ptr<mtproto::AuthData> auth_data = {});
|
unique_ptr<mtproto::AuthData> auth_data = {});
|
||||||
void request_raw_connection_by_ip(IPAddress ip_address, Promise<unique_ptr<mtproto::RawConnection>> promise);
|
void request_raw_connection_by_ip(IPAddress ip_address, mtproto::TransportType transport_type,
|
||||||
|
Promise<unique_ptr<mtproto::RawConnection>> promise);
|
||||||
|
|
||||||
void set_net_stats_callback(std::shared_ptr<NetStatsCallback> common_callback,
|
void set_net_stats_callback(std::shared_ptr<NetStatsCallback> common_callback,
|
||||||
std::shared_ptr<NetStatsCallback> media_callback);
|
std::shared_ptr<NetStatsCallback> media_callback);
|
||||||
|
Reference in New Issue
Block a user