diff options
author | saturneric <[email protected]> | 2024-11-27 20:23:51 +0000 |
---|---|---|
committer | saturneric <[email protected]> | 2024-11-27 20:23:51 +0000 |
commit | a83c6e28a16f998d89b956688f07ce5352a2864f (patch) | |
tree | 796ad69eee3add96df38e3e4f1dc78a82745a9db /src/sdk/GFSDKGpg.cpp | |
parent | fix: solve devops build issues (diff) | |
download | GpgFrontend-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.cpp | 90 |
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; +} |