aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSaturneric <[email protected]>2022-01-03 18:33:35 +0000
committerSaturneric <[email protected]>2022-01-03 18:33:35 +0000
commit9a4fa7019dde788dd337f406dc2d52e4c94b696c (patch)
treec8582139ce865c6f1ab35291d6e36618e09e1131 /src
parent<feature>(ui): default sender gpg key settings in send mail. (diff)
downloadGpgFrontend-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.cpp3
-rw-r--r--src/gpg/model/GpgKey.h8
-rw-r--r--src/ui/keypair_details/KeyPairDetailTab.cpp71
-rw-r--r--src/ui/keypair_details/KeyPairDetailTab.h2
-rw-r--r--src/ui/keypair_details/KeyPairSubkeyTab.cpp69
-rw-r--r--src/ui/keypair_details/KeyPairSubkeyTab.h3
-rw-r--r--src/ui/widgets/KeyList.cpp5
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);