SecureManager: reupload file on SECURE_SECRET_INVALID error
GitOrigin-RevId: 93b2fb8a5b48511720efcceabd3055bc0c49409b
This commit is contained in:
parent
24f1a2214a
commit
0517c8ff4a
@ -80,6 +80,7 @@ class SetSecureValue : public NetQueryCallback {
|
|||||||
optional<secure_storage::Secret> secret_;
|
optional<secure_storage::Secret> secret_;
|
||||||
|
|
||||||
size_t files_left_to_upload_ = 0;
|
size_t files_left_to_upload_ = 0;
|
||||||
|
uint32 upload_generation_{0};
|
||||||
vector<SecureInputFile> files_to_upload_;
|
vector<SecureInputFile> files_to_upload_;
|
||||||
vector<SecureInputFile> translations_to_upload_;
|
vector<SecureInputFile> translations_to_upload_;
|
||||||
optional<SecureInputFile> front_side_;
|
optional<SecureInputFile> front_side_;
|
||||||
@ -93,18 +94,19 @@ class SetSecureValue : public NetQueryCallback {
|
|||||||
|
|
||||||
class UploadCallback : public FileManager::UploadCallback {
|
class UploadCallback : public FileManager::UploadCallback {
|
||||||
public:
|
public:
|
||||||
explicit UploadCallback(ActorId<SetSecureValue> actor_id);
|
UploadCallback(ActorId<SetSecureValue> actor_id, uint32 upload_generation);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ActorId<SetSecureValue> actor_id_;
|
ActorId<SetSecureValue> actor_id_;
|
||||||
|
uint32 upload_generation_;
|
||||||
void on_upload_ok(FileId file_id, tl_object_ptr<telegram_api::InputFile> input_file) override;
|
void on_upload_ok(FileId file_id, tl_object_ptr<telegram_api::InputFile> input_file) override;
|
||||||
void on_upload_encrypted_ok(FileId file_id, tl_object_ptr<telegram_api::InputEncryptedFile> input_file) override;
|
void on_upload_encrypted_ok(FileId file_id, tl_object_ptr<telegram_api::InputEncryptedFile> input_file) override;
|
||||||
void on_upload_secure_ok(FileId file_id, tl_object_ptr<telegram_api::InputSecureFile> input_file) override;
|
void on_upload_secure_ok(FileId file_id, tl_object_ptr<telegram_api::InputSecureFile> input_file) override;
|
||||||
void on_upload_error(FileId file_id, Status status) override;
|
void on_upload_error(FileId file_id, Status status) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
void on_upload_ok(FileId file_id, tl_object_ptr<telegram_api::InputSecureFile> input_file);
|
void on_upload_ok(FileId file_id, tl_object_ptr<telegram_api::InputSecureFile> input_file, uint32 upload_generation);
|
||||||
void on_upload_error(FileId file_id, Status status);
|
void on_upload_error(FileId file_id, Status status, uint32 upload_generation);
|
||||||
|
|
||||||
void on_error(Status error);
|
void on_error(Status error);
|
||||||
|
|
||||||
@ -117,6 +119,8 @@ class SetSecureValue : public NetQueryCallback {
|
|||||||
void loop() override;
|
void loop() override;
|
||||||
void on_result(NetQueryPtr query) override;
|
void on_result(NetQueryPtr query) override;
|
||||||
|
|
||||||
|
void cancel_upload();
|
||||||
|
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);
|
||||||
void merge(FileManager *file_manager, FileId file_id, EncryptedSecureFile &encrypted_file);
|
void merge(FileManager *file_manager, FileId file_id, EncryptedSecureFile &encrypted_file);
|
||||||
};
|
};
|
||||||
@ -305,12 +309,13 @@ SetSecureValue::SetSecureValue(ActorShared<SecureManager> parent, string passwor
|
|||||||
, promise_(std::move(promise)) {
|
, promise_(std::move(promise)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SetSecureValue::UploadCallback::UploadCallback(ActorId<SetSecureValue> actor_id) : actor_id_(actor_id) {
|
SetSecureValue::UploadCallback::UploadCallback(ActorId<SetSecureValue> actor_id, uint32 upload_generation)
|
||||||
|
: actor_id_(actor_id), upload_generation_(upload_generation) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetSecureValue::UploadCallback::on_upload_ok(FileId file_id, tl_object_ptr<telegram_api::InputFile> input_file) {
|
void SetSecureValue::UploadCallback::on_upload_ok(FileId file_id, tl_object_ptr<telegram_api::InputFile> input_file) {
|
||||||
CHECK(input_file == nullptr);
|
CHECK(input_file == nullptr);
|
||||||
send_closure_later(actor_id_, &SetSecureValue::on_upload_ok, file_id, nullptr);
|
send_closure_later(actor_id_, &SetSecureValue::on_upload_ok, file_id, nullptr, upload_generation_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetSecureValue::UploadCallback::on_upload_encrypted_ok(
|
void SetSecureValue::UploadCallback::on_upload_encrypted_ok(
|
||||||
@ -320,14 +325,18 @@ void SetSecureValue::UploadCallback::on_upload_encrypted_ok(
|
|||||||
|
|
||||||
void SetSecureValue::UploadCallback::on_upload_secure_ok(FileId file_id,
|
void SetSecureValue::UploadCallback::on_upload_secure_ok(FileId file_id,
|
||||||
tl_object_ptr<telegram_api::InputSecureFile> input_file) {
|
tl_object_ptr<telegram_api::InputSecureFile> input_file) {
|
||||||
send_closure_later(actor_id_, &SetSecureValue::on_upload_ok, file_id, std::move(input_file));
|
send_closure_later(actor_id_, &SetSecureValue::on_upload_ok, file_id, std::move(input_file), upload_generation_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetSecureValue::UploadCallback::on_upload_error(FileId file_id, Status error) {
|
void SetSecureValue::UploadCallback::on_upload_error(FileId file_id, Status error) {
|
||||||
send_closure_later(actor_id_, &SetSecureValue::on_upload_error, file_id, std::move(error));
|
send_closure_later(actor_id_, &SetSecureValue::on_upload_error, file_id, std::move(error), upload_generation_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetSecureValue::on_upload_ok(FileId file_id, tl_object_ptr<telegram_api::InputSecureFile> input_file) {
|
void SetSecureValue::on_upload_ok(FileId file_id, tl_object_ptr<telegram_api::InputSecureFile> input_file,
|
||||||
|
uint32 upload_generation) {
|
||||||
|
if (upload_generation_ != upload_generation) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
SecureInputFile *info_ptr = nullptr;
|
SecureInputFile *info_ptr = nullptr;
|
||||||
for (auto &info : files_to_upload_) {
|
for (auto &info : files_to_upload_) {
|
||||||
if (info.file_id == file_id) {
|
if (info.file_id == file_id) {
|
||||||
@ -359,7 +368,10 @@ void SetSecureValue::on_upload_ok(FileId file_id, tl_object_ptr<telegram_api::In
|
|||||||
loop();
|
loop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetSecureValue::on_upload_error(FileId file_id, Status error) {
|
void SetSecureValue::on_upload_error(FileId file_id, Status error, uint32 upload_generation) {
|
||||||
|
if (upload_generation_ != upload_generation) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
on_error(std::move(error));
|
on_error(std::move(error));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -460,8 +472,41 @@ void SetSecureValue::start_up() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
upload_callback_ = std::make_shared<UploadCallback>(actor_id(this));
|
start_upload_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetSecureValue::cancel_upload() {
|
||||||
|
upload_generation_++;
|
||||||
|
auto *file_manager = G()->td().get_actor_unsafe()->file_manager_.get();
|
||||||
|
if (file_manager == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (auto &file_info : files_to_upload_) {
|
||||||
|
file_manager->cancel_upload(file_info.file_id);
|
||||||
|
}
|
||||||
|
for (auto &file_info : translations_to_upload_) {
|
||||||
|
file_manager->cancel_upload(file_info.file_id);
|
||||||
|
}
|
||||||
|
if (front_side_) {
|
||||||
|
file_manager->cancel_upload(front_side_.value().file_id);
|
||||||
|
}
|
||||||
|
if (reverse_side_) {
|
||||||
|
file_manager->cancel_upload(reverse_side_.value().file_id);
|
||||||
|
}
|
||||||
|
if (selfie_) {
|
||||||
|
file_manager->cancel_upload(selfie_.value().file_id);
|
||||||
|
}
|
||||||
|
files_left_to_upload_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetSecureValue::start_upload_all() {
|
||||||
|
if (files_left_to_upload_ != 0) {
|
||||||
|
cancel_upload();
|
||||||
|
}
|
||||||
|
upload_generation_++;
|
||||||
|
upload_callback_ = std::make_shared<UploadCallback>(actor_id(this), upload_generation_);
|
||||||
|
|
||||||
|
auto *file_manager = G()->td().get_actor_unsafe()->file_manager_.get();
|
||||||
files_to_upload_.resize(secure_value_.files.size());
|
files_to_upload_.resize(secure_value_.files.size());
|
||||||
for (size_t i = 0; i < files_to_upload_.size(); i++) {
|
for (size_t i = 0; i < files_to_upload_.size(); i++) {
|
||||||
start_upload(file_manager, secure_value_.files[i].file_id, files_to_upload_[i]);
|
start_upload(file_manager, secure_value_.files[i].file_id, files_to_upload_[i]);
|
||||||
@ -479,20 +524,27 @@ void SetSecureValue::start_up() {
|
|||||||
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) {
|
||||||
auto file_view = file_manager->get_file_view(file_id);
|
auto file_view = file_manager->get_file_view(file_id);
|
||||||
|
bool force = false;
|
||||||
|
if (info.file_id.empty()) {
|
||||||
if (!file_view.is_encrypted_secure()) {
|
if (!file_view.is_encrypted_secure()) {
|
||||||
auto download_file_id = file_manager->dup_file_id(file_id);
|
auto download_file_id = file_manager->dup_file_id(file_id);
|
||||||
file_id = file_manager
|
file_id =
|
||||||
|
file_manager
|
||||||
->register_generate(FileType::Secure, FileLocationSource::FromServer, file_view.suggested_name(),
|
->register_generate(FileType::Secure, FileLocationSource::FromServer, file_view.suggested_name(),
|
||||||
PSTRING() << "#file_id#" << download_file_id.get(), DialogId(), file_view.size())
|
PSTRING() << "#file_id#" << download_file_id.get(), DialogId(), file_view.size())
|
||||||
.ok();
|
.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
info.file_id = file_manager->dup_file_id(file_id);
|
info.file_id = file_manager->dup_file_id(file_id);
|
||||||
file_manager->upload(info.file_id, upload_callback_, 1, 0);
|
} else {
|
||||||
|
force = true;
|
||||||
|
}
|
||||||
|
file_manager->resume_upload(info.file_id, {}, upload_callback_, 1, 0, force);
|
||||||
files_left_to_upload_++;
|
files_left_to_upload_++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -522,30 +574,16 @@ void SetSecureValue::hangup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SetSecureValue::tear_down() {
|
void SetSecureValue::tear_down() {
|
||||||
auto *file_manager = G()->td().get_actor_unsafe()->file_manager_.get();
|
cancel_upload();
|
||||||
if (file_manager == nullptr) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (auto &file_info : files_to_upload_) {
|
|
||||||
file_manager->cancel_upload(file_info.file_id);
|
|
||||||
}
|
|
||||||
for (auto &file_info : translations_to_upload_) {
|
|
||||||
file_manager->cancel_upload(file_info.file_id);
|
|
||||||
}
|
|
||||||
if (front_side_) {
|
|
||||||
file_manager->cancel_upload(front_side_.value().file_id);
|
|
||||||
}
|
|
||||||
if (reverse_side_) {
|
|
||||||
file_manager->cancel_upload(reverse_side_.value().file_id);
|
|
||||||
}
|
|
||||||
if (selfie_) {
|
|
||||||
file_manager->cancel_upload(selfie_.value().file_id);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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_INVALID") {
|
||||||
|
state_ = State::WaitSecret;
|
||||||
|
return start_upload_all();
|
||||||
|
}
|
||||||
return on_error(r_result.move_as_error());
|
return on_error(r_result.move_as_error());
|
||||||
}
|
}
|
||||||
auto result = r_result.move_as_ok();
|
auto result = r_result.move_as_ok();
|
||||||
|
@ -421,6 +421,7 @@ class FileManager : public FileLoadManager::Callback {
|
|||||||
int32 new_priority, uint64 upload_order, bool force = false);
|
int32 new_priority, uint64 upload_order, bool force = false);
|
||||||
void cancel_upload(FileId file_id);
|
void cancel_upload(FileId file_id);
|
||||||
bool delete_partial_remote_location(FileId file_id);
|
bool delete_partial_remote_location(FileId file_id);
|
||||||
|
bool delete_remote_location(FileId file_id);
|
||||||
void delete_file_reference(FileId file_id, std::string file_reference);
|
void delete_file_reference(FileId file_id, std::string file_reference);
|
||||||
void get_content(FileId file_id, Promise<BufferSlice> promise);
|
void get_content(FileId file_id, Promise<BufferSlice> promise);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user