ConnectionCreator: use tls init

GitOrigin-RevId: f58530975f30e5341e250478c3f83cabf8947b71
This commit is contained in:
Arseny Smirnov 2019-06-26 17:27:19 +02:00
parent 795bf65f8d
commit 9289b61b92
4 changed files with 18 additions and 8 deletions

View File

@ -15,7 +15,7 @@ namespace mtproto {
unique_ptr<IStreamTransport> create_transport(TransportType type) { unique_ptr<IStreamTransport> create_transport(TransportType type) {
switch (type.type) { switch (type.type) {
case TransportType::ObfuscatedTcp: case TransportType::ObfuscatedTcp:
return td::make_unique<tcp::ObfuscatedTransport>(type.dc_id, std::move(type.secret), type.emulate_tls); return td::make_unique<tcp::ObfuscatedTransport>(type.dc_id, std::move(type.secret));
case TransportType::Tcp: case TransportType::Tcp:
return td::make_unique<tcp::OldTransport>(); return td::make_unique<tcp::OldTransport>();
case TransportType::Http: case TransportType::Http:

View File

@ -123,8 +123,9 @@ class OldTransport : public IStreamTransport {
class ObfuscatedTransport : public IStreamTransport { class ObfuscatedTransport : public IStreamTransport {
public: public:
ObfuscatedTransport(int16 dc_id, std::string secret, bool emulate_tls) ObfuscatedTransport(int16 dc_id, std::string secret)
: dc_id_(dc_id), secret_(std::move(secret)), emulate_tls_(emulate_tls), impl_(secret_.size() >= 17) { : dc_id_(dc_id), secret_(std::move(secret)), impl_(secret_.size() >= 17) {
emulate_tls_ = secret.size() >= 17 && secret[0] == '\0xee';
} }
Result<size_t> read_next(BufferSlice *message, uint32 *quick_ack) override TD_WARN_UNUSED_RESULT; Result<size_t> read_next(BufferSlice *message, uint32 *quick_ack) override TD_WARN_UNUSED_RESULT;

View File

@ -15,11 +15,13 @@ struct TransportType {
enum Type { Tcp, ObfuscatedTcp, Http } type = Tcp; enum Type { Tcp, ObfuscatedTcp, Http } type = Tcp;
int16 dc_id{0}; int16 dc_id{0};
string secret; string secret;
bool emulate_tls{false};
TransportType() = default; TransportType() = default;
TransportType(Type type, int16 dc_id, string secret, bool emulate_tls = false) TransportType(Type type, int16 dc_id, string secret) : type(type), dc_id(dc_id), secret(std::move(secret)) {
: type(type), dc_id(dc_id), secret(std::move(secret)), emulate_tls(emulate_tls) { }
bool emulate_tls() const {
return secret.size() >= 17 && secret[0] == '\0xee';
} }
}; };

View File

@ -21,6 +21,7 @@
#include "td/mtproto/Ping.h" #include "td/mtproto/Ping.h"
#include "td/mtproto/RawConnection.h" #include "td/mtproto/RawConnection.h"
#include "td/mtproto/TlsInit.h"
#include "td/net/GetHostByNameActor.h" #include "td/net/GetHostByNameActor.h"
#include "td/net/HttpProxy.h" #include "td/net/HttpProxy.h"
@ -961,6 +962,8 @@ void ConnectionCreator::client_loop(ClientInfo &client) {
client.checking_connections++; client.checking_connections++;
} }
bool emulate_tls = extra.transport_type.emulate_tls();
auto promise = PromiseCreator::lambda( auto promise = PromiseCreator::lambda(
[actor_id = actor_id(this), check_mode, transport_type = extra.transport_type, hash = client.hash, [actor_id = actor_id(this), check_mode, transport_type = extra.transport_type, hash = client.hash,
debug_str = extra.debug_str, debug_str = extra.debug_str,
@ -973,7 +976,7 @@ void ConnectionCreator::client_loop(ClientInfo &client) {
td::make_unique<detail::StatsCallback>(client.is_media ? media_net_stats_callback_ : common_net_stats_callback_, td::make_unique<detail::StatsCallback>(client.is_media ? media_net_stats_callback_ : common_net_stats_callback_,
actor_id(this), client.hash, extra.stat); actor_id(this), client.hash, extra.stat);
if (proxy.use_socks5_proxy() || proxy.use_http_tcp_proxy()) { if (proxy.use_socks5_proxy() || proxy.use_http_tcp_proxy() || emulate_tls) {
VLOG(connections) << "In client_loop: create new transparent proxy connection " << extra.debug_str; VLOG(connections) << "In client_loop: create new transparent proxy connection " << extra.debug_str;
class Callback : public TransparentProxy::Callback { class Callback : public TransparentProxy::Callback {
public: public:
@ -1013,10 +1016,14 @@ void ConnectionCreator::client_loop(ClientInfo &client) {
children_[token] = { children_[token] = {
true, create_actor<Socks5>("Socks5", std::move(socket_fd), extra.mtproto_ip, proxy.proxy().user().str(), true, create_actor<Socks5>("Socks5", std::move(socket_fd), extra.mtproto_ip, proxy.proxy().user().str(),
proxy.proxy().password().str(), std::move(callback), create_reference(token))}; proxy.proxy().password().str(), std::move(callback), create_reference(token))};
} else { } else if (proxy.use_http_tcp_proxy()) {
children_[token] = {true, create_actor<HttpProxy>("HttpProxy", std::move(socket_fd), extra.mtproto_ip, children_[token] = {true, create_actor<HttpProxy>("HttpProxy", std::move(socket_fd), extra.mtproto_ip,
proxy.proxy().user().str(), proxy.proxy().password().str(), proxy.proxy().user().str(), proxy.proxy().password().str(),
std::move(callback), create_reference(token))}; std::move(callback), create_reference(token))};
} else {
children_[token] = {true, create_actor<TlsInit>("HttpProxy", std::move(socket_fd), extra.mtproto_ip,
"www.google.com" /*todo use domain*/, "", std::move(callback),
create_reference(token))};
} }
} else { } else {
VLOG(connections) << "In client_loop: create new direct connection " << extra.debug_str; VLOG(connections) << "In client_loop: create new direct connection " << extra.debug_str;