SecureManager: handle SECURE_SECRET_REQUEIRED error
GitOrigin-RevId: a8634cb072c058d619ac0ad4a78f29dcfcfabda8
This commit is contained in:
parent
b929fbf673
commit
fcfb0f97d1
@ -83,6 +83,7 @@ class PasswordManager : public NetQueryCallback {
|
|||||||
void get_temp_password_state(Promise<TempState> promise) /*const*/;
|
void get_temp_password_state(Promise<TempState> promise) /*const*/;
|
||||||
void create_temp_password(string password, int32 timeout, Promise<TempState> promise);
|
void create_temp_password(string password, int32 timeout, Promise<TempState> promise);
|
||||||
void drop_temp_password();
|
void drop_temp_password();
|
||||||
|
void drop_cached_secret();
|
||||||
|
|
||||||
static TempPasswordState get_temp_password_state_sync();
|
static TempPasswordState get_temp_password_state_sync();
|
||||||
|
|
||||||
@ -178,7 +179,6 @@ class PasswordManager : public NetQueryCallback {
|
|||||||
void do_get_secure_secret(bool allow_recursive, string password, Promise<secure_storage::Secret> promise);
|
void do_get_secure_secret(bool allow_recursive, string password, Promise<secure_storage::Secret> promise);
|
||||||
void do_get_full_state(string password, PasswordState state, Promise<PasswordFullState> promise);
|
void do_get_full_state(string password, PasswordState state, Promise<PasswordFullState> promise);
|
||||||
void cache_secret(secure_storage::Secret secret);
|
void cache_secret(secure_storage::Secret secret);
|
||||||
void drop_cached_secret();
|
|
||||||
|
|
||||||
void do_create_temp_password(string password, int32 timeout, PasswordState &&password_state,
|
void do_create_temp_password(string password, int32 timeout, PasswordState &&password_state,
|
||||||
Promise<TempPasswordState> promise);
|
Promise<TempPasswordState> promise);
|
||||||
|
@ -119,6 +119,7 @@ class SetSecureValue : public NetQueryCallback {
|
|||||||
void loop() override;
|
void loop() override;
|
||||||
void on_result(NetQueryPtr query) override;
|
void on_result(NetQueryPtr query) override;
|
||||||
|
|
||||||
|
void load_secret();
|
||||||
void cancel_upload();
|
void cancel_upload();
|
||||||
void start_upload_all();
|
void start_upload_all();
|
||||||
void start_upload(FileManager *file_manager, FileId &file_id, SecureInputFile &info);
|
void start_upload(FileManager *file_manager, FileId &file_id, SecureInputFile &info);
|
||||||
@ -164,6 +165,9 @@ GetSecureValue::GetSecureValue(ActorShared<SecureManager> parent, std::string pa
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GetSecureValue::on_error(Status error) {
|
void GetSecureValue::on_error(Status error) {
|
||||||
|
if (error.message() == "SECURE_SECRET_REQUIRED") {
|
||||||
|
send_closure(G()->password_manager(), &PasswordManager::drop_cached_secret);
|
||||||
|
}
|
||||||
if (error.code() > 0) {
|
if (error.code() > 0) {
|
||||||
promise_.set_error(std::move(error));
|
promise_.set_error(std::move(error));
|
||||||
} else {
|
} else {
|
||||||
@ -240,6 +244,9 @@ GetAllSecureValues::GetAllSecureValues(ActorShared<SecureManager> parent, std::s
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GetAllSecureValues::on_error(Status error) {
|
void GetAllSecureValues::on_error(Status error) {
|
||||||
|
if (error.message() == "SECURE_SECRET_REQUIRED") {
|
||||||
|
send_closure(G()->password_manager(), &PasswordManager::drop_cached_secret);
|
||||||
|
}
|
||||||
if (error.code() > 0) {
|
if (error.code() > 0) {
|
||||||
promise_.set_error(std::move(error));
|
promise_.set_error(std::move(error));
|
||||||
} else {
|
} else {
|
||||||
@ -396,10 +403,7 @@ void SetSecureValue::on_secret(Result<secure_storage::Secret> r_secret, bool x)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SetSecureValue::start_up() {
|
void SetSecureValue::start_up() {
|
||||||
send_closure(G()->password_manager(), &PasswordManager::get_secure_secret, password_,
|
load_secret();
|
||||||
PromiseCreator::lambda([actor_id = actor_id(this)](Result<secure_storage::Secret> r_secret) {
|
|
||||||
send_closure(actor_id, &SetSecureValue::on_secret, std::move(r_secret), true);
|
|
||||||
}));
|
|
||||||
auto *file_manager = G()->td().get_actor_unsafe()->file_manager_.get();
|
auto *file_manager = G()->td().get_actor_unsafe()->file_manager_.get();
|
||||||
|
|
||||||
// Remove duplicate files
|
// Remove duplicate files
|
||||||
@ -475,6 +479,13 @@ void SetSecureValue::start_up() {
|
|||||||
start_upload_all();
|
start_upload_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetSecureValue::load_secret() {
|
||||||
|
secret_ = {};
|
||||||
|
send_closure(G()->password_manager(), &PasswordManager::get_secure_secret, password_,
|
||||||
|
PromiseCreator::lambda([actor_id = actor_id(this)](Result<secure_storage::Secret> r_secret) {
|
||||||
|
send_closure(actor_id, &SetSecureValue::on_secret, std::move(r_secret), true);
|
||||||
|
}));
|
||||||
|
}
|
||||||
void SetSecureValue::cancel_upload() {
|
void SetSecureValue::cancel_upload() {
|
||||||
upload_generation_++;
|
upload_generation_++;
|
||||||
auto *file_manager = G()->td().get_actor_unsafe()->file_manager_.get();
|
auto *file_manager = G()->td().get_actor_unsafe()->file_manager_.get();
|
||||||
@ -524,7 +535,6 @@ void SetSecureValue::start_upload_all() {
|
|||||||
if (selfie_) {
|
if (selfie_) {
|
||||||
start_upload(file_manager, secure_value_.selfie.file_id, selfie_.value());
|
start_upload(file_manager, secure_value_.selfie.file_id, selfie_.value());
|
||||||
}
|
}
|
||||||
loop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetSecureValue::start_upload(FileManager *file_manager, FileId &file_id, SecureInputFile &info) {
|
void SetSecureValue::start_upload(FileManager *file_manager, FileId &file_id, SecureInputFile &info) {
|
||||||
@ -580,9 +590,16 @@ void SetSecureValue::tear_down() {
|
|||||||
void SetSecureValue::on_result(NetQueryPtr query) {
|
void SetSecureValue::on_result(NetQueryPtr query) {
|
||||||
auto r_result = fetch_result<telegram_api::account_saveSecureValue>(std::move(query));
|
auto r_result = fetch_result<telegram_api::account_saveSecureValue>(std::move(query));
|
||||||
if (r_result.is_error()) {
|
if (r_result.is_error()) {
|
||||||
|
if (r_result.error().message() == "SECURE_SECRET_REQUIRED") {
|
||||||
|
state_ = State::WaitSecret;
|
||||||
|
send_closure(G()->password_manager(), &PasswordManager::drop_cached_secret);
|
||||||
|
load_secret();
|
||||||
|
return loop();
|
||||||
|
}
|
||||||
if (r_result.error().message() == "SECURE_SECRET_INVALID") {
|
if (r_result.error().message() == "SECURE_SECRET_INVALID") {
|
||||||
state_ = State::WaitSecret;
|
state_ = State::WaitSecret;
|
||||||
return start_upload_all();
|
start_upload_all();
|
||||||
|
return loop();
|
||||||
}
|
}
|
||||||
return on_error(r_result.move_as_error());
|
return on_error(r_result.move_as_error());
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user