aboutsummaryrefslogtreecommitdiffstats
path: root/src/sdk/GFSDKGpg.cpp
diff options
context:
space:
mode:
authorsaturneric <[email protected]>2024-11-27 20:23:51 +0000
committersaturneric <[email protected]>2024-11-27 20:23:51 +0000
commita83c6e28a16f998d89b956688f07ce5352a2864f (patch)
tree796ad69eee3add96df38e3e4f1dc78a82745a9db /src/sdk/GFSDKGpg.cpp
parentfix: solve devops build issues (diff)
downloadGpgFrontend-a83c6e28a16f998d89b956688f07ce5352a2864f.tar.gz
GpgFrontend-a83c6e28a16f998d89b956688f07ce5352a2864f.zip
feat: improve ui logic and support more email operations
Diffstat (limited to 'src/sdk/GFSDKGpg.cpp')
-rw-r--r--src/sdk/GFSDKGpg.cpp90
1 files changed, 89 insertions, 1 deletions
diff --git a/src/sdk/GFSDKGpg.cpp b/src/sdk/GFSDKGpg.cpp
index 88162ffa..ae467b7b 100644
--- a/src/sdk/GFSDKGpg.cpp
+++ b/src/sdk/GFSDKGpg.cpp
@@ -24,4 +24,92 @@
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
- */ \ No newline at end of file
+ */
+
+#include "GFSDKGpg.h"
+
+#include "GFSDKBasic.h"
+#include "core/function/gpg/GpgBasicOperator.h"
+#include "core/function/gpg/GpgKeyGetter.h"
+#include "core/function/gpg/GpgKeyImportExporter.h"
+#include "core/model/DataObject.h"
+#include "core/model/GpgSignResult.h"
+#include "core/typedef/GpgTypedef.h"
+
+//
+#include "core/utils/GpgUtils.h"
+#include "private/GFSDKPrivat.h"
+
+auto GPGFRONTEND_MODULE_SDK_EXPORT GFGpgSignData(int channel, char** key_ids,
+ int key_ids_size, char* data,
+ int sign_mode, int ascii,
+ GFGpgSignResult** ps) -> int {
+ auto singer_ids = CharArrayToQList(key_ids, key_ids_size);
+
+ GpgFrontend::KeyArgsList signer_keys;
+ for (const auto& signer_id : singer_ids) {
+ auto key =
+ GpgFrontend::GpgKeyGetter::GetInstance(channel).GetKey(signer_id);
+ if (key.IsGood()) signer_keys.push_back(key);
+ }
+
+ if (signer_keys.empty()) return -1;
+
+ auto in_buffer = GpgFrontend::GFBuffer(GFUnStrDup(data).toUtf8());
+
+ auto gpg_sign_mode =
+ sign_mode == 0 ? GPGME_SIG_MODE_NORMAL : GPGME_SIG_MODE_DETACH;
+
+ auto [err, data_object] =
+ GpgFrontend::GpgBasicOperator::GetInstance(channel).SignSync(
+ signer_keys, in_buffer, gpg_sign_mode, ascii != 0);
+
+ if (GpgFrontend::CheckGpgError(err) != GPG_ERR_NO_ERROR) return -1;
+
+ auto result =
+ GpgFrontend::ExtractParams<GpgFrontend::GpgSignResult>(data_object, 0);
+ auto out_buffer =
+ GpgFrontend::ExtractParams<GpgFrontend::GFBuffer>(data_object, 1);
+
+ *ps =
+ static_cast<GFGpgSignResult*>(GFAllocateMemory(sizeof(GFGpgSignResult)));
+ auto* s = *ps;
+ s->signature = GFStrDup(out_buffer.ConvertToQByteArray());
+ s->hash_algo = GFStrDup(result.HashAlgo());
+ return 0;
+}
+
+auto GPGFRONTEND_MODULE_SDK_EXPORT GFGpgPublicKey(int channel, char* key_id,
+ int ascii) -> char* {
+ auto key = GpgFrontend::GpgKeyGetter::GetInstance(channel).GetKey(
+ GFUnStrDup(key_id));
+
+ if (!key.IsGood()) return nullptr;
+
+ auto [err, buffer] =
+ GpgFrontend::GpgKeyImportExporter::GetInstance(channel).ExportKey(
+ key, false, ascii != 0, true);
+
+ if (GpgFrontend::CheckGpgError(err) != GPG_ERR_NO_ERROR) return nullptr;
+
+ return GFStrDup(buffer.ConvertToQByteArray());
+}
+
+auto GPGFRONTEND_MODULE_SDK_EXPORT GFGpgKeyPrimaryUID(int channel, char* key_id,
+ GFGpgKeyUID** ps) -> int {
+ auto key = GpgFrontend::GpgKeyGetter::GetInstance(channel).GetKey(
+ GFUnStrDup(key_id));
+
+ if (!key.IsGood()) return -1;
+
+ auto uids = key.GetUIDs();
+ auto& primary_uid = uids->front();
+
+ *ps = static_cast<GFGpgKeyUID*>(GFAllocateMemory(sizeof(GFGpgKeyUID)));
+
+ auto* s = *ps;
+ s->name = GFStrDup(primary_uid.GetName());
+ s->email = GFStrDup(primary_uid.GetEmail());
+ s->comment = GFStrDup(primary_uid.GetComment());
+ return 0;
+}