diff --git a/CMakeLists.txt b/CMakeLists.txt index cec28d0f..d72eb6a9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,7 +25,7 @@ set(CMAKE_OSX_DEPLOYMENT_TARGET 10.13) set(CMAKE_POSITION_INDEPENDENT_CODE ON) -set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTOMOC ON) @@ -49,15 +49,15 @@ if (APPLE) execute_process(COMMAND brew --prefix OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE BREW_PREFIX ERROR_QUIET) # Preset the default brew paths.... - if (NOT Qt5_DIR) - set(Qt5_DIR ${BREW_PREFIX}/opt/qt@5/lib/cmake/Qt5) + if (NOT CMAKE_PREFIX_PATH) + set(CMAKE_PREFIX_PATH ${BREW_PREFIX}/opt/qt@5/) endif() if (NOT OPENSSL_ROOT_DIR) set(OPENSSL_ROOT_DIR ${BREW_PREFIX}/opt/openssl@1.1) endif() elseif(WIN32) - if (NOT Qt5_DIR) - set(Qt5_DIR "C:/Qt/5.15.2/mingw81_64/lib/cmake/Qt5") + if (NOT CMAKE_PREFIX_PATH) + set(CMAKE_PREFIX_PATH "C:/Qt/5.15.2/mingw81_64/") endif() if (NOT OPENSSL_ROOT_DIR) set(OPENSSL_ROOT_DIR $ENV{PROGRAMFILES}/OpenSSL-Win64) @@ -75,13 +75,18 @@ elseif(WIN32) file(TO_CMAKE_PATH $ENV{WINDIR}/system32 SYSTEM32) endif() file(TO_CMAKE_PATH "${OPENSSL_ROOT_DIR}" OPENSSL_ROOT_DIR) -file(TO_CMAKE_PATH "${Qt5_DIR}" Qt5_DIR) file(TO_CMAKE_PATH "${PSQL_BINDIR}" PSQL_BINDIR) file(TO_CMAKE_PATH "${MYSQL_BINDIR}" MYSQL_BINDIR) find_package(OpenSSL REQUIRED) -find_package(Qt5 REQUIRED COMPONENTS Core Widgets Sql Help LinguistTools) -get_target_property(qmake_executable Qt5::qmake IMPORTED_LOCATION) +find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core) +set(QT Qt${QT_VERSION_MAJOR}) +find_package(${QT} REQUIRED COMPONENTS Core Widgets Sql Help LinguistTools) +message(STATUS "Using ${QT} with version ${QT_VERSION}") + +get_target_property(qmake_executable ${QT}::qmake IMPORTED_LOCATION) +get_target_property(core_libdir ${QT}::Core IMPORTED_LOCATION) +message(QTCORE ${core_libdir}) get_filename_component(_qt_bin_dir "${qmake_executable}" DIRECTORY) find_program(MACDEPLOYQT_EXECUTABLE macdeployqt HINTS "${_qt_bin_dir}") find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${_qt_bin_dir}") @@ -93,9 +98,9 @@ endif() target_link_libraries(${CMAKE_PROJECT_NAME} core widgets core OpenSSL::Crypto - Qt5::Widgets Qt5::Core Qt5::Sql Qt5::Help + ${QT}::Widgets ${QT}::Core ${QT}::Sql ${QT}::Help ) -target_link_libraries(xcadoc core Qt5::Core) +target_link_libraries(xcadoc core ${QT}::Core) if (APPLE) @@ -108,13 +113,13 @@ if (APPLE) ##### Plugins - get_target_property(sqlplugins Qt5::Sql QT_ALL_PLUGINS_sqldrivers) + get_target_property(sqlplugins ${QT}::Sql QT_ALL_PLUGINS_sqldrivers) message(STATUS "SQL Plugins ${sqlplugins}") foreach(sql ${sqlplugins}) get_target_property(loc ${sql} LOCATION_${CMAKE_BUILD_TYPE}) list(APPEND sqlplugin_paths "${loc}") endforeach() - qt5_import_plugins(${CMAKE_PROJECT_NAME} INCLUDE_BY_TYPE sqldrivers) + qt_import_plugins(${CMAKE_PROJECT_NAME} INCLUDE_BY_TYPE sqldrivers) # Avoid bin/ sub-directory in DMG set(RUNTIME_DEST .) @@ -171,7 +176,7 @@ if(APPLE) XCODE_ATTRIBUTE_SKIP_INSTALL No RESOURCE "${APP_RESOURCES}" ) - get_target_property(qmake_executable Qt5::qmake IMPORTED_LOCATION) + get_target_property(qmake_executable ${QT}::qmake IMPORTED_LOCATION) get_filename_component(_qt_bin_dir "${qmake_executable}" DIRECTORY) find_program(MACDEPLOYQT_EXECUTABLE macdeployqt HINTS ${_qt_bin_dir}) @@ -219,11 +224,11 @@ elseif(WIN32) ${CMAKE_BINARY_DIR}/styles DESTINATION ${RUNTIME_DEST} ) - install(FILES ${CMAKE_BINARY_DIR}/Qt5Core.dll - ${CMAKE_BINARY_DIR}/Qt5Gui.dll - ${CMAKE_BINARY_DIR}/Qt5Help.dll - ${CMAKE_BINARY_DIR}/Qt5Sql.dll - ${CMAKE_BINARY_DIR}/Qt5Widgets.dll + install(FILES ${CMAKE_BINARY_DIR}/${QT}Core.dll + ${CMAKE_BINARY_DIR}/${QT}Gui.dll + ${CMAKE_BINARY_DIR}/${QT}Help.dll + ${CMAKE_BINARY_DIR}/${QT}Sql.dll + ${CMAKE_BINARY_DIR}/${QT}Widgets.dll ${CMAKE_BINARY_DIR}/libgcc_s_seh-1.dll ${CMAKE_BINARY_DIR}/libstdc++-6.dll ${CMAKE_BINARY_DIR}/libwinpthread-1.dll diff --git a/cmake/git_version.cmake b/cmake/git_version.cmake index d1f04741..c502a40b 100644 --- a/cmake/git_version.cmake +++ b/cmake/git_version.cmake @@ -48,5 +48,4 @@ if(Git_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git") endif() -message(STATUS "VERSION: ${PROJECT_VERSION}") - +message(STATUS "XCA Version: ${PROJECT_VERSION}") diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index e7c3f692..f9a1b483 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -129,7 +129,7 @@ if(SPHINX) endif() else(QTCOLLGEN) - message(WARNING "Neither 'qhelpgenerator' nor 'qcollectiongenerator' found. In-app documentation disabed. ${Qt5_DIR}/../../../bin") + message(WARNING "Neither 'qhelpgenerator' nor 'qcollectiongenerator' found. In-app documentation disabed. ${Qt_DIR}/../../../bin") endif(QTCOLLGEN) else(SPHINX) message(WARNING "sphinx-build binary not found. Documentation generation disabled") diff --git a/lang/CMakeLists.txt b/lang/CMakeLists.txt index 9ae75cf3..0d54a8c8 100644 --- a/lang/CMakeLists.txt +++ b/lang/CMakeLists.txt @@ -28,7 +28,11 @@ string(APPEND WIX_LANG_CONTENT WixFile(${D}/language.wxs ${WIX_LANG_CONTENT}) -qt5_add_translation(QM_FILES ${TS_FILES}) +if (${QT_VERSION} VERSION_LESS 6.0.0) + qt5_add_translation(QM_FILES ${TS_FILES}) +else() + qt_add_translation(QM_FILES ${TS_FILES}) +endif() list(APPEND APP_RESOURCES ${QM_FILES}) add_custom_target(translations DEPENDS ${QM_FILES}) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index bd488d3d..2b635c69 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -1,10 +1,6 @@ -include_directories(${Qt5Sql_INCLUDE_DIRS} - ${Qt5Core_INCLUDE_DIRS} - ${Qt5Help_INCLUDE_DIRS} - ${OPENSSL_INCLUDE_DIR} - ${PROJECT_BINARY_DIR} - ${PROJECT_SOURCE_DIR} -) + +include_directories(${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR}) + add_library(core STATIC BioByteArray.cpp dbhistory.cpp pki_key.cpp BioByteArray.h dbhistory.h pki_key.h @@ -42,3 +38,6 @@ XcaProgress.h XcaWarningCore.cpp XcaWarningCore.h PwDialogCore.cpp PwDialogCore.h digest.h digest.cpp pki_export.cpp ) + +target_link_libraries(core PRIVATE + OpenSSL::Crypto ${QT}::Core ${QT}::Sql ${QT}::Help) diff --git a/lib/asn1time.cpp b/lib/asn1time.cpp index f823e64f..53e2dfe8 100644 --- a/lib/asn1time.cpp +++ b/lib/asn1time.cpp @@ -26,7 +26,7 @@ bool a1time::isUndefined() const { - return toTime_t() == 0; + return toSecsSinceEpoch() == 0; } a1time &a1time::setUndefined() @@ -34,7 +34,7 @@ a1time &a1time::setUndefined() /* This way we handle "Jan 01, 1970 00:00:00" * like RFC-5280 undefined date. I dare it */ setTimeSpec(Qt::UTC); - setTime_t(0); + setSecsSinceEpoch(0); return *this; } diff --git a/lib/db_base.cpp b/lib/db_base.cpp index 52dfbe8d..227375a6 100644 --- a/lib/db_base.cpp +++ b/lib/db_base.cpp @@ -596,7 +596,12 @@ void db_base::timerEvent(QTimerEvent *event) qDebug() << "Date changed for" << pki->getIntName() << ":" << hd->getName() << "Col:" << idx << t.toSortable(); QModelIndex i; i = createIndex(rownumber(pki), idx, pki); - emit dataChanged(i, i); +#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) + emit dataChanged(i, i, QList{Qt::DisplayRole}); +#else + emit dataChanged(i, i, QVector{Qt::DisplayRole}); +#endif + } } } diff --git a/lib/func.cpp b/lib/func.cpp index 184175ba..29d43bcf 100644 --- a/lib/func.cpp +++ b/lib/func.cpp @@ -237,7 +237,7 @@ const QString getDocDir() #ifdef DOCDIR docs << QString(DOCDIR); #endif - docs += QStandardPaths::standardLocations(QStandardPaths::DataLocation); + docs += QStandardPaths::standardLocations(QStandardPaths::AppDataLocation); foreach (docdir, docs) { #if !defined(Q_OS_MAC) docdir += "/html"; @@ -275,7 +275,7 @@ const QString getUserSettingsDir() const QString getI18nDir() { - QString qm = QStandardPaths::locate(QStandardPaths::DataLocation, + QString qm = QStandardPaths::locate(QStandardPaths::AppDataLocation, I18N_DIR "xca_de.qm"); return QFileInfo(qm).path(); } diff --git a/lib/pkcs11_lib.cpp b/lib/pkcs11_lib.cpp index 27c1625a..f7d3b32a 100644 --- a/lib/pkcs11_lib.cpp +++ b/lib/pkcs11_lib.cpp @@ -14,7 +14,6 @@ #include #include -#include #include "ui_SelectToken.h" diff --git a/lib/sql.cpp b/lib/sql.cpp index 2732ced3..6afaadb4 100644 --- a/lib/sql.cpp +++ b/lib/sql.cpp @@ -150,7 +150,11 @@ QString XSqlQuery::rewriteQuery(QString _q) QString XSqlQuery::query_details() { QString lq = lastq; - QList list = boundValues().values(); +#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) + QVariantList list = boundValues(); +#else + QVariantList list = boundValues().values(); +#endif QStringList sl; if (query != lastq) { diff --git a/misc/dynamic.wxs.in b/misc/dynamic.wxs.in index fded4b16..2edfd6db 100644 --- a/misc/dynamic.wxs.in +++ b/misc/dynamic.wxs.in @@ -13,6 +13,21 @@ Copy C:\Windows\System32\vcruntime140.dll C:\Windows\WOW64\ The WIX system uses that one and it crashes on the target. --> + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - @@ -188,11 +173,11 @@ - - - - - + + + + + @@ -201,7 +186,7 @@ + Description="Contains the main application, required Qt libraries and the SQLite driver."> diff --git a/widgets/CMakeLists.txt b/widgets/CMakeLists.txt index 1f36d414..599ebe1c 100644 --- a/widgets/CMakeLists.txt +++ b/widgets/CMakeLists.txt @@ -1,11 +1,6 @@ -include_directories(${Qt5Widgets_INCLUDE_DIRS} - ${Qt5Sql_INCLUDE_DIRS} - ${Qt5Core_INCLUDE_DIRS} - ${Qt5Help_INCLUDE_DIRS} - ${OPENSSL_INCLUDE_DIR} - ${PROJECT_BINARY_DIR} - ${PROJECT_SOURCE_DIR} -) + +include_directories(${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR}) + add_library(widgets STATIC CertDetail.cpp NewCrl.cpp XcaApplication.h CertDetail.h NewCrl.h XcaDialog.cpp @@ -34,3 +29,6 @@ MW_menu.cpp X509SuperTreeView.cpp v3ext.h MainWindow.cpp X509SuperTreeView.h validity.cpp MainWindow.h XcaApplication.cpp validity.h ) + +target_link_libraries(widgets PRIVATE + OpenSSL::Crypto ${QT}::Widgets ${QT}::Core ${QT}::Sql ${QT}::Help) diff --git a/widgets/CertDetail.cpp b/widgets/CertDetail.cpp index 9e5cd1cc..dc4136dc 100644 --- a/widgets/CertDetail.cpp +++ b/widgets/CertDetail.cpp @@ -207,7 +207,7 @@ void CertDetail::setReq(pki_x509req *req) QGridLayout *attrLayout = new QGridLayout(attributes); attrLayout->setAlignment(Qt::AlignTop); attrLayout->setSpacing(6); - attrLayout->setMargin(11); + attrLayout->setContentsMargins(11, 11, 11, 11); for (int i = 0, ii = 0; i #include #include +#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) +#include +#endif Help::Help() : QWidget(NULL), helpengine(nullptr) { @@ -42,19 +45,29 @@ void Help::content() display(QUrl("qthelp://org.sphinx.xca/doc/index.html")); } -QMap Help::url_by_ctx(const QString &ctx) const +QList Help::url_by_ctx(const QString &ctx) const { if (!helpengine) - return QMap(); - return helpengine->linksForIdentifier(QString("%1.%1").arg(ctx)); + return QList(); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) + QList l; + foreach(QHelpLink hl, + helpengine->documentsForIdentifier(QString("%1.%1").arg(ctx))) + { + l << hl.url; + } + return l; +#else + return helpengine->linksForIdentifier(QString("%1.%1").arg(ctx)).values(); +#endif } void Help::contexthelp(const QString &context) { - QMap helpctx = url_by_ctx(context); + QList helpctx = url_by_ctx(context); if (helpctx.count()) - display(helpctx.constBegin().value()); + display(helpctx.at(0)); } void Help::contexthelp() @@ -81,7 +94,7 @@ void Help::register_ctxhelp_button(QDialog *dlg, const QString &help_ctx) const buttonBox->setProperty("help_ctx", QVariant(help_ctx)); connect(buttonBox, SIGNAL(helpRequested()), this, SLOT(contexthelp())); - if (helpengine && url_by_ctx(help_ctx).count() == 0) { + if (url_by_ctx(help_ctx).count() == 0) { qWarning() << "Unknown help context: " << help_ctx; buttonBox->button(QDialogButtonBox::Help)->setEnabled(false); } diff --git a/widgets/Help.h b/widgets/Help.h index e99e93a3..82c9be37 100644 --- a/widgets/Help.h +++ b/widgets/Help.h @@ -26,7 +26,7 @@ class Help: public QWidget, public Ui::Help ~Help(); void register_ctxhelp_button(QDialog *dlg, const QString &help_ctx) const; - QMap url_by_ctx(const QString &ctx) const; + QList url_by_ctx(const QString &ctx) const; public slots: void contexthelp(); diff --git a/widgets/KeyTreeView.cpp b/widgets/KeyTreeView.cpp index 7ba7e5be..3865c287 100644 --- a/widgets/KeyTreeView.cpp +++ b/widgets/KeyTreeView.cpp @@ -14,6 +14,7 @@ #include "ExportDialog.h" #include "XcaWarning.h" #include +#include #include void KeyTreeView::fillContextMenu(QMenu *menu, QMenu *subExport, diff --git a/widgets/MW_menu.cpp b/widgets/MW_menu.cpp index ff1eac6b..13310cde 100644 --- a/widgets/MW_menu.cpp +++ b/widgets/MW_menu.cpp @@ -28,6 +28,7 @@ #include #include #include +#include static QAction *languageMenuEntry(const QStringList &sl) { diff --git a/widgets/NewX509.cpp b/widgets/NewX509.cpp index 23e7bb50..13cd8432 100644 --- a/widgets/NewX509.cpp +++ b/widgets/NewX509.cpp @@ -68,7 +68,8 @@ QList NewX509::setupExplicitInputs(NIDlist nid_list, layout = new QGridLayout(parent); layout->setAlignment(Qt::AlignTop); layout->setSpacing(6); - layout->setMargin(0); + layout->setContentsMargins(0, 0, 0, 0); + layout->setContentsMargins(11, 11, 11, 11); } int n = 0, col = 0; diff --git a/widgets/Options.cpp b/widgets/Options.cpp index 6317c0a5..2fdbe7fd 100644 --- a/widgets/Options.cpp +++ b/widgets/Options.cpp @@ -38,7 +38,8 @@ Options::Options(QWidget *parent) << tr("UTF8 strings only (RFC2459)") << tr("All strings"); mbstring->addItems(s); - mbstring->setCurrentIndex(string_opts.indexOf(Settings["string_opt"])); + mbstring->setCurrentIndex(string_opts.indexOf( + QString(Settings["string_opt"]))); searchP11 = NULL; transDnEntries->setText(transDnEntries->text() diff --git a/widgets/XcaApplication.cpp b/widgets/XcaApplication.cpp index 2ae54fdb..caed957b 100644 --- a/widgets/XcaApplication.cpp +++ b/widgets/XcaApplication.cpp @@ -12,7 +12,6 @@ #include "lib/entropy.h" #include -#include #include #include #include @@ -50,13 +49,13 @@ XcaApplication::XcaApplication(int &argc, char *argv[]) } langAvail << QLocale::system(); - langAvail << QString("en"); + langAvail << QLocale("en"); QDirIterator qmIt(getI18nDir(), QStringList() << "*.qm", QDir::Files); while (qmIt.hasNext()) { XcaTranslator t; qmIt.next(); QString language = qmIt.fileInfo().baseName().mid(4, -1); - if (t.load(language, "xca", getI18nDir())) + if (t.load(QLocale(language), "xca", getI18nDir())) langAvail << QLocale(language); } setupLanguage(lang); @@ -157,8 +156,13 @@ bool XcaApplication::eventFilter(QObject *watched, QEvent *ev) case QEvent::NonClientAreaMouseMove: if (mctr++ > 8) { me = static_cast(ev); - Entropy::add(me->globalX()); - Entropy::add(me->globalY()); +#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) + QPoint p = me->globalPosition().toPoint(); +#else + QPoint p = me->globalPos(); +#endif + Entropy::add(p.x()); + Entropy::add(p.y()); mctr = 0; } break; @@ -174,7 +178,7 @@ bool XcaApplication::eventFilter(QObject *watched, QEvent *ev) dynamic_cast(watched->parent()) : NULL; if ((watched == mainw || treeview) && - me->button() == Qt::MidButton && + me->button() == Qt::MiddleButton && QApplication::clipboard()->supportsSelection()) { mainw->pastePem(); diff --git a/widgets/distname.cpp b/widgets/distname.cpp index 1db0ffbb..4bc3a648 100644 --- a/widgets/distname.cpp +++ b/widgets/distname.cpp @@ -23,16 +23,16 @@ DistName::DistName(QWidget* parent) DistNameLayout = new QGridLayout(); DistNameLayout->setAlignment(Qt::AlignTop); DistNameLayout->setSpacing(6); - DistNameLayout->setMargin(11); + DistNameLayout->setContentsMargins(11, 11, 11, 11); QGridLayout *g = new QGridLayout(); g->setAlignment(Qt::AlignTop); g->setSpacing(6); - g->setMargin(11); + g->setContentsMargins(11, 11, 11, 11); QVBoxLayout *v = new QVBoxLayout(this); v->setSpacing(6); - v->setMargin(11); + v->setContentsMargins(11, 11, 11, 11); v->addLayout(DistNameLayout); v->addStretch(); v->addLayout(g);