aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFelix (xq) Queißner <git@mq32.de>2020-06-20 10:35:43 +0200
committerFelix (xq) Queißner <git@mq32.de>2020-06-20 10:35:43 +0200
commit5a610c82fc4fc52d69cdd4773ad421e04c53840e (patch)
treea4aca77a306a2f07f86722bb6b5c80a0b61869b9 /src
parent7fe42f659e53092b314a0542871c417e768bb6da (diff)
downloadkristall-5a610c82fc4fc52d69cdd4773ad421e04c53840e.tar.gz
Starts implementation of certificate import/export.
Diffstat (limited to 'src')
-rw-r--r--src/certificateiodialog.cpp126
-rw-r--r--src/certificateiodialog.hpp50
-rw-r--r--src/certificateiodialog.ui127
-rw-r--r--src/certificatemanagementdialog.cpp14
-rw-r--r--src/kristall.pro3
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 \