diff options
Diffstat (limited to 'src/gpg/GpgKey.cpp')
-rw-r--r-- | src/gpg/GpgKey.cpp | 265 |
1 files changed, 28 insertions, 237 deletions
diff --git a/src/gpg/GpgKey.cpp b/src/gpg/GpgKey.cpp index cd62fc5d..47cc32f1 100644 --- a/src/gpg/GpgKey.cpp +++ b/src/gpg/GpgKey.cpp @@ -22,253 +22,44 @@ * */ -#include "gpg/GpgKey.h" +#include "gpg/model/GpgKey.h" -void GpgKey::parse(gpgme_key_t key) { - - if(key == nullptr) return; - - good = true; - key_refer = key; - gpgme_key_ref(key_refer); - - is_private_key = key->secret; - fpr = key->fpr; - protocol = key->protocol; - expired = (key->expired != 0u); - revoked = (key->revoked != 0u); - - disabled = key->disabled; - - can_authenticate = key->can_authenticate; - can_certify = key->can_certify; - can_encrypt = key->can_encrypt; - can_sign = key->can_sign; - - last_update = QDateTime(QDateTime::fromTime_t(key->last_update)); - - switch (key->owner_trust) { - case GPGME_VALIDITY_UNKNOWN: - owner_trust = "Unknown"; - break; - case GPGME_VALIDITY_UNDEFINED: - owner_trust = "Undefined"; - break; - case GPGME_VALIDITY_NEVER: - owner_trust = "Never"; - break; - case GPGME_VALIDITY_MARGINAL: - owner_trust = "Marginal"; - break; - case GPGME_VALIDITY_FULL: - owner_trust = "FULL"; - break; - case GPGME_VALIDITY_ULTIMATE: - owner_trust = "Ultimate"; - break; - } - - uids.clear(); - auto uid = key->uids; - - while (uid != nullptr) { - uids.push_back(GpgUID(uid)); - uid = uid->next; - } - - if (!uids.isEmpty()) { - name = uids.first().name; - email = uids.first().email; - comment = uids.first().comment; - } - - subKeys.clear(); - auto next = key->subkeys; - - while (next != nullptr) { - subKeys.push_back(GpgSubKey(next)); - next = next->next; - } - - if (!subKeys.isEmpty()) { - id = subKeys.first().id; - expires = subKeys.first().expires; - pubkey_algo = subKeys.first().pubkey_algo; - create_time = subKeys.first().timestamp; - length = subKeys.first().length; - has_master_key = subKeys.first().secret; - } else { - id = ""; - } - -} - -GpgKey::GpgKey(GpgKey &&k) noexcept { - - id = std::move(k.id); - name = std::move(k.name); - email = std::move(k.email); - comment = std::move(k.comment); - fpr = std::move(k.fpr); - protocol = std::move(k.protocol); - owner_trust = std::move(k.owner_trust); - pubkey_algo = std::move(k.pubkey_algo); - last_update = std::move(k.last_update); - expires = std::move(k.expires); - create_time = std::move(k.create_time); - - length = k.length; - k.length = 0; - - can_encrypt = k.can_encrypt; - can_sign = k.can_sign; - can_certify = k.can_certify; - can_authenticate = k.can_authenticate; - - - is_private_key = k.is_private_key; - expired = k.expired; - revoked = k.revoked; - disabled = k.disabled; - k.has_master_key = k.has_master_key; - - good = k.good; - k.good = false; - - subKeys = std::move(k.subKeys); - uids = std::move(k.uids); - - key_refer = k.key_refer; - k.key_refer = nullptr; - -} - -GpgKey &GpgKey::operator=(const GpgKey &k) { - - id = k.id; - name = k.name; - email = k.email; - comment = k.comment; - fpr = k.fpr; - protocol = k.protocol; - owner_trust = k.owner_trust; - pubkey_algo = k.pubkey_algo; - last_update = k.last_update; - expires = k.expires; - create_time = k.create_time; - - length = k.length; - - can_encrypt = k.can_encrypt; - can_sign = k.can_sign; - can_certify = k.can_certify; - can_authenticate = k.can_authenticate; - - is_private_key = k.is_private_key; - expired = k.expired; - revoked = k.revoked; - disabled = k.disabled; - - has_master_key = k.has_master_key; - - good = k.good; - - subKeys = k.subKeys; - uids = k.uids; - - key_refer = k.key_refer; - gpgme_key_ref(key_refer); - - return *this; -} - -GpgKey::GpgKey(const GpgKey &k) : - id(k.id), name(k.name), email(k.email), comment(k.comment), - fpr(k.fpr), protocol(k.protocol), owner_trust(k.owner_trust), - pubkey_algo(k.pubkey_algo), last_update(k.last_update), - expires(k.expires), create_time(k.create_time){ - - length = k.length; - - can_encrypt = k.can_encrypt; - can_sign = k.can_sign; - can_certify = k.can_certify; - can_authenticate = k.can_authenticate; - - is_private_key = k.is_private_key; - expired = k.expired; - revoked = k.revoked; - disabled = k.disabled; - - has_master_key = k.has_master_key; - - good = k.good; - - subKeys = k.subKeys; - uids = k.uids; - - key_refer = k.key_refer; - gpgme_key_ref(key_refer); +GpgFrontend::GpgKey::GpgKey(gpgme_key_t &&key) : _key_ref(key, [&](gpgme_key_t key) { gpgme_key_release(key); }) {} +GpgFrontend::GpgKey::GpgKey(GpgKey &&k) noexcept { + swap(_key_ref, k._key_ref); } -GpgKey &GpgKey::operator=(GpgKey &&k) noexcept { - - id = std::move(k.id); - name = std::move(k.name); - email = std::move(k.email); - comment = std::move(k.comment); - fpr = std::move(k.fpr); - protocol = std::move(k.protocol); - owner_trust = std::move(k.owner_trust); - pubkey_algo = std::move(k.pubkey_algo); - last_update = std::move(k.last_update); - expires = std::move(k.expires); - create_time = std::move(k.create_time); - - length = k.length; - k.length = 0; - - can_encrypt = k.can_encrypt; - can_sign = k.can_sign; - can_certify = k.can_certify; - can_authenticate = k.can_authenticate; - - - is_private_key = k.is_private_key; - expired = k.expired; - revoked = k.revoked; - disabled = k.disabled; - - has_master_key = k.has_master_key; - - good = k.good; - k.good = false; - - subKeys = std::move(k.subKeys); - uids = std::move(k.uids); - - key_refer = k.key_refer; - k.key_refer = nullptr; - +GpgFrontend::GpgKey &GpgFrontend::GpgKey::operator=(GpgKey &&k) noexcept { + swap(_key_ref, k._key_ref); return *this; } -GpgKey::~GpgKey() { - if(key_refer != nullptr && good) { - gpgme_key_unref(key_refer); +std::unique_ptr<std::vector<GpgFrontend::GpgSubKey>> GpgFrontend::GpgKey::subKeys() const { + auto p_keys = std::make_unique<std::vector<GpgSubKey>>(); + auto next = _key_ref->subkeys; + while (next != nullptr) { + p_keys->push_back(std::move(GpgSubKey(next))); + next = next->next; } + return p_keys; } -GpgKey::GpgKey(gpgme_key_t key) { - parse(key); +std::unique_ptr<std::vector<GpgFrontend::GpgUID>> GpgFrontend::GpgKey::uids() const { + auto p_uids = std::make_unique<std::vector<GpgUID>>(); + auto uid_next = _key_ref->uids; + while (uid_next != nullptr) { + p_uids->push_back(std::move(GpgUID(uid_next))); + uid_next = uid_next->next; + } + return p_uids; } -void GpgKey::swapKeyRefer(gpgme_key_t key) { - - if(key == nullptr) return; - - gpgme_key_unref(key_refer); - key_refer = nullptr; - parse(key); +bool GpgFrontend::GpgKey::canSignActual() const { + auto subkeys = subKeys(); + if (std::any_of(subkeys->begin(), subkeys->end(), [](const GpgSubKey &subkey) -> bool { + return subkey.secret() && subkey.can_sign() && !subkey.disabled() && !subkey.revoked() && !subkey.expired(); + })) + return true; + else return false; } |