Session: cache salt for temp keys, better on_mtproto_header
GitOrigin-RevId: 02ba02aaf86e36402536d98d7bb80fd198c68378
This commit is contained in:
parent
162e185565
commit
3c1698dddf
|
@ -295,7 +295,8 @@ ActorOwn<> get_full_config(DcId dc_id, IPAddress ip_address, Promise<FullConfig>
|
||||||
int_dc_id += 10000;
|
int_dc_id += 10000;
|
||||||
}
|
}
|
||||||
session_ = create_actor<Session>("ConfigSession", std::move(session_callback), std::move(auth_data), int_dc_id,
|
session_ = create_actor<Session>("ConfigSession", std::move(session_callback), std::move(auth_data), int_dc_id,
|
||||||
false /*is_main*/, true /*use_pfs*/, false /*is_cdn*/, mtproto::AuthKey());
|
false /*is_main*/, true /*use_pfs*/, false /*is_cdn*/, mtproto::AuthKey(),
|
||||||
|
std::vector<mtproto::ServerSalt>());
|
||||||
auto query = G()->net_query_creator().create(create_storer(telegram_api::help_getConfig()), DcId::empty(),
|
auto query = G()->net_query_creator().create(create_storer(telegram_api::help_getConfig()), DcId::empty(),
|
||||||
NetQuery::Type::Common, NetQuery::AuthFlag::Off,
|
NetQuery::Type::Common, NetQuery::AuthFlag::Off,
|
||||||
NetQuery::GzipFlag::On, 60 * 60 * 24);
|
NetQuery::GzipFlag::On, 60 * 60 * 24);
|
||||||
|
|
|
@ -107,7 +107,8 @@ class GenAuthKeyActor : public Actor {
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
Session::Session(unique_ptr<Callback> callback, std::shared_ptr<AuthDataShared> shared_auth_data, int32 dc_id,
|
Session::Session(unique_ptr<Callback> callback, std::shared_ptr<AuthDataShared> shared_auth_data, int32 dc_id,
|
||||||
bool is_main, bool use_pfs, bool is_cdn, const mtproto::AuthKey &tmp_auth_key)
|
bool is_main, bool use_pfs, bool is_cdn, const mtproto::AuthKey &tmp_auth_key,
|
||||||
|
std::vector<mtproto::ServerSalt> server_salts)
|
||||||
: dc_id_(dc_id), is_main_(is_main), is_cdn_(is_cdn) {
|
: dc_id_(dc_id), is_main_(is_main), is_cdn_(is_cdn) {
|
||||||
VLOG(dc) << "Start connection";
|
VLOG(dc) << "Start connection";
|
||||||
|
|
||||||
|
@ -118,6 +119,7 @@ Session::Session(unique_ptr<Callback> callback, std::shared_ptr<AuthDataShared>
|
||||||
auth_data_.set_future_salts(shared_auth_data_->get_future_salts(), Time::now());
|
auth_data_.set_future_salts(shared_auth_data_->get_future_salts(), Time::now());
|
||||||
if (use_pfs && !tmp_auth_key.empty()) {
|
if (use_pfs && !tmp_auth_key.empty()) {
|
||||||
auth_data_.set_tmp_auth_key(tmp_auth_key);
|
auth_data_.set_tmp_auth_key(tmp_auth_key);
|
||||||
|
auth_data_.set_future_salts(std::move(server_salts), Time::now());
|
||||||
}
|
}
|
||||||
uint64 session_id = 0;
|
uint64 session_id = 0;
|
||||||
Random::secure_bytes(reinterpret_cast<uint8 *>(&session_id), sizeof(session_id));
|
Random::secure_bytes(reinterpret_cast<uint8 *>(&session_id), sizeof(session_id));
|
||||||
|
@ -376,6 +378,7 @@ void Session::on_tmp_auth_key_updated() {
|
||||||
|
|
||||||
void Session::on_server_salt_updated() {
|
void Session::on_server_salt_updated() {
|
||||||
if (auth_data_.use_pfs()) {
|
if (auth_data_.use_pfs()) {
|
||||||
|
callback_->on_server_salt_updated(auth_data_.get_future_salts());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
shared_auth_data_->set_future_salts(auth_data_.get_future_salts());
|
shared_auth_data_->set_future_salts(auth_data_.get_future_salts());
|
||||||
|
|
|
@ -56,11 +56,14 @@ class Session final
|
||||||
virtual void on_closed() = 0;
|
virtual void on_closed() = 0;
|
||||||
virtual void request_raw_connection(Promise<std::unique_ptr<mtproto::RawConnection>>) = 0;
|
virtual void request_raw_connection(Promise<std::unique_ptr<mtproto::RawConnection>>) = 0;
|
||||||
virtual void on_tmp_auth_key_updated(mtproto::AuthKey auth_key) = 0;
|
virtual void on_tmp_auth_key_updated(mtproto::AuthKey auth_key) = 0;
|
||||||
|
virtual void on_server_salt_updated(std::vector<mtproto::ServerSalt> server_salts) {
|
||||||
|
}
|
||||||
// one still have to call close after on_closed
|
// one still have to call close after on_closed
|
||||||
};
|
};
|
||||||
|
|
||||||
Session(unique_ptr<Callback> callback, std::shared_ptr<AuthDataShared> shared_auth_data, int32 dc_id, bool is_main,
|
Session(unique_ptr<Callback> callback, std::shared_ptr<AuthDataShared> shared_auth_data, int32 dc_id, bool is_main,
|
||||||
bool use_pfs, bool is_cdn, const mtproto::AuthKey &tmp_auth_key);
|
bool use_pfs, bool is_cdn, const mtproto::AuthKey &tmp_auth_key,
|
||||||
|
std::vector<mtproto::ServerSalt> server_salts);
|
||||||
void send(NetQueryPtr &&query);
|
void send(NetQueryPtr &&query);
|
||||||
void on_network(bool network_flag, uint32 network_generation);
|
void on_network(bool network_flag, uint32 network_generation);
|
||||||
void on_online(bool online_flag);
|
void on_online(bool online_flag);
|
||||||
|
|
|
@ -88,7 +88,9 @@ void SessionMultiProxy::update_options(int32 session_count, bool use_pfs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void SessionMultiProxy::update_mtproto_header() {
|
void SessionMultiProxy::update_mtproto_header() {
|
||||||
init();
|
for (auto &session : sessions_) {
|
||||||
|
send_closure_later(session, &SessionProxy::update_mtproto_header);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SessionMultiProxy::start_up() {
|
void SessionMultiProxy::start_up() {
|
||||||
|
|
|
@ -47,6 +47,10 @@ class SessionCallback : public Session::Callback {
|
||||||
send_closure(parent_, &SessionProxy::on_tmp_auth_key_updated, std::move(auth_key));
|
send_closure(parent_, &SessionProxy::on_tmp_auth_key_updated, std::move(auth_key));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void on_server_salt_updated(std::vector<mtproto::ServerSalt> server_salts) override {
|
||||||
|
send_closure(parent_, &SessionProxy::on_server_salt_updated, std::move(server_salts));
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ActorShared<SessionProxy> parent_;
|
ActorShared<SessionProxy> parent_;
|
||||||
DcId dc_id_;
|
DcId dc_id_;
|
||||||
|
@ -128,6 +132,11 @@ void SessionProxy::on_failed() {
|
||||||
open_session();
|
open_session();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SessionProxy::update_mtproto_header() {
|
||||||
|
close_session();
|
||||||
|
open_session();
|
||||||
|
}
|
||||||
|
|
||||||
void SessionProxy::on_closed() {
|
void SessionProxy::on_closed() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,7 +163,7 @@ void SessionProxy::open_session(bool force) {
|
||||||
session_ = create_actor<Session>(
|
session_ = create_actor<Session>(
|
||||||
name,
|
name,
|
||||||
make_unique<SessionCallback>(actor_shared(this, session_generation_), dc_id, allow_media_only_, is_media_, hash),
|
make_unique<SessionCallback>(actor_shared(this, session_generation_), dc_id, allow_media_only_, is_media_, hash),
|
||||||
auth_data_, int_dc_id, is_main_, use_pfs_, is_cdn_, tmp_auth_key_);
|
auth_data_, int_dc_id, is_main_, use_pfs_, is_cdn_, tmp_auth_key_, server_salts_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SessionProxy::update_auth_state() {
|
void SessionProxy::update_auth_state() {
|
||||||
|
@ -187,5 +196,8 @@ void SessionProxy::on_tmp_auth_key_updated(mtproto::AuthKey auth_key) {
|
||||||
LOG(WARNING) << "tmp_auth_key " << auth_key.id() << ": " << state;
|
LOG(WARNING) << "tmp_auth_key " << auth_key.id() << ": " << state;
|
||||||
tmp_auth_key_ = std::move(auth_key);
|
tmp_auth_key_ = std::move(auth_key);
|
||||||
}
|
}
|
||||||
|
void SessionProxy::on_server_salt_updated(std::vector<mtproto::ServerSalt> server_salts) {
|
||||||
|
server_salts_ = std::move(server_salts);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
|
|
@ -25,6 +25,7 @@ class SessionProxy : public Actor {
|
||||||
|
|
||||||
void send(NetQueryPtr query);
|
void send(NetQueryPtr query);
|
||||||
void update_main_flag(bool is_main);
|
void update_main_flag(bool is_main);
|
||||||
|
void update_mtproto_header();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<AuthDataShared> auth_data_;
|
std::shared_ptr<AuthDataShared> auth_data_;
|
||||||
|
@ -34,6 +35,7 @@ class SessionProxy : public Actor {
|
||||||
bool is_media_;
|
bool is_media_;
|
||||||
bool use_pfs_;
|
bool use_pfs_;
|
||||||
mtproto::AuthKey tmp_auth_key_;
|
mtproto::AuthKey tmp_auth_key_;
|
||||||
|
std::vector<mtproto::ServerSalt> server_salts_;
|
||||||
bool need_wait_for_key_;
|
bool need_wait_for_key_;
|
||||||
bool is_cdn_;
|
bool is_cdn_;
|
||||||
ActorOwn<Session> session_;
|
ActorOwn<Session> session_;
|
||||||
|
@ -47,6 +49,7 @@ class SessionProxy : public Actor {
|
||||||
|
|
||||||
void update_auth_state();
|
void update_auth_state();
|
||||||
void on_tmp_auth_key_updated(mtproto::AuthKey auth_key);
|
void on_tmp_auth_key_updated(mtproto::AuthKey auth_key);
|
||||||
|
void on_server_salt_updated(std::vector<mtproto::ServerSalt> server_salts);
|
||||||
|
|
||||||
void start_up() override;
|
void start_up() override;
|
||||||
void tear_down() override;
|
void tear_down() override;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user