From 5a610c82fc4fc52d69cdd4773ad421e04c53840e Mon Sep 17 00:00:00 2001 From: "Felix (xq) Queißner" Date: Sat, 20 Jun 2020 10:35:43 +0200 Subject: Starts implementation of certificate import/export. --- src/certificateiodialog.cpp | 126 +++++++++++++++++++++++++++++++++++ src/certificateiodialog.hpp | 50 ++++++++++++++ src/certificateiodialog.ui | 127 ++++++++++++++++++++++++++++++++++++ src/certificatemanagementdialog.cpp | 14 ++++ src/kristall.pro | 3 + 5 files changed, 320 insertions(+) create mode 100644 src/certificateiodialog.cpp create mode 100644 src/certificateiodialog.hpp create mode 100644 src/certificateiodialog.ui (limited to 'src') diff --git a/src/certificateiodialog.cpp b/src/certificateiodialog.cpp new file mode 100644 index 0000000..8c9fcd5 --- /dev/null +++ b/src/certificateiodialog.cpp @@ -0,0 +1,126 @@ +#include "certificateiodialog.hpp" +#include "ui_certificateiodialog.h" + +#include +#include +#include + +CertificateIoDialog::CertificateIoDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::CertificateIoDialog) +{ + ui->setupUi(this); + + this->ui->key_type->clear(); + this->ui->key_type->addItem("RSA", QVariant::fromValue(QSsl::Rsa)); + this->ui->key_type->addItem("ECDSA", QVariant::fromValue(QSsl::Ec)); + + this->updateUI(); +} + +CertificateIoDialog::~CertificateIoDialog() +{ + delete ui; +} + +void CertificateIoDialog::setIoMode(CertificateIoDialog::IoMode mode) +{ + this->current_mode = mode; + if(mode == Export) { + this->setWindowTitle(tr("Export Certificate")); + } else { + this->setWindowTitle(tr("Import Certificate")); + } + this->ui->key_type->setEnabled(mode == Import); + this->updateUI(); +} + +QSsl::KeyAlgorithm CertificateIoDialog::keyAlgorithm() const +{ + return QSsl::KeyAlgorithm(this->ui->key_type->currentData().toInt()); +} + +void CertificateIoDialog::setKeyAlgorithm(QSsl::KeyAlgorithm alg) +{ + this->ui->key_type->setCurrentIndex(-1); + for(int i = 0; i< this->ui->key_type->count(); i++) { + if(this->ui->key_type->itemData(i).toInt() == int(alg)) { + this->ui->key_type->setCurrentIndex(i); + break; + } + } +} + +QString CertificateIoDialog::keyFileName() const +{ + return this->ui->key_file_name->text(); +} + +QString CertificateIoDialog::certificateFileName() const +{ + return this->ui->certificate_file_name->text(); +} + +void CertificateIoDialog::on_select_certificate_file_button_clicked() +{ + QFileDialog dialog { this }; + + dialog.setNameFilter("Certificate File(*.pem *.der)"); + dialog.setAcceptMode((this->current_mode == Export) ? QFileDialog::AcceptSave : QFileDialog::AcceptOpen); + dialog.selectFile(this->ui->certificate_file_name->text()); + + if(dialog.exec() != QDialog::Accepted) + return; + + this->ui->certificate_file_name->setText(dialog.selectedFiles().first()); + + this->updateUI(); +} + +void CertificateIoDialog::on_select_key_file_button_clicked() +{ + QFileDialog dialog { this }; + + dialog.setNameFilter("Certificate File(*.pem *.der)"); + dialog.setAcceptMode((this->current_mode == Export) ? QFileDialog::AcceptSave : QFileDialog::AcceptOpen); + dialog.selectFile(this->ui->key_file_name->text()); + + if(dialog.exec() != QDialog::Accepted) + return; + + this->ui->key_file_name->setText(dialog.selectedFiles().first()); + + this->updateUI(); +} + +void CertificateIoDialog::on_certificate_file_name_textChanged(const QString &arg1) +{ + Q_UNUSED(arg1) + this->updateUI(); +} + +void CertificateIoDialog::on_key_file_name_textChanged(const QString &arg1) +{ + Q_UNUSED(arg1) + this->updateUI(); +} + +void CertificateIoDialog::updateUI() +{ + QString cert_file_name = certificateFileName(); + QString key_file_name = keyFileName(); + + bool ok = true; + + ok &= (cert_file_name.endsWith(".pem") or cert_file_name.endsWith(".der")); + ok &= (key_file_name.endsWith(".pem") or key_file_name.endsWith(".der")); + + ok &= (this->ui->key_type->currentIndex() >= 0); + + if(current_mode == Import) { + ok &= QFile(cert_file_name).exists(); + ok &= QFile(key_file_name).exists(); + } + + this->ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(ok); +} diff --git a/src/certificateiodialog.hpp b/src/certificateiodialog.hpp new file mode 100644 index 0000000..590b282 --- /dev/null +++ b/src/certificateiodialog.hpp @@ -0,0 +1,50 @@ +#ifndef CERTIFICATEIODIALOG_HPP +#define CERTIFICATEIODIALOG_HPP + +#include +#include + +namespace Ui { +class CertificateIoDialog; +} + +class CertificateIoDialog : public QDialog +{ + Q_OBJECT +public: + enum IoMode { + Import, + Export + }; +public: + explicit CertificateIoDialog(QWidget *parent = nullptr); + ~CertificateIoDialog(); + + IoMode mode() const { return this->current_mode; } + void setIoMode(IoMode mode); + + QSsl::KeyAlgorithm keyAlgorithm() const; + void setKeyAlgorithm(QSsl::KeyAlgorithm alg); + + QString keyFileName() const; + QString certificateFileName() const; + +private slots: + void on_select_certificate_file_button_clicked(); + + void on_select_key_file_button_clicked(); + + void on_certificate_file_name_textChanged(const QString &arg1); + + void on_key_file_name_textChanged(const QString &arg1); + +private: + void updateUI(); + +private: + Ui::CertificateIoDialog *ui; + + IoMode current_mode; +}; + +#endif // CERTIFICATEIODIALOG_HPP diff --git a/src/certificateiodialog.ui b/src/certificateiodialog.ui new file mode 100644 index 0000000..074df28 --- /dev/null +++ b/src/certificateiodialog.ui @@ -0,0 +1,127 @@ + + + CertificateIoDialog + + + + 0 + 0 + 411 + 160 + + + + Dialog + + + + + + + + Key Type + + + + + + + false + + + false + + + + + + + Key File + + + + + + + + + + + + ... + + + + + + + + + Certificate File + + + + + + + + + + + + ... + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + CertificateIoDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + CertificateIoDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/certificatemanagementdialog.cpp b/src/certificatemanagementdialog.cpp index 9b8b095..affb569 100644 --- a/src/certificatemanagementdialog.cpp +++ b/src/certificatemanagementdialog.cpp @@ -4,6 +4,7 @@ #include "kristall.hpp" #include "newidentitiydialog.hpp" +#include "certificateiodialog.hpp" #include #include @@ -130,12 +131,25 @@ void CertificateManagementDialog::on_delete_cert_button_clicked() void CertificateManagementDialog::on_export_cert_button_clicked() { + if(this->selected_identity == nullptr) + return; + CertificateIoDialog dialog { this }; + + dialog.setKeyAlgorithm(this->selected_identity->private_key.algorithm()); + dialog.setIoMode(CertificateIoDialog::Export); + if(dialog.exec() != QDialog::Accepted) + return; } void CertificateManagementDialog::on_import_cert_button_clicked() { + CertificateIoDialog dialog { this }; + dialog.setIoMode(CertificateIoDialog::Import); + + if(dialog.exec() != QDialog::Accepted) + return; } void CertificateManagementDialog::on_create_cert_button_clicked() diff --git a/src/kristall.pro b/src/kristall.pro index 667677a..d74bfad 100644 --- a/src/kristall.pro +++ b/src/kristall.pro @@ -48,6 +48,7 @@ SOURCES += \ abouthandler.cpp \ browsertab.cpp \ certificatehelper.cpp \ + certificateiodialog.cpp \ certificatemanagementdialog.cpp \ certificateselectiondialog.cpp \ cryptoidentity.cpp \ @@ -85,6 +86,7 @@ HEADERS += \ abouthandler.hpp \ browsertab.hpp \ certificatehelper.hpp \ + certificateiodialog.hpp \ certificatemanagementdialog.hpp \ certificateselectiondialog.hpp \ cryptoidentity.hpp \ @@ -119,6 +121,7 @@ HEADERS += \ FORMS += \ browsertab.ui \ + certificateiodialog.ui \ certificatemanagementdialog.ui \ certificateselectiondialog.ui \ mainwindow.ui \ -- cgit v1.2.3