diff options
| author | Felix (xq) Queißner <git@mq32.de> | 2020-06-20 10:35:43 +0200 |
|---|---|---|
| committer | Felix (xq) Queißner <git@mq32.de> | 2020-06-20 10:35:43 +0200 |
| commit | 5a610c82fc4fc52d69cdd4773ad421e04c53840e (patch) | |
| tree | a4aca77a306a2f07f86722bb6b5c80a0b61869b9 /src | |
| parent | 7fe42f659e53092b314a0542871c417e768bb6da (diff) | |
| download | kristall-5a610c82fc4fc52d69cdd4773ad421e04c53840e.tar.gz | |
Starts implementation of certificate import/export.
Diffstat (limited to 'src')
| -rw-r--r-- | src/certificateiodialog.cpp | 126 | ||||
| -rw-r--r-- | src/certificateiodialog.hpp | 50 | ||||
| -rw-r--r-- | src/certificateiodialog.ui | 127 | ||||
| -rw-r--r-- | src/certificatemanagementdialog.cpp | 14 | ||||
| -rw-r--r-- | src/kristall.pro | 3 |
5 files changed, 320 insertions, 0 deletions
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 <QFileDialog> +#include <QPushButton> +#include <QSsl> + +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<int>(QSsl::Rsa)); + this->ui->key_type->addItem("ECDSA", QVariant::fromValue<int>(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 <QDialog> +#include <QSsl> + +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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>CertificateIoDialog</class> + <widget class="QDialog" name="CertificateIoDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>411</width> + <height>160</height> + </rect> + </property> + <property name="windowTitle"> + <string>Dialog</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QFormLayout" name="formLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Key Type</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QComboBox" name="key_type"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="editable"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Key File</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLineEdit" name="key_file_name"/> + </item> + <item> + <widget class="QToolButton" name="select_key_file_button"> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + </layout> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Certificate File</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QLineEdit" name="certificate_file_name"/> + </item> + <item> + <widget class="QToolButton" name="select_certificate_file_button"> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>CertificateIoDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>CertificateIoDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> 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 <QCryptographicHash> #include <QMessageBox> @@ -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 \ |
