diff options
author | saturneric <[email protected]> | 2024-01-30 03:26:41 +0000 |
---|---|---|
committer | saturneric <[email protected]> | 2024-01-30 03:26:41 +0000 |
commit | 635cfadda55fe79917c0ba96b589e2235571bab3 (patch) | |
tree | df1c3af2aec88e6f9b2addb6ffc104e7a23dfefb | |
parent | fix: solve reported issues (diff) | |
download | GpgFrontend-635cfadda55fe79917c0ba96b589e2235571bab3.tar.gz GpgFrontend-635cfadda55fe79917c0ba96b589e2235571bab3.zip |
fix: add function to import key rev cert
-rw-r--r-- | src/core/function/gpg/GpgKeyOpera.cpp | 6 | ||||
-rw-r--r-- | src/ui/UISignalStation.h | 6 | ||||
-rw-r--r-- | src/ui/UserInterfaceUtils.cpp | 13 | ||||
-rw-r--r-- | src/ui/dialog/import_export/KeyImportDetailDialog.cpp | 7 | ||||
-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 | ||||
-rw-r--r-- | src/ui/main_window/KeyMgmt.cpp | 18 |
8 files changed, 141 insertions, 20 deletions
diff --git a/src/core/function/gpg/GpgKeyOpera.cpp b/src/core/function/gpg/GpgKeyOpera.cpp index 1ca47480..e0ecb3ce 100644 --- a/src/core/function/gpg/GpgKeyOpera.cpp +++ b/src/core/function/gpg/GpgKeyOpera.cpp @@ -30,8 +30,6 @@ #include <gpg-error.h> -#include <memory> - #include "core/GpgModel.h" #include "core/function/gpg/GpgCommandExecutor.h" #include "core/function/gpg/GpgKeyGetter.h" @@ -53,7 +51,7 @@ GpgKeyOpera::GpgKeyOpera(int channel) * Delete keys * @param uidList key ids */ -void GpgKeyOpera::DeleteKeys(GpgFrontend::KeyIdArgsListPtr key_ids) { +void GpgKeyOpera::DeleteKeys(KeyIdArgsListPtr key_ids) { GpgError err; for (const auto& tmp : *key_ids) { auto key = GpgKeyGetter::GetInstance().GetKey(tmp); @@ -514,7 +512,7 @@ auto GpgKeyOpera::ModifyTOFUPolicy(const GpgKey& key, return CheckGpgError(err); } -void GpgKeyOpera::DeleteKey(const GpgFrontend::KeyId& key_id) { +void GpgKeyOpera::DeleteKey(const KeyId& key_id) { auto keys = std::make_unique<KeyIdArgsList>(); keys->push_back(key_id); DeleteKeys(std::move(keys)); diff --git a/src/ui/UISignalStation.h b/src/ui/UISignalStation.h index 9a762d16..7358f854 100644 --- a/src/ui/UISignalStation.h +++ b/src/ui/UISignalStation.h @@ -86,6 +86,12 @@ class UISignalStation : public QObject { /** * @brief * + */ + void SignalKeyRevoked(QString); + + /** + * @brief + * * @param text * @param verify_label_status */ diff --git a/src/ui/UserInterfaceUtils.cpp b/src/ui/UserInterfaceUtils.cpp index c66b9845..ab8aeac9 100644 --- a/src/ui/UserInterfaceUtils.cpp +++ b/src/ui/UserInterfaceUtils.cpp @@ -281,6 +281,15 @@ void CommonUtils::SlotImportKeyFromFile(QWidget *parent) { if (file_name.isEmpty()) return; QFileInfo file_info(file_name); + + if (!file_info.isFile() || !file_info.isReadable()) { + QMessageBox::critical( + parent, tr("Error"), + tr("Cannot open this file. Please make sure that this " + "is a regular file and it's readable.")); + return; + } + if (file_info.size() > static_cast<qint64>(1024 * 1024)) { QMessageBox::critical(parent, tr("Error"), tr("The target file is too large for a keyring.")); @@ -342,7 +351,7 @@ void CommonUtils::SlotExecuteGpgCommand( const QStringList &arguments, const std::function<void(QProcess *)> &interact_func) { QEventLoop looper; - auto dialog = new WaitingDialog(tr("Processing"), nullptr); + auto *dialog = new WaitingDialog(tr("Processing"), nullptr); dialog->show(); auto *gpg_process = new QProcess(&looper); gpg_process->setProcessChannelMode(QProcess::MergedChannels); @@ -506,7 +515,7 @@ void CommonUtils::SlotRestartApplication(int code) { } } -bool CommonUtils::isApplicationNeedRestart() { +auto CommonUtils::isApplicationNeedRestart() -> bool { return application_need_to_restart_at_once_; } diff --git a/src/ui/dialog/import_export/KeyImportDetailDialog.cpp b/src/ui/dialog/import_export/KeyImportDetailDialog.cpp index 40a8ec80..5b71c0f6 100644 --- a/src/ui/dialog/import_export/KeyImportDetailDialog.cpp +++ b/src/ui/dialog/import_export/KeyImportDetailDialog.cpp @@ -118,6 +118,13 @@ void KeyImportDetailDialog::create_general_info_box() { general_info_box_layout->addWidget( new QLabel(QString::number(m_result_->secret_unchanged)), row, 1); } + + if (m_result_->new_revocations != 0) { + general_info_box_layout->addWidget(new QLabel(tr("New Revocations") + ": "), + row, 0); + general_info_box_layout->addWidget( + new QLabel(QString::number(m_result_->new_revocations)), row, 1); + } } void KeyImportDetailDialog::create_keys_table() { 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 diff --git a/src/ui/main_window/KeyMgmt.cpp b/src/ui/main_window/KeyMgmt.cpp index 67150d85..96df89d1 100644 --- a/src/ui/main_window/KeyMgmt.cpp +++ b/src/ui/main_window/KeyMgmt.cpp @@ -535,6 +535,15 @@ void KeyMgmt::SlotImportKeyPackage() { // max file size is 32 mb QFileInfo key_package_file_info(key_package_file_name); + + if (!key_package_file_info.isFile() || !key_package_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; + } + if (key_package_file_info.size() > static_cast<qint64>(32 * 1024 * 1024)) { QMessageBox::critical( this, tr("Error"), @@ -550,6 +559,15 @@ void KeyMgmt::SlotImportKeyPackage() { // max file size is 1 mb QFileInfo key_file_info(key_file_name); + + if (!key_file_info.isFile() || !key_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; + } + if (key_file_info.size() > static_cast<qint64>(1024 * 1024)) { QMessageBox::critical( this, tr("Error"), |