diff options
author | Saturneric <[email protected]> | 2022-01-03 18:33:35 +0000 |
---|---|---|
committer | Saturneric <[email protected]> | 2022-01-03 18:33:35 +0000 |
commit | 9a4fa7019dde788dd337f406dc2d52e4c94b696c (patch) | |
tree | c8582139ce865c6f1ab35291d6e36618e09e1131 /src | |
parent | <feature>(ui): default sender gpg key settings in send mail. (diff) | |
download | GpgFrontend-9a4fa7019dde788dd337f406dc2d52e4c94b696c.tar.gz GpgFrontend-9a4fa7019dde788dd337f406dc2d52e4c94b696c.zip |
<fix, feature>(core, ui): add key in smart card support.
1.fix problem that when key is in a smart card, the result of FetchKey() is not equal with which provided by GetKey().
Diffstat (limited to 'src')
-rw-r--r-- | src/gpg/function/GpgKeyGetter.cpp | 3 | ||||
-rw-r--r-- | src/gpg/model/GpgKey.h | 8 | ||||
-rw-r--r-- | src/ui/keypair_details/KeyPairDetailTab.cpp | 71 | ||||
-rw-r--r-- | src/ui/keypair_details/KeyPairDetailTab.h | 2 | ||||
-rw-r--r-- | src/ui/keypair_details/KeyPairSubkeyTab.cpp | 69 | ||||
-rw-r--r-- | src/ui/keypair_details/KeyPairSubkeyTab.h | 3 | ||||
-rw-r--r-- | src/ui/widgets/KeyList.cpp | 5 |
7 files changed, 100 insertions, 61 deletions
diff --git a/src/gpg/function/GpgKeyGetter.cpp b/src/gpg/function/GpgKeyGetter.cpp index 3457a8a7..248e5630 100644 --- a/src/gpg/function/GpgKeyGetter.cpp +++ b/src/gpg/function/GpgKeyGetter.cpp @@ -58,7 +58,8 @@ GpgFrontend::KeyLinkListPtr GpgFrontend::GpgKeyGetter::FetchKey() { gpgme_key_t key; while ((err = gpgme_op_keylist_next(ctx, &key)) == GPG_ERR_NO_ERROR) { - keys_list->push_back(GpgKey(std::move(key))); + keys_list->push_back(GetKey(key->fpr)); + auto& _key = keys_list->back(); } assert(check_gpg_error_2_err_code(err, GPG_ERR_EOF) == GPG_ERR_EOF); diff --git a/src/gpg/model/GpgKey.h b/src/gpg/model/GpgKey.h index fb7d5735..3336f39e 100644 --- a/src/gpg/model/GpgKey.h +++ b/src/gpg/model/GpgKey.h @@ -108,6 +108,14 @@ class GpgKey { [[nodiscard]] bool CanAuthActual() const; + [[nodiscard]] bool HasCardKey() const { + auto subkeys = subKeys(); + return std::any_of(subkeys->begin(), subkeys->end(), + [](const GpgSubKey& subkey) -> bool { + if (subkey.is_cardkey()) return true; + }); + } + [[nodiscard]] bool is_private_key() const { return _key_ref->secret; } [[nodiscard]] bool expired() const { return _key_ref->expired; } diff --git a/src/ui/keypair_details/KeyPairDetailTab.cpp b/src/ui/keypair_details/KeyPairDetailTab.cpp index b3a5e296..49593d01 100644 --- a/src/ui/keypair_details/KeyPairDetailTab.cpp +++ b/src/ui/keypair_details/KeyPairDetailTab.cpp @@ -31,7 +31,10 @@ namespace GpgFrontend::UI { KeyPairDetailTab::KeyPairDetailTab(const std::string& key_id, QWidget* parent) - : QWidget(parent), mKey(GpgKeyGetter::GetInstance().GetKey(key_id)) { + : QWidget(parent), key_(GpgKeyGetter::GetInstance().GetKey(key_id)) { + + LOG(INFO) << key_.email() <<key_.is_private_key() << key_.has_master_key() << key_.subKeys()->front().is_private_key(); + ownerBox = new QGroupBox(_("Owner")); keyBox = new QGroupBox(_("Primary Key")); fingerprintBox = new QGroupBox(_("Fingerprint")); @@ -163,20 +166,20 @@ void KeyPairDetailTab::slotCopyFingerprint() { void KeyPairDetailTab::slotRefreshKeyInfo() { // Show the situation that primary key not exists. - masterKeyExistVarLabel->setText(mKey.has_master_key() ? _("Exists") + masterKeyExistVarLabel->setText(key_.has_master_key() ? _("Exists") : _("Not Exists")); - if (!mKey.has_master_key()) { - auto paletteExpired = masterKeyExistVarLabel->palette(); - paletteExpired.setColor(masterKeyExistVarLabel->foregroundRole(), Qt::red); - masterKeyExistVarLabel->setPalette(paletteExpired); + if (!key_.has_master_key()) { + auto palette_expired = masterKeyExistVarLabel->palette(); + palette_expired.setColor(masterKeyExistVarLabel->foregroundRole(), Qt::red); + masterKeyExistVarLabel->setPalette(palette_expired); } else { - auto paletteValid = masterKeyExistVarLabel->palette(); - paletteValid.setColor(masterKeyExistVarLabel->foregroundRole(), - Qt::darkGreen); - masterKeyExistVarLabel->setPalette(paletteValid); + auto palette_valid = masterKeyExistVarLabel->palette(); + palette_valid.setColor(masterKeyExistVarLabel->foregroundRole(), + Qt::darkGreen); + masterKeyExistVarLabel->setPalette(palette_valid); } - if (mKey.expired()) { + if (key_.expired()) { auto paletteExpired = expireVarLabel->palette(); paletteExpired.setColor(expireVarLabel->foregroundRole(), Qt::red); expireVarLabel->setPalette(paletteExpired); @@ -186,67 +189,67 @@ void KeyPairDetailTab::slotRefreshKeyInfo() { expireVarLabel->setPalette(paletteValid); } - nameVarLabel->setText(QString::fromStdString(mKey.name())); - emailVarLabel->setText(QString::fromStdString(mKey.email())); + nameVarLabel->setText(QString::fromStdString(key_.name())); + emailVarLabel->setText(QString::fromStdString(key_.email())); - commentVarLabel->setText(QString::fromStdString(mKey.comment())); - keyidVarLabel->setText(QString::fromStdString(mKey.id())); + commentVarLabel->setText(QString::fromStdString(key_.comment())); + keyidVarLabel->setText(QString::fromStdString(key_.id())); std::stringstream usage_steam; - if (mKey.can_certify()) usage_steam << _("Certificate") << " "; - if (mKey.can_encrypt()) usage_steam << _("Encrypt") << " "; - if (mKey.can_sign()) usage_steam << _("Sign") << " "; - if (mKey.can_authenticate()) usage_steam << _("Auth") << " "; + if (key_.can_certify()) usage_steam << _("Certificate") << " "; + if (key_.can_encrypt()) usage_steam << _("Encrypt") << " "; + if (key_.can_sign()) usage_steam << _("Sign") << " "; + if (key_.can_authenticate()) usage_steam << _("Auth") << " "; usageVarLabel->setText(usage_steam.str().c_str()); std::stringstream actual_usage_steam; - if (mKey.CanCertActual()) actual_usage_steam << _("Certificate") << " "; - if (mKey.CanEncrActual()) actual_usage_steam << _("Encrypt") << " "; - if (mKey.CanSignActual()) actual_usage_steam << _("Sign") << " "; - if (mKey.CanAuthActual()) actual_usage_steam << _("Auth") << " "; + if (key_.CanCertActual()) actual_usage_steam << _("Certificate") << " "; + if (key_.CanEncrActual()) actual_usage_steam << _("Encrypt") << " "; + if (key_.CanSignActual()) actual_usage_steam << _("Sign") << " "; + if (key_.CanAuthActual()) actual_usage_steam << _("Auth") << " "; actualUsageVarLabel->setText(actual_usage_steam.str().c_str()); std::string key_size_val, key_expire_val, key_create_time_val, key_algo_val, key_last_update_val; - key_size_val = std::to_string(mKey.length()); + key_size_val = std::to_string(key_.length()); - if (to_time_t(boost::posix_time::ptime(mKey.expires())) == 0) { + if (to_time_t(boost::posix_time::ptime(key_.expires())) == 0) { expireVarLabel->setText(_("Never Expire")); } else { expireVarLabel->setText(QLocale::system().toString( - QDateTime::fromTime_t(to_time_t(mKey.expires())))); + QDateTime::fromTime_t(to_time_t(key_.expires())))); } - key_algo_val = mKey.pubkey_algo(); + key_algo_val = key_.pubkey_algo(); createdVarLabel->setText(QLocale::system().toString( - QDateTime::fromTime_t(to_time_t(mKey.create_time())))); + QDateTime::fromTime_t(to_time_t(key_.create_time())))); - if (to_time_t(boost::posix_time::ptime(mKey.last_update())) == 0) { + if (to_time_t(boost::posix_time::ptime(key_.last_update())) == 0) { lastUpdateVarLabel->setText(_("No Data")); } else { lastUpdateVarLabel->setText(QLocale::system().toString( - QDateTime::fromTime_t(to_time_t(mKey.last_update())))); + QDateTime::fromTime_t(to_time_t(key_.last_update())))); } keySizeVarLabel->setText(key_size_val.c_str()); algorithmVarLabel->setText(key_algo_val.c_str()); - fingerPrintVarLabel->setText(beautify_fingerprint(mKey.fpr()).c_str()); + fingerPrintVarLabel->setText(beautify_fingerprint(key_.fpr()).c_str()); iconLabel->hide(); expLabel->hide(); - if (mKey.expired()) { + if (key_.expired()) { iconLabel->show(); expLabel->show(); expLabel->setText(_("Warning: The primary key has expired.")); } - if (mKey.revoked()) { + if (key_.revoked()) { iconLabel->show(); expLabel->show(); expLabel->setText(_("Warning: The primary key has been revoked.")); @@ -255,7 +258,7 @@ void KeyPairDetailTab::slotRefreshKeyInfo() { void KeyPairDetailTab::slotRefreshKey() { LOG(INFO) << _("Called"); - this->mKey = GpgKeyGetter::GetInstance().GetKey(mKey.id()); + this->key_ = GpgKeyGetter::GetInstance().GetKey(key_.id()); this->slotRefreshKeyInfo(); } diff --git a/src/ui/keypair_details/KeyPairDetailTab.h b/src/ui/keypair_details/KeyPairDetailTab.h index 2006290b..151d8fc7 100644 --- a/src/ui/keypair_details/KeyPairDetailTab.h +++ b/src/ui/keypair_details/KeyPairDetailTab.h @@ -48,7 +48,7 @@ class KeyPairDetailTab : public QWidget { void slotRefreshKey(); private: - GpgKey mKey; + GpgKey key_; QGroupBox* ownerBox; /** Groupbox containing owner information */ QGroupBox* keyBox; /** Groupbox containing key information */ diff --git a/src/ui/keypair_details/KeyPairSubkeyTab.cpp b/src/ui/keypair_details/KeyPairSubkeyTab.cpp index 928baae9..a80eb5e4 100644 --- a/src/ui/keypair_details/KeyPairSubkeyTab.cpp +++ b/src/ui/keypair_details/KeyPairSubkeyTab.cpp @@ -30,7 +30,10 @@ namespace GpgFrontend::UI { KeyPairSubkeyTab::KeyPairSubkeyTab(const std::string& key_id, QWidget* parent) - : QWidget(parent), mKey(GpgKeyGetter::GetInstance().GetKey(key_id)) { + : QWidget(parent), key_(GpgKeyGetter::GetInstance().GetKey(key_id)) { + + LOG(INFO) << key_.email() <<key_.is_private_key() << key_.has_master_key() << key_.subKeys()->front().is_private_key(); + createSubkeyList(); createSubkeyOperaMenu(); @@ -40,7 +43,7 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(const std::string& key_id, QWidget* parent) auto uidButtonsLayout = new QGridLayout(); auto addSubkeyButton = new QPushButton(_("Generate A New Subkey")); - if (!mKey.is_private_key() || !mKey.has_master_key()) { + if (!key_.is_private_key() || !key_.has_master_key()) { addSubkeyButton->setDisabled(true); setHidden(addSubkeyButton); } @@ -68,17 +71,20 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(const std::string& key_id, QWidget* parent) new QLabel(QString(_("Create Date (Local Time)")) + ": "), 5, 0); subkeyDetailLayout->addWidget(new QLabel(QString(_("Existence")) + ": "), 6, 0); - subkeyDetailLayout->addWidget(new QLabel(QString(_("Fingerprint")) + ": "), 7, + subkeyDetailLayout->addWidget( + new QLabel(QString(_("Key in Smart Card")) + ": "), 7, 0); + subkeyDetailLayout->addWidget(new QLabel(QString(_("Fingerprint")) + ": "), 8, 0); - keyidVarLabel = new QLabel(); - keySizeVarLabel = new QLabel(); - expireVarLabel = new QLabel(); - algorithmVarLabel = new QLabel(); - createdVarLabel = new QLabel(); - usageVarLabel = new QLabel(); - masterKeyExistVarLabel = new QLabel(); - fingerPrintVarLabel = new QLabel(); + keyidVarLabel = new QLabel(this); + keySizeVarLabel = new QLabel(this); + expireVarLabel = new QLabel(this); + algorithmVarLabel = new QLabel(this); + createdVarLabel = new QLabel(this); + usageVarLabel = new QLabel(this); + masterKeyExistVarLabel = new QLabel(this); + fingerPrintVarLabel = new QLabel(this); + cardKeyLabel = new QLabel(this); subkeyDetailLayout->addWidget(keyidVarLabel, 0, 1, 1, 1); subkeyDetailLayout->addWidget(keySizeVarLabel, 2, 1, 1, 2); @@ -87,7 +93,8 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(const std::string& key_id, QWidget* parent) subkeyDetailLayout->addWidget(createdVarLabel, 5, 1, 1, 2); subkeyDetailLayout->addWidget(usageVarLabel, 3, 1, 1, 2); subkeyDetailLayout->addWidget(masterKeyExistVarLabel, 6, 1, 1, 2); - subkeyDetailLayout->addWidget(fingerPrintVarLabel, 7, 1, 1, 2); + subkeyDetailLayout->addWidget(cardKeyLabel, 7, 1, 1, 2); + subkeyDetailLayout->addWidget(fingerPrintVarLabel, 8, 1, 1, 2); auto* copyKeyIdButton = new QPushButton(_("Copy")); copyKeyIdButton->setFlat(true); @@ -157,7 +164,7 @@ void KeyPairSubkeyTab::slotRefreshSubkeyList() { subkeyList->setSelectionMode(QAbstractItemView::SingleSelection); this->buffered_subkeys.clear(); - auto sub_keys = mKey.subKeys(); + auto sub_keys = key_.subKeys(); for (auto& sub_key : *sub_keys) { if (sub_key.disabled() || sub_key.revoked()) continue; this->buffered_subkeys.push_back(std::move(sub_key)); @@ -207,7 +214,7 @@ void KeyPairSubkeyTab::slotRefreshSubkeyList() { } void KeyPairSubkeyTab::slotAddSubkey() { - auto dialog = new SubkeyGenerateDialog(mKey.id(), this); + auto dialog = new SubkeyGenerateDialog(key_.id(), this); dialog->show(); } @@ -248,18 +255,32 @@ void KeyPairSubkeyTab::slotRefreshSubkeyDetail() { usageVarLabel->setText(usage_steam.str().c_str()); - // Show the situation that primary key not exists. + // Show the situation that secret key not exists. masterKeyExistVarLabel->setText(subkey.secret() ? _("Exists") : _("Not Exists")); + + // Show the situation if key in a smart card. + cardKeyLabel->setText(subkey.is_cardkey() ? _("Yes") : _("No")); + if (!subkey.secret()) { - auto paletteExpired = masterKeyExistVarLabel->palette(); - paletteExpired.setColor(masterKeyExistVarLabel->foregroundRole(), Qt::red); - masterKeyExistVarLabel->setPalette(paletteExpired); + auto palette_expired = masterKeyExistVarLabel->palette(); + palette_expired.setColor(masterKeyExistVarLabel->foregroundRole(), Qt::red); + masterKeyExistVarLabel->setPalette(palette_expired); + } else { + auto palette_valid = masterKeyExistVarLabel->palette(); + palette_valid.setColor(masterKeyExistVarLabel->foregroundRole(), + Qt::darkGreen); + masterKeyExistVarLabel->setPalette(palette_valid); + } + + if (!subkey.is_cardkey()) { + auto palette_expired = cardKeyLabel->palette(); + palette_expired.setColor(cardKeyLabel->foregroundRole(), Qt::red); + cardKeyLabel->setPalette(palette_expired); } else { - auto paletteValid = masterKeyExistVarLabel->palette(); - paletteValid.setColor(masterKeyExistVarLabel->foregroundRole(), - Qt::darkGreen); - masterKeyExistVarLabel->setPalette(paletteValid); + auto palette_valid = cardKeyLabel->palette(); + palette_valid.setColor(cardKeyLabel->foregroundRole(), Qt::darkGreen); + cardKeyLabel->setPalette(palette_valid); } fingerPrintVarLabel->setText(QString::fromStdString(subkey.fpr())); @@ -279,7 +300,7 @@ void KeyPairSubkeyTab::slotEditSubkey() { LOG(INFO) << "Fpr" << getSelectedSubkey().fpr(); auto dialog = - new KeySetExpireDateDialog(mKey.id(), getSelectedSubkey().fpr(), this); + new KeySetExpireDateDialog(key_.id(), getSelectedSubkey().fpr(), this); dialog->show(); } @@ -302,7 +323,7 @@ const GpgSubKey& KeyPairSubkeyTab::getSelectedSubkey() { return buffered_subkeys[row]; } void KeyPairSubkeyTab::slotRefreshKeyInfo() { - mKey = GpgKeyGetter::GetInstance().GetKey(mKey.id()); + key_ = GpgKeyGetter::GetInstance().GetKey(key_.id()); } } // namespace GpgFrontend::UI diff --git a/src/ui/keypair_details/KeyPairSubkeyTab.h b/src/ui/keypair_details/KeyPairSubkeyTab.h index 8922e723..f254fed0 100644 --- a/src/ui/keypair_details/KeyPairSubkeyTab.h +++ b/src/ui/keypair_details/KeyPairSubkeyTab.h @@ -45,7 +45,7 @@ class KeyPairSubkeyTab : public QWidget { const GpgSubKey& getSelectedSubkey(); - GpgKey mKey; + GpgKey key_; QTableWidget* subkeyList{}; std::vector<GpgSubKey> buffered_subkeys; @@ -62,6 +62,7 @@ class KeyPairSubkeyTab : public QWidget { QLabel* fingerPrintVarLabel; /** Label containing the keys fingerprint */ QLabel* usageVarLabel; QLabel* masterKeyExistVarLabel; + QLabel* cardKeyLabel; private slots: diff --git a/src/ui/widgets/KeyList.cpp b/src/ui/widgets/KeyList.cpp index 02a8dd92..89634f95 100644 --- a/src/ui/widgets/KeyList.cpp +++ b/src/ui/widgets/KeyList.cpp @@ -583,6 +583,11 @@ void KeyTable::Refresh(KeyLinkListPtr m_keys) { if (it->is_private_key() && !it->has_master_key()) { type_steam << "#"; } + + if(it->HasCardKey()) { + type_steam << "^"; + } + auto* tmp1 = new QTableWidgetItem(type_str); key_list->setItem(row_index, 1, tmp1); |