diff options
Diffstat (limited to 'src/ui/main_window/MainWindowSlotFunction.cpp')
-rw-r--r-- | src/ui/main_window/MainWindowSlotFunction.cpp | 450 |
1 files changed, 165 insertions, 285 deletions
diff --git a/src/ui/main_window/MainWindowSlotFunction.cpp b/src/ui/main_window/MainWindowSlotFunction.cpp index 35992395..191e80cb 100644 --- a/src/ui/main_window/MainWindowSlotFunction.cpp +++ b/src/ui/main_window/MainWindowSlotFunction.cpp @@ -80,12 +80,17 @@ void MainWindow::slot_encrypt() { auto buffer = GFBuffer(edit_->CurTextPage()->GetTextPage()->toPlainText()); CommonUtils::WaitForOpera( this, _("Symmetrically Encrypting"), - [this, buffer](const OperaWaitingHd& hd) { + [this, buffer](const OperaWaitingHd& op_hd) { GpgFrontend::GpgBasicOperator::GetInstance().EncryptSymmetric( buffer, true, - [this, hd](GpgError err, const DataObjectPtr& data_obj) { + [this, op_hd](GpgError err, const DataObjectPtr& data_obj) { // stop waiting - hd(); + op_hd(); + + if (data_obj == nullptr || + !data_obj->Check<GpgEncryptResult, GFBuffer>()) { + throw std::runtime_error("data object doesn't pass checking"); + } auto result = ExtractParams<GpgEncryptResult>(data_obj, 0); auto buffer = ExtractParams<GFBuffer>(data_obj, 1); @@ -120,12 +125,17 @@ void MainWindow::slot_encrypt() { auto buffer = GFBuffer(edit_->CurTextPage()->GetTextPage()->toPlainText()); CommonUtils::WaitForOpera( - this, _("Encrypting"), [this, keys, buffer](const OperaWaitingHd& hd) { + this, _("Encrypting"), [this, keys, buffer](const OperaWaitingHd& op_hd) { GpgFrontend::GpgBasicOperator::GetInstance().Encrypt( {keys->begin(), keys->end()}, buffer, true, - [this, hd](GpgError err, const DataObjectPtr& data_obj) { + [this, op_hd](GpgError err, const DataObjectPtr& data_obj) { // stop waiting - hd(); + op_hd(); + + if (data_obj == nullptr || + !data_obj->Check<GpgEncryptResult, GFBuffer>()) { + throw std::runtime_error("data object doesn't pass checking"); + } auto result = ExtractParams<GpgEncryptResult>(data_obj, 0); auto buffer = ExtractParams<GFBuffer>(data_obj, 1); @@ -171,60 +181,32 @@ void MainWindow::slot_sign() { } } - // data to transfer into task - auto data_object = TransferParams(); - // set input buffer - auto buffer = - edit_->CurTextPage()->GetTextPage()->toPlainText().toStdString(); - data_object->AppendObject(std::move(buffer)); - - // push the keys into data object - data_object->AppendObject(std::move(keys)); - - auto sign_ruunner = [](DataObjectPtr data_object) -> int { - // check the size of the data object - if (data_object == nullptr || data_object->GetObjectSize() != 2) - throw std::runtime_error("data object doesn't pass checking"); - - auto buffer = ExtractParams<std::string>(data_object, 0); - auto keys = ExtractParams<KeyListPtr>(data_object, 1); - - try { - GpgSignResult result = nullptr; - auto tmp = GpgFrontend::SecureCreateSharedObject<ByteArray>(); - GpgError error = GpgFrontend::GpgBasicOperator::GetInstance().Sign( - std::move(keys), buffer, tmp, GPGME_SIG_MODE_CLEAR, result); - - data_object->Swap({error, result, tmp}); - } catch (const std::runtime_error& e) { - return -1; - } - return 0; - }; - - auto result_callback = [this](int rtn, DataObjectPtr data_object) { - if (!rtn) { - if (data_object == nullptr || data_object->GetObjectSize() != 3) - throw std::runtime_error("data object doesn't pass checking"); - auto error = ExtractParams<GpgError>(data_object, 0); - auto result = ExtractParams<GpgSignResult>(data_object, 1); - auto tmp = ExtractParams<ByteArrayPtr>(data_object, 2); - auto resultAnalyse = GpgSignResultAnalyse(error, std::move(result)); - resultAnalyse.Analyse(); - process_result_analyse(edit_, info_board_, resultAnalyse); - - if (CheckGpgError(error) == GPG_ERR_NO_ERROR) - edit_->SlotFillTextEditWithText(QString::fromStdString(*tmp)); - } else { - QMessageBox::critical(this, _("Error"), - _("An error occurred during operation.")); - return; - } - }; + auto buffer = GFBuffer(edit_->CurTextPage()->GetTextPage()->toPlainText()); + CommonUtils::WaitForOpera( + this, _("Signing"), [this, keys, buffer](const OperaWaitingHd& hd) { + GpgFrontend::GpgBasicOperator::GetInstance().Sign( + {keys->begin(), keys->end()}, buffer, GPGME_SIG_MODE_CLEAR, true, + [this, hd](GpgError err, const DataObjectPtr& data_obj) { + // stop waiting + hd(); + + if (data_obj == nullptr || + !data_obj->Check<GpgSignResult, GFBuffer>()) { + throw std::runtime_error("data object doesn't pass checking"); + } + auto sign_result = ExtractParams<GpgSignResult>(data_obj, 0); + auto sign_out_buffer = ExtractParams<GFBuffer>(data_obj, 1); + auto result_analyse = GpgSignResultAnalyse(err, sign_result); + result_analyse.Analyse(); + process_result_analyse(edit_, info_board_, result_analyse); - process_operation(this, _("Signing"), std::move(sign_ruunner), - std::move(result_callback), data_object); + if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { + edit_->SlotFillTextEditWithText( + sign_out_buffer.ConvertToQByteArray()); + } + }); + }); } void MainWindow::slot_decrypt() { @@ -233,55 +215,34 @@ void MainWindow::slot_decrypt() { return; } - QByteArray text = edit_->CurTextPage()->GetTextPage()->toPlainText().toUtf8(); - // data to transfer into task - auto data_object = TransferParams( - edit_->CurTextPage()->GetTextPage()->toPlainText().toStdString()); - - auto decrypt_runner = [](DataObjectPtr data_object) -> int { - // check the size of the data object - if (data_object == nullptr || data_object->GetObjectSize() != 1) - throw std::runtime_error("data object doesn't pass checking"); - - auto buffer = ExtractParams<std::string>(data_object, 0); - try { - GpgDecrResult result = nullptr; - auto decrypted = GpgFrontend::SecureCreateSharedObject<ByteArray>(); - // GpgError error = GpgFrontend::GpgBasicOperator::GetInstance().Decrypt( - // GFBuffer(buffer), decrypted, result); - GpgError error; - - data_object->Swap({error, result, decrypted}); - } catch (const std::runtime_error& e) { - return -1; - } - return 0; - }; - - auto result_callback = [this](int rtn, DataObjectPtr data_object) { - if (!rtn) { - if (data_object == nullptr || - !data_object->Check<GpgError, GpgDecrResult, ByteArrayPtr>()) - throw std::runtime_error("data object doesn't pass checking"); - auto error = ExtractParams<GpgError>(data_object, 0); - auto result = ExtractParams<GpgDecrResult>(data_object, 1); - auto decrypted = ExtractParams<ByteArrayPtr>(data_object, 2); - auto resultAnalyse = GpgDecryptResultAnalyse(error, std::move(result)); - resultAnalyse.Analyse(); - process_result_analyse(edit_, info_board_, resultAnalyse); - - if (CheckGpgError(error) == GPG_ERR_NO_ERROR) - edit_->SlotFillTextEditWithText(QString::fromStdString(*decrypted)); - } else { - QMessageBox::critical(this, _("Error"), - _("An error occurred during operation.")); - return; - } - }; + auto buffer = GFBuffer(edit_->CurTextPage()->GetTextPage()->toPlainText()); + + CommonUtils::WaitForOpera( + this, _("Decrypting"), [this, buffer](const OperaWaitingHd& hd) { + GpgFrontend::GpgBasicOperator::GetInstance().Decrypt( + buffer, [this, hd](GpgError err, const DataObjectPtr& data_obj) { + // stop waiting + hd(); - process_operation(this, _("Decrypting"), std::move(decrypt_runner), - std::move(result_callback), data_object); + if (data_obj == nullptr || + !data_obj->Check<GpgDecryptResult, GFBuffer>()) { + throw std::runtime_error("data object doesn't pass checking"); + } + auto decrypt_result = + ExtractParams<GpgDecryptResult>(data_obj, 0); + auto out_buffer = ExtractParams<GFBuffer>(data_obj, 1); + auto result_analyse = + GpgDecryptResultAnalyse(err, decrypt_result); + result_analyse.Analyse(); + process_result_analyse(edit_, info_board_, result_analyse); + + if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { + edit_->SlotFillTextEditWithText( + out_buffer.ConvertToQByteArray()); + } + }); + }); } void MainWindow::slot_verify() { @@ -290,64 +251,28 @@ void MainWindow::slot_verify() { return; } - // data to transfer into task - auto data_object = TransferParams(); - // set input buffer - auto buffer = - edit_->CurTextPage()->GetTextPage()->toPlainText().toStdString(); - data_object->AppendObject(std::move(buffer)); - - auto verify_runner = [](DataObjectPtr data_object) -> int { - // check the size of the data object - if (data_object == nullptr || !data_object->Check<std::string>()) - throw std::runtime_error("data object doesn't pass checking"); - - auto buffer = ExtractParams<std::string>(data_object, 0); - - SPDLOG_DEBUG("verify buffer size: {}", buffer.size()); + auto buffer = GFBuffer(edit_->CurTextPage()->GetTextPage()->toPlainText()); - try { - GpgVerifyResult verify_result = nullptr; - auto sig_buffer = ByteArrayPtr(nullptr); - GpgError error = GpgFrontend::GpgBasicOperator::GetInstance().Verify( - buffer, sig_buffer, verify_result); + CommonUtils::WaitForOpera( + this, _("Verifying"), [this, buffer](const OperaWaitingHd& hd) { + GpgFrontend::GpgBasicOperator::GetInstance().Verify( + buffer, GFBuffer(), + [this, hd](GpgError err, const DataObjectPtr& data_obj) { + // stop waiting + hd(); - data_object->Swap({error, verify_result}); - } catch (const std::runtime_error& e) { - return -1; - } - return 0; - }; - - auto result_callback = [this](int rtn, DataObjectPtr data_object) { - if (!rtn) { - if (data_object == nullptr || - !data_object->Check<GpgError, GpgVerifyResult>()) - throw std::runtime_error("data object doesn't pass checking"); - auto error = ExtractParams<GpgError>(data_object, 0); - auto verify_result = ExtractParams<GpgVerifyResult>(data_object, 1); - - auto result_analyse = GpgVerifyResultAnalyse(error, verify_result); - result_analyse.Analyse(); - process_result_analyse(edit_, info_board_, result_analyse); - - if (CheckGpgError(error) == GPG_ERR_NO_ERROR) { - if (result_analyse.GetStatus() == -2) - import_unknown_key_from_keyserver(this, result_analyse); - - if (result_analyse.GetStatus() >= 0) - show_verify_details(this, info_board_, error, verify_result); - } - } else { - QMessageBox::critical(this, _("Error"), - _("An error occurred during operation.")); - return; - } - }; + if (data_obj == nullptr || !data_obj->Check<GpgVerifyResult>()) { + throw std::runtime_error("data object doesn't pass checking"); + } + auto verify_result = ExtractParams<GpgVerifyResult>(data_obj, 0); - process_operation(this, _("Verifying"), verify_runner, result_callback, - data_object); + // analyse result + auto result_analyse = GpgVerifyResultAnalyse(err, verify_result); + result_analyse.Analyse(); + process_result_analyse(edit_, info_board_, result_analyse); + }); + }); } void MainWindow::slot_encrypt_sign() { @@ -381,15 +306,15 @@ void MainWindow::slot_encrypt_sign() { } } - auto signersPicker = new SignersPicker(this); + auto* signers_picker = new SignersPicker(this); QEventLoop loop; - connect(signersPicker, &SignersPicker::finished, &loop, &QEventLoop::quit); + connect(signers_picker, &SignersPicker::finished, &loop, &QEventLoop::quit); loop.exec(); // return when canceled - if (!signersPicker->GetStatus()) return; + if (!signers_picker->GetStatus()) return; - auto signer_key_ids = signersPicker->GetCheckedSigners(); + auto signer_key_ids = signers_picker->GetCheckedSigners(); auto signer_keys = GpgKeyGetter::GetInstance().GetKeys(signer_key_ids); for (const auto& key : *keys) { @@ -401,67 +326,46 @@ void MainWindow::slot_encrypt_sign() { } // data to transfer into task - auto data_object = TransferParams( - std::move(signer_keys), std::move(keys), - edit_->CurTextPage()->GetTextPage()->toPlainText().toStdString()); - - auto encrypt_sign_runner = [](DataObjectPtr data_object) -> int { - // check the size of the data object - if (data_object == nullptr || - !data_object->Check<KeyListPtr, KeyListPtr, std::string>()) - throw std::runtime_error("data object doesn't pass checking"); - - auto signer_keys = ExtractParams<KeyListPtr>(data_object, 0); - auto keys = ExtractParams<KeyListPtr>(data_object, 1); - auto buffer = ExtractParams<std::string>(data_object, 2); - try { - GpgEncrResult encr_result = nullptr; - GpgSignResult sign_result = nullptr; - auto tmp = GpgFrontend::SecureCreateSharedObject<ByteArray>(); - GpgError error = GpgFrontend::GpgBasicOperator::GetInstance().EncryptSign( - std::move(keys), std::move(signer_keys), buffer, tmp, encr_result, - sign_result); - - data_object->Swap({error, encr_result, sign_result, tmp}); - - } catch (const std::runtime_error& e) { - return -1; - } - return 0; - }; - - auto result_callback = [this](int rtn, DataObjectPtr data_object) { - if (!rtn) { - if (data_object == nullptr || - !data_object - ->Check<GpgError, GpgEncrResult, GpgSignResult, ByteArrayPtr>()) - throw std::runtime_error("data object doesn't pass checking"); - auto error = ExtractParams<GpgError>(data_object, 0); - auto encrypt_result = ExtractParams<GpgEncrResult>(data_object, 1); - auto sign_result = ExtractParams<GpgSignResult>(data_object, 2); - auto tmp = ExtractParams<ByteArrayPtr>(data_object, 3); - - auto encrypt_result_analyse = GpgEncryptResultAnalyse( - error, GpgEncryptResult(encrypt_result.get())); - auto sign_result_analyse = - GpgSignResultAnalyse(error, std::move(sign_result)); - encrypt_result_analyse.Analyse(); - sign_result_analyse.Analyse(); - process_result_analyse(edit_, info_board_, encrypt_result_analyse, - sign_result_analyse); - if (CheckGpgError(error) == GPG_ERR_NO_ERROR) - edit_->SlotFillTextEditWithText(QString::fromStdString(*tmp)); - - info_board_->ResetOptionActionsMenu(); - } else { - QMessageBox::critical(this, _("Error"), - _("An error occurred during operation.")); - return; - } - }; + auto buffer = GFBuffer(edit_->CurTextPage()->GetTextPage()->toPlainText()); + + CommonUtils::WaitForOpera( + this, _("Encrypting and Signing"), + [this, keys, signer_keys, buffer](const OperaWaitingHd& hd) { + GpgFrontend::GpgBasicOperator::GetInstance().EncryptSign( + {keys->begin(), keys->end()}, + {signer_keys->begin(), signer_keys->end()}, buffer, true, + [this, hd](GpgError err, const DataObjectPtr& data_obj) { + // stop waiting + hd(); + + if (data_obj == nullptr || + !data_obj + ->Check<GpgEncryptResult, GpgSignResult, GFBuffer>()) { + throw std::runtime_error("data object doesn't pass checking"); + } + auto encrypt_result = + ExtractParams<GpgEncryptResult>(data_obj, 0); + auto sign_result = ExtractParams<GpgSignResult>(data_obj, 1); + auto out_buffer = ExtractParams<GFBuffer>(data_obj, 2); + + // analyse result + auto encrypt_result_analyse = + GpgEncryptResultAnalyse(err, encrypt_result); + encrypt_result_analyse.Analyse(); - process_operation(this, _("Encrypting and Signing"), encrypt_sign_runner, - result_callback, data_object); + auto sign_result_analyse = GpgSignResultAnalyse(err, sign_result); + sign_result_analyse.Analyse(); + + // show analyse result + process_result_analyse(edit_, info_board_, encrypt_result_analyse, + sign_result_analyse); + + if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { + edit_->SlotFillTextEditWithText( + out_buffer.ConvertToQByteArray()); + } + }); + }); } void MainWindow::slot_decrypt_verify() { @@ -472,69 +376,45 @@ void MainWindow::slot_decrypt_verify() { } // data to transfer into task - auto data_object = TransferParams( - edit_->CurTextPage()->GetTextPage()->toPlainText().toStdString()); - - auto decrypt_verify_runner = [](DataObjectPtr data_object) -> int { - // check the size of the data object - if (data_object == nullptr || !data_object->Check<std::string>()) - throw std::runtime_error("data object doesn't pass checking"); - - auto buffer = ExtractParams<std::string>(data_object, 0); - try { - GpgDecrResult decrypt_result = nullptr; - GpgVerifyResult verify_result = nullptr; - auto decrypted_buffer = - GpgFrontend::SecureCreateSharedObject<ByteArray>(); - GpgError error = GpgBasicOperator::GetInstance().DecryptVerify( - buffer, decrypted_buffer, decrypt_result, verify_result); - - data_object->Swap( - {error, decrypt_result, verify_result, decrypted_buffer}); - } catch (const std::runtime_error& e) { - SPDLOG_ERROR(e.what()); - return -1; - } - return 0; - }; - - auto result_callback = [this](int rtn, DataObjectPtr data_object) { - if (!rtn) { - if (data_object == nullptr || - !data_object->Check<GpgError, GpgDecrResult, GpgVerifyResult, - ByteArrayPtr>()) - throw std::runtime_error("data object doesn't pass checking"); - - auto error = ExtractParams<GpgError>(data_object, 0); - auto decrypt_result = ExtractParams<GpgDecrResult>(data_object, 1); - auto verify_result = ExtractParams<GpgVerifyResult>(data_object, 2); - auto decrypted = ExtractParams<ByteArrayPtr>(data_object, 3); - - auto decrypt_result_analyse = - GpgDecryptResultAnalyse(error, std::move(decrypt_result)); - auto verify_result_analyse = GpgVerifyResultAnalyse(error, verify_result); - decrypt_result_analyse.Analyse(); - verify_result_analyse.Analyse(); - process_result_analyse(edit_, info_board_, decrypt_result_analyse, - verify_result_analyse); - if (CheckGpgError(error) == GPG_ERR_NO_ERROR) - edit_->SlotFillTextEditWithText(QString::fromStdString(*decrypted)); - - if (verify_result_analyse.GetStatus() == -2) - import_unknown_key_from_keyserver(this, verify_result_analyse); - - if (verify_result_analyse.GetStatus() >= 0) - show_verify_details(this, info_board_, error, verify_result); - - } else { - QMessageBox::critical(this, _("Error"), - _("An error occurred during operation.")); - return; - } - }; + auto buffer = GFBuffer(edit_->CurTextPage()->GetTextPage()->toPlainText()); - process_operation(this, _("Decrypting and Verifying"), decrypt_verify_runner, - result_callback, data_object); + CommonUtils::WaitForOpera( + this, _("Decrypting and Verifying"), + [this, buffer](const OperaWaitingHd& hd) { + GpgFrontend::GpgBasicOperator::GetInstance().DecryptVerify( + buffer, [this, hd](GpgError err, const DataObjectPtr& data_obj) { + // stop waiting + hd(); + + if (data_obj == nullptr || + !data_obj + ->Check<GpgDecryptResult, GpgVerifyResult, GFBuffer>()) { + throw std::runtime_error("data object doesn't pass checking"); + } + auto decrypt_result = + ExtractParams<GpgDecryptResult>(data_obj, 0); + auto verify_result = ExtractParams<GpgVerifyResult>(data_obj, 1); + auto out_buffer = ExtractParams<GFBuffer>(data_obj, 2); + + // analyse result + auto decrypt_result_analyse = + GpgDecryptResultAnalyse(err, decrypt_result); + decrypt_result_analyse.Analyse(); + + auto verify_result_analyse = + GpgVerifyResultAnalyse(err, verify_result); + verify_result_analyse.Analyse(); + + // show analyse result + process_result_analyse(edit_, info_board_, decrypt_result_analyse, + verify_result_analyse); + + if (CheckGpgError(err) == GPG_ERR_NO_ERROR) { + edit_->SlotFillTextEditWithText( + out_buffer.ConvertToQByteArray()); + } + }); + }); } void MainWindow::slot_find() { |