Delete expired unconfirmed sessions.

This commit is contained in:
levlam 2023-09-12 15:44:57 +03:00
parent 7f2d1cdd9d
commit 64d66fb3dc
3 changed files with 49 additions and 7 deletions

View File

@ -718,6 +718,11 @@ class AccountManager::UnconfirmedAuthorizations {
return true;
}
int32 get_next_authorization_expire_date() const {
CHECK(!authorizations_.empty());
return authorizations_[0].get_date() + get_authorization_autoconfirm_period();
}
td_api::object_ptr<td_api::unconfirmedSession> get_first_unconfirmed_session_object() const {
CHECK(!authorizations_.empty());
return authorizations_[0].get_unconfirmed_session_object();
@ -746,18 +751,20 @@ void AccountManager::start_up() {
if (!unconfirmed_authorizations_log_event_string.empty()) {
log_event_parse(unconfirmed_authorizations_, unconfirmed_authorizations_log_event_string).ensure();
CHECK(unconfirmed_authorizations_ != nullptr);
if (unconfirmed_authorizations_->delete_expired_authorizations()) {
if (delete_expired_unconfirmed_authorizations()) {
save_unconfirmed_authorizations();
if (unconfirmed_authorizations_->is_empty()) {
unconfirmed_authorizations_ = nullptr;
}
}
if (unconfirmed_authorizations_ != nullptr) {
update_unconfirmed_authorization_timeout(false);
send_update_unconfirmed_session();
}
}
}
void AccountManager::timeout_expired() {
update_unconfirmed_authorization_timeout(true);
}
void AccountManager::tear_down() {
parent_.reset();
}
@ -803,8 +810,9 @@ void AccountManager::terminate_session(int64 session_id, Promise<Unit> &&promise
void AccountManager::terminate_all_other_sessions(Promise<Unit> &&promise) {
if (unconfirmed_authorizations_ != nullptr) {
unconfirmed_authorizations_ = nullptr;
save_unconfirmed_authorizations();
update_unconfirmed_authorization_timeout(false);
send_update_unconfirmed_session();
save_unconfirmed_authorizations();
}
td_->create_handler<ResetAuthorizationsQuery>(std::move(promise))->send();
}
@ -890,10 +898,11 @@ void AccountManager::on_new_unconfirmed_authorization(int64 hash, int32 date, st
if (unconfirmed_authorizations_->add_authorization({hash, date, std::move(device), std::move(location)},
is_first_changed)) {
CHECK(!unconfirmed_authorizations_->is_empty());
save_unconfirmed_authorizations();
if (is_first_changed) {
update_unconfirmed_authorization_timeout(false);
send_update_unconfirmed_session();
}
save_unconfirmed_authorizations();
}
}
@ -904,10 +913,11 @@ bool AccountManager::on_confirm_authorization(int64 hash) {
if (unconfirmed_authorizations_->is_empty()) {
unconfirmed_authorizations_ = nullptr;
}
save_unconfirmed_authorizations();
if (is_first_changed) {
update_unconfirmed_authorization_timeout(false);
send_update_unconfirmed_session();
}
save_unconfirmed_authorizations();
return true;
}
return false;
@ -926,6 +936,28 @@ void AccountManager::save_unconfirmed_authorizations() const {
}
}
bool AccountManager::delete_expired_unconfirmed_authorizations() {
if (unconfirmed_authorizations_ != nullptr && unconfirmed_authorizations_->delete_expired_authorizations()) {
if (unconfirmed_authorizations_->is_empty()) {
unconfirmed_authorizations_ = nullptr;
}
return true;
}
return false;
}
void AccountManager::update_unconfirmed_authorization_timeout(bool is_external) {
if (delete_expired_unconfirmed_authorizations() && is_external) {
send_update_unconfirmed_session();
save_unconfirmed_authorizations();
}
if (unconfirmed_authorizations_ == nullptr) {
cancel_timeout();
} else {
set_timeout_in(unconfirmed_authorizations_->get_next_authorization_expire_date() - G()->unix_time() + 1);
}
}
td_api::object_ptr<td_api::updateUnconfirmedSession> AccountManager::get_update_unconfirmed_session() const {
if (unconfirmed_authorizations_ == nullptr) {
return td_api::object_ptr<td_api::updateUnconfirmedSession>(nullptr);

View File

@ -62,6 +62,8 @@ class AccountManager final : public Actor {
void invalidate_authentication_codes(vector<string> &&authentication_codes);
void update_unconfirmed_authorization_timeout(bool is_external);
void on_new_unconfirmed_authorization(int64 hash, int32 date, string &&device, string &&location);
bool on_confirm_authorization(int64 hash);
@ -74,6 +76,8 @@ class AccountManager final : public Actor {
void start_up() final;
void timeout_expired() final;
void tear_down() final;
void get_user_link_impl(Promise<td_api::object_ptr<td_api::userLink>> &&promise);
@ -82,6 +86,8 @@ class AccountManager final : public Actor {
void save_unconfirmed_authorizations() const;
bool delete_expired_unconfirmed_authorizations();
td_api::object_ptr<td_api::updateUnconfirmedSession> get_update_unconfirmed_session() const;
void send_update_unconfirmed_session() const;

View File

@ -6,6 +6,7 @@
//
#include "td/telegram/OptionManager.h"
#include "td/telegram/AccountManager.h"
#include "td/telegram/AnimationsManager.h"
#include "td/telegram/AttachMenuManager.h"
#include "td/telegram/AuthManager.h"
@ -361,6 +362,9 @@ void OptionManager::on_option_updated(Slice name) {
if (name == "animation_search_provider") {
td_->animations_manager_->on_update_animation_search_provider();
}
if (name == "authorization_autoconfirm_period") {
td_->account_manager_->update_unconfirmed_authorization_timeout(true);
}
break;
case 'b':
if (name == "base_language_pack_version") {