aboutsummaryrefslogtreecommitdiffstats
path: root/src/core/function/gpg/GpgBasicOperator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/function/gpg/GpgBasicOperator.cpp')
-rw-r--r--src/core/function/gpg/GpgBasicOperator.cpp408
1 files changed, 175 insertions, 233 deletions
diff --git a/src/core/function/gpg/GpgBasicOperator.cpp b/src/core/function/gpg/GpgBasicOperator.cpp
index 661c1283..cb933d33 100644
--- a/src/core/function/gpg/GpgBasicOperator.cpp
+++ b/src/core/function/gpg/GpgBasicOperator.cpp
@@ -43,29 +43,51 @@ namespace GpgFrontend {
GpgBasicOperator::GpgBasicOperator(int channel)
: SingletonFunctionObject<GpgBasicOperator>(channel) {}
-void GpgBasicOperator::Encrypt(const KeyArgsList& keys,
- const GFBuffer& in_buffer, bool ascii,
- const GpgOperationCallback& cb) {
- RunGpgOperaAsync(
- [=](const DataObjectPtr& data_object) -> GpgError {
- if (keys.empty()) return GPG_ERR_CANCELED;
+void SetSignersImpl(GpgContext& ctx_, const KeyArgsList& signers, bool ascii) {
+ auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext();
- QContainer<gpgme_key_t> recipients(keys.begin(), keys.end());
+ gpgme_signers_clear(ctx);
- // Last entry data_in array has to be nullptr
- recipients.emplace_back(nullptr);
+ for (const GpgKey& key : signers) {
+ LOG_D() << "signer's key fpr: " << key.GetFingerprint();
+ if (key.IsHasActualSigningCapability()) {
+ auto error = gpgme_signers_add(ctx, gpgme_key_t(key));
+ CheckGpgError(error);
+ }
+ }
+ if (signers.size() != gpgme_signers_count(ctx_.DefaultContext())) {
+ FLOG_D("not all signers added");
+ }
+}
+
+auto EncryptImpl(GpgContext& ctx_, const KeyArgsList& keys,
+ const GFBuffer& in_buffer, bool ascii,
+ const DataObjectPtr& data_object) -> GpgError {
+ if (keys.empty()) return GPG_ERR_CANCELED;
+
+ QContainer<gpgme_key_t> recipients(keys.begin(), keys.end());
- GpgData data_in(in_buffer);
- GpgData data_out;
+ // Last entry data_in array has to be nullptr
+ recipients.emplace_back(nullptr);
- auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext();
- auto err = CheckGpgError(gpgme_op_encrypt(ctx, recipients.data(),
- GPGME_ENCRYPT_ALWAYS_TRUST,
- data_in, data_out));
- data_object->Swap({GpgEncryptResult(gpgme_op_encrypt_result(ctx)),
- data_out.Read2GFBuffer()});
+ GpgData data_in(in_buffer);
+ GpgData data_out;
+
+ auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext();
+ auto err = CheckGpgError(gpgme_op_encrypt(
+ ctx, recipients.data(), GPGME_ENCRYPT_ALWAYS_TRUST, data_in, data_out));
+ data_object->Swap({GpgEncryptResult(gpgme_op_encrypt_result(ctx)),
+ data_out.Read2GFBuffer()});
+
+ return err;
+}
- return err;
+void GpgBasicOperator::Encrypt(const KeyArgsList& keys,
+ const GFBuffer& in_buffer, bool ascii,
+ const GpgOperationCallback& cb) {
+ RunGpgOperaAsync(
+ [=](const DataObjectPtr& data_object) {
+ return EncryptImpl(ctx_, keys, in_buffer, ascii, data_object);
},
cb, "gpgme_op_encrypt", "2.1.0");
}
@@ -74,43 +96,32 @@ auto GpgBasicOperator::EncryptSync(const KeyArgsList& keys,
const GFBuffer& in_buffer, bool ascii)
-> std::tuple<GpgError, DataObjectPtr> {
return RunGpgOperaSync(
- [=](const DataObjectPtr& data_object) -> GpgError {
- if (keys.empty()) return GPG_ERR_CANCELED;
-
- QContainer<gpgme_key_t> recipients(keys.begin(), keys.end());
-
- // Last entry data_in array has to be nullptr
- recipients.emplace_back(nullptr);
+ [=](const DataObjectPtr& data_object) {
+ return EncryptImpl(ctx_, keys, in_buffer, ascii, data_object);
+ },
+ "gpgme_op_encrypt", "2.1.0");
+}
- GpgData data_in(in_buffer);
- GpgData data_out;
+auto EncryptSymmetricImpl(GpgContext& ctx_, const GFBuffer& in_buffer,
+ bool ascii,
+ const DataObjectPtr& data_object) -> GpgError {
+ GpgData data_in(in_buffer);
+ GpgData data_out;
- auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext();
- auto err = CheckGpgError(gpgme_op_encrypt(ctx, recipients.data(),
- GPGME_ENCRYPT_ALWAYS_TRUST,
- data_in, data_out));
- data_object->Swap({GpgEncryptResult(gpgme_op_encrypt_result(ctx)),
- data_out.Read2GFBuffer()});
+ auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext();
+ auto err = CheckGpgError(gpgme_op_encrypt(
+ ctx, nullptr, GPGME_ENCRYPT_SYMMETRIC, data_in, data_out));
+ data_object->Swap({GpgEncryptResult(gpgme_op_encrypt_result(ctx)),
+ data_out.Read2GFBuffer()});
- return err;
- },
- "gpgme_op_encrypt", "2.1.0");
+ return err;
}
void GpgBasicOperator::EncryptSymmetric(const GFBuffer& in_buffer, bool ascii,
const GpgOperationCallback& cb) {
RunGpgOperaAsync(
- [=](const DataObjectPtr& data_object) -> GpgError {
- GpgData data_in(in_buffer);
- GpgData data_out;
-
- auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext();
- auto err = CheckGpgError(gpgme_op_encrypt(
- ctx, nullptr, GPGME_ENCRYPT_SYMMETRIC, data_in, data_out));
- data_object->Swap({GpgEncryptResult(gpgme_op_encrypt_result(ctx)),
- data_out.Read2GFBuffer()});
-
- return err;
+ [=](const DataObjectPtr& data_object) {
+ return EncryptSymmetricImpl(ctx_, in_buffer, ascii, data_object);
},
cb, "gpgme_op_encrypt_symmetric", "2.1.0");
}
@@ -119,35 +130,31 @@ auto GpgBasicOperator::EncryptSymmetricSync(const GFBuffer& in_buffer,
bool ascii)
-> std::tuple<GpgError, DataObjectPtr> {
return RunGpgOperaSync(
- [=](const DataObjectPtr& data_object) -> GpgError {
- GpgData data_in(in_buffer);
- GpgData data_out;
-
- auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext();
- auto err = CheckGpgError(gpgme_op_encrypt(
- ctx, nullptr, GPGME_ENCRYPT_SYMMETRIC, data_in, data_out));
- data_object->Swap({GpgEncryptResult(gpgme_op_encrypt_result(ctx)),
- data_out.Read2GFBuffer()});
-
- return err;
+ [=](const DataObjectPtr& data_object) {
+ return EncryptSymmetricImpl(ctx_, in_buffer, ascii, data_object);
},
"gpgme_op_encrypt_symmetric", "2.1.0");
}
+auto DecryptImpl(GpgContext& ctx_, const GFBuffer& in_buffer,
+ const DataObjectPtr& data_object) -> GpgError {
+ GpgData data_in(in_buffer);
+ GpgData data_out;
+
+ auto err =
+ CheckGpgError(gpgme_op_decrypt(ctx_.DefaultContext(), data_in, data_out));
+ data_object->Swap(
+ {GpgDecryptResult(gpgme_op_decrypt_result(ctx_.DefaultContext())),
+ data_out.Read2GFBuffer()});
+
+ return err;
+}
+
void GpgBasicOperator::Decrypt(const GFBuffer& in_buffer,
const GpgOperationCallback& cb) {
RunGpgOperaAsync(
- [=](const DataObjectPtr& data_object) -> GpgError {
- GpgData data_in(in_buffer);
- GpgData data_out;
-
- auto err = CheckGpgError(
- gpgme_op_decrypt(ctx_.DefaultContext(), data_in, data_out));
- data_object->Swap(
- {GpgDecryptResult(gpgme_op_decrypt_result(ctx_.DefaultContext())),
- data_out.Read2GFBuffer()});
-
- return err;
+ [=](const DataObjectPtr& data_object) {
+ return DecryptImpl(ctx_, in_buffer, data_object);
},
cb, "gpgme_op_decrypt", "2.1.0");
}
@@ -155,45 +162,42 @@ void GpgBasicOperator::Decrypt(const GFBuffer& in_buffer,
auto GpgBasicOperator::DecryptSync(const GFBuffer& in_buffer)
-> std::tuple<GpgError, DataObjectPtr> {
return RunGpgOperaSync(
- [=](const DataObjectPtr& data_object) -> GpgError {
- GpgData data_in(in_buffer);
- GpgData data_out;
-
- auto err = CheckGpgError(
- gpgme_op_decrypt(ctx_.DefaultContext(), data_in, data_out));
- data_object->Swap(
- {GpgDecryptResult(gpgme_op_decrypt_result(ctx_.DefaultContext())),
- data_out.Read2GFBuffer()});
-
- return err;
+ [=](const DataObjectPtr& data_object) {
+ return DecryptImpl(ctx_, in_buffer, data_object);
},
"gpgme_op_decrypt", "2.1.0");
}
+auto VerifyImpl(GpgContext& ctx_, const GFBuffer& in_buffer,
+ const GFBuffer& sig_buffer,
+ const DataObjectPtr& data_object) -> GpgError {
+ GpgError err;
+
+ GpgData data_in(in_buffer);
+ GpgData data_out;
+
+ if (!sig_buffer.Empty()) {
+ GpgData sig_data(sig_buffer);
+ err = CheckGpgError(
+ gpgme_op_verify(ctx_.DefaultContext(), sig_data, data_in, nullptr));
+ } else {
+ err = CheckGpgError(
+ gpgme_op_verify(ctx_.DefaultContext(), data_in, nullptr, data_out));
+ }
+
+ data_object->Swap({
+ GpgVerifyResult(gpgme_op_verify_result(ctx_.DefaultContext())),
+ });
+
+ return err;
+}
+
void GpgBasicOperator::Verify(const GFBuffer& in_buffer,
const GFBuffer& sig_buffer,
const GpgOperationCallback& cb) {
RunGpgOperaAsync(
[=](const DataObjectPtr& data_object) -> GpgError {
- GpgError err;
-
- GpgData data_in(in_buffer);
- GpgData data_out;
-
- if (!sig_buffer.Empty()) {
- GpgData sig_data(sig_buffer);
- err = CheckGpgError(gpgme_op_verify(ctx_.DefaultContext(), sig_data,
- data_in, nullptr));
- } else {
- err = CheckGpgError(gpgme_op_verify(ctx_.DefaultContext(), data_in,
- nullptr, data_out));
- }
-
- data_object->Swap({
- GpgVerifyResult(gpgme_op_verify_result(ctx_.DefaultContext())),
- });
-
- return err;
+ return VerifyImpl(ctx_, in_buffer, sig_buffer, data_object);
},
cb, "gpgme_op_verify", "2.1.0");
}
@@ -202,51 +206,39 @@ auto GpgBasicOperator::VerifySync(const GFBuffer& in_buffer,
const GFBuffer& sig_buffer)
-> std::tuple<GpgError, DataObjectPtr> {
return RunGpgOperaSync(
- [=](const DataObjectPtr& data_object) -> GpgError {
- GpgError err;
+ [=](const DataObjectPtr& data_object) {
+ return VerifyImpl(ctx_, in_buffer, sig_buffer, data_object);
+ },
+ "gpgme_op_verify", "2.1.0");
+}
- GpgData data_in(in_buffer);
- GpgData data_out;
+auto SignImpl(GpgContext& ctx_, const KeyArgsList& signers,
+ const GFBuffer& in_buffer, GpgSignMode mode, bool ascii,
+ const DataObjectPtr& data_object) -> GpgError {
+ if (signers.empty()) return GPG_ERR_CANCELED;
- if (!sig_buffer.Empty()) {
- GpgData sig_data(sig_buffer);
- err = CheckGpgError(gpgme_op_verify(ctx_.DefaultContext(), sig_data,
- data_in, nullptr));
- } else {
- err = CheckGpgError(gpgme_op_verify(ctx_.DefaultContext(), data_in,
- nullptr, data_out));
- }
+ GpgError err;
- data_object->Swap({
- GpgVerifyResult(gpgme_op_verify_result(ctx_.DefaultContext())),
- });
+ // Set Singers of this opera
+ SetSignersImpl(ctx_, signers, ascii);
- return err;
- },
- "gpgme_op_verify", "2.1.0");
+ GpgData data_in(in_buffer);
+ GpgData data_out;
+
+ auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext();
+ err = CheckGpgError(gpgme_op_sign(ctx, data_in, data_out, mode));
+
+ data_object->Swap(
+ {GpgSignResult(gpgme_op_sign_result(ctx)), data_out.Read2GFBuffer()});
+ return err;
}
void GpgBasicOperator::Sign(const KeyArgsList& signers,
const GFBuffer& in_buffer, GpgSignMode mode,
bool ascii, const GpgOperationCallback& cb) {
RunGpgOperaAsync(
- [=](const DataObjectPtr& data_object) -> GpgError {
- if (signers.empty()) return GPG_ERR_CANCELED;
-
- GpgError err;
-
- // Set Singers of this opera
- SetSigners(signers, ascii);
-
- GpgData data_in(in_buffer);
- GpgData data_out;
-
- auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext();
- err = CheckGpgError(gpgme_op_sign(ctx, data_in, data_out, mode));
-
- data_object->Swap({GpgSignResult(gpgme_op_sign_result(ctx)),
- data_out.Read2GFBuffer()});
- return err;
+ [=](const DataObjectPtr& data_object) {
+ return SignImpl(ctx_, signers, in_buffer, mode, ascii, data_object);
},
cb, "gpgme_op_sign", "2.1.0");
}
@@ -255,45 +247,35 @@ auto GpgBasicOperator::SignSync(
const KeyArgsList& signers, const GFBuffer& in_buffer, GpgSignMode mode,
bool ascii) -> std::tuple<GpgError, DataObjectPtr> {
return RunGpgOperaSync(
- [=](const DataObjectPtr& data_object) -> GpgError {
- if (signers.empty()) return GPG_ERR_CANCELED;
+ [=](const DataObjectPtr& data_object) {
+ return SignImpl(ctx_, signers, in_buffer, mode, ascii, data_object);
+ },
+ "gpgme_op_sign", "2.1.0");
+}
- GpgError err;
+auto DecryptVerifyImpl(GpgContext& ctx_, const GFBuffer& in_buffer,
+ const DataObjectPtr& data_object) -> GpgError {
+ GpgError err;
- // Set Singers of this opera
- SetSigners(signers, ascii);
+ GpgData data_in(in_buffer);
+ GpgData data_out;
- GpgData data_in(in_buffer);
- GpgData data_out;
+ err = CheckGpgError(
+ gpgme_op_decrypt_verify(ctx_.DefaultContext(), data_in, data_out));
- auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext();
- err = CheckGpgError(gpgme_op_sign(ctx, data_in, data_out, mode));
+ data_object->Swap(
+ {GpgDecryptResult(gpgme_op_decrypt_result(ctx_.DefaultContext())),
+ GpgVerifyResult(gpgme_op_verify_result(ctx_.DefaultContext())),
+ data_out.Read2GFBuffer()});
- data_object->Swap({GpgSignResult(gpgme_op_sign_result(ctx)),
- data_out.Read2GFBuffer()});
- return err;
- },
- "gpgme_op_sign", "2.1.0");
+ return err;
}
void GpgBasicOperator::DecryptVerify(const GFBuffer& in_buffer,
const GpgOperationCallback& cb) {
RunGpgOperaAsync(
- [=](const DataObjectPtr& data_object) -> GpgError {
- GpgError err;
-
- GpgData data_in(in_buffer);
- GpgData data_out;
-
- err = CheckGpgError(
- gpgme_op_decrypt_verify(ctx_.DefaultContext(), data_in, data_out));
-
- data_object->Swap(
- {GpgDecryptResult(gpgme_op_decrypt_result(ctx_.DefaultContext())),
- GpgVerifyResult(gpgme_op_verify_result(ctx_.DefaultContext())),
- data_out.Read2GFBuffer()});
-
- return err;
+ [=](const DataObjectPtr& data_object) {
+ return DecryptVerifyImpl(ctx_, in_buffer, data_object);
},
cb, "gpgme_op_decrypt_verify", "2.1.0");
}
@@ -302,22 +284,35 @@ auto GpgBasicOperator::DecryptVerifySync(const GFBuffer& in_buffer)
-> std::tuple<GpgError, DataObjectPtr> {
return RunGpgOperaSync(
[=](const DataObjectPtr& data_object) -> GpgError {
- GpgError err;
+ return DecryptVerifyImpl(ctx_, in_buffer, data_object);
+ },
+ "gpgme_op_decrypt_verify", "2.1.0");
+}
- GpgData data_in(in_buffer);
- GpgData data_out;
+auto EncryptSignImpl(GpgContext& ctx_, const KeyArgsList& keys,
+ const KeyArgsList& signers, const GFBuffer& in_buffer,
+ bool ascii, const DataObjectPtr& data_object) -> GpgError {
+ if (keys.empty() || signers.empty()) return GPG_ERR_CANCELED;
- err = CheckGpgError(
- gpgme_op_decrypt_verify(ctx_.DefaultContext(), data_in, data_out));
+ GpgError err;
+ QContainer<gpgme_key_t> recipients(keys.begin(), keys.end());
- data_object->Swap(
- {GpgDecryptResult(gpgme_op_decrypt_result(ctx_.DefaultContext())),
- GpgVerifyResult(gpgme_op_verify_result(ctx_.DefaultContext())),
- data_out.Read2GFBuffer()});
+ // Last entry data_in array has to be nullptr
+ recipients.emplace_back(nullptr);
- return err;
- },
- "gpgme_op_decrypt_verify", "2.1.0");
+ SetSignersImpl(ctx_, signers, ascii);
+
+ GpgData data_in(in_buffer);
+ GpgData data_out;
+
+ auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext();
+ err = CheckGpgError(gpgme_op_encrypt_sign(
+ ctx, recipients.data(), GPGME_ENCRYPT_ALWAYS_TRUST, data_in, data_out));
+
+ data_object->Swap({GpgEncryptResult(gpgme_op_encrypt_result(ctx)),
+ GpgSignResult(gpgme_op_sign_result(ctx)),
+ data_out.Read2GFBuffer()});
+ return err;
}
void GpgBasicOperator::EncryptSign(const KeyArgsList& keys,
@@ -326,28 +321,8 @@ void GpgBasicOperator::EncryptSign(const KeyArgsList& keys,
const GpgOperationCallback& cb) {
RunGpgOperaAsync(
[=](const DataObjectPtr& data_object) -> GpgError {
- if (keys.empty() || signers.empty()) return GPG_ERR_CANCELED;
-
- GpgError err;
- QContainer<gpgme_key_t> recipients(keys.begin(), keys.end());
-
- // Last entry data_in array has to be nullptr
- recipients.emplace_back(nullptr);
-
- SetSigners(signers, ascii);
-
- GpgData data_in(in_buffer);
- GpgData data_out;
-
- auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext();
- err = CheckGpgError(gpgme_op_encrypt_sign(ctx, recipients.data(),
- GPGME_ENCRYPT_ALWAYS_TRUST,
- data_in, data_out));
-
- data_object->Swap({GpgEncryptResult(gpgme_op_encrypt_result(ctx)),
- GpgSignResult(gpgme_op_sign_result(ctx)),
- data_out.Read2GFBuffer()});
- return err;
+ return EncryptSignImpl(ctx_, keys, signers, in_buffer, ascii,
+ data_object);
},
cb, "gpgme_op_encrypt_sign", "2.1.0");
}
@@ -358,47 +333,14 @@ auto GpgBasicOperator::EncryptSignSync(const KeyArgsList& keys,
-> std::tuple<GpgError, DataObjectPtr> {
return RunGpgOperaSync(
[=](const DataObjectPtr& data_object) -> GpgError {
- if (keys.empty() || signers.empty()) return GPG_ERR_CANCELED;
-
- GpgError err;
- QContainer<gpgme_key_t> recipients(keys.begin(), keys.end());
-
- // Last entry data_in array has to be nullptr
- recipients.emplace_back(nullptr);
-
- SetSigners(signers, ascii);
-
- GpgData data_in(in_buffer);
- GpgData data_out;
-
- auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext();
- err = CheckGpgError(gpgme_op_encrypt_sign(ctx, recipients.data(),
- GPGME_ENCRYPT_ALWAYS_TRUST,
- data_in, data_out));
-
- data_object->Swap({GpgEncryptResult(gpgme_op_encrypt_result(ctx)),
- GpgSignResult(gpgme_op_sign_result(ctx)),
- data_out.Read2GFBuffer()});
- return err;
+ return EncryptSignImpl(ctx_, keys, signers, in_buffer, ascii,
+ data_object);
},
"gpgme_op_encrypt_sign", "2.1.0");
}
void GpgBasicOperator::SetSigners(const KeyArgsList& signers, bool ascii) {
- auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext();
-
- gpgme_signers_clear(ctx);
-
- for (const GpgKey& key : signers) {
- LOG_D() << "signer's key fpr: " << key.GetFingerprint();
- if (key.IsHasActualSigningCapability()) {
- auto error = gpgme_signers_add(ctx, gpgme_key_t(key));
- CheckGpgError(error);
- }
- }
- if (signers.size() != gpgme_signers_count(ctx_.DefaultContext())) {
- FLOG_D("not all signers added");
- }
+ SetSignersImpl(ctx_, signers, ascii);
}
auto GpgBasicOperator::GetSigners(bool ascii) -> KeyArgsList {