diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 0987edda..d8107c63 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -39,5 +39,5 @@ db_x509req.h pki_crl.h x509v3ext.cpp db_x509super.cpp pki_evp.cpp x509v3ext.h db_x509super.h pki_evp.h xfile.h dhgen.cpp dhgen.h XcaProgress.cpp -XcaProgress.h +XcaProgress.h XcaWarningCore.cpp XcaWarningCore.h ) diff --git a/lib/XcaWarningCore.cpp b/lib/XcaWarningCore.cpp new file mode 100644 index 00000000..4c0dab87 --- /dev/null +++ b/lib/XcaWarningCore.cpp @@ -0,0 +1,76 @@ +/* vi: set sw=4 ts=4: + * + * Copyright (C) 2018 Christian Hohnstaedt. + * + * All rights reserved. + */ + +#include "XcaWarningCore.h" +#include "lib/func.h" +#include +#include + +class xcaWarning_i *xcaWarningCore::gui; + +static bool print_cmdline(const char *color, const QString &msg) +{ + console_write(stdout, QString("%1:" COL_RESET " %2\n") + .arg(color).arg(msg).toUtf8()); + return true; +} + +void xcaWarningCore::information(const QString &msg) +{ + if (gui) + gui->information(msg); + else + print_cmdline(COL_CYAN "Information", msg); +} + +void xcaWarningCore::warning(const QString &msg) +{ + if (gui) + gui->warning(msg); + else + print_cmdline(COL_RED "Warning", msg); +} + +bool xcaWarningCore::yesno(const QString &msg) +{ + return gui ? gui->yesno(msg) : + print_cmdline(COL_BLUE "Question", msg); +} + +bool xcaWarningCore::okcancel(const QString &msg) +{ + return gui ? gui->okcancel(msg) : + print_cmdline(COL_BLUE "Question", msg); +} + +void xcaWarningCore::sqlerror(QSqlError err) +{ + if (!err.isValid()) + err = QSqlDatabase::database().lastError(); + if (!err.isValid()) + return; + if (gui) + qCritical() << "SQL ERROR:" << err.text(); + + warning(err.text()); +} + +void xcaWarningCore::error(const errorEx &err) +{ + if (err.isEmpty()) + return; + QString msg = QObject::tr("The following error occurred:") + + "\n" + err.getString(); + if (gui) + gui->error(msg); +} + +void xcaWarningCore::setGui(class xcaWarning_i *g) +{ + delete gui; + gui = g; +} diff --git a/lib/XcaWarningCore.h b/lib/XcaWarningCore.h new file mode 100644 index 00000000..90754684 --- /dev/null +++ b/lib/XcaWarningCore.h @@ -0,0 +1,50 @@ +/* vi: set sw=4 ts=4: + * + * Copyright (C) 2018 - 2020 Christian Hohnstaedt. + * + * All rights reserved. + */ + +#ifndef __XCAWARNINGCORE_H +#define __XCAWARNINGCORE_H + +#include "lib/base.h" +#include "lib/exception.h" +#include + +#define XCA_INFO(msg) xcaWarningCore::information(msg) +#define XCA_WARN(msg) xcaWarningCore::warning(msg) +#define XCA_YESNO(msg) xcaWarningCore::yesno(msg) +#define XCA_OKCANCEL(msg) xcaWarningCore::okcancel(msg) +#define XCA_ERROR(err) xcaWarningCore::error(err) +#define XCA_SQLERROR(err) xcaWarningCore::sqlerror(err) +#define XCA_PASSWD_ERROR() XCA_WARN(QObject::tr("Password verify error, please try again")) + +class xcaWarning_i +{ + public: + virtual void information(const QString &msg) = 0; + virtual void warning(const QString &msg) = 0; + virtual bool yesno(const QString &msg) = 0; + virtual bool okcancel(const QString &msg) = 0; + virtual void error(const errorEx &err) = 0; +}; + +class xcaWarningCore +{ + static class xcaWarning_i *gui; + + public: + xcaWarningCore() = delete; + xcaWarningCore(const xcaWarningCore &) = delete; + ~xcaWarningCore() = delete; + + static void information(const QString &msg); + static void warning(const QString &msg); + static bool yesno(const QString &msg); + static bool okcancel(const QString &msg); + static void sqlerror(QSqlError err); + static void error(const errorEx &err); + static void setGui(class xcaWarning_i *g); +}; +#endif diff --git a/lib/database_model.cpp b/lib/database_model.cpp index 9579d61a..2759a56c 100644 --- a/lib/database_model.cpp +++ b/lib/database_model.cpp @@ -7,7 +7,7 @@ #include #include -#include "widgets/XcaWarning.h" +#include "XcaWarningCore.h" #include "widgets/PwDialog.h" #include "exception.h" diff --git a/lib/db_key.cpp b/lib/db_key.cpp index 3878819f..f0140a8b 100644 --- a/lib/db_key.cpp +++ b/lib/db_key.cpp @@ -11,15 +11,12 @@ #include "pki_scard.h" #include "main.h" -#include -#include -#include #include "exception.h" #include "ui_NewKey.h" #include "pkcs11.h" -#include "widgets/XcaWarning.h" +#include "XcaWarningCore.h" #include "widgets/PwDialog.h" #include "widgets/ExportDialog.h" diff --git a/lib/db_temp.cpp b/lib/db_temp.cpp index 5baf32ca..e54d7c78 100644 --- a/lib/db_temp.cpp +++ b/lib/db_temp.cpp @@ -8,14 +8,11 @@ #include "db_temp.h" #include "func.h" -#include "widgets/XcaWarning.h" +#include "XcaWarningCore.h" #include "widgets/NewX509.h" #include "ui_NewX509.h" #include #include -#include -#include -#include #include db_temp::db_temp() : db_x509name("templates") diff --git a/lib/db_token.cpp b/lib/db_token.cpp index 4cc623c3..c290ffcf 100644 --- a/lib/db_token.cpp +++ b/lib/db_token.cpp @@ -3,7 +3,7 @@ #include "exception.h" #include "pki_scard.h" #include "sql.h" -#include "widgets/XcaWarning.h" +#include "XcaWarningCore.h" db_token::db_token() : db_base("manageTokens") { diff --git a/lib/db_x509.cpp b/lib/db_x509.cpp index eaffd9a3..2da3398e 100644 --- a/lib/db_x509.cpp +++ b/lib/db_x509.cpp @@ -17,24 +17,18 @@ #include "database_model.h" #include "entropy.h" -#include "widgets/XcaWarning.h" +#include "XcaWarningCore.h" #include "widgets/CertExtend.h" #include "widgets/ExportDialog.h" -#include "widgets/MainWindow.h" #include "widgets/PwDialog.h" #include "widgets/RevocationList.h" #include "widgets/NewX509.h" -#include "widgets/Help.h" #include "ui_RevocationList.h" #include "ui_CertExtend.h" #include "ui_Revoke.h" #include "ui_Help.h" -#include -#include -#include - #include db_x509::db_x509() : db_x509super("certificates") diff --git a/lib/db_x509req.cpp b/lib/db_x509req.cpp index f4571521..99659c86 100644 --- a/lib/db_x509req.cpp +++ b/lib/db_x509req.cpp @@ -10,7 +10,7 @@ #include "pki_x509req.h" #include "pki_temp.h" #include "widgets/NewX509.h" -#include "widgets/XcaWarning.h" +#include "XcaWarningCore.h" #include "widgets/ExportDialog.h" db_x509req::db_x509req() : db_x509super("requests") diff --git a/lib/db_x509super.cpp b/lib/db_x509super.cpp index 2e5c07af..6e235e93 100644 --- a/lib/db_x509super.cpp +++ b/lib/db_x509super.cpp @@ -8,13 +8,12 @@ #include "pki_base.h" #include "pki_temp.h" #include "db_x509super.h" +#include "db_temp.h" #include "database_model.h" #include "oid.h" -#include "widgets/MainWindow.h" -#include "widgets/CertDetail.h" #include "widgets/XcaDialog.h" -#include "widgets/XcaWarning.h" +#include "XcaWarningCore.h" #include "ui_CertDetail.h" diff --git a/lib/func.cpp b/lib/func.cpp index 98d777af..b3e1aa9f 100644 --- a/lib/func.cpp +++ b/lib/func.cpp @@ -9,10 +9,9 @@ #include #include "func.h" #include "exception.h" -#include "lib/asn1time.h" -#include "lib/settings.h" -#include "widgets/validity.h" -#include "widgets/XcaWarning.h" +#include "asn1time.h" +#include "settings.h" +#include "XcaWarningCore.h" #include #include #include diff --git a/lib/main.cpp b/lib/main.cpp index e9c1d818..37dc2c98 100644 --- a/lib/main.cpp +++ b/lib/main.cpp @@ -12,7 +12,7 @@ #include "widgets/MainWindow.h" #include "widgets/XcaApplication.h" -#include "widgets/XcaWarning.h" +#include "XcaWarningCore.h" #include "func.h" #include "xfile.h" #include "main.h" diff --git a/lib/oid.cpp b/lib/oid.cpp index fd856dad..1e69ff69 100644 --- a/lib/oid.cpp +++ b/lib/oid.cpp @@ -9,14 +9,12 @@ #include #include -#include -#include +#include #include #include #include "func.h" #include "oid.h" -#include "widgets/XcaWarning.h" -#include "widgets/MainWindow.h" +#include "XcaWarningCore.h" int first_additional_oid = 0; diff --git a/lib/pkcs11.cpp b/lib/pkcs11.cpp index 251e2b15..6ce95fae 100644 --- a/lib/pkcs11.cpp +++ b/lib/pkcs11.cpp @@ -19,13 +19,12 @@ #include #include #include -#include #include #include #include "ui_SelectToken.h" #include "widgets/PwDialog.h" -#include "widgets/XcaWarning.h" +#include "XcaWarningCore.h" void waitcursor(int start, int line) { diff --git a/lib/pki_base.cpp b/lib/pki_base.cpp index bf1064d6..12ac237a 100644 --- a/lib/pki_base.cpp +++ b/lib/pki_base.cpp @@ -10,12 +10,11 @@ #include "xfile.h" #include "pki_base.h" #include "exception.h" -#include "widgets/XcaWarning.h" +#include "XcaWarningCore.h" #include #include #include #include -#include pki_lookup Store; diff --git a/lib/pki_evp.cpp b/lib/pki_evp.cpp index f02ab9ae..e10da443 100644 --- a/lib/pki_evp.cpp +++ b/lib/pki_evp.cpp @@ -15,7 +15,7 @@ #include "openssl_compat.h" #include "widgets/PwDialog.h" -#include "widgets/XcaWarning.h" +#include "XcaWarningCore.h" #include #include diff --git a/lib/pki_key.cpp b/lib/pki_key.cpp index 44bd1797..f40921d6 100644 --- a/lib/pki_key.cpp +++ b/lib/pki_key.cpp @@ -11,7 +11,7 @@ #include "func.h" #include "pkcs11.h" #include "exportType.h" -#include "widgets/XcaWarning.h" +#include "XcaWarningCore.h" #include #include diff --git a/lib/pki_lookup.h b/lib/pki_lookup.h index 360bfbb5..1f5ebcc1 100644 --- a/lib/pki_lookup.h +++ b/lib/pki_lookup.h @@ -14,7 +14,7 @@ #include #include -#include +#include "XcaWarningCore.h" #include "base.h" #include "sql.h" diff --git a/lib/pki_multi.cpp b/lib/pki_multi.cpp index 0002160e..db8ae33a 100644 --- a/lib/pki_multi.cpp +++ b/lib/pki_multi.cpp @@ -19,7 +19,7 @@ #include "exception.h" #include "func.h" #include "xfile.h" -#include "widgets/XcaWarning.h" +#include "XcaWarningCore.h" #include pki_multi::pki_multi(const QString &name) diff --git a/lib/pki_pkcs12.cpp b/lib/pki_pkcs12.cpp index 174a6fb0..ccc101f1 100644 --- a/lib/pki_pkcs12.cpp +++ b/lib/pki_pkcs12.cpp @@ -14,14 +14,13 @@ #include "exception.h" #include "func.h" #include "widgets/PwDialog.h" -#include "widgets/XcaWarning.h" +#include "XcaWarningCore.h" #include #include #include #warning split PwDialog into console and GUI #include "ui_PwDialog.h" -#include pki_pkcs12::pki_pkcs12(const QString &d, pki_x509 *acert, pki_key *akey) :pki_multi(d), cert(acert), key(akey) diff --git a/lib/pki_scard.cpp b/lib/pki_scard.cpp index a628c8e7..1174bdf7 100644 --- a/lib/pki_scard.cpp +++ b/lib/pki_scard.cpp @@ -16,10 +16,9 @@ #include "func.h" #include "XcaProgress.h" -#include "widgets/XcaWarning.h" +#include "XcaWarningCore.h" #warning Drop "widgets dependency" -#include "ui_MainWindow.h" #include #include diff --git a/lib/sql.cpp b/lib/sql.cpp index 44829748..2ddb657d 100644 --- a/lib/sql.cpp +++ b/lib/sql.cpp @@ -10,7 +10,7 @@ #include "base.h" #include "sql.h" #include "settings.h" -#include "widgets/XcaWarning.h" +#include "XcaWarningCore.h" int DbTransaction::mutex; int DbTransaction::error; diff --git a/widgets/CertDetail.cpp b/widgets/CertDetail.cpp index bd8d5151..d965cd44 100644 --- a/widgets/CertDetail.cpp +++ b/widgets/CertDetail.cpp @@ -11,10 +11,10 @@ #include "MainWindow.h" #include "distname.h" #include "clicklabel.h" -#include "XcaWarning.h" #include "Help.h" #include "OidResolver.h" #include "lib/func.h" +#include "lib/XcaWarningCore.h" #include #include #include diff --git a/widgets/MainWindow.cpp b/widgets/MainWindow.cpp index d0557d9f..314eb3ad 100644 --- a/widgets/MainWindow.cpp +++ b/widgets/MainWindow.cpp @@ -133,6 +133,8 @@ MainWindow::MainWindow() : QMainWindow() v->setMainwin(this, searchEdit); XcaProgress::setGui(new XcaProgressGui(this)); + xcaWarningCore::setGui(new xcaWarningGui()); + dhgen = nullptr; dhgenProgress = nullptr; } diff --git a/widgets/XcaWarning.cpp b/widgets/XcaWarning.cpp index 7ebc87cd..0e23d17b 100644 --- a/widgets/XcaWarning.cpp +++ b/widgets/XcaWarning.cpp @@ -13,111 +13,55 @@ #include #include -xcaWarning::xcaWarning(QWidget *w, const QString &txt, QMessageBox::Icon icn) +xcaWarning::xcaWarning(QWidget *w, const QString &txt, + QMessageBox::Icon icn) + : QMessageBox(icn, XCA_TITLE, txt, QMessageBox::NoButton, w) { - buttons = QMessageBox::NoButton; - m = NULL; - msg = txt; - icon = icn; - - if (IS_GUI_APP) { - m = new QMessageBox(icn, XCA_TITLE, txt, buttons, w); - m->setTextFormat(Qt::PlainText); - return; - } - button_texts[QMessageBox::Ok] = QMessageBox::tr("Ok"); - button_texts[QMessageBox::Close] = QMessageBox::tr("Close"); - button_texts[QMessageBox::Cancel] = QMessageBox::tr("Cancel"); - button_texts[QMessageBox::Apply] = QMessageBox::tr("Apply"); - button_texts[QMessageBox::Yes] = QMessageBox::tr("Yes"); - button_texts[QMessageBox::No] = QMessageBox::tr("No"); -} - -xcaWarning::~xcaWarning() -{ - delete m; -} - -void xcaWarning::setStandardButtons(QMessageBox::StandardButtons b) -{ - buttons = b; - if (m) - m->setStandardButtons(b); -} - -int xcaWarning::exec() -{ - if (m) - return m->exec(); - - QMap colors; - colors[QMessageBox::Information] = COL_CYAN "Information"; - colors[QMessageBox::Warning] = COL_RED "Warning"; - colors[QMessageBox::Critical] = COL_RED "Critical"; - colors[QMessageBox::Question] = COL_BLUE "Question"; - - console_write(stdout, QString("%1:" COL_RESET " %2\n") - .arg(colors[icon]).arg(msg).toUtf8()); - return QMessageBox::Ok; + setTextFormat(Qt::PlainText); } void xcaWarning::addButton(QMessageBox::StandardButton button, const QString &text) { - if (m) { - QPushButton *b = m->addButton(button); - if (b && !text.isEmpty()) - b->setText(text); - } else { - buttons |= button; - if (!text.isEmpty()) - button_texts[button] = text; - } + QPushButton *b = QMessageBox::addButton(button); + if (b && !text.isEmpty()) + b->setText(text); } -void xcaWarning::information(const QString &msg) +int xcaWarningGui::showBox(const QString &txt, QMessageBox::Icon icn, + QMessageBox::StandardButtons b) { - xcaWarning m(NULL, msg, QMessageBox::Information); - m.setStandardButtons(QMessageBox::Ok); - m.exec(); + xcaWarning *w = new xcaWarning(NULL, txt, icn); + w->setStandardButtons(b); + int n = w->exec(); + delete w; + return n; } -void xcaWarning::warning(const QString &msg) +void xcaWarningGui::information(const QString &msg) { - xcaWarning m(NULL, msg, QMessageBox::Warning); - m.setStandardButtons(QMessageBox::Ok); - m.exec(); + showBox(msg, QMessageBox::Information, QMessageBox::Ok); } -bool xcaWarning::yesno(const QString &msg) +void xcaWarningGui::warning(const QString &msg) { - xcaWarning m(NULL, msg, QMessageBox::Question); - m.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - return m.exec() == QMessageBox::Yes; + showBox(msg, QMessageBox::Warning, QMessageBox::Ok); } -bool xcaWarning::okcancel(const QString &msg) +bool xcaWarningGui::yesno(const QString &msg) { - xcaWarning m(NULL, msg, QMessageBox::Warning); - m.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); - return m.exec() == QMessageBox::Ok; + return showBox(msg, QMessageBox::Question, + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes; } -void xcaWarning::sqlerror(QSqlError err) +bool xcaWarningGui::okcancel(const QString &msg) { - if (!err.isValid()) - err = QSqlDatabase::database().lastError(); - - if (err.isValid()) { - qCritical() << "SQL ERROR:" << err.text(); - XCA_WARN(err.text()); - } + return showBox(msg, QMessageBox::Warning, + QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok; } -void xcaWarning::error(const errorEx &err) +void xcaWarningGui::error(const errorEx &err) { - if (err.isEmpty()) - return; QString msg = tr("The following error occurred:") + "\n" + err.getString(); xcaWarning box(NULL, msg); diff --git a/widgets/XcaWarning.h b/widgets/XcaWarning.h index c60a8604..5add02d7 100644 --- a/widgets/XcaWarning.h +++ b/widgets/XcaWarning.h @@ -8,45 +8,28 @@ #ifndef __XCAWARNING_H #define __XCAWARNING_H -#include "lib/base.h" -#include "lib/exception.h" +#include "lib/XcaWarningCore.h" #include -#include -#include -#define XCA_INFO(msg) xcaWarning::information(msg) -#define XCA_WARN(msg) xcaWarning::warning(msg) -#define XCA_YESNO(msg) xcaWarning::yesno(msg) -#define XCA_OKCANCEL(msg) xcaWarning::okcancel(msg) -#define XCA_ERROR(err) xcaWarning::error(err) -#define XCA_SQLERROR(err) xcaWarning::sqlerror(err) -#define XCA_PASSWD_ERROR() XCA_WARN(QObject::tr("Password verify error, please try again")) - -class xcaWarning: public QObject +class xcaWarning: public QMessageBox { - Q_OBJECT - - private: - QMessageBox *m; - QMessageBox::StandardButtons buttons; - QMap button_texts; - QMessageBox::Icon icon; - QString msg; - public: xcaWarning(QWidget *w, const QString &txt, QMessageBox::Icon icn = QMessageBox::Warning); - ~xcaWarning(); - void setStandardButtons(QMessageBox::StandardButtons b); void addButton(QMessageBox::StandardButton button, const QString &text = QString()); - int exec(); +}; - static void information(const QString &msg); - static void warning(const QString &msg); - static bool yesno(const QString &msg); - static bool okcancel(const QString &msg); - static void sqlerror(QSqlError err); - static void error(const errorEx &err); +class xcaWarningGui : public QObject, public xcaWarning_i +{ + public: + int showBox(const QString &txt, QMessageBox::Icon icn, + QMessageBox::StandardButtons b); + void information(const QString &msg); + void warning(const QString &msg); + bool yesno(const QString &msg); + bool okcancel(const QString &msg); + void sqlerror(QSqlError err); + void error(const errorEx &err); }; #endif