aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/function/gpg/GpgKeyOpera.cpp6
-rw-r--r--src/ui/UISignalStation.h6
-rw-r--r--src/ui/UserInterfaceUtils.cpp13
-rw-r--r--src/ui/dialog/import_export/KeyImportDetailDialog.cpp7
-rw-r--r--src/ui/dialog/keypair_details/KeyDetailsDialog.cpp22
-rw-r--r--src/ui/dialog/keypair_details/KeyPairOperaTab.cpp78
-rw-r--r--src/ui/dialog/keypair_details/KeyPairOperaTab.h11
-rw-r--r--src/ui/main_window/KeyMgmt.cpp18
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"),