aboutsummaryrefslogtreecommitdiffstats
path: root/src/core/function/gpg/GpgBasicOperator.cpp
diff options
context:
space:
mode:
authorsaturneric <[email protected]>2025-02-03 18:01:26 +0000
committersaturneric <[email protected]>2025-02-03 18:01:26 +0000
commitd3d94f5b7a3e60b3bbb73e832bab7cf2d44a1600 (patch)
tree5cc7838f1325b076b91bb898fd0da3cfcb60b455 /src/core/function/gpg/GpgBasicOperator.cpp
parentdoc: update README.md (diff)
parentfix: set pb range when size of operas > 1 (diff)
downloadGpgFrontend-d3d94f5b7a3e60b3bbb73e832bab7cf2d44a1600.tar.gz
GpgFrontend-d3d94f5b7a3e60b3bbb73e832bab7cf2d44a1600.zip
Merge branch 'develop'
Diffstat (limited to 'src/core/function/gpg/GpgBasicOperator.cpp')
-rw-r--r--src/core/function/gpg/GpgBasicOperator.cpp406
1 files changed, 169 insertions, 237 deletions
diff --git a/src/core/function/gpg/GpgBasicOperator.cpp b/src/core/function/gpg/GpgBasicOperator.cpp
index 6443f242..7f36e60a 100644
--- a/src/core/function/gpg/GpgBasicOperator.cpp
+++ b/src/core/function/gpg/GpgBasicOperator.cpp
@@ -43,29 +43,49 @@ 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();
- std::vector<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.IsHasActualSignCap()) {
+ 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");
+ }
+}
- GpgData data_in(in_buffer);
- GpgData data_out;
+auto EncryptImpl(GpgContext& ctx_, const KeyArgsList& keys,
+ const GFBuffer& in_buffer, bool ascii,
+ const DataObjectPtr& data_object) -> GpgError {
+ auto recipients = Convert2RawGpgMEKeyList(keys);
- 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;
- return err;
+ auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext();
+ auto err = CheckGpgError(
+ gpgme_op_encrypt(ctx, keys.isEmpty() ? nullptr : recipients.data(),
+ GPGME_ENCRYPT_ALWAYS_TRUST, data_in, data_out));
+ data_object->Swap({
+ GpgEncryptResult(gpgme_op_encrypt_result(ctx)),
+ data_out.Read2GFBuffer(),
+ });
+
+ 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,25 +94,8 @@ 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;
-
- std::vector<gpgme_key_t> recipients(keys.begin(), keys.end());
-
- // Last entry data_in array has to be nullptr
- recipients.emplace_back(nullptr);
-
- 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;
+ [=](const DataObjectPtr& data_object) {
+ return EncryptImpl(ctx_, keys, in_buffer, ascii, data_object);
},
"gpgme_op_encrypt", "2.1.0");
}
@@ -100,17 +103,8 @@ auto GpgBasicOperator::EncryptSync(const KeyArgsList& keys,
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 EncryptImpl(ctx_, {}, in_buffer, ascii, data_object);
},
cb, "gpgme_op_encrypt_symmetric", "2.1.0");
}
@@ -119,35 +113,32 @@ 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 EncryptImpl(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 +146,43 @@ 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())),
+ GFBuffer(),
+ });
+
+ 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 +191,41 @@ 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 +234,36 @@ 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 +272,37 @@ 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 +311,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;
- std::vector<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,57 +323,24 @@ 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;
- std::vector<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) -> std::unique_ptr<KeyArgsList> {
+auto GpgBasicOperator::GetSigners(bool ascii) -> KeyArgsList {
auto* ctx = ascii ? ctx_.DefaultContext() : ctx_.BinaryContext();
auto count = gpgme_signers_count(ctx);
- auto signers = std::make_unique<std::vector<GpgKey>>();
+ auto signers = KeyArgsList{};
for (auto i = 0U; i < count; i++) {
auto key = GpgKey(gpgme_signers_enum(ctx, i));
- signers->push_back(GpgKey(std::move(key)));
+ signers.push_back(GpgKey(std::move(key)));
}
return signers;
}