diff --git a/.qmllint.ini b/.qmllint.ini new file mode 100644 index 000000000..b50baf511 --- /dev/null +++ b/.qmllint.ini @@ -0,0 +1,47 @@ +[General] +DisableDefaultImports=false + +[Warnings] +AccessSingletonViaObject=warning +BadSignalHandlerParameters=warning +CompilerWarnings=disable +Deprecated=warning +DuplicatePropertyBinding=warning +DuplicatedName=warning +ImportFailure=warning +IncompatibleType=info +InheritanceCycle=warning +InvalidLintDirective=warning +LintPluginWarnings=warning +MissingProperty=info +MissingType=warning +MultilineStrings=warning +NonListProperty=warning +PrefixedImportType=warning +PropertyAliasCycles=warning +ReadOnlyProperty=warning +RequiredProperty=info +RestrictedType=warning +TopLevelComponent=warning +UncreatableType=warning +UnqualifiedAccess=info +UnresolvedType=warning +UnusedImports=info +UseProperFunction=warning +VarUsedBeforeDeclaration=warning +WithStatement=warning + +# Quick +Anchors=info +AttachedPropertyReuse=info +AttachedPropertyType=info +ControlsAttachedPropertyReuse=warning +ControlsNativeCustomize=warning +LayoutsPositioning=info +PropertyChangesParsed=info +UnexpectedVarType=warning + +# Qt 6.5 duplicated categories +Quick.attached-property-type=info +Quick.layout-positioning=info +Quick.property-changes-parsed=info diff --git a/CMakeLists.txt b/CMakeLists.txt index 222c4ec90..cea545178 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,29 @@ if(UNIX AND NOT IOS) set(CMAKE_OSX_DEPLOYMENT_TARGET 12.0 CACHE STRING "Required macOS version") endif() -project(AusweisApp VERSION 2.1.1 LANGUAGES ${LANGUAGES}) +if(CMAKE_BUILD_TYPE) + string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE) +else() + set(CMAKE_BUILD_TYPE "DEBUG" CACHE STRING "build type configuration" FORCE) +endif() + +get_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(isMultiConfig) + if(NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE}) + endif() + + list(LENGTH CMAKE_CONFIGURATION_TYPES multiConfigCount) + if(NOT multiConfigCount EQUAL 1) + message(FATAL_ERROR "Multi-Config builds are not supported: QTBUG-123340") + endif() +endif() + +project(AusweisApp VERSION 2.2.0 LANGUAGES ${LANGUAGES}) + +if(ANDROID AND NOT GOVERNIKUS_TOOLCHAIN_FILE) + message(FATAL_ERROR "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_DIR}/android.toolchain.cmake is required") +endif() # Set TWEAK if not defined in PROJECT_VERSION above to # have a valid tweak version without propagating it @@ -29,10 +51,6 @@ if(APPLE AND NOT tools.only) enable_language(OBJCXX) endif() -if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND (IOS OR ANDROID)) - set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/dist" CACHE PATH "default install path" FORCE) -endif() - option(BUILD_SHARED_LIBS "Enable build of shared libraries") option(INTEGRATED_SDK "Build platform specific SDK" OFF) option(CONTAINER_SDK "Build container specific SDK" OFF) @@ -83,12 +101,6 @@ if("${PROJECT_BINARY_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}" AND NOT FORCE_SOURCE message(FATAL_ERROR "in tree building is not supported!") endif() -if(CMAKE_BUILD_TYPE) - string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE) -else() - set(CMAKE_BUILD_TYPE "DEBUG" CACHE STRING "build type configuration" FORCE) -endif() - set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -97,12 +109,16 @@ set(TEST_DIR ${PROJECT_SOURCE_DIR}/test) set(DOCS_DIR ${PROJECT_SOURCE_DIR}/docs) set(RESOURCES_DIR ${PROJECT_SOURCE_DIR}/resources) set(PACKAGING_DIR ${RESOURCES_DIR}/packaging) -set(COPYRIGHT_TEXT "2014-2023 ${VENDOR}") +set(COPYRIGHT_TEXT "2014-2024 ${VENDOR}") if(APPLE) string(REPLACE " \& " " \& " COPYRIGHT_TEXT ${COPYRIGHT_TEXT}) endif() set(BUNDLE_IDENTIFIER com.governikus.ausweisapp2) +if(NOT CONTAINER_SDK) + include(CTest) +endif() + include(Tools) include(DVCS) add_subdirectory(docs) @@ -114,28 +130,10 @@ if(tools.only) return() endif() -if(CMAKE_BUILD_TYPE STREQUAL "DEBUG" AND NOT CONTAINER_SDK) - set(VALGRIND_SUPPRESSIONS "${CMAKE_PREFIX_PATH}/test/valgrind.supp") - if(NOT EXISTS "${VALGRIND_SUPPRESSIONS}") - set(VALGRIND_SUPPRESSIONS "${CMAKE_SOURCE_DIR}/libs/test/valgrind.supp") - endif() - message(STATUS "Using valgrind suppressions: ${VALGRIND_SUPPRESSIONS}") - set(VALGRIND_COMMAND_OPTIONS "--tool=memcheck --leak-check=full --show-leak-kinds=definite --errors-for-leak-kinds=definite --error-exitcode=1 --gen-suppressions=all --suppressions=${VALGRIND_SUPPRESSIONS}") - - include(CTest) - configure_file("${CMAKE_DIR}/CTestCustom.cmake.in" "${CMAKE_BINARY_DIR}/CTestCustom.cmake" @ONLY) - - set(SONAR_CACHE_DIR ${CMAKE_BINARY_DIR}/../cache) - if(NOT EXISTS "${SONAR_CACHE_DIR}") - set(SONAR_CACHE_DIR ${CMAKE_BINARY_DIR}) - endif() - get_filename_component(SONAR_CACHE_DIR ${SONAR_CACHE_DIR} ABSOLUTE) - configure_file("${RESOURCES_DIR}/sonar-project.properties.in" "${CMAKE_BINARY_DIR}/sonar-project.properties" @ONLY) -endif() - option(USE_SMARTEID "Enable Smart-eID" OFF) include(Libraries) +include(PoliciesQt) include(Tools.Libraries) include(CompilerFlags) @@ -145,8 +143,7 @@ endif() add_subdirectory(resources) add_subdirectory(src) - -if(TARGET ${Qt}::Test AND NOT IOS) +if(BUILD_TESTING) add_subdirectory(test) endif() @@ -156,5 +153,23 @@ endif() include(Packaging) +if(BUILD_TESTING) + set(VALGRIND_SUPPRESSIONS "${CMAKE_PREFIX_PATH}/test/valgrind.supp") + if(NOT EXISTS "${VALGRIND_SUPPRESSIONS}") + set(VALGRIND_SUPPRESSIONS "${CMAKE_SOURCE_DIR}/libs/test/valgrind.supp") + endif() + message(STATUS "Using valgrind suppressions: ${VALGRIND_SUPPRESSIONS}") + set(VALGRIND_COMMAND_OPTIONS "--tool=memcheck --leak-check=full --show-leak-kinds=definite --errors-for-leak-kinds=definite --error-exitcode=1 --gen-suppressions=all --suppressions=${VALGRIND_SUPPRESSIONS}") + + configure_file("${CMAKE_DIR}/CTestCustom.cmake.in" "${CMAKE_BINARY_DIR}/CTestCustom.cmake" @ONLY) + + set(SONAR_CACHE_DIR ${CMAKE_BINARY_DIR}/../cache) + if(NOT EXISTS "${SONAR_CACHE_DIR}") + set(SONAR_CACHE_DIR ${CMAKE_BINARY_DIR}) + endif() + get_filename_component(SONAR_CACHE_DIR ${SONAR_CACHE_DIR} ABSOLUTE) + configure_file("${RESOURCES_DIR}/sonar-project.properties.in" "${CMAKE_BINARY_DIR}/sonar-project.properties" @ONLY) +endif() + include(FeatureSummary) FEATURE_SUMMARY(WHAT ALL) diff --git a/Dockerfile b/Dockerfile index d16519a52..1721cf6de 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -ARG ALPINE_VERSION=3.19 +ARG ALPINE_VERSION=3.20 FROM alpine:$ALPINE_VERSION as builder # Install development stuff @@ -52,7 +52,7 @@ COPY --from=builder /usr/local/share /usr/local/share COPY --from=builder /usr/local/bin/AusweisApp /usr/local/bin/AusweisApp RUN apk --no-cache upgrade -a && \ - apk --no-cache add tini pcsc-lite pcsc-lite-libs ccid pcsc-cyberjack acsccid eudev-libs doas && \ + apk --no-cache add tini libstdc++ pcsc-lite-libs eudev-libs doas && \ echo 'permit nopass :wheel' > /etc/doas.d/wheel.conf && \ adduser ausweisapp -G wheel -s /bin/sh -D && \ mkdir -p /home/ausweisapp/.config && chown ausweisapp: /home/ausweisapp/.config diff --git a/LICENSE.officially.txt b/LICENSE.officially.txt index 58e209dee..eea49d584 100644 --- a/LICENSE.officially.txt +++ b/LICENSE.officially.txt @@ -350,12 +350,12 @@ Die verwendeten Open-Source-Bibliotheken unterliegen den folgenden Nutzungsbedin OpenSSL Lizenz: Apache 2.0 - Version: 3.1.5 + Version: 3.3.1 Adresse: https://www.openssl.org/ Qt Lizenz: LGPL v3 - Version: 6.5.3 + Version: 6.7.2 Adresse: https://www.qt.io/ http_parser diff --git a/LICENSE.txt b/LICENSE.txt index efc2a43b6..81355c050 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -318,12 +318,12 @@ Die verwendeten Open-Source-Bibliotheken unterliegen den folgenden Nutzungsbedin OpenSSL Lizenz: Apache 2.0 - Version: 3.1.5 + Version: 3.3.1 Adresse: https://www.openssl.org/ Qt Lizenz: LGPL v3 - Version: 6.5.3 + Version: 6.7.2 Adresse: https://www.qt.io/ http_parser diff --git a/cmake/CompilerFlags.cmake b/cmake/CompilerFlags.cmake index af857951b..5eb53649f 100644 --- a/cmake/CompilerFlags.cmake +++ b/cmake/CompilerFlags.cmake @@ -6,10 +6,7 @@ add_definitions(-DQT_NO_CAST_TO_ASCII) add_definitions(-DQT_NO_FOREACH) add_definitions(-DQT_NO_KEYWORDS) add_definitions(-DQT_NO_EXCEPTIONS) - -if(NOT MSVC AND NOT CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC" AND QT5) - add_definitions(-DQT_STRICT_ITERATORS) -endif() +add_definitions(-DQT_NO_CONTEXTLESS_CONNECT) if(QT_VENDOR STREQUAL "Governikus") add_definitions(-DGOVERNIKUS_QT) @@ -168,7 +165,7 @@ else() endif() - # QTBUG-82978 + # QTBUG-82978, QTBUG-122004, QTBUG-122582 if(CMAKE_CXX_FLAGS MATCHES "-Wextra-semi-stmt") list(APPEND INCOMPATIBLE_QT_COMPILER_FLAGS "-Wno-extra-semi-stmt") endif() @@ -177,8 +174,18 @@ else() list(APPEND INCOMPATIBLE_QT_COMPILER_FLAGS "-Wno-useless-cast") endif() - if(CMAKE_CXX_FLAGS MATCHES "-Wconversion" AND MAC) - list(APPEND INCOMPATIBLE_QT_COMPILER_FLAGS "-Wno-sign-conversion") + if(CMAKE_CXX_FLAGS MATCHES "-Wconversion") + list(APPEND INCOMPATIBLE_QT_COMPILER_FLAGS "-Wno-conversion") + endif() + + # codereview: 541911 + if(CMAKE_CXX_FLAGS MATCHES "-Wnewline-eof") + list(APPEND INCOMPATIBLE_QT_COMPILER_FLAGS "-Wno-newline-eof") + endif() + + # QTBUG-114897 + if(QT_VERSION VERSION_LESS "6.5.3" AND CMAKE_CXX_FLAGS MATCHES "-Wshadow") + list(APPEND INCOMPATIBLE_QT_COMPILER_FLAGS "-Wno-shadow") endif() endif() diff --git a/cmake/Helper.cmake b/cmake/Helper.cmake index 6b3d77371..371549ffd 100644 --- a/cmake/Helper.cmake +++ b/cmake/Helper.cmake @@ -29,7 +29,7 @@ function(ADD_FLAG) endif() if(NOT _PARAM_LINK_VAR) - set(_PARAM_LINK_VAR CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS) + set(_PARAM_LINK_VAR CMAKE_EXE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS) endif() if(_PARAM_LINK) @@ -109,34 +109,6 @@ function(GET_PUBLIC_HEADER _target _out) endfunction() -function(QUERY_QMAKE _out _var) - if(NOT TARGET ${Qt}::qmake) - message(WARNING "qmake not found") - return() - endif() - - get_target_property(qmake_bin ${Qt}::qmake LOCATION) - - if (IOS OR ANDROID) - find_file(TARGET_QT_CONF target_qt.conf PATH_SUFFIXES /bin CMAKE_FIND_ROOT_PATH_BOTH) - if(NOT TARGET_QT_CONF) - message(FATAL_ERROR "Could not find target_qt.conf") - endif() - - set(QT_CONFIG -qtconf ${TARGET_QT_CONF}) - endif() - -execute_process(COMMAND "${qmake_bin}" ${QT_CONFIG} -query ${_var} - RESULT_VARIABLE _result - OUTPUT_VARIABLE _output - OUTPUT_STRIP_TRAILING_WHITESPACE) - - if(_result EQUAL 0) - set(${_out} "${_output}" PARENT_SCOPE) - endif() -endfunction() - - function(GET_FILE_MATCHER _result_remove _result_keep) if(NOT ANDROID) list(APPEND matcher_remove "_android") @@ -204,7 +176,7 @@ endfunction() function(ADD_PLATFORM_LIBRARY _name) set(options) set(oneValueArgs) - set(multiValueArgs PATH) + set(multiValueArgs PATH EXCLUDE) cmake_parse_arguments(_PARAM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) GET_FILE_EXTENSIONS(FILE_EXTENSIONS PATH ${_PARAM_PATH}) @@ -215,6 +187,21 @@ function(ADD_PLATFORM_LIBRARY _name) foreach(file ${FILES}) string(REPLACE "${CMAKE_SOURCE_DIR}" "" file_stripped "${file}") + if(_PARAM_EXCLUDE) + set(skip_file FALSE) + foreach(exclude ${_PARAM_EXCLUDE}) + if(file_stripped MATCHES "${exclude}") + set(skip_file TRUE) + break() + endif() + endforeach() + + if(skip_file) + list(REMOVE_ITEM FILES "${file}") + continue() + endif() + endif() + set(keep FALSE) foreach(match ${matcher_keep}) if("${file_stripped}" MATCHES ${match}) @@ -414,6 +401,25 @@ function(map_get_value _var _map _key) set(${_var} ${${_map}_${_key}} PARENT_SCOPE) endfunction() +function(configure_files _path _pattern _destination) + set(options FLATTEN) + set(oneValueArgs) + set(multiValueArgs) + cmake_parse_arguments(_PARAM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + foreach(pattern ${_pattern}) + file(GLOB_RECURSE files RELATIVE "${_path}" "${_path}/${pattern}") + foreach(entry ${files}) + if(_PARAM_FLATTEN) + get_filename_component(destEntry "${entry}" NAME) + else() + set(destEntry ${entry}) + endif() + + configure_file("${_path}/${entry}" "${_destination}/${destEntry}" COPYONLY) + endforeach() + endforeach() +endfunction() if(WIN32) if(WIN_SIGN_SUBJECT_NAME OR (WIN_SIGN_KEYSTORE AND WIN_SIGN_KEYSTORE_PSW)) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index fe7c0b737..8d880c78e 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -189,88 +189,12 @@ elseif(IOS) elseif(ANDROID) - set(ANDROID_PACKAGE_SRC_DIR ${PROJECT_BINARY_DIR}/package-src-dir) - set(ANDROID_DEST libs/${CMAKE_ANDROID_ARCH_ABI}) - set(PERMISSIONS PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) - install(TARGETS AusweisAppBinary DESTINATION ${ANDROID_DEST} ${PERMISSIONS} COMPONENT Application) - - set(RESOURCES_IMG_ANDROID_DIR ${RESOURCES_DIR}/images/android) - if(BUILD_PREVIEW) - set(ANDROID_LAUNCHER_ICON "npa_preview.png") - set(ANDROID_SPLASH_SCREEN_ICON_NAME "splash_npa_preview.png") - elseif(IS_BETA_VERSION) - set(ANDROID_LAUNCHER_ICON "npa_beta.png") - set(ANDROID_SPLASH_SCREEN_ICON_NAME "splash_npa_beta.png") - else() - set(ANDROID_LAUNCHER_ICON "npa.png") - set(ANDROID_SPLASH_SCREEN_ICON_NAME "splash_npa.png") - endif() - if(INTEGRATED_SDK) - set(ANDROID_MANIFEST AndroidManifest.xml.aar.in) - foreach(entry network/WifiInfo ui/aidl/AidlBinder android/LogHandler android/BootstrapHelper android/AusweisApp2Service android/AusweisApp2LocalIfdServiceConnection) - set(_java_file "${SRC_DIR}/${entry}.java") - if(NOT EXISTS "${_java_file}") - message(FATAL_ERROR "Cannot find file: ${_java_file}") - endif() - list(APPEND JAVA_FILES "${_java_file}") - endforeach() - - install(FILES ${PACKAGING_DIR}/android/res/values/strings.xml DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/res/values COMPONENT Runtime) - else() - set(ANDROID_MANIFEST AndroidManifest.xml.apk.in) - - if(USE_SMARTEID) - set(LOCAL_IFD_SERVICE_ENABLED true) - else() - set(LOCAL_IFD_SERVICE_ENABLED false) - endif() - - foreach(entry ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi) - install(FILES ${RESOURCES_IMG_ANDROID_DIR}/${entry}/background_npa.png DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/res/mipmap-${entry} COMPONENT Runtime RENAME npa_background.png) - install(FILES ${RESOURCES_IMG_ANDROID_DIR}/${entry}/foreground_${ANDROID_LAUNCHER_ICON} DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/res/mipmap-${entry} COMPONENT Runtime RENAME npa_foreground.png) - install(FILES ${RESOURCES_IMG_ANDROID_DIR}/${entry}/monochrome_${ANDROID_LAUNCHER_ICON} DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/res/mipmap-${entry} COMPONENT Runtime RENAME npa_monochrome.png) - install(FILES ${RESOURCES_IMG_ANDROID_DIR}/${entry}/${ANDROID_SPLASH_SCREEN_ICON_NAME} DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/res/drawable-${entry} COMPONENT Runtime RENAME splash_npa.png) - endforeach() - - install(DIRECTORY ${PACKAGING_DIR}/android/res DESTINATION ${ANDROID_PACKAGE_SRC_DIR} COMPONENT Runtime) - - file(GLOB_RECURSE JAVA_FILES "${SRC_DIR}/*.java") - endif() - - install(FILES ${JAVA_FILES} DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/src COMPONENT Runtime) - install(FILES ${PACKAGING_DIR}/android/IAusweisApp2Sdk.aidl DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/src/com/governikus/ausweisapp2/ COMPONENT Runtime) - install(FILES ${PACKAGING_DIR}/android/IAusweisApp2SdkCallback.aidl DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/src/com/governikus/ausweisapp2/ COMPONENT Runtime) - - set(ANDROID_VERSION_NAME ${VERSION_DVCS}) - configure_file(${PACKAGING_DIR}/android/${ANDROID_MANIFEST} ${ANDROID_PACKAGE_SRC_DIR}/AndroidManifest.xml @ONLY) - if(INTEGRATED_SDK) - set(QML_ROOT_PATH []) - set(ANDROID_ROOT_LOGGER "java") - else() - set(QML_ROOT_PATH [\"${RESOURCES_DIR}/qml\"]) - set(ANDROID_ROOT_LOGGER "") - configure_file(${PACKAGING_DIR}/android/fileprovider.xml ${ANDROID_PACKAGE_SRC_DIR}/res/xml/fileprovider.xml COPYONLY) - configure_file(${PACKAGING_DIR}/android/full_backup_content.xml ${ANDROID_PACKAGE_SRC_DIR}/res/xml/full_backup_content.xml COPYONLY) - configure_file(${PACKAGING_DIR}/android/data_extraction_rules.xml ${ANDROID_PACKAGE_SRC_DIR}/res/xml/data_extraction_rules.xml COPYONLY) + add_custom_command(TARGET AusweisAppBinary POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different "$" "${ANDROID_BUILD_DIR}/libs/${CMAKE_ANDROID_ARCH_ABI}/$" + ) endif() - set(ANDROID_SO_NAME libAusweisApp_${CMAKE_ANDROID_ARCH_ABI}.so) - set(ANDROID_APP_BINARY "${CMAKE_INSTALL_PREFIX}/${ANDROID_DEST}/${ANDROID_SO_NAME}") - set(SYMBOL_FOLDER "${CMAKE_BINARY_DIR}/debug.symbols") - set(ANDROID_APP_SYMBOLS "${SYMBOL_FOLDER}/${ANDROID_SO_NAME}") - - install(CODE - " - execute_process(COMMAND \"${CMAKE_COMMAND}\" -E make_directory \"${SYMBOL_FOLDER}\") - execute_process(COMMAND \"${CMAKE_OBJCOPY}\" \"--only-keep-debug\" \"${ANDROID_APP_BINARY}\" \"${ANDROID_APP_SYMBOLS}\") - " COMPONENT Runtime) - - set(ANDROID_DEPLOYMENT_SETTINGS ${PROJECT_BINARY_DIR}/libAusweisApp.so-deployment-settings.json CACHE INTERNAL "apk deployment" FORCE) - configure_file(${PACKAGING_DIR}/android/libAusweisApp.so-deployment-settings.json.in ${ANDROID_DEPLOYMENT_SETTINGS} @ONLY) - configure_file(${PACKAGING_DIR}/android/gradle.properties.in ${CMAKE_INSTALL_PREFIX}/gradle.properties @ONLY) - - set(DEFAULT_FILE_DESTINATION ${ANDROID_PACKAGE_SRC_DIR}/assets) elseif(UNIX) if(BUILD_SHARED_LIBS) @@ -320,7 +244,7 @@ if(LINUX OR WIN32 OR MAC) endif() -if(NOT INTEGRATED_SDK OR CONTAINER_SDK) +if((NOT INTEGRATED_SDK OR CONTAINER_SDK) AND NOT ANDROID) # resources file install(FILES ${RCC} DESTINATION ${DEFAULT_FILE_DESTINATION} COMPONENT Runtime) endif() diff --git a/cmake/Libraries.cmake b/cmake/Libraries.cmake index 1db862a88..1035a35dc 100644 --- a/cmake/Libraries.cmake +++ b/cmake/Libraries.cmake @@ -3,7 +3,7 @@ if(DESKTOP) set(MIN_QT_VERSION 6.4) else() - set(MIN_QT_VERSION 6.5) + set(MIN_QT_VERSION 6.7) endif() if(IOS OR ANDROID) @@ -21,12 +21,11 @@ if(IOS OR ANDROID) message(FATAL_ERROR "QT_HOST_PATH does not exist") endif() - message(STATUS "Using QT_HOST_PATH: ${QT_HOST_PATH}") - set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${QT_HOST_PATH} ) + message(STATUS "QT_HOST_PATH: ${QT_HOST_PATH}") endif() set(Qt Qt6) -find_package(${Qt} ${MIN_QT_VERSION} COMPONENTS Core Concurrent Network StateMachine REQUIRED CMAKE_FIND_ROOT_PATH_BOTH) +find_package(${Qt} ${MIN_QT_VERSION} REQUIRED COMPONENTS Core Concurrent Network StateMachine CMAKE_FIND_ROOT_PATH_BOTH) set(QT_VERSION "${Qt6Core_VERSION}") if(NOT CONTAINER_SDK) @@ -54,9 +53,8 @@ elseif(CONTAINER_SDK) endif() -QUERY_QMAKE(QT_INSTALL_ARCHDATA QT_INSTALL_ARCHDATA) -QUERY_QMAKE(QT_INSTALL_TRANSLATIONS QT_INSTALL_TRANSLATIONS) - +get_filename_component(QT_INSTALL_ARCHDATA ${QT6_INSTALL_PREFIX}/${QT6_INSTALL_ARCHDATA} ABSOLUTE) +get_filename_component(QT_INSTALL_TRANSLATIONS ${QT6_INSTALL_PREFIX}/${QT6_INSTALL_TRANSLATIONS} ABSOLUTE) message(STATUS "QT_INSTALL_ARCHDATA: ${QT_INSTALL_ARCHDATA}") message(STATUS "QT_INSTALL_TRANSLATIONS: ${QT_INSTALL_TRANSLATIONS}") @@ -86,10 +84,10 @@ endif() if(MINGW) find_package(PCSC REQUIRED) - set(WIN_DEFAULT_LIBS "-ladvapi32" "-lkernel32" "-lole32" "-lsetupapi" "-lversion" "-liphlpapi") + set(WIN_DEFAULT_LIBS "-ladvapi32" "-lkernel32" "-lole32" "-lsetupapi" "-lversion" "-liphlpapi" "-ldwmapi") elseif(MSVC OR CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC") find_package(PCSC REQUIRED) - set(WIN_DEFAULT_LIBS setupapi.lib version.lib iphlpapi.lib) + set(WIN_DEFAULT_LIBS setupapi.lib version.lib iphlpapi.lib dwmapi.lib) elseif(ANDROID) elseif(IOS) @@ -131,20 +129,25 @@ elseif(UNIX) endif() -if(BUILD_TESTING AND NOT CONTAINER_SDK) - list(APPEND QT_COMPONENTS Test) - - if(INTEGRATED_SDK) - find_package(Threads REQUIRED) +if(BUILD_TESTING) + if(CMAKE_BUILD_TYPE STREQUAL DEBUG) + set(QT_TEST_COMPONENTS QT_COMPONENTS) + else() + set(QT_TEST_COMPONENTS QT_COMPONENTS_OPTIONAL) endif() + list(APPEND ${QT_TEST_COMPONENTS} Test) if(NOT INTEGRATED_SDK) - list(APPEND QT_COMPONENTS QuickTest) + list(APPEND ${QT_TEST_COMPONENTS} QuickTest) + endif() + + if(INTEGRATED_SDK) + find_package(Threads REQUIRED) endif() endif() if(QT_COMPONENTS) - find_package(${Qt} ${MIN_QT_VERSION} COMPONENTS ${QT_COMPONENTS} REQUIRED) + find_package(${Qt} ${MIN_QT_VERSION} REQUIRED COMPONENTS ${QT_COMPONENTS} OPTIONAL_COMPONENTS ${QT_COMPONENTS_OPTIONAL}) endif() if(LINUX OR BSD) diff --git a/cmake/Messages.cmake b/cmake/Messages.cmake index e3c63199d..417302f9b 100644 --- a/cmake/Messages.cmake +++ b/cmake/Messages.cmake @@ -11,6 +11,7 @@ if(APPLE) message(STATUS "CMAKE_OSX_DEPLOYMENT_TARGET: ${CMAKE_OSX_DEPLOYMENT_TARGET}") endif() message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") +message(STATUS "CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}") message(STATUS "CMAKE_CXX_SIMULATE_ID: ${CMAKE_CXX_SIMULATE_ID}") if(ANDROID) @@ -21,7 +22,7 @@ if(ANDROID) message(STATUS "CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION: ${CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION}") message(STATUS "CMAKE_CXX_ANDROID_TOOLCHAIN_MACHINE: ${CMAKE_CXX_ANDROID_TOOLCHAIN_MACHINE}") - message(STATUS "ANDROID_SDK: ${ANDROID_SDK}") + message(STATUS "ANDROID_SDK_ROOT: ${ANDROID_SDK_ROOT}") message(STATUS "ANDROID_BUILD_TOOLS_REVISION: ${ANDROID_BUILD_TOOLS_REVISION}") message(STATUS "ANDROID_NDK_REVISION: ${ANDROID_NDK_REVISION}") @@ -29,3 +30,4 @@ endif() message(STATUS "BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}") +message(STATUS "BUILD_TESTING: ${BUILD_TESTING}") diff --git a/cmake/Packaging.android.cmake b/cmake/Packaging.android.cmake new file mode 100644 index 000000000..3d5d4d712 --- /dev/null +++ b/cmake/Packaging.android.cmake @@ -0,0 +1,177 @@ +set(RESOURCES_IMG_ANDROID_DIR ${RESOURCES_DIR}/images/android) +if(BUILD_PREVIEW) + set(ANDROID_LAUNCHER_ICON "npa_preview.png") + set(ANDROID_SPLASH_SCREEN_ICON_NAME "splash_npa_preview.png") +elseif(IS_BETA_VERSION) + set(ANDROID_LAUNCHER_ICON "npa_beta.png") + set(ANDROID_SPLASH_SCREEN_ICON_NAME "splash_npa_beta.png") +else() + set(ANDROID_LAUNCHER_ICON "npa.png") + set(ANDROID_SPLASH_SCREEN_ICON_NAME "splash_npa.png") +endif() + +if(INTEGRATED_SDK) + set(ANDROID_MANIFEST AndroidManifest.xml.aar.in) + set(JAVA_FILES network/WifiInfo* ui/aidl/AidlBinder* android/LogHandler* android/BootstrapHelper* android/AusweisApp2Service* android/AusweisApp2LocalIfdServiceConnection*) + configure_files("${SRC_DIR}" "${JAVA_FILES}" "${ANDROID_PACKAGE_SRC_DIR}/src" FLATTEN) + + configure_file(${PACKAGING_DIR}/android/res/values/strings.xml ${ANDROID_PACKAGE_SRC_DIR}/res/values/strings.xml COPYONLY) +else() + set(ANDROID_MANIFEST AndroidManifest.xml.apk.in) + + if(USE_SMARTEID) + set(LOCAL_IFD_SERVICE_ENABLED true) + else() + set(LOCAL_IFD_SERVICE_ENABLED false) + endif() + + foreach(entry ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi) + configure_file(${RESOURCES_IMG_ANDROID_DIR}/${entry}/background_npa.png ${ANDROID_PACKAGE_SRC_DIR}/res/mipmap-${entry}/npa_background.png COPYONLY) + configure_file(${RESOURCES_IMG_ANDROID_DIR}/${entry}/foreground_${ANDROID_LAUNCHER_ICON} ${ANDROID_PACKAGE_SRC_DIR}/res/mipmap-${entry}/npa_foreground.png COPYONLY) + configure_file(${RESOURCES_IMG_ANDROID_DIR}/${entry}/monochrome_${ANDROID_LAUNCHER_ICON} ${ANDROID_PACKAGE_SRC_DIR}/res/mipmap-${entry}/npa_monochrome.png COPYONLY) + configure_file(${RESOURCES_IMG_ANDROID_DIR}/${entry}/${ANDROID_SPLASH_SCREEN_ICON_NAME} ${ANDROID_PACKAGE_SRC_DIR}/res/drawable-${entry}/splash_npa.png COPYONLY) + endforeach() + + configure_files("${PACKAGING_DIR}/android" "res/*" "${ANDROID_PACKAGE_SRC_DIR}") + configure_files("${SRC_DIR}" "*.java" "${ANDROID_PACKAGE_SRC_DIR}/src" FLATTEN) +endif() + +configure_file(${PACKAGING_DIR}/android/IAusweisApp2Sdk.aidl ${ANDROID_PACKAGE_SRC_DIR}/src/com/governikus/ausweisapp2/IAusweisApp2Sdk.aidl COPYONLY) +configure_file(${PACKAGING_DIR}/android/IAusweisApp2SdkCallback.aidl ${ANDROID_PACKAGE_SRC_DIR}/src/com/governikus/ausweisapp2/IAusweisApp2SdkCallback.aidl COPYONLY) + +set(ANDROID_VERSION_NAME ${VERSION_DVCS}) +configure_file(${PACKAGING_DIR}/android/${ANDROID_MANIFEST} ${ANDROID_PACKAGE_SRC_DIR}/AndroidManifest.xml @ONLY) +if(INTEGRATED_SDK) + set(ANDROID_ROOT_LOGGER "java") + set(ANDROID_DEPLOYMENT_SETTINGS ${PROJECT_BINARY_DIR}/libAusweisApp.so-deployment-settings.json CACHE INTERNAL "aar deployment" FORCE) + configure_file(${PACKAGING_DIR}/android/libAusweisApp.so-deployment-settings.json.in ${ANDROID_DEPLOYMENT_SETTINGS} @ONLY) +else() + set(ANDROID_ROOT_LOGGER "") + configure_file(${PACKAGING_DIR}/android/fileprovider.xml ${ANDROID_PACKAGE_SRC_DIR}/res/xml/fileprovider.xml COPYONLY) + configure_file(${PACKAGING_DIR}/android/full_backup_content.xml ${ANDROID_PACKAGE_SRC_DIR}/res/xml/full_backup_content.xml COPYONLY) + configure_file(${PACKAGING_DIR}/android/data_extraction_rules.xml ${ANDROID_PACKAGE_SRC_DIR}/res/xml/data_extraction_rules.xml COPYONLY) +endif() + + +set(QT_BUILD_GRADLE "${QT_INSTALL_ARCHDATA}/src/android/templates/build.gradle") +set(BUILD_GRADLE_APPEND "${PACKAGING_DIR}/android/build.gradle.append") +set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${QT_BUILD_GRADLE}") +set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${BUILD_GRADLE_APPEND}") + +file(READ "${QT_BUILD_GRADLE}" BUILD_GRADLE) + +if(INTEGRATED_SDK) + string(REPLACE "apply plugin: 'com.android.application'" "apply plugin: 'com.android.library'" BUILD_GRADLE "${BUILD_GRADLE}") +endif() + +file(WRITE "${ANDROID_BUILD_DIR}/build.gradle" "${BUILD_GRADLE}") +file(READ "${BUILD_GRADLE_APPEND}" BUILD_GRADLE) +file(APPEND "${ANDROID_BUILD_DIR}/build.gradle" "${BUILD_GRADLE}") + +if(INTEGRATED_SDK) + set(BUILD_GRADLE_APPEND "${PACKAGING_DIR}/android/build.gradle.append.aar") + file(READ "${BUILD_GRADLE_APPEND}" BUILD_GRADLE) + file(APPEND "${ANDROID_BUILD_DIR}/build.gradle" "${BUILD_GRADLE}") +elseif(USE_SMARTEID) + set(BUILD_GRADLE_APPEND "${PACKAGING_DIR}/android/build.gradle.append.smarteid") + file(READ "${BUILD_GRADLE_APPEND}" BUILD_GRADLE) + file(APPEND "${ANDROID_BUILD_DIR}/build.gradle" "${BUILD_GRADLE}") +endif() + +if(NOT INTEGRATED_SDK) + file(APPEND "${ANDROID_BUILD_DIR}/build.gradle" "android.defaultConfig.applicationId '${BUNDLE_IDENTIFIER}'\n") + + if(BUILD_PREVIEW) + file(APPEND "${ANDROID_BUILD_DIR}/build.gradle" "android.defaultConfig.applicationIdSuffix '.dev'\n") + endif() +endif() + +option(ANDROID_LINT "Lint Android package" ON) +if(NOT ANDROID_LINT) + file(APPEND "${ANDROID_BUILD_DIR}/build.gradle" "tasks.lint.enabled = false\n") +endif() + +if(INTEGRATED_SDK) + set(ANDROID_FILE_EXT aar) + file(APPEND "${ANDROID_BUILD_DIR}/build.gradle" "android.defaultConfig.consumerProguardFiles 'consumer-rules.pro'\n") + if(DEFINED dvcs_revision) + set(POM_SNAPSHOT "-SNAPSHOT") + endif() + configure_file(${PACKAGING_DIR}/android/pom.xml.in ${ANDROID_BUILD_DIR}/${CPACK_PACKAGE_FILE_NAME}.pom @ONLY) + configure_file("${PACKAGING_DIR}/android/lint.aar.xml" "${ANDROID_BUILD_DIR}/lint.xml" COPYONLY) + configure_file("${PACKAGING_DIR}/android/consumer-rules.pro" "${ANDROID_BUILD_DIR}/consumer-rules.pro" COPYONLY) +else() + set(ANDROID_FILE_EXT apk) + configure_file("${PACKAGING_DIR}/android/lint.apk.xml" "${ANDROID_BUILD_DIR}/lint.xml" COPYONLY) +endif() +configure_file(${PACKAGING_DIR}/android/gradle.properties.in ${ANDROID_BUILD_DIR}/gradle.properties @ONLY) + +message(STATUS "Prepare ${ANDROID_FILE_EXT} file generation") + +if(CMAKE_BUILD_TYPE STREQUAL "DEBUG") + if(QT_ANDROID_SIGN_APK) + set(ANDROID_FILE ${ANDROID_BUILD_NAME}-debug-signed.${ANDROID_FILE_EXT}) + else() + set(ANDROID_FILE ${ANDROID_BUILD_NAME}-debug.${ANDROID_FILE_EXT}) + endif() +else() + if(INTEGRATED_SDK) + set(DEPLOY_CMD_SIGN --release) + set(ANDROID_FILE ${ANDROID_BUILD_NAME}-release.aar) + elseif(QT_ANDROID_SIGN_APK) + message(STATUS "Release build will be signed using: $ENV{QT_ANDROID_KEYSTORE_PATH} | Alias: $ENV{QT_ANDROID_KEYSTORE_ALIAS}") + set(ANDROID_FILE ${ANDROID_BUILD_NAME}-release-signed.apk) + else() + set(ANDROID_FILE ${ANDROID_BUILD_NAME}-release-unsigned.apk) + message(WARNING "Cannot sign release build! Set environment like QT_ANDROID_KEYSTORE_PATH") + endif() +endif() + +set(SOURCE_ANDROID_FILE ${ANDROID_BUILD_DIR}/build/outputs/${ANDROID_FILE_EXT}) +if(NOT INTEGRATED_SDK) + if(CMAKE_BUILD_TYPE STREQUAL "DEBUG") + set(SOURCE_ANDROID_FILE ${SOURCE_ANDROID_FILE}/debug) + else() + set(SOURCE_ANDROID_FILE ${SOURCE_ANDROID_FILE}/release) + endif() +endif() +set(SOURCE_ANDROID_FILE ${SOURCE_ANDROID_FILE}/${ANDROID_FILE}) + +set(DESTINATION_ANDROID_FILE ${PROJECT_BINARY_DIR}/dist/${CPACK_PACKAGE_FILE_NAME}.${ANDROID_FILE_EXT}) +if(INTEGRATED_SDK) + find_program(androiddeployqt androiddeployqt HINTS "${QT_HOST_PATH}/bin" CMAKE_FIND_ROOT_PATH_BOTH) + if(NOT androiddeployqt) + message(FATAL_ERROR "Cannot find androiddeployqt to create AARs") + endif() + message(STATUS "Using androiddeployqt: ${androiddeployqt}") + set(DEPLOY_CMD ${androiddeployqt} --verbose --gradle --input ${ANDROID_DEPLOYMENT_SETTINGS} --android-platform android-${ANDROID_TARGET_SDK_VERSION} --output ${ANDROID_BUILD_DIR} ${DEPLOY_CMD_SIGN}) + add_custom_target(${ANDROID_FILE_EXT} + COMMAND ${DEPLOY_CMD} + DEPENDS AusweisAppBinary + USES_TERMINAL) +endif() + +add_custom_command(TARGET ${ANDROID_FILE_EXT} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SOURCE_ANDROID_FILE}" "${DESTINATION_ANDROID_FILE}" + COMMAND ${ANDROID_BUILD_DIR}/gradlew sourcesJar lint + COMMAND ${CMAKE_COMMAND} -E copy_if_different "build/libs/${ANDROID_BUILD_NAME}-sources.jar" "${PROJECT_BINARY_DIR}/dist/${CPACK_PACKAGE_FILE_NAME}-sources.jar" + WORKING_DIRECTORY ${ANDROID_BUILD_DIR} + USES_TERMINAL) + +if(INTEGRATED_SDK) + add_custom_command(TARGET aar POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${ANDROID_BUILD_DIR}/${CPACK_PACKAGE_FILE_NAME}.pom" "${PROJECT_BINARY_DIR}/dist/${CPACK_PACKAGE_FILE_NAME}.pom" + WORKING_DIRECTORY ${ANDROID_BUILD_DIR}) +else() + find_program(apksigner apksigner HINTS ${ANDROID_SDK_ROOT}/build-tools/${ANDROID_BUILD_TOOLS_REVISION} CMAKE_FIND_ROOT_PATH_BOTH) + if(apksigner) + add_custom_target(verify.signature COMMAND ${apksigner} verify --verbose --print-certs -Werr ${DESTINATION_ANDROID_FILE}) + endif() + + find_program(aapt NAMES aapt2 aapt HINTS ${ANDROID_SDK_ROOT}/build-tools/${ANDROID_BUILD_TOOLS_REVISION} CMAKE_FIND_ROOT_PATH_BOTH) + if(aapt) + set(ANDROID_DUMP ${DESTINATION_ANDROID_FILE}.dump) + add_custom_command(OUTPUT ${ANDROID_DUMP} COMMAND ${aapt} dump badging ${DESTINATION_ANDROID_FILE} > ${ANDROID_DUMP}) + add_custom_target(dump.apk DEPENDS ${ANDROID_DUMP}) + endif() +endif() diff --git a/cmake/Packaging.cmake b/cmake/Packaging.cmake index c147e4e1c..dd5b2771c 100644 --- a/cmake/Packaging.cmake +++ b/cmake/Packaging.cmake @@ -147,124 +147,13 @@ elseif(APPLE) set(CPACK_DMG_BACKGROUND_IMAGE ${RESOURCES_DIR}/images/macos/dmg_background.png) set(CPACK_DMG_SLA_DIR ${MACOS_PACKAGING_DIR}/sla) set(CPACK_DMG_SLA_LANGUAGES English German) - set(CPACK_DMG_DS_STORE_SETUP_SCRIPT ${MACOS_PACKAGING_DIR}/prepare-ds_store.applescript) -elseif(ANDROID) - find_program(androiddeployqt androiddeployqt CMAKE_FIND_ROOT_PATH_BOTH) - if(NOT androiddeployqt) - message(FATAL_ERROR "Cannot find androiddeployqt to create APKs") - endif() - message(STATUS "Using androiddeployqt: ${androiddeployqt}") - - set(QT_BUILD_GRADLE "${QT_INSTALL_ARCHDATA}/src/android/templates/build.gradle") - set(BUILD_GRADLE_APPEND "${PACKAGING_DIR}/android/build.gradle.append") - set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${QT_BUILD_GRADLE}") - set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${BUILD_GRADLE_APPEND}") - - file(READ "${QT_BUILD_GRADLE}" BUILD_GRADLE) - - if(INTEGRATED_SDK) - string(REPLACE "apply plugin: 'com.android.application'" "apply plugin: 'com.android.library'" BUILD_GRADLE "${BUILD_GRADLE}") - endif() - - file(WRITE "${CMAKE_INSTALL_PREFIX}/build.gradle" "${BUILD_GRADLE}") - file(READ "${BUILD_GRADLE_APPEND}" BUILD_GRADLE) - file(APPEND "${CMAKE_INSTALL_PREFIX}/build.gradle" "${BUILD_GRADLE}") - - if(INTEGRATED_SDK) - set(BUILD_GRADLE_APPEND "${PACKAGING_DIR}/android/build.gradle.append.aar") - file(READ "${BUILD_GRADLE_APPEND}" BUILD_GRADLE) - file(APPEND "${CMAKE_INSTALL_PREFIX}/build.gradle" "${BUILD_GRADLE}") - elseif(USE_SMARTEID) - set(BUILD_GRADLE_APPEND "${PACKAGING_DIR}/android/build.gradle.append.smarteid") - file(READ "${BUILD_GRADLE_APPEND}" BUILD_GRADLE) - file(APPEND "${CMAKE_INSTALL_PREFIX}/build.gradle" "${BUILD_GRADLE}") - endif() - - if(NOT INTEGRATED_SDK) - file(APPEND "${CMAKE_INSTALL_PREFIX}/build.gradle" "android.defaultConfig.applicationId '${BUNDLE_IDENTIFIER}'\n") - - if(BUILD_PREVIEW) - file(APPEND "${CMAKE_INSTALL_PREFIX}/build.gradle" "android.defaultConfig.applicationIdSuffix '.dev'\n") - endif() - endif() + # Temporarily toggle the following lines to generate a new DS_Store, preferably with CI. + # set(CPACK_DMG_DS_STORE_SETUP_SCRIPT ${MACOS_PACKAGING_DIR}/prepare-ds_store.applescript) + set(CPACK_DMG_DS_STORE ${MACOS_PACKAGING_DIR}/DS_Store) - option(ANDROID_LINT "Lint Android package" ON) - if(NOT ANDROID_LINT) - file(APPEND "${CMAKE_INSTALL_PREFIX}/build.gradle" "tasks.lint.enabled = false\n") - endif() - - if(INTEGRATED_SDK) - set(ANDROID_FILE_EXT aar) - file(APPEND "${CMAKE_INSTALL_PREFIX}/build.gradle" "android.defaultConfig.consumerProguardFiles 'consumer-rules.pro'\n") - if(DEFINED dvcs_revision) - set(POM_SNAPSHOT "-SNAPSHOT") - endif() - configure_file(${PACKAGING_DIR}/android/pom.xml.in ${CMAKE_INSTALL_PREFIX}/${CPACK_PACKAGE_FILE_NAME}.pom @ONLY) - configure_file("${PACKAGING_DIR}/android/lint.aar.xml" "${CMAKE_INSTALL_PREFIX}/lint.xml" COPYONLY) - configure_file("${PACKAGING_DIR}/android/consumer-rules.pro" "${CMAKE_INSTALL_PREFIX}/consumer-rules.pro" COPYONLY) - else() - set(ANDROID_FILE_EXT apk) - configure_file("${PACKAGING_DIR}/android/lint.apk.xml" "${CMAKE_INSTALL_PREFIX}/lint.xml" COPYONLY) - endif() - message(STATUS "Prepare ${ANDROID_FILE_EXT} file generation") - - if(CMAKE_BUILD_TYPE STREQUAL "DEBUG") - set(ANDROID_FILE dist-debug.${ANDROID_FILE_EXT}) - else() - set(DEPLOY_CMD_SIGN --release) - - if(INTEGRATED_SDK) - set(ANDROID_FILE dist-release.aar) - elseif(DEFINED ENV{QT_ANDROID_KEYSTORE_PATH} AND DEFINED ENV{QT_ANDROID_KEYSTORE_ALIAS} AND DEFINED ENV{QT_ANDROID_KEYSTORE_STORE_PASS}) - message(STATUS "Release build will be signed using: $ENV{QT_ANDROID_KEYSTORE_PATH} | Alias: $ENV{QT_ANDROID_KEYSTORE_ALIAS}") - set(DEPLOY_CMD_SIGN ${DEPLOY_CMD_SIGN} --sign) - set(ANDROID_FILE dist-release-signed.apk) - else() - set(ANDROID_FILE dist-release-unsigned.apk) - message(WARNING "Cannot sign release build! Set environment like QT_ANDROID_KEYSTORE_PATH") - endif() - endif() - - set(DEPLOY_CMD ${androiddeployqt} --verbose --gradle --input ${ANDROID_DEPLOYMENT_SETTINGS} --android-platform android-${ANDROID_TARGET_SDK_VERSION} --output ${CMAKE_INSTALL_PREFIX} ${DEPLOY_CMD_SIGN}) - set(SOURCE_ANDROID_FILE ${CMAKE_INSTALL_PREFIX}/build/outputs/${ANDROID_FILE_EXT}) - - if(NOT INTEGRATED_SDK) - if(CMAKE_BUILD_TYPE STREQUAL "DEBUG") - set(SOURCE_ANDROID_FILE ${SOURCE_ANDROID_FILE}/debug) - else() - set(SOURCE_ANDROID_FILE ${SOURCE_ANDROID_FILE}/release) - endif() - endif() - - set(SOURCE_ANDROID_FILE ${SOURCE_ANDROID_FILE}/${ANDROID_FILE}) - - set(DESTINATION_ANDROID_FILE ${CMAKE_INSTALL_PREFIX}/${CPACK_PACKAGE_FILE_NAME}.${ANDROID_FILE_EXT}) - # Add DEPENDS install someday - # https://gitlab.kitware.com/cmake/cmake/issues/8438 - add_custom_target(${ANDROID_FILE_EXT} - COMMAND ${DEPLOY_CMD} - COMMAND ${CMAKE_COMMAND} -E copy ${SOURCE_ANDROID_FILE} ${DESTINATION_ANDROID_FILE} - USES_TERMINAL) - - add_custom_command(TARGET ${ANDROID_FILE_EXT} POST_BUILD - COMMAND ${CMAKE_INSTALL_PREFIX}/gradlew sourcesJar lint - COMMAND ${CMAKE_COMMAND} -E copy build/libs/dist-sources.jar ${CPACK_PACKAGE_FILE_NAME}-sources.jar - WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}) - - if(NOT INTEGRATED_SDK) - find_program(apksigner apksigner HINTS ${ANDROID_SDK}/build-tools/${ANDROID_BUILD_TOOLS_REVISION} CMAKE_FIND_ROOT_PATH_BOTH) - if(apksigner) - add_custom_target(verify.signature COMMAND ${apksigner} verify --verbose --print-certs -Werr ${DESTINATION_ANDROID_FILE}) - endif() - - find_program(aapt NAMES aapt2 aapt HINTS ${ANDROID_SDK}/build-tools/${ANDROID_BUILD_TOOLS_REVISION} CMAKE_FIND_ROOT_PATH_BOTH) - if(aapt) - set(ANDROID_DUMP ${DESTINATION_ANDROID_FILE}.dump) - add_custom_command(OUTPUT ${ANDROID_DUMP} COMMAND ${aapt} dump badging ${DESTINATION_ANDROID_FILE} > ${ANDROID_DUMP}) - add_custom_target(dump.apk DEPENDS ${ANDROID_DUMP}) - endif() - endif() +elseif(ANDROID) + include(Packaging.android) elseif(UNIX) set(CPACK_GENERATOR STGZ) diff --git a/cmake/PoliciesQt.cmake b/cmake/PoliciesQt.cmake new file mode 100644 index 000000000..3cb44a55c --- /dev/null +++ b/cmake/PoliciesQt.cmake @@ -0,0 +1,7 @@ +if(QT_KNOWN_POLICY_QTP0001) + qt_policy(SET QTP0001 NEW) +endif() + +if(QT_KNOWN_POLICY_QTP0002) + qt_policy(SET QTP0002 NEW) +endif() diff --git a/cmake/Tools.Libraries.cmake b/cmake/Tools.Libraries.cmake index f9b8a6539..9f1727405 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 && ${QMLFORMAT} -i -n -l unix -t -w 4) + set(QMLFORMAT_CMD ${QMLFORMAT} -i -n -l unix -t -w 4) set(FORMATTING_FILE ${PROJECT_BINARY_DIR}/formatting.files.qml) file(WRITE ${FORMATTING_FILE} "") @@ -35,7 +35,9 @@ if(NOT TARGET format.qml) file(APPEND ${FORMATTING_FILE} "\n") endforeach() - add_custom_target(format.qml COMMAND ${QMLFORMAT_CMD} -F ${FORMATTING_FILE} SOURCES ${FILES_QML}) + add_custom_target(format.qml + COMMAND ${CMAKE_COMMAND} -E echo Calling ${QMLFORMAT_CMD} in version ${QMLFORMAT_VERSION} + COMMAND ${QMLFORMAT_CMD} -F ${FORMATTING_FILE} SOURCES ${FILES_QML}) add_dependencies(format format.qml) endif() endif() diff --git a/cmake/Tools.cmake b/cmake/Tools.cmake index 73b71f7fc..f7fb2c64b 100644 --- a/cmake/Tools.cmake +++ b/cmake/Tools.cmake @@ -115,6 +115,25 @@ if(UNCRUSTIFY) endif() endif() +find_program(DOS2UNIX dos2unix CMAKE_FIND_ROOT_PATH_BOTH) +if(DOS2UNIX) + list(APPEND GLOB_FILES ${PROJECT_SOURCE_DIR}/*.cpp) + list(APPEND GLOB_FILES ${PROJECT_SOURCE_DIR}/*.h) + list(APPEND GLOB_FILES ${PROJECT_SOURCE_DIR}/*.rst) + list(APPEND GLOB_FILES ${PROJECT_SOURCE_DIR}/*.svg) + list(APPEND GLOB_FILES ${PROJECT_SOURCE_DIR}/CMakeLists.txt) + list(APPEND GLOB_FILES ${PROJECT_SOURCE_DIR}/*.cmake) + list(APPEND GLOB_FILES ${PROJECT_SOURCE_DIR}/*.cmake.in) + file(GLOB_RECURSE FILES ${GLOB_FILES}) + + foreach(FILE ${FILES}) + list(APPEND commands COMMAND ${DOS2UNIX} -q -k --add-eol ${FILE}) + endforeach() + + add_custom_target(format.dos2unix ${commands}) + add_dependencies(format format.dos2unix) +endif() + find_program(PYTHON python CMAKE_FIND_ROOT_PATH_BOTH) if(PYTHON) list(APPEND GLOB_JSON ${RESOURCES_DIR}/updatable-files/*.json) @@ -130,16 +149,6 @@ if(PYTHON) add_dependencies(format format.json) endif() -find_program(QMLLINT_BIN qmllint CMAKE_FIND_ROOT_PATH_BOTH) -if(QMLLINT_BIN) - file(GLOB_RECURSE TEST_FILES_QML ${TEST_DIR}/qml/*.qml) - file(GLOB_RECURSE FILES_QML ${RESOURCES_DIR}/qml/*.qml) - file(GLOB_RECURSE FILES_JS ${RESOURCES_DIR}/qml/*.js) - set(QMLLINT_CMD ${QMLLINT_BIN} ${FILES_QML} ${FILES_JS}) - - add_custom_target(qmllint COMMAND ${QMLLINT_CMD} SOURCES ${TEST_FILES_QML} ${FILES_QML} ${FILES_JS}) -endif() - # doc8 (https://pypi.python.org/pypi/doc8) find_program(DOC8_BIN doc8 CMAKE_FIND_ROOT_PATH_BOTH) function(CREATE_DOC8_TARGET _dir _name) diff --git a/cmake/android.toolchain.cmake b/cmake/android.toolchain.cmake index 51635da33..21358e816 100644 --- a/cmake/android.toolchain.cmake +++ b/cmake/android.toolchain.cmake @@ -1,8 +1,3 @@ -cmake_minimum_required(VERSION 3.16.0) -if(CMAKE_VERSION VERSION_LESS "3.16.4") - message(WARNING "Check your cmake: https://gitlab.kitware.com/cmake/cmake/commit/e3d3b7ddeb5922a4d17b962984e698e6387f7544") -endif() - function(READ_REVISION _var _regex _files) foreach(file ${_files}) if(EXISTS "${file}") @@ -27,15 +22,15 @@ IF(NOT CMAKE_ANDROID_NDK) endif() endif() -set(ANDROID_SDK $ENV{ANDROID_SDK_ROOT}) +set(ANDROID_SDK_ROOT $ENV{ANDROID_SDK_ROOT}) set(ANDROID_BUILD_TOOLS_REVISION $ENV{ANDROID_BUILD_TOOLS_REVISION}) -if(NOT EXISTS "${ANDROID_SDK}") +if(NOT EXISTS "${ANDROID_SDK_ROOT}") message(FATAL_ERROR "Environment variable ANDROID_SDK_ROOT is undefined") endif() if(NOT ANDROID_BUILD_TOOLS_REVISION) - set(_android_build_tools_dir "${ANDROID_SDK}/build-tools") + set(_android_build_tools_dir "${ANDROID_SDK_ROOT}/build-tools") file(GLOB build_tools_list ${_android_build_tools_dir}/*) list(LENGTH build_tools_list build_tools_len) @@ -53,9 +48,33 @@ endif() READ_REVISION(ANDROID_NDK_REVISION ".*Revision = ([0-9|\\.]+)" "${CMAKE_ANDROID_NDK}/source.properties") +if(NOT QT_TOOLCHAIN_FILE) + foreach(path ${CMAKE_PREFIX_PATH}) + set(file ${path}/lib/cmake/Qt6/qt.toolchain.cmake) + if(EXISTS "${file}") + set(QT_TOOLCHAIN_FILE ${file}) + break() + endif() + endforeach() +endif() + +if(QT_TOOLCHAIN_FILE) + message(STATUS "QT_TOOLCHAIN_FILE: ${QT_TOOLCHAIN_FILE}") + include(${QT_TOOLCHAIN_FILE}) +endif() + +set(ANDROID_BUILD_NAME android-build) +set(ANDROID_BUILD_DIR "${PROJECT_BINARY_DIR}/src/${ANDROID_BUILD_NAME}") +set(ANDROID_PACKAGE_SRC_DIR ${PROJECT_BINARY_DIR}/package-src-dir) +set(QT_ENABLE_VERBOSE_DEPLOYMENT ON) + +if(DEFINED ENV{QT_ANDROID_KEYSTORE_PATH} AND NOT INTEGRATED_SDK) + set(QT_ANDROID_SIGN_APK ON) +endif() + set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION clang) set(CMAKE_SYSTEM_NAME Android) -set(CMAKE_SYSTEM_VERSION 26) +set(CMAKE_SYSTEM_VERSION 28) set(ANDROID_TARGET_SDK_VERSION 34) set(CMAKE_ANDROID_STL_TYPE c++_shared) @@ -72,7 +91,8 @@ if(CMAKE_ANDROID_ARCH_ABI STREQUAL "armeabi-v7a") set(CMAKE_ANDROID_ARM_NEON ON) endif() -set(CMAKE_FIND_ROOT_PATH ${CMAKE_PREFIX_PATH} CACHE STRING "android find search path root") set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +set(GOVERNIKUS_TOOLCHAIN_FILE ON) diff --git a/cmake/cmd.cmake b/cmake/cmd.cmake index d9fb3e648..20208b335 100644 --- a/cmake/cmd.cmake +++ b/cmake/cmd.cmake @@ -221,6 +221,100 @@ function(CHECK_FAILURE_CODES) endforeach() endfunction() +function(CHECK_QMLDIR) + file(GLOB_RECURSE QMLDIRS "${CMAKE_CURRENT_BINARY_DIR}/qmldir") + + if(QMLDIRS STREQUAL "") + message(FATAL_ERROR "no qmldirs found: ${CMAKE_CURRENT_BINARY_DIR}") + endif() + + foreach(file ${QMLDIRS}) + get_filename_component(dir "${file}" DIRECTORY) + file(GLOB_RECURSE QMLFILES RELATIVE "${dir}" "${dir}/*.qml") + set(flatten_qmlfiles) + foreach(entry ${QMLFILES}) + get_filename_component(name "${entry}" NAME) + list(APPEND flatten_qmlfiles ${name}) + endforeach() + + file(STRINGS "${file}" content) + # check if qmldir has invalid files + foreach(line ${content}) + string(REGEX MATCH "[A-Za-z]+\\.qml$" _unused "${line}") + if(CMAKE_MATCH_0) + list(FIND flatten_qmlfiles ${CMAKE_MATCH_0} found) + if(found EQUAL -1) + string(REPLACE "${CMAKE_CURRENT_BINARY_DIR}/" "" subdir "${file}") + message(STATUS "${CMAKE_MATCH_0} not found in ${subdir}") + set(failed TRUE) + endif() + endif() + endforeach() + + # check if qmldir has missing files + foreach(qmlfile ${flatten_qmlfiles}) + string(REGEX MATCH "([A-Za-z]+)_[0-9\\.]+\\.qml" _unused "${qmlfile}") + if(CMAKE_MATCH_1) + set(qmlfile "${CMAKE_MATCH_1}.qml") + endif() + file(STRINGS "${file}" content REGEX " ${qmlfile}") + if(content STREQUAL "") + string(REPLACE "${CMAKE_CURRENT_BINARY_DIR}/" "" qmldir "${file}") + message(STATUS "${qmlfile} not found in ${qmldir}") + set(failed TRUE) + endif() + endforeach() + endforeach() + + if(failed) + message(FATAL_ERROR "qmldir seems invalid") + endif() +endfunction() + +function(CHECK_QMLTYPES) + file(GLOB_RECURSE QMLTYPES "${CMAKE_CURRENT_BINARY_DIR}/*.qmltypes") + + if(QMLTYPES STREQUAL "") + message(FATAL_ERROR "no qmltypes found: ${CMAKE_CURRENT_BINARY_DIR}") + endif() + + set(failed FALSE) + foreach(file ${QMLTYPES}) + file(STRINGS "${file}" filecontent) + set(PARENT_NAME "") + set(ENUM_FOUND FALSE) + set(ENUM_NAME "") + set(ENUM_SCOPED FALSE) + + foreach(line ${filecontent}) + if(ENUM_FOUND) + if(line MATCHES "}") + if(NOT ENUM_SCOPED AND NOT PARENT_NAME MATCHES "governikus::Enum${ENUM_NAME}") + get_filename_component(file "${file}" NAME) + message(STATUS "${file}: ${ENUM_NAME} of ${PARENT_NAME} is not scoped") + set(failed TRUE) + endif() + set(ENUM_FOUND FALSE) + set(ENUM_NAME "") + set(ENUM_SCOPED FALSE) + elseif(line MATCHES "name: \"([A-Za-z]+)\"") + set(ENUM_NAME ${CMAKE_MATCH_1}) + elseif(line MATCHES "isScoped: true") + set(ENUM_SCOPED TRUE) + endif() + elseif(line MATCHES "Enum {") + set(ENUM_FOUND TRUE) + elseif(line MATCHES "name: \"([A-Za-z:]+)\"") + set(PARENT_NAME ${CMAKE_MATCH_1}) + endif() + endforeach() + endforeach() + + if(failed) + message(FATAL_ERROR "Enum in qmltypes is not scoped") + endif() +endfunction() + if(NOT CMD) message(FATAL_ERROR "You need to specify 'CMD'") endif() @@ -235,6 +329,10 @@ elseif(CMD STREQUAL "DEPLOY_NEXUS") DEPLOY_NEXUS() elseif(CMD STREQUAL "CHECK_FAILURE_CODES") CHECK_FAILURE_CODES() +elseif(CMD STREQUAL "CHECK_QMLDIR") + CHECK_QMLDIR() +elseif(CMD STREQUAL "CHECK_QMLTYPES") + CHECK_QMLTYPES() else() message(FATAL_ERROR "Unknown CMD: ${CMD}") endif() diff --git a/cmake/iOS.toolchain.cmake b/cmake/iOS.toolchain.cmake index 86d66b092..6f80bd816 100644 --- a/cmake/iOS.toolchain.cmake +++ b/cmake/iOS.toolchain.cmake @@ -1,5 +1,3 @@ -cmake_minimum_required(VERSION 3.14) - set(CMAKE_SYSTEM_NAME iOS) if(NOT CMAKE_OSX_ARCHITECTURES) diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt index c9b41e12c..e33692bdd 100644 --- a/docs/CMakeLists.txt +++ b/docs/CMakeLists.txt @@ -1,7 +1,7 @@ if(SPHINX_FOUND) SPHINX_GEN("${CMAKE_CURRENT_SOURCE_DIR}/releasenotes" "notes" BUILDER singlehtml html latex text) - SPHINX_GEN("${CMAKE_CURRENT_SOURCE_DIR}/sdk" "sdk" BUILDER changes html latex DEFAULT_LANG en) + SPHINX_GEN("${CMAKE_CURRENT_SOURCE_DIR}/sdk" "sdk" BUILDER html latex DEFAULT_LANG en) SPHINX_GEN("${CMAKE_CURRENT_SOURCE_DIR}/installation" "installation_integration" BUILDER changes html latex) diff --git a/docs/failurecodes/failurecodes.rst b/docs/failurecodes/failurecodes.rst index 01d68899a..5c5eeec06 100644 --- a/docs/failurecodes/failurecodes.rst +++ b/docs/failurecodes/failurecodes.rst @@ -231,6 +231,11 @@ Codes a new PIN at the citizens' office (Bürgeramt) or let it be set with the CAN at https://www.pin-ruecksetzbrief-bestellen.de. + - | **Establish_Pace_Channel_Unknown_Password_Id** + | The establishment of a PACE channel was finished. However, an unsupported + password type was used (PIN, CAN, PUK are supported). + | **Possible Solutions:** :ref:`failure_code_contact_support`. + - | **Establish_Pace_Channel_User_Cancelled** | The user canceled the workflow on a comfort USB reader or a smartphone as a card reader with keyboard mode enabled. @@ -483,6 +488,11 @@ Codes | Like Change_Pin_User_Cancelled but at a higher log level. | **Possible Solutions:** Carry out the PIN change without abortion. + - | **Change_Pin_Unrecoverable** + | The change PIN workflow encountered an error, which prevents the continuation of the workflow. + This often indicates a problem with the card connection. + | **Possible Solutions:** :ref:`failure_code_card_position`. + - | **Start_Ifd_Service_Failed** | The IFD service according to TR-03112-6 appendix "IFD Service" could not be started. Either no suitable TLS certificate could be found/generated or the start of the TLS server failed. This diff --git a/docs/failurecodes/locales/de/LC_MESSAGES/failurecodes.po b/docs/failurecodes/locales/de/LC_MESSAGES/failurecodes.po index 4f0782622..571f71034 100644 --- a/docs/failurecodes/locales/de/LC_MESSAGES/failurecodes.po +++ b/docs/failurecodes/locales/de/LC_MESSAGES/failurecodes.po @@ -1,15 +1,14 @@ # SOME DESCRIPTIVE TITLE. -# Copyright (C) 2023, Governikus GmbH & Co. KG -# This file is distributed under the same license as the AusweisApp2 Failure -# Codes package. -# FIRST AUTHOR , 2023. +# Copyright (C) 2023-2024, Governikus GmbH & Co. KG +# This file is distributed under the same license as the AusweisApp +# Failure Codes package. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: AusweisApp2 Failure Codes 1.26.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-05-31 05:28+0200\n" +"POT-Creation-Date: 2024-04-09 07:58+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: de\n" @@ -18,7 +17,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.12.1\n" +"Generated-By: Babel 2.14.0\n" msgid "Failure Codes" msgstr "Fehlercodes" @@ -107,8 +106,8 @@ msgid "" "configuration as well as your local network hardware. Ultimately the " "problem may be with your telecommunications provider, or the service " "provider. Please refer to the attached \\\"Network_Error\\\" for details." -" If you are using the |AppName|, the diagnosis, which is located in the" -" help section, may assist you in finding issues." +" If you are using the |AppName|, the diagnosis, which is located in the " +"help section, may assist you in finding issues." msgstr "" "Bei sämtlichen Fehlercodes, welche Verbindungsprobleme als Ursache " "aufzeigen, empfiehlt sich vorab eine Überprüfung der aktuellen " @@ -374,11 +373,11 @@ msgid "**Pre_Verification_No_Test_Environment**" msgstr "" msgid "" -"Occurs when the development mode of |AppName| is activated and a " -"genuine ID card is used." +"Occurs when the development mode of |AppName| is activated and a genuine " +"ID card is used." msgstr "" -"Tritt auf, wenn der Entwicklermodus der |AppName| aktiviert ist und ein" -" Echtausweis verwendet wird." +"Tritt auf, wenn der Entwicklermodus der |AppName| aktiviert ist und ein " +"Echtausweis verwendet wird." msgid "" "**Possible Solutions:** Disable developer mode. The use of genuine ID " @@ -393,12 +392,10 @@ msgstr "" msgid "**Pre_Verification_Invalid_Certificate_Chain**" msgstr "" -msgid "" -"A certificate chain was sent from the server that is unknown to " -"|AppName|." +msgid "A certificate chain was sent from the server that is unknown to |AppName|." msgstr "" -"Vom Server wurde eine Zertifikatskette gesendet, die der |AppName| " -"nicht bekannt ist." +"Vom Server wurde eine Zertifikatskette gesendet, die der |AppName| nicht " +"bekannt ist." msgid "**Pre_Verification_Invalid_Certificate_Signature**" msgstr "" @@ -521,15 +518,6 @@ msgstr "" "Fehlversuchen nicht freigeschaltet werden. Bitte richten Sie Ihre Smart-" "eID erneut ein." -msgid "" -"**Possible Solutions:** The |AppName| automatically leads the user to " -"the PIN change to set a six-digit PIN. If this error occurs in a third-" -"party app, you have to start a PIN change on your own." -msgstr "" -"**Mögliche Lösungen:** Die |AppName| führt den Benutzer direkt zur PIN-" -"Änderung, damit dieser eine sechsstellige PIN festlegen kann. Tritt der " -"Fall im SDK auf, muss sich die Anwendung selbst darum kümmern." - msgid "**Establish_Pace_Channel_Basic_Reader_No_Pin**" msgstr "" @@ -542,9 +530,6 @@ msgstr "" "aufzubauen. Jedoch wurde die PIN, CAN oder PUK nach der Nutzereingabe " "nicht übernommen." -msgid "**Possible Solutions:** :ref:`failure_code_contact_support`." -msgstr "**Mögliche Lösungen:** :ref:`failure_code_contact_support`." - msgid "**Establish_Pace_Channel_Puk_Inoperative**" msgstr "" @@ -570,6 +555,16 @@ msgstr "" "neue PIN setzen oder auf https://www.pin-ruecksetzbrief-bestellen.de mit " "der CAN setzen lassen." +msgid "**Establish_Pace_Channel_Unknown_Password_Id**" +msgstr "" + +msgid "" +"The establishment of a PACE channel was finished. However, an unsupported" +" password type was used (PIN, CAN, PUK are supported)." +msgstr "" +"Der Aufbau eines PACE-Kanals wurde abgeschlossen. Dabei wurde jedoch ein " +"nicht unterstützter Passworttyp angefragt (Unterstützt werden PIN, CAN, PUK)." + msgid "**Establish_Pace_Channel_User_Cancelled**" msgstr "" @@ -673,8 +668,8 @@ msgid "" "The server intended for the PAOS communication during authentication is " "temporarily unavailable." msgstr "" -"Der für PAOS-Kommunikation vorgesehene Server ist temporär " -"nicht verfügbar." +"Der für PAOS-Kommunikation vorgesehene Server ist temporär nicht " +"verfügbar." msgid "**Generic_Send_Receive_Server_Error**" msgstr "" @@ -774,8 +769,8 @@ msgid "" "|AppName| or the ID card did not behave as expected by the server." msgstr "" "Die Nachricht \"StartPaosResponse\" vom Server hat einen Fehler " -"geliefert. Die |AppName| oder die Karte hat sich nicht entsprechend der" -" Erwartung des Servers verhalten." +"geliefert. Die |AppName| oder die Karte hat sich nicht entsprechend der " +"Erwartung des Servers verhalten." msgid "**Check_Refresh_Address_Fatal_Tls_Error_Before_Reply**" msgstr "" @@ -804,22 +799,24 @@ msgstr "" msgid "The server providing the return address is temporarily unavailable." msgstr "" -"Der für das Bereitstellen der Rücksprungadresse vorgesehene Server ist temporär " -"nicht verfügbar." +"Der für das Bereitstellen der Rücksprungadresse vorgesehene Server ist " +"temporär nicht verfügbar." msgid "**Check_Refresh_Address_Server_Error**" msgstr "" msgid "A server error 5xx occurred on requesting the return address." msgstr "" -"Bei der Anfrage der Rücksprungadresse ist ein Serverfehler 5xx aufgetreten." +"Bei der Anfrage der Rücksprungadresse ist ein Serverfehler 5xx " +"aufgetreten." msgid "**Check_Refresh_Address_Client_Error**" msgstr "" msgid "A client error 4xx occurred on requesting the return address." msgstr "" -"Bei der Anfrage der Rücksprungadresse ist ein Clientfehler 4xx aufgetreten." +"Bei der Anfrage der Rücksprungadresse ist ein Clientfehler 4xx " +"aufgetreten." msgid "**Check_Refresh_Address_Service_Timeout**" msgstr "" @@ -838,8 +835,8 @@ msgid "" "A proxy server was configured by the operating system or the settings of " "|AppName|. This didn't work for checking the return address." msgstr "" -"Durch das Betriebssystem oder die Einstellungen der |AppName| wurde ein" -" Proxyserver konfiguriert. Dieser hat für die Überprüfung der " +"Durch das Betriebssystem oder die Einstellungen der |AppName| wurde ein " +"Proxyserver konfiguriert. Dieser hat für die Überprüfung der " "Rücksprungadresse nicht funktioniert." msgid "**Check_Refresh_Address_Fatal_Tls_Error_After_Reply**" @@ -927,6 +924,19 @@ msgstr "" "Das Server-Zertifikat der Rücksprungadresse ist nicht in der Beschreibung" " des Diensteanbieterzertifikats enthalten." +msgid "**Browser_Send_Failed**" +msgstr "" + +msgid "" +"On desktop systems, the web browser waits for a response from |AppName| " +"after starting authentication. However, for unknown reasons, the web " +"browser connection to the browser is lost and the answer cannot be sent." +msgstr "" +"Auf Desktop-Systemen wartet der Webbrowser nach Start einer " +"Authentisierung auf eine Antwort der |AppName|. Aus unbekannten Gründen " +"ist die Verbindung zum Browser abgebrochen, sodass die Antwort nicht mehr" +" gesendet werden kann." + msgid "" "**Possible Solutions:** If the problem occurs repeatedly and changing the" " browser does not help, please :ref:`failure_code_contact_support`." @@ -935,18 +945,6 @@ msgstr "" "Problem bestehen bleibt, beachten Sie " ":ref:`failure_code_contact_support`." -msgid "**Browser_Send_Failed**" -msgstr "" - -msgid "" -"On desktop systems, the web browser waits for a response from |AppName| " -"after starting authentication. However, for unknown reasons, the web browser " -"connection to the browser is lost and the answer cannot be sent." -msgstr "" -"Auf Desktop-Systemen wartet der Webbrowser nach Start einer Authentisierung " -"auf eine Antwort der |AppName|. Aus unbekannten Gründen ist die Verbindung " -"zum Browser abgebrochen, sodass die Antwort nicht mehr gesendet werden kann." - msgid "**Generic_Provider_Communication_Network_Error**" msgstr "" @@ -969,8 +967,8 @@ msgid "" msgstr "" "Bei der Kommunikation mit einem Diensteanbieter ist der durch den TLS-" "Handshake generierte symmetrische Schlüssel nicht lang genug. Das " -"betrifft nur Dienste, die aus der |AppName| heraus gestartet werden, " -"wie zum Beispiel die Selbstauskunft." +"betrifft nur Dienste, die aus der |AppName| heraus gestartet werden, wie " +"zum Beispiel die Selbstauskunft." msgid "**Generic_Provider_Communication_Certificate_Error**" msgstr "" @@ -995,15 +993,14 @@ msgid "" msgstr "" "Bei der Kommunikation mit einem Diensteanbieter ist während des TLS-" "Handshakes ein Fehler aufgetreten. Das TLS-Zertifikat ist fehlerhaft. Das" -" betrifft nur Dienste, die aus der |AppName| heraus gestartet werden, " -"wie zum Beispiel die Selbstauskunft." +" betrifft nur Dienste, die aus der |AppName| heraus gestartet werden, wie" +" zum Beispiel die Selbstauskunft." msgid "**Generic_Provider_Communication_ServiceUnavailable**" msgstr "" msgid "The server of the service provider is temporarily unavailable." -msgstr "" -"Der Server des Diensteanbieters ist temporär nicht verfügbar." +msgstr "Der Server des Diensteanbieters ist temporär nicht verfügbar." msgid "**Generic_Provider_Communication_Server_Error**" msgstr "" @@ -1012,7 +1009,8 @@ msgid "" "A server error 5xx occurred in the communication with the service " "provider." msgstr "" -"Bei der Kommunikation mit dem Diensteanbieter ist ein Serverfehler 5xx aufgetreten." +"Bei der Kommunikation mit dem Diensteanbieter ist ein Serverfehler 5xx " +"aufgetreten." msgid "**Generic_Provider_Communication_Client_Error**" msgstr "" @@ -1021,7 +1019,8 @@ msgid "" "A client error 4xx occurred in the communication with the service " "provider." msgstr "" -"Bei der Kommunikation mit dem Diensteanbieter ist ein Clientfehler 4xx aufgetreten." +"Bei der Kommunikation mit dem Diensteanbieter ist ein Clientfehler 4xx " +"aufgetreten." msgid "**Get_SelfAuthData_Invalid_Or_Empty**" msgstr "" @@ -1130,6 +1129,18 @@ msgstr "" msgid "Like Change_Pin_User_Cancelled but at a higher log level." msgstr "Wie Change_Pin_User_Cancelled aber auf einer höheren Protokollebene." +msgid "**Change_Pin_Unrecoverable**" +msgstr "" + +msgid "" +"The change PIN workflow encountered an error, which prevents the " +"continuation of the workflow. This often indicates a problem with the " +"card connection." +msgstr "" +"Bei der PIN-Änderung ist es zu einer Fehlersituation gekommen, die " +"keine Fortsetzung ermöglicht. Das ist oft ein Zeichen für Probleme " +"mit der Kartenverbindung." + msgid "**Start_Ifd_Service_Failed**" msgstr "" @@ -1137,8 +1148,8 @@ msgid "" "The IFD service according to TR-03112-6 appendix \"IFD Service\" could " "not be started. Either no suitable TLS certificate could be " "found/generated or the start of the TLS server failed. This applies to " -"both remote access and the local service of |AppName| on Android that " -"is used through the SDK." +"both remote access and the local service of |AppName| on Android that is " +"used through the SDK." msgstr "" "Der IFD-Service gemäß TR-03112-6 Anhang „IFD Service“ konnte nicht " "gestartet werden. Entweder konnte kein passendes TLS-Zertifikat " diff --git a/docs/installation/README.de.rst b/docs/installation/README.de.rst index 4e3ab690c..195bddc6d 100644 --- a/docs/installation/README.de.rst +++ b/docs/installation/README.de.rst @@ -112,11 +112,6 @@ UPDATECHECK Aktualisierung der Anbieterliste noch die Aktualisierung der Kartenleserinformationen. -ONSCREENKEYBOARD - Für die Eingabe von PIN, CAN und PUK kann eine Bildschirmtastatur verwendet - werden. Durch Setzen von ONSCREENKEYBOARD auf false oder true kann diese - deaktiviert bzw. aktiviert werden. Der Benutzer kann diese Einstellung anpassen. - SHUFFLESCREENKEYBOARD Ist die Bildschirmtastatur aktiviert, können die Zifferntasten zufällig angeordnet werden. Durch Setzen von SHUFFLESCREENKEYBOARD auf false oder true kann die zufällige Anordnung @@ -185,8 +180,6 @@ dargestellt: proxy.example.org customProxyPort 1337 - keylessPassword - shuffleScreenKeyboard visualPrivacy @@ -212,7 +205,6 @@ transportPinReminder TRANSPORTPINREMINDER customProxyType CUSTOMPROXYTYPE customProxyPort CUSTOMPROXYPORT customProxyHost CUSTOMPROXYHOST -keylessPassword ONSCREENKEYBOARD shuffleScreenKeyboard SHUFFLESCREENKEYBOARD visualPrivacy SECURESCREENKEYBOARD enableCanAllowed ENABLECANALLOWED @@ -350,7 +342,7 @@ Aktivieren der Entwickleroptionen --------------------------------- Um die Entwickleroptionen zu aktivieren, öffnen Sie im Menü „Hilfe“ den Punkt -„Versionsinformationen“. Klicken Sie zehnmal auf den Inhalt der +„Information“. Klicken Sie zehnmal auf die „Anwendungsversion“. Versionsinformationen. Nach dem zehnten Klick erhalten Sie eine Benachrichtigung, dass die Entwickleroptionen aktiviert sind. Im Bereich Einstellungen befindet sich nun eine neue Kategorie „Entwickleroptionen“. In den mobilen Versionen @@ -481,6 +473,16 @@ Entwicklerdokumentation Eine ausführliche Entwicklerdokumentation des SDKs und eine Auflistung der möglichen Fehlercodes finden Sie unter https://www.ausweisapp.bund.de/sdk/. +SDK Wrapper +----------- + +Sie können den SDK Wrapper der |AppName| zur Vereinfachung der Einbindung +des SDKs in Ihre App verwenden. Der SDK Wrapper bietet Swift und Kotlin +Bindings für iOS und Android an. + +Informationen zur Integration des SDK Wrappers finden Sie in der +Entwicklerdokumentation unter https://www.ausweisapp.bund.de/sdkwrapper/. + .. raw:: latex \newpage diff --git a/docs/installation/README.en.rst b/docs/installation/README.en.rst index dd1911d89..4be6ffebd 100644 --- a/docs/installation/README.en.rst +++ b/docs/installation/README.en.rst @@ -103,11 +103,6 @@ UPDATECHECK The UPDATECHECK parameter affects neither updates of the service provider list nor updates of card reader information. -ONSCREENKEYBOARD - An on-screen keyboard is available to enter PIN, CAN or PUK. It is deactivated or - activated by setting ONSCREENKEYBOARD to false or true. Users are able to adjust - the setting. - SHUFFLESCREENKEYBOARD If the on-screen keyboard is activated, the number keys can be arranged at random. By setting SHUFFLESCREENKEYBOARD to false or true, the random arrangement can be @@ -172,8 +167,6 @@ the file must be "com.governikus.AusweisApp2.plist". The content is shown below: proxy.example.org customProxyPort 1337 - keylessPassword - shuffleScreenKeyboard visualPrivacy @@ -198,7 +191,6 @@ transportPinReminder TRANSPORTPINREMINDER customProxyType CUSTOMPROXYTYPE customProxyPort CUSTOMPROXYPORT customProxyHost CUSTOMPROXYHOST -keylessPassword ONSCREENKEYBOARD shuffleScreenKeyboard SHUFFLESCREENKEYBOARD visualPrivacy SECURESCREENKEYBOARD enableCanAllowed ENABLECANALLOWED @@ -327,8 +319,8 @@ The developer options are hidden by default. Activating the Developer Options -------------------------------- -Developer options are activated by clicking the version number accessible via -"Help" -> "Version Information" 10 times. After the 10th time, you will receive a +Developer options are activated by clicking the "Application Version" accessible +via "Help" -> "Information" 10 times. After the 10th time, you will receive a notification that the developer options are activated. Once activated, you will find a new category "developer options" in the settings menu. In the mobile versions additional options for "on-site reading" appear. @@ -445,3 +437,13 @@ Developer documentation You can find a detailed developer documentation of the SDK with a list of possible failure codes at https://www.ausweisapp.bund.de/sdk/. + +SDK Wrapper +----------- + +You can use the SDK Wrapper of the |AppName| to simplify the integration of +the SDK into your app. The SDK Wrapper offers Swift and Kotlin bindings for iOS +and Android. + +You can find information for integrating the SDK Wrapper in the developer +documentation at https://www.ausweisapp.bund.de/sdkwrapper/. diff --git a/docs/releasenotes/2.2.0.rst b/docs/releasenotes/2.2.0.rst new file mode 100644 index 000000000..757b729aa --- /dev/null +++ b/docs/releasenotes/2.2.0.rst @@ -0,0 +1,41 @@ +AusweisApp 2.2.0 +^^^^^^^^^^^^^^^^ + +**Releasedatum:** 02. Juli 2024 + + +Anwender +"""""""" +- Visuelle Anpassungen und Optimierungen der grafischen Oberfläche. + +- Anzeige des alten und neuen Gerätenamen bei der Nutzung von "Smartphone + als Kartenleser", falls sich der Name eines Geräts geändert hat. + +- Am Ende einer Authentisierung wurde ein Seite zur Information + eingefügt, bevor eine Weiterleitung zum Diensteanbieter erfolgt. + +- Erhöhung der zulässigen Zeit für die Antwort auf Kartenkommandos + auf Android um Ausweise zu unterstützen, die nach zu vielen falschen + Eingaben der CAN in einen sicheren langsamen Modus gewechselt haben. + +- Optimierung der Barrierearmut. + +- Unterstützung von Android 8 wurde eingestellt. + +- Die Funktion "Smartphone als Kartenleser" benötigt nun mindestens + die Version 2.1.0. + +- Supportunterstützung von ChromeOS. + + +Entwickler +"""""""""" +- Die Unterstützung von Schlüssellängen kleiner als 3000 Bit wurde eingestellt. + +- Erweiterung der Dokumentation für das SDK um ein Changelog. + +- Funktionserweiterung des SDKs (siehe Changelog). + +- Aktualisierung von Qt auf die Version 6.7.2. + +- Aktualisierung von OpenSSL auf die Version 3.3.1. diff --git a/docs/releasenotes/announce.rst b/docs/releasenotes/announce.rst index 6bbee44a2..ef807fc86 100644 --- a/docs/releasenotes/announce.rst +++ b/docs/releasenotes/announce.rst @@ -1,7 +1,13 @@ Abkündigungen ============= -Mit der Version 2.2.0 der AusweisApp wird die Unterstützung +Mit der Version 2.3.0 der AusweisApp wird die Unterstützung +folgender Systeme eingestellt. + +- macOS Monterey 12 + + +Mit der Version 2.2.0 der AusweisApp wurde die Unterstützung folgender Systeme und Funktionen eingestellt. - Android 8 @@ -12,15 +18,3 @@ Mit der Version 2.1.0 der AusweisApp wurde die Unterstützung folgender Systeme eingestellt. - macOS Big Sur 11 - - -Mit der Version 2.0.0 der AusweisApp wurde die Unterstützung -folgender Systeme und Funktionen eingestellt. - -- macOS Catalina 10.15 -- Android 7 -- iOS 13 -- Online-Hilfe -- PDF-Export-Funktion der Selbstauskunft -- Direkte Integration der Anbieterliste -- Verlauf diff --git a/docs/releasenotes/appcast.rst b/docs/releasenotes/appcast.rst index bcb6c0154..89c378328 100644 --- a/docs/releasenotes/appcast.rst +++ b/docs/releasenotes/appcast.rst @@ -4,7 +4,6 @@ Release Notes .. toctree:: :maxdepth: 1 - 2.1.1 - 2.1.0 + 2.2.0 announce issues diff --git a/docs/releasenotes/issues.rst b/docs/releasenotes/issues.rst index e27a79d64..8cd45a048 100644 --- a/docs/releasenotes/issues.rst +++ b/docs/releasenotes/issues.rst @@ -31,11 +31,6 @@ Windows / macOS - Der Installationsdialog (bei Installation und auch Deinstallation) richtet sich nicht nach der Systemsprache. -- Wenn mit einer MSI-Datei ein Update für die AusweisApp durchgeführt wird, - während diese noch läuft, kann es zu einer falschen Fehlermeldung kommen, - dass sie nicht beendet werden konnte. - Die Installation ist dennoch erfolgreich. - Android / iOS """"""""""""" @@ -45,13 +40,10 @@ Android / iOS - Unter Umständen kommt es zu Stabilitätsproblemen der NFC-Schnittstelle. -- Unter Android führen einige Änderungen der Systemeinstellungen bei laufender - |AppName| zu einem Absturz. Dazu zählt die Änderung der Systemsprache und - die Änderung des Typs der Navigationsleiste (Gesten / Schaltflächen). - -- Bei der Verwendung eines "Smartphone als Kartenleser" mit aktivierter - Passworteingabe kommt es bei Verwendung des PUKs zu Fehlern, wenn der - Ausweis dauerhaft am Gerät anliegt. +- Unter Android führen unter Umständen einige Änderungen der + Systemeinstellungen bei laufender |AppName| zu einem Neustart oder Absturz. + Dazu zählt die Änderung der Systemsprache und die Änderung des Typs der + Navigationsleiste (Gesten / Schaltflächen). Barrierearmut @@ -64,21 +56,6 @@ Barrierearmut - Unter iOS kann der sichtbare Bereich vom Systemfokus abweichen. -- Die aktivierbaren Elemente von eingeklappten Listen können ungewollte - Aktionen auslösen. - -- Aktuell sind die Bereiche "Softwarelizenz" und "Release Notes" nicht mit - dem Screenreader ansteuerbar. - -- Die Toggle-Elemente, die Hilfeseiten und die Überschriften der Startseite - besitzen zurzeit noch keine Sprachausgabe. - -- Bei angeschlossenem Kartenleser wird im Ausweisvorgang direkt auf - Schritt 2 gesprungen, ohne dass eine entsprechende Sprachausgabe erfolgt. - -- In Texten wird zum Teil auf grafische Elemente hingewiesen, die keine textuelle - Repräsentation desselben Inhalts besitzen. - - Die angeforderten Rechte während eines Ausweisvorgangs werden nicht optimal vom Screenreader ausgegeben. diff --git a/docs/releasenotes/support.rst b/docs/releasenotes/support.rst index 1529266b3..9d43b48e5 100644 --- a/docs/releasenotes/support.rst +++ b/docs/releasenotes/support.rst @@ -24,10 +24,12 @@ Betriebssysteme - Windows Server 2022 -- Android 8.0 und höher (armeabi-v7a, arm64-v8a) +- Android 9 und höher (armeabi-v7a, arm64-v8a) - iOS 14 und höher +- ChromeOS 125 und höher + Karten """""" @@ -52,13 +54,13 @@ und sollte daher mit allen marktüblichen Browsern verwendet werden können. Im Rahmen der Qualitätssicherung werden die folgenden Browserversionen getestet. -- Chrome 122 +- Chrome 126 -- Firefox 123 +- Firefox 127 -- Safari 17.3 (macOS) +- Safari 17.4 (macOS) -- Edge 122 +- Edge 126 @@ -116,13 +118,13 @@ Im mobilen Umfeld ist die Funktionalität jedoch abhängig von der vom Anbieter umgesetzten Aktivierung. Daher empfehlen wir einen der folgenden Browser zu verwenden. -- Chrome 122 (iOS/Android) +- Chrome 126 (iOS/Android) -- Firefox 123 (iOS/Android) +- Firefox 127 (iOS/Android) -- Samsung Internet 23 (Android) +- Samsung Internet 25 (Android) -- Safari 17.3 (iOS) +- Safari 17.4 (iOS) Kartenleser diff --git a/docs/releasenotes/versions.rst b/docs/releasenotes/versions.rst index b6b1b2169..16be64c09 100644 --- a/docs/releasenotes/versions.rst +++ b/docs/releasenotes/versions.rst @@ -1,6 +1,14 @@ Versionen ========= +Versionszweig 2.2 +----------------- +.. toctree:: + :maxdepth: 1 + + 2.2.0 + + Versionszweig 2.1 ----------------- .. toctree:: diff --git a/docs/sdk/android.rst b/docs/sdk/android.rst index 1ceac1668..874544e65 100644 --- a/docs/sdk/android.rst +++ b/docs/sdk/android.rst @@ -12,6 +12,11 @@ communicate with the |AppName| SDK. The |AppName| is available as an AAR package that can automatically be fetched by Android's default build system **gradle**. +.. seealso:: + For Android there is also the + `AusweisApp SDK Wrapper `_ + which is a software library that offers a high-level interface to the |AppName| SDK. + .. important:: The AAR package is available in maven central for free. If you need enterprise support feel free to contact us. @@ -130,21 +135,7 @@ once. To do so the following snippet may prove useful: private boolean isAA2Process() { - if (Build.VERSION.SDK_INT >= 28) - { - return Application.getProcessName().endsWith(AA2_PROCESS); - } - - final int pid = android.os.Process.myPid(); - ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); - for (ActivityManager.RunningAppProcessInfo appProcess : manager.getRunningAppProcesses()) - { - if (appProcess.pid == pid) - { - return appProcess.processName.endsWith(AA2_PROCESS); - } - } - return false; + return Application.getProcessName().endsWith(AA2_PROCESS); } } diff --git a/docs/sdk/changelog.rst b/docs/sdk/changelog.rst new file mode 100644 index 000000000..817a04372 --- /dev/null +++ b/docs/sdk/changelog.rst @@ -0,0 +1,81 @@ +Changelog +========= + +Version 2.2.0 +^^^^^^^^^^^^^ +* Introduced the following additions in :ref:`api_level` **3**: + + * The command :ref:`continue_cmd`. + + * The message :ref:`pause_message`. + + * Extended parameter **card** of the message :ref:`reader` to signal an unknown card. + +* Added parameter **content** to the :ref:`filesystem` of the Simulator. +* Declared parameter **private** of the Simulator's :ref:`filesystem` deprecated. + + +Version 1.26.4 +^^^^^^^^^^^^^^ +* Added parameter **keys** to the command :ref:`set_card`. +* Added parameter **reason** to the message :ref:`change_pin`. + + +Version 1.26.3 +^^^^^^^^^^^^^^ +* Added variable "AUSWEISAPP2_AUTOMATIC_DEVELOPERMODE" to the mode :ref:`automatic`. +* Added parameter **reason** to message :ref:`auth`. + + +Version 1.24.0 +^^^^^^^^^^^^^^ +* Introduced the following changes in :ref:`api_level` **2**: + + * The commands :ref:`get_status` and :ref:`set_card`. + + * Removed the parameter **handleInterrupt** of the commands :ref:`run_auth` and :ref:`run_change_pin`. + + * Added the parameter **status** to the commands :ref:`run_auth` and :ref:`run_change_pin`. + + * Renamed parameter **reader** to **readers** in message :ref:`reader` + + * Added message :ref:`status`. + +* Added mode :ref:`automatic` for Desktop Systems. +* Added parameter **insertable** to message :ref:`reader`. + + +Version 1.22.3 +^^^^^^^^^^^^^^ + * Added parameter **developerMode** to the command :ref:`run_auth`. + + +Version 1.22.1 +^^^^^^^^^^^^^^ +* Added parameter **handleInterrupt** and **messages** to the commands :ref:`run_auth` and :ref:`run_change_pin` + for :ref:`api_level` **1**. +* Added the command :ref:`interrupt`. + + +Version 1.22.0 +^^^^^^^^^^^^^^ +* Added the commands :ref:`run_change_pin` and :ref:`set_new_pin`. +* Extended the message :ref:`access_rights` for "CAN allowed right" and "PIN management right". +* Added messages :ref:`change_pin` and :ref:`enter_new_pin`. + + +Version 1.20.0 +^^^^^^^^^^^^^^ +* Extended :ref:`access_rights` for write access. + + +Version 1.16.0 +^^^^^^^^^^^^^^ +* Changed parameter **value** for the commands :ref:`set_pin`, :ref:`set_can`, and :ref:`set_puk` for readers with + a keypad. +* Added parameter **keypad** to message :ref:`reader`. + + +Version 1.14.2 +^^^^^^^^^^^^^^ +* The message :ref:`set_can` may now be used with the "CAN allowed right". diff --git a/docs/sdk/commands.rst b/docs/sdk/commands.rst index ef37759fa..16a0ba238 100644 --- a/docs/sdk/commands.rst +++ b/docs/sdk/commands.rst @@ -169,7 +169,7 @@ Command :ref:`interrupt` allows to stop the dialog manually, if needed. - **developerMode**: True to enable "Developer Mode" for test cards and disable some security checks according to BSI TR-03124-1, otherwise false. (optional, default: false) - - **handleInterrupt**: True to automatically handle system dialog on iOS, otherwise false. + - **handleInterrupt**: True to automatically handle system dialog on iOS to enter a password, otherwise false. :ref:`api_level` v1 only. (optional, default: false) - **status**: True to enable automatic :ref:`status` messages, otherwise false. @@ -391,6 +391,34 @@ in a :ref:`reader` message. +.. _continue_cmd: + +CONTINUE +^^^^^^^^ +Continues the workflow after a :ref:`pause_message` was sent. + +The |AppName| will send a :ref:`pause_message` message with an +appropriate :ref:`cause ` for the waiting condition. +After the issue was fixed you have to send CONTINUE to go on with +the workflow. + + +.. versionadded:: 2.2.0 + The command :ref:`continue_cmd` was introduced in :ref:`api_level` **3**. + +.. code-block:: json + + { + "cmd": "CONTINUE" + } + +.. note:: + This command is allowed only if the |AppName| sent a :ref:`pause_message`. + Otherwise you will get a :ref:`bad_state` message as an answer. + + + + .. _get_certificate: GET_CERTIFICATE diff --git a/docs/sdk/index.rst b/docs/sdk/index.rst index 9122767af..9d2ce0d0f 100644 --- a/docs/sdk/index.rst +++ b/docs/sdk/index.rst @@ -15,9 +15,10 @@ Table of contents ----------------- .. toctree:: - :maxdepth: 2 + :maxdepth: 1 intro + changelog .. raw:: latex diff --git a/docs/sdk/intro.rst b/docs/sdk/intro.rst index b198608d7..ed1692e3c 100644 --- a/docs/sdk/intro.rst +++ b/docs/sdk/intro.rst @@ -19,6 +19,10 @@ or will be sent as an event. Also this documentation provides some example workflows to show a possible communication. +.. seealso:: + For Android and iOS there is also the + `AusweisApp SDK Wrapper `_ + which is a software library that offers a high-level interface to the |AppName| SDK. .. important:: The |AppName| does **not** provide any personal data to diff --git a/docs/sdk/ios.rst b/docs/sdk/ios.rst index bf1e49d34..35a25d897 100644 --- a/docs/sdk/ios.rst +++ b/docs/sdk/ios.rst @@ -7,12 +7,15 @@ be linked into your application. Subsequent sections deal with the SDK interface itself and explain which steps are necessary in order to communicate with the |AppName| SDK. +.. seealso:: + For iOS there is also the + `AusweisApp SDK Wrapper `_ + which is a software library that offers a high-level interface to the |AppName| SDK. + .. important:: Apple released the necessary NFC API with iOS 13.0! Be aware that it is not possible to support older versions. - - Use XCFramework --------------- The interface ``AusweisApp2.h`` of the SDK for iOS is provided as **C-Header** diff --git a/docs/sdk/messages.rst b/docs/sdk/messages.rst index e6e2d9a0f..c2623e5d9 100644 --- a/docs/sdk/messages.rst +++ b/docs/sdk/messages.rst @@ -668,20 +668,6 @@ increased for **incompatible** changes. - **Specification-Version**: Version of specification. - - **AusweisApp**: Indicates the state of the connection to - the AusweisApp for integrated SDK (**Android only**). - The following states are possible. - - - **CONNECTED**: The SDK is connected. - - - **DISCONNECTED**: The SDK is not connected. - - - **INVALID_CERTIFICATE**: The certificate of LocalIfd is not valid. - - - **INCOMPATIBLE_VERSION**: The version of LocalIfd is not compatible. - - - **UNKNOWN**: The state could not be recognized. - .. code-block:: json { @@ -695,8 +681,7 @@ increased for **incompatible** changes. "Specification-Title": "TR-03124-1", "Specification-Vendor": "Federal Office for Information Security", "Specification-Version": "1.4" - }, - "AusweisApp": "CONNECTED" + } } @@ -802,6 +787,9 @@ If a workflow is in progress and a card with disabled eID function was inserted, this message will still be sent, but the workflow will be paused until a card with enabled eID function is inserted. +.. versionadded:: 2.2.0 + Parameter **card** signals an **unknown card** with an empty object (:ref:`api_level` 3). + .. versionadded:: 1.24.0 Parameter **insertable** added. @@ -818,7 +806,8 @@ until a card with enabled eID function is inserted. - **keypad**: Indicates whether a card reader has a keypad. The parameter is only shown when a reader is attached. - - **card**: Provides information about inserted card, otherwise null. + - **card**: Provides information about an inserted eID card. An empty object is + used for an unknown card. Otherwise null. - **inoperative**: True if PUK is inoperative and cannot unblock PIN, otherwise false. This can be recognized if user enters a correct @@ -832,6 +821,8 @@ until a card with enabled eID function is inserted. - **retryCounter**: Count of possible retries for the PIN. If you enter a PIN with command :ref:`set_pin` it will be decreased if PIN was incorrect. +**eID card:** + .. code-block:: json { @@ -848,7 +839,31 @@ until a card with enabled eID function is inserted. } } +**Unknown card (**:ref:`api_level` **3):** +.. code-block:: json + + { + "msg": "READER", + "name": "NFC", + "insertable": false, + "attached": true, + "keypad": false, + "card": {} + } + +**No card:** + +.. code-block:: json + + { + "msg": "READER", + "name": "NFC", + "insertable": false, + "attached": true, + "keypad": false, + "card": null + } .. _reader_list: @@ -934,6 +949,44 @@ or :ref:`run_change_pin`. +.. _pause_message: + +PAUSE +^^^^^ +This message will be sent by |AppName| to signal certain waiting conditions. +E.g. if a card connection cannot be established or maintained due to a bad +positioning of the card, this message will be send with :ref:`BadCardPosition ` +as the cause. +After the causing issue, denoted be the value of :ref:`cause `, +was fixed, the next command should be :ref:`continue_cmd`. + +.. versionadded:: 2.2.0 + The message :ref:`pause_message` was introduced in :ref:`api_level` **3**. The SDK will halt until + :ref:`continue_cmd` was sent to acknowledge the condition. + +.. _pause_cause: + + - **cause**: The cause for the waiting condition. + +.. code-block:: json + + { + "msg": "PAUSE", + "cause": "BadCardPosition" + } + + +The following list of :ref:`causes ` contains all conditions. Each condition is a stable and +unique string to safely distinguish each waiting condition. + +.. _bad_card_position: + + - **BadCardPosition**: Denotes an unstable or lost card connection. After fixing the issue you + have to call :ref:`continue_cmd` to go on with the workflow. + + + + .. _unknown_command: UNKNOWN_COMMAND diff --git a/docs/sdk/simulator.rst b/docs/sdk/simulator.rst index 8fcee9e75..052b39045 100644 --- a/docs/sdk/simulator.rst +++ b/docs/sdk/simulator.rst @@ -26,6 +26,12 @@ These are the default values if your application does not provide other values as **simulator** parameter in :ref:`set_card` or if you use the :ref:`automatic` mode of :doc:`desktop` or the :doc:`container` variant. +.. versionadded:: 2.2.0 + Parameter **content** in **keys** added. + +.. deprecated:: 2.2.0 + Parameter **private** in **keys** will be removed in 2.3.0. + .. code-block:: json "files": @@ -53,8 +59,8 @@ mode of :doc:`desktop` or the :doc:`container` variant. ], "keys": [ - {"id": 1, "private": "0353859c2ec67780ba39015de8c682af2326d43de9ce1e07737087bd1e17cb22"}, - {"id": 2, "private": "9ad0ad7f4dfaaa06988339fc31d3a111f4c7964ac7f377373a2454327c43e2ff"} + {"id": 1, "content": "308202050201003081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a70201010482010f3082010b02010104200353859c2ec67780ba39015de8c682af2326d43de9ce1e07737087bd1e17cb22a081e33081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7020101"}, + {"id": 2, "content": "308202050201003081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a70201010482010f3082010b02010104209ad0ad7f4dfaaa06988339fc31d3a111f4c7964ac7f377373a2454327c43e2ffa081e33081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7020101"} ] @@ -68,12 +74,11 @@ The keys are used to calculate the pseudonym. Key ``1`` is used to check the blacklist while key ``2`` is used to calculate the pseudonym for the service provider. -New keys can be generated with OpenSSL. +A new key can be generated with OpenSSL (convert base64 to hex after generation). .. code-block:: console - openssl ecparam -name brainpoolP256r1 -genkey -out riKey.pem - openssl ec -in riKey.pem -text -noout + openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:brainpoolP256r1 @@ -99,7 +104,7 @@ data and is only required for eID-Client or eID-Server development. ], "keys": [ - {"id": 41, "private": "a07eb62e891daa84643e0afcc1af006891b669b8f51e379477dbeab8c987a610"} + {"id": 41, "content": "308202050201003081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a70201010482010f3082010b0201010420a07eb62e891daa84643e0afcc1af006891b669b8f51e379477dbeab8c987a610a081e33081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7020101"} ] diff --git a/libs/CMakeLists.txt b/libs/CMakeLists.txt index e9c0dcea2..cdc3dcebe 100644 --- a/libs/CMakeLists.txt +++ b/libs/CMakeLists.txt @@ -20,6 +20,7 @@ project(AusweisApp2_Libs ${COMPILER_SEARCH}) option(INTEGRATED_SDK "Build integrated specific SDK" OFF) option(CONTAINER_SDK "Build container specific SDK" OFF) +option(DEVELOPER "Include modules/features for developer" OFF) if(CONTAINER_SDK) set(INTEGRATED_SDK ON) @@ -362,6 +363,12 @@ list(APPEND NO_FEATURES_SHARED imageformat_bmp imageformat_ppm imageformat_xbm) list(APPEND NO_FEATURES_SHARED sharedmemory textodfwriter) list(APPEND NO_FEATURES_SHARED undocommand undogroup undostack) list(APPEND NO_FEATURES_SHARED printsupport dtls dom sql xml pdf) +list(APPEND NO_FEATURES_SHARED brotli topleveldomain private_tests dnslookup sctp) +list(APPEND NO_FEATURES_SHARED localserver filesystemwatcher libresolv) +list(APPEND NO_FEATURES_SHARED quickcontrols2-imagine quickcontrols2-material quickcontrols2-universal) +if(NOT DEVELOPER) + list(APPEND NO_FEATURES_SHARED quickcontrols2-fusion) +endif() if(CONTAINER_SDK) list(APPEND NO_FEATURES_SHARED testlib androiddeployqt) endif() @@ -439,7 +446,7 @@ elseif(ANDROID) set(QT_ENV OPENSSL_LIBS=-lcrypto_${CMAKE_ANDROID_ARCH_ABI}\ -lssl_${CMAKE_ANDROID_ARCH_ABI}) set(QT_CONFIGURE_FLAGS ${QT_CONFIGURE_FLAGS} ${QT_CONFIGURE_FLAGS_OTHER} - -android-sdk ${ANDROID_SDK} -android-ndk ${CMAKE_ANDROID_NDK} -android-ndk-platform android-${CMAKE_SYSTEM_VERSION} + -android-sdk ${ANDROID_SDK_ROOT} -android-ndk ${CMAKE_ANDROID_NDK} -android-ndk-platform android-${CMAKE_SYSTEM_VERSION} -android-abis ${CMAKE_ANDROID_ARCH_ABI} -xplatform android-clang) # ANDROID_TARGET_SDK_VERSION cannot be passed here as Qt has it's own variable and uses the latest in "${ANDROID_SDK_ROOT}/platforms". diff --git a/libs/Versions.cmake b/libs/Versions.cmake index f1da9a664..4467b330b 100644 --- a/libs/Versions.cmake +++ b/libs/Versions.cmake @@ -1,5 +1,5 @@ -set(QT 6.5.3) -set(QT_HASH 7cda4d119aad27a3887329cfc285f2aba5da85601212bcb0aea27bd6b7b544cb) +set(QT 6.7.2) +set(QT_HASH 0aaea247db870193c260e8453ae692ca12abc1bd841faa1a6e6c99459968ca8a) -set(OPENSSL 3.1.5) -set(OPENSSL_HASH 6ae015467dabf0469b139ada93319327be24b98251ffaeceda0221848dc09262) +set(OPENSSL 3.3.1) +set(OPENSSL_HASH 777cd596284c883375a2a7a11bf5d2786fc5413255efab20c50d6ffe6d020b7e) diff --git a/libs/patches.cmake b/libs/patches.cmake index 6763c10fb..cea5d1ff9 100644 --- a/libs/patches.cmake +++ b/libs/patches.cmake @@ -93,10 +93,11 @@ function(get_version_branch prefix _version _branch) set(tmp_branch ${tmp_branch}_${OPENSSL}) elseif(prefix MATCHES "qt") set(version v${QT}) + set(tmp_branch ${tmp_branch}_${QT}) if(version MATCHES "-rc$") set(version ${version}1) + set(tmp_branch ${tmp_branch}1) endif() - set(tmp_branch ${tmp_branch}_${QT}) endif() set(${_version} "${version}" PARENT_SCOPE) diff --git a/libs/patches/openssl-0001-Remove-ios-version-min.patch b/libs/patches/openssl-0001-Remove-ios-version-min.patch deleted file mode 100644 index 1d084b728..000000000 --- a/libs/patches/openssl-0001-Remove-ios-version-min.patch +++ /dev/null @@ -1,22 +0,0 @@ -From ffaa7261d0f7dcf8ad43a6b14f00690e44a1a639 Mon Sep 17 00:00:00 2001 -From: Lars Schmertmann -Date: Fri, 12 Feb 2021 13:15:00 +0100 -Subject: Remove ios-version-min - ---- - Configurations/15-ios.conf | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git x/Configurations/15-ios.conf y/Configurations/15-ios.conf -index 54d37f63f445d450ae767903da4d102328b0f142..59739aecebe21780a3990f3f78e10ae92755514b 100644 ---- x/Configurations/15-ios.conf -+++ y/Configurations/15-ios.conf -@@ -25,7 +25,7 @@ my %targets = ( - "ios64-xcrun" => { - inherit_from => [ "ios-common" ], - CC => "xcrun -sdk iphoneos cc", -- cflags => add("-arch arm64 -mios-version-min=7.0.0 -fno-common"), -+ cflags => add("-arch arm64 -fno-common"), - bn_ops => "SIXTY_FOUR_BIT_LONG RC4_CHAR", - asm_arch => 'aarch64', - perlasm_scheme => "ios64", diff --git a/libs/patches/openssl-0002-android-shlib_variant.patch b/libs/patches/openssl-0001-android-shlib_variant.patch similarity index 79% rename from libs/patches/openssl-0002-android-shlib_variant.patch rename to libs/patches/openssl-0001-android-shlib_variant.patch index 24ab79bd7..3151fd338 100644 --- a/libs/patches/openssl-0002-android-shlib_variant.patch +++ b/libs/patches/openssl-0001-android-shlib_variant.patch @@ -1,4 +1,4 @@ -From 6fcf03eed2146978a92a3d75eead3bcde7766211 Mon Sep 17 00:00:00 2001 +From 550be844ea2eae755ff693681c18c3394b2f8ad1 Mon Sep 17 00:00:00 2001 From: Lars Schmertmann Date: Tue, 19 Jan 2021 17:07:51 +0100 Subject: android shlib_variant @@ -8,10 +8,10 @@ Subject: android shlib_variant 1 file changed, 4 insertions(+) diff --git x/Configurations/15-android.conf y/Configurations/15-android.conf -index 41ad9223e0945d65ecffc82e0e5c31fd130fd0fe..f804aeb11b9687885eb74451d8b09c4f18c3ed16 100644 +index 1de6b7a91571d7ec22f8549effc5867819663164..3aa2fcdf15ab6b41cdbdceca0778fbdce9c7de6b 100644 --- x/Configurations/15-android.conf +++ y/Configurations/15-android.conf -@@ -225,12 +225,14 @@ my %targets = ( +@@ -226,12 +226,14 @@ my %targets = ( bn_ops => add("RC4_CHAR"), asm_arch => 'armv4', perlasm_scheme => "void", @@ -26,7 +26,7 @@ index 41ad9223e0945d65ecffc82e0e5c31fd130fd0fe..f804aeb11b9687885eb74451d8b09c4f }, "android-mips" => { -@@ -262,12 +264,14 @@ my %targets = ( +@@ -263,12 +265,14 @@ my %targets = ( asm_arch => 'x86', perlasm_scheme => "android", ex_libs => add(threads("-latomic")), @@ -40,4 +40,4 @@ index 41ad9223e0945d65ecffc82e0e5c31fd130fd0fe..f804aeb11b9687885eb74451d8b09c4f + shlib_variant => '_x86_64', }, - #################################################################### + "android-riscv64" => { diff --git a/libs/patches/openssl-0002-Fix-SSL_select_next_proto.patch b/libs/patches/openssl-0002-Fix-SSL_select_next_proto.patch new file mode 100644 index 000000000..0edf1fdbd --- /dev/null +++ b/libs/patches/openssl-0002-Fix-SSL_select_next_proto.patch @@ -0,0 +1,109 @@ +From 9e26fbb33b28628e106c91c2ba7fde7545a4eb89 Mon Sep 17 00:00:00 2001 +From: Matt Caswell +Date: Fri, 31 May 2024 11:14:33 +0100 +Subject: Fix SSL_select_next_proto + +Ensure that the provided client list is non-NULL and starts with a valid +entry. When called from the ALPN callback the client list should already +have been validated by OpenSSL so this should not cause a problem. When +called from the NPN callback the client list is locally configured and +will not have already been validated. Therefore SSL_select_next_proto +should not assume that it is correctly formatted. + +We implement stricter checking of the client protocol list. We also do the +same for the server list while we are about it. + +CVE-2024-5535 + +Reviewed-by: Tomas Mraz +Reviewed-by: Neil Horman +(Merged from https://github.com/openssl/openssl/pull/24716) + +(cherry picked from commit 2ebbe2d7ca8551c4cb5fbb391ab9af411708090e) +(cherry picked from commit e86ac436f0bd54d4517745483e2315650fae7b2c) +--- + ssl/ssl_lib.c | 63 ++++++++++++++++++++++++++++++++------------------- + 1 file changed, 40 insertions(+), 23 deletions(-) + +diff --git x/ssl/ssl_lib.c y/ssl/ssl_lib.c +index 5ec6ac4b63dc582059ebe0297b0562226c35f311..4c20ac4bf1fe7a48a7c5ed99641b84e774f1efeb 100644 +--- x/ssl/ssl_lib.c ++++ y/ssl/ssl_lib.c +@@ -3530,37 +3530,54 @@ int SSL_select_next_proto(unsigned char **out, unsigned char *outlen, + unsigned int server_len, + const unsigned char *client, unsigned int client_len) + { +- unsigned int i, j; +- const unsigned char *result; +- int status = OPENSSL_NPN_UNSUPPORTED; ++ PACKET cpkt, csubpkt, spkt, ssubpkt; ++ ++ if (!PACKET_buf_init(&cpkt, client, client_len) ++ || !PACKET_get_length_prefixed_1(&cpkt, &csubpkt) ++ || PACKET_remaining(&csubpkt) == 0) { ++ *out = NULL; ++ *outlen = 0; ++ return OPENSSL_NPN_NO_OVERLAP; ++ } ++ ++ /* ++ * Set the default opportunistic protocol. Will be overwritten if we find ++ * a match. ++ */ ++ *out = (unsigned char *)PACKET_data(&csubpkt); ++ *outlen = (unsigned char)PACKET_remaining(&csubpkt); + + /* + * For each protocol in server preference order, see if we support it. + */ +- for (i = 0; i < server_len;) { +- for (j = 0; j < client_len;) { +- if (server[i] == client[j] && +- memcmp(&server[i + 1], &client[j + 1], server[i]) == 0) { +- /* We found a match */ +- result = &server[i]; +- status = OPENSSL_NPN_NEGOTIATED; +- goto found; ++ if (PACKET_buf_init(&spkt, server, server_len)) { ++ while (PACKET_get_length_prefixed_1(&spkt, &ssubpkt)) { ++ if (PACKET_remaining(&ssubpkt) == 0) ++ continue; /* Invalid - ignore it */ ++ if (PACKET_buf_init(&cpkt, client, client_len)) { ++ while (PACKET_get_length_prefixed_1(&cpkt, &csubpkt)) { ++ if (PACKET_equal(&csubpkt, PACKET_data(&ssubpkt), ++ PACKET_remaining(&ssubpkt))) { ++ /* We found a match */ ++ *out = (unsigned char *)PACKET_data(&ssubpkt); ++ *outlen = (unsigned char)PACKET_remaining(&ssubpkt); ++ return OPENSSL_NPN_NEGOTIATED; ++ } ++ } ++ /* Ignore spurious trailing bytes in the client list */ ++ } else { ++ /* This should never happen */ ++ return OPENSSL_NPN_NO_OVERLAP; + } +- j += client[j]; +- j++; + } +- i += server[i]; +- i++; ++ /* Ignore spurious trailing bytes in the server list */ + } + +- /* There's no overlap between our protocols and the server's list. */ +- result = client; +- status = OPENSSL_NPN_NO_OVERLAP; +- +- found: +- *out = (unsigned char *)result + 1; +- *outlen = result[0]; +- return status; ++ /* ++ * There's no overlap between our protocols and the server's list. We use ++ * the default opportunistic protocol selected earlier ++ */ ++ return OPENSSL_NPN_NO_OVERLAP; + } + + #ifndef OPENSSL_NO_NEXTPROTONEG 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 4746462a8..996f6b7f9 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 @@ -1,4 +1,4 @@ -From 40410b9e2ba5d02b457bb37fc90663585573ca53 Mon Sep 17 00:00:00 2001 +From 3d84a5d1671aa3b7143c445ef7c8f6e62569c7a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= Date: Mon, 25 Jul 2022 17:08:54 +0200 Subject: Revert "Fix usage of logging category on Android" @@ -11,10 +11,10 @@ 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 7e708c9c41285b8d899e3f8c0380a7218771c538..96c3bc5dc617af2bae08773da60d975e1b34050a 100644 +index a511af32ee36dcbaadc902f19c12f07e4f928c39..f94d1cd72857e02b9aa02f69ee5973f386a256e8 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 +@@ -1562,10 +1562,7 @@ static QString formatLogMessage(QtMsgType type, const QMessageLogContext &contex } else if (token == messageTokenC) { message.append(str); } else if (token == categoryTokenC) { @@ -25,7 +25,7 @@ index 7e708c9c41285b8d899e3f8c0380a7218771c538..96c3bc5dc617af2bae08773da60d975e } else if (token == typeTokenC) { switch (type) { case QtDebugMsg: message.append("debug"_L1); break; -@@ -1844,11 +1841,7 @@ static bool android_default_message_handler(QtMsgType type, +@@ -1815,11 +1812,7 @@ static bool android_default_message_handler(QtMsgType type, break; }; diff --git a/libs/patches/qtbase-0005-Do-not-override-OPENSSL_API_COMPAT.patch b/libs/patches/qtbase-0002-Do-not-override-OPENSSL_API_COMPAT.patch similarity index 92% rename from libs/patches/qtbase-0005-Do-not-override-OPENSSL_API_COMPAT.patch rename to libs/patches/qtbase-0002-Do-not-override-OPENSSL_API_COMPAT.patch index 392e1306e..583147b6d 100644 --- a/libs/patches/qtbase-0005-Do-not-override-OPENSSL_API_COMPAT.patch +++ b/libs/patches/qtbase-0002-Do-not-override-OPENSSL_API_COMPAT.patch @@ -1,4 +1,4 @@ -From 1d935cfe1de1a015561ee8755c67ec9c8a1bd121 Mon Sep 17 00:00:00 2001 +From bae9825a4ca2c021e75adc9c82f821c37eb50ad5 Mon Sep 17 00:00:00 2001 From: Klitzing Date: Thu, 31 Aug 2023 13:19:55 +0200 Subject: Do not override OPENSSL_API_COMPAT 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 deleted file mode 100644 index 8425ce9d5..000000000 --- a/libs/patches/qtbase-0002-Fix-warning-in-q20algorithm.h-when-xcodebuild-is-use.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 0fa22a4be5abda44d34cf7c5d0352378c2f9fd54 Mon Sep 17 00:00:00 2001 -From: Lars Schmertmann -Date: Mon, 9 Jan 2023 06:54:53 +0100 -Subject: Fix warning in q20algorithm.h when xcodebuild is used - -q20algorithm.h:150:20: error: unused function template 'operator()' -q20algorithm.h:163:20: error: unused function template 'operator()' -q20algorithm.h:176:20: error: unused function template 'operator()' - -Fixes: QTBUG-109874 -Change-Id: If5ccbfffd0b6a53f73f221b45033dab7e4775d89 ---- - src/corelib/global/q20algorithm.h | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git x/qtbase/src/corelib/global/q20algorithm.h y/qtbase/src/corelib/global/q20algorithm.h -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; - [[maybe_unused]] inline constexpr struct { // Niebloid - template -- constexpr bool operator()(InputIterator first, Sentinel last, Predicate pred, Projection proj = {}) const -+ [[maybe_unused]] constexpr bool operator()(InputIterator first, Sentinel last, Predicate pred, Projection proj = {}) const - { - while (first != last) { - if (std::invoke(pred, std::invoke(proj, *first))) -@@ -160,7 +160,7 @@ using std::ranges::none_of; - [[maybe_unused]] inline constexpr struct { // Niebloid - template -- constexpr bool operator()(InputIterator first, Sentinel last, Predicate pred, Projection proj = {}) const -+ [[maybe_unused]] constexpr bool operator()(InputIterator first, Sentinel last, Predicate pred, Projection proj = {}) const - { - while (first != last) { - if (!std::invoke(pred, std::invoke(proj, *first))) -@@ -173,7 +173,7 @@ using std::ranges::none_of; - [[maybe_unused]] inline constexpr struct { // Niebloid - template -- constexpr bool operator()(InputIterator first, Sentinel last, Predicate pred, Projection proj = {}) const -+ [[maybe_unused]] constexpr bool operator()(InputIterator first, Sentinel last, Predicate pred, Projection proj = {}) const - { - while (first != last) { - if (std::invoke(pred, std::invoke(proj, *first))) diff --git a/libs/patches/qtbase-0003-Enable-frameworks-by-default-for-shared-library-buil.patch b/libs/patches/qtbase-0003-Enable-frameworks-by-default-for-shared-library-buil.patch new file mode 100644 index 000000000..359377221 --- /dev/null +++ b/libs/patches/qtbase-0003-Enable-frameworks-by-default-for-shared-library-buil.patch @@ -0,0 +1,52 @@ +From 6d8445072c9223f721c34031233e0404c283f2a9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= +Date: Mon, 12 Feb 2024 11:57:34 +0100 +Subject: Enable frameworks by default for shared library builds on Apple + platforms + +Many modern features of the Apple application build and packaging pipeline +require that the libraries are shipped as frameworks, so that they can +embed resources (privacy manifest e.g.), be signed, and have their own +Info.plist. + +We build and ship our binary packages already as frameworks, and it has +been the default for release builds for a while. Let's enable it for +debug builds as well, so that developers are testing what we ship +(debug is the default for -developer-build). + +The error about debug builds not being compatible with frameworks has +been removed, as this works fine in practice. With CMake we don't add +a '_debug' suffix to the libraries unconditionally for debug builds. + +Change-Id: I373b982affd8cf70b215d4a92225467ff1037fe8 +Reviewed-by: Alexandru Croitor +(cherry picked from commit fee15182949e88682131399c50b679be83a75385) +--- + configure.cmake | 7 +------ + 1 file changed, 1 insertion(+), 6 deletions(-) + +diff --git x/qtbase/configure.cmake y/qtbase/configure.cmake +index 08766d94d0a43b5443bd2549bc3f630c1f6bed55..f84254e0dc72ec269f6b70e81078d5eb8a55a906 100644 +--- x/qtbase/configure.cmake ++++ y/qtbase/configure.cmake +@@ -577,7 +577,7 @@ qt_feature("headersclean" + qt_feature_config("headersclean" QMAKE_PRIVATE_CONFIG) + qt_feature("framework" PUBLIC + LABEL "Build Apple Frameworks" +- CONDITION APPLE AND BUILD_SHARED_LIBS AND NOT CMAKE_BUILD_TYPE STREQUAL Debug ++ CONDITION APPLE AND BUILD_SHARED_LIBS + ) + qt_feature_definition("framework" "QT_MAC_FRAMEWORK_BUILD") + qt_feature_config("framework" QMAKE_PUBLIC_QT_CONFIG +@@ -1241,11 +1241,6 @@ qt_configure_add_report_entry( + MESSAGE "-debug-and-release is only supported on Darwin and Windows platforms. Qt can be built in release mode with separate debug information, so -debug-and-release is no longer necessary." + CONDITION INPUT_debug_and_release STREQUAL 'yes' AND NOT APPLE AND NOT WIN32 + ) +-qt_configure_add_report_entry( +- TYPE ERROR +- MESSAGE "debug-only framework builds are not supported. Configure with -no-framework if you want a pure debug build." +- CONDITION QT_FEATURE_framework AND QT_FEATURE_debug AND NOT QT_FEATURE_debug_and_release +-) + qt_configure_add_report_entry( + TYPE ERROR + MESSAGE "Static builds don't support RPATH" 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 deleted file mode 100644 index c65324841..000000000 --- a/libs/patches/qtbase-0003-Revert-iOS-Don-t-invalidate-a11y-whenever-UI-element.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 525b1bd08f9805685134f6f2272edff80fe4b023 Mon Sep 17 00:00:00 2001 -From: Andre Klitzing -Date: Mon, 24 Jul 2023 16:13:12 +0200 -Subject: Revert "iOS: Don't invalidate a11y whenever UI elements are added or - removed" - -This reverts commit 6eefbf74149164eac316cea59a00b45f70976ad2. ---- - .../platforms/ios/qiosplatformaccessibility.mm | 17 ++++------------- - src/plugins/platforms/ios/qioswindow.mm | 1 - - .../platforms/ios/quiview_accessibility.mm | 1 + - 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 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) - // This will invalidate everything regardless of what window the - // interface belonged to. We might want to revisit this strategy later. - // (Therefore this function still takes the interface as argument) -+ // It is also responsible for the bug that focus gets temporary lost -+ // when items get added or removed from the screen - foreach (QWindow *win, QGuiApplication::topLevelWindows()) { - if (win && win->handle()) { - QT_PREPEND_NAMESPACE(QIOSWindow) *window = static_cast(win->handle()); -@@ -36,25 +38,14 @@ void invalidateCache(QAccessibleInterface *iface) - - void QIOSPlatformAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event) - { -- auto *accessibleInterface = event->accessibleInterface(); -- if (!isActive() || !accessibleInterface) -+ if (!isActive() || !event->accessibleInterface()) - return; - switch (event->type()) { - case QAccessible::ObjectCreated: - case QAccessible::ObjectShow: - case QAccessible::ObjectHide: - case QAccessible::ObjectDestroyed: -- invalidateCache(accessibleInterface); -- switch (accessibleInterface->role()) { -- case QAccessible::Window: -- case QAccessible::Dialog: -- // Bigger changes to the UI require a full reset of VoiceOver -- UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil); -- break; -- default: -- // While smaller changes can be handled by re-reading the layout -- UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, nil); -- } -+ invalidateCache(event->accessibleInterface()); - break; - default: - break; -diff --git x/qtbase/src/plugins/platforms/ios/qioswindow.mm y/qtbase/src/plugins/platforms/ios/qioswindow.mm -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() - [m_view touchesCancelled:[NSSet set] withEvent:0]; - - clearAccessibleCache(); -- - m_view.platformWindow = 0; - [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 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 @@ - - (void)clearAccessibleCache - { - [m_accessibleElements removeAllObjects]; -+ UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, @""); - } - - // this is a container, returning yes here means the functions below will never be called 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 deleted file mode 100644 index 56a8fbcf2..000000000 --- a/libs/patches/qtbase-0004-Fix-living-QLibProxyWrapper-after-shutdown-of-QCoreA.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 496b958b6c0026a681a9ee8871894a079dc2ea5c Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= -Date: Fri, 18 Aug 2023 14:32:57 +0200 -Subject: Fix living QLibProxyWrapper after shutdown of QCoreApplication - -Pick-to: 6.6 6.5 -Task-number: QTBUG-84234 -Change-Id: I8f5e2947b6529a0a8871d040050205934ee60354 ---- - src/network/kernel/qnetworkproxy_libproxy.cpp | 2 +- - 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 46066b86f72ab7d8ffb4e7dd0d51e257a244d9f5..6de7a7fb763f777bcd479fef74cb3fe613e3d74b 100644 ---- x/qtbase/src/network/kernel/qnetworkproxy_libproxy.cpp -+++ y/qtbase/src/network/kernel/qnetworkproxy_libproxy.cpp -@@ -72,7 +72,7 @@ private: - Data *request; - }; - --Q_GLOBAL_STATIC(QLibProxyWrapper, libProxyWrapper); -+Q_APPLICATION_STATIC(QLibProxyWrapper, libProxyWrapper) - - QLibProxyWrapper::QLibProxyWrapper() - { diff --git a/libs/patches/qtbase-0004-cmake-Allow-static-library-framework-builds-for-macO.patch b/libs/patches/qtbase-0004-cmake-Allow-static-library-framework-builds-for-macO.patch new file mode 100644 index 000000000..0def38440 --- /dev/null +++ b/libs/patches/qtbase-0004-cmake-Allow-static-library-framework-builds-for-macO.patch @@ -0,0 +1,44 @@ +From f5ecf2b064c0d71cbec385a3322ecdaa7dd12cf2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= +Date: Mon, 12 Feb 2024 18:26:16 +0100 +Subject: cmake: Allow static library framework builds for macOS and iOS + +Frameworks on Apple systems have traditionally been wrappers around +dynamic libraries (with headers and other resources bundled alongside +the library), but nowadays it's fully supported to have frameworks +with static libraries inside them. + +Enabling this allows us to build Qt for iOS statically, but as +frameworks, which allows us to include privacy manifests for the +Qt libraries in the frameworks. + +At build time Xcode will link the static library into the application, +as normal, so nothing changes there. If the user then chooses to +embed the Qt frameworks via the Xcode UI, the build system will +not copy the static libraries inside the frameworks, but will +copy the privacy manifest and other resources, which in turn +allows Xcode to generate a privacy report for the application +as a whole. + +Task-number: QTBUG-114319 +Change-Id: Ibc8c70a97d288e27811eaedd242613fa206617e5 +Reviewed-by: Alexandru Croitor +(cherry picked from commit 291817b0bf3f351843b0c1d0de237dc8df5c0fa5) +--- + configure.cmake | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git x/qtbase/configure.cmake y/qtbase/configure.cmake +index f84254e0dc72ec269f6b70e81078d5eb8a55a906..cc0718448980566fd39f9287ea6267e82c24f3fa 100644 +--- x/qtbase/configure.cmake ++++ y/qtbase/configure.cmake +@@ -577,7 +577,8 @@ qt_feature("headersclean" + qt_feature_config("headersclean" QMAKE_PRIVATE_CONFIG) + qt_feature("framework" PUBLIC + LABEL "Build Apple Frameworks" +- CONDITION APPLE AND BUILD_SHARED_LIBS ++ AUTODETECT BUILD_SHARED_LIBS ++ CONDITION APPLE + ) + qt_feature_definition("framework" "QT_MAC_FRAMEWORK_BUILD") + qt_feature_config("framework" QMAKE_PUBLIC_QT_CONFIG diff --git a/libs/patches/qtbase-0005-cmake-Generate-Apple-privacy-manifest-files-for-Qt-m.patch b/libs/patches/qtbase-0005-cmake-Generate-Apple-privacy-manifest-files-for-Qt-m.patch new file mode 100644 index 000000000..1ef140a93 --- /dev/null +++ b/libs/patches/qtbase-0005-cmake-Generate-Apple-privacy-manifest-files-for-Qt-m.patch @@ -0,0 +1,300 @@ +From 00bc861d4a715afb5348a04463c58ef4d9d1f111 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= +Date: Mon, 12 Feb 2024 15:19:56 +0100 +Subject: cmake: Generate Apple privacy manifest files for Qt modules + +The default manifest is a minimal file that claims NSPrivacyTracking +false, along with an empty list of NSPrivacyTrackingDomains and +NSPrivacyCollectedDataTypes, as Qt does not generally do user tracking. + +Modules can override the default manifest by setting the +PRIVACY_MANIFEST target property, specifying a custom privacy +manifest. + +The NSPrivacyAccessedAPITypes key is only required for iOS for now. +Even though we don't build Qt for iOS as frameworks yet, which is +required to embed a privacy manifest, we include the keys for the +APIs we known we use. + +Task-number: QTBUG-114319 +Change-Id: I654bb52b98ee963adeeb744b35f3a1c2a1270969 +Reviewed-by: Alexandru Croitor +(cherry picked from commit 9cca899574ea44cd9c4f2be096e8b7a70f6280f2) +--- + cmake/QtBaseGlobalTargets.cmake | 10 ++++++ + cmake/QtBuildHelpers.cmake | 4 +++ + cmake/QtModuleHelpers.cmake | 17 ++++++++++ + cmake/ios/PrivacyInfo.xcprivacy | 14 +++++++++ + cmake/macos/PrivacyInfo.xcprivacy | 12 +++++++ + src/corelib/CMakeLists.txt | 5 +++ + .../platform/ios/PrivacyInfo.xcprivacy | 31 +++++++++++++++++++ + src/gui/CMakeLists.txt | 5 +++ + src/gui/platform/ios/PrivacyInfo.xcprivacy | 23 ++++++++++++++ + src/widgets/CMakeLists.txt | 5 +++ + .../platform/ios/PrivacyInfo.xcprivacy | 25 +++++++++++++++ + 11 files changed, 151 insertions(+) + create mode 100644 cmake/ios/PrivacyInfo.xcprivacy + create mode 100644 cmake/macos/PrivacyInfo.xcprivacy + create mode 100644 src/corelib/platform/ios/PrivacyInfo.xcprivacy + create mode 100644 src/gui/platform/ios/PrivacyInfo.xcprivacy + create mode 100644 src/widgets/platform/ios/PrivacyInfo.xcprivacy + +diff --git x/qtbase/cmake/QtBaseGlobalTargets.cmake y/qtbase/cmake/QtBaseGlobalTargets.cmake +index 9a18cdd8a2b0aecd087be129ea469cba1a29d7f1..e6f6b474df3f851db27db3d99dc7527f07c34c45 100644 +--- x/qtbase/cmake/QtBaseGlobalTargets.cmake ++++ y/qtbase/cmake/QtBaseGlobalTargets.cmake +@@ -328,6 +328,7 @@ if(APPLE) + set(platform_shortname "ios") + endif() + ++ # Info.plist + qt_copy_or_install(FILES "cmake/${platform_shortname}/Info.plist.app.in" + DESTINATION "${__GlobalConfig_install_dir}/${platform_shortname}" + ) +@@ -336,6 +337,15 @@ if(APPLE) + DESTINATION "${__GlobalConfig_build_dir}/${platform_shortname}" + ) + ++ # Privacy manifest ++ qt_copy_or_install(FILES "cmake/${platform_shortname}/PrivacyInfo.xcprivacy" ++ DESTINATION "${__GlobalConfig_install_dir}/${platform_shortname}" ++ ) ++ # For examples built as part of prefix build before install ++ file(COPY "cmake/${platform_shortname}/PrivacyInfo.xcprivacy" ++ DESTINATION "${__GlobalConfig_build_dir}/${platform_shortname}" ++ ) ++ + if(IOS) + qt_copy_or_install(FILES "cmake/ios/LaunchScreen.storyboard" + DESTINATION "${__GlobalConfig_install_dir}/ios" +diff --git x/qtbase/cmake/QtBuildHelpers.cmake y/qtbase/cmake/QtBuildHelpers.cmake +index 2c1b13486735093178691e31ec804882c19d3474..48adc617121511baba16f50d3c3439d046754ce0 100644 +--- x/qtbase/cmake/QtBuildHelpers.cmake ++++ y/qtbase/cmake/QtBuildHelpers.cmake +@@ -132,6 +132,10 @@ macro(qt_internal_set_apple_archiver_flags) + endif() + endmacro() + ++macro(qt_internal_set_apple_privacy_manifest target manifest_file) ++ set_target_properties(${target} PROPERTIES _qt_privacy_manifest "${manifest_file}") ++endmacro() ++ + macro(qt_internal_set_debug_extend_target) + option(QT_CMAKE_DEBUG_EXTEND_TARGET "Debug extend_target calls in Qt's build system" OFF) + endmacro() +diff --git x/qtbase/cmake/QtModuleHelpers.cmake y/qtbase/cmake/QtModuleHelpers.cmake +index 45e59cf642319fa84f5eccbb2eeb81e2f3a83740..9eaf058865134dad81f2005c1eab64bb16b03562 100644 +--- x/qtbase/cmake/QtModuleHelpers.cmake ++++ y/qtbase/cmake/QtModuleHelpers.cmake +@@ -904,6 +904,22 @@ set(QT_ALLOW_MISSING_TOOLS_PACKAGES TRUE)") + qt_add_list_file_finalizer(qt_finalize_module ${target} ${arg_INTERNAL_MODULE} ${arg_NO_PRIVATE_MODULE}) + endfunction() + ++function(qt_internal_apply_apple_privacy_manifest target) ++ if(APPLE) ++ # Privacy manifest ++ get_target_property(is_framework ${target} FRAMEWORK) ++ if(is_framework) ++ get_target_property(privacy_manifest ${target} _qt_privacy_manifest) ++ if(NOT privacy_manifest) ++ set(privacy_manifest ++ "${__qt_internal_cmake_apple_support_files_path}/PrivacyInfo.xcprivacy") ++ endif() ++ target_sources("${target}" PRIVATE "${privacy_manifest}") ++ set_property(TARGET "${target}" APPEND PROPERTY RESOURCE "${privacy_manifest}") ++ endif() ++ endif() ++endfunction() ++ + function(qt_finalize_module target) + qt_internal_collect_module_headers(module_headers ${target}) + +@@ -927,6 +943,7 @@ function(qt_finalize_module target) + qt_generate_prl_file(${target} "${INSTALL_LIBDIR}") + qt_generate_module_pri_file("${target}" ${ARGN}) + qt_internal_generate_pkg_config_file(${target}) ++ qt_internal_apply_apple_privacy_manifest(${target}) + endfunction() + + # Get a set of Qt module related values based on the target. +diff --git x/qtbase/cmake/ios/PrivacyInfo.xcprivacy y/qtbase/cmake/ios/PrivacyInfo.xcprivacy +new file mode 100644 +index 0000000000000000000000000000000000000000..d75908da05846c6174fc8c39836b76669724e4da +--- /dev/null ++++ y/qtbase/cmake/ios/PrivacyInfo.xcprivacy +@@ -0,0 +1,14 @@ ++ ++ ++ ++ ++ NSPrivacyTracking ++ ++ NSPrivacyCollectedDataTypes ++ ++ NSPrivacyTrackingDomains ++ ++ NSPrivacyAccessedAPITypes ++ ++ ++ +diff --git x/qtbase/cmake/macos/PrivacyInfo.xcprivacy y/qtbase/cmake/macos/PrivacyInfo.xcprivacy +new file mode 100644 +index 0000000000000000000000000000000000000000..96aff954eaa2799537b124df20d16e2752dbb56b +--- /dev/null ++++ y/qtbase/cmake/macos/PrivacyInfo.xcprivacy +@@ -0,0 +1,12 @@ ++ ++ ++ ++ ++ NSPrivacyTracking ++ ++ NSPrivacyCollectedDataTypes ++ ++ NSPrivacyTrackingDomains ++ ++ ++ +diff --git x/qtbase/src/corelib/CMakeLists.txt y/qtbase/src/corelib/CMakeLists.txt +index bbe8ba8489044b18210265227cde1a1cfe3efb1e..19da4f75f4284837416980a742496ee6d335db64 100644 +--- x/qtbase/src/corelib/CMakeLists.txt ++++ y/qtbase/src/corelib/CMakeLists.txt +@@ -1446,6 +1446,11 @@ if(APPLE AND QT_FEATURE_framework AND QT_FEATURE_separate_debug_info) + ) + endif() + ++if(IOS) ++ qt_internal_set_apple_privacy_manifest(Core ++ "${CMAKE_CURRENT_SOURCE_DIR}/platform/ios/PrivacyInfo.xcprivacy") ++endif() ++ + set(linker_script_contents "") + if (QT_NAMESPACE STREQUAL "") + set(tag_symbol "qt_version_tag") +diff --git x/qtbase/src/corelib/platform/ios/PrivacyInfo.xcprivacy y/qtbase/src/corelib/platform/ios/PrivacyInfo.xcprivacy +new file mode 100644 +index 0000000000000000000000000000000000000000..5f84a229a57f8c48be787d148d2266e7f1abe20a +--- /dev/null ++++ y/qtbase/src/corelib/platform/ios/PrivacyInfo.xcprivacy +@@ -0,0 +1,31 @@ ++ ++ ++ ++ ++ NSPrivacyTracking ++ ++ NSPrivacyCollectedDataTypes ++ ++ NSPrivacyTrackingDomains ++ ++ NSPrivacyAccessedAPITypes ++ ++ ++ NSPrivacyAccessedAPIType ++ NSPrivacyAccessedAPICategoryFileTimestamp ++ NSPrivacyAccessedAPITypeReasons ++ ++ 0A2A.1 ++ ++ ++ ++ NSPrivacyAccessedAPIType ++ NSPrivacyAccessedAPICategoryDiskSpace ++ NSPrivacyAccessedAPITypeReasons ++ ++ 85F4.1 ++ ++ ++ ++ ++ +diff --git x/qtbase/src/gui/CMakeLists.txt y/qtbase/src/gui/CMakeLists.txt +index b6f74369ae5f4f7f71cc24c2f4bf938613a422ec..e876d351d12ac512a38695a5ac250426a1420352 100644 +--- x/qtbase/src/gui/CMakeLists.txt ++++ y/qtbase/src/gui/CMakeLists.txt +@@ -1039,4 +1039,9 @@ qt_internal_add_docs(Gui + doc/qtgui.qdocconf + ) + ++if(IOS) ++ qt_internal_set_apple_privacy_manifest(Gui ++ "${CMAKE_CURRENT_SOURCE_DIR}/platform/ios/PrivacyInfo.xcprivacy") ++endif() ++ + qt_internal_add_optimize_full_flags() +diff --git x/qtbase/src/gui/platform/ios/PrivacyInfo.xcprivacy y/qtbase/src/gui/platform/ios/PrivacyInfo.xcprivacy +new file mode 100644 +index 0000000000000000000000000000000000000000..bde2b167c75a82d933f75194bc0fbae8e9b840bc +--- /dev/null ++++ y/qtbase/src/gui/platform/ios/PrivacyInfo.xcprivacy +@@ -0,0 +1,23 @@ ++ ++ ++ ++ ++ NSPrivacyTracking ++ ++ NSPrivacyCollectedDataTypes ++ ++ NSPrivacyTrackingDomains ++ ++ NSPrivacyAccessedAPITypes ++ ++ ++ NSPrivacyAccessedAPIType ++ NSPrivacyAccessedAPICategorySystemBootTime ++ NSPrivacyAccessedAPITypeReasons ++ ++ 35F9.1 ++ ++ ++ ++ ++ +diff --git x/qtbase/src/widgets/CMakeLists.txt y/qtbase/src/widgets/CMakeLists.txt +index f77117dc563205c7faae5fa57fc9845ec07c5baa..2ba8e4719a7bdf4bb9de636bb591b1d5abcfd286 100644 +--- x/qtbase/src/widgets/CMakeLists.txt ++++ y/qtbase/src/widgets/CMakeLists.txt +@@ -911,6 +911,11 @@ qt_internal_add_docs(Widgets + doc/qtwidgets.qdocconf + ) + ++if(IOS) ++ qt_internal_set_apple_privacy_manifest(Widgets ++ "${CMAKE_CURRENT_SOURCE_DIR}/platform/ios/PrivacyInfo.xcprivacy") ++endif() ++ + # include the snippet projects for developer-builds + if(QT_FEATURE_private_tests) + add_subdirectory(doc/snippets/customviewstyle) +diff --git x/qtbase/src/widgets/platform/ios/PrivacyInfo.xcprivacy y/qtbase/src/widgets/platform/ios/PrivacyInfo.xcprivacy +new file mode 100644 +index 0000000000000000000000000000000000000000..819b868e1a739c85fff02d4a42817d035580497d +--- /dev/null ++++ y/qtbase/src/widgets/platform/ios/PrivacyInfo.xcprivacy +@@ -0,0 +1,25 @@ ++ ++ ++ ++ ++ NSPrivacyTracking ++ ++ NSPrivacyCollectedDataTypes ++ ++ NSPrivacyTrackingDomains ++ ++ NSPrivacyAccessedAPITypes ++ ++ ++ NSPrivacyAccessedAPIType ++ NSPrivacyAccessedAPICategoryFileTimestamp ++ NSPrivacyAccessedAPITypeReasons ++ ++ DDA9.1 ++ C617.1 ++ 3B52.1 ++ ++ ++ ++ ++ diff --git a/libs/patches/qtbase-0006-Android-Remove-check-for-screen-window-ascpect-ratio.patch b/libs/patches/qtbase-0006-Android-Remove-check-for-screen-window-ascpect-ratio.patch new file mode 100644 index 000000000..1f52ab7f1 --- /dev/null +++ b/libs/patches/qtbase-0006-Android-Remove-check-for-screen-window-ascpect-ratio.patch @@ -0,0 +1,54 @@ +From 4f855a2b7b7d779a8a81ba4723bd238620f49386 Mon Sep 17 00:00:00 2001 +From: Jan Moeller +Date: Thu, 6 Jun 2024 11:30:27 +0200 +Subject: Android: Remove check for screen/window ascpect ratio mismatch +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The check was re-introduced in 7a9bc220c70745cd3689d51cd131efde86f078d7 +and moved to QtRootLayout in 6ff88f97a6d24d1098583421161f8f903f9dafde. +It introduces an issue where the resizing of the application window does +not work if the its aspect ratio is different from the screen's aspect +ratio. + +Fixes: QTBUG-126122 +Pick-to: 6.7.2 6.7 6.8 +Change-Id: Id6d26b247b9ca7a8d0e89e1fdea2d77db12a6cfe +Reviewed-by: Tinja Paavoseppä +Reviewed-by: Assam Boudjelthia +(cherry picked from commit a6b78e6f4dbbf688fc0b1d1487b86890b149d323) +--- + .../qtproject/qt/android/QtRootLayout.java | 19 ------------------- + 1 file changed, 19 deletions(-) + +diff --git x/qtbase/src/android/jar/src/org/qtproject/qt/android/QtRootLayout.java y/qtbase/src/android/jar/src/org/qtproject/qt/android/QtRootLayout.java +index 3dae587a7102108fc50d09840a3887ee3df14c94..ed0f64cca9c81aa1072dee451daa150c345e31f2 100644 +--- x/qtbase/src/android/jar/src/org/qtproject/qt/android/QtRootLayout.java ++++ y/qtbase/src/android/jar/src/org/qtproject/qt/android/QtRootLayout.java +@@ -50,25 +50,6 @@ public class QtRootLayout extends QtLayout + if (activity == null) + return; + +- DisplayMetrics realMetrics = new DisplayMetrics(); +- Display display = (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) +- ? activity.getWindowManager().getDefaultDisplay() +- : activity.getDisplay(); +- +- if (display == null) +- return; +- +- display.getRealMetrics(realMetrics); +- if ((realMetrics.widthPixels > realMetrics.heightPixels) != (w > h)) { +- // This is an intermediate state during display rotation. +- // The new size is still reported for old orientation, while +- // realMetrics contain sizes for new orientation. Setting +- // such parameters will produce inconsistent results, so +- // we just skip them. +- // We will have another onSizeChanged() with normal values +- // a bit later. +- return; +- } + QtDisplayManager.setApplicationDisplayMetrics(activity, w, h); + QtDisplayManager.handleOrientationChanges(activity); + } 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 deleted file mode 100644 index 1b20bca06..000000000 --- a/libs/patches/qtbase-0006-xkb-fix-build-with-libxkbcommon-1.6.0-and-later.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 62ae219de264975c0f7e7546b702471d70af4b40 Mon Sep 17 00:00:00 2001 -From: Liang Qi -Date: Tue, 10 Oct 2023 14:08:48 +0200 -Subject: xkb: fix build with libxkbcommon 1.6.0 and later -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -A few XKB_KEY_dead_* defines got removed from 1.6.0. See also -https://github.com/xkbcommon/libxkbcommon/blob/6073565903488cb5b9a8d37fdc4a7c2f9d7ad04d/NEWS#L9-L14 -https://gitlab.freedesktop.org/xorg/proto/xorgproto/-/merge_requests/70/diffs?commit_id=cb44799b72f611eb4c9d7cc185bc3b09e070be08 - -Pick-to: 6.6 6.5 6.2 5.15 -Fixes: QTBUG-117950 -Change-Id: I55861868f2bb29c553d68365fa9b9b6ed01c9aea -Reviewed-by: Tor Arne Vestbø -(cherry picked from commit 8af35d27e8f02bbb99aef4ac495ed406e50e3cca) ---- - src/gui/platform/unix/qxkbcommon.cpp | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git x/qtbase/src/gui/platform/unix/qxkbcommon.cpp y/qtbase/src/gui/platform/unix/qxkbcommon.cpp -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( - Xkb2Qt, - Xkb2Qt, - Xkb2Qt, -+/* The following four XKB_KEY_dead keys got removed in libxkbcommon 1.6.0 -+ The define check is kind of version check here. */ -+#ifdef XKB_KEY_dead_lowline - Xkb2Qt, - Xkb2Qt, - Xkb2Qt, - Xkb2Qt, -+#endif - - // Special keys from X.org - This include multimedia keys, - // wireless/bluetooth/uwb keys, special launcher keys, etc. diff --git a/libs/patches/qtbase-0007-Android-restart-whole-app-if-the-activity-was-restar.patch b/libs/patches/qtbase-0007-Android-restart-whole-app-if-the-activity-was-restar.patch new file mode 100644 index 000000000..cd61f29af --- /dev/null +++ b/libs/patches/qtbase-0007-Android-restart-whole-app-if-the-activity-was-restar.patch @@ -0,0 +1,139 @@ +From 3d335f3c8e554512c04c5e727c2d04a93efa678a Mon Sep 17 00:00:00 2001 +From: Assam Boudjelthia +Date: Wed, 12 Jun 2024 13:05:16 +0300 +Subject: Android: restart whole app if the activity was restarted +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +If the Activity restart path is run while m_layout is null, +it would lead to a NullPointerException when trying to +access m_layout. Moreover, the code here doesn't make sense, +as m_layout.getParent() should probably be only done when +super.updateActivityAfterRestart() returns true because if +it returns false, the app will be restarted anyway. + +Testing the restarting behavior of the Activity, it seems +that the code code doesn't really work in bringing the app +to a usable state after an activity restart, and this code +path should be re-evaluated. Thus, I'm simplifying the logic +to only restart the whole app, and later figure out a way to +do a proper smooth transition instead. + +Fixes: QTBUG-124786 +Pick-to: 6.8 6.7 +Change-Id: I79f0c53c815bf71c831d0b930f358c9fd820a2d4 +Reviewed-by: Tinja Paavoseppä +(cherry picked from commit 7602f71aa6cd10ff1b16d154fa967c8fce8e8d0a) +--- + .../qtproject/qt/android/QtActivityBase.java | 28 +++++++++---------- + .../qt/android/QtActivityDelegate.java | 15 ---------- + .../qt/android/QtActivityDelegateBase.java | 15 ---------- + 3 files changed, 14 insertions(+), 44 deletions(-) + +diff --git x/qtbase/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java y/qtbase/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java +index 7b13331d9d293ebaecd29fd5a2f1b4cce98bcf17..04e7d6fd50acda89b3d92167c9aa9db97991a002 100644 +--- x/qtbase/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java ++++ y/qtbase/src/android/jar/src/org/qtproject/qt/android/QtActivityBase.java +@@ -63,25 +63,19 @@ public class QtActivityBase extends Activity + m_applicationParams += params; + } + +- private void handleActivityRestart() { +- if (QtNative.getStateDetails().isStarted) { +- boolean updated = m_delegate.updateActivityAfterRestart(this); +- if (!updated) { +- // could not update the activity so restart the application +- Intent intent = Intent.makeRestartActivityTask(getComponentName()); +- startActivity(intent); +- QtNative.quitApp(); +- Runtime.getRuntime().exit(0); +- } +- } +- } +- + @Override + public void setTheme(int resId) { + super.setTheme(resId); + m_isCustomThemeSet = true; + } + ++ private void restartApplication() { ++ Intent intent = Intent.makeRestartActivityTask(getComponentName()); ++ startActivity(intent); ++ QtNative.quitApp(); ++ Runtime.getRuntime().exit(0); ++ } ++ + @Override + protected void onCreate(Bundle savedInstanceState) + { +@@ -94,9 +88,15 @@ public class QtActivityBase extends Activity + android.R.style.Theme_Holo_Light); + } + ++ if (QtNative.getStateDetails().isStarted) { ++ // We don't yet have a reliable way to keep the app ++ // running properly in case of an Activity only restart, ++ // so for now restart the whole app. ++ restartApplication(); ++ } ++ + m_delegate = new QtActivityDelegate(this); + +- handleActivityRestart(); + addReferrer(getIntent()); + + QtActivityLoader loader = new QtActivityLoader(this); +diff --git x/qtbase/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java y/qtbase/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java +index e385432dd86b6861faec2cb206f869e17a3b2ff2..e517eea9810b29044163b164e3839713c9a2140b 100644 +--- x/qtbase/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java ++++ y/qtbase/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegate.java +@@ -74,21 +74,6 @@ public class QtActivityDelegate extends QtActivityDelegateBase + }); + } + +- @Override +- public boolean updateActivityAfterRestart(Activity activity) { +- boolean updated = super.updateActivityAfterRestart(activity); +- // TODO verify whether this is even needed, the last I checked the initMembers +- // recreates the layout anyway +- // update the new activity content view to old layout +- ViewGroup layoutParent = (ViewGroup)m_layout.getParent(); +- if (layoutParent != null) +- layoutParent.removeView(m_layout); +- +- m_activity.setContentView(m_layout); +- +- return updated; +- } +- + @Override + void startNativeApplicationImpl(String appParams, String mainLib) + { +diff --git x/qtbase/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java y/qtbase/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java +index b73fe363c3768f9ee5840d35bb1650dc0585ad6c..8603f0f69800f1aa1c5daf6a4d21b550b2e0c887 100644 +--- x/qtbase/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java ++++ y/qtbase/src/android/jar/src/org/qtproject/qt/android/QtActivityDelegateBase.java +@@ -89,21 +89,6 @@ abstract class QtActivityDelegateBase + return m_contextMenuVisible; + } + +- public boolean updateActivityAfterRestart(Activity activity) { +- try { +- // set new activity +- m_activity = activity; +- QtNative.setActivity(m_activity); +- +- // force c++ native activity object to update +- return QtNative.updateNativeActivity(); +- } catch (Exception e) { +- Log.w(QtNative.QtTAG, "Failed to update the activity."); +- e.printStackTrace(); +- return false; +- } +- } +- + public void startNativeApplication(String appParams, String mainLib) + { + if (m_membersInitialized) 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 deleted file mode 100644 index ad2df0fa7..000000000 --- a/libs/patches/qtbase-0007-Use-SSL_CTX_set_dh_auto-if-DHparam-is-empty.patch +++ /dev/null @@ -1,120 +0,0 @@ -From 3d86ffeac0beaab4ab183cf1c184a09313425efc Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= -Date: Fri, 29 Sep 2023 08:21:21 +0200 -Subject: Use SSL_CTX_set_dh_auto if DHparam is empty -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ChangeLog][QtNetwork][QSslDiffieHellmanParameters] An empty -Diffie-Hellmann parameter enables auto selection of openssl -backend. - -Fixes: QTBUG-117666 -Change-Id: Ic2e0529d48542752ca801bcb4d609988e5ddff25 -Reviewed-by: Mårten Nordheim -(cherry picked from commit fd9c567156830a21da3cd9e127a998ae90a8e564) ---- - src/network/ssl/qsslconfiguration.cpp | 3 +++ - src/plugins/tls/openssl/qsslcontext_openssl.cpp | 4 +++- - .../tls/openssl/qsslsocket_openssl_symbols_p.h | 1 + - .../network/ssl/qsslsocket/tst_qsslsocket.cpp | 16 ++++++++++------ - 4 files changed, 17 insertions(+), 7 deletions(-) - -diff --git x/qtbase/src/network/ssl/qsslconfiguration.cpp y/qtbase/src/network/ssl/qsslconfiguration.cpp -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 - If no Diffie-Hellman parameters have been set, the QSslConfiguration object - defaults to using the 2048-bit MODP group from RFC 3526. - -+ Since 6.7 you can provide an empty Diffie-Hellman parameter to use auto selection -+ (see SSL_CTX_set_dh_auto of openssl) if the tls backend supports it. -+ - \note The default parameters may change in future Qt versions. - 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 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 - return; - } - -- if (!dhparams.isEmpty()) { -+ if (dhparams.isEmpty()) { -+ q_SSL_CTX_set_dh_auto(sslContext->ctx, 1); -+ } else { - #ifndef OPENSSL_NO_DEPRECATED_3_0 - 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 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); - - BIGNUM *q_BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret); - #define q_SSL_CTX_set_tmp_dh(ctx, dh) q_SSL_CTX_ctrl((ctx), SSL_CTRL_SET_TMP_DH, 0, (char *)dh) -+#define q_SSL_CTX_set_dh_auto(ctx, onoff) q_SSL_CTX_ctrl(ctx,SSL_CTRL_SET_DH_AUTO,onoff,NULL) - - #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 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() - if (setProxy) - return; - -+ const QSslCipher cipherWithDH("DHE-RSA-AES256-SHA256"); - SslServer server; -- server.ciphers = {QSslCipher("DHE-RSA-AES256-SHA"), QSslCipher("DHE-DSS-AES256-SHA")}; -- server.protocol = Test::TlsV1_0; -+ server.ciphers = {cipherWithDH}; -+ server.protocol = QSsl::TlsV1_2; - - QSslConfiguration cfg = server.config; - cfg.setDiffieHellmanParameters(QSslDiffieHellmanParameters()); -@@ -3516,7 +3517,6 @@ void tst_QSslSocket::dhServerCustomParamsNull() - - QSslSocket client; - QSslConfiguration config = client.sslConfiguration(); -- config.setProtocol(Test::TlsV1_0); - client.setSslConfiguration(config); - socket = &client; - connect(socket, SIGNAL(errorOccurred(QAbstractSocket::SocketError)), &loop, SLOT(quit())); -@@ -3527,7 +3527,8 @@ void tst_QSslSocket::dhServerCustomParamsNull() - - loop.exec(); - -- QVERIFY(client.state() != QAbstractSocket::ConnectedState); -+ QCOMPARE(client.state(), QAbstractSocket::ConnectedState); -+ QCOMPARE(client.sessionCipher(), cipherWithDH); - } - - void tst_QSslSocket::dhServerCustomParams() -@@ -3542,7 +3543,9 @@ void tst_QSslSocket::dhServerCustomParams() - return; - - SslServer server; -- server.ciphers = {QSslCipher("DHE-RSA-AES256-SHA"), QSslCipher("DHE-DSS-AES256-SHA")}; -+ const QSslCipher cipherWithDH("DHE-RSA-AES256-SHA256"); -+ server.ciphers = {cipherWithDH}; -+ server.protocol = QSsl::TlsV1_2; - - QSslConfiguration cfg = server.config; - -@@ -3572,7 +3575,8 @@ void tst_QSslSocket::dhServerCustomParams() - - loop.exec(); - -- QVERIFY(client.state() == QAbstractSocket::ConnectedState); -+ QCOMPARE(client.state(), QAbstractSocket::ConnectedState); -+ QCOMPARE(client.sessionCipher(), cipherWithDH); - } - #endif // QT_CONFIG(openssl) - diff --git a/libs/patches/qtbase-0008-Ask-to-scroll-to-on-focus-changes-in-iOS-VoiceOver.patch b/libs/patches/qtbase-0008-Ask-to-scroll-to-on-focus-changes-in-iOS-VoiceOver.patch new file mode 100644 index 000000000..eb66d1440 --- /dev/null +++ b/libs/patches/qtbase-0008-Ask-to-scroll-to-on-focus-changes-in-iOS-VoiceOver.patch @@ -0,0 +1,249 @@ +From 8fd4ba03ebb607a217794c1ce866cf312f7d0363 Mon Sep 17 00:00:00 2001 +From: Jan Moeller +Date: Mon, 4 Dec 2023 13:06:12 +0100 +Subject: Ask to scroll-to on focus changes in iOS VoiceOver + +By adding the UIAccessibilityElementFocusedObserver, the QML Item that +received the focus from VoiceOver is tracked. In turn, the QUIView +will try to scroll the view to bring the newly focused Item into view. +This will enhance the a11y of Flickable/ListView based UI components. +The approach tries to find the first Item with the ScrollBar role and +calls the corresponding scroll action on it, assuming the Item will be +the most useful Item to have a proper attached a11y property. + +Task-number: QTBUG-119724 +Pick-to: 6.2 6.5 6.6 6.7 +Change-Id: I7632a8dd320af7547b9d36e39f5dce7e266023a4 +--- + .../platforms/ios/qiosplatformaccessibility.h | 6 ++ + .../ios/qiosplatformaccessibility.mm | 38 +++++++ + src/plugins/platforms/ios/qioswindow.h | 1 + + src/plugins/platforms/ios/qioswindow.mm | 5 + + src/plugins/platforms/ios/quiview.h | 1 + + .../platforms/ios/quiview_accessibility.mm | 99 +++++++++++++++++++ + 6 files changed, 150 insertions(+) + +diff --git x/qtbase/src/plugins/platforms/ios/qiosplatformaccessibility.h y/qtbase/src/plugins/platforms/ios/qiosplatformaccessibility.h +index 96efc663bac896adb44a80eb5953a57ec7d92381..b8e14c14d19a807824384d4b32cce0554752506f 100644 +--- x/qtbase/src/plugins/platforms/ios/qiosplatformaccessibility.h ++++ y/qtbase/src/plugins/platforms/ios/qiosplatformaccessibility.h +@@ -10,6 +10,8 @@ + + QT_BEGIN_NAMESPACE + ++@class UIAccessibilityElementFocusedObserver; ++ + class QIOSPlatformAccessibility: public QPlatformAccessibility + { + public: +@@ -17,6 +19,10 @@ public: + ~QIOSPlatformAccessibility(); + + virtual void notifyAccessibilityUpdate(QAccessibleEvent *event); ++ ++private: ++ UIAccessibilityElementFocusedObserver* const m_FocusObserver; ++ + }; + + QT_END_NAMESPACE +diff --git x/qtbase/src/plugins/platforms/ios/qiosplatformaccessibility.mm y/qtbase/src/plugins/platforms/ios/qiosplatformaccessibility.mm +index eb18ee637eef978e8574593644652271896a2035..d79eb8203091c6b684758803c0d03b5a69e4bed7 100644 +--- x/qtbase/src/plugins/platforms/ios/qiosplatformaccessibility.mm ++++ y/qtbase/src/plugins/platforms/ios/qiosplatformaccessibility.mm +@@ -11,7 +11,45 @@ + #include "qioswindow.h" + #include "quiaccessibilityelement.h" + ++@interface UIAccessibilityElementFocusedObserver : NSObject ++ - (instancetype) init; ++ - (void) receiveNotification: (NSNotification*) notification; ++@end ++ ++@implementation UIAccessibilityElementFocusedObserver ++- (instancetype) init { ++ self = [super init]; ++ if (!self) ++ { ++ return nil; ++ } ++ ++ [[NSNotificationCenter defaultCenter] ++ addObserver:self ++ selector:@selector(receiveNotification:) ++ name:UIAccessibilityElementFocusedNotification ++ object:nil]; ++ ++ return self; ++} ++ ++- (void)receiveNotification:(NSNotification*)notification { ++ const auto element = notification.userInfo[UIAccessibilityFocusedElementKey]; ++ if (!element) ++ return; ++ ++ foreach (QWindow *win, QGuiApplication::topLevelWindows()) { ++ if (win && win->handle()) { ++ QT_PREPEND_NAMESPACE(QIOSWindow) *window = static_cast(win->handle()); ++ if (window->bringIntoView(element)) ++ return; ++ } ++ } ++} ++@end ++ + QIOSPlatformAccessibility::QIOSPlatformAccessibility() ++ : m_FocusObserver([[UIAccessibilityElementFocusedObserver alloc] init]) + {} + + QIOSPlatformAccessibility::~QIOSPlatformAccessibility() +diff --git x/qtbase/src/plugins/platforms/ios/qioswindow.h y/qtbase/src/plugins/platforms/ios/qioswindow.h +index 02b21612023427a10fa5ad9333171108a7f7507e..366179bbccbcaa2188343b017ff2fe82e26c6002 100644 +--- x/qtbase/src/plugins/platforms/ios/qioswindow.h ++++ y/qtbase/src/plugins/platforms/ios/qioswindow.h +@@ -51,6 +51,7 @@ public: + WId winId() const override { return WId(m_view); } + + void clearAccessibleCache(); ++ bool bringIntoView(id element); + + QSurfaceFormat format() const override; + +diff --git x/qtbase/src/plugins/platforms/ios/qioswindow.mm y/qtbase/src/plugins/platforms/ios/qioswindow.mm +index 027752248c8f1f5127245cb24173e0ce30c91583..d265af21b6dc22b5c2410ab4dde49ee50b065407 100644 +--- x/qtbase/src/plugins/platforms/ios/qioswindow.mm ++++ y/qtbase/src/plugins/platforms/ios/qioswindow.mm +@@ -405,6 +405,11 @@ void QIOSWindow::clearAccessibleCache() + [quiview_cast(m_view) clearAccessibleCache]; + } + ++bool QIOSWindow::bringIntoView(id element) ++{ ++ return [quiview_cast(m_view) bringIntoView:element]; ++} ++ + void QIOSWindow::requestUpdate() + { + static_cast(screen())->setUpdatesPaused(false); +diff --git x/qtbase/src/plugins/platforms/ios/quiview.h y/qtbase/src/plugins/platforms/ios/quiview.h +index 517258517295b0c08eade4e2246438c48541277c..bd4ea3875bfcc0034aa1fee279b02610df3351b8 100644 +--- x/qtbase/src/plugins/platforms/ios/quiview.h ++++ y/qtbase/src/plugins/platforms/ios/quiview.h +@@ -26,6 +26,7 @@ QT_END_NAMESPACE + + @interface QUIView (Accessibility) + - (void)clearAccessibleCache; ++- (bool)bringIntoView:(id) element; + @end + + @interface UIView (QtHelpers) +diff --git x/qtbase/src/plugins/platforms/ios/quiview_accessibility.mm y/qtbase/src/plugins/platforms/ios/quiview_accessibility.mm +index 04e1f8cfb3098b9135703bc5e24e025288643111..8494ee893680a544d91138a3c9bad14bdcca388e 100644 +--- x/qtbase/src/plugins/platforms/ios/quiview_accessibility.mm ++++ y/qtbase/src/plugins/platforms/ios/quiview_accessibility.mm +@@ -56,6 +56,105 @@ + [m_accessibleElements removeAllObjects]; + } + ++bool performAction(QAccessibleInterface* iface, const QString& actionName) ++{ ++ if (!iface || actionName.isEmpty()) ++ return NO; ++ ++ QAccessibleActionInterface *action = iface->actionInterface(); ++ if (!action) ++ return NO; ++ ++ const auto actionNames = action->actionNames(); ++ if (actionNames.contains(actionName)) { ++ action->doAction(actionName); ++ return YES; ++ } ++ ++ return NO; ++} ++ ++bool performActionUpstream(QAccessibleInterface* iface, const QString& actionName) ++{ ++ if (!iface) ++ return NO; ++ ++ if (performAction(iface, actionName)) ++ return YES; ++ ++ return performActionUpstream(iface->parent(), actionName); ++} ++ ++QAccessibleInterface* findScrollable(QAccessibleInterface* iface) ++{ ++ if (!iface) ++ return nil; ++ ++ if (iface->role() == QAccessible::ScrollBar) ++ return iface; ++ ++ return nil; ++} ++ ++QAccessibleInterface* findScrollableUpstream(QAccessibleInterface* iface) ++{ ++ if (!iface) ++ return nil; ++ ++ for (int i = 0; i < iface->childCount(); ++i) { ++ QAccessibleInterface* scrollable = findScrollable(iface->child(i)); ++ if (scrollable) ++ return scrollable; ++ } ++ ++ return findScrollableUpstream(iface->parent()); ++} ++ ++QString findMoveAction(const QRect& rect, const QRect& boundingRect) ++{ ++ if (rect.x() + rect.width() > boundingRect.x() + boundingRect.width()) ++ return QAccessibleActionInterface::scrollRightAction(); ++ if (rect.x() < boundingRect.x()) ++ return QAccessibleActionInterface::scrollLeftAction(); ++ if (rect.y() + rect.height() > boundingRect.y() + boundingRect.height()) ++ return QAccessibleActionInterface::scrollDownAction(); ++ if (rect.y() < boundingRect.y()) ++ return QAccessibleActionInterface::scrollUpAction(); ++ ++ return QString(); ++} ++ ++- (bool)bringIntoView:(id) element ++{ ++ QMacAccessibilityElement* a11yElement = element; ++ if (!a11yElement) ++ return NO; ++ ++ QAccessibleInterface* iface = QAccessible::accessibleInterface(a11yElement.axid); ++ if (!iface || iface->state().invisible) ++ return NO; ++ ++ QAccessibleInterface* scrollable = findScrollable(iface); ++ if (!scrollable) ++ scrollable = findScrollableUpstream(iface->parent()); ++ ++ const QRect elementRect = iface->rect(); ++ ++ if (scrollable) { ++ const QString action = findMoveAction(elementRect, scrollable->rect()); ++ return performAction(scrollable, action); ++ } ++ ++ // Fallback to window to do SOMETHING ++ QWindow* window = iface->window(); ++ if (!window) ++ return NO; ++ ++ const QRect boundingRect = {window->x(), window->y(), window->width(), window->height()}; ++ const QString action = findMoveAction(elementRect, boundingRect); ++ return performActionUpstream(iface, action); ++} ++ + // this is a container, returning yes here means the functions below will never be called + - (BOOL)isAccessibilityElement + { diff --git a/libs/patches/qtbase-0008-HPack-fix-a-Yoda-Condition.patch b/libs/patches/qtbase-0008-HPack-fix-a-Yoda-Condition.patch deleted file mode 100644 index edba4bbe2..000000000 --- a/libs/patches/qtbase-0008-HPack-fix-a-Yoda-Condition.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 5dfa6b292c33a37d49bb88373859118bddd68b9f Mon Sep 17 00:00:00 2001 -From: Marc Mutz -Date: Tue, 12 Dec 2023 20:51:56 +0100 -Subject: HPack: fix a Yoda Condition - -Putting the variable on the LHS of a relational operation makes the -expression easier to read. In this case, we find that the whole -expression is nonsensical as an overflow protection, because if -name.size() + value.size() overflows, the result will exactly _not_ -be > max() - 32, because UB will have happened. - -To be fixed in a follow-up commit. - -As a drive-by, add parentheses around the RHS. - -Pick-to: 6.5 6.2 5.15 -Change-Id: I35ce598884c37c51b74756b3bd2734b9aad63c09 -Reviewed-by: Allan Sandfeld Jensen -(cherry picked from commit 658607a34ead214fbacbc2cca44915655c318ea9) -Reviewed-by: Qt Cherry-pick Bot -(cherry picked from commit 4f7efd41740107f90960116700e3134f5e433867) -(cherry picked from commit 13c16b756900fe524f6d9534e8a07aa003c05e0c) ---- - src/network/access/http2/hpacktable.cpp | 2 +- - 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 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) - // 32 octets of overhead." - - const unsigned sum = unsigned(name.size() + value.size()); -- if (std::numeric_limits::max() - 32 < sum) -+ if (sum > (std::numeric_limits::max() - 32)) - return HeaderSize(); - return HeaderSize(true, quint32(sum + 32)); - } 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 deleted file mode 100644 index fdcb25583..000000000 --- a/libs/patches/qtbase-0009-HPack-fix-incorrect-integer-overflow-check.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 9758ce63ce17a3857edc9627f22518cb669fac6f Mon Sep 17 00:00:00 2001 -From: Marc Mutz -Date: Tue, 12 Dec 2023 22:08:07 +0100 -Subject: HPack: fix incorrect integer overflow check - -This code never worked: - -For the comparison with max() - 32 to trigger, on 32-bit platforms (or -Qt 5) signed interger overflow would have had to happen in the -addition of the two sizes. The compiler can therefore remove the -overflow check as dead code. - -On Qt 6 and 64-bit platforms, the signed integer addition would be -very unlikely to overflow, but the following truncation to uint32 -would yield the correct result only in a narrow 32-value window just -below UINT_MAX, if even that. - -Fix by using the proper tool, qAddOverflow. - -Pick-to: 6.5 6.2 5.15 -Change-Id: I7599f2e75ff7f488077b0c60b81022591005661c -Reviewed-by: Allan Sandfeld Jensen -(cherry picked from commit ee5da1f2eaf8932aeca02ffea6e4c618585e29e3) -Reviewed-by: Qt Cherry-pick Bot -(cherry picked from commit debeb8878da2dc706ead04b6072ecbe7e5313860) -Reviewed-by: Thiago Macieira -Reviewed-by: Marc Mutz -(cherry picked from commit 811b9eef6d08d929af8708adbf2a5effb0eb62d7) ---- - src/network/access/http2/hpacktable.cpp | 4 +++- - 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 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) - // for counting the number of references to the name and value would have - // 32 octets of overhead." - -- const unsigned sum = unsigned(name.size() + value.size()); -+ size_t sum; -+ if (qAddOverflow(size_t(name.size()), size_t(value.size()), &sum)) -+ return HeaderSize(); - if (sum > (std::numeric_limits::max() - 32)) - return HeaderSize(); - return HeaderSize(true, quint32(sum + 32)); diff --git a/libs/patches/qtbase-0009-iOS-Always-insert-created-a11y-elements-to-the-cache.patch b/libs/patches/qtbase-0009-iOS-Always-insert-created-a11y-elements-to-the-cache.patch new file mode 100644 index 000000000..32b537752 --- /dev/null +++ b/libs/patches/qtbase-0009-iOS-Always-insert-created-a11y-elements-to-the-cache.patch @@ -0,0 +1,49 @@ +From 414c483866eeeebcc6b1718b082d7b8dc6b61cab Mon Sep 17 00:00:00 2001 +From: Jan Moeller +Date: Mon, 24 Jun 2024 12:29:28 +0200 +Subject: iOS: Always insert created a11y elements to the cache +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +By having all known a11y elements in the cache, the iOS Screen Reader will +stay up-to-date with the UI elements that are currently present. +Do ensure this behavior, the ctor is made private. + +Fixes: QTBUG-126622 +Pick-to: 6.8 6.7 +Change-Id: I23452ffd60128889a49e5844a6fc17d45683cee5 +Reviewed-by: Tor Arne Vestbø +(cherry picked from 9a6c32bed15ed3aa13ff82e15ac6834d6e7bdc3b) +--- + src/plugins/platforms/ios/quiaccessibilityelement.h | 1 - + src/plugins/platforms/ios/quiview_accessibility.mm | 3 +-- + 2 files changed, 1 insertion(+), 3 deletions(-) + +diff --git x/qtbase/src/plugins/platforms/ios/quiaccessibilityelement.h y/qtbase/src/plugins/platforms/ios/quiaccessibilityelement.h +index 858032543640dd38abc707c2332719c9bc6fb8db..fa96ccbcf9f752123060855c7915019e5a1ed249 100644 +--- x/qtbase/src/plugins/platforms/ios/quiaccessibilityelement.h ++++ y/qtbase/src/plugins/platforms/ios/quiaccessibilityelement.h +@@ -13,7 +13,6 @@ + + @property (readonly) QAccessible::Id axid; + +-- (instancetype)initWithId:(QAccessible::Id)anId withAccessibilityContainer:(id)view; + + (instancetype)elementWithId:(QAccessible::Id)anId; + + @end +diff --git x/qtbase/src/plugins/platforms/ios/quiview_accessibility.mm y/qtbase/src/plugins/platforms/ios/quiview_accessibility.mm +index 8494ee893680a544d91138a3c9bad14bdcca388e..5a41faaf31032ae08703a239474fd8df2cd2d0eb 100644 +--- x/qtbase/src/plugins/platforms/ios/quiview_accessibility.mm ++++ y/qtbase/src/plugins/platforms/ios/quiview_accessibility.mm +@@ -13,9 +13,8 @@ + if (!iface || iface->state().invisible || (iface->text(QAccessible::Name).isEmpty() && iface->text(QAccessible::Value).isEmpty() && iface->text(QAccessible::Description).isEmpty())) + return; + QAccessible::Id accessibleId = QAccessible::uniqueId(iface); +- UIAccessibilityElement *elem = [[QT_MANGLE_NAMESPACE(QMacAccessibilityElement) alloc] initWithId:accessibleId withAccessibilityContainer:self]; ++ UIAccessibilityElement *elem = [QT_MANGLE_NAMESPACE(QMacAccessibilityElement) elementWithId:accessibleId]; + [m_accessibleElements addObject:elem]; +- [elem release]; + } + + - (void)createAccessibleContainer:(QAccessibleInterface *)iface 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 deleted file mode 100644 index 5ba26d0a9..000000000 --- a/libs/patches/qtbase-0010-Fix-compilation-with-MSVC-17.8.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 1af85c0777d1bdba6ed6023a9d070acfe0ef0586 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= -Date: Thu, 9 Nov 2023 13:11:35 +0100 -Subject: Fix compilation with MSVC 17.8 - -stdext is deprecated, slated for removal. - -The macros were used to work around a compiler warning generated -when using the 3-arg overload of certain STL algorithms even when -the 4-arg version (added in C++14) was not available. - -These deprecation warnings seem to have been discontinued as of - MSVC++ 14.15 _MSC_VER == 1915 (Visual Studio 2017 version 15.8) -so making the macros no-ops from VS 2022 17.8 onward is not expected -to trigger these warnings again. - -Pick-to: 6.5 6.2 5.15 -Fixes: QTBUG-118993 -Change-Id: I2c3b69d46d13f6fcccf0ffce186b984b7758f287 -Reviewed-by: Marc Mutz -(cherry picked from commit 52b6258ec846cc53ebdb1c8167edd30db39c7891) -(cherry picked from commit 24ca6bd117648e28d8b966d97c0a76036cf57345) ---- - src/corelib/global/qcompilerdetection.h | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git x/qtbase/src/corelib/global/qcompilerdetection.h y/qtbase/src/corelib/global/qcompilerdetection.h -index 70fa7f6c9f7427ff3046a6495b5fc4da6dd6bfa3..58a368934126fa78735b76bc7c5e1d252fcfdc7b 100644 ---- x/qtbase/src/corelib/global/qcompilerdetection.h -+++ y/qtbase/src/corelib/global/qcompilerdetection.h -@@ -77,8 +77,10 @@ - # define Q_UNREACHABLE_IMPL() __assume(0) - # define Q_DECL_EXPORT __declspec(dllexport) - # define Q_DECL_IMPORT __declspec(dllimport) --# define QT_MAKE_UNCHECKED_ARRAY_ITERATOR(x) stdext::make_unchecked_array_iterator(x) // Since _MSC_VER >= 1800 --# define QT_MAKE_CHECKED_ARRAY_ITERATOR(x, N) stdext::make_checked_array_iterator(x, size_t(N)) // Since _MSC_VER >= 1500 -+# if _MSC_VER < 1938 // stdext is deprecated since VS 2022 17.8 -+# define QT_MAKE_UNCHECKED_ARRAY_ITERATOR(x) stdext::make_unchecked_array_iterator(x) // Since _MSC_VER >= 1800 -+# define QT_MAKE_CHECKED_ARRAY_ITERATOR(x, N) stdext::make_checked_array_iterator(x, size_t(N)) // Since _MSC_VER >= 1500 -+# endif - - #elif defined(__BORLANDC__) || defined(__TURBOC__) - # define Q_CC_BOR diff --git a/libs/patches/qtbase-0010-Revert-Android-Detect-mouse-buttons.patch b/libs/patches/qtbase-0010-Revert-Android-Detect-mouse-buttons.patch new file mode 100644 index 000000000..8a7e9e128 --- /dev/null +++ b/libs/patches/qtbase-0010-Revert-Android-Detect-mouse-buttons.patch @@ -0,0 +1,167 @@ +From 55c028daaba60fd0cca52be42986014385b3e7f6 Mon Sep 17 00:00:00 2001 +From: Jan Moeller +Date: Wed, 26 Jun 2024 15:26:09 +0200 +Subject: Revert "Android: Detect mouse buttons" + +This reverts commit 8d8cbe87e21f05b7d611ed4be47299977288b267. +--- + .../qtproject/qt/android/QtInputDelegate.java | 8 +- + .../platforms/android/androidjniinput.cpp | 86 +++---------------- + 2 files changed, 15 insertions(+), 79 deletions(-) + +diff --git x/qtbase/src/android/jar/src/org/qtproject/qt/android/QtInputDelegate.java y/qtbase/src/android/jar/src/org/qtproject/qt/android/QtInputDelegate.java +index fb7b69c0dd1af589f28193f640f194ca9c421867..5327049f4445ab05b1e02267b7ddd970654e85dc 100644 +--- x/qtbase/src/android/jar/src/org/qtproject/qt/android/QtInputDelegate.java ++++ y/qtbase/src/android/jar/src/org/qtproject/qt/android/QtInputDelegate.java +@@ -501,8 +501,8 @@ public class QtInputDelegate implements QtInputConnection.QtInputConnectionListe + // tablet methods + + // pointer methods +- public static native void mouseDown(int winId, int x, int y, int mouseButtonState); +- public static native void mouseUp(int winId, int x, int y, int mouseButtonState); ++ public static native void mouseDown(int winId, int x, int y); ++ public static native void mouseUp(int winId, int x, int y); + public static native void mouseMove(int winId, int x, int y); + public static native void mouseWheel(int winId, int x, int y, float hDelta, float vDelta); + public static native void touchBegin(int winId); +@@ -618,11 +618,11 @@ public class QtInputDelegate implements QtInputConnection.QtInputConnectionListe + { + switch (event.getActionMasked()) { + case MotionEvent.ACTION_UP: +- mouseUp(id, (int) event.getX(), (int) event.getY(), event.getButtonState()); ++ mouseUp(id, (int) event.getX(), (int) event.getY()); + break; + + case MotionEvent.ACTION_DOWN: +- mouseDown(id, (int) event.getX(), (int) event.getY(), event.getButtonState()); ++ mouseDown(id, (int) event.getX(), (int) event.getY()); + m_oldX = (int) event.getX(); + m_oldY = (int) event.getY(); + break; +diff --git x/qtbase/src/plugins/platforms/android/androidjniinput.cpp y/qtbase/src/plugins/platforms/android/androidjniinput.cpp +index d074e73b9e5519d433089e5cae6cd6d6da4e28e8..00e6b7ca51d3e90dc09a14f3bb1cc14029c5dcdc 100644 +--- x/qtbase/src/plugins/platforms/android/androidjniinput.cpp ++++ y/qtbase/src/plugins/platforms/android/androidjniinput.cpp +@@ -28,8 +28,6 @@ Q_DECLARE_JNI_CLASS(QtLayout, "org/qtproject/qt/android/QtLayout") + namespace QtAndroidInput + { + static bool m_ignoreMouseEvents = false; +- static Qt::MouseButtons m_buttons = Qt::NoButton; +- + static QRect m_softwareKeyboardRect; + + static QList m_touchPoints; +@@ -162,72 +160,7 @@ namespace QtAndroidInput + anchor.x(), anchor.y(), rtl); + } + +- // from https://developer.android.com/reference/android/view/MotionEvent#getButtonState() +- enum AndroidMouseButton { +- BUTTON_PRIMARY = 0x00000001, +- BUTTON_SECONDARY = 0x00000002, +- BUTTON_TERTIARY = 0x00000004, +- BUTTON_BACK = 0x00000008, +- BUTTON_FORWARD = 0x00000010, +- BUTTON_STYLUS_PRIMARY = 0x00000020, +- BUTTON_STYLUS_SECONDARY = 0x00000040, +- }; +- Q_DECLARE_FLAGS(AndroidMouseButtons, AndroidMouseButton) +- +- static Qt::MouseButtons toMouseButtons(jint j_buttons) +- { +- const auto buttons = static_cast(j_buttons); +- Qt::MouseButtons mouseButtons; +- if (buttons.testFlag(BUTTON_PRIMARY)) +- mouseButtons.setFlag(Qt::LeftButton); +- +- if (buttons.testFlag(BUTTON_SECONDARY)) +- mouseButtons.setFlag(Qt::RightButton); +- +- if (buttons.testFlag(BUTTON_TERTIARY)) +- mouseButtons.setFlag(Qt::MiddleButton); +- +- if (buttons.testFlag(BUTTON_BACK)) +- mouseButtons.setFlag(Qt::BackButton); +- +- if (buttons.testFlag(BUTTON_FORWARD)) +- mouseButtons.setFlag(Qt::ForwardButton); +- +- if (buttons.testFlag(BUTTON_STYLUS_PRIMARY)) +- mouseButtons.setFlag(Qt::LeftButton); +- +- if (buttons.testFlag(BUTTON_STYLUS_SECONDARY)) +- mouseButtons.setFlag(Qt::RightButton); +- +- // Fall back to left button +- if (Q_UNLIKELY(buttons != 0 && mouseButtons == Qt::NoButton)) { +- qWarning() << "Unhandled button value:" << buttons << "Falling back to Qt::LeftButton"; +- mouseButtons = Qt::LeftButton; +- } +- return mouseButtons; +- } +- +- static void sendMouseButtonEvents(QWindow *topLevel, QPoint localPos, QPoint globalPos, +- jint mouseButtonState, QEvent::Type type) +- { +- const Qt::MouseButtons mouseButtons = toMouseButtons(mouseButtonState); +- const Qt::MouseButtons changedButtons = mouseButtons & ~m_buttons; +- +- if (changedButtons == Qt::NoButton) +- return; +- +- static_assert (sizeof(changedButtons) <= sizeof(uint), "Qt::MouseButtons size changed. Adapt code."); +- +- for (uint buttonInt = 0x1; static_cast(changedButtons) >= buttonInt; buttonInt <<= 1) { +- const auto button = static_cast(buttonInt); +- if (changedButtons.testFlag(button)) { +- QWindowSystemInterface::handleMouseEvent(topLevel, localPos, globalPos, +- mouseButtons, button, type); +- } +- } +- } +- +- static void mouseDown(JNIEnv */*env*/, jobject /*thiz*/, jint winId, jint x, jint y, jint mouseButtonState) ++ static void mouseDown(JNIEnv */*env*/, jobject /*thiz*/, jint winId, jint x, jint y) + { + if (m_ignoreMouseEvents) + return; +@@ -236,11 +169,13 @@ namespace QtAndroidInput + QWindow *window = windowFromId(winId); + m_mouseGrabber = window; + const QPoint localPos = window && window->handle() ? +- window->handle()->mapFromGlobal(globalPos) : globalPos; +- sendMouseButtonEvents(window, localPos, globalPos, mouseButtonState, QEvent::MouseButtonPress); ++ window->handle()->mapFromGlobal(globalPos) : globalPos; ++ QWindowSystemInterface::handleMouseEvent(window, localPos, globalPos, ++ Qt::MouseButtons(Qt::LeftButton), ++ Qt::LeftButton, QEvent::MouseButtonPress); + } + +- static void mouseUp(JNIEnv */*env*/, jobject /*thiz*/, jint winId, jint x, jint y, jint mouseButtonState) ++ static void mouseUp(JNIEnv */*env*/, jobject /*thiz*/, jint winId, jint x, jint y) + { + const QPoint globalPos(x,y); + QWindow *window = m_mouseGrabber.data(); +@@ -249,8 +184,9 @@ namespace QtAndroidInput + + const QPoint localPos = window && window->handle() ? + window->handle()->mapFromGlobal(globalPos) : globalPos; +- +- sendMouseButtonEvents(window, localPos, globalPos, mouseButtonState, QEvent::MouseButtonRelease); ++ QWindowSystemInterface::handleMouseEvent(window, localPos, globalPos, ++ Qt::MouseButtons(Qt::NoButton), ++ Qt::LeftButton, QEvent::MouseButtonRelease); + m_ignoreMouseEvents = false; + m_mouseGrabber.clear(); + } +@@ -964,8 +900,8 @@ namespace QtAndroidInput + {"touchAdd","(IIIZIIFFFF)V",(void*)touchAdd}, + {"touchEnd","(II)V",(void*)touchEnd}, + {"touchCancel", "(I)V", (void *)touchCancel}, +- {"mouseDown", "(IIII)V", (void *)mouseDown}, +- {"mouseUp", "(IIII)V", (void *)mouseUp}, ++ {"mouseDown", "(III)V", (void *)mouseDown}, ++ {"mouseUp", "(III)V", (void *)mouseUp}, + {"mouseMove", "(III)V", (void *)mouseMove}, + {"mouseWheel", "(IIIFF)V", (void *)mouseWheel}, + {"longPress", "(III)V", (void *)longPress}, diff --git a/libs/patches/qtbase-0011-Workaround-for-broken-keyboard-input-on-ChromeOS.patch b/libs/patches/qtbase-0011-Workaround-for-broken-keyboard-input-on-ChromeOS.patch new file mode 100644 index 000000000..05a115da7 --- /dev/null +++ b/libs/patches/qtbase-0011-Workaround-for-broken-keyboard-input-on-ChromeOS.patch @@ -0,0 +1,74 @@ +From 055ea3f9b3942c7151b72b0452a66ae8aade7cbf Mon Sep 17 00:00:00 2001 +From: Jan Moeller +Date: Thu, 13 Jun 2024 15:43:11 +0200 +Subject: Workaround for broken keyboard input on ChromeOS + +* The keyboard input was slightly broken with Qt 6.6.2 already. After changing + the SaC device name in the settings, activating elements via space did not + work anymore. +* In Qt 6.6 the Android layer used one QtEditText instance for the entire app. + Until Qt 6.7 this was reworked to support multiple windows, each QtWindow + now features its "own" QtEditText. +* On ChromeOS, keyboard input seems to get "stuck" in this case. All input + that would make sense for a text input field (letters, digits, SPACES) end + up in the (virtual) text input field and don't get dispatched to the actual + Android App. +* This workaround "forbids" the text input field to consume these inputs and + directly call the QtInputDelegate. +* Changing the SaC device name still works on ChromeOS. +* By checking if the code is run on ChromeOS, the impact on actual Android + smartphones is minimized. + +issue: QTBUG-126187, AUTENTAPP-61485 +--- + .../src/org/qtproject/qt/android/QtEditText.java | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git x/qtbase/src/android/jar/src/org/qtproject/qt/android/QtEditText.java y/qtbase/src/android/jar/src/org/qtproject/qt/android/QtEditText.java +index 7e1198c52aae24a9ac870b7bbce9b170befb0afb..09f86d769c4339fad5fedbf48cb580f0d3a57001 100644 +--- x/qtbase/src/android/jar/src/org/qtproject/qt/android/QtEditText.java ++++ y/qtbase/src/android/jar/src/org/qtproject/qt/android/QtEditText.java +@@ -5,6 +5,7 @@ + package org.qtproject.qt.android; + + import android.content.Context; ++import android.content.pm.PackageManager; + import android.graphics.Canvas; + import android.text.InputType; + import android.view.View; +@@ -20,6 +21,7 @@ public class QtEditText extends View + int m_imeOptions = 0; + int m_inputType = InputType.TYPE_CLASS_TEXT; + boolean m_optionsChanged = false; ++ boolean m_isChromeOS = false; + QtInputConnection m_inputConnection = null; + + // input method hints - must be kept in sync with QTDIR/src/corelib/global/qnamespace.h +@@ -55,6 +57,9 @@ public class QtEditText extends View + setFocusable(true); + setFocusableInTouchMode(true); + m_qtInputConnectionListener = listener; ++ ++ PackageManager packageManager = context.getPackageManager(); ++ m_isChromeOS = packageManager.hasSystemFeature("org.chromium.arc") || packageManager.hasSystemFeature("org.chromium.arc.device_management"); + } + + private void setImeOptions(int imeOptions) +@@ -114,6 +119,17 @@ public class QtEditText extends View + super.onDraw(canvas); + } + ++ @Override ++ public boolean dispatchKeyEventPreIme(KeyEvent event) { ++ if (m_isChromeOS && m_qtInputConnectionListener instanceof QtInputDelegate) { ++ final QtInputDelegate delegate = (QtInputDelegate) m_qtInputConnectionListener; ++ if (event.getAction() == KeyEvent.ACTION_DOWN) { ++ return delegate.onKeyDown(event.getKeyCode(), event); ++ } ++ return delegate.onKeyUp(event.getKeyCode(), event); ++ } ++ return super.dispatchKeyEventPreIme(event); ++ } + + public void setEditTextOptions(int enterKeyType, int inputHints) + { diff --git a/libs/patches/qtconnectivity-0001-Increase-NFC-timeout-on-Android.patch b/libs/patches/qtconnectivity-0001-Increase-NFC-timeout-on-Android.patch new file mode 100644 index 000000000..d106a7f16 --- /dev/null +++ b/libs/patches/qtconnectivity-0001-Increase-NFC-timeout-on-Android.patch @@ -0,0 +1,22 @@ +From f08d9ee3dd97ad045f579e6e9966903b78231f1f Mon Sep 17 00:00:00 2001 +From: Lars Schmertmann +Date: Tue, 13 Feb 2024 07:34:17 +0100 +Subject: Increase NFC timeout on Android + +--- + src/nfc/qnearfieldtarget_android.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git x/qtconnectivity/src/nfc/qnearfieldtarget_android.cpp y/qtconnectivity/src/nfc/qnearfieldtarget_android.cpp +index c7f842ae781bd0e24865a1bf011af2accd8dd739..95935920d89f3cc5f5e4fb1a9a7bf53d1f19c71b 100644 +--- x/qtconnectivity/src/nfc/qnearfieldtarget_android.cpp ++++ y/qtconnectivity/src/nfc/qnearfieldtarget_android.cpp +@@ -463,7 +463,7 @@ bool QNearFieldTargetPrivateImpl::connect() + if (connected) + return true; + +- setCommandTimeout(2000); ++ setCommandTimeout(3000); + methodId = env.findMethod(tagTech.objectClass(), "connect"); + if (!methodId) + return false; 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 deleted file mode 100644 index 8ef0d02e8..000000000 --- a/libs/patches/qtconnectivity-0001-Reset-status-of-isSessionScheduled-when-starting-a-i.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 11858ce383f00cbc37f863585829304d6d314df5 Mon Sep 17 00:00:00 2001 -From: Jens Trillmann -Date: Thu, 5 Oct 2023 14:56:43 +0200 -Subject: Reset status of isSessionScheduled when starting a iOS NFC session - -If a user cancels the NFC popup and then starts a new session immediately -after then isSessionScheduled gets set to true. This value has to be reset -when the session gets started as isSessionScheduled==true leads to the -QTimer always triggering a new NFC session. - -Pick-to: 6.6 6.5 -Change-Id: I53d71d5c9b419d334ac6a229cff3e32aa81e9230 -Reviewed-by: Timur Pocheptsov -(cherry picked from commit 550e1c8ad5e8204c9942814bccc558c10faf197f) ---- - src/nfc/qnearfieldmanager_ios.mm | 1 + - 1 file changed, 1 insertion(+) - -diff --git x/qtconnectivity/src/nfc/qnearfieldmanager_ios.mm y/qtconnectivity/src/nfc/qnearfieldmanager_ios.mm -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 - isSessionScheduled = true; - return true; - } -+ isSessionScheduled = false; - - if (accessMethod == QNearFieldTarget::TagTypeSpecificAccess) { - startSession(); diff --git a/libs/patches/qtconnectivity-0002-Silence-expected-java-exceptions.patch b/libs/patches/qtconnectivity-0002-Silence-expected-java-exceptions.patch deleted file mode 100644 index ac0a586bd..000000000 --- a/libs/patches/qtconnectivity-0002-Silence-expected-java-exceptions.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 9d610ad69937755ea34fb85d4bc85975ead7d396 Mon Sep 17 00:00:00 2001 -From: Julian Greilich -Date: Thu, 9 Nov 2023 14:15:43 +0100 -Subject: Silence expected java exceptions - -Since we expect the calls to "connect" and "close" in -checkIsTargetLost() to fail with IOException when the target was lost, -we dont need to print the exceptions as log warning. - -This restores the behavior like it was before the port to the new Qt 6 -Android APIs (7d2c6ae66fd61be56b35ae0c59354b695a02d6c7). - -Pick-to: 6.6 6.5 -Change-Id: Ic9e14a58827f8b24865202012708644b903d5d70 -Reviewed-by: Timur Pocheptsov -(cherry picked from commit 0692168870463c7f32434b5ee1b0e6d762e078fa) ---- - src/nfc/qnearfieldtarget_android.cpp | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git x/qtconnectivity/src/nfc/qnearfieldtarget_android.cpp y/qtconnectivity/src/nfc/qnearfieldtarget_android.cpp -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() - methodId = env.findMethod(tagTech.objectClass(), "connect"); - if (methodId) - env->CallVoidMethod(tagTech.object(), methodId); -- if (!methodId || env.checkAndClearExceptions()) { -+ if (!methodId || env.checkAndClearExceptions(QJniEnvironment::OutputMode::Silent)) { - handleTargetLost(); - return; - } - methodId = env.findMethod(tagTech.objectClass(), "close"); - if (methodId) - env->CallVoidMethod(tagTech.object(), methodId); -- if (!methodId || env.checkAndClearExceptions()) -+ if (!methodId || env.checkAndClearExceptions(QJniEnvironment::OutputMode::Silent)) - handleTargetLost(); - } - diff --git a/libs/patches/qtconnectivity-0002-iOS-Allow-to-recognize-a-security-violation.patch b/libs/patches/qtconnectivity-0002-iOS-Allow-to-recognize-a-security-violation.patch new file mode 100644 index 000000000..e1c955c6e --- /dev/null +++ b/libs/patches/qtconnectivity-0002-iOS-Allow-to-recognize-a-security-violation.patch @@ -0,0 +1,73 @@ +From 070365219ec34c7d132253305345db1c3ef73de6 Mon Sep 17 00:00:00 2001 +From: Lars Schmertmann +Date: Fri, 15 Mar 2024 14:42:43 +0100 +Subject: iOS: Allow to recognize a security violation + +Currently it is not possible to decide if an unexpected card +was used or the connection failed in general. So we need to +add a new Error to QNearFieldTarget. + +Pick-to: 6.7 +Change-Id: I8f88bb81b998e61516ed4ceef207ba1528061e7d +--- + src/nfc/qnearfieldtarget.cpp | 3 +++ + src/nfc/qnearfieldtarget.h | 3 ++- + src/nfc/qnearfieldtarget_ios.mm | 12 ++++++++---- + 3 files changed, 13 insertions(+), 5 deletions(-) + +diff --git x/qtconnectivity/src/nfc/qnearfieldtarget.cpp y/qtconnectivity/src/nfc/qnearfieldtarget.cpp +index dbcca2bd9ad4328886687843e6c1dc5be634c8b6..7df2e531c9b40b910c93733f24ebcc4b6338e0fc 100644 +--- x/qtconnectivity/src/nfc/qnearfieldtarget.cpp ++++ y/qtconnectivity/src/nfc/qnearfieldtarget.cpp +@@ -90,6 +90,9 @@ QT_IMPL_METATYPE_EXTERN_TAGGED(QNearFieldTarget::RequestId, QNearFieldTarget__Re + \value CommandError Failed to send a command to the target. + \value TimeoutError The request could not be completed within the time + specified in waitForRequestCompleted(). ++ \value SecurityViolation A security violation has occurred. As example this can occur ++ on iOS when communication with a card is started where the ++ identifier is not included in the entitlements. + */ + + /*! +diff --git x/qtconnectivity/src/nfc/qnearfieldtarget.h y/qtconnectivity/src/nfc/qnearfieldtarget.h +index 0d67011d4e2f3d23fc666f96d5207ebd53dae9b2..024d4454c8899e1b1c0f3c088e8c319dca5c7432 100644 +--- x/qtconnectivity/src/nfc/qnearfieldtarget.h ++++ y/qtconnectivity/src/nfc/qnearfieldtarget.h +@@ -59,7 +59,8 @@ public: + NdefReadError, + NdefWriteError, + CommandError, +- TimeoutError ++ TimeoutError, ++ SecurityViolation + }; + Q_ENUM(Error) + +diff --git x/qtconnectivity/src/nfc/qnearfieldtarget_ios.mm y/qtconnectivity/src/nfc/qnearfieldtarget_ios.mm +index b058ad7507065bff8c21e66c16de3eefe9d3440e..256393da290c1db19f403196eb97143b9f8b3b67 100644 +--- x/qtconnectivity/src/nfc/qnearfieldtarget_ios.mm ++++ y/qtconnectivity/src/nfc/qnearfieldtarget_ios.mm +@@ -270,15 +270,19 @@ bool QNearFieldTargetPrivateImpl::connect() + id tag = static_cast>(nfcTag.get()); + NFCTagReaderSession* session = tag.session; + [session connectToTag: tag completionHandler: ^(NSError* error){ +- const bool success = error == nil; +- QMetaObject::invokeMethod(this, [this, success] { ++ const int errorCode = error == nil ? -1 : error.code; ++ QMetaObject::invokeMethod(this, [this, errorCode] { + requestInProgress = QNearFieldTarget::RequestId(); +- if (success) { ++ if (errorCode == -1) { + connected = true; + onExecuteRequest(); + } else { + const auto requestId = queue.dequeue().first; +- reportError(QNearFieldTarget::ConnectionError, requestId); ++ reportError( ++ errorCode == NFCReaderError::NFCReaderErrorSecurityViolation ++ ? QNearFieldTarget::SecurityViolation ++ : QNearFieldTarget::ConnectionError, ++ requestId); + invalidate(); + } + }); diff --git a/libs/patches/qtdeclarative-0001-A11y-Send-a11y-events-on-Accessible.ignored-changes.patch b/libs/patches/qtdeclarative-0001-A11y-Send-a11y-events-on-Accessible.ignored-changes.patch new file mode 100644 index 000000000..663bccd36 --- /dev/null +++ b/libs/patches/qtdeclarative-0001-A11y-Send-a11y-events-on-Accessible.ignored-changes.patch @@ -0,0 +1,29 @@ +From 32e3976af18232312c83cb5b3c8e9b93f9895cb8 Mon Sep 17 00:00:00 2001 +From: Jens Trillmann +Date: Mon, 19 Feb 2024 09:41:13 +0100 +Subject: A11y: Send a11y events on Accessible.ignored changes + +The Accessible.ignored setter does not send a11y events like the setter +in the header STATE_PROPERTY macro and other setter do. This leads to +changes of Accessible.ignored not being registered by screen readers. + +Fixes: QTBUG-122436 +Pick-to: 6.5 6.6 6.7 +Change-Id: I0626b66c91876fa3e6dd23e76c32e8bfe43136bf +--- + src/quick/items/qquickaccessibleattached.cpp | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git x/qtdeclarative/src/quick/items/qquickaccessibleattached.cpp y/qtdeclarative/src/quick/items/qquickaccessibleattached.cpp +index 865fb8bf11cd956961109d2c65ec5f2989922521..0a4672382ec141e0f6a20459a3347728f0d688a1 100644 +--- x/qtdeclarative/src/quick/items/qquickaccessibleattached.cpp ++++ y/qtdeclarative/src/quick/items/qquickaccessibleattached.cpp +@@ -430,6 +430,8 @@ void QQuickAccessibleAttached::setIgnored(bool ignored) + { + if (this->ignored() != ignored && item()) { + item()->d_func()->isAccessible = !ignored; ++ QAccessibleEvent ev(item(), ignored ? QAccessible::ObjectHide : QAccessible::ObjectShow); ++ QAccessible::updateAccessibility(&ev); + emit ignoredChanged(); + } + } 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 deleted file mode 100644 index 69f30aded..000000000 --- a/libs/patches/qtdeclarative-0001-QtQml-Re-add-pthread_attr_init-to-stackPropertiesGen.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 5bb3161566b3540e6909e585675eab225dcb994a Mon Sep 17 00:00:00 2001 -From: Ulf Hermann -Date: Tue, 26 Sep 2023 12:36:09 +0200 -Subject: QtQml: Re-add pthread_attr_init() to stackPropertiesGeneric() - -Before calling pthread_attr_get_np(), as opposed to -pthread_getattr_np(), we do need to call pthread_attr_init(). Both the -FreeBSD and the NetBSD manpages tell us to do so. - -Amends commit 9f4aeeabb982cfc4306c9d350dbb68f64914fb32. - -Pick-to: 6.6 6.5 -Fixes: QTBUG-117513 -Change-Id: Ic851ba2ffcf13d268b3a53d926cb92f7bed7a3d9 -(cherry picked from commit 94e0bb6de357cb5e1fca32a4107363d95346222e) ---- - src/qml/memory/qv4stacklimits.cpp | 1 + - 1 file changed, 1 insertion(+) - -diff --git x/qtdeclarative/src/qml/memory/qv4stacklimits.cpp y/qtdeclarative/src/qml/memory/qv4stacklimits.cpp -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) - pthread_t thread = pthread_self(); - pthread_attr_t sattr; - # if defined(PTHREAD_NP_H) || defined(_PTHREAD_NP_H_) || defined(Q_OS_NETBSD) -+ pthread_attr_init(&sattr); - pthread_attr_get_np(thread, &sattr); - # else - pthread_getattr_np(thread, &sattr); diff --git a/libs/patches/qtdeclarative-0002-Fix-polish-issue-in-the-quick-layout.patch b/libs/patches/qtdeclarative-0002-Fix-polish-issue-in-the-quick-layout.patch new file mode 100644 index 000000000..09780d3d1 --- /dev/null +++ b/libs/patches/qtdeclarative-0002-Fix-polish-issue-in-the-quick-layout.patch @@ -0,0 +1,92 @@ +From 7c5c6ace67894d1bb14982e41716f834bc2f5aa9 Mon Sep 17 00:00:00 2001 +From: Santhosh Kumar +Date: Tue, 4 Jun 2024 21:20:19 +0200 +Subject: Fix polish issue in the quick layout +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The patch 3fa4719789921ff8be440ec760d8b9ab569758eb skip geometry change +of layout items when it has already been invalidated. This can cause +problems when we have nested layouts, as the dirty flag set in the +child layout during invalidate blocks further rearranging its items +(i.e. setting geometry to its items). + +This patch fixes it by allowing rearrange when the parent item is a +layout by itself. For other cases (i.e. not the nested layout), the +child layout schedules the polish, and this polish takes care of +further rearranging its items. + +Fixes: QTBUG-125481 +Pick-to: 6.8 6.7 +Change-Id: I86c5b584e27fbe71b3e740fe7b3fdb0f3ac7ae14 +Reviewed-by: Jan Arve Sæther +(cherry picked from commit 49f7eabeac959fb448482bd0a7ebb1b774bc5bcb) +--- + src/quicklayouts/qquicklayout.cpp | 3 +- + .../qquicklayouts/data/tst_rowlayout.qml | 38 +++++++++++++++++++ + 2 files changed, 40 insertions(+), 1 deletion(-) + +diff --git x/qtdeclarative/src/quicklayouts/qquicklayout.cpp y/qtdeclarative/src/quicklayouts/qquicklayout.cpp +index f38bdfd39611ed68dcdc5e3d8b9ab242d07a25af..d1b643d092ba8c7f5e822b9f5332bf74752e8e54 100644 +--- x/qtdeclarative/src/quicklayouts/qquicklayout.cpp ++++ y/qtdeclarative/src/quicklayouts/qquicklayout.cpp +@@ -923,7 +923,8 @@ void QQuickLayout::geometryChange(const QRectF &newGeometry, const QRectF &oldGe + { + Q_D(QQuickLayout); + QQuickItem::geometryChange(newGeometry, oldGeometry); +- if (invalidated() || d->m_disableRearrange || !isReady()) ++ if ((invalidated() && !qobject_cast(parentItem())) || ++ d->m_disableRearrange || !isReady()) + return; + + qCDebug(lcQuickLayouts) << "QQuickLayout::geometryChange" << newGeometry << oldGeometry; +diff --git x/qtdeclarative/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml y/qtdeclarative/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml +index d31a0b0fb8085ec08757ae5c3505a22bcb944deb..56198f0d2e8387072bb917a046f1d42539ee5bb8 100644 +--- x/qtdeclarative/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml ++++ y/qtdeclarative/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml +@@ -1512,6 +1512,44 @@ Item { + compare(itemRect(r1), [80,0,20,20]) + } + ++ Component { ++ id: rearrangeInvalidatedChildInNestedLayout ++ ColumnLayout { ++ anchors.fill: parent ++ RowLayout { ++ spacing: 0 ++ Text { ++ Layout.preferredWidth: 50 ++ text: "Text Text Text" ++ wrapMode: Text.WordWrap ++ } ++ Rectangle { ++ color: "red"; ++ Layout.preferredWidth: 50 ++ Layout.preferredHeight: 20 ++ } ++ Rectangle { ++ color: "green" ++ Layout.preferredHeight: 20 ++ Layout.fillWidth: true ++ } ++ } ++ } ++ } ++ ++ function test_rearrangeInvalidatedChildInNestedLayout() { ++ let layout = rearrangeInvalidatedChildInNestedLayout.createObject(container) ++ waitForRendering(layout) ++ ++ let item1 = layout.children[0].children[0] ++ let item2 = layout.children[0].children[1] ++ let item3 = layout.children[0].children[2] ++ ++ compare(item1.width, 50) ++ compare(item2.width, 50) ++ compare(item3.width, 100) ++ } ++ + Component { + id: changeChildrenOfHiddenLayout_Component + RowLayout { 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 deleted file mode 100644 index 52d2edc3a..000000000 --- a/libs/patches/qtdeclarative-0002-QQuickItem-fix-binding-loops-for-x-y-width-and-heigh.patch +++ /dev/null @@ -1,113 +0,0 @@ -From f3a042b0a40721b2bfa1050948faa2bfde3b3038 Mon Sep 17 00:00:00 2001 -From: Ivan Solovev -Date: Mon, 18 Sep 2023 15:16:12 +0200 -Subject: QQuickItem: fix binding loops for x, y, width, and height - -Use {set}ValueBypassingBinding() to read and write the value of the -property. -Use valueBypassingBinding() to get the values of other realted -properties before calling geometryChanged(). - -The tests for these bindable properties already exist. They will detect -the binding loops as soon as the related qtbase patch is merged. - -Fixes: QTBUG-116540 -Pick-to: 6.6 6.5 -Change-Id: Ifb6caac2d5176fa6985a170fcdfe0dceeac10936 -Reviewed-by: Fabian Kosmale -Reviewed-by: Qt CI Bot -(cherry picked from commit f85de757355889f534e9e5e858547874eb377ec5) ---- - src/quick/items/qquickitem.cpp | 32 ++++++++++++++++++++------------ - 1 file changed, 20 insertions(+), 12 deletions(-) - -diff --git x/qtdeclarative/src/quick/items/qquickitem.cpp y/qtdeclarative/src/quick/items/qquickitem.cpp -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) - if (qt_is_nan(v)) - return; - -- const qreal oldx = d->x; -+ const qreal oldx = d->x.valueBypassingBindings(); - if (oldx == v) - return; - -- d->x = v; -+ d->x.setValueBypassingBindings(v); - - d->dirty(QQuickItemPrivate::Position); - -- const qreal y = d->y, w = d->width, h = d->height; -+ const qreal y = d->y.valueBypassingBindings(); -+ const qreal w = d->width.valueBypassingBindings(); -+ const qreal h = d->height.valueBypassingBindings(); - geometryChange(QRectF(v, y, w, h), QRectF(oldx, y, w, h)); - } - -@@ -7087,17 +7089,19 @@ void QQuickItem::setY(qreal v) - if (qt_is_nan(v)) - return; - -- const qreal oldy = d->y; -+ const qreal oldy = d->y.valueBypassingBindings(); - if (oldy == v) - return; - -- d->y = v; -+ d->y.setValueBypassingBindings(v); - - d->dirty(QQuickItemPrivate::Position); - - // we use v instead of d->y, as that avoid a method call - // and we have v anyway in scope -- const qreal x = d->x, w = d->width, h = d->height; -+ const qreal x = d->x.valueBypassingBindings(); -+ const qreal w = d->width.valueBypassingBindings(); -+ const qreal h = d->height.valueBypassingBindings(); - geometryChange(QRectF(x, v, w, h), QRectF(x, oldy, w, h)); - } - -@@ -7167,15 +7171,17 @@ void QQuickItem::setWidth(qreal w) - return; - - d->widthValidFlag = true; -- const qreal oldWidth = d->width; -+ const qreal oldWidth = d->width.valueBypassingBindings(); - if (oldWidth == w) - return; - -- d->width = w; -+ d->width.setValueBypassingBindings(w); - - d->dirty(QQuickItemPrivate::Size); - -- const qreal x = d->x, y = d->y, h = d->height; -+ const qreal x = d->x.valueBypassingBindings(); -+ const qreal y = d->y.valueBypassingBindings(); -+ const qreal h = d->height.valueBypassingBindings(); - geometryChange(QRectF(x, y, w, h), QRectF(x, y, oldWidth, h)); - } - -@@ -7373,15 +7379,17 @@ void QQuickItem::setHeight(qreal h) - return; - - d->heightValidFlag = true; -- const qreal oldHeight = d->height; -+ const qreal oldHeight = d->height.valueBypassingBindings(); - if (oldHeight == h) - return; - -- d->height = h; -+ d->height.setValueBypassingBindings(h); - - d->dirty(QQuickItemPrivate::Size); - -- const qreal x = d->x, y = d->y, w = d->width; -+ const qreal x = d->x.valueBypassingBindings(); -+ const qreal y = d->y.valueBypassingBindings(); -+ const qreal w = d->width.valueBypassingBindings(); - geometryChange(QRectF(x, y, w, h), QRectF(x, y, w, oldHeight)); - } - 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 deleted file mode 100644 index 50d4fa643..000000000 --- a/libs/patches/qtdeclarative-0003-QQuickItem-more-fixes-for-bindable-properties.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 2807b7cc3697b4f01f76dea1b2539e683b7e3065 Mon Sep 17 00:00:00 2001 -From: Ivan Solovev -Date: Mon, 16 Oct 2023 15:58:54 +0200 -Subject: QQuickItem: more fixes for bindable properties - -A more detailed look revealed some more places where the properties -were incorrectly accessed from the setters. -Use the usual (set)ValueBypassingBindings() approach to fix it. - -The exceptions from the usual property handling are the setSize() -and setPosition() setters. The first one is documented to not -remove the binding, and the second one has a comment stating the -same. So, do not call removeBindingUnlessInWrapper() in these -setters. - -This commit amends f85de757355889f534e9e5e858547874eb377ec5 - -Task-number: QTBUG-117899 -Pick-to: 6.6 6.5 -Change-Id: I97a94cbf2b38c57e9a260e54c9894c2ffd47271d -Reviewed-by: Qt CI Bot -Reviewed-by: Ulf Hermann -(cherry picked from commit e8c8ddeb942f4410533e5e808c4138efb3ce4b2a) ---- - src/quick/items/qquickitem.cpp | 26 +++++++++++++++----------- - 1 file changed, 15 insertions(+), 11 deletions(-) - -diff --git x/qtdeclarative/src/quick/items/qquickitem.cpp y/qtdeclarative/src/quick/items/qquickitem.cpp -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) - void QQuickItem::setPosition(const QPointF &pos) - { - Q_D(QQuickItem); -- if (QPointF(d->x, d->y) == pos) -- return; - -- const qreal oldx = d->x; -- const qreal oldy = d->y; -+ const qreal oldx = d->x.valueBypassingBindings(); -+ const qreal oldy = d->y.valueBypassingBindings(); -+ -+ if (QPointF(oldx, oldy) == pos) -+ return; - - /* This preserves the bindings, because that was what the code used to do - The effect of this is that you can have -@@ -7135,7 +7136,8 @@ void QQuickItem::setPosition(const QPointF &pos) - - d->dirty(QQuickItemPrivate::Position); - -- const qreal w = d->width, h = d->height; -+ const qreal w = d->width.valueBypassingBindings(); -+ const qreal h = d->height.valueBypassingBindings(); - geometryChange(QRectF(pos.x(), pos.y(), w, h), QRectF(oldx, oldy, w, h)); - } - -@@ -7493,11 +7495,11 @@ void QQuickItem::setImplicitSize(qreal w, qreal h) - const qreal oldHeight = height; - if (!wDone) { - width = w; -- d->width = w; -+ d->width.setValueBypassingBindings(w); - } - if (!hDone) { - height = h; -- d->height = h; -+ d->height.setValueBypassingBindings(h); - } - - d->dirty(QQuickItemPrivate::Size); -@@ -7553,17 +7555,19 @@ void QQuickItem::setSize(const QSizeF &size) - d->heightValidFlag = true; - d->widthValidFlag = true; - -- if (d->width == size.width() && d->height == size.height()) -+ const qreal oldHeight = d->height.valueBypassingBindings(); -+ const qreal oldWidth = d->width.valueBypassingBindings(); -+ -+ if (oldWidth == size.width() && oldHeight == size.height()) - return; - -- const qreal oldHeight = d->height; -- const qreal oldWidth = d->width; - d->height.setValueBypassingBindings(size.height()); - d->width.setValueBypassingBindings(size.width()); - - d->dirty(QQuickItemPrivate::Size); - -- const qreal x = d->x, y = d->y; -+ const qreal x = d->x.valueBypassingBindings(); -+ const qreal y = d->y.valueBypassingBindings(); - geometryChange(QRectF(x, y, size.width(), size.height()), QRectF(x, y, oldWidth, oldHeight)); - } - 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 deleted file mode 100644 index 7edfa7a61..000000000 --- a/libs/patches/qtdeclarative-0004-Fix-binding-loop-issue-in-quick-layout.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 7ed9d94f4cc26e6550d9a9d5c229a56384d68bc9 Mon Sep 17 00:00:00 2001 -From: Santhosh Kumar -Date: Wed, 25 Oct 2023 16:29:07 +0200 -Subject: Fix binding loop issue in quick layout - -The quick layout item cause binding loop issue when layout item size -were updated in-between polish. - -This patch fixes this issue by avoiding size update during rearrange -and handle it during next polish. - -Fixes: QTBUG-117899 -Pick-to: 6.6 6.5 -Change-Id: I1e318335ce8b5268d878b48a02a089d703bb90ad ---- - src/quicklayouts/qquicklayout.cpp | 15 ++++++++------- - src/quicklayouts/qquicklayout_p.h | 3 ++- - src/quicklayouts/qquicklinearlayout.cpp | 2 +- - 3 files changed, 11 insertions(+), 9 deletions(-) - -diff --git x/qtdeclarative/src/quicklayouts/qquicklayout.cpp y/qtdeclarative/src/quicklayouts/qquicklayout.cpp -index fc2bcc130c20d7c2b868a921e6161facb1a1e12b..2e54949f1d9017b850d74799f399b4c1711af126 100644 ---- x/qtdeclarative/src/quicklayouts/qquicklayout.cpp -+++ y/qtdeclarative/src/quicklayouts/qquicklayout.cpp -@@ -742,14 +742,15 @@ void QQuickLayoutPrivate::applySizeHints() const - Q_Q(const QQuickLayout); - - QQuickLayout *that = const_cast(q); -+ - QQuickLayoutAttached *info = attachedLayoutObject(that, true); -+ const QSizeF minSize = q->sizeHint(Qt::MinimumSize); -+ const QSizeF maxSize = q->sizeHint(Qt::MaximumSize); -+ const QSizeF prefSize = q->sizeHint(Qt::PreferredSize); -+ info->setMinimumImplicitSize(minSize); -+ info->setMaximumImplicitSize(maxSize); - -- const QSizeF min = q->sizeHint(Qt::MinimumSize); -- const QSizeF max = q->sizeHint(Qt::MaximumSize); -- const QSizeF pref = q->sizeHint(Qt::PreferredSize); -- info->setMinimumImplicitSize(min); -- info->setMaximumImplicitSize(max); -- that->setImplicitSize(pref.width(), pref.height()); -+ that->setImplicitSize(prefSize.width(), prefSize.height()); - } - - QQuickLayout::QQuickLayout(QQuickLayoutPrivate &dd, QQuickItem *parent) -@@ -877,7 +878,7 @@ void QQuickLayout::ensureLayoutItemsUpdated(EnsureLayoutItemsUpdatedOptions opti - const_cast(this)->updateLayoutItems(); - - // make invalidate() return true -- d->m_dirty = false; -+ d->m_dirty = (options & QQuickLayout::Rearrange) ? true : false; - - 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 df9c4cad97473fa009b228832ab20d3007e9f3de..d0ccc4f185a2d157b5a8c705fb2837680e4a20f1 100644 ---- x/qtdeclarative/src/quicklayouts/qquicklayout_p.h -+++ y/qtdeclarative/src/quicklayouts/qquicklayout_p.h -@@ -49,7 +49,8 @@ public: - - enum EnsureLayoutItemsUpdatedOption { - Recursive = 0b001, -- ApplySizeHints = 0b010 -+ ApplySizeHints = 0b010, -+ Rearrange = 0b100 - }; - - Q_DECLARE_FLAGS(EnsureLayoutItemsUpdatedOptions, EnsureLayoutItemsUpdatedOption) -diff --git x/qtdeclarative/src/quicklayouts/qquicklinearlayout.cpp y/qtdeclarative/src/quicklayouts/qquicklinearlayout.cpp -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) - - // Should normally not be needed, but there might be an incoming window resize event that we - // will process before we process updatePolish() -- ensureLayoutItemsUpdated(QQuickLayout::ApplySizeHints | QQuickLayout::Recursive); -+ ensureLayoutItemsUpdated(QQuickLayout::Rearrange | QQuickLayout::Recursive); - - d->m_rearranging = true; - qCDebug(lcQuickLayouts) << objectName() << "QQuickGridLayoutBase::rearrange()" << size; diff --git a/libs/patches/qtscxml-0001-Build-statemachine-only.patch b/libs/patches/qtscxml-0001-Build-statemachine-only.patch index d22626357..65566e872 100644 --- a/libs/patches/qtscxml-0001-Build-statemachine-only.patch +++ b/libs/patches/qtscxml-0001-Build-statemachine-only.patch @@ -1,4 +1,4 @@ -From 4766db9f067c4121e77d5e80767bbe83ecf59ffc Mon Sep 17 00:00:00 2001 +From f1e7e940ec7bff5a4875803d679a8c1a2680d1f4 Mon Sep 17 00:00:00 2001 From: Andre Klitzing Date: Tue, 12 Apr 2022 11:39:12 +0200 Subject: Build statemachine only 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 ec56a60b7..9d56427e0 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 @@ -1,4 +1,4 @@ -From e00687d94bec135898675ffd87f1037c9234b0c4 Mon Sep 17 00:00:00 2001 +From 7e1f300a48a23abc1136fb03e3886a87fd4fe1bb Mon Sep 17 00:00:00 2001 From: Jan Moeller Date: Mon, 14 Feb 2022 13:46:46 +0100 Subject: Disable linguist but keep translation tools @@ -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 d85254b32ea501178fd6e948cf11e28bcdfef121..dfcfe727128412dd2291f010fc161e9b15bf1728 100644 +index ab2169dec545393074e926cd084981527b071651..63b0d1df32a854e039113d539fb8272ee788f1af 100644 --- x/qttools/src/linguist/CMakeLists.txt +++ y/qttools/src/linguist/CMakeLists.txt @@ -14,9 +14,6 @@ add_subdirectory(lrelease) @@ -21,4 +21,4 @@ index d85254b32ea501178fd6e948cf11e28bcdfef121..dfcfe727128412dd2291f010fc161e9b -endif() # Create a fake module that would emulate the Qt5::LinguistTools CMake Config package - qt_internal_add_module(Linguist NO_MODULE_HEADERS HEADER_MODULE) + qt_internal_add_module(Linguist diff --git a/libs/patches/qttools-0002-Disable-designer-and-uitools.patch b/libs/patches/qttools-0002-Disable-designer-and-uitools.patch index 2119180e7..ebb939c4d 100644 --- a/libs/patches/qttools-0002-Disable-designer-and-uitools.patch +++ b/libs/patches/qttools-0002-Disable-designer-and-uitools.patch @@ -1,4 +1,4 @@ -From 9852f44ab2b6c6e30d8c6ec4a5d45025bc13c2f4 Mon Sep 17 00:00:00 2001 +From f22b30d4fe85d20f2641d163f04e32945063b33b Mon Sep 17 00:00:00 2001 From: Andre Klitzing Date: Wed, 21 Jun 2023 12:22:46 +0200 Subject: Disable designer and uitools @@ -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 014e4c874c506ebfa78ce4c4664be39c7266e693..1574b1b20e1973a4ce8650345073743ba551f3fd 100644 +index dc03e1c144fc9ad798adec8e1ab3eb32b4a368d9..873b231b6fd29241c89c40ad061a3886341b8632 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/libs/patches/qttools-0003-Revert-Add-the-dependency-on-PrintSupport-module-to-.patch b/libs/patches/qttools-0003-Revert-Add-the-dependency-on-PrintSupport-module-to-.patch new file mode 100644 index 000000000..3bf8d8a60 --- /dev/null +++ b/libs/patches/qttools-0003-Revert-Add-the-dependency-on-PrintSupport-module-to-.patch @@ -0,0 +1,23 @@ +From 36a5a754b8dd94c18e9e1f7c0e379d099f6dcd62 Mon Sep 17 00:00:00 2001 +From: Jan Moeller +Date: Thu, 20 Jun 2024 10:44:46 +0200 +Subject: Revert "Add the dependency on PrintSupport module to the 'linguist' + feature" + +This reverts commit 99d6f17777dd2c4fa36d128ac668e662ce24a5bc. +--- + configure.cmake | 1 - + 1 file changed, 1 deletion(-) + +diff --git x/qttools/configure.cmake y/qttools/configure.cmake +index 813789e9f74f306a97b516d228d4edca8cf004c6..7d9ab8724f10a2dc05fe47d1ef4c2d7a634aa753 100644 +--- x/qttools/configure.cmake ++++ y/qttools/configure.cmake +@@ -74,7 +74,6 @@ qt_feature("kmap2qmap" PRIVATE + qt_feature("linguist" PRIVATE + LABEL "Qt Linguist" + PURPOSE "Qt Linguist can be used by translator to translate text in Qt applications." +- CONDITION TARGET Qt::PrintSupport + ) + qt_feature("pixeltool" PRIVATE + LABEL "pixeltool" diff --git a/resources/CMakeLists.txt b/resources/CMakeLists.txt index c9d67d2cf..327bceb3e 100644 --- a/resources/CMakeLists.txt +++ b/resources/CMakeLists.txt @@ -1,38 +1,7 @@ -function(GET_BASENAME _file _output) - string(REGEX REPLACE "_[\.|0-9]+" "." _file "${_file}") - set(${_output} ${_file} PARENT_SCOPE) -endfunction() - -function(FILTER_VERSIONED _files _output) - set(regex ".+_([\.|0-9]+)\.(qml|js)$") - - set(versioned_files "${_files}") - list(FILTER versioned_files INCLUDE REGEX ${regex}) - list(SORT versioned_files COMPARE NATURAL) - - list(FILTER _files EXCLUDE REGEX ${regex}) - - foreach(file ${versioned_files}) - string(REGEX MATCH ${regex} _unused "${file}") - if(CMAKE_MATCH_1 AND QT_VERSION VERSION_LESS CMAKE_MATCH_1) - GET_BASENAME("${file}" basefile) - list(FIND _files "${basefile}" index) - if(NOT index EQUAL -1) - list(REMOVE_ITEM _files "${basefile}") - list(APPEND _files "${file}") - endif() - endif() - endforeach() - - set(${_output} ${_files} PARENT_SCOPE) -endfunction() - function(WRITE_QRC _dest_file _dir _prefix _files) - FILTER_VERSIONED("${_files}" _files) file(WRITE "${_dest_file}" "\n") foreach(file ${_files}) string(REPLACE "${_dir}/" "" file_alias "${file}") - GET_BASENAME("${file_alias}" file_alias) file(APPEND "${_dest_file}" "${file}\n") endforeach() file(APPEND "${_dest_file}" "") @@ -48,18 +17,18 @@ endfunction() function(ADD_SHADERS_TO_TARGET _target) if(TARGET ${Qt}::Qml AND NOT INTEGRATED_SDK) - file(GLOB QT6_SHADERS "${RESOURCES_DIR}/shader/qt6/*.frag") - message(STATUS "QT6_SHADERS " "${QT6_SHADERS}") - foreach(shaderPath ${QT6_SHADERS}) + file(GLOB QT_SHADERS "${RESOURCES_DIR}/shader/*.frag") + foreach(shaderPath ${QT_SHADERS}) get_filename_component(shaderName ${shaderPath} NAME) - list(APPEND QT6_SHADER_OUTPUTS ${shaderName}) + list(APPEND QT_SHADER_OUTPUTS ${shaderName}) endforeach() - message(STATUS "QT6_SHADER_OUTPUTS " "${QT6_SHADER_OUTPUTS}") - qt6_add_shaders(${_target} "${_target}_shader" + + qt_add_shaders(${_target} "${_target}_shader" PRECOMPILE - PREFIX "/shader/+qt6" - FILES "${QT6_SHADERS}" - OUTPUTS "${QT6_SHADER_OUTPUTS}") + PREFIX "/shader" + FILES "${QT_SHADERS}" + OUTPUTS "${QT_SHADER_OUTPUTS}" + QUIET) endif() endfunction() @@ -98,20 +67,9 @@ endif() if(TARGET ${Qt}::Qml) - file(GLOB_RECURSE QMLDIR_FILES "${CMAKE_CURRENT_SOURCE_DIR}/qml" qmldir) - set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${QMLDIR_FILES}) - - set(ausweisapp_qml.qrc "${CMAKE_CURRENT_BINARY_DIR}/ausweisapp_qml.qrc") - WRITE_GLOB_QRC("${ausweisapp_qml.qrc}" "${CMAKE_CURRENT_SOURCE_DIR}/qml" "/qml" "*.qml" "qmldir") - list(APPEND QRC_FILES "${ausweisapp_qml.qrc}") - set(ausweisapp_license.qrc "${CMAKE_CURRENT_BINARY_DIR}/ausweisapp_license.qrc") configure_file("${RESOURCES_DIR}/ausweisapp_license.qrc.in" "${ausweisapp_license.qrc}" @ONLY) list(APPEND QRC_FILES "${ausweisapp_license.qrc}") - - set(QML_IMPORT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/qml CACHE STRING "qml files" FORCE) - - add_subdirectory(qml) endif() if(NOT INTEGRATED_SDK) @@ -130,7 +88,7 @@ if(NOT INTEGRATED_SDK) file(GLOB EXISTING_QM_FILES ${CMAKE_CURRENT_BINARY_DIR}/translations/*.qm) option(UPDATE_TRANSLATIONS "Update translations/*.ts files (WARNING: make clean will delete the *.ts files!)") - if(UPDATE_TRANSLATIONS) + if(UPDATE_TRANSLATIONS AND COMMAND qt_create_translation) option(UPDATE_TRANSLATIONS_NO_OBSOLETE "Remove obsolete translations from translations/*.ts files )") set(LUPDATE_OPTIONS -extensions c,cpp,h,ui,m,mm,qml,js -no-ui-lines -locations none) @@ -143,8 +101,10 @@ if(NOT INTEGRATED_SDK) configure_file("${CMAKE_DIR}/Translation.cmake.in" "${CMAKE_BINARY_DIR}/Translation.cmake" @ONLY) add_custom_target(update.translations COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/Translation.cmake DEPENDS ${QM_FILES}) message(WARNING "'make clean' will delete *.ts files!") - else() + elseif(COMMAND qt_add_translation) qt_add_translation(QM_FILES ${TRANSLATION_FILES}) + else() + message(WARNING "Cannot build translations") endif() list(APPEND QM_FILES ${EXISTING_QM_FILES}) @@ -157,7 +117,13 @@ endif() if(QRC_FILES) - set(RCC ${CMAKE_BINARY_DIR}/src/${PROJECT_NAME}.rcc) + if(ANDROID) + file(MAKE_DIRECTORY ${ANDROID_PACKAGE_SRC_DIR}/assets/) + set(RCC ${ANDROID_PACKAGE_SRC_DIR}/assets/${PROJECT_NAME}.rcc) + else() + set(RCC ${CMAKE_BINARY_DIR}/src/${PROJECT_NAME}.rcc) + endif() + set(RCC ${RCC} PARENT_SCOPE) qt_add_binary_resources(AusweisAppRcc "${QRC_FILES}" DESTINATION ${RCC} OPTIONS -compress-algo zlib) endif() diff --git a/resources/animations/enter_can.svg b/resources/animations/enter_can.svg index 2f3fb7edc..092a9df5c 100644 --- a/resources/animations/enter_can.svg +++ b/resources/animations/enter_can.svg @@ -1,33 +1,15 @@ - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/resources/animations/enter_password_check.svg b/resources/animations/enter_password_check.svg new file mode 100644 index 000000000..45e2c2d35 --- /dev/null +++ b/resources/animations/enter_password_check.svg @@ -0,0 +1,6 @@ + + + + diff --git a/resources/animations/enter_password_error.svg b/resources/animations/enter_password_error.svg new file mode 100644 index 000000000..47e1bedea --- /dev/null +++ b/resources/animations/enter_password_error.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/resources/animations/enter_password_warning.svg b/resources/animations/enter_password_warning.svg new file mode 100644 index 000000000..604cfea66 --- /dev/null +++ b/resources/animations/enter_password_warning.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/resources/animations/hourglass_arrows.svg b/resources/animations/hourglass_arrows.svg index 477095bae..0e59563c7 100644 --- a/resources/animations/hourglass_arrows.svg +++ b/resources/animations/hourglass_arrows.svg @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/resources/animations/hourglass_background.svg b/resources/animations/hourglass_background.svg index b1d8e9678..6b301c013 100644 --- a/resources/animations/hourglass_background.svg +++ b/resources/animations/hourglass_background.svg @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/resources/animations/hourglass_mask_bottom.svg b/resources/animations/hourglass_mask_bottom.svg index e7db476c1..d166cc819 100644 --- a/resources/animations/hourglass_mask_bottom.svg +++ b/resources/animations/hourglass_mask_bottom.svg @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/resources/animations/hourglass_mask_top.svg b/resources/animations/hourglass_mask_top.svg index 536556aed..18eb77746 100644 --- a/resources/animations/hourglass_mask_top.svg +++ b/resources/animations/hourglass_mask_top.svg @@ -11,4 +11,4 @@ - \ No newline at end of file + diff --git a/resources/animations/hourglass_sand.svg b/resources/animations/hourglass_sand.svg index dd2ca637b..d75fd9976 100644 --- a/resources/animations/hourglass_sand.svg +++ b/resources/animations/hourglass_sand.svg @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/resources/ausweisapp.qrc b/resources/ausweisapp.qrc index 2a44a58b1..2daf82129 100644 --- a/resources/ausweisapp.qrc +++ b/resources/ausweisapp.qrc @@ -3,7 +3,10 @@ animations/enter_can.svg animations/enter_new_pin.svg animations/enter_no_pin.svg + animations/enter_password_check.svg + animations/enter_password_error.svg animations/enter_password_star.svg + animations/enter_password_warning.svg animations/enter_pin.svg animations/enter_puk.svg animations/enter_remote_pin.svg @@ -18,59 +21,26 @@ animations/wait_for_idcard_usb.svg animations/wait_for_questionmark.svg animations/wait_for_reader.svg - fonts/AusweisApp_Roboto_Regular.ttf - fonts/AusweisApp_Roboto_Medium.ttf fonts/AusweisApp_Roboto_Bold.ttf + fonts/AusweisApp_Roboto_Medium.ttf + fonts/AusweisApp_Roboto_Regular.ttf images/appearance_dark_mode.svg images/appearance_light_mode.svg images/appearance_system_mode.svg + images/ausweis.svg + images/ausweis_outline.svg + images/can_info.svg + images/checkbox_indicator.svg + images/email_icon.svg images/eye_visibility_off.svg images/eye_visibility_on.svg images/faq_icon.svg images/filter.svg images/filter_off.svg - images/mydata.svg - images/material_arrow_back.svg - images/lock.svg - images/open_website.svg - images/material_location.svg - images/email_icon.svg - images/material_phone.svg - images/material_close.svg - images/material_clear.svg - images/material_check.svg - images/material_refresh.svg - images/material_block.svg - images/material_person.svg - images/material_expand_less.svg - images/material_expand_more.svg - images/material_arrow_right.svg - images/material_backspace.svg - images/checkbox_indicator.svg - images/npa.svg - images/signature.jp2 - images/logo_beta_background.svg - images/logo_beta_testing.svg - images/status_error_darkmode.svg - images/status_error_highcontrast.svg - images/status_error_lightmode.svg - images/status_ok_darkmode.svg - images/status_ok_highcontrast.svg - images/status_ok_lightmode.svg - images/status_info_darkmode.svg - images/status_info_highcontrast.svg - images/status_info_lightmode.svg - images/status_warning.svg - images/ausweis.svg - images/ausweis_outline.svg - images/identify.svg - images/info.svg - updatable-files/supported-providers.json images/icon_five_digit_pin.svg - images/icon_six_digit_pin.svg - images/icon_remote_inactive_darkmode.svg - images/icon_remote_inactive_highcontrast.svg - images/icon_remote_inactive_lightmode.svg + images/icon_remote_100_darkmode.svg + images/icon_remote_100_highcontrast.svg + images/icon_remote_100_lightmode.svg images/icon_remote_25_darkmode.svg images/icon_remote_25_highcontrast.svg images/icon_remote_25_lightmode.svg @@ -80,27 +50,72 @@ images/icon_remote_75_darkmode.svg images/icon_remote_75_highcontrast.svg images/icon_remote_75_lightmode.svg - images/icon_remote_100_darkmode.svg - images/icon_remote_100_highcontrast.svg - images/icon_remote_100_lightmode.svg - images/phone_to_pc.svg + images/icon_remote_inactive_darkmode.svg + images/icon_remote_inactive_highcontrast.svg + images/icon_remote_inactive_lightmode.svg + images/icon_six_digit_pin.svg + images/identify.svg + images/info.svg images/location_flag_de.svg images/location_flag_en.svg images/location_flag_ru.svg images/location_flag_uk.svg + images/lock.svg + images/logo_beta_background.svg + images/logo_beta_testing.svg + images/material_arrow_back.svg + images/material_arrow_right.svg + images/material_backspace.svg + images/material_block.svg + images/material_check.svg + images/material_clear.svg + images/material_close.svg + images/material_expand_less.svg + images/material_expand_more.svg + images/material_location.svg + images/material_person.svg + images/material_phone.svg + images/material_refresh.svg + images/mydata_tile.svg + images/npa.svg + images/open_website.svg + images/phone_to_pc.svg + images/puk_correct_darkmode.svg + images/puk_correct_highcontrast.svg + images/puk_correct_lightmode.svg + images/signature.jp2 images/siteWithLogo_darkmode.svg images/siteWithLogo_highcontrast.svg images/siteWithLogo_lightmode.svg + images/status_error_darkmode.svg + images/status_error_highcontrast.svg + images/status_error_lightmode.svg + images/status_info_darkmode.svg + images/status_info_highcontrast.svg + images/status_info_lightmode.svg + images/status_ok_darkmode.svg + images/status_ok_highcontrast.svg + images/status_ok_lightmode.svg + images/status_warning.svg images/trash_icon.svg - images/puk_correct_darkmode.svg - images/puk_correct_lightmode.svg - images/puk_correct_highcontrast.svg images/workflow_error_card_darkmode.svg images/workflow_error_card_highcontrast.svg images/workflow_error_card_lightmode.svg images/workflow_error_network_darkmode.svg images/workflow_error_network_highcontrast.svg images/workflow_error_network_lightmode.svg + images/workflow_error_nfc_darkmode.svg + images/workflow_error_nfc_highcontrast.svg + images/workflow_error_nfc_lightmode.svg + images/workflow_error_no_sak_darkmode.svg + images/workflow_error_no_sak_highcontrast.svg + images/workflow_error_no_sak_lightmode.svg + images/workflow_error_puk_blocked_darkmode.svg + images/workflow_error_puk_blocked_highcontrast.svg + images/workflow_error_puk_blocked_lightmode.svg + images/workflow_error_sak_connection_darkmode.svg + images/workflow_error_sak_connection_highcontrast.svg + images/workflow_error_sak_connection_lightmode.svg images/workflow_error_wrong_can_darkmode.svg images/workflow_error_wrong_can_highcontrast.svg images/workflow_error_wrong_can_lightmode.svg @@ -113,23 +128,12 @@ images/workflow_error_wrong_transportpin_darkmode.svg images/workflow_error_wrong_transportpin_highcontrast.svg images/workflow_error_wrong_transportpin_lightmode.svg - images/workflow_error_sak_connection_darkmode.svg - images/workflow_error_sak_connection_highcontrast.svg - images/workflow_error_sak_connection_lightmode.svg - images/workflow_error_no_sak_darkmode.svg - images/workflow_error_no_sak_highcontrast.svg - images/workflow_error_no_sak_lightmode.svg - images/workflow_error_puk_blocked_darkmode.svg - images/workflow_error_puk_blocked_highcontrast.svg - images/workflow_error_puk_blocked_lightmode.svg images/workflow_success_changepin_darkmode.svg images/workflow_success_changepin_highcontrast.svg images/workflow_success_changepin_lightmode.svg - images/workflow_error_nfc_darkmode.svg - images/workflow_error_nfc_highcontrast.svg - images/workflow_error_nfc_lightmode.svg - shader/ConicalGradientShader.frag shader/ColorOverlayShader.frag + shader/ConicalGradientShader.frag shader/DesaturateShader.frag + updatable-files/supported-providers.json diff --git a/resources/ausweisapp_desktop.qrc b/resources/ausweisapp_desktop.qrc index 31e6c9cd1..634140b45 100644 --- a/resources/ausweisapp_desktop.qrc +++ b/resources/ausweisapp_desktop.qrc @@ -1,57 +1,55 @@ - images/macos/appIcon.svg + images/desktop/a11y_icon.svg images/desktop/autostart.svg images/desktop/default_reader.png - images/desktop/info_white.svg images/desktop/help.svg images/desktop/help_icon.svg images/desktop/home.svg - images/desktop/titlebar_arrow.svg + images/desktop/list_icon.svg + images/desktop/material_arrow_forward.svg images/desktop/material_assistant.svg images/desktop/material_new_releases.svg + images/desktop/material_open_in_browser.svg + images/desktop/material_question_answer.svg images/desktop/material_rate_review.svg - images/desktop/notifications_on.svg + images/desktop/material_settings.svg images/desktop/notifications_off.svg - images/desktop/material_arrow_forward.svg - images/desktop/material_question_answer.svg - images/desktop/material_settings_white.svg - images/desktop/material_open_in_browser.svg - images/desktop/a11y_icon.svg - images/desktop/list_icon.svg + images/desktop/notifications_on.svg + images/desktop/privacy_icon.svg images/desktop/save_icon.svg images/desktop/settings.svg - images/desktop/privacy_icon.svg - images/desktop/warning.svg + images/desktop/titlebar_arrow.svg images/desktop/workflow_idcard_nfc.svg images/desktop/workflow_idcard_usb.svg - updatable-files/supported-readers.json + images/macos/appIcon.svg updatable-files/reader/img_ACS_ACR1281U.png updatable-files/reader/img_ACS_ACR1581U-C1.png + updatable-files/reader/img_Cherry_ST_1275.png updatable-files/reader/img_Cherry_TC_1200.png updatable-files/reader/img_Cherry_TC_1300.png - updatable-files/reader/img_cyberjack_wave.png + updatable-files/reader/img_Cherry_secure_board.png updatable-files/reader/img_FEIG_myAXXES_basic.png updatable-files/reader/img_Gemalto_Prox_DU.png updatable-files/reader/img_Gemalto_Prox_SU.png updatable-files/reader/img_HID_Global_OMNIKEY_5321_V2.png updatable-files/reader/img_HID_Omnikey_542x.png updatable-files/reader/img_HID_Omnikey_Mobile_Reader_502X_CL.png - updatable-files/reader/img_Identive_XXXX_F.png - updatable-files/reader/img_Identive_Cloud_4700_F.png updatable-files/reader/img_Identive_4701_F.png + updatable-files/reader/img_Identive_Cloud_4700_F.png updatable-files/reader/img_Identive_SCL011.png updatable-files/reader/img_Identive_SCL3711.png updatable-files/reader/img_Identive_SDI011.png + updatable-files/reader/img_Identive_XXXX_F.png updatable-files/reader/img_KOBIL_ID_Token.png updatable-files/reader/img_PersoSim.png - updatable-files/reader/img_Simulator.png updatable-files/reader/img_Reiner_SCT_cyberjack_RFID_basis.png updatable-files/reader/img_Reiner_SCT_cyberjack_RFID_komfort.png updatable-files/reader/img_Reiner_SCT_cyberjack_RFID_standard.png updatable-files/reader/img_RemoteReader.png - updatable-files/reader/img_Cherry_ST_1275.png updatable-files/reader/img_Signotec_Omega_Pad.png - updatable-files/reader/img_Cherry_secure_board.png + updatable-files/reader/img_Simulator.png + updatable-files/reader/img_cyberjack_wave.png + updatable-files/supported-readers.json diff --git a/resources/ausweisapp_mobile.qrc b/resources/ausweisapp_mobile.qrc index 61fc916be..1ec68dea3 100644 --- a/resources/ausweisapp_mobile.qrc +++ b/resources/ausweisapp_mobile.qrc @@ -1,12 +1,10 @@ images/material_add.svg - images/mobile/x.svg - images/mobile/questionmark.svg images/mobile/card.svg images/mobile/device.svg images/mobile/device_button.svg - images/mobile/mydata_button.svg + images/mobile/device_tile.svg images/mobile/generic_id_card.svg images/mobile/help.svg images/mobile/home.svg @@ -14,25 +12,29 @@ images/mobile/icon_remote.svg images/mobile/icon_simulator.svg images/mobile/icon_smart.svg - images/mobile/share.svg images/mobile/material_arrow_left.svg images/mobile/material_view_headline.svg + images/mobile/mydata.svg + images/mobile/mydata_button.svg + images/mobile/no_internet_darkmode.svg + images/mobile/no_internet_highcontrast.svg + images/mobile/no_internet_lightmode.svg images/mobile/phone_card_reader.svg images/mobile/phone_nfc.svg + images/mobile/phone_nfc_info.svg images/mobile/phone_nfc_with_card.svg images/mobile/phone_remote.svg + images/mobile/phone_remote_info.svg images/mobile/phone_simulator.svg images/mobile/phone_smart.svg - images/mobile/phone_nfc_info.svg - images/mobile/phone_remote_info.svg + images/mobile/questionmark.svg images/mobile/settings.svg + images/mobile/share.svg images/mobile/smarteid.svg - images/mobile/no_internet_darkmode.svg - images/mobile/no_internet_highcontrast.svg - images/mobile/no_internet_lightmode.svg images/mobile/workflow_success_nfc_darkmode.svg images/mobile/workflow_success_nfc_highcontrast.svg images/mobile/workflow_success_nfc_lightmode.svg + images/mobile/x.svg qtquickcontrols2.conf diff --git a/resources/ausweisapp_webservice.qrc b/resources/ausweisapp_webservice.qrc index 09d370f72..bdd8dc1d9 100644 --- a/resources/ausweisapp_webservice.qrc +++ b/resources/ausweisapp_webservice.qrc @@ -1,9 +1,9 @@ - template.html ../docs/sdk/AusweisApp_Logo.svg - images/html_templates/icon_attention.svg - images/html_templates/html_message_section.jpg images/desktop/npa.ico + images/html_templates/html_message_section.jpg + images/html_templates/icon_attention.svg + template.html diff --git a/resources/config.json.in b/resources/config.json.in index ffa4729bf..29e57739c 100644 --- a/resources/config.json.in +++ b/resources/config.json.in @@ -189,14 +189,14 @@ }, "minKeySizes": { - "Rsa": 2000, - "Dsa": 2000, - "Dh": 2000, + "Rsa": 3000, + "Dsa": 3000, + "Dh": 3000, "Ec": 250 }, "sizesIfd": { - "createRsa": 2048, + "createRsa": 3072, "min": { "Rsa": 2000, "Dsa": 2000, diff --git a/resources/images/can_info.svg b/resources/images/can_info.svg new file mode 100644 index 000000000..7d4227d57 --- /dev/null +++ b/resources/images/can_info.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/resources/images/desktop/help.svg b/resources/images/desktop/help.svg index 8c19f5c4b..cb91a3f60 100644 --- a/resources/images/desktop/help.svg +++ b/resources/images/desktop/help.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/resources/images/desktop/info_white.svg b/resources/images/desktop/info_white.svg deleted file mode 100644 index 6725deeef..000000000 --- a/resources/images/desktop/info_white.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - diff --git a/resources/images/desktop/material_settings_white.svg b/resources/images/desktop/material_settings.svg similarity index 97% rename from resources/images/desktop/material_settings_white.svg rename to resources/images/desktop/material_settings.svg index f7ca45ae7..c9eee20ee 100644 --- a/resources/images/desktop/material_settings_white.svg +++ b/resources/images/desktop/material_settings.svg @@ -1 +1 @@ - + diff --git a/resources/images/desktop/settings.svg b/resources/images/desktop/settings.svg index 430f3c75f..bbbfe0e39 100644 --- a/resources/images/desktop/settings.svg +++ b/resources/images/desktop/settings.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/resources/images/desktop/warning.svg b/resources/images/desktop/warning.svg deleted file mode 100644 index 23e6fc329..000000000 --- a/resources/images/desktop/warning.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/resources/images/material_add.svg b/resources/images/material_add.svg index 70898c171..b23b9395c 100644 --- a/resources/images/material_add.svg +++ b/resources/images/material_add.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/resources/images/material_arrow_back.svg b/resources/images/material_arrow_back.svg index 5b79d2f2c..d8637c1c0 100644 --- a/resources/images/material_arrow_back.svg +++ b/resources/images/material_arrow_back.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/resources/images/material_arrow_right.svg b/resources/images/material_arrow_right.svg index da013b208..503b199a9 100644 --- a/resources/images/material_arrow_right.svg +++ b/resources/images/material_arrow_right.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/resources/images/material_backspace.svg b/resources/images/material_backspace.svg index ec36e4070..bb496ae1c 100644 --- a/resources/images/material_backspace.svg +++ b/resources/images/material_backspace.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/resources/images/material_block.svg b/resources/images/material_block.svg index 62df84f09..272a2af7e 100644 --- a/resources/images/material_block.svg +++ b/resources/images/material_block.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/resources/images/material_expand_less.svg b/resources/images/material_expand_less.svg index 8032f4a6e..476291c34 100644 --- a/resources/images/material_expand_less.svg +++ b/resources/images/material_expand_less.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/resources/images/material_expand_more.svg b/resources/images/material_expand_more.svg index 6d040715b..e36f3b2fd 100644 --- a/resources/images/material_expand_more.svg +++ b/resources/images/material_expand_more.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/resources/images/material_person.svg b/resources/images/material_person.svg index a65b4a8e0..6325cb795 100644 --- a/resources/images/material_person.svg +++ b/resources/images/material_person.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/resources/images/material_refresh.svg b/resources/images/material_refresh.svg index b8d69f402..1cd6ba8ad 100644 --- a/resources/images/material_refresh.svg +++ b/resources/images/material_refresh.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/resources/images/mobile/device.svg b/resources/images/mobile/device.svg index 8dc7a07c3..a594f0087 100644 --- a/resources/images/mobile/device.svg +++ b/resources/images/mobile/device.svg @@ -1,41 +1,80 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/mobile/device_tile.svg b/resources/images/mobile/device_tile.svg new file mode 100644 index 000000000..8dc7a07c3 --- /dev/null +++ b/resources/images/mobile/device_tile.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/mobile/material_arrow_left.svg b/resources/images/mobile/material_arrow_left.svg index 6be21091e..8411c78f6 100644 --- a/resources/images/mobile/material_arrow_left.svg +++ b/resources/images/mobile/material_arrow_left.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/resources/images/mobile/material_view_headline.svg b/resources/images/mobile/material_view_headline.svg index 1ee5f9a0f..7ecb80e92 100644 --- a/resources/images/mobile/material_view_headline.svg +++ b/resources/images/mobile/material_view_headline.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/resources/images/mobile/mydata.svg b/resources/images/mobile/mydata.svg new file mode 100644 index 000000000..152aa6e82 --- /dev/null +++ b/resources/images/mobile/mydata.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/mobile/phone_nfc_with_card.svg b/resources/images/mobile/phone_nfc_with_card.svg index 7235e985a..fb476d66f 100644 --- a/resources/images/mobile/phone_nfc_with_card.svg +++ b/resources/images/mobile/phone_nfc_with_card.svg @@ -2,4 +2,4 @@ - \ No newline at end of file + diff --git a/resources/images/mobile/x.svg b/resources/images/mobile/x.svg index 6445d732d..bc8aa2654 100644 --- a/resources/images/mobile/x.svg +++ b/resources/images/mobile/x.svg @@ -4,7 +4,7 @@ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 16.9 16.9" overflow="visible" xml:space="preserve"> - diff --git a/resources/images/mydata.svg b/resources/images/mydata_tile.svg similarity index 100% rename from resources/images/mydata.svg rename to resources/images/mydata_tile.svg diff --git a/resources/images/puk_correct_lightmode.svg b/resources/images/puk_correct_lightmode.svg index 30e93778f..0af8a8dab 100644 --- a/resources/images/puk_correct_lightmode.svg +++ b/resources/images/puk_correct_lightmode.svg @@ -85,4 +85,4 @@ - \ No newline at end of file + diff --git a/resources/images/status_warning.svg b/resources/images/status_warning.svg index b9105f577..bc0e3f8b5 100644 --- a/resources/images/status_warning.svg +++ b/resources/images/status_warning.svg @@ -1,12 +1,8 @@ - - - - - - - - - - - + + + + + + + diff --git a/resources/images/workflow_error_no_sak_darkmode.svg b/resources/images/workflow_error_no_sak_darkmode.svg index 16775573b..24e4437b6 100644 --- a/resources/images/workflow_error_no_sak_darkmode.svg +++ b/resources/images/workflow_error_no_sak_darkmode.svg @@ -21,9 +21,9 @@ - - diff --git a/resources/images/workflow_error_no_sak_lightmode.svg b/resources/images/workflow_error_no_sak_lightmode.svg index 7bd1fb1fb..eb9c5ab25 100644 --- a/resources/images/workflow_error_no_sak_lightmode.svg +++ b/resources/images/workflow_error_no_sak_lightmode.svg @@ -21,9 +21,9 @@ - - diff --git a/resources/jenkins/check_formatting.sh b/resources/jenkins/check_formatting.sh new file mode 100755 index 000000000..80b33c316 --- /dev/null +++ b/resources/jenkins/check_formatting.sh @@ -0,0 +1,79 @@ +#!/bin/sh + +if [ -z "$BUILD_URL" ]; then +echo "Warning: This script should be called on jenkins only" + exit 1 +fi + +REVISION_CURRENT=$(hg id -i) + +# Check if the current repository state is formatted +cmake --build ../build --target format +STATUS_CURRENT=$(hg status | wc -c) +if [ "$STATUS_CURRENT" != "0" ]; then + echo 'Current repository state is not formatted!' + hg addremove + hg diff + hg commit -m "fix formatting" -s +fi +REVISION_FORMATTED=$(hg id -i) + +if [ ! -f ../patch.diff ] && [ -n "$NO_PATCH" ]; then + if [ "$STATUS_CURRENT" != "0" ]; then + echo 'FORMATTING FAILED' + else + echo 'FORMATTING SUCCEDED' + fi + exit 0 +fi + +# Rollback any changes +hg update -C -r "$REVISION_CURRENT" + +# Apply patch on the current repository state +hg --config patch.eol=auto --config phases.new-commit=secret import -m 'jenkins patch formatting' -d 'today' -u 'jenkins' ../patch.diff +if [ "$?" != "0" ]; then + echo 'FORMATTING FAILED: Patch cannot be applied' + exit 0 +fi + +# Check if the repository state is formatted after the patch +cmake --build ../build --target rebuild_cache +cmake --build ../build --target format +STATUS_PATCH=$(hg status | wc -c) +if [ "$STATUS_PATCH" = "0" ]; then + if [ "$STATUS_CURRENT" != "0" ]; then + echo 'Patch fixes repository formatting.' + fi + echo 'FORMATTING SUCCEDED' + exit 0 +elif [ "$STATUS_CURRENT" = "0" ]; then + echo 'FORMATTING FAILED: Patch is not formatted' + hg diff + hg revert -a -C + exit 0 +fi + +# Checkout formatted repository state +hg update -C -r "$REVISION_FORMATTED" + +# Apply patch on the formatted repository state +hg --config patch.eol=auto --config phases.new-commit=secret import -m 'jenkins patch formatting' -d 'today' -u 'jenkins' ../patch.diff +if [ "$?" != "0" ]; then + echo 'FORMATTING FAILED: Patch cannot be applied, because the current repository state is unformatted and the patch conflicts with the formatted repository state without fixing the formatting!' + exit 0 +fi + +# Check if the patch itself is formatted even though is does not fix +# the unformatted repository state +cmake --build ../build --target rebuild_cache +cmake --build ../build --target format +STATUS_PATCH=$(hg status | wc -c) +if [ "$STATUS_PATCH" != "0" ]; then + echo 'FORMATTING FAILED: Patch is not formatted' + hg diff + hg revert -a -C + exit 0 +fi + +echo 'FORMATTING SUCCEDED: Patch does not introduce new formatting issues.' diff --git a/resources/jenkins/docker/alpine-common/Dockerfile b/resources/jenkins/docker/alpine-common/Dockerfile index 68fa974db..6a3865f79 100644 --- a/resources/jenkins/docker/alpine-common/Dockerfile +++ b/resources/jenkins/docker/alpine-common/Dockerfile @@ -12,6 +12,7 @@ RUN mkdir /build/ && \ cmake --build build && \ cmake --install build && \ apk --no-cache del deps && \ + apk --no-cache add dos2unix && \ rm -rf /build diff --git a/resources/jenkins/docker/alpine-docs/Dockerfile b/resources/jenkins/docker/alpine-docs/Dockerfile index 218ca5686..eff4c708b 100644 --- a/resources/jenkins/docker/alpine-docs/Dockerfile +++ b/resources/jenkins/docker/alpine-docs/Dockerfile @@ -3,7 +3,7 @@ MAINTAINER Governikus KG ENV NAME=Docs LABELS=Docs -RUN apk --no-cache add py3-setuptools icu poppler zziplib enscript ghostscript texlive-full py3-sphinx py3-sphinx_rtd_theme py3-sphinx-copybutton && \ +RUN apk --no-cache add py3-setuptools icu poppler zziplib enscript ghostscript texlive-full py3-sphinx py3-sphinx_rtd_theme py3-sphinx-copybutton py3-sphinxcontrib-tabs && \ pip3 install --break-system-packages doc8 USER governikus diff --git a/resources/jenkins/dsl/Builds/Build_Android.groovy b/resources/jenkins/dsl/Builds/Build_Android.groovy index 2d14dfc42..a2a5fa374 100644 --- a/resources/jenkins/dsl/Builds/Build_Android.groovy +++ b/resources/jenkins/dsl/Builds/Build_Android.groovy @@ -10,7 +10,7 @@ def j = new Build name: 'Android_APK_' + ARCH, libraries: 'Android_' + ARCH, label: 'Android', - artifacts: 'build/dist/**/AusweisApp-*.apk*,build/debug.symbols/*' + artifacts: 'build/dist/**/AusweisApp-*.apk*,build/src/libAusweisApp*' ).generate(this) @@ -30,10 +30,10 @@ j.with { shell("cd source; cmake --preset ci-android-apk -DCMAKE_ANDROID_ARCH_ABI=${ARCH}") shell('cmake --build build') - shell('cmake --install build') shell('cmake --build build --target apk') shell('cmake --build build --target verify.signature') shell('cmake --build build --target dump.apk') + shell('ctest --test-dir build --output-on-failure') } publishers { @@ -75,8 +75,8 @@ j.with { shell('cd source; cmake --preset ci-android-aar') shell('cmake --build build') - shell('cmake --install build') shell('cmake --build build --target aar') + shell('ctest --test-dir build --output-on-failure') shell("cd build/dist; cmake -DCMD=DEPLOY_NEXUS -P \$WORKSPACE/source/cmake/cmd.cmake") } diff --git a/resources/jenkins/dsl/Builds/Build_iOS_IPA.groovy b/resources/jenkins/dsl/Builds/Build_iOS_IPA.groovy index 764acecf2..1690a7841 100644 --- a/resources/jenkins/dsl/Builds/Build_iOS_IPA.groovy +++ b/resources/jenkins/dsl/Builds/Build_iOS_IPA.groovy @@ -20,5 +20,6 @@ j.with shell('cd build; xcodebuild -configuration MinSizeRel -archivePath AusweisApp.xcarchive -scheme AusweisAppBinary archive') shell('cd build; xcodebuild -configuration MinSizeRel -archivePath AusweisApp.xcarchive -exportArchive -exportOptionsPlist exportOptions.plist -exportPath .') shell('cd build; xcodebuild -configuration MinSizeRel -target ipa') + shell('ctest --test-dir build --output-on-failure -C MinSizeRel') } } diff --git a/resources/jenkins/dsl/Releases/Release_Android.groovy b/resources/jenkins/dsl/Releases/Release_Android.groovy index 17aba26fa..4bbe60563 100644 --- a/resources/jenkins/dsl/Releases/Release_Android.groovy +++ b/resources/jenkins/dsl/Releases/Release_Android.groovy @@ -12,7 +12,7 @@ def j = new Release name: 'Android_APK_' + ARCH, libraries: 'Android_' + ARCH, label: 'Android', - artifacts: 'libs/Toolchain_*,build/dist/**/AusweisApp-*.apk*,build/debug.symbols/*' + artifacts: 'libs/Toolchain_*,build/dist/**/AusweisApp*.apk*,build/src/libAusweisApp*' ).generate(this) @@ -46,7 +46,7 @@ j.with """)) shell('cmake --build build') - shell('cmake --install build') + shell('cmake --install build') // remove this if 2.2.0 is stable shell('cmake --build build --target apk') shell('cmake --build build --target verify.signature') shell('cmake --build build --target dump.apk') @@ -85,7 +85,7 @@ j.with """)) shell('cmake --build build') - shell('cmake --install build') + shell('cmake --install build') // remove this if 2.2.0 is stable shell('cmake --build build --target aar') shell("cd build/dist; cmake -DCMD=DEPLOY_NEXUS -P \$WORKSPACE/source/cmake/cmd.cmake") } diff --git a/resources/jenkins/dsl/Reviews/Review_Android.groovy b/resources/jenkins/dsl/Reviews/Review_Android.groovy index fce7edd70..bacd89602 100644 --- a/resources/jenkins/dsl/Reviews/Review_Android.groovy +++ b/resources/jenkins/dsl/Reviews/Review_Android.groovy @@ -10,7 +10,7 @@ def j = new Review name: 'Android_APK_' + ARCH, libraries: 'Android_' + ARCH, label: 'Android', - artifacts: 'build/dist/**/AusweisApp-*.apk*,build/debug.symbols/*' + artifacts: 'build/dist/**/AusweisApp-*.apk*,build/src/libAusweisApp*' ).generate(this) @@ -22,10 +22,10 @@ j.with shell("cd source; cmake --preset ci-android-apk-review -DCMAKE_ANDROID_ARCH_ABI=${ARCH}") shell('cmake --build build') - shell('cmake --install build') shell('cmake --build build --target apk') shell('cmake --build build --target verify.signature') shell('cmake --build build --target dump.apk') + shell('ctest --test-dir build --output-on-failure') } publishers { @@ -68,8 +68,8 @@ j.with shell('cd source; cmake -DCMD=IMPORT_PATCH -P cmake/cmd.cmake') shell('cd source; cmake --preset ci-android-aar-review') shell('cmake --build build') - shell('cmake --install build') shell('cmake --build build --target aar') + shell('ctest --test-dir build --output-on-failure') } publishers { diff --git a/resources/jenkins/dsl/Reviews/Review_Formatting.groovy b/resources/jenkins/dsl/Reviews/Review_Formatting.groovy index 4c19a2c4d..1d95651de 100644 --- a/resources/jenkins/dsl/Reviews/Review_Formatting.groovy +++ b/resources/jenkins/dsl/Reviews/Review_Formatting.groovy @@ -23,35 +23,7 @@ j.with shell('cd source; cmake --preset ci-tools-with-libs') - shell('''\ - cd source - cmake --build ../build --target format - - STATUS=$(hg status | wc -c) - if [ "$STATUS" != "0" ]; then - echo 'Current repository state is not formatted!' - hg addremove - hg diff - hg commit -m "fix formatting" -s - fi - - (hg --config patch.eol=auto --config phases.new-commit=secret import -m 'jenkins patch formatting' -d 'today' -u 'jenkins' ../patch.diff) - if [ "$?" != "0" ]; then - echo 'FORMATTING FAILED: Patch cannot be applied' - exit 0 - fi - - cmake --build ../build --target rebuild_cache - cmake --build ../build --target format - - STATUS=$(hg status | wc -c) - if [ "$STATUS" != "0" ]; then - echo 'FORMATTING FAILED: Patch is not formatted' - hg diff - hg revert -a -C - exit 0 - fi - '''.stripIndent().trim()) + shell('cd source; resources/jenkins/check_formatting.sh') shell('cd source; cmake -DCMD=CHECK_FAILURE_CODES -P cmake/cmd.cmake') } diff --git a/resources/jenkins/dsl/Reviews/Review_iOS_IPA.groovy b/resources/jenkins/dsl/Reviews/Review_iOS_IPA.groovy index a02a3fab7..6779f51bc 100644 --- a/resources/jenkins/dsl/Reviews/Review_iOS_IPA.groovy +++ b/resources/jenkins/dsl/Reviews/Review_iOS_IPA.groovy @@ -21,5 +21,6 @@ j.with shell('cd build; xcodebuild -configuration MinSizeRel') shell('cd build; xcodebuild -configuration MinSizeRel -target ipa') + shell('ctest --test-dir build --output-on-failure -C MinSizeRel') } } diff --git a/resources/jenkins/import.py b/resources/jenkins/import.py index 21c491d10..3367f0b61 100755 --- a/resources/jenkins/import.py +++ b/resources/jenkins/import.py @@ -6,70 +6,6 @@ import os import sys -patchy = None - -try: - from rbtools.commands.patch import Patch - - class PatchHelper(Patch): - def __init__(self): - super(PatchHelper, self).__init__() - parser = self.create_arg_parser([]) - self.options = parser.parse_args([]) - self._api_root = None - if self.options.server is None: - self.options.server = os.environ.get('REVIEWBOARD_SERVER') - - # RBTools >= 2.0 - self.v1 = not hasattr(self, 'get_patches') - - def download(self, request_id, diff_rev=None): - if request_id is None: - print('ID of review request cannot be undefined') - return None - - if self._api_root is None: - if self.options.server is None: - print('Cannot find Review Board! Provide .reviewboardrc?') - return None - _, self._api_root = self.get_api(self.options.server) - - if not self.v1: - _, self._tool = self.initialize_scm_tool( - require_repository_info=False - ) - self.setup_tool(self._tool, api_root=self._api_root) - - print('Download patch revision {} ' - 'of review request {}'.format(diff_rev, request_id)) - - if self.v1: - diff, _, _ = self.get_patch(request_id, self._api_root, - diff_rev) - else: - self._review_request_id = request_id - diff = self.get_patches(diff_rev, squashed=True)[0]['diff'] - - return diff - - def save(self, file, request_id=None, diff_rev=None): - if request_id is None: - request_id = os.environ.get('REVIEWBOARD_REVIEW_ID') - - if diff_rev is None: - diff_rev = os.environ.get('REVIEWBOARD_DIFF_REVISION') - - diff = self.download(request_id, diff_rev) - - if diff is not None: - with open(file, 'wb') as f: - f.write(diff) - f.flush() - - patchy = PatchHelper() -except Exception: - print('Cannot import rbtools') - def main(): if len(sys.argv) > 2: @@ -78,10 +14,6 @@ def main(): patch = b(sys.argv[1]) if len(sys.argv) == 2 else b('../patch.diff') if not os.path.isfile(patch): - if patchy is not None: - print('Try to ask Review Board for patch file') - patchy.save(patch) - if not os.path.isfile(patch): print('Patch file "{}" does not exists'.format(patch)) return -1 diff --git a/resources/packaging/android/AndroidManifest.xml.apk.in b/resources/packaging/android/AndroidManifest.xml.apk.in index bd1585372..749b71bab 100644 --- a/resources/packaging/android/AndroidManifest.xml.apk.in +++ b/resources/packaging/android/AndroidManifest.xml.apk.in @@ -30,6 +30,7 @@ @@ -70,7 +71,7 @@ + + + + + diff --git a/resources/packaging/android/build.gradle.append b/resources/packaging/android/build.gradle.append index be2ec5cf0..dbdd7de53 100644 --- a/resources/packaging/android/build.gradle.append +++ b/resources/packaging/android/build.gradle.append @@ -5,7 +5,7 @@ task sourcesJar(type: Jar) { } dependencies { - implementation "androidx.core:core:1.12.0" + implementation "androidx.core:core:1.13.1" } allprojects { diff --git a/resources/packaging/android/build.gradle.append.aar b/resources/packaging/android/build.gradle.append.aar index 6557c1109..aec3a1614 100644 --- a/resources/packaging/android/build.gradle.append.aar +++ b/resources/packaging/android/build.gradle.append.aar @@ -2,6 +2,5 @@ android { packagingOptions { exclude '**/libplugins_imageformats_*.so' exclude '**/libplugins_iconengines_*.so' - exclude '**/libQt6Svg_*.so' } } diff --git a/resources/packaging/android/libAusweisApp.so-deployment-settings.json.in b/resources/packaging/android/libAusweisApp.so-deployment-settings.json.in index 0ccf6281b..823ceb4d8 100644 --- a/resources/packaging/android/libAusweisApp.so-deployment-settings.json.in +++ b/resources/packaging/android/libAusweisApp.so-deployment-settings.json.in @@ -23,7 +23,7 @@ "qtQmlDirectory": { "@CMAKE_ANDROID_ARCH_ABI@": "qml" }, - "sdk": "@ANDROID_SDK@", + "sdk": "@ANDROID_SDK_ROOT@", "sdkBuildToolsRevision": "@ANDROID_BUILD_TOOLS_REVISION@", "ndk": "@CMAKE_ANDROID_NDK@", "toolchain-prefix": "llvm", @@ -34,5 +34,5 @@ "application-binary": "AusweisApp", "qml-importscanner-binary": "@QT_HOST_PATH@/libexec/qmlimportscanner", "rcc-binary": "@QT_HOST_PATH@/libexec/rcc", - "qml-root-path": @QML_ROOT_PATH@ + "qml-root-path": [] } diff --git a/resources/packaging/android/lint.aar.xml b/resources/packaging/android/lint.aar.xml index a2ccff2f4..9611b4151 100644 --- a/resources/packaging/android/lint.aar.xml +++ b/resources/packaging/android/lint.aar.xml @@ -9,6 +9,7 @@ +