Reset server time difference after a "MessageId is too high" error.
This commit is contained in:
parent
edf0aaaa2a
commit
c9f83caf9f
@ -203,7 +203,7 @@ class AuthData {
|
||||
// server_time_difference >= max{diff}
|
||||
bool update_server_time_difference(double diff);
|
||||
|
||||
void set_server_time_difference(double diff) {
|
||||
void reset_server_time_difference(double diff) {
|
||||
server_time_difference_was_updated_ = false;
|
||||
server_time_difference_ = diff;
|
||||
}
|
||||
|
@ -119,7 +119,7 @@ class PingConnectionPingPong final
|
||||
}
|
||||
void on_server_salt_updated() final {
|
||||
}
|
||||
void on_server_time_difference_updated() final {
|
||||
void on_server_time_difference_updated(bool force) final {
|
||||
}
|
||||
|
||||
void on_session_created(uint64 unique_id, uint64 first_id) final {
|
||||
|
@ -330,6 +330,8 @@ Status SessionConnection::on_packet(const MsgInfo &info,
|
||||
LOG(WARNING) << bad_info << ": MessageId is too high. Session will be closed";
|
||||
// All this queries will be re-sent by parent
|
||||
to_send_.clear();
|
||||
auth_data_->reset_server_time_difference(static_cast<uint32>(info.message_id >> 32) - Time::now());
|
||||
callback_->on_server_time_difference_updated(true);
|
||||
callback_->on_session_failed(Status::Error("MessageId is too high"));
|
||||
return Status::Error("MessageId is too high");
|
||||
}
|
||||
@ -692,7 +694,7 @@ Status SessionConnection::on_raw_packet(const PacketInfo &info, BufferSlice pack
|
||||
auto status =
|
||||
auth_data_->check_packet(info.session_id, info.message_id, Time::now_cached(), time_difference_was_updated);
|
||||
if (time_difference_was_updated) {
|
||||
callback_->on_server_time_difference_updated();
|
||||
callback_->on_server_time_difference_updated(false);
|
||||
}
|
||||
if (status.is_error()) {
|
||||
if (status.code() == 1) {
|
||||
|
@ -106,7 +106,7 @@ class SessionConnection final
|
||||
virtual void on_auth_key_updated() = 0;
|
||||
virtual void on_tmp_auth_key_updated() = 0;
|
||||
virtual void on_server_salt_updated() = 0;
|
||||
virtual void on_server_time_difference_updated() = 0;
|
||||
virtual void on_server_time_difference_updated(bool force) = 0;
|
||||
|
||||
virtual void on_session_created(uint64 unique_id, uint64 first_id) = 0;
|
||||
virtual void on_session_failed(Status status) = 0;
|
||||
|
@ -459,8 +459,8 @@ static ActorOwn<> get_full_config(DcOption option, Promise<tl_object_ptr<telegra
|
||||
|
||||
//notify();
|
||||
}
|
||||
void update_server_time_difference(double diff) final {
|
||||
G()->update_server_time_difference(diff);
|
||||
void update_server_time_difference(double diff, bool force) final {
|
||||
G()->update_server_time_difference(diff, force);
|
||||
}
|
||||
double get_server_time_difference() final {
|
||||
return G()->get_server_time_difference();
|
||||
|
@ -185,8 +185,8 @@ int32 Global::to_unix_time(double server_time) const {
|
||||
return static_cast<int32>(server_time);
|
||||
}
|
||||
|
||||
void Global::update_server_time_difference(double diff) {
|
||||
if (!server_time_difference_was_updated_ || server_time_difference_ < diff) {
|
||||
void Global::update_server_time_difference(double diff, bool force) {
|
||||
if (force || !server_time_difference_was_updated_ || server_time_difference_ < diff) {
|
||||
server_time_difference_ = diff;
|
||||
server_time_difference_was_updated_ = true;
|
||||
do_save_server_time_difference();
|
||||
|
@ -159,7 +159,7 @@ class Global final : public ActorContext {
|
||||
return to_unix_time(server_time_cached());
|
||||
}
|
||||
|
||||
void update_server_time_difference(double diff);
|
||||
void update_server_time_difference(double diff, bool force);
|
||||
|
||||
void save_server_time();
|
||||
|
||||
|
@ -51,8 +51,8 @@ class AuthDataSharedImpl final : public AuthDataShared {
|
||||
}
|
||||
|
||||
// TODO: extract it from G()
|
||||
void update_server_time_difference(double diff) final {
|
||||
G()->update_server_time_difference(diff);
|
||||
void update_server_time_difference(double diff, bool force) final {
|
||||
G()->update_server_time_difference(diff, force);
|
||||
}
|
||||
|
||||
double get_server_time_difference() final {
|
||||
|
@ -37,7 +37,7 @@ class AuthDataShared {
|
||||
virtual const std::shared_ptr<PublicRsaKeyShared> &public_rsa_key() = 0;
|
||||
virtual mtproto::AuthKey get_auth_key() = 0;
|
||||
virtual void set_auth_key(const mtproto::AuthKey &auth_key) = 0;
|
||||
virtual void update_server_time_difference(double diff) = 0;
|
||||
virtual void update_server_time_difference(double diff, bool force) = 0;
|
||||
virtual double get_server_time_difference() = 0;
|
||||
virtual void add_auth_key_listener(unique_ptr<Listener> listener) = 0;
|
||||
|
||||
|
@ -250,7 +250,7 @@ Session::Session(unique_ptr<Callback> callback, std::shared_ptr<AuthDataShared>
|
||||
auth_data_.set_use_pfs(use_pfs);
|
||||
auth_data_.set_main_auth_key(shared_auth_data_->get_auth_key());
|
||||
// auth_data_.break_main_auth_key();
|
||||
auth_data_.set_server_time_difference(shared_auth_data_->get_server_time_difference());
|
||||
auth_data_.reset_server_time_difference(shared_auth_data_->get_server_time_difference());
|
||||
auto now = Time::now();
|
||||
auth_data_.set_future_salts(shared_auth_data_->get_future_salts(), now);
|
||||
if (use_pfs && !tmp_auth_key.empty()) {
|
||||
@ -612,8 +612,8 @@ void Session::on_server_salt_updated() {
|
||||
shared_auth_data_->set_future_salts(auth_data_.get_future_salts());
|
||||
}
|
||||
|
||||
void Session::on_server_time_difference_updated() {
|
||||
shared_auth_data_->update_server_time_difference(auth_data_.get_server_time_difference());
|
||||
void Session::on_server_time_difference_updated(bool force) {
|
||||
shared_auth_data_->update_server_time_difference(auth_data_.get_server_time_difference(), force);
|
||||
}
|
||||
|
||||
void Session::on_closed(Status status) {
|
||||
@ -1434,7 +1434,7 @@ void Session::on_handshake_ready(Result<unique_ptr<mtproto::AuthKeyHandshake>> r
|
||||
on_server_salt_updated();
|
||||
}
|
||||
if (auth_data_.update_server_time_difference(handshake->get_server_time_diff())) {
|
||||
on_server_time_difference_updated();
|
||||
on_server_time_difference_updated(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -207,7 +207,7 @@ class Session final
|
||||
void on_auth_key_updated() final;
|
||||
void on_tmp_auth_key_updated() final;
|
||||
void on_server_salt_updated() final;
|
||||
void on_server_time_difference_updated() final;
|
||||
void on_server_time_difference_updated(bool force) final;
|
||||
|
||||
void on_session_created(uint64 unique_id, uint64 first_message_id) final;
|
||||
void on_session_failed(Status status) final;
|
||||
|
@ -604,7 +604,7 @@ class FastPingTestActor final : public td::Actor {
|
||||
if (iteration_ % 2 == 0) {
|
||||
auth_data = td::make_unique<td::mtproto::AuthData>();
|
||||
auth_data->set_tmp_auth_key(handshake_->get_auth_key());
|
||||
auth_data->set_server_time_difference(handshake_->get_server_time_diff());
|
||||
auth_data->reset_server_time_difference(handshake_->get_server_time_diff());
|
||||
auth_data->set_server_salt(handshake_->get_server_salt(), td::Time::now());
|
||||
auth_data->set_future_salts({td::mtproto::ServerSalt{0u, 1e20, 1e30}}, td::Time::now());
|
||||
auth_data->set_use_pfs(true);
|
||||
|
Loading…
Reference in New Issue
Block a user