/** * This file is part of GpgFrontend. * * GpgFrontend is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Foobar is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Foobar. If not, see . * * The initial version of the source code is inherited from gpg4usb-team. * Their source code version also complies with GNU General Public License. * * The source code version of this software was modified and released * by Saturneric starting on May 12, 2021. * */ #ifndef GPGFRONTEND_GPGKEY_H #define GPGFRONTEND_GPGKEY_H #include #include #include "GpgSubKey.h" #include "GpgUID.h" namespace GpgFrontend { class GpgKey { public: [[nodiscard]] bool good() const { return _key_ref != nullptr; } [[nodiscard]] std::string id() const { return _key_ref->subkeys->keyid; } [[nodiscard]] std::string name() const { return _key_ref->uids->name; }; [[nodiscard]] std::string email() const { return _key_ref->uids->email; } [[nodiscard]] std::string comment() const { return _key_ref->uids->comment; } [[nodiscard]] std::string fpr() const { return _key_ref->fpr; } [[nodiscard]] std::string protocol() const { return gpgme_get_protocol_name(_key_ref->protocol); } [[nodiscard]] std::string owner_trust() const { switch (_key_ref->owner_trust) { case GPGME_VALIDITY_UNKNOWN: return "Unknown"; case GPGME_VALIDITY_UNDEFINED: return "Undefined"; case GPGME_VALIDITY_NEVER: return "Never"; case GPGME_VALIDITY_MARGINAL: return "Marginal"; case GPGME_VALIDITY_FULL: return "FULL"; case GPGME_VALIDITY_ULTIMATE: return "Ultimate"; } return "Invalid"; } [[nodiscard]] std::string pubkey_algo() const { return gpgme_pubkey_algo_name(_key_ref->subkeys->pubkey_algo); } [[nodiscard]] boost::posix_time::ptime last_update() const { return boost::posix_time::from_time_t( static_cast(_key_ref->last_update)); } [[nodiscard]] boost::posix_time::ptime expires() const { return boost::posix_time::from_time_t(_key_ref->subkeys->expires); }; [[nodiscard]] boost::posix_time::ptime create_time() const { return boost::posix_time::from_time_t(_key_ref->subkeys->timestamp); }; [[nodiscard]] unsigned int length() const { return _key_ref->subkeys->length; } [[nodiscard]] bool can_encrypt() const { return _key_ref->can_encrypt; } [[nodiscard]] bool CanEncrActual() const; [[nodiscard]] bool can_sign() const { return _key_ref->can_sign; } [[nodiscard]] bool CanSignActual() const; [[nodiscard]] bool can_certify() const { return _key_ref->can_certify; } [[nodiscard]] bool CanCertActual() const; [[nodiscard]] bool can_authenticate() const { return _key_ref->can_authenticate; } [[nodiscard]] bool CanAuthActual() const; [[nodiscard]] bool HasCardKey() const { auto subkeys = subKeys(); return std::any_of( subkeys->begin(), subkeys->end(), [](const GpgSubKey& subkey) -> bool { return subkey.is_cardkey(); }); } [[nodiscard]] bool is_private_key() const { return _key_ref->secret; } [[nodiscard]] bool expired() const { return _key_ref->expired; } [[nodiscard]] bool revoked() const { return _key_ref->revoked; } [[nodiscard]] bool disabled() const { return _key_ref->disabled; } [[nodiscard]] bool has_master_key() const { return _key_ref->subkeys->secret; } [[nodiscard]] std::unique_ptr> subKeys() const; [[nodiscard]] std::unique_ptr> uids() const; GpgKey() = default; explicit GpgKey(gpgme_key_t&& key); ~GpgKey() = default; GpgKey(const gpgme_key_t& key) = delete; GpgKey(GpgKey&& k) noexcept; GpgKey& operator=(GpgKey&& k) noexcept; GpgKey& operator=(const gpgme_key_t& key) = delete; bool operator==(const GpgKey& o) const { return o.id() == this->id(); } bool operator<=(const GpgKey& o) const { return this->id() < o.id(); } explicit operator gpgme_key_t() const { return _key_ref.get(); } [[nodiscard]] GpgKey copy() const { gpgme_key_ref(_key_ref.get()); auto* _new_key_ref = _key_ref.get(); return GpgKey(std::move(_new_key_ref)); } private: struct _key_ref_deletor { void operator()(gpgme_key_t _key) { if (_key != nullptr) gpgme_key_unref(_key); } }; using KeyRefHandler = std::unique_ptr; KeyRefHandler _key_ref = nullptr; }; } // namespace GpgFrontend #endif // GPGFRONTEND_GPGKEY_H