diff --git a/td/telegram/JsonValue.cpp b/td/telegram/JsonValue.cpp index d0c94f44d..dfd828058 100644 --- a/td/telegram/JsonValue.cpp +++ b/td/telegram/JsonValue.cpp @@ -51,6 +51,11 @@ Result> get_json_value(MutableSlice json) return get_json_value_object(json_value); } +Result> get_input_json_value(MutableSlice json) { + TRY_RESULT(json_value, get_json_value(json)); + return convert_json_value(std::move(json_value)); +} + static td_api::object_ptr convert_json_value_member_object( const telegram_api::object_ptr &json_object_value) { CHECK(json_object_value != nullptr); diff --git a/td/telegram/JsonValue.h b/td/telegram/JsonValue.h index 725bf7b4b..3ed0459bb 100644 --- a/td/telegram/JsonValue.h +++ b/td/telegram/JsonValue.h @@ -17,6 +17,8 @@ namespace td { Result> get_json_value(MutableSlice json); +Result> get_input_json_value(MutableSlice json); + td_api::object_ptr convert_json_value_object( const tl_object_ptr &json_value); diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index e9422bf6c..822d8a3a9 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -3666,6 +3666,10 @@ void Td::on_config_option_updated(const string &name) { } else if (name == "disable_top_chats") { send_closure(top_dialog_manager_, &TopDialogManager::update_is_enabled, !G()->shared_config().get_option_boolean(name)); + } else if (name == "connection_parameters") { + if (G()->mtproto_header().set_parameters(G()->shared_config().get_option_string(name))) { + G()->net_query_dispatcher().update_mtproto_header(); + } } else if (name == "is_emulator") { if (G()->mtproto_header().set_is_emulator(G()->shared_config().get_option_boolean(name))) { G()->net_query_dispatcher().update_mtproto_header(); @@ -4126,6 +4130,7 @@ Status Td::init(DbKey key) { options_.language_pack = G()->shared_config().get_option_string("localization_target"); options_.language_code = G()->shared_config().get_option_string("language_pack_id"); + options_.parameters = G()->shared_config().get_option_string("connection_parameters"); options_.is_emulator = G()->shared_config().get_option_boolean("is_emulator"); // options_.proxy = Proxy(); G()->set_mtproto_header(make_unique(options_)); @@ -4694,6 +4699,7 @@ Status Td::set_parameters(td_api::object_ptr parameters } options_.language_pack = ""; options_.language_code = ""; + options_.parameters = ""; options_.is_emulator = false; options_.proxy = Proxy(); @@ -6679,6 +6685,17 @@ void Td::on_request(uint64 id, td_api::setOption &request) { bool is_bot = auth_manager_ != nullptr && auth_manager_->is_authorized() && auth_manager_->is_bot(); switch (request.name_[0]) { + case 'c': + if (!is_bot && set_string_option("connection_parameters", [](Slice value) { + string value_copy = value.str(); + auto r_json_value = get_json_value(value_copy); + if (r_json_value.is_error()) { + return false; + } + return r_json_value.ok()->get_id() == td_api::jsonValueObject::ID; + })) { + return; + } case 'd': if (!is_bot && set_boolean_option("disable_contact_registered_notifications")) { return; diff --git a/td/telegram/net/MtprotoHeader.cpp b/td/telegram/net/MtprotoHeader.cpp index af6399647..6cd807d2a 100644 --- a/td/telegram/net/MtprotoHeader.cpp +++ b/td/telegram/net/MtprotoHeader.cpp @@ -7,6 +7,9 @@ #include "td/telegram/net/MtprotoHeader.h" #include "td/telegram/LanguagePackManager.h" +#include "td/telegram/JsonValue.h" + +#include "td/tl/tl_object_store.h" #include "td/utils/tl_helpers.h" @@ -35,6 +38,9 @@ class HeaderStorer { if (have_proxy) { flags |= 1 << 0; } + if (!options.parameters.empty()) { + flags |= 1 << 1; + } if (options.is_emulator) { flags |= 1 << 10; } @@ -67,6 +73,12 @@ class HeaderStorer { store(Slice(options.proxy.server()), storer); store(options.proxy.port(), storer); } + if (!options.parameters.empty()) { + auto parameters_copy = options.parameters; + auto json_value = get_input_json_value(parameters_copy).move_as_ok(); + CHECK(json_value != nullptr); + TlStoreBoxedUnknown::store(json_value, storer); + } } private: diff --git a/td/telegram/net/MtprotoHeader.h b/td/telegram/net/MtprotoHeader.h index 53fbcfdd4..3512c39a6 100644 --- a/td/telegram/net/MtprotoHeader.h +++ b/td/telegram/net/MtprotoHeader.h @@ -23,6 +23,7 @@ class MtprotoHeader { string application_version; string language_pack; string language_code; + string parameters; bool is_emulator = false; Proxy proxy; }; @@ -36,6 +37,16 @@ class MtprotoHeader { default_header_ = gen_header(options_, false); } + bool set_parameters(string parameters) { + if (options_.parameters == parameters) { + return false; + } + + options_.parameters = parameters; + default_header_ = gen_header(options_, false); + return true; + } + bool set_is_emulator(bool is_emulator) { if (options_.is_emulator == is_emulator) { return false;