From e1a76dc4d0e04bba3147afc9721ffc5ae51ce6c6 Mon Sep 17 00:00:00 2001 From: Governikus Date: Wed, 10 Apr 2024 13:44:19 +0200 Subject: [PATCH] Add revision: v2.1.1 --- CMakeLists.txt | 2 +- Dockerfile | 1 + cmake/Tools.Libraries.cmake | 2 +- docs/releasenotes/2.1.1.rst | 20 ++ docs/releasenotes/appcast.rst | 1 + docs/releasenotes/versions.rst | 1 + libs/patches.cmake | 2 +- .../openssl-0001-Remove-ios-version-min.patch | 2 +- .../openssl-0002-android-shlib_variant.patch | 2 +- ...usage-of-logging-category-on-Android.patch | 2 +- ...20algorithm.h-when-xcodebuild-is-use.patch | 2 +- ...-invalidate-a11y-whenever-UI-element.patch | 6 +- ...roxyWrapper-after-shutdown-of-QCoreA.patch | 2 +- ...5-Do-not-override-OPENSSL_API_COMPAT.patch | 2 +- ...ld-with-libxkbcommon-1.6.0-and-later.patch | 2 +- ..._CTX_set_dh_auto-if-DHparam-is-empty.patch | 8 +- ...base-0008-HPack-fix-a-Yoda-Condition.patch | 2 +- ...fix-incorrect-integer-overflow-check.patch | 2 +- ...-0010-Fix-compilation-with-MSVC-17.8.patch | 2 +- ...isSessionScheduled-when-starting-a-i.patch | 2 +- ...002-Silence-expected-java-exceptions.patch | 2 +- ...read_attr_init-to-stackPropertiesGen.patch | 2 +- ...inding-loops-for-x-y-width-and-heigh.patch | 2 +- ...m-more-fixes-for-bindable-properties.patch | 2 +- ...x-binding-loop-issue-in-quick-layout.patch | 6 +- ...qtscxml-0001-Build-statemachine-only.patch | 4 +- ...-linguist-but-keep-translation-tools.patch | 2 +- ...ls-0002-Disable-designer-and-uitools.patch | 2 +- presets/ci.json | 4 + .../jenkins/dsl/Builds/Build_Android.groovy | 8 +- .../jenkins/dsl/Builds/Build_FreeBSD.groovy | 2 +- .../jenkins/dsl/Builds/Build_SonarQube.groovy | 2 +- .../jenkins/dsl/Reviews/Review_Android.groovy | 8 +- .../jenkins/dsl/Reviews/Review_Linux.groovy | 2 +- .../dsl/Reviews/Review_SonarQube.groovy | 2 +- .../AuthView/+desktop/EditRights.qml | 2 + .../+mobile/CheckIDCardResultView.qml | 6 +- .../+mobile/CheckIDCardSuggestionView.qml | 4 +- .../+mobile/CheckResultSuggestionView.qml | 1 + .../+mobile/SuggestionData.qml | 1 + .../qml/Governikus/Global/+desktop/Hint.qml | 2 - .../qml/Governikus/Global/+mobile/Hint.qml | 2 - .../Governikus/Global/GInformativeButton.qml | 12 +- .../qml/Governikus/Global/NumberField.qml | 2 +- .../+desktop/PasswordInfoView.qml | 3 + .../+mobile/PasswordInfoView.qml | 3 + .../PasswordInfoView/PasswordInfoContent.qml | 1 + .../PasswordInfoView/PasswordInfoData.qml | 6 + .../RemoteServiceView/PairingSuccessView.qml | 2 +- .../ResultView/+desktop/ResultView.qml | 2 + .../ResultView/+mobile/ResultView.qml | 3 + .../SettingsView/+desktop/GeneralSettings.qml | 7 +- .../SettingsView/+desktop/SettingsView.qml | 7 - .../Workflow/+mobile/NfcWorkflow.qml | 15 +- resources/translations/ausweisapp_de.ts | 120 +++++-- resources/translations/ausweisapp_ru.ts | 120 +++++-- resources/translations/ausweisapp_uk.ts | 120 +++++-- .../updatable-files/supported-providers.json | 48 ++- .../updatable-files/supported-readers.json | 301 ++++++++++++------ src/CMakeLists.txt | 2 +- src/card/base/apdu/CommandApdu.cpp | 40 +-- src/card/base/apdu/CommandApdu.h | 1 + src/card/base/apdu/SecureMessagingCommand.h | 10 +- src/card/base/asn1/CVCertificate.cpp | 1 + src/card/base/pace/SecureMessaging.cpp | 17 +- src/card/base/pace/SecureMessaging.h | 2 - src/card/nfc/NfcReader.cpp | 9 +- src/global/FailureCode.h | 4 +- src/network/HttpHandler.cpp | 92 ++++-- src/network/HttpHandler.h | 5 +- src/network/HttpServerRequestor.cpp | 18 ++ src/network/HttpServerRequestor.h | 2 + src/network/NetworkManager.cpp | 16 + src/network/NetworkManager.h | 2 + src/network/TlsChecker.cpp | 9 + src/network/TlsChecker.h | 2 + src/ui/json/MessageDispatcher.cpp | 6 + src/ui/json/MessageDispatcher.h | 1 + src/ui/json/UIPlugInJson.cpp | 13 +- src/ui/json/UIPlugInJson.h | 6 +- src/ui/qml/CMakeLists.txt | 6 +- src/ui/qml/PinResetInformationModel.cpp | 10 +- src/ui/qml/RemoteDeviceModel.cpp | 37 ++- src/ui/qml/RemoteDeviceModel.h | 4 +- src/ui/qml/UIPlugInQml.cpp | 9 + .../base/states/StateCheckRefreshAddress.cpp | 32 +- .../base/states/StateCheckRefreshAddress.h | 2 +- .../StateGenericProviderCommunication.cpp | 8 +- .../base/states/StateGenericSendReceive.cpp | 6 +- src/workflows/base/states/StateGetTcToken.cpp | 4 +- test/qt/card/base/apdu/test_CommandApdu.cpp | 6 + .../card/base/apdu/test_SecureMessaging.cpp | 42 ++- .../test_ProviderConfiguration.cpp | 2 +- .../test_ProviderConfigurationParser.cpp | 4 +- .../test_ReaderConfiguration.cpp | 149 ++++----- test/qt/network/test_TlsChecker.cpp | 39 ++- test/qt/ui/json/test_UIPlugInJson.cpp | 49 ++- test/qt/ui/qml/test_RemoteDeviceModel.cpp | 46 +++ .../ui/webservice/test_UIPlugInWebService.cpp | 32 ++ 99 files changed, 1172 insertions(+), 478 deletions(-) create mode 100644 docs/releasenotes/2.1.1.rst diff --git a/CMakeLists.txt b/CMakeLists.txt index 5031c8a78..222c4ec90 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,7 @@ if(UNIX AND NOT IOS) set(CMAKE_OSX_DEPLOYMENT_TARGET 12.0 CACHE STRING "Required macOS version") endif() -project(AusweisApp VERSION 2.1.0 LANGUAGES ${LANGUAGES}) +project(AusweisApp VERSION 2.1.1 LANGUAGES ${LANGUAGES}) # Set TWEAK if not defined in PROJECT_VERSION above to # have a valid tweak version without propagating it diff --git a/Dockerfile b/Dockerfile index d9059cbb6..d16519a52 100644 --- a/Dockerfile +++ b/Dockerfile @@ -32,6 +32,7 @@ RUN cmake /src/ausweisapp -B /build/app \ -DCONTAINER_SDK=ON \ -DCMAKE_BUILD_TYPE=MinSizeRel \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON \ -GNinja && \ cmake --build /build/app && cmake --install /build/app && \ ccache -s -vv && rm -rf /build diff --git a/cmake/Tools.Libraries.cmake b/cmake/Tools.Libraries.cmake index 439bd588c..f9b8a6539 100644 --- a/cmake/Tools.Libraries.cmake +++ b/cmake/Tools.Libraries.cmake @@ -26,7 +26,7 @@ if(NOT TARGET format.qml) unset(QMLFORMAT CACHE) # let's retry later else() file(GLOB_RECURSE FILES_QML ${PROJECT_SOURCE_DIR}/*.qml) - set(QMLFORMAT_CMD ${QMLFORMAT} -v -i -n -l unix -t -w 4) + set(QMLFORMAT_CMD ${QMLFORMAT} -v && ${QMLFORMAT} -i -n -l unix -t -w 4) set(FORMATTING_FILE ${PROJECT_BINARY_DIR}/formatting.files.qml) file(WRITE ${FORMATTING_FILE} "") diff --git a/docs/releasenotes/2.1.1.rst b/docs/releasenotes/2.1.1.rst new file mode 100644 index 000000000..34e8d3920 --- /dev/null +++ b/docs/releasenotes/2.1.1.rst @@ -0,0 +1,20 @@ +AusweisApp 2.1.1 +^^^^^^^^^^^^^^^^ + +**Releasedatum:** 10. April 2024 + + +Anwender +"""""""" +- Visuelle Anpassungen und Optimierungen der grafischen Oberfläche. + +- Korrektur von selten auftretenden Problemen im Zusammenhang + mit dem verwendeten Browser. + +- Textuelle Anpassungen. + + +Entwickler +"""""""""" +- Korrektur von READER Messages im SDK bei der Verwendung von + unbekannten Karten oder bei instabiler Verbindung zur Karte. diff --git a/docs/releasenotes/appcast.rst b/docs/releasenotes/appcast.rst index ed4ecf549..bcb6c0154 100644 --- a/docs/releasenotes/appcast.rst +++ b/docs/releasenotes/appcast.rst @@ -4,6 +4,7 @@ Release Notes .. toctree:: :maxdepth: 1 + 2.1.1 2.1.0 announce issues diff --git a/docs/releasenotes/versions.rst b/docs/releasenotes/versions.rst index 1a4062735..b6b1b2169 100644 --- a/docs/releasenotes/versions.rst +++ b/docs/releasenotes/versions.rst @@ -6,6 +6,7 @@ Versionszweig 2.1 .. toctree:: :maxdepth: 1 + 2.1.1 2.1.0 diff --git a/libs/patches.cmake b/libs/patches.cmake index 64dd98b24..6763c10fb 100644 --- a/libs/patches.cmake +++ b/libs/patches.cmake @@ -205,7 +205,7 @@ function(generate_patches) set(component "${dirname}/") endif() - execute_dir("${dirname}" format-patch --no-signature --no-renames --no-binary --src-prefix=x/${component} --dst-prefix=y/${component} -k ${latesttag}..HEAD -o "${patch_dir}") + execute_dir("${dirname}" format-patch --full-index --no-signature --no-renames --no-binary --src-prefix=x/${component} --dst-prefix=y/${component} -k ${latesttag}..HEAD -o "${patch_dir}") rename_patches(${dirname}) else() message(STATUS "Skip patches of ${dirname} and branch ${current_branch}") diff --git a/libs/patches/openssl-0001-Remove-ios-version-min.patch b/libs/patches/openssl-0001-Remove-ios-version-min.patch index a59f05f7e..1d084b728 100644 --- a/libs/patches/openssl-0001-Remove-ios-version-min.patch +++ b/libs/patches/openssl-0001-Remove-ios-version-min.patch @@ -8,7 +8,7 @@ Subject: Remove ios-version-min 1 file changed, 1 insertion(+), 1 deletion(-) diff --git x/Configurations/15-ios.conf y/Configurations/15-ios.conf -index 54d37f63f4..59739aeceb 100644 +index 54d37f63f445d450ae767903da4d102328b0f142..59739aecebe21780a3990f3f78e10ae92755514b 100644 --- x/Configurations/15-ios.conf +++ y/Configurations/15-ios.conf @@ -25,7 +25,7 @@ my %targets = ( diff --git a/libs/patches/openssl-0002-android-shlib_variant.patch b/libs/patches/openssl-0002-android-shlib_variant.patch index 22efdb7ea..24ab79bd7 100644 --- a/libs/patches/openssl-0002-android-shlib_variant.patch +++ b/libs/patches/openssl-0002-android-shlib_variant.patch @@ -8,7 +8,7 @@ Subject: android shlib_variant 1 file changed, 4 insertions(+) diff --git x/Configurations/15-android.conf y/Configurations/15-android.conf -index 41ad9223e0..f804aeb11b 100644 +index 41ad9223e0945d65ecffc82e0e5c31fd130fd0fe..f804aeb11b9687885eb74451d8b09c4f18c3ed16 100644 --- x/Configurations/15-android.conf +++ y/Configurations/15-android.conf @@ -225,12 +225,14 @@ my %targets = ( diff --git a/libs/patches/qtbase-0001-Revert-Fix-usage-of-logging-category-on-Android.patch b/libs/patches/qtbase-0001-Revert-Fix-usage-of-logging-category-on-Android.patch index a4b9447bb..4746462a8 100644 --- a/libs/patches/qtbase-0001-Revert-Fix-usage-of-logging-category-on-Android.patch +++ b/libs/patches/qtbase-0001-Revert-Fix-usage-of-logging-category-on-Android.patch @@ -11,7 +11,7 @@ Change-Id: If19a9d615e01d61c79955cda4789ba1646520ee1 1 file changed, 1 insertion(+), 8 deletions(-) diff --git x/qtbase/src/corelib/global/qlogging.cpp y/qtbase/src/corelib/global/qlogging.cpp -index 7e708c9c41..96c3bc5dc6 100644 +index 7e708c9c41285b8d899e3f8c0380a7218771c538..96c3bc5dc617af2bae08773da60d975e1b34050a 100644 --- x/qtbase/src/corelib/global/qlogging.cpp +++ y/qtbase/src/corelib/global/qlogging.cpp @@ -1593,10 +1593,7 @@ QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, con diff --git a/libs/patches/qtbase-0002-Fix-warning-in-q20algorithm.h-when-xcodebuild-is-use.patch b/libs/patches/qtbase-0002-Fix-warning-in-q20algorithm.h-when-xcodebuild-is-use.patch index 26a28e62b..8425ce9d5 100644 --- a/libs/patches/qtbase-0002-Fix-warning-in-q20algorithm.h-when-xcodebuild-is-use.patch +++ b/libs/patches/qtbase-0002-Fix-warning-in-q20algorithm.h-when-xcodebuild-is-use.patch @@ -14,7 +14,7 @@ Change-Id: If5ccbfffd0b6a53f73f221b45033dab7e4775d89 1 file changed, 3 insertions(+), 3 deletions(-) diff --git x/qtbase/src/corelib/global/q20algorithm.h y/qtbase/src/corelib/global/q20algorithm.h -index f670a5dbee..24d801b2cd 100644 +index f670a5dbeee81420659a20b68b448a7422d939ec..24d801b2cdfd993def8c60a2bf60e738c921d2ea 100644 --- x/qtbase/src/corelib/global/q20algorithm.h +++ y/qtbase/src/corelib/global/q20algorithm.h @@ -147,7 +147,7 @@ using std::ranges::none_of; diff --git a/libs/patches/qtbase-0003-Revert-iOS-Don-t-invalidate-a11y-whenever-UI-element.patch b/libs/patches/qtbase-0003-Revert-iOS-Don-t-invalidate-a11y-whenever-UI-element.patch index 988fe5d38..c65324841 100644 --- a/libs/patches/qtbase-0003-Revert-iOS-Don-t-invalidate-a11y-whenever-UI-element.patch +++ b/libs/patches/qtbase-0003-Revert-iOS-Don-t-invalidate-a11y-whenever-UI-element.patch @@ -12,7 +12,7 @@ This reverts commit 6eefbf74149164eac316cea59a00b45f70976ad2. 3 files changed, 5 insertions(+), 14 deletions(-) diff --git x/qtbase/src/plugins/platforms/ios/qiosplatformaccessibility.mm y/qtbase/src/plugins/platforms/ios/qiosplatformaccessibility.mm -index f22782fb04..d54b7db57a 100644 +index f22782fb043cd6dfe6d2e364d6d4b7b2897d0c29..d54b7db57a35acbe68121a215ba96c602d29ac04 100644 --- x/qtbase/src/plugins/platforms/ios/qiosplatformaccessibility.mm +++ y/qtbase/src/plugins/platforms/ios/qiosplatformaccessibility.mm @@ -25,6 +25,8 @@ void invalidateCache(QAccessibleInterface *iface) @@ -53,7 +53,7 @@ index f22782fb04..d54b7db57a 100644 default: break; diff --git x/qtbase/src/plugins/platforms/ios/qioswindow.mm y/qtbase/src/plugins/platforms/ios/qioswindow.mm -index 8de094533b..99f9e38846 100644 +index 8de094533bfc97c4af0c79f71207056ca278f5fb..99f9e3884668555afd4a41db6c39828d1ef56194 100644 --- x/qtbase/src/plugins/platforms/ios/qioswindow.mm +++ y/qtbase/src/plugins/platforms/ios/qioswindow.mm @@ -75,7 +75,6 @@ QIOSWindow::~QIOSWindow() @@ -65,7 +65,7 @@ index 8de094533b..99f9e38846 100644 [m_view removeFromSuperview]; [m_view release]; diff --git x/qtbase/src/plugins/platforms/ios/quiview_accessibility.mm y/qtbase/src/plugins/platforms/ios/quiview_accessibility.mm -index 04e1f8cfb3..366141ef81 100644 +index 04e1f8cfb3098b9135703bc5e24e025288643111..366141ef8195728d900beaeb4fc9d2229476aab8 100644 --- x/qtbase/src/plugins/platforms/ios/quiview_accessibility.mm +++ y/qtbase/src/plugins/platforms/ios/quiview_accessibility.mm @@ -54,6 +54,7 @@ diff --git a/libs/patches/qtbase-0004-Fix-living-QLibProxyWrapper-after-shutdown-of-QCoreA.patch b/libs/patches/qtbase-0004-Fix-living-QLibProxyWrapper-after-shutdown-of-QCoreA.patch index 3586ddbcc..56a8fbcf2 100644 --- a/libs/patches/qtbase-0004-Fix-living-QLibProxyWrapper-after-shutdown-of-QCoreA.patch +++ b/libs/patches/qtbase-0004-Fix-living-QLibProxyWrapper-after-shutdown-of-QCoreA.patch @@ -11,7 +11,7 @@ Change-Id: I8f5e2947b6529a0a8871d040050205934ee60354 1 file changed, 1 insertion(+), 1 deletion(-) diff --git x/qtbase/src/network/kernel/qnetworkproxy_libproxy.cpp y/qtbase/src/network/kernel/qnetworkproxy_libproxy.cpp -index 46066b86f7..6de7a7fb76 100644 +index 46066b86f72ab7d8ffb4e7dd0d51e257a244d9f5..6de7a7fb763f777bcd479fef74cb3fe613e3d74b 100644 --- x/qtbase/src/network/kernel/qnetworkproxy_libproxy.cpp +++ y/qtbase/src/network/kernel/qnetworkproxy_libproxy.cpp @@ -72,7 +72,7 @@ private: diff --git a/libs/patches/qtbase-0005-Do-not-override-OPENSSL_API_COMPAT.patch b/libs/patches/qtbase-0005-Do-not-override-OPENSSL_API_COMPAT.patch index c43c406dc..392e1306e 100644 --- a/libs/patches/qtbase-0005-Do-not-override-OPENSSL_API_COMPAT.patch +++ b/libs/patches/qtbase-0005-Do-not-override-OPENSSL_API_COMPAT.patch @@ -11,7 +11,7 @@ Change-Id: Ied55e3d6ebd90fbbecb8c4d8d1638b1de3ba6969 1 file changed, 2 deletions(-) diff --git x/qtbase/src/plugins/tls/openssl/CMakeLists.txt y/qtbase/src/plugins/tls/openssl/CMakeLists.txt -index 0e0a7a1552..e176bbf9d5 100644 +index 0e0a7a1552dc6ef7e1b5847d5685e8b653806364..e176bbf9d5471ffc977d3a6344998f5c3274de5a 100644 --- x/qtbase/src/plugins/tls/openssl/CMakeLists.txt +++ y/qtbase/src/plugins/tls/openssl/CMakeLists.txt @@ -20,8 +20,6 @@ qt_internal_add_plugin(QTlsBackendOpenSSLPlugin diff --git a/libs/patches/qtbase-0006-xkb-fix-build-with-libxkbcommon-1.6.0-and-later.patch b/libs/patches/qtbase-0006-xkb-fix-build-with-libxkbcommon-1.6.0-and-later.patch index eb4425f18..1b20bca06 100644 --- a/libs/patches/qtbase-0006-xkb-fix-build-with-libxkbcommon-1.6.0-and-later.patch +++ b/libs/patches/qtbase-0006-xkb-fix-build-with-libxkbcommon-1.6.0-and-later.patch @@ -20,7 +20,7 @@ Reviewed-by: Tor Arne Vestbø 1 file changed, 4 insertions(+) diff --git x/qtbase/src/gui/platform/unix/qxkbcommon.cpp y/qtbase/src/gui/platform/unix/qxkbcommon.cpp -index fc014b38e2..0de9e98fc7 100644 +index fc014b38e2cf3ed646b60f74d474e96fa76f6358..0de9e98fc7f6745fb733c57ddcc1225d4ff2d019 100644 --- x/qtbase/src/gui/platform/unix/qxkbcommon.cpp +++ y/qtbase/src/gui/platform/unix/qxkbcommon.cpp @@ -239,10 +239,14 @@ static constexpr const auto KeyTbl = qMakeArray( diff --git a/libs/patches/qtbase-0007-Use-SSL_CTX_set_dh_auto-if-DHparam-is-empty.patch b/libs/patches/qtbase-0007-Use-SSL_CTX_set_dh_auto-if-DHparam-is-empty.patch index 37aa8776a..ad2df0fa7 100644 --- a/libs/patches/qtbase-0007-Use-SSL_CTX_set_dh_auto-if-DHparam-is-empty.patch +++ b/libs/patches/qtbase-0007-Use-SSL_CTX_set_dh_auto-if-DHparam-is-empty.patch @@ -22,7 +22,7 @@ Reviewed-by: Mårten Nordheim 4 files changed, 17 insertions(+), 7 deletions(-) diff --git x/qtbase/src/network/ssl/qsslconfiguration.cpp y/qtbase/src/network/ssl/qsslconfiguration.cpp -index 04a9db8521..c8be1ca202 100644 +index 04a9db85216eb2361108bd01dd71f3d5e7855e04..c8be1ca202962789ad088ef528b82883144e7140 100644 --- x/qtbase/src/network/ssl/qsslconfiguration.cpp +++ y/qtbase/src/network/ssl/qsslconfiguration.cpp @@ -942,6 +942,9 @@ QSslDiffieHellmanParameters QSslConfiguration::diffieHellmanParameters() const @@ -36,7 +36,7 @@ index 04a9db8521..c8be1ca202 100644 Please check the documentation of the \e{exact Qt version} that you are using in order to know what defaults that version uses. diff --git x/qtbase/src/plugins/tls/openssl/qsslcontext_openssl.cpp y/qtbase/src/plugins/tls/openssl/qsslcontext_openssl.cpp -index ef0e63911a..75c192bd01 100644 +index ef0e63911a7e5fd6a1358231d1bc5d053a587c15..75c192bd01d2730938e82ab4be86262dca44b7c9 100644 --- x/qtbase/src/plugins/tls/openssl/qsslcontext_openssl.cpp +++ y/qtbase/src/plugins/tls/openssl/qsslcontext_openssl.cpp @@ -697,7 +697,9 @@ QT_WARNING_POP @@ -51,7 +51,7 @@ index ef0e63911a..75c192bd01 100644 const QByteArray ¶ms = dhparams.d->derData; const char *ptr = params.constData(); diff --git x/qtbase/src/plugins/tls/openssl/qsslsocket_openssl_symbols_p.h y/qtbase/src/plugins/tls/openssl/qsslsocket_openssl_symbols_p.h -index 1f0d739210..1531564226 100644 +index 1f0d7392101b0a954561772d4ddf1a2979f9506c..1531564226da4c07dc3f41c909dc6f705407032b 100644 --- x/qtbase/src/plugins/tls/openssl/qsslsocket_openssl_symbols_p.h +++ y/qtbase/src/plugins/tls/openssl/qsslsocket_openssl_symbols_p.h @@ -516,6 +516,7 @@ DH *q_PEM_read_bio_DHparams(BIO *a, DH **b, pem_password_cb *c, void *d); @@ -63,7 +63,7 @@ index 1f0d739210..1531564226 100644 #ifndef OPENSSL_NO_EC // EC Diffie-Hellman support diff --git x/qtbase/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp y/qtbase/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp -index cfcff44a4d..2f3ad0547a 100644 +index cfcff44a4d9ad3f6aca4f22e368a13ed2cd917a8..2f3ad0547a4186aec2163a0361a91c075462a161 100644 --- x/qtbase/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp +++ y/qtbase/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp @@ -3501,9 +3501,10 @@ void tst_QSslSocket::dhServerCustomParamsNull() diff --git a/libs/patches/qtbase-0008-HPack-fix-a-Yoda-Condition.patch b/libs/patches/qtbase-0008-HPack-fix-a-Yoda-Condition.patch index b03c30209..edba4bbe2 100644 --- a/libs/patches/qtbase-0008-HPack-fix-a-Yoda-Condition.patch +++ b/libs/patches/qtbase-0008-HPack-fix-a-Yoda-Condition.patch @@ -25,7 +25,7 @@ Reviewed-by: Qt Cherry-pick Bot 1 file changed, 1 insertion(+), 1 deletion(-) diff --git x/qtbase/src/network/access/http2/hpacktable.cpp y/qtbase/src/network/access/http2/hpacktable.cpp -index 74a09a207f..c8c5d098c8 100644 +index 74a09a207ffb5531093bf46841c0885f5bef70e4..c8c5d098c80ad15c24d1eaca022bd7846f590048 100644 --- x/qtbase/src/network/access/http2/hpacktable.cpp +++ y/qtbase/src/network/access/http2/hpacktable.cpp @@ -27,7 +27,7 @@ HeaderSize entry_size(QByteArrayView name, QByteArrayView value) diff --git a/libs/patches/qtbase-0009-HPack-fix-incorrect-integer-overflow-check.patch b/libs/patches/qtbase-0009-HPack-fix-incorrect-integer-overflow-check.patch index 03c91095f..fdcb25583 100644 --- a/libs/patches/qtbase-0009-HPack-fix-incorrect-integer-overflow-check.patch +++ b/libs/patches/qtbase-0009-HPack-fix-incorrect-integer-overflow-check.patch @@ -31,7 +31,7 @@ Reviewed-by: Marc Mutz 1 file changed, 3 insertions(+), 1 deletion(-) diff --git x/qtbase/src/network/access/http2/hpacktable.cpp y/qtbase/src/network/access/http2/hpacktable.cpp -index c8c5d098c8..2c728b37e3 100644 +index c8c5d098c80ad15c24d1eaca022bd7846f590048..2c728b37e3b5735d118d288f8b0594f717691557 100644 --- x/qtbase/src/network/access/http2/hpacktable.cpp +++ y/qtbase/src/network/access/http2/hpacktable.cpp @@ -26,7 +26,9 @@ HeaderSize entry_size(QByteArrayView name, QByteArrayView value) diff --git a/libs/patches/qtbase-0010-Fix-compilation-with-MSVC-17.8.patch b/libs/patches/qtbase-0010-Fix-compilation-with-MSVC-17.8.patch index 4fb803ac6..5ba26d0a9 100644 --- a/libs/patches/qtbase-0010-Fix-compilation-with-MSVC-17.8.patch +++ b/libs/patches/qtbase-0010-Fix-compilation-with-MSVC-17.8.patch @@ -25,7 +25,7 @@ Reviewed-by: Marc Mutz 1 file changed, 4 insertions(+), 2 deletions(-) diff --git x/qtbase/src/corelib/global/qcompilerdetection.h y/qtbase/src/corelib/global/qcompilerdetection.h -index 70fa7f6c9f..58a3689341 100644 +index 70fa7f6c9f7427ff3046a6495b5fc4da6dd6bfa3..58a368934126fa78735b76bc7c5e1d252fcfdc7b 100644 --- x/qtbase/src/corelib/global/qcompilerdetection.h +++ y/qtbase/src/corelib/global/qcompilerdetection.h @@ -77,8 +77,10 @@ diff --git a/libs/patches/qtconnectivity-0001-Reset-status-of-isSessionScheduled-when-starting-a-i.patch b/libs/patches/qtconnectivity-0001-Reset-status-of-isSessionScheduled-when-starting-a-i.patch index 1baaebdbd..8ef0d02e8 100644 --- a/libs/patches/qtconnectivity-0001-Reset-status-of-isSessionScheduled-when-starting-a-i.patch +++ b/libs/patches/qtconnectivity-0001-Reset-status-of-isSessionScheduled-when-starting-a-i.patch @@ -17,7 +17,7 @@ Reviewed-by: Timur Pocheptsov 1 file changed, 1 insertion(+) diff --git x/qtconnectivity/src/nfc/qnearfieldmanager_ios.mm y/qtconnectivity/src/nfc/qnearfieldmanager_ios.mm -index 2709e2c7..259c3c17 100644 +index 2709e2c710466171e7e28456cbd700c347d01982..259c3c1787355ddd6d209864605907c1c66ca7f2 100644 --- x/qtconnectivity/src/nfc/qnearfieldmanager_ios.mm +++ y/qtconnectivity/src/nfc/qnearfieldmanager_ios.mm @@ -143,6 +143,7 @@ bool QNearFieldManagerPrivateImpl::scheduleSession(QNearFieldTarget::AccessMetho diff --git a/libs/patches/qtconnectivity-0002-Silence-expected-java-exceptions.patch b/libs/patches/qtconnectivity-0002-Silence-expected-java-exceptions.patch index 24725e315..ac0a586bd 100644 --- a/libs/patches/qtconnectivity-0002-Silence-expected-java-exceptions.patch +++ b/libs/patches/qtconnectivity-0002-Silence-expected-java-exceptions.patch @@ -19,7 +19,7 @@ Reviewed-by: Timur Pocheptsov 1 file changed, 2 insertions(+), 2 deletions(-) diff --git x/qtconnectivity/src/nfc/qnearfieldtarget_android.cpp y/qtconnectivity/src/nfc/qnearfieldtarget_android.cpp -index 63e7d62b..c7f842ae 100644 +index 63e7d62b9f0980762464083cf915765abd8f18e7..c7f842ae781bd0e24865a1bf011af2accd8dd739 100644 --- x/qtconnectivity/src/nfc/qnearfieldtarget_android.cpp +++ y/qtconnectivity/src/nfc/qnearfieldtarget_android.cpp @@ -304,14 +304,14 @@ void QNearFieldTargetPrivateImpl::checkIsTargetLost() diff --git a/libs/patches/qtdeclarative-0001-QtQml-Re-add-pthread_attr_init-to-stackPropertiesGen.patch b/libs/patches/qtdeclarative-0001-QtQml-Re-add-pthread_attr_init-to-stackPropertiesGen.patch index 974b7a1f9..69f30aded 100644 --- a/libs/patches/qtdeclarative-0001-QtQml-Re-add-pthread_attr_init-to-stackPropertiesGen.patch +++ b/libs/patches/qtdeclarative-0001-QtQml-Re-add-pthread_attr_init-to-stackPropertiesGen.patch @@ -18,7 +18,7 @@ Change-Id: Ic851ba2ffcf13d268b3a53d926cb92f7bed7a3d9 1 file changed, 1 insertion(+) diff --git x/qtdeclarative/src/qml/memory/qv4stacklimits.cpp y/qtdeclarative/src/qml/memory/qv4stacklimits.cpp -index 68ef7a366a..429520e527 100644 +index 68ef7a366a173fa3df21b85af897912c69b9d654..429520e5273fc4c35ddd02710b68336b944b4742 100644 --- x/qtdeclarative/src/qml/memory/qv4stacklimits.cpp +++ y/qtdeclarative/src/qml/memory/qv4stacklimits.cpp @@ -235,6 +235,7 @@ StackProperties stackPropertiesGeneric(qsizetype stackSize = 0) diff --git a/libs/patches/qtdeclarative-0002-QQuickItem-fix-binding-loops-for-x-y-width-and-heigh.patch b/libs/patches/qtdeclarative-0002-QQuickItem-fix-binding-loops-for-x-y-width-and-heigh.patch index e9a534e4d..52d2edc3a 100644 --- a/libs/patches/qtdeclarative-0002-QQuickItem-fix-binding-loops-for-x-y-width-and-heigh.patch +++ b/libs/patches/qtdeclarative-0002-QQuickItem-fix-binding-loops-for-x-y-width-and-heigh.patch @@ -22,7 +22,7 @@ Reviewed-by: Qt CI Bot 1 file changed, 20 insertions(+), 12 deletions(-) diff --git x/qtdeclarative/src/quick/items/qquickitem.cpp y/qtdeclarative/src/quick/items/qquickitem.cpp -index a2e8c989d1..30bbf505da 100644 +index a2e8c989d1b893f357069b352f5f422da6c17768..30bbf505da10b8d9d4a22f3b7b424c3da7e25d94 100644 --- x/qtdeclarative/src/quick/items/qquickitem.cpp +++ y/qtdeclarative/src/quick/items/qquickitem.cpp @@ -7068,15 +7068,17 @@ void QQuickItem::setX(qreal v) diff --git a/libs/patches/qtdeclarative-0003-QQuickItem-more-fixes-for-bindable-properties.patch b/libs/patches/qtdeclarative-0003-QQuickItem-more-fixes-for-bindable-properties.patch index c20f7b85f..50d4fa643 100644 --- a/libs/patches/qtdeclarative-0003-QQuickItem-more-fixes-for-bindable-properties.patch +++ b/libs/patches/qtdeclarative-0003-QQuickItem-more-fixes-for-bindable-properties.patch @@ -26,7 +26,7 @@ Reviewed-by: Ulf Hermann 1 file changed, 15 insertions(+), 11 deletions(-) diff --git x/qtdeclarative/src/quick/items/qquickitem.cpp y/qtdeclarative/src/quick/items/qquickitem.cpp -index 30bbf505da..7cc03936fc 100644 +index 30bbf505da10b8d9d4a22f3b7b424c3da7e25d94..7cc03936fc3ac442a6517f0bbd5748d33e314f06 100644 --- x/qtdeclarative/src/quick/items/qquickitem.cpp +++ y/qtdeclarative/src/quick/items/qquickitem.cpp @@ -7111,11 +7111,12 @@ void QQuickItem::setY(qreal v) diff --git a/libs/patches/qtdeclarative-0004-Fix-binding-loop-issue-in-quick-layout.patch b/libs/patches/qtdeclarative-0004-Fix-binding-loop-issue-in-quick-layout.patch index a067ce79d..7edfa7a61 100644 --- a/libs/patches/qtdeclarative-0004-Fix-binding-loop-issue-in-quick-layout.patch +++ b/libs/patches/qtdeclarative-0004-Fix-binding-loop-issue-in-quick-layout.patch @@ -19,7 +19,7 @@ Change-Id: I1e318335ce8b5268d878b48a02a089d703bb90ad 3 files changed, 11 insertions(+), 9 deletions(-) diff --git x/qtdeclarative/src/quicklayouts/qquicklayout.cpp y/qtdeclarative/src/quicklayouts/qquicklayout.cpp -index fc2bcc130c..2e54949f1d 100644 +index fc2bcc130c20d7c2b868a921e6161facb1a1e12b..2e54949f1d9017b850d74799f399b4c1711af126 100644 --- x/qtdeclarative/src/quicklayouts/qquicklayout.cpp +++ y/qtdeclarative/src/quicklayouts/qquicklayout.cpp @@ -742,14 +742,15 @@ void QQuickLayoutPrivate::applySizeHints() const @@ -54,7 +54,7 @@ index fc2bcc130c..2e54949f1d 100644 if (options & Recursive) { for (int i = 0; i < itemCount(); ++i) { diff --git x/qtdeclarative/src/quicklayouts/qquicklayout_p.h y/qtdeclarative/src/quicklayouts/qquicklayout_p.h -index df9c4cad97..d0ccc4f185 100644 +index df9c4cad97473fa009b228832ab20d3007e9f3de..d0ccc4f185a2d157b5a8c705fb2837680e4a20f1 100644 --- x/qtdeclarative/src/quicklayouts/qquicklayout_p.h +++ y/qtdeclarative/src/quicklayouts/qquicklayout_p.h @@ -49,7 +49,8 @@ public: @@ -68,7 +68,7 @@ index df9c4cad97..d0ccc4f185 100644 Q_DECLARE_FLAGS(EnsureLayoutItemsUpdatedOptions, EnsureLayoutItemsUpdatedOption) diff --git x/qtdeclarative/src/quicklayouts/qquicklinearlayout.cpp y/qtdeclarative/src/quicklayouts/qquicklinearlayout.cpp -index b34815e449..cbd15b4878 100644 +index b34815e4496eb8eceda16e6219c03c0e0bf10000..cbd15b48786c4d6cd9d412ff59e73cd69aa6e292 100644 --- x/qtdeclarative/src/quicklayouts/qquicklinearlayout.cpp +++ y/qtdeclarative/src/quicklayouts/qquicklinearlayout.cpp @@ -459,7 +459,7 @@ void QQuickGridLayoutBase::rearrange(const QSizeF &size) diff --git a/libs/patches/qtscxml-0001-Build-statemachine-only.patch b/libs/patches/qtscxml-0001-Build-statemachine-only.patch index 7476d8b75..d22626357 100644 --- a/libs/patches/qtscxml-0001-Build-statemachine-only.patch +++ b/libs/patches/qtscxml-0001-Build-statemachine-only.patch @@ -9,7 +9,7 @@ Subject: Build statemachine only 2 files changed, 5 insertions(+), 5 deletions(-) diff --git x/qtscxml/src/CMakeLists.txt y/qtscxml/src/CMakeLists.txt -index 5fbfbd9d..2f94949d 100644 +index 5fbfbd9d495ba5a926b3a44380a04a60bc06d5ee..2f94949dd4410973d577062533a449ef65a091a6 100644 --- x/qtscxml/src/CMakeLists.txt +++ y/qtscxml/src/CMakeLists.txt @@ -2,10 +2,10 @@ @@ -28,7 +28,7 @@ index 5fbfbd9d..2f94949d 100644 -add_subdirectory(plugins) +#add_subdirectory(plugins) diff --git x/qtscxml/tools/CMakeLists.txt y/qtscxml/tools/CMakeLists.txt -index c5831a40..234fa606 100644 +index c5831a40460daefec3845fa34a2757b0232511fd..234fa6065eb30588d7015b5e90bc498d79981951 100644 --- x/qtscxml/tools/CMakeLists.txt +++ y/qtscxml/tools/CMakeLists.txt @@ -3,5 +3,5 @@ diff --git a/libs/patches/qttools-0001-Disable-linguist-but-keep-translation-tools.patch b/libs/patches/qttools-0001-Disable-linguist-but-keep-translation-tools.patch index 3715343c9..ec56a60b7 100644 --- a/libs/patches/qttools-0001-Disable-linguist-but-keep-translation-tools.patch +++ b/libs/patches/qttools-0001-Disable-linguist-but-keep-translation-tools.patch @@ -9,7 +9,7 @@ Change-Id: I1c54eb0e7bb86ec0861b54b5abe753c86bb57dd9 1 file changed, 3 deletions(-) diff --git x/qttools/src/linguist/CMakeLists.txt y/qttools/src/linguist/CMakeLists.txt -index d85254b32..dfcfe7271 100644 +index d85254b32ea501178fd6e948cf11e28bcdfef121..dfcfe727128412dd2291f010fc161e9b15bf1728 100644 --- x/qttools/src/linguist/CMakeLists.txt +++ y/qttools/src/linguist/CMakeLists.txt @@ -14,9 +14,6 @@ add_subdirectory(lrelease) diff --git a/libs/patches/qttools-0002-Disable-designer-and-uitools.patch b/libs/patches/qttools-0002-Disable-designer-and-uitools.patch index 910f7ae5a..2119180e7 100644 --- a/libs/patches/qttools-0002-Disable-designer-and-uitools.patch +++ b/libs/patches/qttools-0002-Disable-designer-and-uitools.patch @@ -9,7 +9,7 @@ See https://bugreports.qt.io/browse/QTBUG-95236 1 file changed, 3 insertions(+), 3 deletions(-) diff --git x/qttools/src/CMakeLists.txt y/qttools/src/CMakeLists.txt -index 014e4c874..1574b1b20 100644 +index 014e4c874c506ebfa78ce4c4664be39c7266e693..1574b1b20e1973a4ce8650345073743ba551f3fd 100644 --- x/qttools/src/CMakeLists.txt +++ y/qttools/src/CMakeLists.txt @@ -18,8 +18,8 @@ qt_exclude_tool_directories_from_default_target( diff --git a/presets/ci.json b/presets/ci.json index d7c4d0dc9..2e14d0737 100644 --- a/presets/ci.json +++ b/presets/ci.json @@ -8,6 +8,10 @@ "binaryDir": "${sourceParentDir}/build", "cacheVariables": { "CMAKE_CXX_COMPILER_LAUNCHER": "ccache" + }, + "errors": { + "dev": true, + "deprecated": true } }, { diff --git a/resources/jenkins/dsl/Builds/Build_Android.groovy b/resources/jenkins/dsl/Builds/Build_Android.groovy index 71f501109..2d14dfc42 100644 --- a/resources/jenkins/dsl/Builds/Build_Android.groovy +++ b/resources/jenkins/dsl/Builds/Build_Android.groovy @@ -44,10 +44,10 @@ j.with } } qualityGates { - qualityGate { + warningsQualityGate { threshold(1) type('TOTAL') - unstable(false) + criticality('UNSTABLE') } } } @@ -88,10 +88,10 @@ j.with } } qualityGates { - qualityGate { + warningsQualityGate { threshold(1) type('TOTAL') - unstable(false) + criticality('UNSTABLE') } } } diff --git a/resources/jenkins/dsl/Builds/Build_FreeBSD.groovy b/resources/jenkins/dsl/Builds/Build_FreeBSD.groovy index 2f006912f..80b0d2931 100644 --- a/resources/jenkins/dsl/Builds/Build_FreeBSD.groovy +++ b/resources/jenkins/dsl/Builds/Build_FreeBSD.groovy @@ -21,7 +21,7 @@ j.with steps { - shell('cd source; cmake -Werror=dev --preset ci-bsd') + shell('cd source; cmake --preset ci-bsd') shell('''\ export LD_LIBRARY_PATH=$WORKSPACE/libs/dist/lib:$LD_LIBRARY_PATH diff --git a/resources/jenkins/dsl/Builds/Build_SonarQube.groovy b/resources/jenkins/dsl/Builds/Build_SonarQube.groovy index 2452099ed..52b7f13bb 100644 --- a/resources/jenkins/dsl/Builds/Build_SonarQube.groovy +++ b/resources/jenkins/dsl/Builds/Build_SonarQube.groovy @@ -46,7 +46,7 @@ j.with $WORKSPACE/sonarqubetools/sonar-scanner/bin/sonar-scanner -Dsonar.scanner.metadataFilePath=${WORKSPACE}/tmp/sonar-metadata.txt -Dsonar.branch.name=${MERCURIAL_REVISION_BRANCH} - -Dsonar.login=${SONARQUBE_TOKEN} + -Dsonar.token=${SONARQUBE_TOKEN} -Dsonar.qualitygate.wait=true -Dsonar.qualitygate.timeout=90 ''')) diff --git a/resources/jenkins/dsl/Reviews/Review_Android.groovy b/resources/jenkins/dsl/Reviews/Review_Android.groovy index c45f087a5..fce7edd70 100644 --- a/resources/jenkins/dsl/Reviews/Review_Android.groovy +++ b/resources/jenkins/dsl/Reviews/Review_Android.groovy @@ -36,10 +36,10 @@ j.with } } qualityGates { - qualityGate { + warningsQualityGate { threshold(1) type('TOTAL') - unstable(false) + criticality('UNSTABLE') } } } @@ -80,10 +80,10 @@ j.with } } qualityGates { - qualityGate { + warningsQualityGate { threshold(1) type('TOTAL') - unstable(false) + criticality('UNSTABLE') } } } diff --git a/resources/jenkins/dsl/Reviews/Review_Linux.groovy b/resources/jenkins/dsl/Reviews/Review_Linux.groovy index fbc98b34b..0cd87a5ec 100644 --- a/resources/jenkins/dsl/Reviews/Review_Linux.groovy +++ b/resources/jenkins/dsl/Reviews/Review_Linux.groovy @@ -35,7 +35,7 @@ j.with shell(strip('''\ cd source; - cmake -Werror=dev --preset ci-linux + cmake --preset ci-linux -DCMAKE_CXX_COMPILER=${Compiler} ''')) diff --git a/resources/jenkins/dsl/Reviews/Review_SonarQube.groovy b/resources/jenkins/dsl/Reviews/Review_SonarQube.groovy index ed8175190..48464e22b 100644 --- a/resources/jenkins/dsl/Reviews/Review_SonarQube.groovy +++ b/resources/jenkins/dsl/Reviews/Review_SonarQube.groovy @@ -52,7 +52,7 @@ j.with -Dsonar.pullrequest.key=${REVIEWBOARD_REVIEW_ID} -Dsonar.pullrequest.branch=${REVIEWBOARD_REVIEW_ID} -Dsonar.pullrequest.base=${MERCURIAL_REVISION_BRANCH} - -Dsonar.login=${SONARQUBE_TOKEN} + -Dsonar.token=${SONARQUBE_TOKEN} -Dsonar.qualitygate.wait=true -Dsonar.qualitygate.timeout=90 ''')) diff --git a/resources/qml/Governikus/AuthView/+desktop/EditRights.qml b/resources/qml/Governikus/AuthView/+desktop/EditRights.qml index 127eb2e6a..959cf4ddd 100644 --- a/resources/qml/Governikus/AuthView/+desktop/EditRights.qml +++ b/resources/qml/Governikus/AuthView/+desktop/EditRights.qml @@ -143,6 +143,7 @@ SectionPage { GPane { id: writeDataPane + Layout.alignment: Qt.AlignTop Layout.fillWidth: true color: Style.color.pane_sublevel visible: writeData.count > 0 @@ -163,6 +164,7 @@ SectionPage { GPane { id: readDataPane + Layout.alignment: Qt.AlignTop Layout.fillWidth: true color: Style.color.pane_sublevel visible: requiredData.count > 0 || optionalData.count > 0 diff --git a/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardResultView.qml b/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardResultView.qml index b059009cc..b032c1cd8 100644 --- a/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardResultView.qml +++ b/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardResultView.qml @@ -60,8 +60,6 @@ CheckResultView { id: checkIDCardSuggestionView CheckIDCardSuggestionView { - title: root.title - onCancelClicked: root.cancelClicked() onRestartCheck: root.restartCheck() onStartAuth: root.startAuth() @@ -131,9 +129,9 @@ CheckResultView { resultType: pinDeactivated ? ResultEntry.Type.IsError : ResultEntry.Type.IsSuccess text: pinDeactivated ? //: LABEL ANDROID IOS - qsTr("Online identification feature disabled") : + qsTr("eID function disabled") : //: LABEL ANDROID IOS - qsTr("Online identification feature enabled") + qsTr("eID function enabled") visible: result >= CheckIDCardModel.PIN_DEACTIVATED } ResultEntry { diff --git a/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardSuggestionView.qml b/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardSuggestionView.qml index 7ff45d1a2..d681a1fa3 100644 --- a/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardSuggestionView.qml +++ b/resources/qml/Governikus/CheckIDCardView/+mobile/CheckIDCardSuggestionView.qml @@ -110,10 +110,12 @@ CheckResultSuggestionView { continueButtonText: qsTr("OK") hintButtonText: PinResetInformationModel.pinResetActionText hintText: PinResetInformationModel.activateOnlineFunctionHint + //: LABEL ANDROID IOS Hint when a workflow failed because the eID function was not activated + hintTitle: qsTr("Activate the eID function.") text: PinResetInformationModel.activateOnlineFunctionDescription //: LABEL ANDROID IOS - title: qsTr("Online identification feature disabled") + title: qsTr("eID function disabled") onContinueClicked: navigationAction.clicked() onHintClicked: Qt.openUrlExternally(PinResetInformationModel.pinResetUrl) diff --git a/resources/qml/Governikus/CheckResultView/+mobile/CheckResultSuggestionView.qml b/resources/qml/Governikus/CheckResultView/+mobile/CheckResultSuggestionView.qml index db0cda74d..bb7854349 100644 --- a/resources/qml/Governikus/CheckResultView/+mobile/CheckResultSuggestionView.qml +++ b/resources/qml/Governikus/CheckResultView/+mobile/CheckResultSuggestionView.qml @@ -16,6 +16,7 @@ ResultView { header: suggestionData.header hintButtonText: suggestionData.hintButtonText hintText: suggestionData.hintText + hintTitle: suggestionData.hintTitle icon: suggestionData.icon text: suggestionData.text textFormat: suggestionData.textFormat diff --git a/resources/qml/Governikus/CheckResultView/+mobile/SuggestionData.qml b/resources/qml/Governikus/CheckResultView/+mobile/SuggestionData.qml index 722263bbc..ba20e4374 100644 --- a/resources/qml/Governikus/CheckResultView/+mobile/SuggestionData.qml +++ b/resources/qml/Governikus/CheckResultView/+mobile/SuggestionData.qml @@ -13,6 +13,7 @@ QtObject { property string header property string hintButtonText property string hintText + property string hintTitle: qsTr("Hint") property url icon: "qrc:///images/status_info_%1.svg".arg(Style.currentTheme.name) property string text property int textFormat: Text.AutoText diff --git a/resources/qml/Governikus/Global/+desktop/Hint.qml b/resources/qml/Governikus/Global/+desktop/Hint.qml index 70d572fba..d92b8e347 100644 --- a/resources/qml/Governikus/Global/+desktop/Hint.qml +++ b/resources/qml/Governikus/Global/+desktop/Hint.qml @@ -20,8 +20,6 @@ GPane { color: Style.color.pane_sublevel drawShadow: false spacing: 0 - //: LABEL DESKTOP - title: qsTr("Hint") GText { id: hintText diff --git a/resources/qml/Governikus/Global/+mobile/Hint.qml b/resources/qml/Governikus/Global/+mobile/Hint.qml index 29f4db416..fcc55e3fe 100644 --- a/resources/qml/Governikus/Global/+mobile/Hint.qml +++ b/resources/qml/Governikus/Global/+mobile/Hint.qml @@ -19,8 +19,6 @@ GPane { color: Style.color.pane_sublevel drawShadow: false textStyle: Style.text.subline - //: LABEL ANDROID IOS - title: qsTr("Hint") ColumnLayout { spacing: 0 diff --git a/resources/qml/Governikus/Global/GInformativeButton.qml b/resources/qml/Governikus/Global/GInformativeButton.qml index 0659f1e28..e38b1759d 100644 --- a/resources/qml/Governikus/Global/GInformativeButton.qml +++ b/resources/qml/Governikus/Global/GInformativeButton.qml @@ -10,9 +10,9 @@ import Governikus.View AbstractButton { id: root - property alias description: description.text + property alias description: descriptionText.text - Accessible.name: text + ". " + description + Accessible.name: root.text + ". " + root.description horizontalPadding: Constants.component_spacing verticalPadding: Constants.component_spacing @@ -48,7 +48,7 @@ AbstractButton { textStyle: Style.text.subline } GText { - id: description + id: descriptionText Accessible.ignored: true elide: Text.ElideRight @@ -57,7 +57,7 @@ AbstractButton { TintableIcon { source: "qrc:///images/material_arrow_right.svg" sourceSize.height: Constants.is_desktop ? Style.dimens.icon_size : Style.dimens.small_icon_size - tintColor: description.color + tintColor: descriptionText.color } } @@ -70,7 +70,7 @@ AbstractButton { when: root.pressed PropertyChanges { - description.color: Style.color.text_pressed + descriptionText.color: Style.color.text_pressed pane.border.color: Style.color.pane_border_pressed pane.color: Style.color.pane_pressed title.color: Style.color.text_subline_pressed @@ -81,7 +81,7 @@ AbstractButton { when: root.hovered PropertyChanges { - description.color: Style.color.text_hovered + descriptionText.color: Style.color.text_hovered pane.border.color: Style.color.pane_border_hovered pane.color: Style.color.pane_hovered title.color: Style.color.text_subline_hovered diff --git a/resources/qml/Governikus/Global/NumberField.qml b/resources/qml/Governikus/Global/NumberField.qml index 43daffdf2..d48b96432 100644 --- a/resources/qml/Governikus/Global/NumberField.qml +++ b/resources/qml/Governikus/Global/NumberField.qml @@ -57,7 +57,7 @@ GControl { qsTr("The password is visible. Digits entered so far: %1").arg(root.number.split("").join(" ")) : //: LABEL DESKTOP Screenreader text for the password field qsTr("The password is hidden.")) + (text === undefined ? " " + passwordState : "") - Accessible.role: Accessible.EditableText + Accessible.role: Accessible.StaticText Layout.maximumWidth: contentItem.Layout.maximumWidth + leftPadding + rightPadding Layout.minimumWidth: contentItem.Layout.minimumWidth + leftPadding + rightPadding Layout.preferredWidth: implicitWidth diff --git a/resources/qml/Governikus/PasswordInfoView/+desktop/PasswordInfoView.qml b/resources/qml/Governikus/PasswordInfoView/+desktop/PasswordInfoView.qml index d8a9aa580..2c7e5c5d3 100644 --- a/resources/qml/Governikus/PasswordInfoView/+desktop/PasswordInfoView.qml +++ b/resources/qml/Governikus/PasswordInfoView/+desktop/PasswordInfoView.qml @@ -20,6 +20,7 @@ FlickableSectionPage { readonly property var contentList: infoContent.contentList readonly property string hint: infoContent.hint readonly property string hintButtonText: infoContent.hintButtonText + readonly property string hintTitle: infoContent.hintTitle property PasswordInfoData infoContent: PasswordInfoData { } property alias rootEnabled: titleBarAction.rootEnabled @@ -103,6 +104,8 @@ FlickableSectionPage { buttonText: root.hintButtonText buttonTooltip: PinResetInformationModel.pinResetUrl text: root.hint + //: LABEL DESKTOP + title: root.hintTitle !== "" ? root.hintTitle : qsTr("Hint") visible: text !== "" onClicked: { diff --git a/resources/qml/Governikus/PasswordInfoView/+mobile/PasswordInfoView.qml b/resources/qml/Governikus/PasswordInfoView/+mobile/PasswordInfoView.qml index 3a37e8fd8..637b11730 100644 --- a/resources/qml/Governikus/PasswordInfoView/+mobile/PasswordInfoView.qml +++ b/resources/qml/Governikus/PasswordInfoView/+mobile/PasswordInfoView.qml @@ -18,6 +18,7 @@ FlickableSectionPage { readonly property var contentList: infoContent.contentList readonly property string hint: infoContent.hint readonly property string hintButtonText: infoContent.hintButtonText + readonly property string hintTitle: infoContent.hintTitle property PasswordInfoData infoContent: PasswordInfoData { } readonly property string infoContentTitle: infoContent.title @@ -90,6 +91,8 @@ FlickableSectionPage { Layout.topMargin: Constants.component_spacing buttonText: root.hintButtonText text: root.hint + //: LABEL ANDROID IOS + title: root.hintTitle !== "" ? root.hintTitle : qsTr("Hint") visible: text !== "" onClicked: { diff --git a/resources/qml/Governikus/PasswordInfoView/PasswordInfoContent.qml b/resources/qml/Governikus/PasswordInfoView/PasswordInfoContent.qml index 953d43dd0..26c282bb8 100644 --- a/resources/qml/Governikus/PasswordInfoView/PasswordInfoContent.qml +++ b/resources/qml/Governikus/PasswordInfoView/PasswordInfoContent.qml @@ -9,6 +9,7 @@ QtObject { property list contentList property string hint: "" property string hintButtonText: "" + property string hintTitle: "" //: LABEL ALL_PLATFORMS property string linkText: qsTr("More information") diff --git a/resources/qml/Governikus/PasswordInfoView/PasswordInfoData.qml b/resources/qml/Governikus/PasswordInfoView/PasswordInfoData.qml index 29006754d..961c58826 100644 --- a/resources/qml/Governikus/PasswordInfoView/PasswordInfoData.qml +++ b/resources/qml/Governikus/PasswordInfoView/PasswordInfoData.qml @@ -36,6 +36,8 @@ QtObject { hint: PinResetInformationModel.pinResetHint hintButtonText: PinResetInformationModel.pinResetActionText + //: LABEL ALL_PLATFORMS + hintTitle: qsTr("I can't recall my PIN") //: LABEL ALL_PLATFORMS linkText: qsTr("What is the card PIN?") @@ -149,6 +151,7 @@ QtObject { hint: PinResetInformationModel.pinResetHintTransportPin hintButtonText: PinResetInformationModel.pinResetActionText + hintTitle: qsTr("I can't recall my PIN") //: LABEL ALL_PLATFORMS linkText: qsTr("What is the Transport PIN?") @@ -175,6 +178,7 @@ QtObject { hint: PinResetInformationModel.noPinAndNoPukHint hintButtonText: PinResetInformationModel.pinResetActionText + hintTitle: qsTr("I can't recall my PUK") //: LABEL ALL_PLATFORMS linkText: qsTr("Where do I find the PUK?") @@ -333,6 +337,7 @@ QtObject { hint: PinResetInformationModel.pinResetHintNoPin hintButtonText: PinResetInformationModel.pinResetActionText + hintTitle: qsTr("Set a new PIN") //: LABEL ALL_PLATFORMS title: qsTr("No PIN known") @@ -356,6 +361,7 @@ QtObject { property int contentType readonly property string hint: infoContent.hint readonly property string hintButtonText: infoContent.hintButtonText + readonly property string hintTitle: infoContent.hintTitle readonly property PasswordInfoContent infoContent: { switch (contentType) { case PasswordInfoData.Type.PIN: diff --git a/resources/qml/Governikus/RemoteServiceView/PairingSuccessView.qml b/resources/qml/Governikus/RemoteServiceView/PairingSuccessView.qml index ee1f4cba7..e68b9ab10 100644 --- a/resources/qml/Governikus/RemoteServiceView/PairingSuccessView.qml +++ b/resources/qml/Governikus/RemoteServiceView/PairingSuccessView.qml @@ -12,5 +12,5 @@ ResultView { icon: "qrc:///images/phone_to_pc.svg" //: INFO ALL_PLATFORMS The pairing with the SaC server was successful. - text: qsTr("Pairing with %1 successful, it will be listed under \"Paired devices\".").arg(deviceName) + "
" + qsTr("The device may now be used as a card reader.") + text: qsTr("Pairing with \"%1\" successful, it will be listed under \"Paired devices\".").arg(deviceName) + "
" + qsTr("The device may now be used as a card reader.") } diff --git a/resources/qml/Governikus/ResultView/+desktop/ResultView.qml b/resources/qml/Governikus/ResultView/+desktop/ResultView.qml index 7850c20f3..ba37a4c3e 100644 --- a/resources/qml/Governikus/ResultView/+desktop/ResultView.qml +++ b/resources/qml/Governikus/ResultView/+desktop/ResultView.qml @@ -138,6 +138,8 @@ FlickableSectionPage { id: hintItem Layout.fillWidth: true + //: LABEL DESKTOP + title: qsTr("Hint") visible: text !== "" onClicked: baseItem.hintClicked() diff --git a/resources/qml/Governikus/ResultView/+mobile/ResultView.qml b/resources/qml/Governikus/ResultView/+mobile/ResultView.qml index f158bbd8d..8127a2093 100644 --- a/resources/qml/Governikus/ResultView/+mobile/ResultView.qml +++ b/resources/qml/Governikus/ResultView/+mobile/ResultView.qml @@ -17,6 +17,7 @@ FlickableSectionPage { property alias header: paneTitle.text property alias hintButtonText: hintItem.buttonText property alias hintText: hintItem.text + property alias hintTitle: hintItem.title property alias icon: customIcon.source property alias text: resultText.text property alias textFormat: resultText.textFormat @@ -65,6 +66,8 @@ FlickableSectionPage { id: hintItem Layout.fillWidth: true + //: LABEL ANDROID IOS + title: qsTr("Hint") visible: text !== "" onClicked: hintClicked() diff --git a/resources/qml/Governikus/SettingsView/+desktop/GeneralSettings.qml b/resources/qml/Governikus/SettingsView/+desktop/GeneralSettings.qml index 161fb0519..191496dad 100644 --- a/resources/qml/Governikus/SettingsView/+desktop/GeneralSettings.qml +++ b/resources/qml/Governikus/SettingsView/+desktop/GeneralSettings.qml @@ -39,7 +39,12 @@ ColumnLayout { //: LABEL DESKTOP text: qsTr("Use the system font") - onCheckedChanged: SettingsModel.useSystemFont = checked + onCheckedChanged: { + if (checked !== SettingsModel.useSystemFont) { + SettingsModel.useSystemFont = checked; + plugin.doRefresh(); + } + } } GSwitch { Layout.fillWidth: true diff --git a/resources/qml/Governikus/SettingsView/+desktop/SettingsView.qml b/resources/qml/Governikus/SettingsView/+desktop/SettingsView.qml index 45cfab279..ff9f52047 100644 --- a/resources/qml/Governikus/SettingsView/+desktop/SettingsView.qml +++ b/resources/qml/Governikus/SettingsView/+desktop/SettingsView.qml @@ -84,13 +84,6 @@ SectionPage { contentObjectModel: ObjectModel { Component { GeneralSettings { - Connections { - function onFireUseSystemFontChanged() { - sectionPage.nextView(UiModule.DEFAULT); - } - - target: SettingsModel - } } } Component { diff --git a/resources/qml/Governikus/Workflow/+mobile/NfcWorkflow.qml b/resources/qml/Governikus/Workflow/+mobile/NfcWorkflow.qml index 7b74323b9..afbe36cfc 100644 --- a/resources/qml/Governikus/Workflow/+mobile/NfcWorkflow.qml +++ b/resources/qml/Governikus/Workflow/+mobile/NfcWorkflow.qml @@ -11,6 +11,7 @@ import Governikus.Type.AuthModel import Governikus.Type.ReaderPlugIn import Governikus.Type.NumberModel import Governikus.Type.RemoteServiceModel +import Governikus.Type.SettingsModel GFlickableColumnLayout { id: baseItem @@ -44,6 +45,15 @@ GFlickableColumnLayout { TechnologyInfo { id: technologyInfo + //: INFO ANDROID Text regarding ID card position animations + readonly property string animationText: qsTr("The animations depict possible positions.") + //: INFO ANDROID Text regarding different NFC chip positions on different smartphones + readonly property string deviceText: qsTr("The exact position of the ID card is device dependent.") + //: INFO ANDROID Text that one ID card position should be kept for several seconds + readonly property string keepPositionText: qsTr("Keep one position for several seconds before trying another one and do not move the ID card after contact was established.") + //: INFO ANDROID Text regarding the ID card position on the device + readonly property string positionText: qsTr("Please place your ID card directly on the device's back side.") + Layout.alignment: Qt.AlignHCenter enableButtonText: { switch (nfcState) { @@ -91,9 +101,10 @@ GFlickableColumnLayout { } else if (Constants.is_layout_ios) { //: INFO IOS The ID card may be inserted, the authentication process may be started. return qsTr("Please place your ID card on the top of the device's back side."); + } else if (SettingsModel.useAnimations) { + return "%1

%2 %3 %4".arg(positionText).arg(deviceText).arg(animationText).arg(keepPositionText); } else { - //: INFO ANDROID The ID card may be inserted, the authentication process may be started. - return qsTr("Please place your ID card directly on the device's back side.

The exact position of the ID card is device dependent. The animations depict possible positions. Keep one position for several seconds before trying another one and do not move the ID card after contact was established."); + return "%1

%2 %3".arg(positionText).arg(deviceText).arg(keepPositionText); } } titleText: { diff --git a/resources/translations/ausweisapp_de.ts b/resources/translations/ausweisapp_de.ts index 5a0d82024..025b4cf75 100644 --- a/resources/translations/ausweisapp_de.ts +++ b/resources/translations/ausweisapp_de.ts @@ -566,16 +566,6 @@ LABEL ANDROID IOS LABEL ANDROID IOS Ausweiszugriff erfolgreich - - Online identification feature disabled - LABEL ANDROID IOS - Online-Ausweisfunktion deaktiviert - - - Online identification feature enabled - LABEL ANDROID IOS - Online-Ausweisfunktion aktiviert - ID card PIN suspended LABEL ANDROID IOS @@ -591,6 +581,16 @@ LABEL ANDROID IOS LABEL ANDROID IOS Ausweis einsatzbereit + + eID function disabled + LABEL ANDROID IOS + Online-Ausweisfunktion deaktiviert + + + eID function enabled + LABEL ANDROID IOS + Online-Ausweisfunktion aktiviert + CheckIDCardSuggestionView @@ -644,11 +644,6 @@ LABEL ANDROID IOS LABEL ANDROID IOS Es war nicht möglich, eine stabile Verbindung mit Ihrem Ausweis herzustellen.<br><br>Bitte starten Sie die Prüfung erneut. Versuchen Sie eine andere Kartenposition und achten Sie darauf, die Karte während der Prüfung nicht zu bewegen.<br><br>Wenn auch bei unterschiedlichen Kartenpositionen keine Verbindung zur Ausweiskarte hergestellt werden kann, deutet dies darauf hin, dass die NFC-Schnittstelle Ihres mobilen Geräts die Ausweiskarte nicht ausreichend mit Strom versorgen kann.<br><br>Mit der %1 kompatible Smartphones finden Sie auf unserer <a href="%2">Website</a>. - - Online identification feature disabled - LABEL ANDROID IOS - Online-Ausweisfunktion deaktiviert - OK LABEL ANDROID IOS @@ -689,6 +684,16 @@ LABEL ANDROID IOS LABEL ANDROID IOS Es wurde kein unterstützter Ausweis erkannt. Die %1 unterstützt:<p><ul><li>deutsche Personalausweise</li><li>elektronische Aufenthaltstitel (eAT)</li><li>eID-Karten für EU-/EWR-Bürger</li></ul></p>Haben Sie eines der genannten Dokumente verwendet und diese Fehlermeldung erscheint dennoch, starten Sie bitte die Prüfung erneut. + + eID function disabled + LABEL ANDROID IOS + Online-Ausweisfunktion deaktiviert + + + Activate the eID function. + LABEL ANDROID IOS Hint when a workflow failed because the eID function was not activated + Online-Ausweisfunktion aktivieren + CheckIDCardView @@ -1589,16 +1594,6 @@ LABEL ANDROID IOS Bitte folgen Sie den Anweisungen auf Ihrem Smartphone (verbunden mit %1) oder legen Sie den Ausweis auf den Kartenleser. - - Hint - - Hint - LABEL DESKTOP ----------- -LABEL ANDROID IOS - Tipp - - LanguageButtonData @@ -2063,16 +2058,31 @@ LABEL ANDROID IOS INFO IOS The ID card may be inserted, the authentication process may be started. Bitte platzieren Sie Ihren Ausweis oben an der Geräterückseite. - - Please place your ID card directly on the device's back side.<br/><br/>The exact position of the ID card is device dependent. The animations depict possible positions. Keep one position for several seconds before trying another one and do not move the ID card after contact was established. - INFO ANDROID The ID card may be inserted, the authentication process may be started. - Bitte platzieren Sie Ihren Ausweis direkt an der Geräterückseite.<br/><br/>Die genaue Position des Ausweises ist modellabhängig. Die Animationen zeigen Ihnen mögliche Positionen. Halten Sie jede Position einige Sekunden, bevor Sie eine andere ausprobieren und bewegen Sie den Ausweis nicht mehr, sobald der Kontakt hergestellt wurde. - The device "%1" wants to use this smartphone as card reader and connect to your id card. INFO ANDROID IOS %1 will be replaced with the name of the device. Das Gerät "%1" möchte dieses Smartphone als Kartenleser nutzen und sich mit Ihrem Ausweis verbinden. + + The animations depict possible positions. + INFO ANDROID Text regarding ID card position animations + Die Animationen zeigen Ihnen mögliche Positionen. + + + The exact position of the ID card is device dependent. + INFO ANDROID Text regarding different NFC chip positions on different smartphones + Die genaue Position des Ausweises ist modellabhängig. + + + Keep one position for several seconds before trying another one and do not move the ID card after contact was established. + INFO ANDROID Text that one ID card position should be kept for several seconds + Halten Sie jede Position einige Sekunden, bevor Sie eine andere ausprobieren und bewegen Sie den Ausweis nicht mehr, sobald der Kontakt hergestellt wurde. + + + Please place your ID card directly on the device's back side. + INFO ANDROID Text regarding the ID card position on the device + Bitte platzieren Sie Ihren Ausweis direkt an der Geräterückseite. + NumberField @@ -2202,9 +2212,9 @@ LABEL ANDROID IOS A11y text, appended onto the "submit" button text wh PairingSuccessView - Pairing with %1 successful, it will be listed under "Paired devices". + Pairing with "%1" successful, it will be listed under "Paired devices". INFO ALL_PLATFORMS The pairing with the SaC server was successful. - Die Kopplung mit %1 war erfolgreich, es wird bei den "Gekoppelten Geräten" gelistet. + Die Kopplung mit "%1" war erfolgreich, es wird bei den "Gekoppelten Geräten" gelistet. The device may now be used as a card reader. @@ -2520,6 +2530,29 @@ LABEL ALL_PLATFORMS INFO ALL_PLATFORMS Description text explaining the PINs (%1 is replaced with the application name) 7/7 Sie können die Karten-PIN jederzeit in der %1 ändern. + + I can't recall my PIN + LABEL ALL_PLATFORMS + Ich kenne meine PIN nicht + + + I can't recall my PUK + Ich kenne meine PUK nicht + + + Set a new PIN + Neue PIN setzen + + + + PasswordInfoView + + Hint + LABEL DESKTOP +---------- +LABEL ANDROID IOS + Tipp + PersonalizationController @@ -3229,6 +3262,13 @@ Hierfür müssen Sie zuvor das entsprechende Gerät mit diesem Smartphone koppel LABEL ANDROID IOS OK + + Hint + LABEL DESKTOP +---------- +LABEL ANDROID IOS + Tipp + RetryCounter @@ -4000,6 +4040,13 @@ Um fortzufahren, verwenden Sie Ihren Ausweis, indem Sie die NFC-Schnittstelle au App bewerten + + SuggestionData + + Hint + Tipp + + TabbedPane @@ -5689,8 +5736,8 @@ LABEL ALL_PLATFORMS Hint text for requested Transport PIN but both, Transport PI Wenn Sie Ihre Karten-PIN nicht kennen, können Sie bei Ihrer zuständigen Ausweisbehörde eine neue Karten-PIN setzen. - To find your competent authority you may visit www.behoerdenfinder.de. - Ihre zuständige Behörde finden Sie beispielsweise unter www.behoerdenfinder.de. + To find your competent authority you may visit servicesuche.bund.de. + Ihre zuständige Behörde finden Sie beispielsweise unter servicesuche.bund.de. Request a new card PIN to be able to use the eID function again. @@ -5828,6 +5875,11 @@ LABEL ALL_PLATFORMS Hint text for requested Transport PIN but both, Transport PI LABEL ALL_PLATFORMS Klicken zum Koppeln + + was + LABEL ALL_PLATFORMS Describes the former name of the device and is shown as: "New_Name (was Old_Name)" + ehem. + governikus::RemoteServiceModel diff --git a/resources/translations/ausweisapp_ru.ts b/resources/translations/ausweisapp_ru.ts index 1538de7b6..bed1f2180 100644 --- a/resources/translations/ausweisapp_ru.ts +++ b/resources/translations/ausweisapp_ru.ts @@ -566,16 +566,6 @@ LABEL ANDROID IOS LABEL ANDROID IOS Успешный доступ к идентификационной карте - - Online identification feature disabled - LABEL ANDROID IOS - Функция онлайн-идентификации деактивирована - - - Online identification feature enabled - LABEL ANDROID IOS - Функция онлайн-идентификации активирована - ID card PIN suspended LABEL ANDROID IOS @@ -591,6 +581,16 @@ LABEL ANDROID IOS LABEL ANDROID IOS Идентификационная карта готова к использованию + + eID function disabled + LABEL ANDROID IOS + Функция онлайн-идентификации деактивирована + + + eID function enabled + LABEL ANDROID IOS + Функция онлайн-идентификации активирована + CheckIDCardSuggestionView @@ -644,11 +644,6 @@ LABEL ANDROID IOS LABEL ANDROID IOS Не удалось установить стабильное соединение с вашей идентификационной картой.<br><br>Перезапустите проверку. Попробуйте изменить положение карты и убедитесь в том, что карта не смещается во время проверки.<br><br>Если невозможно установить соединение с идентификационной картой в разных положениях, то это значит, что интерфейс NFC вашего мобильного устройства не подает достаточно тока на идентификационную карту.<br><br>Список совместимых с %1 смартфонов см. на нашем <a href="%2">сайте</a>. - - Online identification feature disabled - LABEL ANDROID IOS - Функция онлайн-идентификации деактивирована - OK LABEL ANDROID IOS @@ -689,6 +684,16 @@ LABEL ANDROID IOS LABEL ANDROID IOS Поддерживаемые идентификационные карты не обнаружены. %1 поддерживает:<p><ul><li>идентификационные карты Германии;</li><li>электронные разрешения на временное пребывание (eAT);</li><li>карты eID для граждан ЕС/ЕЭП.</li></ul></p>Если вы используете один из перечисленных документов, но данное сообщение об ошибке все равно появляется, перезапустите проверку. + + eID function disabled + LABEL ANDROID IOS + Функция онлайн-идентификации деактивирована + + + Activate the eID function. + LABEL ANDROID IOS Hint when a workflow failed because the eID function was not activated + + CheckIDCardView @@ -1589,16 +1594,6 @@ LABEL ANDROID IOS Следуйте инструкциям в смартфоне (подключен к %1) или вставьте идентификационную карту в устройство чтения карт. - - Hint - - Hint - LABEL DESKTOP ----------- -LABEL ANDROID IOS - Совет - - LanguageButtonData @@ -2063,16 +2058,31 @@ LABEL ANDROID IOS INFO IOS The ID card may be inserted, the authentication process may be started. Расположите идентификационную карту сверху на обратной стороне устройства. - - Please place your ID card directly on the device's back side.<br/><br/>The exact position of the ID card is device dependent. The animations depict possible positions. Keep one position for several seconds before trying another one and do not move the ID card after contact was established. - INFO ANDROID The ID card may be inserted, the authentication process may be started. - Расположите идентификационную карту непосредственно на задней стороне устройства.<br/><br/>Точное положение идентификационной карты зависит от устройства. Возможное положение показано в анимации. Удерживайте идентификационную карту в одном положении несколько секунд, прежде чем поменять положение, и не смещайте ее после установки соединения. - The device "%1" wants to use this smartphone as card reader and connect to your id card. INFO ANDROID IOS %1 will be replaced with the name of the device. Устройство «%1» планирует использовать данный смартфон в качестве устройства чтения карт и установить соединение с вашей идентификационной картой. + + The animations depict possible positions. + INFO ANDROID Text regarding ID card position animations + Возможное положение показано в анимации. + + + The exact position of the ID card is device dependent. + INFO ANDROID Text regarding different NFC chip positions on different smartphones + Точное положение идентификационной карты зависит от устройства. + + + Keep one position for several seconds before trying another one and do not move the ID card after contact was established. + INFO ANDROID Text that one ID card position should be kept for several seconds + Удерживайте идентификационную карту в одном положении несколько секунд, прежде чем поменять положение, и не смещайте ее после установки соединения. + + + Please place your ID card directly on the device's back side. + INFO ANDROID Text regarding the ID card position on the device + Расположите идентификационную карту непосредственно на задней стороне устройства. + NumberField @@ -2202,9 +2212,9 @@ LABEL ANDROID IOS A11y text, appended onto the "submit" button text wh PairingSuccessView - Pairing with %1 successful, it will be listed under "Paired devices". + Pairing with "%1" successful, it will be listed under "Paired devices". INFO ALL_PLATFORMS The pairing with the SaC server was successful. - Сопряжение с %1 успешно; оно будет указано в разделе «Сопряженные устройства». + Сопряжение с «%1» успешно; оно будет указано в разделе «Сопряженные устройства». The device may now be used as a card reader. @@ -2520,6 +2530,29 @@ LABEL ALL_PLATFORMS INFO ALL_PLATFORMS Description text explaining the PINs (%1 is replaced with the application name) 7/7 Вы можете изменить PIN-код карты в любое время в %1. + + I can't recall my PIN + LABEL ALL_PLATFORMS + + + + I can't recall my PUK + + + + Set a new PIN + + + + + PasswordInfoView + + Hint + LABEL DESKTOP +---------- +LABEL ANDROID IOS + Совет + PersonalizationController @@ -3229,6 +3262,13 @@ To do this you first have to pair that device with this smartphone. LABEL ANDROID IOS OK + + Hint + LABEL DESKTOP +---------- +LABEL ANDROID IOS + Совет + RetryCounter @@ -4000,6 +4040,13 @@ To proceed use your ID card by selecting the NFC interface. If you want to set u Оценить приложение + + SuggestionData + + Hint + Совет + + TabbedPane @@ -5662,8 +5709,8 @@ To proceed use your ID card by selecting the NFC interface. If you want to set u Найти компетентный орган - To find your competent authority you may visit www.behoerdenfinder.de. - Найти нужный компетентный орган можно на сайте www.behoerdenfinder.de. + To find your competent authority you may visit servicesuche.bund.de. + Найти нужный компетентный орган можно на сайте servicesuche.bund.de. If you don't have your Transport PIN letter and no access to the PUK, you may turn to the competent authority and set a new ID card PIN there. @@ -5828,6 +5875,11 @@ LABEL ALL_PLATFORMS Hint text for requested Transport PIN but both, Transport PI LABEL ALL_PLATFORMS Нажмите для сопряжения + + was + LABEL ALL_PLATFORMS Describes the former name of the device and is shown as: "New_Name (was Old_Name)" + + governikus::RemoteServiceModel diff --git a/resources/translations/ausweisapp_uk.ts b/resources/translations/ausweisapp_uk.ts index e6ed8edca..cf8aa8b8a 100644 --- a/resources/translations/ausweisapp_uk.ts +++ b/resources/translations/ausweisapp_uk.ts @@ -566,16 +566,6 @@ LABEL ANDROID IOS LABEL ANDROID IOS Доступ до ID-картки успішно отримано - - Online identification feature disabled - LABEL ANDROID IOS - Функцію онлайн-ідентифікації вимкнено - - - Online identification feature enabled - LABEL ANDROID IOS - Функцію онлайн-ідентифікації ввімкнено - ID card PIN suspended LABEL ANDROID IOS @@ -591,6 +581,16 @@ LABEL ANDROID IOS LABEL ANDROID IOS Функціональна ID-картка + + eID function disabled + LABEL ANDROID IOS + Функцію онлайн-ідентифікації вимкнено + + + eID function enabled + LABEL ANDROID IOS + Функцію онлайн-ідентифікації ввімкнено + CheckIDCardSuggestionView @@ -644,11 +644,6 @@ LABEL ANDROID IOS LABEL ANDROID IOS Не вдалося встановити стабільне з’єднання з вашою ID-карткою.<br><br>Почніть перевірку ще раз. Спробуйте змінити положення картки та не рухайте її під час тесту.<br><br>Якщо з’єднання з ID-карткою не вдається встановити навіть у різних положеннях, це означає, що інтерфейс NFC вашого мобільного пристрою не може забезпечити ID-картку достатньою потужністю.<br><br>Ви можете знайти смартфони, сумісні з %1, на нашому <a href="%2">сайті</a>. - - Online identification feature disabled - LABEL ANDROID IOS - Функцію онлайн-ідентифікації вимкнено - OK LABEL ANDROID IOS @@ -689,6 +684,16 @@ LABEL ANDROID IOS LABEL ANDROID IOS Жодної підтримуваної ID-картки не було виявлено. Програма %1 підтримує:<p><ul><li>Німецькі ID-картки</li><li>Електронні посвідки на проживання (eAT)</li><li>Картки eID для громадян ЄС/ЄЕЗ</li></ul></p>Якщо ви скористалися одним із вищезазначених документів, але це повідомлення про помилку все одно з’являється, перезапустіть перевірку. + + eID function disabled + LABEL ANDROID IOS + Функцію онлайн-ідентифікації вимкнено + + + Activate the eID function. + LABEL ANDROID IOS Hint when a workflow failed because the eID function was not activated + + CheckIDCardView @@ -1589,16 +1594,6 @@ LABEL ANDROID IOS Дотримуйтесь інструкцій на своєму смартфоні (підключеному до %1), або покладіть ID-картку на пристрій читання карток. - - Hint - - Hint - LABEL DESKTOP ----------- -LABEL ANDROID IOS - Підказка - - LanguageButtonData @@ -2063,16 +2058,31 @@ LABEL ANDROID IOS INFO IOS The ID card may be inserted, the authentication process may be started. Покладіть свою ID-картку на задню панель пристрою. - - Please place your ID card directly on the device's back side.<br/><br/>The exact position of the ID card is device dependent. The animations depict possible positions. Keep one position for several seconds before trying another one and do not move the ID card after contact was established. - INFO ANDROID The ID card may be inserted, the authentication process may be started. - Покладіть ID-картку безпосередньо на задній бік пристрою.<br/><br/>Точне положення ID-картки залежить від пристрою. На анімації показано можливі положення. Утримуйте ID-картку в одному положенні кілька секунд, перш ніж спробувати інше, і не переміщайте її після встановлення контакту. - The device "%1" wants to use this smartphone as card reader and connect to your id card. INFO ANDROID IOS %1 will be replaced with the name of the device. Пристрій «%1» намагається використовувати цей смартфон як пристрій читання карток і встановити з’єднання з вашою ID-карткою. + + The animations depict possible positions. + INFO ANDROID Text regarding ID card position animations + На анімації показано можливі положення. + + + The exact position of the ID card is device dependent. + INFO ANDROID Text regarding different NFC chip positions on different smartphones + Точне положення ID-картки залежить від пристрою. + + + Keep one position for several seconds before trying another one and do not move the ID card after contact was established. + INFO ANDROID Text that one ID card position should be kept for several seconds + Утримуйте ID-картку в одному положенні кілька секунд, перш ніж спробувати інше, і не переміщайте її після встановлення контакту. + + + Please place your ID card directly on the device's back side. + INFO ANDROID Text regarding the ID card position on the device + Покладіть ID-картку безпосередньо на задній бік пристрою. + NumberField @@ -2202,9 +2212,9 @@ LABEL ANDROID IOS A11y text, appended onto the "submit" button text wh PairingSuccessView - Pairing with %1 successful, it will be listed under "Paired devices". + Pairing with "%1" successful, it will be listed under "Paired devices". INFO ALL_PLATFORMS The pairing with the SaC server was successful. - Пару із пристроєм %1 створено, його буде додано до переліку «З’єднані пристрої». + Пару із пристроєм «%1» створено, його буде додано до переліку «З’єднані пристрої». The device may now be used as a card reader. @@ -2520,6 +2530,29 @@ LABEL ALL_PLATFORMS INFO ALL_PLATFORMS Description text explaining the PINs (%1 is replaced with the application name) 7/7 Ви можете в будь-який момент змінити PIN-код своєї картки в %1. + + I can't recall my PIN + LABEL ALL_PLATFORMS + + + + I can't recall my PUK + + + + Set a new PIN + + + + + PasswordInfoView + + Hint + LABEL DESKTOP +---------- +LABEL ANDROID IOS + Підказка + PersonalizationController @@ -3229,6 +3262,13 @@ To do this you first have to pair that device with this smartphone. LABEL ANDROID IOS OK + + Hint + LABEL DESKTOP +---------- +LABEL ANDROID IOS + Підказка + RetryCounter @@ -4000,6 +4040,13 @@ To proceed use your ID card by selecting the NFC interface. If you want to set u Оцінити програму + + SuggestionData + + Hint + Підказка + + TabbedPane @@ -5662,8 +5709,8 @@ To proceed use your ID card by selecting the NFC interface. If you want to set u Знайти компетентний орган - To find your competent authority you may visit www.behoerdenfinder.de. - Знайти свій компетентний орган можна, відвідавши www.behoerdenfinder.de. + To find your competent authority you may visit servicesuche.bund.de. + Знайти свій компетентний орган можна, відвідавши servicesuche.bund.de. If you don't have your Transport PIN letter and no access to the PUK, you may turn to the competent authority and set a new ID card PIN there. @@ -5828,6 +5875,11 @@ LABEL ALL_PLATFORMS Hint text for requested Transport PIN but both, Transport PI LABEL ALL_PLATFORMS Натисніть, щоб створити пару + + was + LABEL ALL_PLATFORMS Describes the former name of the device and is shown as: "New_Name (was Old_Name)" + + governikus::RemoteServiceModel diff --git a/resources/updatable-files/supported-providers.json b/resources/updatable-files/supported-providers.json index 336ae8b54..f971876f9 100644 --- a/resources/updatable-files/supported-providers.json +++ b/resources/updatable-files/supported-providers.json @@ -370,13 +370,13 @@ "longName": { "": "Stadt Braunschweig - Internetbasierte Fahrzeugzulassung" }, - "address": "https://stadt-braunschweig.govconnect.de", + "address": "https://service.braunschweig.de", "homepage": "https://braunschweig.de", "phone": "+49 531 4701", "email": "stadt@braunschweig.de", "postalAddress": "Stadt Braunschweig
Platz der Deutschen Einheit 1
38100 Braunschweig", "category": "citizen", - "subjectUrlInfo": "Using service from Niedersächsisches Ministerium für Inneres und Sport (https://e-id.niedersachsen.de)." + "subjectUrlInfo": "Using service from bundID (https://id.bund.de)." }, { "shortName": { @@ -398,6 +398,28 @@ "https://formular.arbeitsagentur.de" ] }, + { + "shortName": { + "": "Bundesanzeiger Verlag GmbH" + }, + "longName": { + "": "Bundesanzeiger Verlag GmbH" + }, + "longDescription": { + "": "Für die Übermittlung von Rechnungslegungsunterlagen von den im Handels- oder Genossenschaftsregister eingetragenen Unternehmen an das Unternehmensregister muss nach den Vorgaben der URV im Rahmen einer Registrierung eine einmalige, elektronische Identitätsprüfung des Nutzers anhand bestimmter elektronischer Identifizierungsmittel, u.a. mit der Online-Ausweisfunktion des Personalausweises, erfolgen." + }, + "address": "https://ident.bundesanzeiger-verlag.de", + "homepage": "https://www.bundesanzeiger-verlag.de", + "phone": "+49 221 97668 275", + "email": "service@bundesanzeiger.de", + "postalAddress": "Bundesanzeiger Verlag GmbH
Amsterdamer Straße 192
50735 Köln", + "image": "BundesanzeigerVerlag_image.jpg", + "icon": "BundesanzeigerVerlag_icon.svg", + "category": "other", + "subjectUrls": [ + "https://ident.bundesanzeiger-verlag.de" + ] + }, { "eidSupport": false, "shortName": { @@ -467,7 +489,7 @@ "longDescription": { "": "Die Stadt Münster bietet auf ihrer Webseite eine Reihe von Online-Diensten an. Dort können Sie mit der Online-Ausweisfunktion unter anderem:
  • eine Personenstandsurkunde bestellen,
  • Ihr Wunschkennzeichen beantragen,
  • geografische Karten bestellen,
  • Elektroschrott zur Abholung anmelden,
  • eine Erklärung zum Elterneinkommen für die Festsetzung des Elternbeitrags für die Kindertagesbetreuung abgeben,
  • eine Sondernutzungserlaubnis für private Baumaßnahmen an öffentlichen Straßen beantragen,
  • eine Großanlage mit zentraler Trinkwassererwärmung anzeigen,
  • einen Fahrradfund melden,
  • ein Reitkennzeichen beantragen,
  • Mietspiegel-Broschüren bestellen.
" }, - "address": "https://www.stadt-muenster.de/online-dienste", + "address": "https://www.stadt-muenster.de/service/online-services", "homepage": "https://www.stadt-muenster.de", "phone": "+49 251 4 92 0", "email": "stadtverwaltung@stadt-muenster.de", @@ -544,7 +566,7 @@ "longDescription": { "": "In unserem Bürgerservice-Portal können Sie Anträge an die Kreisverwaltung Herford online erfassen und direkt zur weiteren Bearbeitung an die zuständigen Stellen übermitteln." }, - "address": "https://www.kreis-herford.de/i-KFZ-Stufe 4", + "address": "https://www.kreis-herford.de/i-KFZ-Stufe%204", "homepage": "https://www.kreis-herford.de", "phone": "+49 5223 988 500", "email": "portal@kreis-herford.de", @@ -941,7 +963,7 @@ "longDescription": { "": "Mit i-Kfz können Sie Ihr Auto per Internet von zu Hause aus zulassen. Derzeit sind online folgende Dienstleistungen möglich:
  • Neuzulassung
  • Umschreibung
  • Wiederzulassung
  • Adressänderung
  • Außerbetriebsetzung
" }, - "address": "https://ikfz.ikfz-sachsen.de/ikfz3/?LICENSEIDENTIFIER=nordsachsen_kreis", + "address": "https://www.landkreis-nordsachsen.de/was-erledige-ich-wo/dezernat/sachgebiet-kfz-zulassungsbehoerde", "homepage": "https://www.landkreis-nordsachsen.de", "phone": "+49 3421 758 5143", "email": "ikfz@lra-nordsachsen.de", @@ -1395,8 +1417,8 @@ "longDescription": { "": "Wir stellen Online-Dienstleistungen aus Bad Oeynhausen, dem Kreis Minden-Lübbecke, dem Land NRW und den Bundesbehörden zur Verfügung.

Sie können unseren Service ohne Anmeldung oder mit einer Anmeldung über das Servicekonto.NRW nutzen. Für die Nutzung von ePayment ist eine Anmeldung mit dem Servicekonto Voraussetzung." }, - "address": "https://portal.kommunale.it/bad-oeynhausen/login", - "homepage": "https://portal.kommunale.it/bad-oeynhausen/services", + "address": "https://www.badoeynhausen.de/rathaus-service-politik", + "homepage": "https://www.badoeynhausen.de", "phone": "+49 5731 14 0", "email": "egov@badoeynhausen.de", "postalAddress": "Stadt Bad Oeynhausen
Der Bürgermeister
Ostkorso 8
32545 Bad Oeynhausen", @@ -1436,7 +1458,7 @@ "": "In unserem Service-Portal können Sie Anträge an die Kreisverwaltung Soest online erfassen und direkt zur weiteren Bearbeitung an die zuständigen Stellen übermitteln." }, "address": "https://serviceportal.kreis-soest.de", - "homepage": "https://www.kreis-soest.de/start", + "homepage": "https://www.kreis-soest.de", "phone": "+49 2921 30 0", "email": "service-portal@kreis-soest.de", "postalAddress": "Kreisverwaltung Soest
Hoher Weg 1-3
59494 Soest", @@ -1652,8 +1674,8 @@ "longDescription": { "": "Mithilfe der internetbasierten Fahrzeugzulassung können Sie Ihr Fahrzeug ganz einfach anmelden, Adresse ändern und abmelden.
Nähere Details zum Verfahren entnehmen Sie der Startseite des iKFZ-Portals." }, - "address": "https://region-hannover.govconnect.de", - "homepage": "https://region-hannover.govconnect.de", + "address": "https://region-hannover-ikfz4.govconnect.de/i4/ikfz4/?LICENSEIDENTIFIER=hannover_region", + "homepage": "https://www.hannover.de/Leben-in-der-Region-Hannover/Mobilit%C3%A4t/Kraftfahrzeug-Stra%C3%9Fe/KFZ-Zulassung-in-Stadt-und-Region/Kfz-Zulassungen-in-der-Region-Hannover/i-KFZ-Zulassungen,-Wiederzulassungen-und-Au%C3%9Ferbetriebsetzungen-online", "phone": "+49 511 616 17444", "email": "TeamKfz@Region-Hannover.de", "postalAddress": "Region Hannover
Fachbereich Öffentliche Sicherheit
Team Kfz-Zulassungsangelegenheiten
Hildesheimer Straße 20
30169 Hannover", @@ -1939,8 +1961,8 @@ "longDescription": { "": "Der Landkreis Ludwigslust-Parchim bietet auf seinem Serviceportal eine Vielzahl von Online-Diensten (inkl. Bezahlvorgang bei gebührenpflichtigen Leistungen) an." }, - "address": "https://service.kreis-lup.de", - "homepage": "https://www.kreis-lup.de", + "address": "https://service.kreis-lup.de/dienstleistungen", + "homepage": "https://service.kreis-lup.de", "phone": "+49 3871 722 0", "email": "info@kreis-lup.de", "postalAddress": "Landkreis Ludwigslust-Parchim
Postfach 16 02 20
19092 Schwerin", @@ -2245,7 +2267,7 @@ "": "Die Stadt Remscheid bietet auf ihrem Serviceportal eine Vielzahl von Online-Diensten (inkl. Bezahlvorgang bei gebührenpflichtigen Leistungen) an." }, "address": "https://serviceportal.remscheid.de", - "homepage": "https://www.remscheid.de", + "homepage": "https://serviceportal.remscheid.de", "phone": "+49 2191 16 00", "email": "Serviceportal@remscheid.de", "postalAddress": "Stadt Remscheid
Theodor-Heuss-Platz 1
42853 Remscheid", diff --git a/resources/updatable-files/supported-readers.json b/resources/updatable-files/supported-readers.json index b395fd4ad..9dea648f1 100644 --- a/resources/updatable-files/supported-readers.json +++ b/resources/updatable-files/supported-readers.json @@ -361,7 +361,7 @@ "os": "mac" } ], - "URL": "https://www.reiner-sct.com/support/support-anfrage/?os=MacOS&productGroup=77304735&product=77304828&q=driver#choice5" + "URL": "https://help.reiner-sct.com/de/support/solutions/articles/101000480002" }, { "Platforms": [ @@ -409,11 +409,7 @@ }, { "os": "mac", - "max": "10.14" - }, - { - "os": "mac", - "min": "11" + "max": "13" }, { "os": "unknown" @@ -437,20 +433,26 @@ { "Platforms": [ { - "DE": "bis macOS 10.14 (Mojave)", - "EN": "up to macOS 10.14 (Mojave)", - "os": "mac", - "max": "10.14" - }, - { - "DE": "ab macOS 11 (Big Sur)", - "EN": "from macOS 11 (Big Sur)", + "DE": "bis macOS 13", + "EN": "up to macOS 13", "os": "mac", - "min": "11" + "max": "13" } ], "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber.", "EN": "The card reader is compatible with the installed system driver." + }, + { + "Platforms": [ + { + "DE": "ab macOS 14", + "EN": "from macOS 14", + "os": "mac", + "min": "14" + } + ], + "DE": "Der Kartenleser wird nicht mehr unterstützt, leider bietet der Hersteller keine aktuellen Treiber an.", + "EN": "The card reader is no longer supported, unfortunately the manufacturer does not offer up-to-date drivers." } ], "Internal information": "Der Hersteller stellt keinen Treiber mehr zur Verfügung." @@ -592,7 +594,7 @@ "os": "unknown" } ], - "URL": "https://support.identiv.com/3700f/" + "URL": "https://support.identiv.com/3700f" } ], "Information": [ @@ -602,15 +604,34 @@ "DE": "Windows", "EN": "Windows", "os": "win" - }, + } + ], + "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Alternativ können Sie den Treiber von der Webseite des Herstellers verwenden.", + "EN": "The card reader operates with the driver automatically installed by the system. Alternatively you have the option to install a driver from the manufacturer's website." + }, + { + "Platforms": [ { - "DE": "macOS", - "EN": "macOS", - "os": "mac" + "DE": "bis macOS 13", + "EN": "up to macOS 13", + "os": "mac", + "max": "13" } ], "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Alternativ können Sie den Treiber von der Webseite des Herstellers verwenden.", "EN": "The card reader operates with the driver automatically installed by the system. Alternatively you have the option to install a driver from the manufacturer's website." + }, + { + "Platforms": [ + { + "DE": "ab macOS 14", + "EN": "from macOS 14", + "os": "mac", + "min": "14" + } + ], + "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite. Nach der Installation ist ein Neustart erforderlich.", + "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system. A reboot is required after the installation of the driver." } ] }, @@ -886,7 +907,7 @@ "os": "mac" } ], - "URL": "https://www.acs.com.hk/en/driver/151/acr1281u-npa-contactless-reader/" + "URL": "https://www.acs.com.hk/en/driver/151/acr1281u-npa-contactless-reader" } ], "Information": [ @@ -898,19 +919,32 @@ "os": "win" } ], - "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Falls Sie jedoch den Treiber von der Webseite des Herstellers installieren möchten, ist anschließend ein Neustart erforderlich.", - "EN": "The card reader operates with the driver automatically installed by the system. In case you prefer to install the driver from the manufacturer's webseite, a reboot is required." + "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Alternativ können Sie den Treiber von der Webseite des Herstellers verwenden.", + "EN": "The card reader operates with the driver automatically installed by the system. Alternatively you have the option to install a driver from the manufacturer's website." }, { "Platforms": [ { - "DE": "macOS", - "EN": "macOS", - "os": "mac" + "DE": "bis macOS 13", + "EN": "up to macOS 13", + "os": "mac", + "max": "13" } ], - "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite.", - "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system." + "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite. Nach der Installation ist ein Neustart erforderlich.", + "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system. A reboot is required after the installation of the driver." + }, + { + "Platforms": [ + { + "DE": "ab macOS 14", + "EN": "from macOS 14", + "os": "mac", + "min": "14" + } + ], + "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Alternativ können Sie den Treiber von der Webseite des Herstellers verwenden. Nach der Installation ist ein Neustart erforderlich.", + "EN": "The card reader operates with the driver automatically installed by the system. Alternatively you have the option to install a driver from the manufacturer's website. A reboot is required after the installation of the driver." } ] }, @@ -1267,7 +1301,7 @@ "os": "win" } ], - "URL": "https://www.feig.de/login/" + "URL": "https://www.feig.de/login" } ], "Information": [ @@ -1309,31 +1343,32 @@ { "Platforms": [ { - "os": "win" - }, - { - "os": "mac" + "os": "win", + "max": "10.0.19999" }, { "os": "unknown" } ], "URL": "https://supportportal.gemalto.com/csm/?id=kb_article_view&sysparm_article=KB0016422" + }, + { + "Platforms": [ + { + "os": "mac" + } + ], + "URL": "https://supportportal.gemalto.com/csm?sys_kb_id=fd704ab21bd53d1019913035464bcb30&id=kb_article_view&sysparm_rank=1&sysparm_tsqueryId=6590372b1bed3d1019913035464bcb0e&sysparm_article=KB0027738" } ], "Information": [ { "Platforms": [ { - "DE": "Windows", - "EN": "Windows", - "os": "win" - }, - { - "DE": "bis macOS 10.15 (Catalina)", - "EN": "up to macOS 10.15 (Catalina)", - "os": "mac", - "max": "10.15" + "DE": "bis Windows 10", + "EN": "up to Windows 10", + "os": "win", + "max": "10.0.19999" } ], "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Es ist kein Treiber vom Hersteller vorhanden.", @@ -1342,14 +1377,38 @@ { "Platforms": [ { - "DE": "ab macOS 11 (Big Sur)", - "EN": "from macOS 11 (Big Sur)", + "DE": "ab Windows 11", + "EN": "from Windows 11", + "os": "win", + "min": "10.0.20000" + } + ], + "DE": "Der Kartenleser wird nicht mehr unterstützt, leider bietet der Hersteller keine aktuellen Treiber an.", + "EN": "The card reader is no longer supported, unfortunately the manufacturer does not offer up-to-date drivers." + }, + { + "Platforms": [ + { + "DE": "bis macOS 12", + "EN": "up to macOS 12", + "os": "mac", + "max": "12" + } + ], + "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite. Nach der Installation ist ein Neustart erforderlich. Trotz des Herstellertreibers ist es wichtig zu beachten, dass der Kartenleser nur funktioniert, solang er vor dem Start des Computers angeschlossen ist und nicht vom Gerät entfernt wird. Sollte er entfernt werden, müssen Sie Ihr Gerät neu starten.", + "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system. A reboot is required after the installation of the driver. Despite the manufacturer's driver, it is important to note that the card reader only works as long as it is connected before starting the computer and is not removed from the device. If it is removed, you will need to restart your device." + }, + { + "Platforms": [ + { + "DE": "ab macOS 13", + "EN": "from macOS 13", "os": "mac", - "min": "11" + "min": "13" } ], - "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber, ein Neustart ist erforderlich. Es ist kein Treiber vom Hersteller vorhanden.", - "EN": "The card reader operates with the driver automatically installed by the system, a reboot is required. There is no driver from the manufacturer." + "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Alternativ können Sie den Treiber von der Webseite des Herstellers verwenden. Nach der Installation ist ein Neustart erforderlich.", + "EN": "The card reader operates with the driver automatically installed by the system. Alternatively you have the option to install a driver from the manufacturer's website. A reboot is required after the installation of the driver." } ] }, @@ -1368,25 +1427,20 @@ "Platforms": [ { "os": "win" - } - ], - "URL": "https://supportportal.gemalto.com/csm/?id=kb_article_view&sysparm_article=KB0016422" - }, - { - "Platforms": [ + }, { - "os": "mac" + "os": "unknown" } ], - "URL": "https://supportportal.gemalto.com/csm/?id=kb_article_view&sysparm_article=KB0016424" + "URL": "https://supportportal.gemalto.com/csm" }, { "Platforms": [ { - "os": "unknown" + "os": "mac" } ], - "URL": "https://supportportal.gemalto.com/csm/?id=kb_article_view&sysparm_article=KB0016423" + "URL": "https://supportportal.gemalto.com/csm?sys_kb_id=fd704ab21bd53d1019913035464bcb30&id=kb_article_view&sysparm_rank=1&sysparm_tsqueryId=6590372b1bed3d1019913035464bcb0e&sysparm_article=KB0027738" } ], "Information": [ @@ -1396,12 +1450,6 @@ "DE": "Windows", "EN": "Windows", "os": "win" - }, - { - "DE": "bis macOS 10.15 (Catalina)", - "EN": "up to macOS 10.15 (Catalina)", - "os": "mac", - "max": "10.15" } ], "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Es ist kein Treiber vom Hersteller vorhanden.", @@ -1410,14 +1458,39 @@ { "Platforms": [ { - "DE": "ab macOS 11 (Big Sur)", - "EN": "from macOS 11 (Big Sur)", + "DE": "bis macOS 12", + "EN": "up to macOS 12", + "os": "mac", + "max": "12" + } + ], + "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite. Nach der Installation ist ein Neustart erforderlich.", + "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system. A reboot is required after the installation of the driver." + }, + { + "Platforms": [ + { + "DE": "macOS 13", + "EN": "macOS 13", + "os": "mac", + "min": "13", + "max": "13" + } + ], + "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Alternativ können Sie den Treiber von der Webseite des Herstellers verwenden. Nach der Installation ist ein Neustart erforderlich.", + "EN": "The card reader operates with the driver automatically installed by the system. Alternatively you have the option to install a driver from the manufacturer's website. A reboot is required after the installation of the driver." + }, + { + "Platforms": [ + { + "DE": "ab macOS 14", + "EN": "from macOS 14", "os": "mac", - "min": "11" + "min": "14" } ], - "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber, ein Neustart ist erforderlich. Es ist kein Treiber vom Hersteller vorhanden.", - "EN": "The card reader operates with the driver automatically installed by the system, a reboot is required. There is no driver from the manufacturer." + "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite. Nach der Installation ist ein Neustart erforderlich.", + "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system. A reboot is required after the installation of the driver." } ] }, @@ -1444,25 +1517,44 @@ "os": "unknown" } ], - "URL": "https://cherry.de/download/de/download.php?product_id=307" + "URL": "https://cherry.de/service/downloads#21865" } ], "Information": [ { "Platforms": [ { - "DE": "Windows", - "EN": "Windows", - "os": "win" - }, + "DE": "bis Windows 10", + "EN": "up to Windows 10", + "os": "win", + "max": "10.0.19999" + } + ], + "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite.", + "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system." + }, + { + "Platforms": [ + { + "DE": "ab Windows 11", + "EN": "from Windows 11", + "os": "win", + "min": "10.0.20000" + } + ], + "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Alternativ können Sie den Treiber von der Webseite des Herstellers verwenden.", + "EN": "The card reader operates with the driver automatically installed by the system. Alternatively you have the option to install a driver from the manufacturer's website." + }, + { + "Platforms": [ { "DE": "macOS", "EN": "macOS", "os": "mac" } ], - "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite.", - "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system." + "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite. Nach der Installation ist ein Neustart erforderlich.", + "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system. A reboot is required after the installation of the driver." } ] }, @@ -1473,7 +1565,7 @@ "0x0092" ], "Name": "Cherry TC-1300", - "Pattern": "(Cherry TC 1300|Cherry Smartcard Terminal TC 13xx-CL 0|Cherry SC Reader \\(046A:0092\\))", + "Pattern": "(Cherry Smartcard Terminal TC 13xx-CL 0|Cherry SC Reader \\(046A:0092\\))", "Icon": "img_Cherry_TC_1300.png", "IconWithNPA": "img_Cherry_TC_1300_mit_ausweis.png", "Drivers": [ @@ -1489,16 +1581,17 @@ "os": "unknown" } ], - "URL": "https://cherry.de/download/de/download.php?product_id=306" + "URL": "https://www.cherry.de/service/downloads#21864" } ], "Information": [ { "Platforms": [ { - "DE": "Windows", - "EN": "Windows", - "os": "win" + "DE": "bis Windows 10", + "EN": "up to Windows 10", + "os": "win", + "max": "10.0.19999" }, { "DE": "macOS", @@ -1506,8 +1599,20 @@ "os": "mac" } ], - "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite.", - "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system." + "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite. Nach der Installation ist ein Neustart erforderlich.", + "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system. A reboot is required after the installation of the driver." + }, + { + "Platforms": [ + { + "DE": "ab Windows 11", + "EN": "from Windows 11", + "os": "win", + "min": "10.0.20000" + } + ], + "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Alternativ können Sie den Treiber von der Webseite des Herstellers verwenden.", + "EN": "The card reader operates with the driver automatically installed by the system. Alternatively you have the option to install a driver from the manufacturer's website." } ] }, @@ -1527,28 +1632,38 @@ { "os": "win" }, - { - "os": "mac" - }, { "os": "unknown" } ], - "URL": "https://cherry.de/download/de/download.php?product_id=170" + "URL": "https://www.cherry.de/service/downloads#21987" } ], "Information": [ { "Platforms": [ { - "DE": "Windows", - "EN": "Windows", - "os": "win" + "DE": "bis Windows 10", + "EN": "up to Windows 10", + "os": "win", + "max": "10.0.19999" } ], "DE": "Es ist notwendig, die Treiber vom Hersteller zu installieren. Dazu folgen Sie bitte dem jeweiligen Link für Ihr Betriebssystem zur Herstellerseite.", "EN": "It is necessary to install the drivers from the manufacturer. Please follow the relevant link for your operating system." }, + { + "Platforms": [ + { + "DE": "ab Windows 11", + "EN": "from Windows 11", + "os": "win", + "min": "10.0.20000" + } + ], + "DE": "Der Kartenleser funktioniert mit dem systemseitig installierten Treiber. Alternativ können Sie den Treiber von der Webseite des Herstellers verwenden. Bitte beachten Sie nach Anschließen des Kartenlesers die Windows-Informationen zur Einstellung der Gerätesicherheit.", + "EN": "The card reader operates with the driver automatically installed by the system. Alternatively you have the option to install a driver from the manufacturer's website. After connecting the card reader, please observe the Windows information notification regarding your device security settings." + }, { "Platforms": [ { @@ -1557,8 +1672,8 @@ "os": "mac" } ], - "DE": "Es ist kein Treiber vom Hersteller vorhanden.", - "EN": "There is no driver from the manufacturer." + "DE": "Der Kartenleser wird nicht mehr unterstützt, leider bietet der Hersteller keine aktuellen Treiber an.", + "EN": "The card reader is no longer supported, unfortunately the manufacturer does not offer up-to-date drivers." } ], "Internal information": "Unter Windows funktioniert nur NFC A. Reader wird nicht als unterstützt markiert, da er nicht zertifiziert ist." @@ -1660,7 +1775,7 @@ "0x2301" ], "Name": "ACS ACR1581U-C1", - "Pattern": "ACS ACR1581 1S Dual Reader PICC( 0)?", + "Pattern": "ACS ACR1581 1S Dual Reader (PICC|\\(1\\))( 0)?", "Icon": "img_ACS_ACR1581U-C1.png", "IconWithNPA": "img_ACS_ACR1581U-C1_mit_ausweis.png", "Drivers": [ @@ -1676,7 +1791,7 @@ "os": "unknown" } ], - "URL": "https://www.acs.com.hk/en/products/583/acr1581u-dualboost-iii-usb-dual-interface-reader/" + "URL": "https://www.acs.com.hk/en/products/583/acr1581u-dualboost-iii-usb-dual-interface-reader" } ], "Information": [ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a9976b948..14330dd1b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -198,7 +198,7 @@ if(MAC) set_target_properties(AusweisAppBinary PROPERTIES XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "macOS Release (Distribution)") set_target_properties(AusweisAppBinary PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "3rd Party Mac Developer Application: Governikus GmbH & Co. KG (G7EQCJU4BR)") else() - configure_file(${PACKAGING_DIR}/macos/entitlements.development.plist ${CMAKE_BINARY_DIR}/entitlements.plist @COPYONLY) + configure_file(${PACKAGING_DIR}/macos/entitlements.development.plist ${CMAKE_BINARY_DIR}/entitlements.plist COPYONLY) endif() endif() diff --git a/src/card/base/apdu/CommandApdu.cpp b/src/card/base/apdu/CommandApdu.cpp index 0ff5abd98..b2deed692 100644 --- a/src/card/base/apdu/CommandApdu.cpp +++ b/src/card/base/apdu/CommandApdu.cpp @@ -249,6 +249,19 @@ bool CommandApdu::isExtendedLength() const } +QByteArray CommandApdu::generateLengthField(int pLength) const +{ + QByteArray field; + if (isExtendedLength()) + { + field += static_cast(pLength >> 8 & 0xFF); + } + field += static_cast(pLength & 0xFF); + + return field; +} + + CommandApdu::operator QByteArray() const { if (mData.size() > EXTENDED_MAX_LC || mLe > EXTENDED_MAX_LE) @@ -259,33 +272,20 @@ CommandApdu::operator QByteArray() const QByteArray cmd = getHeaderBytes(); // According to ISO-7816-4, 5.2 Syntax - if (mData.size() > 0) + if (isExtendedLength()) { - if (CommandApdu::isExtendedLength(mData, mLe)) - { - cmd += '\0'; - cmd += static_cast(mData.size() >> 8 & 0xFF); - cmd += static_cast(mData.size() & 0xFF); - } - else - { - cmd += static_cast(mData.size() & 0xFF); - } + cmd += '\0'; + } + if (mData.size() > 0) + { + cmd += generateLengthField(static_cast(mData.size())); cmd += mData; } if (mLe > 0) { - if (CommandApdu::isExtendedLength(mData, mLe)) - { - if (mData.isEmpty()) - { - cmd += '\0'; - } - cmd += static_cast(mLe >> 8 & 0xFF); - } - cmd += static_cast(mLe & 0xFF); + cmd += generateLengthField(mLe); } return cmd; diff --git a/src/card/base/apdu/CommandApdu.h b/src/card/base/apdu/CommandApdu.h index 03bf5287b..97989124b 100644 --- a/src/card/base/apdu/CommandApdu.h +++ b/src/card/base/apdu/CommandApdu.h @@ -87,6 +87,7 @@ class CommandApdu [[nodiscard]] int getLe() const; [[nodiscard]] bool isExtendedLength() const; + [[nodiscard]] QByteArray generateLengthField(int pLength) const; operator QByteArray() const; }; diff --git a/src/card/base/apdu/SecureMessagingCommand.h b/src/card/base/apdu/SecureMessagingCommand.h index cd0296061..3152090ee 100644 --- a/src/card/base/apdu/SecureMessagingCommand.h +++ b/src/card/base/apdu/SecureMessagingCommand.h @@ -2,15 +2,16 @@ * Copyright (c) 2021-2024 Governikus GmbH & Co. KG, Germany */ -/*! - * \brief Command APDU for SecureMessaging - */ - #pragma once + #include "CommandApdu.h" #include "SecureMessagingApdu.h" + +class test_SecureMessaging; + + namespace governikus { @@ -22,6 +23,7 @@ class SecureMessagingCommand : public SecureMessagingApdu { Q_DISABLE_COPY(SecureMessagingCommand) + friend class ::test_SecureMessaging; private: QSharedPointer mExpectedLength; diff --git a/src/card/base/asn1/CVCertificate.cpp b/src/card/base/asn1/CVCertificate.cpp index 6a6f01df6..d7fc76271 100644 --- a/src/card/base/asn1/CVCertificate.cpp +++ b/src/card/base/asn1/CVCertificate.cpp @@ -8,6 +8,7 @@ #include "ASN1Util.h" #include +#include Q_DECLARE_LOGGING_CATEGORY(card) diff --git a/src/card/base/pace/SecureMessaging.cpp b/src/card/base/pace/SecureMessaging.cpp index 886dcff2f..5d579ddda 100644 --- a/src/card/base/pace/SecureMessaging.cpp +++ b/src/card/base/pace/SecureMessaging.cpp @@ -109,7 +109,7 @@ CommandApdu SecureMessaging::encrypt(const CommandApdu& pCommandApdu) if (pCommandApdu.getLe() > CommandApdu::NO_LE) { auto protectedLeObject = newObject(); - Asn1OctetStringUtil::setValue(createSecuredLe(pCommandApdu.getLe()), protectedLeObject.data()); + Asn1OctetStringUtil::setValue(pCommandApdu.generateLengthField(pCommandApdu.getLe()), protectedLeObject.data()); securedLe = encodeObject(protectedLeObject.data()); } QByteArray mac = createMac(securedHeader, formattedEncryptedData, securedLe); @@ -170,21 +170,6 @@ QByteArray SecureMessaging::createSecuredHeader(const CommandApdu& pCommandApdu) } -QByteArray SecureMessaging::createSecuredLe(int pLe) const -{ - QByteArray buffer; - if (pLe > CommandApdu::NO_LE) - { - if (pLe > CommandApdu::SHORT_MAX_LE) - { - buffer += static_cast(pLe >> 0x08 & 0xFF); - } - buffer += static_cast(pLe >> 0x00 & 0xFF); - } - return buffer; -} - - QByteArray SecureMessaging::createMac(const QByteArray& pSecuredHeader, const QByteArray& pFormattedEncryptedData, const QByteArray& pSecuredLe) diff --git a/src/card/base/pace/SecureMessaging.h b/src/card/base/pace/SecureMessaging.h index 8b0c927ee..3f0ad3ad4 100644 --- a/src/card/base/pace/SecureMessaging.h +++ b/src/card/base/pace/SecureMessaging.h @@ -35,8 +35,6 @@ class SecureMessaging final [[nodiscard]] QByteArray getSendSequenceCounter() const; QByteArray getEncryptedIv(); - [[nodiscard]] QByteArray createSecuredLe(int pLe) const; - public: SecureMessaging(const SecurityProtocol& pSecurityProtocol, const QByteArray& pEncKey, const QByteArray& pMacKey); ~SecureMessaging() = default; diff --git a/src/card/nfc/NfcReader.cpp b/src/card/nfc/NfcReader.cpp index bc331f433..02e73c336 100644 --- a/src/card/nfc/NfcReader.cpp +++ b/src/card/nfc/NfcReader.cpp @@ -84,8 +84,13 @@ void NfcReader::targetLost(QNearFieldTarget* pTarget) if (pTarget != nullptr && mCard && mCard->invalidateTarget(pTarget)) { mCard.reset(); - removeCardInfo(); - Q_EMIT fireCardRemoved(getReaderInfo()); + + if (getReaderInfo().getCardInfo().getCardType() != CardType::NONE) + { + removeCardInfo(); + + Q_EMIT fireCardRemoved(getReaderInfo()); + } } } diff --git a/src/global/FailureCode.h b/src/global/FailureCode.h index a2226e019..1eb119f04 100644 --- a/src/global/FailureCode.h +++ b/src/global/FailureCode.h @@ -175,7 +175,9 @@ class FailureCode Http_Status_Code, Certificate_Status, Ssl_Errors, - Paos_Type + Paos_Type, + Ephemeral_Server_Key_Algorithm, + Ephemeral_Server_Key_Length }; Q_ENUM(Info) diff --git a/src/network/HttpHandler.cpp b/src/network/HttpHandler.cpp index 6548fd730..997d4ed62 100644 --- a/src/network/HttpHandler.cpp +++ b/src/network/HttpHandler.cpp @@ -26,35 +26,23 @@ void HttpHandler::handle(const QSharedPointer& pRequest) const auto& url = pRequest->getUrl(); if (url.path() == QLatin1String("/eID-Client")) { - const auto queryUrl = QUrlQuery(url); - UrlUtil::setHiddenSettings(queryUrl); - const auto [type, value] = UrlUtil::getRequest(queryUrl); - switch (type) + switch (pRequest->getHttpMethod()) { - case UrlQueryRequest::SHOWUI: - { - qCDebug(network) << "Request type: showui"; - handleShowUiRequest(value, pRequest); + case HTTP_GET: + if (handleGetRequest(pRequest, url)) + { + return; + } + break; + + case HTTP_OPTIONS: + case HTTP_HEAD: + qCDebug(network) << "Request type: Pre-flight CORS"; + handleCorsRequest(pRequest); return; - } - - case UrlQueryRequest::STATUS: - { - qCDebug(network) << "Request type: status"; - const StatusFormat statusFormat = UrlUtil::prepareToEnum(value, StatusFormat::PLAIN); - handleStatusRequest(statusFormat, pRequest); - return; - } - - case UrlQueryRequest::TCTOKENURL: - { - qCDebug(network) << "Request type: authentication"; - handleWorkflowRequest(pRequest); - return; - } default: - qCWarning(network) << "Unknown request type:" << url; + qCDebug(network) << "Unhandled HTTP method:" << pRequest->getMethod(); } } else if (url.path() == QLatin1String("/favicon.ico")) @@ -95,6 +83,50 @@ void HttpHandler::handle(const QSharedPointer& pRequest) } +void HttpHandler::handleCorsRequest(const QSharedPointer& pRequest) const +{ + HttpResponse response(HTTP_STATUS_NO_CONTENT); + setCorsResponseHeaders(response); + pRequest->send(response); +} + + +bool HttpHandler::handleGetRequest(const QSharedPointer& pRequest, const QUrl& pUrl) +{ + const auto queryUrl = QUrlQuery(pUrl); + UrlUtil::setHiddenSettings(queryUrl); + const auto [type, value] = UrlUtil::getRequest(queryUrl); + switch (type) + { + case UrlQueryRequest::SHOWUI: + { + qCDebug(network) << "Request type: showui"; + handleShowUiRequest(value, pRequest); + return true; + } + + case UrlQueryRequest::STATUS: + { + qCDebug(network) << "Request type: status"; + const StatusFormat statusFormat = UrlUtil::prepareToEnum(value, StatusFormat::PLAIN); + handleStatusRequest(statusFormat, pRequest); + return true; + } + + case UrlQueryRequest::TCTOKENURL: + { + qCDebug(network) << "Request type: authentication"; + handleWorkflowRequest(pRequest); + return true; + } + + default: + qCWarning(network) << "Unknown request type:" << pUrl; + return false; + } +} + + void HttpHandler::handleImageRequest(const QSharedPointer& pRequest, const QString& pImagePath) const { HttpResponse response; @@ -139,13 +171,19 @@ QByteArray HttpHandler::guessImageContentType(const QString& pFileName) const } +void HttpHandler::setCorsResponseHeaders(HttpResponse& pResponse) const +{ + pResponse.setHeader(QByteArrayLiteral("Access-Control-Allow-Origin"), QByteArrayLiteral("*")); + pResponse.setHeader(QByteArrayLiteral("Access-Control-Allow-Private-Network"), QByteArrayLiteral("true")); +} + + void HttpHandler::handleStatusRequest(StatusFormat pStatusFormat, const QSharedPointer& pRequest) const { qCDebug(network) << "Create response with status format:" << pStatusFormat; HttpResponse response(HTTP_STATUS_OK); - response.setHeader(QByteArrayLiteral("Access-Control-Allow-Origin"), QByteArrayLiteral("*")); - response.setHeader(QByteArrayLiteral("Access-Control-Allow-Private-Network"), QByteArrayLiteral("true")); + setCorsResponseHeaders(response); switch (pStatusFormat) { case StatusFormat::PLAIN: diff --git a/src/network/HttpHandler.h b/src/network/HttpHandler.h index d0ce7a55a..e9b61d9d9 100644 --- a/src/network/HttpHandler.h +++ b/src/network/HttpHandler.h @@ -24,6 +24,9 @@ class HttpHandler private: [[nodiscard]] QByteArray guessImageContentType(const QString& pFileName) const; + void setCorsResponseHeaders(HttpResponse& pRequest) const; + void handleCorsRequest(const QSharedPointer& pRequest) const; + bool handleGetRequest(const QSharedPointer& pRequest, const QUrl& pUrl); protected: virtual ~HttpHandler() = default; @@ -34,8 +37,6 @@ class HttpHandler virtual void handleStatusRequest(StatusFormat pStatusFormat, const QSharedPointer& pRequest) const; virtual void handleShowUiRequest(const QString& pUiModule, const QSharedPointer& pRequest) = 0; virtual void handleWorkflowRequest(const QSharedPointer& pRequest) = 0; - - }; } // namespace governikus diff --git a/src/network/HttpServerRequestor.cpp b/src/network/HttpServerRequestor.cpp index 4d1c33132..0dacac9aa 100644 --- a/src/network/HttpServerRequestor.cpp +++ b/src/network/HttpServerRequestor.cpp @@ -85,6 +85,24 @@ QSharedPointer HttpServerRequestor::deleteRequest(const QUrl& pUr } +QSharedPointer HttpServerRequestor::headRequest(const QUrl& pUrl, int pTimeOut) +{ + QNetworkRequest request(pUrl); + qCDebug(network) << "Request URL (HEAD):" << pUrl; + auto reply = mNetworkManager ? mNetworkManager->head(request) : nullptr; + return waitForReply(reply, pTimeOut); +} + + +QSharedPointer HttpServerRequestor::optionsRequest(const QUrl& pUrl, int pTimeOut) +{ + QNetworkRequest request(pUrl); + qCDebug(network) << "Request URL (OPTIONS):" << pUrl; + auto reply = mNetworkManager ? mNetworkManager->options(request) : nullptr; + return waitForReply(reply, pTimeOut); +} + + QSharedPointer HttpServerRequestor::waitForReply(QSharedPointer pReply, int pTimeOut) { if (!pReply) diff --git a/src/network/HttpServerRequestor.h b/src/network/HttpServerRequestor.h index 8af475933..5ff7007b1 100644 --- a/src/network/HttpServerRequestor.h +++ b/src/network/HttpServerRequestor.h @@ -51,6 +51,8 @@ class HttpServerRequestor [[nodiscard]] QSharedPointer getRequest(const QUrl& pUrl, int pTimeOut = 2000); [[nodiscard]] QSharedPointer postRequest(const QUrl& pUrl, const QByteArray& pData, const QString& pContentType, int pTimeOut = 2000); [[nodiscard]] QSharedPointer deleteRequest(const QUrl& pUrl, int pTimeOut = 2000); + [[nodiscard]] QSharedPointer headRequest(const QUrl& pUrl, int pTimeOut = 2000); + [[nodiscard]] QSharedPointer optionsRequest(const QUrl& pUrl, int pTimeOut = 2000); static QUrl createUrl(const QString& pQuery, quint16 pPort, const QHostAddress& pHost, const QString& pPath = QStringLiteral("/eID-Client")); diff --git a/src/network/NetworkManager.cpp b/src/network/NetworkManager.cpp index 68529f9d5..bceaf5c21 100644 --- a/src/network/NetworkManager.cpp +++ b/src/network/NetworkManager.cpp @@ -99,6 +99,22 @@ QSharedPointer NetworkManager::deleteResource(QNetworkRequest& pR } +QSharedPointer NetworkManager::head(QNetworkRequest& pRequest) +{ + return processRequest(pRequest, [this] (const QNetworkRequest& request){ + return trackConnection(mNetAccessManager.head(request)); + }); +} + + +QSharedPointer NetworkManager::options(QNetworkRequest& pRequest) +{ + return processRequest(pRequest, [this] (const QNetworkRequest& request){ + return trackConnection(mNetAccessManager.sendCustomRequest(request, "OPTIONS")); + }); +} + + QSharedPointer NetworkManager::getAsUpdater(QNetworkRequest& pRequest) { return processUpdaterRequest(pRequest, [this] (QNetworkRequest& request){ diff --git a/src/network/NetworkManager.h b/src/network/NetworkManager.h index 2fea4956d..9ae24937c 100644 --- a/src/network/NetworkManager.h +++ b/src/network/NetworkManager.h @@ -95,6 +95,8 @@ class NetworkManager [[nodiscard]] virtual QSharedPointer post(QNetworkRequest& pRequest, const QByteArray& pData); [[nodiscard]] virtual QSharedPointer deleteResource(QNetworkRequest& pRequest); + [[nodiscard]] virtual QSharedPointer head(QNetworkRequest& pRequest); + [[nodiscard]] virtual QSharedPointer options(QNetworkRequest& pRequest); [[nodiscard]] QSharedPointer getAsUpdater(QNetworkRequest& pRequest); [[nodiscard]] QSharedPointer postAsUpdater(QNetworkRequest& pRequest, diff --git a/src/network/TlsChecker.cpp b/src/network/TlsChecker.cpp index 70a9fa0f9..b3c93260c 100644 --- a/src/network/TlsChecker.cpp +++ b/src/network/TlsChecker.cpp @@ -67,6 +67,15 @@ bool TlsChecker::hasValidEphemeralKeyLength(const QSslKey& pEphemeralServerKey, } +FailureCode::FailureInfoMap TlsChecker::getEphemeralKeyInfoMap(const QSslKey& pEphemeralServerKey) +{ + FailureCode::FailureInfoMap infoMap; + infoMap.insert(FailureCode::Info::Ephemeral_Server_Key_Algorithm, TlsChecker::toString(pEphemeralServerKey.algorithm())); + infoMap.insert(FailureCode::Info::Ephemeral_Server_Key_Length, QString::number(pEphemeralServerKey.length())); + return infoMap; +} + + QString TlsChecker::getCertificateIssuerName(const QSslCertificate& pCertificate) { const auto& issuerNameList = pCertificate.issuerInfo(QSslCertificate::CommonName); diff --git a/src/network/TlsChecker.h b/src/network/TlsChecker.h index 55ba50614..3ec3df20d 100644 --- a/src/network/TlsChecker.h +++ b/src/network/TlsChecker.h @@ -8,6 +8,7 @@ #pragma once +#include "FailureCode.h" #include "LogHandler.h" #include @@ -58,6 +59,7 @@ class TlsChecker */ [[nodiscard]] static bool hasValidEphemeralKeyLength(const QSslKey& pEphemeralServerKey, const std::function& pFuncMinKeySize = cDefaultFuncMinKeySize); + [[nodiscard]] static FailureCode::FailureInfoMap getEphemeralKeyInfoMap(const QSslKey& pEphemeralServerKey); /*! * This method is only needed until QSslCertificate provides its own method issuerDisplayName in Qt 5.12 diff --git a/src/ui/json/MessageDispatcher.cpp b/src/ui/json/MessageDispatcher.cpp index fbab41719..ea16ac982 100644 --- a/src/ui/json/MessageDispatcher.cpp +++ b/src/ui/json/MessageDispatcher.cpp @@ -216,6 +216,12 @@ Msg MessageDispatcher::createForStateChange(MsgType pStateType) } +MsgLevel MessageDispatcher::getApiLevel() const +{ + return mContext.getApiLevel(); +} + + Msg MessageDispatcher::processCommand(const QByteArray& pMsg) { QJsonParseError jsonError {}; diff --git a/src/ui/json/MessageDispatcher.h b/src/ui/json/MessageDispatcher.h index f644fa7c2..c62badead 100644 --- a/src/ui/json/MessageDispatcher.h +++ b/src/ui/json/MessageDispatcher.h @@ -51,6 +51,7 @@ class MessageDispatcher [[nodiscard]] Msg init(const QSharedPointer& pWorkflowContext); [[nodiscard]] Msg finish(); void reset(); + [[nodiscard]] MsgLevel getApiLevel() const; [[nodiscard]] Msg processCommand(const QByteArray& pMsg); [[nodiscard]] Msg processStateChange(const QString& pState); [[nodiscard]] Msg processProgressChange() const; diff --git a/src/ui/json/UIPlugInJson.cpp b/src/ui/json/UIPlugInJson.cpp index 312e5b3f3..e61db6c6c 100644 --- a/src/ui/json/UIPlugInJson.cpp +++ b/src/ui/json/UIPlugInJson.cpp @@ -35,7 +35,7 @@ void UIPlugInJson::setEnabled(bool pEnable) connect(readerManager, &ReaderManager::fireReaderAdded, this, &UIPlugInJson::onReaderEvent); connect(readerManager, &ReaderManager::fireReaderRemoved, this, &UIPlugInJson::onReaderEvent); connect(readerManager, &ReaderManager::fireReaderPropertiesUpdated, this, &UIPlugInJson::onReaderEvent); - connect(readerManager, &ReaderManager::fireCardInserted, this, &UIPlugInJson::onReaderEvent); + connect(readerManager, &ReaderManager::fireCardInserted, this, &UIPlugInJson::onCardInserted); connect(readerManager, &ReaderManager::fireCardRemoved, this, &UIPlugInJson::onReaderEvent); connect(readerManager, &ReaderManager::fireCardInfoChanged, this, &UIPlugInJson::onCardInfoChanged); } @@ -44,7 +44,7 @@ void UIPlugInJson::setEnabled(bool pEnable) disconnect(readerManager, &ReaderManager::fireReaderAdded, this, &UIPlugInJson::onReaderEvent); disconnect(readerManager, &ReaderManager::fireReaderRemoved, this, &UIPlugInJson::onReaderEvent); disconnect(readerManager, &ReaderManager::fireReaderPropertiesUpdated, this, &UIPlugInJson::onReaderEvent); - disconnect(readerManager, &ReaderManager::fireCardInserted, this, &UIPlugInJson::onReaderEvent); + disconnect(readerManager, &ReaderManager::fireCardInserted, this, &UIPlugInJson::onCardInserted); disconnect(readerManager, &ReaderManager::fireCardRemoved, this, &UIPlugInJson::onReaderEvent); disconnect(readerManager, &ReaderManager::fireCardInfoChanged, this, &UIPlugInJson::onCardInfoChanged); } @@ -121,6 +121,15 @@ void UIPlugInJson::onReaderEvent(const ReaderInfo& pInfo) } +void UIPlugInJson::onCardInserted(const ReaderInfo& pInfo) +{ + if (pInfo.hasEid() || mMessageDispatcher.getApiLevel() > MsgLevel::v2) + { + onReaderEvent(pInfo); + } +} + + void UIPlugInJson::onStateChanged(const QString& pNewState) { callFireMessage(mMessageDispatcher.processStateChange(pNewState)); diff --git a/src/ui/json/UIPlugInJson.h b/src/ui/json/UIPlugInJson.h index 199198a18..d57a88896 100644 --- a/src/ui/json/UIPlugInJson.h +++ b/src/ui/json/UIPlugInJson.h @@ -10,11 +10,13 @@ #include "MessageDispatcher.h" #include "UIPlugIn.h" -#include "context/WorkflowContext.h" + +class test_UIPlugInJson; class test_MsgHandlerAuth; class test_MsgHandlerPersonalization; + namespace governikus { @@ -24,6 +26,7 @@ class UIPlugInJson Q_OBJECT Q_PLUGIN_METADATA(IID "governikus.UIPlugIn" FILE "metadata.json") Q_INTERFACES(governikus::UIPlugIn) + friend class ::test_UIPlugInJson; friend class ::test_MsgHandlerAuth; friend class ::test_MsgHandlerPersonalization; @@ -46,6 +49,7 @@ class UIPlugInJson void onWorkflowFinished(const QSharedPointer& pRequest) override; void onCardInfoChanged(const ReaderInfo& pInfo); void onReaderEvent(const ReaderInfo& pInfo); + void onCardInserted(const ReaderInfo& pInfo); void onStateChanged(const QString& pNewState); void onProgressChanged(); diff --git a/src/ui/qml/CMakeLists.txt b/src/ui/qml/CMakeLists.txt index 405130625..1504a2082 100644 --- a/src/ui/qml/CMakeLists.txt +++ b/src/ui/qml/CMakeLists.txt @@ -1,6 +1,6 @@ -##################################################################### -# The qml plugin implements the ui interface for mobile systems. -##################################################################### +############################################################################ +# The qml plugin implements the ui interface for desktop and mobile systems. +############################################################################ ADD_PLATFORM_LIBRARY(AusweisAppUiQml) diff --git a/src/ui/qml/PinResetInformationModel.cpp b/src/ui/qml/PinResetInformationModel.cpp index 99f065aed..1b7c3a12c 100644 --- a/src/ui/qml/PinResetInformationModel.cpp +++ b/src/ui/qml/PinResetInformationModel.cpp @@ -35,10 +35,14 @@ QUrl PinResetInformationModel::getPinResetUrl() const if (homepage.isEmpty()) { - return QStringLiteral("https://www.behoerdenfinder.de"); + if (LanguageLoader::getLocaleCode() == QLatin1String("de")) + { + return QStringLiteral("https://servicesuche.bund.de"); + } + return QStringLiteral("https://servicesuche.bund.de/#/en"); } - if (LanguageLoader::getLocaleCode() != QStringLiteral("de")) + if (LanguageLoader::getLocaleCode() != QLatin1String("de")) { return homepage + QStringLiteral("/en"); } @@ -135,7 +139,7 @@ QString PinResetInformationModel::getPinResetActionText() const QString PinResetInformationModel::authorityFinderSuffix() const { - return QStringLiteral("

") + tr("To find your competent authority you may visit www.behoerdenfinder.de."); + return QStringLiteral("

") + tr("To find your competent authority you may visit servicesuche.bund.de."); } diff --git a/src/ui/qml/RemoteDeviceModel.cpp b/src/ui/qml/RemoteDeviceModel.cpp index 5d2f4416e..5aa7f884d 100644 --- a/src/ui/qml/RemoteDeviceModel.cpp +++ b/src/ui/qml/RemoteDeviceModel.cpp @@ -114,6 +114,41 @@ QString RemoteDeviceModel::getStatus(const RemoteDeviceModelEntry& pRemoteDevice } +QString RemoteDeviceModel::getCurrentDeviceName(const QModelIndex& pIndex) const +{ + const auto& availableReaders = presentReaders(); + for (const auto& availableReader : availableReaders) + { + if (mAllRemoteReaders.at(pIndex.row()).getId() != availableReader.getId()) + { + continue; + } + + const QSharedPointer deviceListEntry = availableReader.getRemoteDeviceListEntry(); + if (deviceListEntry.isNull() || deviceListEntry->getIfdDescriptor().isNull()) + { + break; + } + + return deviceListEntry->getIfdDescriptor().getIfdName(); + } + return {}; +} + + +QString RemoteDeviceModel::constructDisplayDeviceName(const QModelIndex& pIndex) const +{ + const auto& storedName = mAllRemoteReaders.at(pIndex.row()).getDeviceNameEscaped(); + const auto& newRemoteName = getCurrentDeviceName(pIndex); + if (newRemoteName.isNull() || storedName == newRemoteName) + { + return storedName; + } + //: LABEL ALL_PLATFORMS Describes the former name of the device and is shown as: "New_Name (was Old_Name)" + return newRemoteName + QStringLiteral(" (%1 %2)").arg(tr("was"), storedName); +} + + void RemoteDeviceModel::updatePairedReaders() { const auto& availableReaders = presentReaders(); @@ -249,7 +284,7 @@ QVariant RemoteDeviceModel::data(const QModelIndex& pIndex, int pRole) const { case Qt::DisplayRole: case REMOTE_DEVICE_NAME: - return reader.getDeviceNameEscaped(); + return constructDisplayDeviceName(pIndex); case REMOTE_DEVICE_STATUS: return getStatus(reader); diff --git a/src/ui/qml/RemoteDeviceModel.h b/src/ui/qml/RemoteDeviceModel.h index df5057d92..c754c89db 100644 --- a/src/ui/qml/RemoteDeviceModel.h +++ b/src/ui/qml/RemoteDeviceModel.h @@ -47,10 +47,12 @@ class RemoteDeviceModel [[nodiscard]] bool indexIsValid(const QModelIndex& pIndex) const; [[nodiscard]] QString getStatus(const RemoteDeviceModelEntry& pRemoteDeviceModelEntry) const; + [[nodiscard]] QString getCurrentDeviceName(const QModelIndex& pIndex) const; + [[nodiscard]] QString constructDisplayDeviceName(const QModelIndex& pIndex) const; void updatePairedReaders(); void updateUnpairedReaders(); void removeVanishedReaders(); - [[nodiscard]] QList presentReaders() const; + [[nodiscard]] virtual QList presentReaders() const; bool addOrUpdateReader(const RemoteDeviceModelEntry& pModelEntry); private Q_SLOTS: diff --git a/src/ui/qml/UIPlugInQml.cpp b/src/ui/qml/UIPlugInQml.cpp index caaf3465b..fab49bff6 100644 --- a/src/ui/qml/UIPlugInQml.cpp +++ b/src/ui/qml/UIPlugInQml.cpp @@ -88,6 +88,9 @@ #include #include +#ifdef Q_OS_WIN + #include +#endif Q_DECLARE_LOGGING_CATEGORY(qml) @@ -192,6 +195,7 @@ UIPlugInQml::UIPlugInQml() #ifndef Q_OS_ANDROID QGuiApplication::setWindowIcon(mTrayIcon.getIcon()); #endif + QGuiApplication::setDesktopFileName(QStringLiteral("com.governikus.ausweisapp2")); connect(&mTrayIcon, &TrayIcon::fireShow, this, &UIPlugInQml::show); connect(&mTrayIcon, &TrayIcon::fireQuit, this, [this] { @@ -790,6 +794,11 @@ void UIPlugInQml::doRefresh() { qCDebug(qml) << "Reload qml files"; QMetaObject::invokeMethod(this, &UIPlugInQml::init, Qt::QueuedConnection); +#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS) && !defined(Q_OS_WINRT) + QMetaObject::invokeMethod(this, [this]{ + Q_EMIT fireShowUiRequested(UiModule::CURRENT); + }, Qt::QueuedConnection); +#endif } diff --git a/src/workflows/base/states/StateCheckRefreshAddress.cpp b/src/workflows/base/states/StateCheckRefreshAddress.cpp index 48b1cd19a..121e3e991 100644 --- a/src/workflows/base/states/StateCheckRefreshAddress.cpp +++ b/src/workflows/base/states/StateCheckRefreshAddress.cpp @@ -179,7 +179,7 @@ void StateCheckRefreshAddress::onSslErrors(const QList& pErrors) } -void StateCheckRefreshAddress::reportCommunicationError(const GlobalStatus& pStatus, FailureCode::Reason pFailure, const QString& pErrorString) +void StateCheckRefreshAddress::reportCommunicationError(const GlobalStatus& pStatus, const FailureCode& pFailure) { qCritical() << pStatus; updateStatus(pStatus); @@ -187,14 +187,7 @@ void StateCheckRefreshAddress::reportCommunicationError(const GlobalStatus& pSta clearConnections(); mReply->abort(); - if (pErrorString.isEmpty()) - { - Q_EMIT fireAbort(pFailure); - return; - } - - Q_EMIT fireAbort({pFailure, {FailureCode::Info::Network_Error, mReply->errorString()} - }); + Q_EMIT fireAbort(pFailure); } @@ -217,8 +210,9 @@ bool StateCheckRefreshAddress::checkSslConnectionAndSaveCertificate(const QSslCo if (!TlsChecker::hasValidEphemeralKeyLength(pSslConfiguration.ephemeralServerKey())) { + const auto& map = TlsChecker::getEphemeralKeyInfoMap(pSslConfiguration.ephemeralServerKey()); reportCommunicationError({GlobalStatus::Code::Workflow_Network_Ssl_Connection_Unsupported_Algorithm_Or_Length, infoMap}, - FailureCode::Reason::Check_Refresh_Address_Invalid_Ephemeral_Key_Length); + {FailureCode::Reason::Check_Refresh_Address_Invalid_Ephemeral_Key_Length, map}); return false; } @@ -255,41 +249,45 @@ void StateCheckRefreshAddress::onNetworkReply() const auto statusCode = NetworkManager::getLoggedStatusCode(mReply, spawnMessageLogger(network)); if (mReply->error() != QNetworkReply::NoError) { + const FailureCode::FailureInfoMap infoMap { + {FailureCode::Info::Network_Error, mReply->errorString()} + }; + switch (NetworkManager::toNetworkError(mReply)) { case NetworkManager::NetworkError::ServiceUnavailable: reportCommunicationError({GlobalStatus::Code::Network_ServiceUnavailable, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()} - }, FailureCode::Reason::Check_Refresh_Address_Service_Unavailable, mReply->errorString()); + }, {FailureCode::Reason::Check_Refresh_Address_Service_Unavailable, infoMap}); break; case NetworkManager::NetworkError::ServerError: reportCommunicationError({GlobalStatus::Code::Network_ServerError, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()} - }, FailureCode::Reason::Check_Refresh_Address_Server_Error, mReply->errorString()); + }, {FailureCode::Reason::Check_Refresh_Address_Server_Error, infoMap}); break; case NetworkManager::NetworkError::ClientError: reportCommunicationError({GlobalStatus::Code::Network_ClientError, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()} - }, FailureCode::Reason::Check_Refresh_Address_Client_Error, mReply->errorString()); + }, {FailureCode::Reason::Check_Refresh_Address_Client_Error, infoMap}); break; case NetworkManager::NetworkError::TimeOut: reportCommunicationError({GlobalStatus::Code::Network_TimeOut, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()} - }, FailureCode::Reason::Check_Refresh_Address_Service_Timeout, mReply->errorString()); + }, {FailureCode::Reason::Check_Refresh_Address_Service_Timeout, infoMap}); break; case NetworkManager::NetworkError::ProxyError: reportCommunicationError({GlobalStatus::Code::Network_Proxy_Error, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()} - }, FailureCode::Reason::Check_Refresh_Address_Proxy_Error, mReply->errorString()); + }, {FailureCode::Reason::Check_Refresh_Address_Proxy_Error, infoMap}); break; case NetworkManager::NetworkError::SecurityError: reportCommunicationError({GlobalStatus::Code::Network_Ssl_Establishment_Error, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()} - }, FailureCode::Reason::Check_Refresh_Address_Fatal_Tls_Error_After_Reply, mReply->errorString()); + }, {FailureCode::Reason::Check_Refresh_Address_Fatal_Tls_Error_After_Reply, infoMap}); break; case NetworkManager::NetworkError::OtherError: reportCommunicationError({GlobalStatus::Code::Network_Other_Error, {GlobalStatus::ExternalInformation::LAST_URL, mUrl.toString()} - }, FailureCode::Reason::Check_Refresh_Address_Unknown_Network_Error, mReply->errorString()); + }, {FailureCode::Reason::Check_Refresh_Address_Unknown_Network_Error, infoMap}); break; } return; diff --git a/src/workflows/base/states/StateCheckRefreshAddress.h b/src/workflows/base/states/StateCheckRefreshAddress.h index 921d215a6..7aba98b8c 100644 --- a/src/workflows/base/states/StateCheckRefreshAddress.h +++ b/src/workflows/base/states/StateCheckRefreshAddress.h @@ -50,7 +50,7 @@ class StateCheckRefreshAddress void fetchServerCertificate(); bool checkSslConnectionAndSaveCertificate(const QSslConfiguration& pSslConfiguration); void doneSuccess(); - void reportCommunicationError(const GlobalStatus& pStatus, FailureCode::Reason pFailure, const QString& pErrorString = QString()); + void reportCommunicationError(const GlobalStatus& pStatus, const FailureCode& pFailure); private Q_SLOTS: void onSslHandshakeDone(); diff --git a/src/workflows/base/states/StateGenericProviderCommunication.cpp b/src/workflows/base/states/StateGenericProviderCommunication.cpp index 940214c19..803b7f1ae 100644 --- a/src/workflows/base/states/StateGenericProviderCommunication.cpp +++ b/src/workflows/base/states/StateGenericProviderCommunication.cpp @@ -82,9 +82,11 @@ void StateGenericProviderCommunication::checkSslConnectionAndSaveCertificate(con if (!TlsChecker::hasValidEphemeralKeyLength(pSslConfiguration.ephemeralServerKey())) { const GlobalStatus& status {GlobalStatus::Code::Workflow_Network_Ssl_Connection_Unsupported_Algorithm_Or_Length, infoMap}; - const FailureCode& failure {FailureCode::Reason::Generic_Provider_Communication_Invalid_Ephemeral_Key_Length, - {FailureCode::Info::State_Name, getStateName()} - }; + + auto map = TlsChecker::getEphemeralKeyInfoMap(pSslConfiguration.ephemeralServerKey()); + map.insert(FailureCode::Info::State_Name, getStateName()); + const FailureCode& failure {FailureCode::Reason::Generic_Provider_Communication_Invalid_Ephemeral_Key_Length, map}; + reportCommunicationError(status, failure); return; } diff --git a/src/workflows/base/states/StateGenericSendReceive.cpp b/src/workflows/base/states/StateGenericSendReceive.cpp index 72faf0760..fe23c3eb9 100644 --- a/src/workflows/base/states/StateGenericSendReceive.cpp +++ b/src/workflows/base/states/StateGenericSendReceive.cpp @@ -207,8 +207,10 @@ std::optional StateGenericSendReceive::checkSslConnectionAndSaveCer !TlsChecker::hasValidEphemeralKeyLength(pSslConfiguration.ephemeralServerKey())) { updateStatus({GlobalStatus::Code::Workflow_TrustedChannel_Ssl_Connection_Unsupported_Algorithm_Or_Length, infoMap}); - return FailureCode(FailureCode::Reason::Generic_Send_Receive_Invalid_Ephemeral_Key_Length, - {FailureCode::Info::State_Name, getStateName()}); + + auto map = TlsChecker::getEphemeralKeyInfoMap(pSslConfiguration.ephemeralServerKey()); + map.insert(FailureCode::Info::State_Name, getStateName()); + return FailureCode(FailureCode::Reason::Generic_Send_Receive_Invalid_Ephemeral_Key_Length, map); } const auto statusCode = CertificateChecker::checkAndSaveCertificate(pSslConfiguration.peerCertificate(), context->getTcToken()->getServerAddress(), context); diff --git a/src/workflows/base/states/StateGetTcToken.cpp b/src/workflows/base/states/StateGetTcToken.cpp index 126ff7e31..27b8a6c7c 100644 --- a/src/workflows/base/states/StateGetTcToken.cpp +++ b/src/workflows/base/states/StateGetTcToken.cpp @@ -140,7 +140,9 @@ void StateGetTcToken::onSslHandshakeDone() mReply->abort(); qCCritical(network) << "Error while connecting to the provider. The SSL connection uses an unsupported key algorithm or length."; updateStatus(status); - Q_EMIT fireAbort(FailureCode::Reason::Get_TcToken_Invalid_Ephemeral_Key_Length); + + const auto& map = TlsChecker::getEphemeralKeyInfoMap(cfg.ephemeralServerKey()); + Q_EMIT fireAbort({FailureCode::Reason::Get_TcToken_Invalid_Ephemeral_Key_Length, map}); return; } diff --git a/test/qt/card/base/apdu/test_CommandApdu.cpp b/test/qt/card/base/apdu/test_CommandApdu.cpp index 19beec2cc..99d4f0d56 100644 --- a/test/qt/card/base/apdu/test_CommandApdu.cpp +++ b/test/qt/card/base/apdu/test_CommandApdu.cpp @@ -290,6 +290,12 @@ class test_CommandApdu QTest::newRow("3E 256 0") << 256 << 0 << true << QByteArray::fromHex("01020304000100") + QByteArray(256, 0x42); QTest::newRow("3E 65535 0") << 65535 << 0 << true << QByteArray::fromHex("0102030400FFFF") + QByteArray(65535, 0x42); + QTest::newRow("4E 255 257") << 255 << 257 << true << QByteArray::fromHex("010203040000FF") + QByteArray(255, 0x42) + QByteArray::fromHex("0101"); + QTest::newRow("4E 255 65535") << 255 << 65535 << true << QByteArray::fromHex("010203040000FF") + QByteArray(255, 0x42) + QByteArray::fromHex("FFFF"); + QTest::newRow("4E 255 65536") << 255 << 65536 << true << QByteArray::fromHex("010203040000FF") + QByteArray(255, 0x42) + QByteArray::fromHex("0000"); + QTest::newRow("4E 256 1") << 256 << 1 << true << QByteArray::fromHex("01020304000100") + QByteArray(256, 0x42) + QByteArray::fromHex("0001"); + QTest::newRow("4E 256 255") << 256 << 255 << true << QByteArray::fromHex("01020304000100") + QByteArray(256, 0x42) + QByteArray::fromHex("00FF"); + QTest::newRow("4E 256 256") << 256 << 256 << true << QByteArray::fromHex("01020304000100") + QByteArray(256, 0x42) + QByteArray::fromHex("0100"); QTest::newRow("4E 256 257") << 256 << 257 << true << QByteArray::fromHex("01020304000100") + QByteArray(256, 0x42) + QByteArray::fromHex("0101"); QTest::newRow("4E 256 65535") << 256 << 65535 << true << QByteArray::fromHex("01020304000100") + QByteArray(256, 0x42) + QByteArray::fromHex("FFFF"); QTest::newRow("4E 256 65536") << 256 << 65536 << true << QByteArray::fromHex("01020304000100") + QByteArray(256, 0x42) + QByteArray::fromHex("0000"); diff --git a/test/qt/card/base/apdu/test_SecureMessaging.cpp b/test/qt/card/base/apdu/test_SecureMessaging.cpp index a72540fe2..644d5a3da 100644 --- a/test/qt/card/base/apdu/test_SecureMessaging.cpp +++ b/test/qt/card/base/apdu/test_SecureMessaging.cpp @@ -6,6 +6,8 @@ #include "LogHandler.h" #include "SecurityProtocol.h" +#include "apdu/SecureMessagingCommand.h" +#include "asn1/ASN1Util.h" #include #include @@ -170,6 +172,31 @@ class test_SecureMessaging } + void testExtendedLengthAfterEcryption() + { + const QByteArray data(250, 0x42); + const CommandApdu command(Ins::MSE_SET, 0x20, 0x30, data, 24); + QCOMPARE(command, QByteArray::fromHex("00222030 fa") + data + QByteArray::fromHex("18")); + + const auto& encryptedCommand = mSecureMessagingTerminal->encrypt(command); + QCOMPARE(encryptedCommand, + QByteArray::fromHex("0c222030 000112" + "87820101 01" + "257c4674cfae012dd0da1d7ae3901cb0acd1789c30d31d6934092bc9db9f01dd7b7d17215a69f02fe4c24e7ad4019113" + "05984da2c4ceca18f41e0e1f55b4bc5d69fa55d73e9eb5c018b6f9edcb07cf171973d5d8612ffc20326e997083592d31" + "c0934f2c28d466535d6f4a024cf7068aa44daad8501a228b5dcba0766c6771b5761085d3f19801f92875b10cf17175f7" + "ec1714e7a9a99714386e518059360910e6d3a6f54111e5aa983f5cdf2d5f5597fc0f1387ab70a06b922fa45cc1d42bbe" + "9f831235d88edd78a14ca9d9abcd02d799161ddc8c231078303d1062b875eaa899a44824ed25e4673706f9d0063872fd" + "6dabca6f1fb03e4d4c1a68dd4c6d7488" + "970118" + "8e08543fdc3e1ff32dfb" + "0000")); + + const auto& decryptedcommand = mSecureMessagingCard->decrypt(encryptedCommand); + QCOMPARE(decryptedcommand, command); + } + + void testSendSequenceCounter() { QByteArray data = QByteArray::fromHex("D0D1D2D3"); @@ -327,6 +354,12 @@ class test_SecureMessaging QTest::newRow("3E 256 0") << 256 << 0; QTest::newRow("3E 65519 0") << 65519 << 0; + QTest::newRow("4E 255 257") << 255 << 257; + QTest::newRow("4E 255 65535") << 255 << 65535; + QTest::newRow("4E 255 65536") << 255 << 65536; + QTest::newRow("4E 256 1") << 256 << 1; + QTest::newRow("4E 256 255") << 256 << 255; + QTest::newRow("4E 256 256") << 256 << 256; QTest::newRow("4E 256 257") << 256 << 257; QTest::newRow("4E 256 65535") << 256 << 65535; QTest::newRow("4E 256 65536") << 256 << 65536; @@ -345,8 +378,13 @@ class test_SecureMessaging QSignalSpy logSpy(Env::getSingleton()->getEventHandler(), &LogEventHandler::fireLog); const QByteArray data(lc, 0x42); - CommandApdu apdu(QByteArray::fromHex("00010203"), data, le); - QCOMPARE(mSecureMessagingCard->decrypt(mSecureMessagingTerminal->encrypt(apdu)), apdu); + const CommandApdu apdu(QByteArray::fromHex("00010203"), data, le); + const CommandApdu encryptedApdu = mSecureMessagingTerminal->encrypt(apdu); + + SecureMessagingCommand smCmd(encryptedApdu); + QCOMPARE(Asn1OctetStringUtil::getValue(smCmd.mExpectedLength.data()).size(), le > 0 ? CommandApdu::isExtendedLength(data, le) ? 2 : 1 : 0); + + QCOMPARE(mSecureMessagingCard->decrypt(encryptedApdu), apdu); QCOMPARE(logSpy.count(), 0); Env::getSingleton()->reset(); diff --git a/test/qt/configuration/test_ProviderConfiguration.cpp b/test/qt/configuration/test_ProviderConfiguration.cpp index 9d7249f06..02869be16 100644 --- a/test/qt/configuration/test_ProviderConfiguration.cpp +++ b/test/qt/configuration/test_ProviderConfiguration.cpp @@ -303,7 +303,7 @@ class test_ProviderConfiguration } } - QCOMPARE(attachedEidCounter, 19); + QCOMPARE(attachedEidCounter, 20); } diff --git a/test/qt/configuration/test_ProviderConfigurationParser.cpp b/test/qt/configuration/test_ProviderConfigurationParser.cpp index 68185b1fb..9671b463e 100644 --- a/test/qt/configuration/test_ProviderConfigurationParser.cpp +++ b/test/qt/configuration/test_ProviderConfigurationParser.cpp @@ -225,8 +225,8 @@ class test_ProviderConfigurationParser QTest::addColumn("majorVersion"); QTest::addColumn("count"); - const int all = 126; - const int withEidSupport = 104; + const int all = 127; + const int withEidSupport = 105; QTest::newRow("win") << QOperatingSystemVersion::Windows << -1 << all; QTest::newRow("mac") << QOperatingSystemVersion::MacOS << -1 << all; QTest::newRow("linux") << QOperatingSystemVersion::Unknown << -1 << all; diff --git a/test/qt/configuration/test_ReaderConfiguration.cpp b/test/qt/configuration/test_ReaderConfiguration.cpp index 4acdb96e4..c541a317d 100644 --- a/test/qt/configuration/test_ReaderConfiguration.cpp +++ b/test/qt/configuration/test_ReaderConfiguration.cpp @@ -120,8 +120,8 @@ class test_ReaderConfiguration QTest::newRow("Identiv SDI011C") << UsbId(0x04E6, 0x512C) << "SCM Microsystems Inc. SDI011 Contactless Reader" << "Identiv SDI011 Dual Interface Smart Card Reader" << "img_Identive_SDI011" << "^(SCM Microsystems Inc. )?SDI011G? ((Contactless Reader( 0)?)|((USB Smart Card|Contactless) Reader\\([12]\\)))$"; QTest::newRow("Identiv SCL011") << UsbId(0x04E6, 0x5292) << "SCM Microsystems Inc. SCL011 Contactless Reader" << "Identiv SCL01x Contactless Smart Card Reader" << "img_Identive_SCL011" << "^(SCM Microsystems Inc. )?SCL011G? Contactless Reader( 0)?$"; - QTest::newRow("ACS-ACR1281U") << UsbId(0x072F, 0x0901) << "ACS ACR1281 PICC Reader" << "ACS ACR1281U" << "img_ACS_ACR1281U" << "ACS ACR1281 PICC Reader( 0)?"; - QTest::newRow("ACS-ACR1581U-C1") << UsbId(0x072F, 0x2301) << "ACS ACR1581 1S Dual Reader PICC" << "ACS ACR1581U-C1" << "img_ACS_ACR1581U-C1" << "ACS ACR1581 1S Dual Reader PICC( 0)?"; + QTest::newRow("ACS ACR1281U") << UsbId(0x072F, 0x0901) << "ACS ACR1281 PICC Reader" << "ACS ACR1281U" << "img_ACS_ACR1281U" << "ACS ACR1281 PICC Reader( 0)?"; + QTest::newRow("ACS-ACR1581U-C1") << UsbId(0x072F, 0x2301) << "ACS ACR1581 1S Dual Reader PICC" << "ACS ACR1581U-C1" << "img_ACS_ACR1581U-C1" << "ACS ACR1581 1S Dual Reader (PICC|\\(1\\))( 0)?"; QTest::newRow("HID OMNIKEY 5021") << UsbId(0x076B, 0x5340) << "OMNIKEY CardMan 5x21-CL 0" << "HID OMNIKEY 5021-CL" << "img_HID_Omnikey_Mobile_Reader_502X_CL" << "OMNIKEY CardMan 5x21-CL 0|OMNIKEY CardMan \\(076B:5340\\) 5021 CL"; QTest::newRow("HID OMNIKEY 5022") << UsbId(0x076B, 0x5022) << "HID Global OMNIKEY 5022 Smart Card Reader 0" << "HID OMNIKEY 5022-CL" << "img_HID_Omnikey_Mobile_Reader_502X_CL" << "HID Global OMNIKEY 5022 Smart Card Reader( 0)?$"; @@ -142,7 +142,7 @@ class test_ReaderConfiguration QTest::newRow("Identiv 4701 F") << UsbId(0x04E6, 0x5724) << "Identiv CLOUD 4701 F Contactless Reader 0" << "Identiv 4701 F" << "img_Identive_4701_F" << "^Identiv (uTrust|cloud|CLOUD) 4701 F (Contactless|CL|Dual Interface) Reader( 0| 1|\\(1\\)|\\(2\\))?$"; QTest::newRow("Cherry-TC-1200-data") << UsbId(0x046A, 0x0091) << "Cherry TC 1200" << "Cherry TC-1200" << "img_Cherry_TC_1200" << "(Cherry TC 1200($|[^-])|TC 12xx-CL 0|Cherry SC Reader \\(046A:0091\\))"; - QTest::newRow("Cherry-TC-1300-data") << UsbId(0x046A, 0x0092) << "Cherry TC 1300" << "Cherry TC-1300" << "img_Cherry_TC_1300" << "(Cherry TC 1300|Cherry Smartcard Terminal TC 13xx-CL 0|Cherry SC Reader \\(046A:0092\\))"; + QTest::newRow("Cherry-TC-1300-data") << UsbId(0x046A, 0x0092) << "Cherry SC Reader (046A:0092)(1)" << "Cherry TC-1300" << "img_Cherry_TC_1300" << "(Cherry Smartcard Terminal TC 13xx-CL 0|Cherry SC Reader \\(046A:0092\\))"; QTest::newRow("Cherry-ST-1275-data") << UsbId(0x046A, 0x0072) << "Cherry SmartTerminal XX7X-RF 0" << "Cherry ST-1275" << "img_Cherry_ST_1275" << "(Cherry ST-1275|Cherry SmartTerminal XX7X-RF 0)"; QTest::newRow("Cherry-sercure Board") << UsbId(0x046A, 0x01A2) << "Cherry GmbH CHERRY SECURE BOARD 1.0" << "Cherry Secure Board 1.0" << "img_Cherry_secure_board" << "Cherry GmbH CHERRY SECURE BOARD 1.0( 0)?$"; @@ -175,8 +175,6 @@ class test_ReaderConfiguration QTest::addColumn("usbId"); QTest::addColumn("readerName"); QTest::addColumn("readerViewName"); - QTest::addColumn("readerIcon"); - QTest::addColumn("readerPattern"); QTest::newRow("UU") << UsbId(0xFFFF, 0xFFFF) << "crap" << "crap"; @@ -202,15 +200,15 @@ class test_ReaderConfiguration QTest::newRow("REINER SCT cyberJack wave-windows-10-11-1") << UsbId(0x0C4B, 0x0505) << "REINER SCT cyberJack wave 0" << "REINER SCT cyberJack wave"; QTest::newRow("REINER SCT cyberJack wave-windows-10-11-1") << UsbId(0x0C4B, 0x0505) << "REINER SCT cyberJack wave 1" << "REINER SCT cyberJack wave"; QTest::newRow("REINER SCT cyberJack wave-windows-10-11-2") << UsbId(0x0C4B, 0x0505) << "REINER SCT cyberJack wave USB 1" << "REINER SCT cyberJack wave"; - QTest::newRow("REINER SCT cyberJack wave-macosx-11-13") << UsbId(0x0C4B, 0x0505) << "REINER SCT cyberJack wave" << "REINER SCT cyberJack wave"; - - QTest::newRow("KOBIL IDToken-windows-7-10-1") << UsbId(0x0D46, 0x301D) << "KOBIL IDToken 0" << "KOBIL IDToken"; - QTest::newRow("KOBIL IDToken-windows-7-10-2") << UsbId(0x0D46, 0x301D) << "KOBIL IDToken 1" << "KOBIL IDToken"; - QTest::newRow("KOBIL IDToken-windows-7-10-3") << UsbId(0x0D46, 0x301D) << "KOBIL IDToken 2" << "KOBIL IDToken"; - QTest::newRow("KOBIL IDToken-windows-7-10-4") << UsbId(0x0D46, 0x301D) << "KOBIL IDToken" << "KOBIL IDToken"; - QTest::newRow("KOBIL IDToken-macosx-10.13-11.0-1") << UsbId(0x0D46, 0x301D) << "KOBIL Systems IDToken" << "KOBIL IDToken"; - QTest::newRow("KOBIL IDToken-macosx-10.13-11.0-2") << UsbId(0x0D46, 0x301D) << "KOBIL Systems IDToken 0" << "KOBIL IDToken"; - QTest::newRow("KOBIL IDToken-macosx-10.13-11.0-3") << UsbId(0x0D46, 0x301D) << "KOBIL Systems IDToken 1" << "KOBIL IDToken"; + QTest::newRow("REINER SCT cyberJack wave-macosx-12-14") << UsbId(0x0C4B, 0x0505) << "REINER SCT cyberJack wave" << "REINER SCT cyberJack wave"; + + QTest::newRow("KOBIL IDToken-windows-10-11-1") << UsbId(0x0D46, 0x301D) << "KOBIL IDToken 0" << "KOBIL IDToken"; + QTest::newRow("KOBIL IDToken-windows-10-11-2") << UsbId(0x0D46, 0x301D) << "KOBIL IDToken 1" << "KOBIL IDToken"; + QTest::newRow("KOBIL IDToken-windows-10-11-3") << UsbId(0x0D46, 0x301D) << "KOBIL IDToken 2" << "KOBIL IDToken"; + QTest::newRow("KOBIL IDToken-windows-10-11-4") << UsbId(0x0D46, 0x301D) << "KOBIL IDToken" << "KOBIL IDToken"; + QTest::newRow("KOBIL IDToken-macosx-12-14-1") << UsbId(0x0D46, 0x301D) << "KOBIL Systems IDToken" << "KOBIL IDToken"; + QTest::newRow("KOBIL IDToken-macosx-12-14-2") << UsbId(0x0D46, 0x301D) << "KOBIL Systems IDToken 0" << "KOBIL IDToken"; + QTest::newRow("KOBIL IDToken-macosx-12-14-3") << UsbId(0x0D46, 0x301D) << "KOBIL Systems IDToken 1" << "KOBIL IDToken"; QTest::newRow("KOBIL IDToken-unknown-1") << UsbId(0x0D46, 0x301D) << "KOBIL Systems IDToken (NS1252PT18716) 01 00" << "KOBIL IDToken"; QTest::newRow("KOBIL IDToken-unknown-2") << UsbId(0x0D46, 0x301D) << "KOBIL Systems IDToken (NS1228PT186BD) 01 00" << "KOBIL IDToken"; QTest::newRow("KOBIL IDToken-unknown-3") << UsbId(0x0D46, 0x301D) << "KOBIL Systems IDToken (0123456789ABCD) 02 01" << "KOBIL IDToken"; @@ -220,79 +218,83 @@ class test_ReaderConfiguration QTest::newRow("Identiv SDI011B-windows-10-11-3") << UsbId(0x04E6, 0x512B) << "SDI011 Contactless Reader" << "Identiv SDI011 Dual Interface Smart Card Reader"; QTest::newRow("Identiv SDI011B-windows-10-11-4") << UsbId(0x04E6, 0x512B) << "SCM Microsystems Inc. SDI011G Contactless Reader 0" << "Identiv SDI011 Dual Interface Smart Card Reader"; QTest::newRow("Identiv SDI011B-windows-10-11-5") << UsbId(0x04E6, 0x512B) << "SCM Microsystems Inc. SDI011G Smart Card Reader 0" << "SCM Microsystems Inc. SDI011G Smart Card Reader 0"; - QTest::newRow("Identiv SDI011B-macosx-11-13") << UsbId(0x04E6, 0x512B) << "SDI011 USB Smart Card Reader(1)" << "Identiv SDI011 Dual Interface Smart Card Reader"; - QTest::newRow("Identiv SDI011B-macosx-11-13") << UsbId(0x04E6, 0x512B) << "SDI011 USB Smart Card Reader(2)" << "Identiv SDI011 Dual Interface Smart Card Reader"; - QTest::newRow("Identiv SDI011B-macosx-11-13-1") << UsbId(0x04E6, 0x512B) << "SCM Microsystems Inc. SDI011 Contactless Reader(1)" << "Identiv SDI011 Dual Interface Smart Card Reader"; - QTest::newRow("Identiv SDI011B-macosx-11-13-2") << UsbId(0x04E6, 0x512B) << "SCM Microsystems Inc. SDI011 Contactless Reader(2)" << "Identiv SDI011 Dual Interface Smart Card Reader"; + QTest::newRow("Identiv SDI011B-macosx-12-14") << UsbId(0x04E6, 0x512B) << "SDI011 USB Smart Card Reader(1)" << "Identiv SDI011 Dual Interface Smart Card Reader"; + QTest::newRow("Identiv SDI011B-macosx-12-14") << UsbId(0x04E6, 0x512B) << "SDI011 USB Smart Card Reader(2)" << "Identiv SDI011 Dual Interface Smart Card Reader"; + QTest::newRow("Identiv SDI011B-macosx-12-14-1") << UsbId(0x04E6, 0x512B) << "SCM Microsystems Inc. SDI011 Contactless Reader(1)" << "Identiv SDI011 Dual Interface Smart Card Reader"; + QTest::newRow("Identiv SDI011B-macosx-12-14-2") << UsbId(0x04E6, 0x512B) << "SCM Microsystems Inc. SDI011 Contactless Reader(2)" << "Identiv SDI011 Dual Interface Smart Card Reader"; QTest::newRow("Identiv SDI011C-windows-10-11-1") << UsbId(0x04E6, 0x512C) << "SCM Microsystems Inc. SDI011 Contactless Reader 0" << "Identiv SDI011 Dual Interface Smart Card Reader"; QTest::newRow("Identiv SDI011C-windows-10-11-2") << UsbId(0x04E6, 0x512C) << "SCM Microsystems Inc. SDI011 Smart Card Reader 0" << "SCM Microsystems Inc. SDI011 Smart Card Reader 0"; QTest::newRow("Identiv SDI011C-windows-10-11-3") << UsbId(0x04E6, 0x512C) << "SDI011 Contactless Reader" << "Identiv SDI011 Dual Interface Smart Card Reader"; QTest::newRow("Identiv SDI011C-windows-10-11-4") << UsbId(0x04E6, 0x512C) << "SCM Microsystems Inc. SDI011G Contactless Reader 0" << "Identiv SDI011 Dual Interface Smart Card Reader"; QTest::newRow("Identiv SDI011C-windows-10-11-5") << UsbId(0x04E6, 0x512C) << "SCM Microsystems Inc. SDI011G Smart Card Reader 0" << "SCM Microsystems Inc. SDI011G Smart Card Reader 0"; - QTest::newRow("Identiv SDI011C-macosx-11-13") << UsbId(0x04E6, 0x512C) << "SDI011 USB Smart Card Reader(1)" << "Identiv SDI011 Dual Interface Smart Card Reader"; - QTest::newRow("Identiv SDI011C-macosx-11-13") << UsbId(0x04E6, 0x512C) << "SDI011 USB Smart Card Reader(2)" << "Identiv SDI011 Dual Interface Smart Card Reader"; - QTest::newRow("Identiv SDI011C-macosx-11-13-1") << UsbId(0x04E6, 0x512C) << "SCM Microsystems Inc. SDI011 Contactless Reader(1)" << "Identiv SDI011 Dual Interface Smart Card Reader"; - QTest::newRow("Identiv SDI011C-macosx-11-13-2") << UsbId(0x04E6, 0x512C) << "SCM Microsystems Inc. SDI011 Contactless Reader(2)" << "Identiv SDI011 Dual Interface Smart Card Reader"; + QTest::newRow("Identiv SDI011C-macosx-12-14") << UsbId(0x04E6, 0x512C) << "SDI011 USB Smart Card Reader(1)" << "Identiv SDI011 Dual Interface Smart Card Reader"; + QTest::newRow("Identiv SDI011C-macosx-12-14") << UsbId(0x04E6, 0x512C) << "SDI011 USB Smart Card Reader(2)" << "Identiv SDI011 Dual Interface Smart Card Reader"; + QTest::newRow("Identiv SDI011C-macosx-12-14-1") << UsbId(0x04E6, 0x512C) << "SCM Microsystems Inc. SDI011 Contactless Reader(1)" << "Identiv SDI011 Dual Interface Smart Card Reader"; + QTest::newRow("Identiv SDI011C-macosx-12-14-2") << UsbId(0x04E6, 0x512C) << "SCM Microsystems Inc. SDI011 Contactless Reader(2)" << "Identiv SDI011 Dual Interface Smart Card Reader"; QTest::newRow("Identiv SCL011-windows-10-11-1") << UsbId(0x04E6, 0x5292) << "SCL011 Contactless Reader" << "Identiv SCL01x Contactless Smart Card Reader"; QTest::newRow("Identiv SCL011-windows-10-11-2") << UsbId(0x04E6, 0x5292) << "SCM Microsystems Inc. SCL010 Contactless Reader" << "SCM Microsystems Inc. SCL010 Contactless Reader"; QTest::newRow("Identiv SCL011-windows-10-11-3") << UsbId(0x04E6, 0x5292) << "SCM Microsystems Inc. SCL011 Contactless Reader 0" << "Identiv SCL01x Contactless Smart Card Reader"; QTest::newRow("Identiv SCL011-windows-10-11-4") << UsbId(0x04E6, 0x5292) << "SCM Microsystems Inc. SCL011G Contactless Reader 0" << "Identiv SCL01x Contactless Smart Card Reader"; - QTest::newRow("Identiv SCL011-macosx-11-13-1") << UsbId(0x04E6, 0x5292) << "SCL011 Contactless Reader" << "Identiv SCL01x Contactless Smart Card Reader"; - QTest::newRow("Identiv SCL011-macosx-11-13-2") << UsbId(0x04E6, 0x5292) << "SCM Microsystems Inc. SCL011 Contactless Reader" << "Identiv SCL01x Contactless Smart Card Reader"; - - QTest::newRow("ACS-ACR1281U-windows-7-10") << UsbId(0x072F, 0x0901) << "ACS ACR1281 PICC Reader 0" << "ACS ACR1281U"; - QTest::newRow("ACS-ACR1281U-macosx-10.13-11.0") << UsbId(0x072F, 0x0901) << "ACS ACR1281 PICC Reader" << "ACS ACR1281U"; - - QTest::newRow("ACS-ACR1581-windows-7-11-1") << UsbId(0x072F, 0x2301) << "ACS ACR1581 1S Dual Reader PICC 0" << "ACS ACR1581U-C1"; - QTest::newRow("ACS-ACR1581-windows-7-11-2") << UsbId(0x072F, 0x2301) << "ACS ACR1581 1S Dual Reader SAM 0" << "ACS ACR1581 1S Dual Reader SAM 0"; - QTest::newRow("ACS-ACR1581-windows-7-11-3") << UsbId(0x072F, 0x2301) << "ACS ACR1581 1S Dual Reader ICC 0" << "ACS ACR1581 1S Dual Reader ICC 0"; - QTest::newRow("ACS-ACR1581-macosx-11-14-1") << UsbId(0x072F, 0x2301) << "ACS ACR1581 1S Dual Reader PICC" << "ACS ACR1581U-C1"; - QTest::newRow("ACS-ACR1581-macosx-11-14-2") << UsbId(0x072F, 0x2301) << "ACS ACR1581 1S Dual Reader SAM" << "ACS ACR1581 1S Dual Reader SAM"; + QTest::newRow("Identiv SCL011-macosx-12-14-1") << UsbId(0x04E6, 0x5292) << "SCL011 Contactless Reader" << "Identiv SCL01x Contactless Smart Card Reader"; + QTest::newRow("Identiv SCL011-macosx-12-14-2") << UsbId(0x04E6, 0x5292) << "SCM Microsystems Inc. SCL011 Contactless Reader" << "Identiv SCL01x Contactless Smart Card Reader"; + + QTest::newRow("ACS-ACR1281U-windows-10-11") << UsbId(0x072F, 0x0901) << "ACS ACR1281 PICC Reader 0" << "ACS ACR1281U"; + QTest::newRow("ACS-ACR1281U-macosx-12-14") << UsbId(0x072F, 0x0901) << "ACS ACR1281 PICC Reader" << "ACS ACR1281U"; + + QTest::newRow("ACS-ACR1581-windows-10-11-1") << UsbId(0x072F, 0x2301) << "ACS ACR1581 1S Dual Reader PICC 0" << "ACS ACR1581U-C1"; + QTest::newRow("ACS-ACR1581-windows-10-11-2") << UsbId(0x072F, 0x2301) << "ACS ACR1581 1S Dual Reader ICC 0" << "ACS ACR1581 1S Dual Reader ICC 0"; + QTest::newRow("ACS-ACR1581-windows-10-11-3") << UsbId(0x072F, 0x2301) << "ACS ACR1581 1S Dual Reader SAM 0" << "ACS ACR1581 1S Dual Reader SAM 0"; + QTest::newRow("ACS-ACR1581-macosx-12-13-1") << UsbId(0x072F, 0x2301) << "ACS ACR1581 1S Dual Reader (1)" << "ACS ACR1581U-C1"; + QTest::newRow("ACS-ACR1581-macosx-12-13-2") << UsbId(0x072F, 0x2301) << "ACS ACR1581 1S Dual Reader (2)" << "ACS ACR1581 1S Dual Reader (2)"; + QTest::newRow("ACS-ACR1581-macosx-12-13-3") << UsbId(0x072F, 0x2301) << "ACS ACR1581 1S Dual Reader (3)" << "ACS ACR1581 1S Dual Reader (3)"; + QTest::newRow("ACS-ACR1581-macosx-14-1") << UsbId(0x072F, 0x2301) << "ACS ACR1581 1S Dual Reader PICC" << "ACS ACR1581U-C1"; + QTest::newRow("ACS-ACR1581-macosx-14-2") << UsbId(0x072F, 0x2301) << "ACS ACR1581 1S Dual Reader ICC" << "ACS ACR1581 1S Dual Reader ICC"; + QTest::newRow("ACS-ACR1581-macosx-14-3") << UsbId(0x072F, 0x2301) << "ACS ACR1581 1S Dual Reader SAM" << "ACS ACR1581 1S Dual Reader SAM"; QTest::newRow("HID OMNIKEY 5021-windows-10-11") << UsbId(0x076B, 0x5340) << "OMNIKEY CardMan 5x21-CL 0" << "HID OMNIKEY 5021-CL"; - QTest::newRow("HID OMNIKEY 5021-macosx-11-13") << UsbId(0x076B, 0x5340) << "OMNIKEY CardMan (076B:5340) 5021 CL" << "HID OMNIKEY 5021-CL"; + QTest::newRow("HID OMNIKEY 5021-macosx-12-14") << UsbId(0x076B, 0x5340) << "OMNIKEY CardMan (076B:5340) 5021 CL" << "HID OMNIKEY 5021-CL"; QTest::newRow("HID OMNIKEY 5022-windows-10-11") << UsbId(0x076B, 0x5022) << "HID Global OMNIKEY 5022 Smart Card Reader 0" << "HID OMNIKEY 5022-CL"; - QTest::newRow("HID OMNIKEY 5022-macosx-11-13") << UsbId(0x076B, 0x5022) << "HID Global OMNIKEY 5022 Smart Card Reader" << "HID OMNIKEY 5022-CL"; + QTest::newRow("HID OMNIKEY 5022-macosx-12-14") << UsbId(0x076B, 0x5022) << "HID Global OMNIKEY 5022 Smart Card Reader" << "HID OMNIKEY 5022-CL"; QTest::newRow("HID OMNIKEY 5321 v2-windows-10-11-1") << UsbId(0x076B, 0x5321) << "OMNIKEY CardMan 5x21 0" << "OMNIKEY CardMan 5x21 0"; QTest::newRow("HID OMNIKEY 5321 v2-windows-10-11-2") << UsbId(0x076B, 0x5321) << "OMNIKEY CardMan 5x21-CL 0" << "HID OMNIKEY 5321 v2"; - QTest::newRow("HID OMNIKEY 5321 v2-macosx-11-14-1") << UsbId(0x076B, 0x5321) << "OMNIKEY CardMan (076B:5321) 5321(1)" << "HID OMNIKEY 5321 v2"; - QTest::newRow("HID OMNIKEY 5321 v2-macosx-11-14-2") << UsbId(0x076B, 0x5321) << "OMNIKEY CardMan (076B:5321) 5321(2)" << "HID OMNIKEY 5321 v2"; + QTest::newRow("HID OMNIKEY 5321 v2-macosx-12-14-1") << UsbId(0x076B, 0x5321) << "OMNIKEY CardMan (076B:5321) 5321(1)" << "HID OMNIKEY 5321 v2"; + QTest::newRow("HID OMNIKEY 5321 v2-macosx-12-14-2") << UsbId(0x076B, 0x5321) << "OMNIKEY CardMan (076B:5321) 5321(2)" << "HID OMNIKEY 5321 v2"; QTest::newRow("HID OMNIKEY 5421-windows-10-11-1") << UsbId(0x076B, 0x5421) << "OMNIKEY CardMan 5x21 0" << "OMNIKEY CardMan 5x21 0"; QTest::newRow("HID OMNIKEY 5421-windows-10-11-2") << UsbId(0x076B, 0x5421) << "OMNIKEY CardMan 5x21-CL 0" << "HID OMNIKEY 5421"; QTest::newRow("HID OMNIKEY 5421-windows-10-11-3") << UsbId(0x076B, 0x5421) << "OMNIKEY Smart Card Reader USB 0" << "HID OMNIKEY 5421"; - QTest::newRow("HID OMNIKEY 5421-macosx-11-13-1") << UsbId(0x076B, 0x5421) << "OMNIKEY CardMan (076B:5421) 5421(1)" << "HID OMNIKEY 5421"; - QTest::newRow("HID OMNIKEY 5421-macosx-11-13-2") << UsbId(0x076B, 0x5421) << "OMNIKEY CardMan (076B:5421) 5421(2)" << "HID OMNIKEY 5421"; + QTest::newRow("HID OMNIKEY 5421-macosx-12-14-1") << UsbId(0x076B, 0x5421) << "OMNIKEY CardMan (076B:5421) 5421(1)" << "HID OMNIKEY 5421"; + QTest::newRow("HID OMNIKEY 5421-macosx-12-14-2") << UsbId(0x076B, 0x5421) << "OMNIKEY CardMan (076B:5421) 5421(2)" << "HID OMNIKEY 5421"; QTest::newRow("HID OMNIKEY 5422-windows-10-11-1") << UsbId(0x076B, 0x5422) << "HID Global OMNIKEY 5422 Smartcard Reader 0" << "HID Global OMNIKEY 5422 Smartcard Reader 0"; QTest::newRow("HID OMNIKEY 5422-windows-10-11-2") << UsbId(0x076B, 0x5422) << "HID Global OMNIKEY 5422CL Smartcard Reader 0" << "HID OMNIKEY 5422"; - QTest::newRow("HID OMNIKEY 5422-macosx-11-13-1") << UsbId(0x076B, 0x5422) << "HID Global OMNIKEY Smartcard Reader (1)" << "HID OMNIKEY 5422"; - QTest::newRow("HID OMNIKEY 5422-macosx-11-13-2") << UsbId(0x076B, 0x5422) << "HID Global OMNIKEY Smartcard Reader (2)" << "HID OMNIKEY 5422"; - QTest::newRow("HID OMNIKEY 5422-macosx-11-13-3") << UsbId(0x076B, 0x5422) << "HID Global OMNIKEY Smartcard Reader(1)" << "HID OMNIKEY 5422"; - QTest::newRow("HID OMNIKEY 5422-macosx-11-13-4") << UsbId(0x076B, 0x5422) << "HID Global OMNIKEY Smartcard Reader(2)" << "HID OMNIKEY 5422"; + QTest::newRow("HID OMNIKEY 5422-macosx-12-14-1") << UsbId(0x076B, 0x5422) << "HID Global OMNIKEY Smartcard Reader (1)" << "HID OMNIKEY 5422"; + QTest::newRow("HID OMNIKEY 5422-macosx-12-14-2") << UsbId(0x076B, 0x5422) << "HID Global OMNIKEY Smartcard Reader (2)" << "HID OMNIKEY 5422"; + QTest::newRow("HID OMNIKEY 5422-macosx-12-14-3") << UsbId(0x076B, 0x5422) << "HID Global OMNIKEY Smartcard Reader(1)" << "HID OMNIKEY 5422"; + QTest::newRow("HID OMNIKEY 5422-macosx-12-14-4") << UsbId(0x076B, 0x5422) << "HID Global OMNIKEY Smartcard Reader(2)" << "HID OMNIKEY 5422"; - QTest::newRow("FEIG OBID myAXXESS RFID-Reader-windows-7-10") << UsbId(0x0AB1, 0x0003) << "FEIG ELECTRONIC GmbH OBID myAXXESS basic Slot:CL 358334430" << "OBID RFID-Reader"; + QTest::newRow("FEIG OBID myAXXESS RFID-Reader-windows-10-11") << UsbId(0x0AB1, 0x0003) << "FEIG ELECTRONIC GmbH OBID myAXXESS basic Slot:CL 358334430" << "OBID RFID-Reader"; - QTest::newRow("Gemalto-Prox-DU-windows-7-10-1") << UsbId(0x08E6, 0x5503) << "Gemalto Prox-DU Contactless_10900383 0" << "Gemalto Prox-DU HID"; - QTest::newRow("Gemalto-Prox-DU-windows-7-10-2") << UsbId(0x08E6, 0x5503) << "Gemalto Prox-DU Contact_10900383 0" << "Gemalto Prox-DU Contact_10900383 0"; - QTest::newRow("Gemalto-Prox-DU-windows-macosx-10.13-11.0-1") << UsbId(0x08E6, 0x5503) << "Gemalto Prox Dual USB PC Link Reader(1)" << "Gemalto Prox-DU HID"; - QTest::newRow("Gemalto-Prox-DU-windows-macosx-10.13-11.0-2") << UsbId(0x08E6, 0x5503) << "Gemalto Prox Dual USB PC Link Reader(2)" << "Gemalto Prox-DU HID"; + QTest::newRow("Gemalto-Prox-DU-windows-10-11-1") << UsbId(0x08E6, 0x5503) << "Gemalto Prox-DU Contactless_10900383 0" << "Gemalto Prox-DU HID"; + QTest::newRow("Gemalto-Prox-DU-windows-10-11-2") << UsbId(0x08E6, 0x5503) << "Gemalto Prox-DU Contact_10900383 0" << "Gemalto Prox-DU Contact_10900383 0"; + QTest::newRow("Gemalto-Prox-DU-windows-macosx-12-14-1") << UsbId(0x08E6, 0x5503) << "Gemalto Prox Dual USB PC Link Reader(1)" << "Gemalto Prox-DU HID"; + QTest::newRow("Gemalto-Prox-DU-windows-macosx-12-14-2") << UsbId(0x08E6, 0x5503) << "Gemalto Prox Dual USB PC Link Reader(2)" << "Gemalto Prox-DU HID"; - QTest::newRow("Gemalto-Prox-SU-windows-7-10-1") << UsbId(0x08E6, 0x5504) << "Gemalto Prox-SU Contactless_10800004 0" << "Gemalto Prox-SU Contactless"; - QTest::newRow("Gemalto-Prox-SU-windows-7-10-2") << UsbId(0x08E6, 0x5504) << "Gemalto Prox-SU Contact_10800004 0" << "Gemalto Prox-SU Contact_10800004 0"; - QTest::newRow("Gemalto-Prox-SU-windows-macosx-10.13-11.0-1") << UsbId(0x08E6, 0x5504) << "Gemalto Prox SU USB PC LinkReader(1)" << "Gemalto Prox-SU Contactless"; - QTest::newRow("Gemalto-Prox-SU-windows-macosx-10.13-11.0-2") << UsbId(0x08E6, 0x5504) << "Gemalto Prox SU USB PC LinkReader(2)" << "Gemalto Prox-SU Contactless"; + QTest::newRow("Gemalto-Prox-SU-windows-10-11-1") << UsbId(0x08E6, 0x5504) << "Gemalto Prox-SU Contactless_10800004 0" << "Gemalto Prox-SU Contactless"; + QTest::newRow("Gemalto-Prox-SU-windows-10-11-2") << UsbId(0x08E6, 0x5504) << "Gemalto Prox-SU Contact_10800004 0" << "Gemalto Prox-SU Contact_10800004 0"; + QTest::newRow("Gemalto-Prox-SU-windows-macosx-12-14-1") << UsbId(0x08E6, 0x5504) << "Gemalto Prox SU USB PC LinkReader(1)" << "Gemalto Prox-SU Contactless"; + QTest::newRow("Gemalto-Prox-SU-windows-macosx-12-14-2") << UsbId(0x08E6, 0x5504) << "Gemalto Prox SU USB PC LinkReader(2)" << "Gemalto Prox-SU Contactless"; QTest::newRow("Identiv-SCL-3711-windows-10-11") << UsbId(0x04E6, 0x5591) << "SCM Microsystems SCL3711 reader & NFC device 0" << "Identiv SCL3711"; - QTest::newRow("Identiv-SCL-3711--F-macosx-11-13") << UsbId(0x04E6, 0x5591) << "SCL3711 Reader and NFC device" << "Identiv SCL3711"; - QTest::newRow("Identiv-SCL-3711--F-macosx-11-13") << UsbId(0x04E6, 0x5591) << "SCL3711 Reader and NFC device" << "Identiv SCL3711"; + QTest::newRow("Identiv-SCL-3711--F-macosx-12-14") << UsbId(0x04E6, 0x5591) << "SCL3711 Reader and NFC device" << "Identiv SCL3711"; + QTest::newRow("Identiv-SCL-3711--F-macosx-12-14") << UsbId(0x04E6, 0x5591) << "SCL3711 Reader and NFC device" << "Identiv SCL3711"; QTest::newRow("Identiv-3700-F-windows-10-11") << UsbId(0x04E6, 0x5790) << "Identiv CLOUD 3700 F Contactless Reader 0" << "Identiv 3700 F"; - QTest::newRow("Identiv-3700-F-macosx-11-13") << UsbId(0x04E6, 0x5790) << "Identiv uTrust 3700 F CL Reader" << "Identiv 3700 F"; + QTest::newRow("Identiv-3700-F-macosx-12-14") << UsbId(0x04E6, 0x5790) << "Identiv uTrust 3700 F CL Reader" << "Identiv 3700 F"; QTest::newRow("Identiv-3700-F-generic-1") << UsbId(0x04E6, 0x5790) << "Identiv uTrust 3700 F CL Reader 0" << "Identiv 3700 F"; QTest::newRow("Identiv-3700-F-generic-2") << UsbId(0x04E6, 0x5790) << "Identiv cloud 3700 F Contactless Reader 0" << "Identiv 3700 F"; QTest::newRow("Identiv-3700-F-generic-3") << UsbId(0x04E6, 0x5790) << "Identiv uTrust 3700 F Contactless Reader 0" << "Identiv 3700 F"; @@ -300,7 +302,7 @@ class test_ReaderConfiguration QTest::newRow("Identiv-3700-F-generic-5") << UsbId(0x04E6, 0x5790) << "Identiv cloud 3700 F CL Reader" << "Identiv 3700 F"; QTest::newRow("Identiv-3720-F-windows-10-11") << UsbId(0x04E6, 0x5612) << "Identiv uTrust 3720 Contactless Reader 0" << "Identiv 3720 F"; - QTest::newRow("Identiv-3720-F-macosx-11-13") << UsbId(0x04E6, 0x5612) << "Identiv uTrust 3720 Contactless Reader(1)" << "Identiv 3720 F"; + QTest::newRow("Identiv-3720-F-macosx-12-14") << UsbId(0x04E6, 0x5612) << "Identiv uTrust 3720 Contactless Reader(1)" << "Identiv 3720 F"; QTest::newRow("Identiv-3720-F-generic-1") << UsbId(0x04E6, 0x5612) << "Identiv cloud 3720 Contactless Reader 0" << "Identiv 3720 F"; QTest::newRow("Identiv-3720-F-generic-2") << UsbId(0x04E6, 0x5612) << "Identiv cloud 3720 Contactless Reader(1)" << "Identiv 3720 F"; QTest::newRow("Identiv-3720-F-generic-3") << UsbId(0x04E6, 0x5612) << "Identiv cloud 3720 CL Reader 0" << "Identiv 3720 F"; @@ -313,7 +315,7 @@ class test_ReaderConfiguration QTest::newRow("Identiv-3720-F-generic-10") << UsbId(0x04E6, 0x5612) << "Identiv uTrust 3720 CL Reader(1)" << "Identiv 3720 F"; QTest::newRow("Identiv-uTrust-3721-F-windows-10-11") << UsbId(0x04E6, 0x5613) << "Identiv uTrust 3721 Contactless Reader 0" << "Identiv 3721 F"; - QTest::newRow("Identiv-uTrust-3721-F-macosx-11-13") << UsbId(0x04E6, 0x5613) << "Identiv uTrust 3721 Contactless Reader(1)" << "Identiv 3721 F"; + QTest::newRow("Identiv-uTrust-3721-F-macosx-12-14") << UsbId(0x04E6, 0x5613) << "Identiv uTrust 3721 Contactless Reader(1)" << "Identiv 3721 F"; QTest::newRow("Identiv-3721-F-generic-1") << UsbId(0x04E6, 0x5613) << "Identiv cloud 3721 Contactless Reader 0" << "Identiv 3721 F"; QTest::newRow("Identiv-3721-F-generic-2") << UsbId(0x04E6, 0x5613) << "Identiv cloud 3721 Contactless Reader(1)" << "Identiv 3721 F"; QTest::newRow("Identiv-3721-F-generic-3") << UsbId(0x04E6, 0x5613) << "Identiv cloud 3721 CL Reader 0" << "Identiv 3721 F"; @@ -328,8 +330,8 @@ class test_ReaderConfiguration QTest::newRow("Identiv-Cloud-4700-F-windows-10-11-1") << UsbId(0x04E6, 0x5720) << "Identive CLOUD 4700 F Contact Reader 0" << "Identive CLOUD 4700 F Contact Reader 0"; QTest::newRow("Identiv-Cloud-4700-F-windows-10-11-2") << UsbId(0x04E6, 0x5720) << "Identive CLOUD 4700 F Contactless Reader 0" << "Identiv Cloud 4700 F"; QTest::newRow("Identiv-Cloud-4700-F-windows-10-11-3") << UsbId(0x04E6, 0x5720) << "Identive CLOUD 4700 F Contactless Reader 1" << "Identiv Cloud 4700 F"; - QTest::newRow("Identiv-Cloud-4700-F-macosx-11-13-1") << UsbId(0x04E6, 0x5720) << "Identiv uTrust 4700 F Dual Interface Reader(2)" << "Identiv Cloud 4700 F"; - QTest::newRow("Identiv-Cloud-4700-F-macosx-11-13-2") << UsbId(0x04E6, 0x5720) << "Identiv uTrust 4700 F Dual Interface Reader(1)" << "Identiv uTrust 4700 F Dual Interface Reader(1)"; + QTest::newRow("Identiv-Cloud-4700-F-macosx-12-14-1") << UsbId(0x04E6, 0x5720) << "Identiv uTrust 4700 F Dual Interface Reader(2)" << "Identiv Cloud 4700 F"; + QTest::newRow("Identiv-Cloud-4700-F-macosx-12-14-2") << UsbId(0x04E6, 0x5720) << "Identiv uTrust 4700 F Dual Interface Reader(1)" << "Identiv uTrust 4700 F Dual Interface Reader(1)"; QTest::newRow("Identiv-4701-F-windows-10-11-1") << UsbId(0x04E6, 0x5724) << "Identiv CLOUD 4701 F Contact Reader 0" << "Identiv CLOUD 4701 F Contact Reader 0"; QTest::newRow("Identiv-4701-F-windows-10-11-2") << UsbId(0x04E6, 0x5724) << "Identiv CLOUD 4701 F Contactless Reader 1" << "Identiv 4701 F"; @@ -337,23 +339,26 @@ class test_ReaderConfiguration QTest::newRow("Identiv-4701-F-windows-10-11-4") << UsbId(0x04E6, 0x5724) << "Identiv cloud 4701 F Contactless Reader 1" << "Identiv 4701 F"; QTest::newRow("Identiv-4701-F-windows-10-11-5") << UsbId(0x04E6, 0x5724) << "Identiv cloud 4701 F Contactless Reader 0" << "Identiv 4701 F"; QTest::newRow("Identiv-4701-F-windows-10-11-6") << UsbId(0x04E6, 0x5724) << "Identiv uTrust 4701 F CL Reader 0" << "Identiv 4701 F"; - QTest::newRow("Identiv-4701-F-macosx-11-13-1") << UsbId(0x04E6, 0x5724) << "Identiv uTrust 4701 F Dual Interface Reader(1)" << "Identiv 4701 F"; - QTest::newRow("Identiv-4701-F-macosx-11-13-2") << UsbId(0x04E6, 0x5724) << "Identiv uTrust 4701 F Dual Interface Reader(2)" << "Identiv 4701 F"; - QTest::newRow("Identiv-4701-F-macosx-11-13-3") << UsbId(0x04E6, 0x5724) << "Identiv uTrust 4701 F Dual Interface Reader" << "Identiv 4701 F"; + QTest::newRow("Identiv-4701-F-macosx-12-14-1") << UsbId(0x04E6, 0x5724) << "Identiv uTrust 4701 F Dual Interface Reader(1)" << "Identiv 4701 F"; + QTest::newRow("Identiv-4701-F-macosx-12-14-2") << UsbId(0x04E6, 0x5724) << "Identiv uTrust 4701 F Dual Interface Reader(2)" << "Identiv 4701 F"; + QTest::newRow("Identiv-4701-F-macosx-12-14-3") << UsbId(0x04E6, 0x5724) << "Identiv uTrust 4701 F Dual Interface Reader" << "Identiv 4701 F"; - QTest::newRow("Cherry-TC-1200-windows-7-10-1") << UsbId(0x046A, 0x0091) << "Cherry Smartcard Terminal TC 12xx-CL 0" << "Cherry TC-1200"; - QTest::newRow("Cherry-TC-1200-windows-10") << UsbId(0x046A, 0x0091) << "Cherry Smartcard Terminal TC 12xx 0" << "Cherry Smartcard Terminal TC 12xx 0"; - QTest::newRow("Cherry-TC-1200-macosx-10.13-11.0") << UsbId(0x046A, 0x0091) << "Cherry SC Reader (046A:0091)" << "Cherry TC-1200"; + QTest::newRow("Cherry-TC-1200-windows-10-11-1") << UsbId(0x046A, 0x0091) << "Cherry Smartcard Terminal TC 12xx-CL 0" << "Cherry TC-1200"; + QTest::newRow("Cherry-TC-1200-windows-10-11-2") << UsbId(0x046A, 0x0091) << "Cherry Smartcard Terminal TC 12xx 0" << "Cherry Smartcard Terminal TC 12xx 0"; + QTest::newRow("Cherry-TC-1200-macosx-12-14") << UsbId(0x046A, 0x0091) << "Cherry SC Reader (046A:0091)" << "Cherry TC-1200"; QTest::newRow("Cherry-TC-1200-linux") << UsbId(0x046A, 0x0091) << "Cherry TC 1200" << "Cherry TC-1200"; - QTest::newRow("Cherry-TC-1300-windows-7-10-1") << UsbId(0x046A, 0x0092) << "Cherry Smartcard Terminal TC 13xx-CL 0" << "Cherry TC-1300"; - QTest::newRow("Cherry-TC-1300-windows-7-10-2") << UsbId(0x046A, 0x0092) << "Cherry Smartcard Terminal TC 13xx 0" << "Cherry Smartcard Terminal TC 13xx 0"; - QTest::newRow("Cherry-TC-1300-macosx-10.13-11.0-1") << UsbId(0x046A, 0x0092) << "Cherry SC Reader (046A:0092)(1)" << "Cherry TC-1300"; - QTest::newRow("Cherry-TC-1300-macosx-10.13-11.0-2") << UsbId(0x046A, 0x0092) << "Cherry SC Reader (046A:0092)(2)" << "Cherry TC-1300"; - QTest::newRow("Cherry-TC-1300-linux") << UsbId(0x046A, 0x0092) << "Cherry TC 1300" << "Cherry TC-1300"; + QTest::newRow("Cherry-TC-1300-windows-10-11-1") << UsbId(0x046A, 0x0092) << "Cherry Smartcard Terminal TC 13xx-CL 0" << "Cherry TC-1300"; + QTest::newRow("Cherry-TC-1300-windows-10-11-2") << UsbId(0x046A, 0x0092) << "Cherry Smartcard Terminal TC 13xx 0" << "Cherry Smartcard Terminal TC 13xx 0"; + QTest::newRow("Cherry-TC-1300-windows-10") << UsbId(0x046A, 0x0092) << "Cherry Smart Card Reader USB 0" << "Cherry Smart Card Reader USB 0"; + QTest::newRow("Cherry-TC-1300-macosx-12-14-1") << UsbId(0x046A, 0x0092) << "Cherry SC Reader (046A:0092)(1)" << "Cherry TC-1300"; + QTest::newRow("Cherry-TC-1300-macosx-12-14-2") << UsbId(0x046A, 0x0092) << "Cherry SC Reader (046A:0092)(2)" << "Cherry TC-1300"; + QTest::newRow("Cherry-TC-1300-macosx-14") << UsbId(0x046A, 0x0092) << "Cherry Smart Card Reader USB" << "Cherry Smart Card Reader USB"; + + QTest::newRow("Cherry-TC-1300-linux-macosx-12-13") << UsbId(0x046A, 0x0092) << "Cherry TC 1300" << "Cherry TC 1300"; - QTest::newRow("Cherry-ST-1275-windows-7-10-1") << UsbId(0x046A, 0x0072) << "Cherry SmartTerminal XX7X 0" << "Cherry SmartTerminal XX7X 0"; - QTest::newRow("Cherry-ST-1275-windows-7-10-2") << UsbId(0x046A, 0x0072) << "Cherry SmartTerminal XX7X-RF 0" << "Cherry ST-1275"; + QTest::newRow("Cherry-ST-1275-windows-10-11-1") << UsbId(0x046A, 0x0072) << "Cherry SmartTerminal XX7X 0" << "Cherry SmartTerminal XX7X 0"; + QTest::newRow("Cherry-ST-1275-windows-10-11-2") << UsbId(0x046A, 0x0072) << "Cherry SmartTerminal XX7X-RF 0" << "Cherry ST-1275"; QTest::newRow("Cherry-sercure Board-windows-7-10-1") << UsbId(0x046A, 0x01A2) << "Cherry GmbH CHERRY SECURE BOARD 1.0 0" << "Cherry Secure Board 1.0"; QTest::newRow("Cherry-sercure Board-macosx-10.13-11.0-1") << UsbId(0x046A, 0x01A2) << "Cherry GmbH CHERRY SECURE BOARD 1.0" << "Cherry Secure Board 1.0"; diff --git a/test/qt/network/test_TlsChecker.cpp b/test/qt/network/test_TlsChecker.cpp index 138f86fcb..9697d89d8 100644 --- a/test/qt/network/test_TlsChecker.cpp +++ b/test/qt/network/test_TlsChecker.cpp @@ -114,6 +114,7 @@ class test_TlsChecker QTest::addColumn("pem"); QTest::addColumn("algorithm"); QTest::addColumn("sufficient"); + QTest::addColumn("infoMap"); /* * openssl ecparam -name secp112r2 -out secp112r2_param.pem @@ -124,8 +125,7 @@ class test_TlsChecker "MDIwEAYHKoZIzj0CAQYFK4EEAAcDHgAEWo89aCax3oUWJho7rFZ1u70WqghvA7Tf\n" "SXXiZw==\n" "-----END PUBLIC KEY-----"); - - QTest::newRow("ec112") << ec112 << QSsl::KeyAlgorithm::Ec << false; + QTest::newRow("ec112") << ec112 << QSsl::KeyAlgorithm::Ec << false << FailureCode::FailureInfoMap {}; /* * openssl ecparam -name secp521r1 -out secp521r1_param.pem @@ -138,7 +138,10 @@ class test_TlsChecker "zBwxpgBC09TO/3D8fS70xVqBX6dzA4lO9MUZCqgBMt2LTFpklUabviy657kcRQ+H\n" "tTAy2sDy+bhcj1UyWlE=\n" "-----END PUBLIC KEY-----"); - QTest::newRow("ec521") << ec521 << QSsl::KeyAlgorithm::Ec << true; + QTest::newRow("ec521") << ec521 << QSsl::KeyAlgorithm::Ec << true << FailureCode::FailureInfoMap { + {FailureCode::Info::Ephemeral_Server_Key_Algorithm, "Ec"_L1}, + {FailureCode::Info::Ephemeral_Server_Key_Length, "521"_L1} + }; /* * openssl dsaparam -out dsa768_param.pem 1024 @@ -155,7 +158,10 @@ class test_TlsChecker "b3586zIW9Fdg/Rq4yda8GzMLVAtF540s3k5RmsJvnxPEGXlc3c+wEOKR/iHwPrg4\n" "DNXOVys=\n" "-----END PUBLIC KEY-----"); - QTest::newRow("dsa768") << dsa768 << QSsl::KeyAlgorithm::Dsa << false; + QTest::newRow("dsa768") << dsa768 << QSsl::KeyAlgorithm::Dsa << false << FailureCode::FailureInfoMap { + {FailureCode::Info::Ephemeral_Server_Key_Algorithm, "Dsa"_L1}, + {FailureCode::Info::Ephemeral_Server_Key_Length, "768"_L1} + }; /* * openssl dsaparam -out dsa1024_param.pem 1024 @@ -174,7 +180,10 @@ class test_TlsChecker "1vSGQgpXPK6250pSrx8r8pngr9Qxrt8ElFpLtK+Of6Th/wSTe8COYbXSOP/6Yx7v\n" "6cObyPo7eAmX8Sg=\n" "-----END PUBLIC KEY-----"); - QTest::newRow("dsa1024") << dsa1024 << QSsl::KeyAlgorithm::Dsa << false; + QTest::newRow("dsa1024") << dsa1024 << QSsl::KeyAlgorithm::Dsa << false << FailureCode::FailureInfoMap { + {FailureCode::Info::Ephemeral_Server_Key_Algorithm, "Dsa"_L1}, + {FailureCode::Info::Ephemeral_Server_Key_Length, "1024"_L1} + }; /* * openssl dsaparam -out dsa2048_param.pem 2048 @@ -202,7 +211,10 @@ class test_TlsChecker "foMYlbwM/IzefL1TD2+eBlyV0unSwMIwrvXPTg==\n" "-----END PUBLIC KEY-----\n"); - QTest::newRow("dsa2048") << dsa2048 << QSsl::KeyAlgorithm::Dsa << true; + QTest::newRow("dsa2048") << dsa2048 << QSsl::KeyAlgorithm::Dsa << true << FailureCode::FailureInfoMap { + {FailureCode::Info::Ephemeral_Server_Key_Algorithm, "Dsa"_L1}, + {FailureCode::Info::Ephemeral_Server_Key_Length, "2048"_L1} + }; /* * openssl genrsa -out rsa1024_key.pem 1024 @@ -214,7 +226,10 @@ class test_TlsChecker "tHKRnCy0sQiCQqmSNmWe4qeLwXslKxm1fqj3/tvrX+0VxDVxXz5jS0HH7hHMdELQ\n" "om/I1IppJFS4IkqEoQIDAQAB\n" "-----END PUBLIC KEY-----"); - QTest::newRow("rsa1024") << rsa1024 << QSsl::KeyAlgorithm::Rsa << false; + QTest::newRow("rsa1024") << rsa1024 << QSsl::KeyAlgorithm::Rsa << false << FailureCode::FailureInfoMap { + {FailureCode::Info::Ephemeral_Server_Key_Algorithm, "Rsa"_L1}, + {FailureCode::Info::Ephemeral_Server_Key_Length, "1024"_L1} + }; /* * openssl genrsa -out rsa2048_key.pem 2048 @@ -229,7 +244,10 @@ class test_TlsChecker "q0hOP6K9hZ7pBZvqLZ0gZdVWqarIf9w/I5yS2QGN9jgJN/oJIKyljlreGuSagST/\n" "5wIDAQAB\n" "-----END PUBLIC KEY-----"); - QTest::newRow("rsa2048") << rsa2048 << QSsl::KeyAlgorithm::Rsa << true; + QTest::newRow("rsa2048") << rsa2048 << QSsl::KeyAlgorithm::Rsa << true << FailureCode::FailureInfoMap { + {FailureCode::Info::Ephemeral_Server_Key_Algorithm, "Rsa"_L1}, + {FailureCode::Info::Ephemeral_Server_Key_Length, "2048"_L1} + }; } @@ -238,11 +256,16 @@ class test_TlsChecker QFETCH(QByteArray, pem); QFETCH(QSsl::KeyAlgorithm, algorithm); QFETCH(bool, sufficient); + QFETCH(FailureCode::FailureInfoMap, infoMap); QSslKey key = createQSslKeyWithHandle(pem); QVERIFY(!key.isNull()); QCOMPARE(key.algorithm(), algorithm); QCOMPARE(TlsChecker::hasValidEphemeralKeyLength(key), sufficient); + if (!infoMap.isEmpty()) + { + QCOMPARE(TlsChecker::getEphemeralKeyInfoMap(key), infoMap); + } } diff --git a/test/qt/ui/json/test_UIPlugInJson.cpp b/test/qt/ui/json/test_UIPlugInJson.cpp index 81fefee41..5873d1c72 100644 --- a/test/qt/ui/json/test_UIPlugInJson.cpp +++ b/test/qt/ui/json/test_UIPlugInJson.cpp @@ -2,19 +2,19 @@ * Copyright (c) 2018-2024 Governikus GmbH & Co. KG, Germany */ -/*! - * \brief Unit tests for \ref UIPlugInJsonApi - */ - #include "UIPlugInJson.h" #include "LogHandler.h" +#include "SmartCardDefinitions.h" +#include #include + using namespace Qt::Literals::StringLiterals; using namespace governikus; + class test_UIPlugInJson : public QObject { @@ -76,6 +76,47 @@ class test_UIPlugInJson } + void newCard_data() + { +#if __has_include("SmartManager.h") + const QByteArray eidType = QByteArray(R"("eidType":"CARD_CERTIFIED",)"); +#else + const QByteArray eidType; +#endif + const QByteArray knownCard(R"({"attached":true,"card":{"deactivated":false,)" + eidType + R"("inoperative":false,"retryCounter":-1},"insertable":false,"keypad":false,"msg":"READER","name":"Reader"})"); + + QTest::addColumn("cardType"); + QTest::addColumn("result"); + + QTest::newRow("NONE") << CardType::NONE << QByteArray(); + QTest::newRow("UNKNOWN") << CardType::UNKNOWN << QByteArray(); + QTest::newRow("EID_CARD") << CardType::EID_CARD << knownCard; + QTest::newRow("SMART_EID") << CardType::SMART_EID << knownCard; + } + + + void newCard() + { + QFETCH(CardType, cardType); + QFETCH(QByteArray, result); + + UIPlugInJson api; + QSignalSpy spy(&api, &UIPlugInJson::fireMessage); + + ReaderInfo info(QStringLiteral("Reader"), ReaderManagerPlugInType::PCSC, CardInfo(cardType)); + api.onCardInserted(info); + if (result.isNull()) + { + QCOMPARE(spy.size(), 0); + } + else + { + QCOMPARE(spy.size(), 1); + QCOMPARE(spy.at(0).at(0).toByteArray(), result); + } + } + + }; QTEST_GUILESS_MAIN(test_UIPlugInJson) diff --git a/test/qt/ui/qml/test_RemoteDeviceModel.cpp b/test/qt/ui/qml/test_RemoteDeviceModel.cpp index d2d541221..58e7bf07e 100644 --- a/test/qt/ui/qml/test_RemoteDeviceModel.cpp +++ b/test/qt/ui/qml/test_RemoteDeviceModel.cpp @@ -13,6 +13,26 @@ using namespace governikus; Q_DECLARE_METATYPE(RemoteDeviceModel::SettingsRemoteRoles) +class MockRemoteDeviceModel + : public RemoteDeviceModel +{ + [[nodiscard]] QList presentReaders() const override; +}; + +QList MockRemoteDeviceModel::presentReaders() const +{ + const auto dName = QStringLiteral("new_name"); + const auto dId = QStringLiteral("myDeviceId"); + const auto disco = Discovery(dName, dId, 12345, {IfdVersion::Version::latest}, false); + const auto ifdDesc = IfdDescriptor(disco, QHostAddress(QStringLiteral("127.0.0.1"))); + const QSharedPointer remoteDeviceListEntry(new IfdListEntry(ifdDesc)); + remoteDeviceListEntry->setIfdDescriptor(ifdDesc); + return QList { + RemoteDeviceModelEntry {remoteDeviceListEntry} + }; +} + + class test_RemoteDeviceModel : public QObject { @@ -276,6 +296,32 @@ class test_RemoteDeviceModel } + void test_ChangedName() + { + MockRemoteDeviceModel model; + + RemoteServiceSettings& settings = Env::getSingleton()->getRemoteServiceSettings(); + settings.addTrustedCertificate(QSslCertificate()); + + const auto dName = QStringLiteral("old_name"); + const auto dId = QStringLiteral("myDeviceId"); + const auto disco = Discovery(dName, dId, 12345, {IfdVersion::Version::latest}, false); + const auto ifdDesc = IfdDescriptor(disco, QHostAddress(QStringLiteral("127.0.0.1"))); + const QSharedPointer remoteDeviceListEntry(new IfdListEntry(ifdDesc)); + + model.mAllRemoteReaders.clear(); + model.addOrUpdateReader(RemoteDeviceModelEntry(remoteDeviceListEntry)); + + const auto newName = QStringLiteral("new_name"); + const auto newDisco = Discovery(newName, dId, 12345, {IfdVersion::Version::latest}, false); + const auto newIfdDesc = IfdDescriptor(newDisco, QHostAddress(QStringLiteral("127.0.0.1"))); + remoteDeviceListEntry->setIfdDescriptor(newIfdDesc); + + const auto name = model.data(mModel->index(0), RemoteDeviceModel::SettingsRemoteRoles::REMOTE_DEVICE_NAME).toString(); + QCOMPARE(name, QStringLiteral("new_name (was old_name)")); + } + + }; QTEST_MAIN(test_RemoteDeviceModel) diff --git a/test/qt/ui/webservice/test_UIPlugInWebService.cpp b/test/qt/ui/webservice/test_UIPlugInWebService.cpp index e58e66bbe..ce7217df1 100644 --- a/test/qt/ui/webservice/test_UIPlugInWebService.cpp +++ b/test/qt/ui/webservice/test_UIPlugInWebService.cpp @@ -231,6 +231,38 @@ class test_UIPlugInWebService } + void corsResponseOptions() + { + HttpServerRequestor requestor; + QSharedPointer reply = requestor.optionsRequest(getUrl("/eID-Client?tctokenURL=bla"_L1)); + QVERIFY(reply); + QCOMPARE(reply->error(), QNetworkReply::NoError); + QCOMPARE(reply->readAll().size(), 0); + QVERIFY(reply->rawHeaderList().contains("Access-Control-Allow-Origin")); + QVERIFY(reply->rawHeaderList().contains("Access-Control-Allow-Private-Network")); + + QCOMPARE(mShowUiSpy->count(), 0); + QCOMPARE(mShowUserInfoSpy->count(), 0); + QCOMPARE(mAuthenticationSpy->count(), 0); + } + + + void corsResponseHead() + { + HttpServerRequestor requestor; + QSharedPointer reply = requestor.headRequest(getUrl("/eID-Client?tctokenURL=bla"_L1)); + QVERIFY(reply); + QCOMPARE(reply->error(), QNetworkReply::NoError); + QCOMPARE(reply->readAll().size(), 0); + QVERIFY(reply->rawHeaderList().contains("Access-Control-Allow-Origin")); + QVERIFY(reply->rawHeaderList().contains("Access-Control-Allow-Private-Network")); + + QCOMPARE(mShowUiSpy->count(), 0); + QCOMPARE(mShowUserInfoSpy->count(), 0); + QCOMPARE(mAuthenticationSpy->count(), 0); + } + + void unknownRequest() { HttpServerRequestor requestor;