aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSaturneric <[email protected]>2021-06-03 20:24:45 +0000
committerSaturneric <[email protected]>2021-06-03 20:24:45 +0000
commit5071d17e6e4cfceffb7c735c7714206dddc688a9 (patch)
treef9fbf5769c472b57021032484a8c0f5508ae4b85
parentAdd and change the expiration date of the key pair. (diff)
downloadGpgFrontend-5071d17e6e4cfceffb7c735c7714206dddc688a9.tar.gz
GpgFrontend-5071d17e6e4cfceffb7c735c7714206dddc688a9.zip
Add an operation to change the expiration date of the subkey.
Add reminder of expiration of subkey. Fixed the issue of incomplete display of KeyList for past key strikethrough. Improve the expiration prompt for the key pair master key. Add support for the case where the master key does not exist. Add support for the case where the subkey does not exist. Prompt the user when the master key does not exist. Improve the filtering conditions for the key list that meets the key signatures. Fix some spelling errors. Signed-off-by: Saturneric <[email protected]>
Diffstat (limited to '')
-rw-r--r--include/gpg/GpgKey.h2
-rw-r--r--include/gpg/GpgSubKey.h1
-rw-r--r--include/ui/keypair_details/KeyPairDetailTab.h1
-rw-r--r--include/ui/keypair_details/KeyPairSubkeyTab.h9
-rw-r--r--include/ui/keypair_details/KeySetExpireDateDialog.h26
-rw-r--r--src/gpg/GpgContext.cpp4
-rw-r--r--src/gpg/GpgKey.cpp8
-rw-r--r--src/gpg/GpgSubKey.cpp5
-rw-r--r--src/ui/keypair_details/KeyPairDetailTab.cpp32
-rw-r--r--src/ui/keypair_details/KeyPairSubkeyTab.cpp69
-rw-r--r--src/ui/keypair_details/KeyPairUIDTab.cpp2
-rw-r--r--src/ui/keypair_details/KeySetExpireDateDialog.cpp28
-rw-r--r--src/ui/keypair_details/KeyUIDSignDialog.cpp2
-rw-r--r--src/ui/widgets/KeyList.cpp34
14 files changed, 183 insertions, 40 deletions
diff --git a/include/gpg/GpgKey.h b/include/gpg/GpgKey.h
index ec796780..f83a2a1e 100644
--- a/include/gpg/GpgKey.h
+++ b/include/gpg/GpgKey.h
@@ -56,6 +56,8 @@ public:
bool revoked{};
bool disabled{};
+ bool has_master_key{};
+
bool good = false;
QVector<GpgSubKey> subKeys;
diff --git a/include/gpg/GpgSubKey.h b/include/gpg/GpgSubKey.h
index 229e04c9..f2da9e9e 100644
--- a/include/gpg/GpgSubKey.h
+++ b/include/gpg/GpgSubKey.h
@@ -45,6 +45,7 @@ struct GpgSubKey {
bool expired{};
bool revoked{};
bool disabled{};
+ bool secret{};
bool is_cardkey{};
QDateTime timestamp;
diff --git a/include/ui/keypair_details/KeyPairDetailTab.h b/include/ui/keypair_details/KeyPairDetailTab.h
index 6b3bc2f0..d081ac46 100644
--- a/include/ui/keypair_details/KeyPairDetailTab.h
+++ b/include/ui/keypair_details/KeyPairDetailTab.h
@@ -77,6 +77,7 @@ private:
QLabel *keyidVarLabel; /** Label containng the keys keyid */
QLabel *fingerPrintVarLabel; /** Label containng the keys fingerprint */
QLabel *usageVarLabel;
+ QLabel *masterKeyExistVarLabel;
public:
explicit KeyPairDetailTab(GpgME::GpgContext *ctx, const GpgKey& mKey, QWidget *parent = nullptr);
diff --git a/include/ui/keypair_details/KeyPairSubkeyTab.h b/include/ui/keypair_details/KeyPairSubkeyTab.h
index ae954968..41bb0648 100644
--- a/include/ui/keypair_details/KeyPairSubkeyTab.h
+++ b/include/ui/keypair_details/KeyPairSubkeyTab.h
@@ -29,6 +29,7 @@
#include "gpg/GpgContext.h"
#include "ui/keygen/SubkeyGenerateDialog.h"
+#include "KeySetExpireDateDialog.h"
class KeyPairSubkeyTab : public QWidget {
Q_OBJECT
@@ -43,6 +44,8 @@ private:
void createSubkeyOperaMenu();
+ const GpgSubKey *getSelectedSubkey();
+
GpgME::GpgContext *mCtx;
const GpgKey &mKey;
QTableWidget *subkeyList;
@@ -61,6 +64,7 @@ private:
QLabel *keyidVarLabel; /** Label containng the keys keyid */
QLabel *fingerPrintVarLabel; /** Label containng the keys fingerprint */
QLabel *usageVarLabel;
+ QLabel *masterKeyExistVarLabel;
private slots:
@@ -75,6 +79,11 @@ private slots:
void slotRevokeSubkey();
+protected:
+
+ void contextMenuEvent(QContextMenuEvent *event) override;
+
+
};
diff --git a/include/ui/keypair_details/KeySetExpireDateDialog.h b/include/ui/keypair_details/KeySetExpireDateDialog.h
index d0206402..118bc5ed 100644
--- a/include/ui/keypair_details/KeySetExpireDateDialog.h
+++ b/include/ui/keypair_details/KeySetExpireDateDialog.h
@@ -1,6 +1,26 @@
-//
-// Created by eric on 2021/6/3.
-//
+/**
+ * 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 <https://www.gnu.org/licenses/>.
+ *
+ * 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<[email protected]> starting on May 12, 2021.
+ *
+ */
#ifndef GPGFRONTEND_KEYSETEXPIREDATEDIALOG_H
#define GPGFRONTEND_KEYSETEXPIREDATEDIALOG_H
diff --git a/src/gpg/GpgContext.cpp b/src/gpg/GpgContext.cpp
index d6211616..07e0c8fa 100644
--- a/src/gpg/GpgContext.cpp
+++ b/src/gpg/GpgContext.cpp
@@ -607,7 +607,7 @@ namespace GpgME {
void GpgContext::checkErr(gpgme_error_t gpgmeError) {
//if (gpgmeError != GPG_ERR_NO_ERROR && gpgmeError != GPG_ERR_CANCELED) {
- if (gpgmeError != GPG_ERR_NO_ERROR) {
+ if (gpg_err_code(gpgmeError) != GPG_ERR_NO_ERROR) {
qDebug() << "[Error " << gpg_err_code(gpgmeError)
<< "] Source: " << gpgme_strsource(gpgmeError) << " Description: " << gpgErrString(gpgmeError);
}
@@ -992,7 +992,7 @@ namespace GpgME {
auto gpgmeError = gpgme_op_revsig(mCtx, key.key_refer,
signing_key.key_refer,
signature.uid.toUtf8().constData(), 0);
- if(gpgmeError == GPG_ERR_NO_ERROR) {
+ if(gpg_err_code(gpgmeError) == GPG_ERR_NO_ERROR) {
emit signalKeyUpdated(key.id);
return true;
}
diff --git a/src/gpg/GpgKey.cpp b/src/gpg/GpgKey.cpp
index bcacc8c3..df4b05ca 100644
--- a/src/gpg/GpgKey.cpp
+++ b/src/gpg/GpgKey.cpp
@@ -96,6 +96,7 @@ void GpgKey::parse(gpgme_key_t key) {
pubkey_algo = subKeys.first().pubkey_algo;
create_time = subKeys.first().timestamp;
length = subKeys.first().length;
+ has_master_key = subKeys.first().secret;
} else {
id = "";
}
@@ -129,6 +130,7 @@ GpgKey::GpgKey(GpgKey &&k) noexcept {
expired = k.expired;
revoked = k.revoked;
disabled = k.disabled;
+ k.has_master_key = k.has_master_key;
good = k.good;
k.good = false;
@@ -167,6 +169,8 @@ GpgKey &GpgKey::operator=(const GpgKey &k) {
revoked = k.revoked;
disabled = k.disabled;
+ has_master_key = k.has_master_key;
+
good = k.good;
subKeys = k.subKeys;
@@ -196,6 +200,8 @@ GpgKey::GpgKey(const GpgKey &k) :
revoked = k.revoked;
disabled = k.disabled;
+ has_master_key = k.has_master_key;
+
good = k.good;
subKeys = k.subKeys;
@@ -234,6 +240,8 @@ GpgKey &GpgKey::operator=(GpgKey &&k) noexcept {
revoked = k.revoked;
disabled = k.disabled;
+ has_master_key = k.has_master_key;
+
good = k.good;
k.good = false;
diff --git a/src/gpg/GpgSubKey.cpp b/src/gpg/GpgSubKey.cpp
index 0f8e279f..4adda132 100644
--- a/src/gpg/GpgSubKey.cpp
+++ b/src/gpg/GpgSubKey.cpp
@@ -31,8 +31,9 @@ GpgSubKey::GpgSubKey(gpgme_subkey_t key) {
pubkey_algo = gpgme_pubkey_algo_name(key->pubkey_algo);
fpr = key->fpr;
- expired = (key->expired != 0u);
- revoked = (key->revoked != 0u);
+ expired = key->expired;
+ revoked = key->revoked;
+ secret = key->secret;
disabled = key->disabled;
diff --git a/src/ui/keypair_details/KeyPairDetailTab.cpp b/src/ui/keypair_details/KeyPairDetailTab.cpp
index 15dfb661..5ba8d1e9 100644
--- a/src/ui/keypair_details/KeyPairDetailTab.cpp
+++ b/src/ui/keypair_details/KeyPairDetailTab.cpp
@@ -63,11 +63,12 @@ KeyPairDetailTab::KeyPairDetailTab(GpgME::GpgContext *ctx, const GpgKey &mKey, Q
keySizeVal = QString::number(mKey.length);
if (mKey.expires.toTime_t() == 0) {
- keyExpireVal = tr("Never Expired");
+ keyExpireVal = tr("Never Expires");
} else {
keyExpireVal = mKey.expires.toString();
}
+
keyAlgoVal = mKey.pubkey_algo;
keyCreateTimeVal = mKey.create_time.toString();
@@ -76,6 +77,28 @@ KeyPairDetailTab::KeyPairDetailTab(GpgME::GpgContext *ctx, const GpgKey &mKey, Q
createdVarLabel = new QLabel(keyCreateTimeVal);
algorithmVarLabel = new QLabel(keyAlgoVal);
+ // Show the situation that master key not exists.
+ masterKeyExistVarLabel = new QLabel(mKey.has_master_key ? "Exists" : "Not Exists");
+ if(!mKey.has_master_key){
+ auto paletteExpired = masterKeyExistVarLabel->palette();
+ paletteExpired.setColor(masterKeyExistVarLabel->foregroundRole(), Qt::red);
+ masterKeyExistVarLabel->setPalette(paletteExpired);
+ } else {
+ auto paletteValid = masterKeyExistVarLabel->palette();
+ paletteValid.setColor(masterKeyExistVarLabel->foregroundRole(), Qt::darkGreen);
+ masterKeyExistVarLabel->setPalette(paletteValid);
+ }
+
+ if(mKey.expired){
+ auto paletteExpired = expireVarLabel->palette();
+ paletteExpired.setColor(expireVarLabel->foregroundRole(), Qt::red);
+ expireVarLabel->setPalette(paletteExpired);
+ } else {
+ auto paletteValid = expireVarLabel->palette();
+ paletteValid.setColor(expireVarLabel->foregroundRole(), Qt::darkGreen);
+ expireVarLabel->setPalette(paletteValid);
+ }
+
auto *mvbox = new QVBoxLayout();
auto *vboxKD = new QGridLayout();
auto *vboxOD = new QGridLayout();
@@ -93,6 +116,7 @@ KeyPairDetailTab::KeyPairDetailTab(GpgME::GpgContext *ctx, const GpgKey &mKey, Q
vboxKD->addWidget(new QLabel(tr("Usage: ")), 3, 0);
vboxKD->addWidget(new QLabel(tr("Expires on: ")), 4, 0);
vboxKD->addWidget(new QLabel(tr("Last Update: ")), 5, 0);
+ vboxKD->addWidget(new QLabel(tr("Existence: ")), 6, 0);
vboxKD->addWidget(keySizeVarLabel, 2, 1);
@@ -101,6 +125,7 @@ KeyPairDetailTab::KeyPairDetailTab(GpgME::GpgContext *ctx, const GpgKey &mKey, Q
vboxKD->addWidget(createdVarLabel, 5, 1);
vboxKD->addWidget(keyidVarLabel, 0, 1);
vboxKD->addWidget(usageVarLabel, 3, 1);
+ vboxKD->addWidget(masterKeyExistVarLabel, 6, 1);
ownerBox->setLayout(vboxOD);
mvbox->addWidget(ownerBox);
@@ -151,16 +176,17 @@ KeyPairDetailTab::KeyPairDetailTab(GpgME::GpgContext *ctx, const GpgKey &mKey, Q
auto *expLabel = new QLabel();
auto *iconLabel = new QLabel();
if (mKey.expired) {
- expLabel->setText(tr("Warning: Key expired"));
+ expLabel->setText(tr("Warning: The master key of the key pair has expired."));
}
if (mKey.revoked) {
- expLabel->setText(tr("Warning: Key revoked"));
+ expLabel->setText(tr("Warning: The master key of the key pair has been revoked"));
}
iconLabel->setPixmap(pixmap);
QFont font = expLabel->font();
font.setBold(true);
expLabel->setFont(font);
+ expLabel->setAlignment(Qt::AlignCenter);
expBox->addWidget(iconLabel);
expBox->addWidget(expLabel);
mvbox->addLayout(expBox);
diff --git a/src/ui/keypair_details/KeyPairSubkeyTab.cpp b/src/ui/keypair_details/KeyPairSubkeyTab.cpp
index 75bd50f5..b47013ed 100644
--- a/src/ui/keypair_details/KeyPairSubkeyTab.cpp
+++ b/src/ui/keypair_details/KeyPairSubkeyTab.cpp
@@ -27,6 +27,7 @@
KeyPairSubkeyTab::KeyPairSubkeyTab(GpgME::GpgContext *ctx, const GpgKey &key, QWidget *parent) : mCtx(ctx), mKey(key), QWidget(parent) {
createSubkeyList();
+ createSubkeyOperaMenu();
listBox = new QGroupBox("Subkey List");
detailBox = new QGroupBox("Detail of Selected Subkey");
@@ -55,6 +56,7 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(GpgME::GpgContext *ctx, const GpgKey &key, QW
subkeyDetailLayout->addWidget(new QLabel(tr("Usage: ")), 3, 0);
subkeyDetailLayout->addWidget(new QLabel(tr("Expires on: ")), 4, 0);
subkeyDetailLayout->addWidget(new QLabel(tr("Last Update: ")), 5, 0);
+ subkeyDetailLayout->addWidget(new QLabel(tr("Existence: ")), 6, 0);
keyidVarLabel = new QLabel();
keySizeVarLabel = new QLabel();
@@ -62,6 +64,7 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(GpgME::GpgContext *ctx, const GpgKey &key, QW
algorithmVarLabel = new QLabel();
createdVarLabel = new QLabel();
usageVarLabel = new QLabel();
+ masterKeyExistVarLabel = new QLabel();
subkeyDetailLayout->addWidget(keyidVarLabel, 0, 1);
subkeyDetailLayout->addWidget(keySizeVarLabel, 2, 1);
@@ -69,6 +72,7 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(GpgME::GpgContext *ctx, const GpgKey &key, QW
subkeyDetailLayout->addWidget(algorithmVarLabel, 1, 1);
subkeyDetailLayout->addWidget(createdVarLabel, 5, 1);
subkeyDetailLayout->addWidget(usageVarLabel, 3, 1);
+ subkeyDetailLayout->addWidget(masterKeyExistVarLabel, 6, 1);
listBox->setLayout(subkeyListLayout);
detailBox->setLayout(subkeyDetailLayout);
@@ -165,18 +169,22 @@ void KeyPairSubkeyTab::slotAddSubkey() {
void KeyPairSubkeyTab::slotRefreshSubkeyDetail() {
- int row = 0;
-
- for(int i = 0 ; i < subkeyList->rowCount(); i++) {
- if(subkeyList->item(row, 0)->isSelected()) break;
- row++;
- }
-
- auto key = buffered_subkeys[row];
+ auto key = getSelectedSubkey();
keyidVarLabel->setText(key->id);
keySizeVarLabel->setText(QString::number(key->length));
- expireVarLabel->setText(key->expires.toTime_t() == 0 ? tr("Never Expire") : key->expires.toString());
+
+ expireVarLabel->setText(key->expires.toTime_t() == 0 ? tr("Never Expires") : key->expires.toString());
+ if(key->expires.toTime_t() != 0 && key->expires < QDateTime::currentDateTime()) {
+ auto paletteExpired = expireVarLabel->palette();
+ paletteExpired.setColor(expireVarLabel->foregroundRole(), Qt::red);
+ expireVarLabel->setPalette(paletteExpired);
+ } else {
+ auto paletteValid = expireVarLabel->palette();
+ paletteValid.setColor(expireVarLabel->foregroundRole(), Qt::darkGreen);
+ expireVarLabel->setPalette(paletteValid);
+ }
+
algorithmVarLabel->setText(key->pubkey_algo);
createdVarLabel->setText(key->timestamp.toString());
@@ -193,21 +201,56 @@ void KeyPairSubkeyTab::slotRefreshSubkeyDetail() {
usage_steam << "Auth ";
usageVarLabel->setText(usage);
+
+ // Show the situation that master key not exists.
+ masterKeyExistVarLabel->setText(key->secret ? "Exists" : "Not Exists");
+ if(!key->secret){
+ auto paletteExpired = masterKeyExistVarLabel->palette();
+ paletteExpired.setColor(masterKeyExistVarLabel->foregroundRole(), Qt::red);
+ masterKeyExistVarLabel->setPalette(paletteExpired);
+ } else {
+ auto paletteValid = masterKeyExistVarLabel->palette();
+ paletteValid.setColor(masterKeyExistVarLabel->foregroundRole(), Qt::darkGreen);
+ masterKeyExistVarLabel->setPalette(paletteValid);
+ }
}
void KeyPairSubkeyTab::createSubkeyOperaMenu() {
subkeyOperaMenu = new QMenu();
- auto *revokeSubkeyAct = new QAction(tr("Revoke Subkey"));
- auto *editSubkeyAct = new QAction(tr("Edit Subkey"));
+ // auto *revokeSubkeyAct = new QAction(tr("Revoke Subkey"));
+ auto *editSubkeyAct = new QAction(tr("Edit Expire Date"));
+ connect(editSubkeyAct, SIGNAL(triggered(bool)), this, SLOT(slotEditSubkey()));
- subkeyOperaMenu->addAction(revokeSubkeyAct);
+ // subkeyOperaMenu->addAction(revokeSubkeyAct);
subkeyOperaMenu->addAction(editSubkeyAct);
}
void KeyPairSubkeyTab::slotEditSubkey() {
-
+ auto *subkey = getSelectedSubkey();
+ if(subkey == buffered_subkeys[0]) {
+ subkey = nullptr;
+ }
+ auto dialog = new KeySetExpireDateDialog(mCtx, mKey, subkey, this);
+ dialog->show();
}
void KeyPairSubkeyTab::slotRevokeSubkey() {
}
+
+void KeyPairSubkeyTab::contextMenuEvent(QContextMenuEvent *event) {
+ if (subkeyList->selectedItems().length() > 0) {
+ subkeyOperaMenu->exec(event->globalPos());
+ }
+}
+
+const GpgSubKey *KeyPairSubkeyTab::getSelectedSubkey() {
+ int row = 0;
+
+ for(int i = 0 ; i < subkeyList->rowCount(); i++) {
+ if(subkeyList->item(row, 0)->isSelected()) break;
+ row++;
+ }
+
+ return buffered_subkeys[row];
+}
diff --git a/src/ui/keypair_details/KeyPairUIDTab.cpp b/src/ui/keypair_details/KeyPairUIDTab.cpp
index 1fe57916..729fb1d2 100644
--- a/src/ui/keypair_details/KeyPairUIDTab.cpp
+++ b/src/ui/keypair_details/KeyPairUIDTab.cpp
@@ -209,7 +209,7 @@ void KeyPairUIDTab::slotRefreshSigList() {
auto *tmp4 = new QTableWidgetItem(sig->create_time.toString());
sigList->setItem(sigRow, 3, tmp4);
- auto *tmp5 = new QTableWidgetItem(sig->expire_time.toTime_t() == 0 ? tr("Never Expire") : sig->expire_time.toString());
+ auto *tmp5 = new QTableWidgetItem(sig->expire_time.toTime_t() == 0 ? tr("Never Expires") : sig->expire_time.toString());
tmp5->setTextAlignment(Qt::AlignCenter);
sigList->setItem(sigRow, 4, tmp5);
diff --git a/src/ui/keypair_details/KeySetExpireDateDialog.cpp b/src/ui/keypair_details/KeySetExpireDateDialog.cpp
index f9b05dea..67238685 100644
--- a/src/ui/keypair_details/KeySetExpireDateDialog.cpp
+++ b/src/ui/keypair_details/KeySetExpireDateDialog.cpp
@@ -1,6 +1,26 @@
-//
-// Created by eric on 2021/6/3.
-//
+/**
+ * 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 <https://www.gnu.org/licenses/>.
+ *
+ * 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<[email protected]> starting on May 12, 2021.
+ *
+ */
#include "ui/keypair_details/KeySetExpireDateDialog.h"
@@ -9,7 +29,7 @@ QDialog(parent), mKey(key), mSubkey(subkey), mCtx(ctx) {
QDateTime maxDateTime = QDateTime::currentDateTime().addYears(2);
dateTimeEdit = new QDateTimeEdit(maxDateTime);
- dateTimeEdit->setMinimumDateTime(QDateTime::currentDateTime());
+ dateTimeEdit->setMinimumDateTime(QDateTime::currentDateTime().addSecs(1));
dateTimeEdit->setMaximumDateTime(maxDateTime);
nonExpiredCheck = new QCheckBox();
nonExpiredCheck->setTristate(false);
diff --git a/src/ui/keypair_details/KeyUIDSignDialog.cpp b/src/ui/keypair_details/KeyUIDSignDialog.cpp
index 2fe03e26..4ccf51a1 100644
--- a/src/ui/keypair_details/KeyUIDSignDialog.cpp
+++ b/src/ui/keypair_details/KeyUIDSignDialog.cpp
@@ -33,7 +33,7 @@ KeyUIDSignDialog::KeyUIDSignDialog(GpgME::GpgContext *ctx, const GpgKey &key, co
this);
mKeyList->setFilter([](const GpgKey &key) -> bool {
- if(key.disabled || !key.can_sign) return false;
+ if(key.disabled || !key.can_certify || !key.has_master_key || key.expired || key.revoked) return false;
else return true;
});
mKeyList->setExcludeKeys({key.id});
diff --git a/src/ui/widgets/KeyList.cpp b/src/ui/widgets/KeyList.cpp
index 0868890f..b6596402 100644
--- a/src/ui/widgets/KeyList.cpp
+++ b/src/ui/widgets/KeyList.cpp
@@ -152,26 +152,25 @@ void KeyList::slotRefresh()
tmp0->setCheckState(Qt::Unchecked);
mKeyList->setItem(row_index, 0, tmp0);
+ QString type_str;
+ QTextStream type_steam(&type_str);
if (it->is_private_key) {
- auto *tmp1 = new QTableWidgetItem("pub/sec");
- mKeyList->setItem(row_index, 1, tmp1);
+ type_steam << "pub/sec";
} else {
- auto *tmp1 = new QTableWidgetItem("pub");
- mKeyList->setItem(row_index, 1, tmp1);
+ type_steam << "pub";
}
+ if(it->is_private_key && !it->has_master_key) {
+ type_steam << "#";
+ }
+ auto* tmp1 = new QTableWidgetItem(type_str);
+ mKeyList->setItem(row_index, 1, tmp1);
+
auto *tmp2 = new QTableWidgetItem(it->name);
tmp2->setToolTip(it->name);
mKeyList->setItem(row_index, 2, tmp2);
auto *tmp3 = new QTableWidgetItem(it->email);
tmp3->setToolTip(it->email);
- // strike out expired keys
- if(it->expired || it->revoked) {
- QFont strike = tmp2->font();
- strike.setStrikeOut(true);
- tmp2->setFont(strike);
- tmp3->setFont(strike);
- }
mKeyList->setItem(row_index, 3, tmp3);
QString usage;
@@ -198,6 +197,19 @@ void KeyList::slotRefresh()
temp_fpr->setTextAlignment(Qt::AlignCenter);
mKeyList->setItem(row_index, 6, temp_fpr);
+ // strike out expired keys
+ if(it->expired || it->revoked) {
+ QFont strike = tmp2->font();
+ strike.setStrikeOut(true);
+ tmp0->setFont(strike);
+ temp_usage->setFont(strike);
+ temp_fpr->setFont(strike);
+ temp_validity->setFont(strike);
+ tmp1->setFont(strike);
+ tmp2->setFont(strike);
+ tmp3->setFont(strike);
+ }
+
it++;
++row_index;
}