aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsaturneric <[email protected]>2024-11-18 15:14:55 +0000
committersaturneric <[email protected]>2024-11-18 15:15:04 +0000
commit94281700b1f61fed5130f7c003a1c88afdd70b4b (patch)
tree973efaba427e3b8a5c482e0a238d6f7a7b8573bf
parentfeat: support export a single subkey (diff)
downloadGpgFrontend-94281700b1f61fed5130f7c003a1c88afdd70b4b.tar.gz
GpgFrontend-94281700b1f61fed5130f7c003a1c88afdd70b4b.zip
feat: make primary key and subkey clearly
-rw-r--r--src/ui/dialog/keypair_details/KeyDetailsDialog.cpp2
-rw-r--r--src/ui/dialog/keypair_details/KeyPairOperaTab.h1
-rw-r--r--src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp113
-rw-r--r--src/ui/dialog/keypair_details/KeyPairSubkeyTab.h6
4 files changed, 77 insertions, 45 deletions
diff --git a/src/ui/dialog/keypair_details/KeyDetailsDialog.cpp b/src/ui/dialog/keypair_details/KeyDetailsDialog.cpp
index 2b2e73b2..f71465c9 100644
--- a/src/ui/dialog/keypair_details/KeyDetailsDialog.cpp
+++ b/src/ui/dialog/keypair_details/KeyDetailsDialog.cpp
@@ -52,7 +52,7 @@ KeyDetailsDialog::KeyDetailsDialog(int channel, const GpgKey& key,
tab_widget_->addTab(new KeyPairSubkeyTab(current_gpg_context_channel_,
key.GetId(), tab_widget_),
- tr("Subkeys"));
+ tr("Keychain"));
tab_widget_->addTab(new KeyPairOperaTab(current_gpg_context_channel_,
key.GetId(), tab_widget_),
tr("Operations"));
diff --git a/src/ui/dialog/keypair_details/KeyPairOperaTab.h b/src/ui/dialog/keypair_details/KeyPairOperaTab.h
index 632246dd..9e1f2a23 100644
--- a/src/ui/dialog/keypair_details/KeyPairOperaTab.h
+++ b/src/ui/dialog/keypair_details/KeyPairOperaTab.h
@@ -144,5 +144,6 @@ class KeyPairOperaTab : public QWidget {
QMenu* key_server_opera_menu_{}; ///<
QMenu* rev_cert_opera_menu_{};
QMenu* secret_key_export_opera_menu_{}; ///<
+
};
} // namespace GpgFrontend::UI
diff --git a/src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp b/src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp
index 8066ccfb..43bebe86 100644
--- a/src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp
+++ b/src/ui/dialog/keypair_details/KeyPairSubkeyTab.cpp
@@ -50,8 +50,8 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(int channel, const QString& key_id,
create_subkey_list();
create_subkey_opera_menu();
- list_box_ = new QGroupBox(tr("Subkey List"));
- detail_box_ = new QGroupBox(tr("Detail of Selected Subkey"));
+ list_box_ = new QGroupBox(tr("List of the primary key and subkey(s)"));
+ detail_box_ = new QGroupBox(tr("Detail of Selected Primary Key/Subkey"));
auto* uid_buttons_layout = new QGridLayout();
@@ -73,20 +73,22 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(int channel, const QString& key_id,
auto* subkey_detail_layout = new QGridLayout();
subkey_detail_layout->addWidget(new QLabel(tr("Key ID") + ": "), 0, 0);
- subkey_detail_layout->addWidget(new QLabel(tr("Algorithm") + ": "), 1, 0);
- subkey_detail_layout->addWidget(new QLabel(tr("Algorithm Detail") + ": "), 2,
+ subkey_detail_layout->addWidget(new QLabel(tr("Key Type") + ": "), 1, 0);
+ subkey_detail_layout->addWidget(new QLabel(tr("Algorithm") + ": "), 2, 0);
+ subkey_detail_layout->addWidget(new QLabel(tr("Algorithm Detail") + ": "), 3,
0);
- subkey_detail_layout->addWidget(new QLabel(tr("Key Size") + ": "), 3, 0);
- subkey_detail_layout->addWidget(new QLabel(tr("Usage") + ": "), 4, 0);
+ subkey_detail_layout->addWidget(new QLabel(tr("Key Size") + ": "), 4, 0);
+ subkey_detail_layout->addWidget(new QLabel(tr("Usage") + ": "), 5, 0);
subkey_detail_layout->addWidget(
- new QLabel(tr("Expires On (Local Time)") + ": "), 5, 0);
+ new QLabel(tr("Expires On (Local Time)") + ": "), 6, 0);
subkey_detail_layout->addWidget(
- new QLabel(tr("Create Date (Local Time)") + ": "), 6, 0);
- subkey_detail_layout->addWidget(new QLabel(tr("Existence") + ": "), 7, 0);
- subkey_detail_layout->addWidget(new QLabel(tr("Key in Smart Card") + ": "), 8,
+ new QLabel(tr("Create Date (Local Time)") + ": "), 7, 0);
+ subkey_detail_layout->addWidget(new QLabel(tr("Existence") + ": "), 8, 0);
+ subkey_detail_layout->addWidget(new QLabel(tr("Key in Smart Card") + ": "), 9,
0);
- subkey_detail_layout->addWidget(new QLabel(tr("Fingerprint") + ": "), 9, 0);
+ subkey_detail_layout->addWidget(new QLabel(tr("Fingerprint") + ": "), 10, 0);
+ key_type_var_label_ = new QLabel(this);
key_id_var_label_ = new QLabel(this);
key_size_var_label_ = new QLabel(this);
expire_var_label_ = new QLabel(this);
@@ -103,20 +105,21 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(int channel, const QString& key_id,
fingerprint_var_label_->setTextInteractionFlags(Qt::TextSelectableByMouse);
subkey_detail_layout->addWidget(key_id_var_label_, 0, 1, 1, 1);
- subkey_detail_layout->addWidget(algorithm_var_label_, 1, 1, 1, 2);
- subkey_detail_layout->addWidget(algorithm_detail_var_label_, 2, 1, 1, 2);
- subkey_detail_layout->addWidget(key_size_var_label_, 3, 1, 1, 2);
- subkey_detail_layout->addWidget(usage_var_label_, 4, 1, 1, 2);
- subkey_detail_layout->addWidget(expire_var_label_, 5, 1, 1, 2);
- subkey_detail_layout->addWidget(created_var_label_, 6, 1, 1, 2);
- subkey_detail_layout->addWidget(master_key_exist_var_label_, 7, 1, 1, 2);
- subkey_detail_layout->addWidget(card_key_label_, 8, 1, 1, 2);
- subkey_detail_layout->addWidget(fingerprint_var_label_, 9, 1, 1, 2);
-
- auto* export_subkey_button = new QPushButton(tr("Export Subkey"));
- export_subkey_button->setFlat(true);
- subkey_detail_layout->addWidget(export_subkey_button, 0, 2);
- connect(export_subkey_button, &QPushButton::clicked, this,
+ subkey_detail_layout->addWidget(key_type_var_label_, 1, 1, 1, 2);
+ subkey_detail_layout->addWidget(algorithm_var_label_, 2, 1, 1, 2);
+ subkey_detail_layout->addWidget(algorithm_detail_var_label_, 3, 1, 1, 2);
+ subkey_detail_layout->addWidget(key_size_var_label_, 4, 1, 1, 2);
+ subkey_detail_layout->addWidget(usage_var_label_, 5, 1, 1, 2);
+ subkey_detail_layout->addWidget(expire_var_label_, 6, 1, 1, 2);
+ subkey_detail_layout->addWidget(created_var_label_, 7, 1, 1, 2);
+ subkey_detail_layout->addWidget(master_key_exist_var_label_, 8, 1, 1, 2);
+ subkey_detail_layout->addWidget(card_key_label_, 9, 1, 1, 2);
+ subkey_detail_layout->addWidget(fingerprint_var_label_, 10, 1, 1, 2);
+
+ export_subkey_button_ = new QPushButton(tr("Export Subkey"));
+ export_subkey_button_->setFlat(true);
+ subkey_detail_layout->addWidget(export_subkey_button_, 0, 2);
+ connect(export_subkey_button_, &QPushButton::clicked, this,
&KeyPairSubkeyTab::slot_export_subkey);
list_box_->setLayout(subkey_list_layout);
@@ -167,11 +170,11 @@ void KeyPairSubkeyTab::create_subkey_list() {
subkey_list_->setAlternatingRowColors(true);
QStringList labels;
- labels << tr("Subkey ID") << tr("Key Size") << tr("Algorithm")
+ labels << tr("Key ID") << tr("Key Type") << tr("Key Size") << tr("Algorithm")
<< tr("Algorithm Detail") << tr("Create Date") << tr("Expire Date");
subkey_list_->setHorizontalHeaderLabels(labels);
- subkey_list_->horizontalHeader()->setStretchLastSection(false);
+ subkey_list_->horizontalHeader()->setStretchLastSection(true);
}
void KeyPairSubkeyTab::slot_refresh_subkey_list() {
@@ -188,35 +191,41 @@ void KeyPairSubkeyTab::slot_refresh_subkey_list() {
subkey_list_->setRowCount(buffered_subkeys_.size());
- for (const auto& subkeys : buffered_subkeys_) {
- auto* tmp0 = new QTableWidgetItem(subkeys.GetID());
+ for (const auto& subkey : buffered_subkeys_) {
+ auto* tmp0 = new QTableWidgetItem(subkey.GetID());
tmp0->setTextAlignment(Qt::AlignCenter);
subkey_list_->setItem(row, 0, tmp0);
- auto* tmp1 = new QTableWidgetItem(QString::number(subkeys.GetKeyLength()));
+ auto* tmp1 = new QTableWidgetItem(subkey.IsHasCertificationCapability()
+ ? tr("Primary Key")
+ : tr("Subkey"));
tmp1->setTextAlignment(Qt::AlignCenter);
subkey_list_->setItem(row, 1, tmp1);
- auto* tmp2 = new QTableWidgetItem(subkeys.GetPubkeyAlgo());
+ auto* tmp2 = new QTableWidgetItem(QString::number(subkey.GetKeyLength()));
tmp2->setTextAlignment(Qt::AlignCenter);
subkey_list_->setItem(row, 2, tmp2);
- auto* tmp3 = new QTableWidgetItem(subkeys.GetKeyAlgo());
+ auto* tmp3 = new QTableWidgetItem(subkey.GetPubkeyAlgo());
tmp3->setTextAlignment(Qt::AlignCenter);
subkey_list_->setItem(row, 3, tmp3);
- auto* tmp4 =
- new QTableWidgetItem(QLocale().toString(subkeys.GetCreateTime()));
+ auto* tmp4 = new QTableWidgetItem(subkey.GetKeyAlgo());
tmp4->setTextAlignment(Qt::AlignCenter);
subkey_list_->setItem(row, 4, tmp4);
auto* tmp5 =
- new QTableWidgetItem(subkeys.GetExpireTime().toSecsSinceEpoch() == 0
- ? tr("Never Expire")
- : QLocale().toString(subkeys.GetExpireTime()));
+ new QTableWidgetItem(QLocale().toString(subkey.GetCreateTime()));
tmp5->setTextAlignment(Qt::AlignCenter);
subkey_list_->setItem(row, 5, tmp5);
+ auto* tmp6 =
+ new QTableWidgetItem(subkey.GetExpireTime().toSecsSinceEpoch() == 0
+ ? tr("Never Expire")
+ : QLocale().toString(subkey.GetExpireTime()));
+ tmp6->setTextAlignment(Qt::AlignCenter);
+ subkey_list_->setItem(row, 6, tmp6);
+
if (!row) {
for (auto i = 0; i < subkey_list_->columnCount(); i++) {
subkey_list_->item(row, i)->setForeground(QColor(65, 105, 255));
@@ -226,8 +235,6 @@ void KeyPairSubkeyTab::slot_refresh_subkey_list() {
row++;
}
- FLOG_D("subkey_list_ refreshed");
-
if (subkey_list_->rowCount() > 0) {
subkey_list_->selectRow(0);
}
@@ -309,19 +316,30 @@ void KeyPairSubkeyTab::slot_refresh_subkey_detail() {
fingerprint_var_label_->setText(BeautifyFingerprint(subkey.GetFingerprint()));
fingerprint_var_label_->setWordWrap(true); // for x448 and ed448
+
+ export_subkey_button_->setText(subkey.IsHasCertificationCapability()
+ ? tr("Export Primary Key")
+ : tr("Export Subkey"));
+ export_subkey_button_->setDisabled(!key_.IsPrivateKey() ||
+ subkey.IsHasCertificationCapability() ||
+ !subkey.IsSecretKey());
+
+ key_type_var_label_->setText(
+ subkey.IsHasCertificationCapability() ? tr("Primary Key") : tr("Subkey"));
}
void KeyPairSubkeyTab::create_subkey_opera_menu() {
subkey_opera_menu_ = new QMenu(this);
- auto* edit_subkey_act = new QAction(tr("Edit Expire Date"));
- connect(edit_subkey_act, &QAction::triggered, this,
+ edit_subkey_act_ = new QAction(tr("Edit Expire Date"));
+ connect(edit_subkey_act_, &QAction::triggered, this,
&KeyPairSubkeyTab::slot_edit_subkey);
- auto* export_subkey_act = new QAction(tr("Export"));
- connect(export_subkey_act, &QAction::triggered, this,
+ export_subkey_act_ = new QAction(tr("Export"));
+ connect(export_subkey_act_, &QAction::triggered, this,
&KeyPairSubkeyTab::slot_export_subkey);
- subkey_opera_menu_->addAction(edit_subkey_act);
+ subkey_opera_menu_->addAction(export_subkey_act_);
+ subkey_opera_menu_->addAction(edit_subkey_act_);
}
void KeyPairSubkeyTab::slot_edit_subkey() {
@@ -335,6 +353,13 @@ void KeyPairSubkeyTab::slot_revoke_subkey() {}
void KeyPairSubkeyTab::contextMenuEvent(QContextMenuEvent* event) {
if (key_.IsPrivateKey() && !subkey_list_->selectedItems().isEmpty()) {
+ const auto& subkey = get_selected_subkey();
+
+ if (subkey.IsHasCertificationCapability()) return;
+
+ export_subkey_act_->setDisabled(!subkey.IsSecretKey());
+ edit_subkey_act_->setDisabled(!subkey.IsSecretKey());
+
subkey_opera_menu_->exec(event->globalPos());
}
}
diff --git a/src/ui/dialog/keypair_details/KeyPairSubkeyTab.h b/src/ui/dialog/keypair_details/KeyPairSubkeyTab.h
index e7b97eb5..4e626ae5 100644
--- a/src/ui/dialog/keypair_details/KeyPairSubkeyTab.h
+++ b/src/ui/dialog/keypair_details/KeyPairSubkeyTab.h
@@ -77,6 +77,7 @@ class KeyPairSubkeyTab : public QWidget {
QMenu* subkey_opera_menu_{}; ///<
+ QLabel* key_type_var_label_;
QLabel* key_size_var_label_; ///< Label containing the keys key size
QLabel* expire_var_label_; ///< Label containing the keys expiration date
QLabel* created_var_label_; ///< Label containing the keys creation date
@@ -88,6 +89,11 @@ class KeyPairSubkeyTab : public QWidget {
QLabel* master_key_exist_var_label_; ///<
QLabel* card_key_label_; ///<
+ QPushButton* export_subkey_button_;
+ QAction* export_subkey_act_;
+
+ QAction* edit_subkey_act_;
+
private slots:
/**