diff options
Diffstat (limited to 'src/ui/dialog/keypair_details')
-rw-r--r-- | src/ui/dialog/keypair_details/KeyDetailsDialog.cpp | 22 | ||||
-rw-r--r-- | src/ui/dialog/keypair_details/KeyPairOperaTab.cpp | 78 | ||||
-rw-r--r-- | src/ui/dialog/keypair_details/KeyPairOperaTab.h | 11 |
3 files changed, 97 insertions, 14 deletions
diff --git a/src/ui/dialog/keypair_details/KeyDetailsDialog.cpp b/src/ui/dialog/keypair_details/KeyDetailsDialog.cpp index 6908592b..9545405b 100644 --- a/src/ui/dialog/keypair_details/KeyDetailsDialog.cpp +++ b/src/ui/dialog/keypair_details/KeyDetailsDialog.cpp @@ -29,6 +29,7 @@ #include "KeyDetailsDialog.h" #include "core/GpgModel.h" +#include "ui/UISignalStation.h" #include "ui/dialog/keypair_details/KeyPairDetailTab.h" #include "ui/dialog/keypair_details/KeyPairOperaTab.h" #include "ui/dialog/keypair_details/KeyPairSubkeyTab.h" @@ -40,11 +41,22 @@ KeyDetailsDialog::KeyDetailsDialog(const GpgKey& key, QWidget* parent) tab_widget_ = new QTabWidget(); tab_widget_->addTab(new KeyPairDetailTab(key.GetId(), tab_widget_), tr("KeyPair")); - tab_widget_->addTab(new KeyPairUIDTab(key.GetId(), tab_widget_), tr("UIDs")); - tab_widget_->addTab(new KeyPairSubkeyTab(key.GetId(), tab_widget_), - tr("Subkeys")); - tab_widget_->addTab(new KeyPairOperaTab(key.GetId(), tab_widget_), - tr("Operations")); + + if (!key.IsRevoked()) { + tab_widget_->addTab(new KeyPairUIDTab(key.GetId(), tab_widget_), + tr("UIDs")); + + tab_widget_->addTab(new KeyPairSubkeyTab(key.GetId(), tab_widget_), + tr("Subkeys")); + tab_widget_->addTab(new KeyPairOperaTab(key.GetId(), tab_widget_), + tr("Operations")); + } + + QString m_key_id = key.GetId(); + connect(UISignalStation::GetInstance(), &UISignalStation::SignalKeyRevoked, + this, [this, m_key_id](const QString& key_id) { + if (key_id == m_key_id) this->close(); + }); auto* main_layout = new QVBoxLayout; main_layout->addWidget(tab_widget_); diff --git a/src/ui/dialog/keypair_details/KeyPairOperaTab.cpp b/src/ui/dialog/keypair_details/KeyPairOperaTab.cpp index be9cd9d2..6e4a1df0 100644 --- a/src/ui/dialog/keypair_details/KeyPairOperaTab.cpp +++ b/src/ui/dialog/keypair_details/KeyPairOperaTab.cpp @@ -83,8 +83,7 @@ KeyPairOperaTab::KeyPairOperaTab(const QString& key_id, QWidget* parent) auto* advance_h_box_layout = new QHBoxLayout(); - auto settings = - GpgFrontend::GlobalSettingStation::GetInstance().GetSettings(); + auto settings = GlobalSettingStation::GetInstance().GetSettings(); // read settings bool forbid_all_gnupg_connection = @@ -98,11 +97,11 @@ KeyPairOperaTab::KeyPairOperaTab(const QString& key_id, QWidget* parent) advance_h_box_layout->addWidget(key_server_opera_button); if (m_key_.IsPrivateKey() && m_key_.IsHasMasterKey()) { - auto* revoke_cert_gen_button = - new QPushButton(tr("Generate Revoke Certificate")); - connect(revoke_cert_gen_button, &QPushButton::clicked, this, - &KeyPairOperaTab::slot_gen_revoke_cert); - advance_h_box_layout->addWidget(revoke_cert_gen_button); + auto* revoke_cert_opera_button = + new QPushButton(tr("Revoke Certificate Operation")); + revoke_cert_opera_button->setStyleSheet("text-align:center;"); + revoke_cert_opera_button->setMenu(rev_cert_opera_menu_); + advance_h_box_layout->addWidget(revoke_cert_opera_button); } auto* modify_tofu_button = new QPushButton(tr("Modify TOFU Policy")); @@ -171,6 +170,21 @@ void KeyPairOperaTab::CreateOperaMenu() { secret_key_export_opera_menu_->addAction(export_full_secret_key); secret_key_export_opera_menu_->addAction(export_shortest_secret_key); + + rev_cert_opera_menu_ = new QMenu(this); + + auto* rev_cert_gen_action = + new QAction(tr("Generate Revoke Certificate"), this); + connect(rev_cert_gen_action, &QAction::triggered, this, + &KeyPairOperaTab::slot_gen_revoke_cert); + + auto* revoke_cert_import_action = + new QAction(tr("Import Revoke Certificate")); + connect(revoke_cert_import_action, &QAction::triggered, this, + &KeyPairOperaTab::slot_import_revoke_cert); + + rev_cert_opera_menu_->addAction(revoke_cert_import_action); + rev_cert_opera_menu_->addAction(rev_cert_gen_action); } void KeyPairOperaTab::slot_export_public_key() { @@ -379,4 +393,54 @@ void KeyPairOperaTab::slot_set_owner_trust_level() { function->deleteLater(); } +void KeyPairOperaTab::slot_import_revoke_cert() { + // Show a information box with explanation about private key + int ret = QMessageBox::information( + this, tr("Import Key Revocation Certificate"), + "<h3>" + tr("You are about to import the") + "<font color=\"red\">" + + " " + tr("REVOCATION CERTIFICATE") + " " + "</font>!</h3>\n" + + tr("A successful import will result in the key being irreversibly " + "revoked.") + + "<br />" + tr("Do you REALLY want to execute this operation?"), + QMessageBox::Cancel | QMessageBox::Ok); + + // export key, if ok was clicked + if (ret != QMessageBox::Ok) return; + + auto rev_file_name = QFileDialog::getOpenFileName( + this, tr("Import Key Revocation Certificate"), {}, + tr("Revocation Certificates") + " (*.rev)"); + + if (rev_file_name.isEmpty()) return; + + QFileInfo rev_file_info(rev_file_name); + + if (!rev_file_info.isFile() || !rev_file_info.isReadable()) { + QMessageBox::critical( + this, tr("Error"), + tr("Cannot open this file. Please make sure that this " + "is a regular file and it's readable.")); + return; + } + + // max file size is 1 mb + if (rev_file_info.size() > static_cast<qint64>(1024 * 1024)) { + QMessageBox::critical( + this, tr("Error"), + tr("The target file is too large for a key revocation certificate.")); + return; + } + + QFile rev_file(rev_file_info.absoluteFilePath()); + if (!rev_file.open(QIODeviceBase::ReadOnly)) { + QMessageBox::critical( + this, tr("Error"), + tr("Cannot open this file. Please make sure that this " + "is a regular file and it's readable.")); + return; + } + + emit UISignalStation::GetInstance()->SignalKeyRevoked(m_key_.GetId()); + CommonUtils::GetInstance()->SlotImportKeys(nullptr, rev_file.readAll()); +} } // namespace GpgFrontend::UI diff --git a/src/ui/dialog/keypair_details/KeyPairOperaTab.h b/src/ui/dialog/keypair_details/KeyPairOperaTab.h index bb20d067..22c94957 100644 --- a/src/ui/dialog/keypair_details/KeyPairOperaTab.h +++ b/src/ui/dialog/keypair_details/KeyPairOperaTab.h @@ -120,9 +120,16 @@ class KeyPairOperaTab : public QWidget { */ void slot_set_owner_trust_level(); + /** + * @brief + * + */ + void slot_import_revoke_cert(); + private: - GpgKey m_key_; ///< - QMenu* key_server_opera_menu_{}; ///< + GpgKey m_key_; ///< + QMenu* key_server_opera_menu_{}; ///< + QMenu* rev_cert_opera_menu_{}; QMenu* secret_key_export_opera_menu_{}; ///< }; } // namespace GpgFrontend::UI |