[PATCH 4 of 7] Implement certificatelist saving
Wald Commits
scm-commit at wald.intevation.org
Wed Apr 23 18:21:56 CEST 2014
# HG changeset patch
# User Andre Heinecke <aheinecke at intevation.de>
# Date 1398267293 0
# Node ID 88dfe16a0bb9af15631f62c864d29bef904d7ecf
# Parent 2e100d3e414a4efec186d0fdcb429219514f0892
Implement certificatelist saving
diff -r 2e100d3e414a -r 88dfe16a0bb9 ui/createcertlistdialog.cpp
--- a/ui/createcertlistdialog.cpp Wed Apr 23 15:33:42 2014 +0000
+++ b/ui/createcertlistdialog.cpp Wed Apr 23 15:34:53 2014 +0000
@@ -30,7 +30,11 @@
setWindowTitle(tr("Save certificate list"));
setupGUI();
resize(500, 200);
- mCertFile->setText(mAdminWindow->settings()->value("LastCert", QString()).toString());
+ mKeyFile->setText(mAdminWindow->settings()->value("LastKey", QString()).toString());
+ mSaveDir->setText(mAdminWindow->settings()->value("LastOutputDir", QString()).toString());
+ if (!mKeyFile->text().isEmpty()) {
+ loadKeyFile(mKeyFile->text());
+ }
}
void CreateCertListDialog::setupGUI()
@@ -58,15 +62,15 @@
headerLayout->addWidget(headerSeparator);
headerLayout->insertSpacing(3, 10);
- QLabel *certLabel = new QLabel("Select signature certificate (secret key):");
+ QLabel *certLabel = new QLabel("Select signing key:");
QLabel *saveLabel = new QLabel("Select output folder:");
labelLayout->addWidget(certLabel);
labelLayout->addWidget(saveLabel);
- mCertFile = new QLineEdit();
- mSaveFile = new QLineEdit();
- fieldLayout->addWidget(mCertFile);
- fieldLayout->addWidget(mSaveFile);
+ mKeyFile = new QLineEdit();
+ mSaveDir = new QLineEdit();
+ fieldLayout->addWidget(mKeyFile);
+ fieldLayout->addWidget(mSaveDir);
QPushButton *certSelect = new QPushButton("...");
certSelect->setFixedWidth(30);
@@ -117,15 +121,8 @@
QMessageBox::warning(this, tr("Error!"), msg);
}
-void CreateCertListDialog::openCertificateSelect()
+void CreateCertListDialog::loadKeyFile(const QString& fileName)
{
- QString certFile = QFileDialog::getOpenFileName(
- this, tr("Select certificate"), mCertFile->text().isEmpty() ?
- QDir::homePath() : mCertFile->text(), "*.pem");
- mCertFile->setText(certFile);
-
- mAdminWindow->settings()->setValue("LastCert", certFile);
-
if (mPk != NULL) {
pk_free(mPk);
delete mPk;
@@ -134,29 +131,118 @@
mPk = new pk_context;
pk_init(mPk);
- int ret = pk_parse_keyfile(mPk, mCertFile->text().toLocal8Bit().constData(), "");
+ int ret = pk_parse_keyfile(mPk, mKeyFile->text().toLocal8Bit().constData(), "");
if (ret != 0) {
showErrorMessage(tr("Failed to load certificate: %1")
.arg(getPolarSSLErrorMsg(ret)));
+ pk_free(mPk);
+ delete mPk;
+ mPk = NULL;
+ return;
+ }
+
+ /* Check that it is a 3072 bit RSA key as specified */
+ if (!mPk->pk_info || pk_get_size(mPk) != 3072 ||
+ mPk->pk_info->type != POLARSSL_PK_RSA) {
+ showErrorMessage(tr("Only 3072 bit RSA keys are supported by the current format."));
+ pk_free(mPk);
+ delete mPk;
+ mPk = NULL;
return;
}
}
+void CreateCertListDialog::openCertificateSelect()
+{
+ QString keyFile = QFileDialog::getOpenFileName(
+ this, tr("Select certificate"), mKeyFile->text().isEmpty() ?
+ QDir::homePath() : mKeyFile->text(), "*.pem");
+ mKeyFile->setText(keyFile);
+
+ mAdminWindow->settings()->setValue("LastKey", keyFile);
+ loadKeyFile(keyFile);
+
+ return;
+}
+
void CreateCertListDialog::openSaveLocation()
{
- QString saveFile = QFileDialog::getExistingDirectory(
- this, tr("Select target location"), QDir::homePath());
- mSaveFile->setText(saveFile);
+ QString saveDir = QFileDialog::getExistingDirectory(
+ this, tr("Select target location"),
+ mSaveDir->text().isEmpty() ? QDir::homePath() : mSaveDir->text());
+ mAdminWindow->settings()->setValue("LastOutputDir", saveDir);
+ mSaveDir->setText(saveDir);
+}
+
+CreateCertListDialog::~CreateCertListDialog()
+{
+ if (mPk) {
+ pk_free(mPk);
+ delete mPk;
+ mPk = NULL;
+ }
}
void CreateCertListDialog::createList()
{
- //entropy_context mEntropy;
- //ctr_drbg_context mCtr_drbg;
+ if (!mPk) {
+ showErrorMessage(tr("Please select a valid rsa key."));
+ }
+ if (mSaveDir->text().isEmpty()) {
+ showErrorMessage(tr("Please select an output location first."));
+ }
- qDebug() << "and now create the certificate list using:";
- qDebug() << "certificate: " << mCertFile->text();
- qDebug() << "target" << mSaveFile->text();
- // TODO
+ QDateTime currentDateTimeUtc = QDateTime::currentDateTimeUtc();
+
+ /* Build up the list data */
+ QByteArray listData("F:1\r\n");
+ listData.append(currentDateTimeUtc.toString(Qt::ISODate) + "\r\n");
+
+ foreach (const Certificate& cert, mAdminWindow->certificates()) {
+ listData.append(QString::fromLatin1("D:") + cert.base64Line() + "\r\n");
+ }
+
+ QByteArray signature = rsaSignSHA256Hash(sha256sum(listData), mPk);
+ listData.prepend("\r\n");
+ listData.prepend(signature.toBase64());
+ listData.prepend("S:");
+
+ QString fileName = QString::fromLatin1("certificates-")
+ .append(currentDateTimeUtc.toString(("yyyyMMddHHmmss")))
+ .append(".txt");
+
+ QString filePath = mSaveDir->text().append("/").append(fileName);
+
+ QFile outputFile(filePath);
+
+ if (!outputFile.open(QIODevice::WriteOnly)) {
+ showErrorMessage(tr("Failed to open output file %1").arg(filePath));
+ return;
+ }
+
+ if (outputFile.write(listData) != listData.size()) {
+ showErrorMessage(tr("Failed to write certificate list."));
+ return;
+ }
+
+ /* Archive the list */
+ QDir archiveDir(QStandardPaths::writableLocation(QStandardPaths::DataLocation));
+ if (!archiveDir.mkpath(archiveDir.path())) {
+ showErrorMessage(tr("Failed to create archive location."));
+ return;
+ }
+
+ if (!outputFile.copy(archiveDir.filePath(fileName))) {
+ showErrorMessage(tr("Failed Archive a copy."));
+ return;
+ }
+
+ if (!outputFile.copy(archiveDir.filePath("current_certificates.txt"))) {
+ showErrorMessage(tr("Failed to write current_certificates file."));
+ return;
+ }
+
+ QMessageBox::information(this, "", tr("Saved certificate list:\n%1").arg(fileName));
+ close();
}
diff -r 2e100d3e414a -r 88dfe16a0bb9 ui/createcertlistdialog.h
--- a/ui/createcertlistdialog.h Wed Apr 23 15:33:42 2014 +0000
+++ b/ui/createcertlistdialog.h Wed Apr 23 15:34:53 2014 +0000
@@ -29,16 +29,32 @@
* process
* */
CreateCertListDialog(AdministratorWindow *parent);
+ ~CreateCertListDialog();
private:
void setupGUI();
- QLineEdit *mCertFile;
- QLineEdit *mSaveFile;
+ QLineEdit *mKeyFile;
+ QLineEdit *mSaveDir;
AdministratorWindow *mAdminWindow;
pk_context *mPk;
+ /** @brief show an error message with QMessageBox
+ *
+ * @param [in] msg The message to show
+ */
+ void showErrorMessage(const QString &msg);
+
+ /** @brief load a file into mPk
+ *
+ * If the file is not a valid key or an error
+ * occurs mPk will be NULL after a call to this function.
+ *
+ * @param [in] the file to load
+ */
+ void loadKeyFile(const QString& fileName);
+
private slots:
/** @brief Open the certificate selection dialog and parse the certificate
*
@@ -49,14 +65,11 @@
void openSaveLocation();
/** @brief create a valid certificate list file
*
- * The contents of the certificate list is the certificatelist
- * of the adminWindow. It is signed with the currently
+ * The contents of the certificate list are the certificates
+ * shown in the adminWindow. It is signed with the currently
* loaded certificate in mPk. On errors the user is
* informed with showErrorMessage */
void createList();
-
- /** @brief show an error message with QMessageBox */
- void showErrorMessage(const QString&msg);
};
#endif // CREATECERTLISTDIALOG_H
diff -r 2e100d3e414a -r 88dfe16a0bb9 ui/l10n/administrator_de_DE.ts
--- a/ui/l10n/administrator_de_DE.ts Wed Apr 23 15:33:42 2014 +0000
+++ b/ui/l10n/administrator_de_DE.ts Wed Apr 23 15:34:53 2014 +0000
@@ -79,7 +79,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../administratorwindow.cpp" line="144"/>
+ <location filename="../administratorwindow.cpp" line="142"/>
<source>Select certificate list file</source>
<translation type="unfinished"></translation>
</message>
@@ -117,7 +117,7 @@
<translation type="vanished">Zertifikatslistendatei auswählen</translation>
</message>
<message>
- <location filename="../administratorwindow.cpp" line="165"/>
+ <location filename="../administratorwindow.cpp" line="161"/>
<source>Select certificate</source>
<translation>Zertifikat auswählen</translation>
</message>
@@ -177,7 +177,7 @@
<name>CreateCertListDialog</name>
<message>
<location filename="../createcertlistdialog.cpp" line="30"/>
- <location filename="../createcertlistdialog.cpp" line="48"/>
+ <location filename="../createcertlistdialog.cpp" line="52"/>
<source>Save certificate list</source>
<translation>Zertifikatsliste speichern</translation>
</message>
@@ -195,46 +195,92 @@
<translation type="obsolete">Liste signieren</translation>
</message>
<message>
- <location filename="../createcertlistdialog.cpp" line="50"/>
+ <location filename="../createcertlistdialog.cpp" line="54"/>
<source>Save all managed root certificates in a new, signed certificate list.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../createcertlistdialog.cpp" line="80"/>
+ <location filename="../createcertlistdialog.cpp" line="84"/>
<source>In addition, each certificate list will be saved automatically in the archive directory:
</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../createcertlistdialog.cpp" line="90"/>
+ <location filename="../createcertlistdialog.cpp" line="94"/>
<source>Save list</source>
<translation type="unfinished">Liste speichern</translation>
</message>
<message>
- <location filename="../createcertlistdialog.cpp" line="92"/>
+ <location filename="../createcertlistdialog.cpp" line="96"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
<message>
- <location filename="../createcertlistdialog.cpp" line="117"/>
+ <location filename="../createcertlistdialog.cpp" line="121"/>
<source>Error!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../createcertlistdialog.cpp" line="123"/>
+ <location filename="../createcertlistdialog.cpp" line="159"/>
<source>Select certificate</source>
<translation type="unfinished">Zertifikat auswählen</translation>
</message>
<message>
- <location filename="../createcertlistdialog.cpp" line="140"/>
+ <location filename="../createcertlistdialog.cpp" line="137"/>
<source>Failed to load certificate: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../createcertlistdialog.cpp" line="149"/>
+ <location filename="../createcertlistdialog.cpp" line="148"/>
+ <source>Only 3072 bit RSA keys are supported by the current format.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../createcertlistdialog.cpp" line="172"/>
<source>Select target location</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../createcertlistdialog.cpp" line="190"/>
+ <source>Please select a valid rsa key.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../createcertlistdialog.cpp" line="193"/>
+ <source>Please select an output location first.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../createcertlistdialog.cpp" line="220"/>
+ <source>Failed to open output file %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../createcertlistdialog.cpp" line="225"/>
+ <source>Failed to write certificate list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../createcertlistdialog.cpp" line="232"/>
+ <source>Failed to create archive location.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../createcertlistdialog.cpp" line="237"/>
+ <source>Failed Archive a copy.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../createcertlistdialog.cpp" line="242"/>
+ <source>Failed to write current_certificates file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../createcertlistdialog.cpp" line="246"/>
+ <source>Saved certificate list:
+%1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>CreateInstallerDialog</name>
diff -r 2e100d3e414a -r 88dfe16a0bb9 ui/l10n/trustbridge_de_DE.ts
--- a/ui/l10n/trustbridge_de_DE.ts Wed Apr 23 15:33:42 2014 +0000
+++ b/ui/l10n/trustbridge_de_DE.ts Wed Apr 23 15:34:53 2014 +0000
@@ -48,40 +48,40 @@
<context>
<name>Downloader</name>
<message>
- <location filename="../downloader.cpp" line="80"/>
+ <location filename="../downloader.cpp" line="82"/>
<source>Invalid response</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../downloader.cpp" line="115"/>
- <location filename="../downloader.cpp" line="123"/>
- <location filename="../downloader.cpp" line="162"/>
- <location filename="../downloader.cpp" line="174"/>
+ <location filename="../downloader.cpp" line="117"/>
+ <location filename="../downloader.cpp" line="125"/>
+ <location filename="../downloader.cpp" line="164"/>
+ <location filename="../downloader.cpp" line="176"/>
<source>Connection lost</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../downloader.cpp" line="137"/>
+ <location filename="../downloader.cpp" line="139"/>
<source>Invalid response from the server</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../downloader.cpp" line="200"/>
+ <location filename="../downloader.cpp" line="202"/>
<source>Failed to initialize SSL Module.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../downloader.cpp" line="207"/>
+ <location filename="../downloader.cpp" line="209"/>
<source>Failed to connect.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../downloader.cpp" line="212"/>
+ <location filename="../downloader.cpp" line="214"/>
<source>Connected</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../downloader.cpp" line="262"/>
+ <location filename="../downloader.cpp" line="274"/>
<source>Closing</source>
<translation type="unfinished"></translation>
</message>
@@ -162,119 +162,161 @@
</message>
<message>
<location filename="../mainwindow.cpp" line="230"/>
+ <source>New Software version is available.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../mainwindow.cpp" line="231"/>
+ <source>Do you want to install the new Version?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../mainwindow.cpp" line="249"/>
<source>Check for Updates</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="232"/>
- <location filename="../mainwindow.cpp" line="267"/>
- <location filename="../mainwindow.cpp" line="332"/>
+ <location filename="../mainwindow.cpp" line="251"/>
+ <location filename="../mainwindow.cpp" line="286"/>
+ <location filename="../mainwindow.cpp" line="358"/>
<source>Quit</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="250"/>
+ <location filename="../mainwindow.cpp" line="269"/>
<source>TrustBridge</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="258"/>
+ <location filename="../mainwindow.cpp" line="277"/>
<source>Menu</source>
<translation>Menü</translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="260"/>
+ <location filename="../mainwindow.cpp" line="279"/>
<source>Force Update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="261"/>
- <location filename="../mainwindow.cpp" line="318"/>
+ <location filename="../mainwindow.cpp" line="280"/>
+ <location filename="../mainwindow.cpp" line="344"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="262"/>
+ <location filename="../mainwindow.cpp" line="281"/>
<source>Statusdialog</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="264"/>
+ <location filename="../mainwindow.cpp" line="283"/>
<source>Help</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="265"/>
+ <location filename="../mainwindow.cpp" line="284"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="295"/>
+ <location filename="../mainwindow.cpp" line="315"/>
<source>Managed Certificates</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="319"/>
+ <location filename="../mainwindow.cpp" line="321"/>
+ <location filename="../mainwindow.cpp" line="442"/>
+ <location filename="../mainwindow.cpp" line="472"/>
+ <source>Current List Date: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../mainwindow.cpp" line="345"/>
<source>Autoupdate</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="320"/>
+ <location filename="../mainwindow.cpp" line="346"/>
<source>Autostart</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="328"/>
+ <location filename="../mainwindow.cpp" line="354"/>
<source>Install selected</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="342"/>
+ <location filename="../mainwindow.cpp" line="368"/>
<source>Details</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="343"/>
+ <location filename="../mainwindow.cpp" line="369"/>
<source>Subject Common Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="344"/>
+ <location filename="../mainwindow.cpp" line="370"/>
<source>Subject Organisation:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="345"/>
+ <location filename="../mainwindow.cpp" line="371"/>
<source>Issuer Common Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="346"/>
+ <location filename="../mainwindow.cpp" line="372"/>
<source>Issuer Organisation:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="347"/>
+ <location filename="../mainwindow.cpp" line="373"/>
<source>Valid from:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="348"/>
+ <location filename="../mainwindow.cpp" line="374"/>
<source>Valid to:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="349"/>
+ <location filename="../mainwindow.cpp" line="375"/>
<source>Fingerprint:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="496"/>
+ <location filename="../mainwindow.cpp" line="474"/>
+ <source>New List Date: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../mainwindow.cpp" line="478"/>
+ <source>New certificates to install</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../mainwindow.cpp" line="483"/>
+ <source>New certificates to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../mainwindow.cpp" line="488"/>
+ <source>Old certificates to install</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../mainwindow.cpp" line="493"/>
+ <source>Old certificates to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../mainwindow.cpp" line="579"/>
<source>Error executing update</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../mainwindow.cpp" line="538"/>
+ <location filename="../mainwindow.cpp" line="621"/>
<source>Installing certificates...</source>
<translation type="unfinished"></translation>
</message>
More information about the Trustbridge-commits
mailing list