aboutsummaryrefslogtreecommitdiffstats
path: root/src/core/utils/GpgUtils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/utils/GpgUtils.cpp')
-rw-r--r--src/core/utils/GpgUtils.cpp78
1 files changed, 59 insertions, 19 deletions
diff --git a/src/core/utils/GpgUtils.cpp b/src/core/utils/GpgUtils.cpp
index 22ba856e..ad93fe67 100644
--- a/src/core/utils/GpgUtils.cpp
+++ b/src/core/utils/GpgUtils.cpp
@@ -29,12 +29,13 @@
#include "GpgUtils.h"
#include "core/function/GlobalSettingStation.h"
+#include "core/function/gpg/GpgAbstractKeyGetter.h"
#include "core/model/GpgKey.h"
+#include "core/model/GpgKeyGroup.h"
#include "core/model/KeyDatabaseInfo.h"
#include "core/model/SettingsObject.h"
#include "core/module/ModuleManager.h"
#include "core/struct/settings_object/KeyDatabaseListSO.h"
-
namespace GpgFrontend {
inline auto Trim(QString& s) -> QString { return s.trimmed(); }
@@ -326,31 +327,65 @@ auto GetKeyDatabaseInfoBySettings() -> QContainer<KeyDatabaseInfo> {
return key_db_infos;
}
-auto GPGFRONTEND_CORE_EXPORT Convert2RawGpgMEKeyList(
- const QContainer<GpgKey>& keys) -> QContainer<gpgme_key_t> {
- QContainer<gpgme_key_t> recipients(keys.begin(), keys.end());
- recipients.push_back(nullptr);
+auto GPGFRONTEND_CORE_EXPORT ConvertKey2GpgKeyIdList(
+ int channel, const GpgAbstractKeyPtrList& keys) -> KeyIdArgsList {
+ KeyIdArgsList ret;
+ for (const auto& key : ConvertKey2GpgKeyList(channel, keys)) {
+ ret.push_back(key->ID());
+ }
+ return ret;
+}
+
+auto GPGFRONTEND_CORE_EXPORT ConvertKey2GpgKeyList(
+ int channel, const GpgAbstractKeyPtrList& keys) -> GpgKeyPtrList {
+ GpgKeyPtrList recipients;
+
+ QSet<QString> s;
+ for (const auto& key : keys) {
+ if (key == nullptr || key->IsDisabled() || s.contains(key->ID())) continue;
+
+ if (key->KeyType() == GpgAbstractKeyType::kGPG_KEY) {
+ recipients.push_back(qSharedPointerDynamicCast<GpgKey>(key));
+ } else if (key->KeyType() == GpgAbstractKeyType::kGPG_KEYGROUP) {
+ auto key_ids = qSharedPointerDynamicCast<GpgKeyGroup>(key)->KeyIds();
+ recipients += ConvertKey2GpgKeyList(
+ channel, GpgAbstractKeyGetter::GetInstance().GetKeys(key_ids));
+ }
+
+ s.insert(key->ID());
+ }
+
+ assert(std::all_of(keys.begin(), keys.end(),
+ [](const auto& key) { return key->IsGood(); }));
return recipients;
}
-auto GPGFRONTEND_CORE_EXPORT GetUsagesByKey(const GpgKey& key) -> QString {
- QString usages;
- if (key.IsHasActualCertCap()) usages += "C";
- if (key.IsHasActualEncrCap()) usages += "E";
- if (key.IsHasActualSignCap()) usages += "S";
- if (key.IsHasActualAuthCap()) usages += "A";
- return usages;
+auto GPGFRONTEND_CORE_EXPORT Convert2RawGpgMEKeyList(
+ int channel, const GpgAbstractKeyPtrList& keys) -> QContainer<gpgme_key_t> {
+ QContainer<gpgme_key_t> recipients;
+
+ auto g_keys = ConvertKey2GpgKeyList(channel, keys);
+ for (const auto& key : g_keys) {
+ recipients.push_back(
+ static_cast<gpgme_key_t>(*qSharedPointerDynamicCast<GpgKey>(key)));
+ }
+
+ recipients.push_back(nullptr);
+ return recipients;
}
-auto GPGFRONTEND_CORE_EXPORT GetUsagesBySubkey(const GpgSubKey& key)
+auto GPGFRONTEND_CORE_EXPORT GetUsagesByAbstractKey(const GpgAbstractKey* key)
-> QString {
QString usages;
- if (key.IsHasCertCap()) usages += "C";
- if (key.IsHasEncrCap()) usages += "E";
- if (key.IsHasSignCap()) usages += "S";
- if (key.IsHasAuthCap()) usages += "A";
- if (key.IsADSK()) usages += "R";
+ if (key->IsHasCertCap()) usages += "C";
+ if (key->IsHasEncrCap()) usages += "E";
+ if (key->IsHasSignCap()) usages += "S";
+ if (key->IsHasAuthCap()) usages += "A";
+
+ if (key->KeyType() == GpgAbstractKeyType::kGPG_SUBKEY) {
+ if (dynamic_cast<const GpgSubKey*>(key)->IsADSK()) usages += "R";
+ }
return usages;
}
@@ -358,7 +393,7 @@ auto GPGFRONTEND_CORE_EXPORT GetGpgKeyByGpgAbstractKey(GpgAbstractKey* ab_key)
-> GpgKey {
if (!ab_key->IsGood()) return {};
- if (ab_key->IsSubKey()) {
+ if (ab_key->KeyType() == GpgAbstractKeyType::kGPG_SUBKEY) {
auto* s_key = dynamic_cast<GpgSubKey*>(ab_key);
assert(s_key != nullptr);
@@ -370,4 +405,9 @@ auto GPGFRONTEND_CORE_EXPORT GetGpgKeyByGpgAbstractKey(GpgAbstractKey* ab_key)
auto* key = dynamic_cast<GpgKey*>(ab_key);
return *key;
}
+
+auto GPGFRONTEND_CORE_EXPORT IsKeyGroupID(const KeyId& id) -> bool {
+ return id.startsWith("#&");
+}
+
} // namespace GpgFrontend