diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 61fbdea79..6882dea5c 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -85,14 +85,14 @@ jobs:
- name: Prepare vcpkg
uses: lukka/run-vcpkg@v11
with:
- vcpkgGitCommitId: 5ee5eee0d3e9c6098b24d263e9099edcdcef6631
+ vcpkgGitCommitId: 031ad89ce6c575df35a8e58707ad2c898446c63e
vcpkgJsonGlob: ./vcpkg.json
runVcpkgInstall: true
env:
VCPKG_DEFAULT_TRIPLET: ${{ matrix.triplet }}
- name: Build
run: |
- cmake --preset ${{ matrix.target }} "-GUnix Makefiles" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=libdigidocpp.${{ matrix.target }}
+ cmake --preset ${{ matrix.target }} "-GUnix Makefiles" -DCMAKE_BUILD_TYPE=RelWithDebInfo
cmake --build --preset ${{ matrix.target }}
cmake --build --preset ${{ matrix.target }} --target install/strip
zip -q -r libdigidocpp.${{ matrix.target }}.zip libdigidocpp.${{ matrix.target }}
@@ -161,15 +161,12 @@ jobs:
path: libdigidocpp*.*
windows:
name: Build on Windows
- runs-on: ${{ matrix.image }}
+ runs-on: windows-2025
strategy:
matrix:
toolset: [143]
platform: [x86, x64, arm64]
include:
- - toolset: 143
- image: windows-2022
- vcvars: "C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise\\VC\\Auxiliary\\Build\\vcvarsall.bat"
- platform: x86
setenv: amd64_x86
- platform: x64
@@ -185,7 +182,7 @@ jobs:
- name: Prepare vcpkg
uses: lukka/run-vcpkg@v11
with:
- vcpkgGitCommitId: 5ee5eee0d3e9c6098b24d263e9099edcdcef6631
+ vcpkgGitCommitId: 031ad89ce6c575df35a8e58707ad2c898446c63e
vcpkgJsonGlob: ./vcpkg.json
runVcpkgInstall: true
runVcpkgFormatString: "[`install`, `--recurse`, `--clean-after-build`, `--x-install-root`, `$[env.VCPKG_INSTALLED_DIR]`, `--triplet`, `$[env.VCPKG_DEFAULT_TRIPLET]`, `--x-feature`, `tests`]"
@@ -193,10 +190,7 @@ jobs:
VCPKG_DEFAULT_TRIPLET: ${{ matrix.platform }}-windows
VCPKG_INSTALLED_DIR: ${{ github.workspace }}/vcpkg_installed_${{ matrix.platform }}
- name: Install dependencies
- run: |
- choco install doxygen.install -y > $null
- Invoke-WebRequest -UserAgent "Wget" "https://sourceforge.net/projects/swig/files/swigwin/swigwin-4.2.1/swigwin-4.2.1.zip/download" -OutFile swig.zip
- tar xf swig.zip
+ run: winget install --silent --accept-source-agreements --accept-package-agreements swig doxygen
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
@@ -208,8 +202,9 @@ jobs:
architecture: ${{ matrix.platform }}
- name: Build
run: |
- & "${{ matrix.vcvars }}" ${{ matrix.setenv }} "&&" pwsh build.ps1 `
- -swig ${{ github.workspace }}/swigwin-4.2.1/swig.exe `
+ $swig = (Get-Item "$env:LOCALAPPDATA\Microsoft\WinGet\Links\swig.exe").Target
+ & "C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise\\VC\\Auxiliary\\Build\\vcvarsall.bat" ${{ matrix.setenv }} "&&" pwsh build.ps1 `
+ -swig $swig `
-doxygen "C:/Program files/doxygen/bin/doxygen.exe" `
-boost
- name: Archive artifacts
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ea746ea2c..661bfced1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -5,7 +5,7 @@ endif()
if(POLICY CMP0177)
cmake_policy(SET CMP0177 NEW)
endif()
-project(libdigidocpp VERSION 4.2.0)
+project(libdigidocpp VERSION 4.3.0)
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
list(APPEND CMAKE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX})
@@ -35,7 +35,7 @@ set( BUILD_TOOLS YES CACHE BOOL "Build digidoc-tool" )
set( BUILD_SHARED_LIBS YES CACHE BOOL "Build library as SHARED or STATIC" )
set( SIGNCERT "" CACHE STRING "Common name of certificate to used sign binaries, empty skip signing" )
set( CROSSSIGNCERT "" CACHE STRING "Common name of certificate to used cross sign binaries, empty skip signing" )
-set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED YES)
set(CMAKE_C_VISIBILITY_PRESET hidden)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
diff --git a/CMakePresets.json b/CMakePresets.json
index 69504a8fe..ab29c36bf 100644
--- a/CMakePresets.json
+++ b/CMakePresets.json
@@ -11,36 +11,32 @@
"CMAKE_BUILD_TYPE": "Debug"
}
},
- {
- "name": "base",
- "displayName": "Base build config",
- "hidden": true,
- "inherits": "default",
- "environment": {
- "DEST": "/Library/libdigidocpp$env{DEST_SUFFIX}"
- },
- "installDir": "$env{DEST}"
- },
{
"name": "macos",
"description": "This macos build is only available on macOS",
- "inherits": "base",
+ "inherits": "default",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Darwin"
},
+ "installDir": "$env{DEST}",
+ "environment": {
+ "DEST": "/Library/libdigidocpp$env{DEST_SUFFIX}"
+ },
"cacheVariables": {
"CMAKE_OSX_ARCHITECTURES": "arm64;x86_64",
- "CMAKE_OSX_DEPLOYMENT_TARGET": "12.0",
+ "CMAKE_OSX_DEPLOYMENT_TARGET": "13.0",
"CMAKE_FIND_ROOT_PATH": "$env{DEST}"
}
},
{
"name": "mobile",
"hidden": true,
- "inherits": "base",
+ "inherits": "default",
+ "installDir": "$env{DEST}",
"environment": {
+ "DEST": "libdigidocpp$env{DEST_SUFFIX}",
"DEST_SUFFIX": ".${presetName}"
},
"cacheVariables": {
@@ -52,7 +48,7 @@
{
"name": "ios",
"hidden": true,
- "inherits": ["mobile", "macos"],
+ "inherits": ["macos", "mobile"],
"cacheVariables": {
"CMAKE_SYSTEM_NAME": "iOS",
"CMAKE_OSX_SYSROOT": "${presetName}",
diff --git a/build.ps1 b/build.ps1
index 09ade3ba8..d1d8e5a00 100644
--- a/build.ps1
+++ b/build.ps1
@@ -3,7 +3,7 @@ param(
[string]$libdigidocpp = $PSScriptRoot,
[string]$platform = $env:PLATFORM,
[string]$build_number = $(if ($null -eq $env:BUILD_NUMBER) {"0"} else {$env:BUILD_NUMBER}),
- [string]$msiversion = "4.2.0.$build_number",
+ [string]$msiversion = "4.3.0.$build_number",
[string]$msi_name = "libdigidocpp-$msiversion$env:VER_SUFFIX.$platform.msi",
[string]$git = "git.exe",
[string]$vcpkg = "vcpkg\vcpkg.exe",
@@ -23,8 +23,8 @@ Try {
& wix > $null
}
Catch {
- & dotnet tool install -g --version 5.0.2 wix
- & wix extension add -g WixToolset.UI.wixext/5.0.2
+ & dotnet tool install -g --version 6.0.1 wix
+ & wix extension add -g WixToolset.UI.wixext/6.0.1
}
if(!(Test-Path -Path $vcpkg)) {
diff --git a/examples/android/app/build.gradle b/examples/android/app/build.gradle
index afbf61e2c..17c6eba75 100644
--- a/examples/android/app/build.gradle
+++ b/examples/android/app/build.gradle
@@ -3,11 +3,11 @@ apply plugin: 'com.android.application'
def libsPath = '/Library/libdigidocpp'
android {
- compileSdk 34
+ compileSdk 35
defaultConfig {
applicationId "ee.ria.libdigidocpp"
minSdk 30
- targetSdk 34
+ targetSdk 35
versionCode 1
versionName "1.0"
if (System.getenv("BUILD_NUMBER")) {
diff --git a/examples/android/build.gradle b/examples/android/build.gradle
index 8be3d0715..8c27726bb 100644
--- a/examples/android/build.gradle
+++ b/examples/android/build.gradle
@@ -5,7 +5,7 @@ buildscript {
mavenCentral()
}
dependencies {
- classpath 'com.android.tools.build:gradle:8.8.1'
+ classpath 'com.android.tools.build:gradle:8.12.0'
}
}
diff --git a/examples/android/gradle/wrapper/gradle-wrapper.properties b/examples/android/gradle/wrapper/gradle-wrapper.properties
index 753b0207f..bb85f020b 100644
--- a/examples/android/gradle/wrapper/gradle-wrapper.properties
+++ b/examples/android/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip
diff --git a/examples/ios/libdigidocpp.xcodeproj/project.pbxproj b/examples/ios/libdigidocpp.xcodeproj/project.pbxproj
index 40ab840a7..0cbf19db2 100644
--- a/examples/ios/libdigidocpp.xcodeproj/project.pbxproj
+++ b/examples/ios/libdigidocpp.xcodeproj/project.pbxproj
@@ -143,7 +143,7 @@
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
- LastUpgradeCheck = 1520;
+ LastUpgradeCheck = 1640;
ORGANIZATIONNAME = RIA;
TargetAttributes = {
4E7663971B5A37AC00672ACF = {
@@ -215,7 +215,7 @@
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
@@ -243,10 +243,11 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
+ DEVELOPMENT_TEAM = ET847QJV9F;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
- GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
@@ -274,7 +275,7 @@
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
@@ -301,10 +302,11 @@
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
+ DEVELOPMENT_TEAM = ET847QJV9F;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
- GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
@@ -325,10 +327,9 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
BUILD_NUMBER = 0;
CODE_SIGN_ENTITLEMENTS = libdigidocpp/libdigidocpp.entitlements;
- "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
+ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(BUILD_NUMBER)";
- DEVELOPMENT_TEAM = ET847QJV9F;
"ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES;
FRAMEWORK_SEARCH_PATHS = "$(SDKPATH)/lib";
GCC_PREPROCESSOR_DEFINITIONS = (
@@ -341,6 +342,7 @@
"$(PROJECT_DIR)/../../src/minizip",
);
INFOPLIST_FILE = libdigidocpp/Info.plist;
+ INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity";
INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
@@ -355,8 +357,7 @@
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = ee.ria.libdigidocpp.app;
PRODUCT_NAME = "$(TARGET_NAME)";
- SDKPATH = "$(LOCAL_LIBRARY_DIR)/libdigidocpp.iphoneos";
- "SDKPATH[sdk=iphonesimulator*]" = "$(LOCAL_LIBRARY_DIR)/libdigidocpp.iphonesimulator";
+ SDKPATH = "$(LOCAL_LIBRARY_DIR)/libdigidocpp.$(PLATFORM_NAME)";
"SDKPATH[sdk=macosx*]" = "$(LOCAL_LIBRARY_DIR)/libdigidocpp.iphonecatalyst";
SUPPORTS_MACCATALYST = YES;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
@@ -370,10 +371,9 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
BUILD_NUMBER = 0;
CODE_SIGN_ENTITLEMENTS = libdigidocpp/libdigidocpp.entitlements;
- "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
+ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(BUILD_NUMBER)";
- DEVELOPMENT_TEAM = ET847QJV9F;
"ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES;
FRAMEWORK_SEARCH_PATHS = "$(SDKPATH)/lib";
GCC_PREPROCESSOR_DEFINITIONS = (
@@ -386,6 +386,7 @@
"$(PROJECT_DIR)/../../src/minizip",
);
INFOPLIST_FILE = libdigidocpp/Info.plist;
+ INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity";
INFOPLIST_KEY_LSSupportsOpeningDocumentsInPlace = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
@@ -400,8 +401,7 @@
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = ee.ria.libdigidocpp.app;
PRODUCT_NAME = "$(TARGET_NAME)";
- SDKPATH = "$(LOCAL_LIBRARY_DIR)/libdigidocpp.iphoneos";
- "SDKPATH[sdk=iphonesimulator*]" = "$(LOCAL_LIBRARY_DIR)/libdigidocpp.iphonesimulator";
+ SDKPATH = "$(LOCAL_LIBRARY_DIR)/libdigidocpp.$(PLATFORM_NAME)";
"SDKPATH[sdk=macosx*]" = "$(LOCAL_LIBRARY_DIR)/libdigidocpp.iphonecatalyst";
SUPPORTS_MACCATALYST = YES;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
diff --git a/examples/ios/libdigidocpp/Info.plist b/examples/ios/libdigidocpp/Info.plist
index 3132b7414..ff9a875d5 100644
--- a/examples/ios/libdigidocpp/Info.plist
+++ b/examples/ios/libdigidocpp/Info.plist
@@ -19,8 +19,6 @@
- ITSAppUsesNonExemptEncryption
-
NSAppTransportSecurity
NSAllowsArbitraryLoads
diff --git a/examples/ios/libdigidocpp/MasterViewController.mm b/examples/ios/libdigidocpp/MasterViewController.mm
index 95d6fffdb..4589bc1a1 100644
--- a/examples/ios/libdigidocpp/MasterViewController.mm
+++ b/examples/ios/libdigidocpp/MasterViewController.mm
@@ -42,16 +42,15 @@ @interface URLTableViewCell: UITableViewCell
@implementation URLTableViewCell
@end
-@interface MasterViewController : UITableViewController {
-#if TESTING
- NSMutableArray *result;
-#endif
-}
+@interface MasterViewController : UITableViewController
@end
@implementation MasterViewController
-
#if TESTING
+{
+ NSMutableArray *result;
+}
+
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);
@@ -238,14 +237,14 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N
cell.textLabel.text = [NSString stdstring:signature->signedBy()];
break;
case 1:
- using Validator = digidoc::Signature::Validator;
- switch (Validator(signature).status()) {
- case Validator::Valid: cell.textLabel.text = @"Valid"; break;
- case Validator::Warning: cell.textLabel.text = @"Warning"; break;
- case Validator::NonQSCD: cell.textLabel.text = @"NonQSCD"; break;
- case Validator::Test: cell.textLabel.text = @"Test"; break;
- case Validator::Unknown: cell.textLabel.text = @"Unknown"; break;
- case Validator::Invalid: cell.textLabel.text = @"Invalid"; break;
+ switch (digidoc::Signature::Validator(signature).status()) {
+ using enum digidoc::Signature::Validator::Status;
+ case Valid: cell.textLabel.text = @"Valid"; break;
+ case Warning: cell.textLabel.text = @"Warning"; break;
+ case NonQSCD: cell.textLabel.text = @"NonQSCD"; break;
+ case Test: cell.textLabel.text = @"Test"; break;
+ case Unknown: cell.textLabel.text = @"Unknown"; break;
+ case Invalid: cell.textLabel.text = @"Invalid"; break;
}
break;
case 2:
diff --git a/examples/java/build.gradle b/examples/java/build.gradle
index 1e33b49c0..01e8126dc 100755
--- a/examples/java/build.gradle
+++ b/examples/java/build.gradle
@@ -1,10 +1,10 @@
plugins {
id 'java'
}
-group 'ee.ria'
+group = 'ee.ria'
java {
- targetCompatibility JavaVersion.VERSION_17
- sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+ sourceCompatibility = JavaVersion.VERSION_17
}
base {
archivesName = 'libdigidocpp'
diff --git a/examples/java/gradle/wrapper/gradle-wrapper.jar b/examples/java/gradle/wrapper/gradle-wrapper.jar
index 7f93135c4..a4b76b953 100644
Binary files a/examples/java/gradle/wrapper/gradle-wrapper.jar and b/examples/java/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/examples/java/gradle/wrapper/gradle-wrapper.properties b/examples/java/gradle/wrapper/gradle-wrapper.properties
index df97d72b8..37f853b1c 100644
--- a/examples/java/gradle/wrapper/gradle-wrapper.properties
+++ b/examples/java/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
diff --git a/examples/java/gradlew b/examples/java/gradlew
index 0adc8e1a5..f5feea6d6 100755
--- a/examples/java/gradlew
+++ b/examples/java/gradlew
@@ -15,6 +15,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# SPDX-License-Identifier: Apache-2.0
+#
##############################################################################
#
@@ -55,7 +57,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
-# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
@@ -84,7 +86,8 @@ done
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
-APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
+APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
+' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@@ -145,7 +148,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
- # shellcheck disable=SC3045
+ # shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
@@ -153,7 +156,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
- # shellcheck disable=SC3045
+ # shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@@ -202,11 +205,11 @@ fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
-# Collect all arguments for the java command;
-# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
-# shell script including quotes and variable substitutions, so put them in
-# double quotes to make sure that they get re-expanded; and
-# * put everything else in single quotes, so that it's not re-expanded.
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
diff --git a/examples/java/gradlew.bat b/examples/java/gradlew.bat
index 6689b85be..9b42019c7 100644
--- a/examples/java/gradlew.bat
+++ b/examples/java/gradlew.bat
@@ -13,6 +13,8 @@
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@@ -43,11 +45,11 @@ set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
goto fail
@@ -57,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
goto fail
diff --git a/libdigidocpp.i b/libdigidocpp.i
index c4fd10afa..90a4606cb 100644
--- a/libdigidocpp.i
+++ b/libdigidocpp.i
@@ -133,7 +133,7 @@ static std::vector* SWIG_JavaArrayToVectorUnsignedChar(JNIEnv *je
return new System.Security.Cryptography.X509Certificates.X509Certificate2($modulePINVOKE.To_ByteArray(cPtr));
}
%typemap(out) std::vector %{ $result = new std::vector(std::move($1)); %}
-%typemap(out) digidoc::X509Cert %{ $result = new std::vector($1); %}
+%typemap(out) digidoc::X509Cert %{ $result = new std::vector($1.operator std::vector()); %}
#elif defined(SWIGPYTHON)
%typemap(in) std::vector %{
diff --git a/prepare_osx_build_environment.sh b/prepare_osx_build_environment.sh
index e897515da..69e12ed00 100755
--- a/prepare_osx_build_environment.sh
+++ b/prepare_osx_build_environment.sh
@@ -1,7 +1,7 @@
#!/bin/sh
set -e
-OPENSSL_DIR=openssl-3.0.16
+OPENSSL_DIR=openssl-3.5.1
XMLSEC_DIR=xmlsec1-1.3.7
ARGS="$@"
@@ -42,7 +42,7 @@ case "$@" in
TARGET_PATH=/Library/libdigidocpp
SYSROOT=$(xcrun -sdk macosx --show-sdk-path)
: ${ARCHS:="arm64 x86_64"}
- : ${MACOSX_DEPLOYMENT_TARGET:="12.0"}
+ : ${MACOSX_DEPLOYMENT_TARGET:="13.0"}
export MACOSX_DEPLOYMENT_TARGET
export CFLAGS="-arch ${ARCHS// / -arch } "
;;
@@ -51,7 +51,8 @@ esac
function xmlsec {
echo Building ${XMLSEC_DIR}
if [ ! -f ${XMLSEC_DIR}.tar.gz ]; then
- curl -O -L https://www.aleksey.com/xmlsec/download/${XMLSEC_DIR}.tar.gz
+ XMLSEC_VERSION="${XMLSEC_DIR##*-}"
+ curl -O -L https://github.com/lsh123/xmlsec/releases/download/${XMLSEC_VERSION}/${XMLSEC_DIR}.tar.gz
fi
rm -rf ${XMLSEC_DIR}
tar xf ${XMLSEC_DIR}.tar.gz
@@ -89,10 +90,10 @@ function openssl {
for ARCH in ${ARCHS}
do
case "${ARGS}" in
- *simulator*) CC="" CFLAGS="-arch ${ARCH}" ./Configure iossimulator-xcrun --prefix=${TARGET_PATH} no-shared no-dso no-module no-engine no-tests no-ui-console enable-ec_nistp_64_gcc_128 ;;
- *catalyst*) CC="" CFLAGS="-target ${ARCH}-apple-ios${IPHONEOS_DEPLOYMENT_TARGET}-macabi" ./Configure darwin64-${ARCH} --prefix=${TARGET_PATH} no-shared no-dso no-module no-engine no-tests no-ui-console enable-ec_nistp_64_gcc_128 ;;
- *iphone*) CC="" CFLAGS="" ./Configure ios64-xcrun --prefix=${TARGET_PATH} no-shared no-dso no-module no-engine no-tests no-ui-console enable-ec_nistp_64_gcc_128 ;;
- *) CC="" CFLAGS="" ./Configure darwin64-${ARCH} --prefix=${TARGET_PATH} shared no-module no-tests enable-ec_nistp_64_gcc_128
+ *simulator*) CC="" CFLAGS="" ./Configure iossimulator-${ARCH}-xcrun --prefix=${TARGET_PATH} no-apps no-shared no-dso no-module no-engine no-tests no-ui-console enable-ec_nistp_64_gcc_128 ;;
+ *catalyst*) CC="" CFLAGS="-target ${ARCH}-apple-ios${IPHONEOS_DEPLOYMENT_TARGET}-macabi" ./Configure darwin64-${ARCH} --prefix=${TARGET_PATH} no-apps no-shared no-dso no-module no-engine no-tests no-ui-console enable-ec_nistp_64_gcc_128 ;;
+ *iphone*) CC="" CFLAGS="" ./Configure ios64-xcrun --prefix=${TARGET_PATH} no-apps no-shared no-dso no-module no-engine no-tests no-ui-console enable-ec_nistp_64_gcc_128 ;;
+ *) CC="" CFLAGS="" ./Configure darwin64-${ARCH} --prefix=${TARGET_PATH} no-apps shared no-module no-tests enable-ec_nistp_64_gcc_128
esac
make -s > /dev/null
if [[ ${ARCHS} == ${ARCH}* ]]; then
@@ -126,7 +127,7 @@ case "$@" in
echo " tasks: openssl, xmlsec, all, help"
echo "To control builds set environment variables:"
echo " minimum deployment target"
- echo " - MACOSX_DEPLOYMENT_TARGET=12.0"
+ echo " - MACOSX_DEPLOYMENT_TARGET=13.0"
echo " - IPHONEOS_DEPLOYMENT_TARGET=15.0"
echo " archs to build on macOS/iOS"
echo " - ARCHS=\"arm64 x86_64\" (macOS)"
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 94d9a37af..7d5d10fcf 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -157,7 +157,6 @@ target_link_libraries(digidocpp PRIVATE ${CMAKE_DL_LIBS} minizip digidocpp_priv)
if( BUILD_TOOLS )
add_executable(digidoc-tool digidoc-tool.cpp)
- target_compile_features(digidoc-tool PUBLIC cxx_std_20)
target_link_libraries(digidoc-tool digidocpp digidocpp_priv Threads::Threads)
target_link_options(digidoc-tool PRIVATE
$<$: /MANIFEST:NO /MANIFEST:EMBED /MANIFESTINPUT:${CMAKE_CURRENT_SOURCE_DIR}/digidoc-tool.manifest>
@@ -352,6 +351,7 @@ if( FRAMEWORK )
-change '${LIBPATH}/libssl.3.dylib' '@executable_path/../Libraries/libssl.3.dylib'
-change '${LIBPATH}/libxmlsec1.1.dylib' '@executable_path/../Libraries/libxmlsec1.1.dylib'
-change '${LIBPATH}/libxmlsec1-openssl.1.dylib' '@executable_path/../Libraries/libxmlsec1-openssl.1.dylib'
+ -rpath '${CMAKE_CURRENT_BINARY_DIR}' '@executable_path/../../../..'
$/Resources/digidoc-tool
COMMAND touch $
)
@@ -360,13 +360,15 @@ if( FRAMEWORK )
add_custom_command(TARGET digidocpp POST_BUILD
COMMAND /usr/libexec/PlistBuddy -c "Add :MinimumOSVersion string ${CMAKE_OSX_DEPLOYMENT_TARGET}" $/Info.plist)
endif()
- add_custom_target(codesign DEPENDS digidocpp $
- COMMAND codesign -f -s "Developer ID Application: ${SIGNCERT}"
- $/Libraries/*
- $<$:$/Resources/digidoc-tool>
- $
- COMMAND touch $ $<$:$>
- )
+ if(SIGNCERT)
+ add_custom_command(TARGET embedlibs POST_BUILD
+ COMMAND codesign -f -s "Developer ID Application: ${SIGNCERT}"
+ $/Libraries/*
+ $<$:$/Resources/digidoc-tool>
+ $
+ COMMAND touch $ $<$:$>
+ )
+ endif()
add_custom_target(pkgbuild DEPENDS digidocpp $
COMMAND DESTDIR=install ${CMAKE_COMMAND} --install .
COMMAND pkgbuild --root install "$<$:--sign;${SIGNCERT}>"
diff --git a/src/crypto/PKCS11Signer.cpp b/src/crypto/PKCS11Signer.cpp
index 7a9e6f4e9..6ea693b7f 100644
--- a/src/crypto/PKCS11Signer.cpp
+++ b/src/crypto/PKCS11Signer.cpp
@@ -26,13 +26,13 @@
#include "crypto/X509Cert.h"
#include "crypto/X509Crypto.h"
#include "util/log.h"
+#include "util/File.h"
#include
#include
#ifdef _WIN32
#include
-#include
#else
#include
#endif
@@ -50,7 +50,7 @@ class PKCS11Signer::Private
bool load(const string &driver)
{
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
- return (h = LoadLibraryW(filesystem::u8path(driver).c_str())) != 0;
+ return (h = LoadLibraryW(util::File::encodeName(driver).c_str())) != 0;
#else
return false;
#endif
diff --git a/src/crypto/TS.cpp b/src/crypto/TS.cpp
index 08ff3ce10..d96dfc91c 100644
--- a/src/crypto/TS.cpp
+++ b/src/crypto/TS.cpp
@@ -36,12 +36,13 @@
#include
#include
-#include
using namespace digidoc;
using namespace std;
#if defined(LIBRESSL_VERSION_NUMBER)
+#include
+
void *OPENSSL_memdup(const void *data, size_t size)
{
void *copy;
@@ -49,25 +50,29 @@ void *OPENSSL_memdup(const void *data, size_t size)
if (data == NULL || size == 0 || size >= INT_MAX)
return NULL;
- if ((copy = malloc(size)) == NULL)
+ if ((copy = OPENSSL_malloc(size)) == NULL)
return NULL;
return memcpy(copy, data, size);
}
#endif
+#if OPENSSL_VERSION_NUMBER < 0x30400000L
+#define TS_VERIFY_CTX_set0_imprint TS_VERIFY_CTX_set_imprint
+#define TS_VERIFY_CTX_set0_store TS_VERIFY_CTX_set_store
+#endif
TS::TS(const Digest &digest, const std::string &userAgent)
: d(nullptr, PKCS7_free)
, cms(nullptr, CMS_ContentInfo_free)
{
- auto req = SCOPE_PTR(TS_REQ, TS_REQ_new());
+ auto req = make_unique_ptr(TS_REQ_new());
TS_REQ_set_version(req.get(), 1);
TS_REQ_set_cert_req(req.get(), 1);
- auto algo = SCOPE_PTR(X509_ALGOR, X509_ALGOR_new());
+ auto algo = make_unique_ptr(X509_ALGOR_new());
X509_ALGOR_set0(algo.get(), OBJ_nid2obj(Digest::toMethod(digest.uri())), V_ASN1_NULL, nullptr);
- auto msg_imprint = SCOPE_PTR(TS_MSG_IMPRINT, TS_MSG_IMPRINT_new());
+ auto msg_imprint = make_unique_ptr(TS_MSG_IMPRINT_new());
TS_MSG_IMPRINT_set_algo(msg_imprint.get(), algo.get());
vector digestdata = digest.result();
TS_MSG_IMPRINT_set_msg(msg_imprint.get(), digestdata.data(), int(digestdata.size()));
@@ -76,12 +81,12 @@ TS::TS(const Digest &digest, const std::string &userAgent)
#if 0
if(!policy.empty())
{
- auto obj = SCOPE_PTR(ASN1_OBJECT, OBJ_txt2obj(policy.c_str(), 0));
+ auto obj = make_unique_ptr(OBJ_txt2obj(policy.c_str(), 0));
TS_REQ_set_policy_id(req.get(), obj.get());
}
#endif
- auto nonce = SCOPE_PTR(ASN1_INTEGER, ASN1_INTEGER_new());
+ auto nonce = make_unique_ptr(ASN1_INTEGER_new());
ASN1_STRING_set(nonce.get(), nullptr, 20);
for(nonce->data[0] = 0; nonce->data[0] == 0;) // Make sure that first byte is not 0x00
RAND_bytes(nonce->data, nonce->length);
@@ -110,11 +115,11 @@ TS::TS(const Digest &digest, const std::string &userAgent)
THROW("Failed to send Time-stamp request");
const unsigned char *p2 = (const unsigned char*)result.content.c_str();
- auto resp = SCOPE_PTR(TS_RESP, d2i_TS_RESP(nullptr, &p2, long(result.content.size())));
+ auto resp = make_unique_ptr(d2i_TS_RESP(nullptr, &p2, long(result.content.size())));
if(!resp)
THROW_OPENSSLEXCEPTION("Failed to parse TS response.");
- auto ctx = SCOPE_PTR(TS_VERIFY_CTX, TS_REQ_to_TS_VERIFY_CTX(req.get(), nullptr));
+ auto ctx = make_unique_ptr(TS_REQ_to_TS_VERIFY_CTX(req.get(), nullptr));
TS_VERIFY_CTX_set_flags(ctx.get(), TS_VFY_VERSION|TS_VFY_NONCE);
if(TS_RESP_verify_response(ctx.get(), resp.get()) != 1)
THROW_OPENSSLEXCEPTION("Failed to verify TS response.");
@@ -171,15 +176,15 @@ X509Cert TS::cert() const
auto TS::tstInfo() const
{
if(d)
- return SCOPE_PTR(TS_TST_INFO, PKCS7_to_TS_TST_INFO(d.get()));
+ return make_unique_ptr(PKCS7_to_TS_TST_INFO(d.get()));
#ifndef OPENSSL_NO_CMS
if(cms)
{
- if(auto out = SCOPE_PTR(BIO, CMS_dataInit(cms.get(), nullptr)))
- return SCOPE_PTR(TS_TST_INFO, d2i_TS_TST_INFO_bio(out.get(), nullptr));
+ if(auto out = make_unique_ptr(CMS_dataInit(cms.get(), nullptr)))
+ return make_unique_ptr(d2i_TS_TST_INFO_bio(out.get(), nullptr));
}
#endif
- return SCOPE_PTR(TS_TST_INFO, nullptr);
+ return make_unique_ptr(nullptr);
}
string TS::digestMethod() const
@@ -212,7 +217,7 @@ string TS::serial() const
if(!info)
return {};
- if(auto bn = make_unique_ptr(ASN1_INTEGER_to_BN(TS_TST_INFO_get_serial(info.get()), nullptr), BN_free))
+ if(auto bn = make_unique_ptr(ASN1_INTEGER_to_BN(TS_TST_INFO_get_serial(info.get()), nullptr)))
{
if(auto str = make_unique_ptr(BN_bn2dec(bn.get()), [](char *data) { OPENSSL_free(data); }))
return str.get();
@@ -235,11 +240,11 @@ void TS::verify(const vector &digest)
X509CertStore::instance()->activate(cert());
if(d)
{
- auto ctx = SCOPE_PTR(TS_VERIFY_CTX, TS_VERIFY_CTX_new());
+ auto ctx = make_unique_ptr(TS_VERIFY_CTX_new());
TS_VERIFY_CTX_set_flags(ctx.get(), TS_VFY_IMPRINT|TS_VFY_VERSION|TS_VFY_SIGNATURE);
- TS_VERIFY_CTX_set_imprint(ctx.get(),
+ TS_VERIFY_CTX_set0_imprint(ctx.get(),
(unsigned char*)OPENSSL_memdup(digest.data(), digest.size()), long(digest.size()));
- TS_VERIFY_CTX_set_store(ctx.get(), store.release());
+ TS_VERIFY_CTX_set0_store(ctx.get(), store.release());
if(TS_RESP_verify_token(ctx.get(), d.get()) != 1)
{
unsigned long err = ERR_get_error();
@@ -255,7 +260,7 @@ void TS::verify(const vector &digest)
#ifndef OPENSSL_NO_CMS
else if(cms)
{
- auto out = SCOPE_PTR(BIO, BIO_new(BIO_s_mem()));
+ auto out = make_unique_ptr(BIO_new(BIO_s_mem()));
// Override smime_sign purpose bit because it is actually timestamp
X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new();
X509_VERIFY_PARAM_set1_name(param, "smime_sign");
@@ -266,10 +271,10 @@ void TS::verify(const vector &digest)
if(err != 1)
THROW_OPENSSLEXCEPTION("Failed to verify TS response.");
- auto info = SCOPE_PTR(TS_TST_INFO, d2i_TS_TST_INFO_bio(out.get(), nullptr));
- ASN1_OCTET_STRING *msg = TS_MSG_IMPRINT_get_msg(TS_TST_INFO_get_msg_imprint(info.get()));
- if(digest.size() != size_t(ASN1_STRING_length(msg)) ||
- memcmp(digest.data(), ASN1_STRING_get0_data(msg), digest.size()) != 0)
+ auto info = make_unique_ptr(d2i_TS_TST_INFO_bio(out.get(), nullptr));
+ if(ASN1_OCTET_STRING *msg = TS_MSG_IMPRINT_get_msg(TS_TST_INFO_get_msg_imprint(info.get()));
+ std::equal(digest.cbegin(), digest.cend(),
+ ASN1_STRING_get0_data(msg), std::next(ASN1_STRING_get0_data(msg), ASN1_STRING_length(msg))))
THROW_OPENSSLEXCEPTION("Failed to verify TS response.");
}
#endif
diff --git a/src/crypto/TSL.cpp b/src/crypto/TSL.cpp
index 0149233b5..cdcc8aa84 100644
--- a/src/crypto/TSL.cpp
+++ b/src/crypto/TSL.cpp
@@ -277,7 +277,7 @@ TSL TSL::parseTSL(const string &url, const vector &certs,
ofstream(File::encodeName(path), ofstream::binary|fstream::trunc)
<< ifstream(File::encodeName(valid.path), fstream::binary).rdbuf();
error_code ec;
- filesystem::remove(filesystem::u8path(valid.path), ec);
+ filesystem::remove(File::encodeName(valid.path), ec);
ofstream(File::encodeName(path + ".etag"), ofstream::trunc) << etag;
diff --git a/src/digidoc-tool.cpp b/src/digidoc-tool.cpp
index c9f23ada3..de4c08ac5 100644
--- a/src/digidoc-tool.cpp
+++ b/src/digidoc-tool.cpp
@@ -928,6 +928,9 @@ static int tslcmd(int /*argc*/, char* /*argv*/[])
{
int returnCode = EXIT_SUCCESS;
string cache = CONF(TSLCache);
+ auto certs = CONF(TSLCerts);
+ for(const X509Cert &cert: certs)
+ cout << "Signer: " << cert << endl;
TSL t(File::path(cache, File::fileName(CONF(TSLUrl))));
cout << "TSL: " << t.url() << endl
<< " Type: " << t.type() << endl
@@ -935,11 +938,10 @@ static int tslcmd(int /*argc*/, char* /*argv*/[])
<< " Operator: " << t.operatorName() << endl
<< " Sequence: " << t.sequenceNumber() << endl
<< " Issued: " << t.issueDate() << endl
- << " Next update: " << t.nextUpdate() << endl
- << "Pointers:" << endl;
+ << " Next update: " << t.nextUpdate() << endl;
try {
cout << " Signature: ";
- t.validate(CONF(TSLCerts));
+ t.validate(certs);
cout << ToolConfig::GREEN << "VALID" << ToolConfig::RESET << endl;
} catch(const Exception &e) {
cout << ToolConfig::RED << "INVALID" << ToolConfig::RESET << endl;
@@ -952,6 +954,7 @@ static int tslcmd(int /*argc*/, char* /*argv*/[])
for(const X509Cert &x: s.certs)
cout << " Cert: " << x << endl;
}
+ cout << "Pointers: " << endl;
for(const TSL::Pointer &p: t.pointers())
{
cout << " Pointer: " << p.territory << endl
diff --git a/src/json.hpp b/src/json.hpp
index 8b72ea653..82d69f7c5 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -1,9 +1,9 @@
// __ _____ _____ _____
// __| | __| | | | JSON for Modern C++
-// | | |__ | | | | | | version 3.11.3
+// | | |__ | | | | | | version 3.12.0
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
//
-// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann
+// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann
// SPDX-License-Identifier: MIT
/****************************************************************************\
@@ -34,10 +34,10 @@
// #include
// __ _____ _____ _____
// __| | __| | | | JSON for Modern C++
-// | | |__ | | | | | | version 3.11.3
+// | | |__ | | | | | | version 3.12.0
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
//
-// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann
+// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann
// SPDX-License-Identifier: MIT
@@ -47,10 +47,10 @@
// #include
// __ _____ _____ _____
// __| | __| | | | JSON for Modern C++
-// | | |__ | | | | | | version 3.11.3
+// | | |__ | | | | | | version 3.12.0
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
//
-// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann
+// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann
// SPDX-License-Identifier: MIT
@@ -59,20 +59,24 @@
#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK
#if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH)
- #if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 11 || NLOHMANN_JSON_VERSION_PATCH != 3
+ #if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 12 || NLOHMANN_JSON_VERSION_PATCH != 0
#warning "Already included a different version of the library!"
#endif
#endif
#endif
#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum)
-#define NLOHMANN_JSON_VERSION_MINOR 11 // NOLINT(modernize-macro-to-enum)
-#define NLOHMANN_JSON_VERSION_PATCH 3 // NOLINT(modernize-macro-to-enum)
+#define NLOHMANN_JSON_VERSION_MINOR 12 // NOLINT(modernize-macro-to-enum)
+#define NLOHMANN_JSON_VERSION_PATCH 0 // NOLINT(modernize-macro-to-enum)
#ifndef JSON_DIAGNOSTICS
#define JSON_DIAGNOSTICS 0
#endif
+#ifndef JSON_DIAGNOSTIC_POSITIONS
+ #define JSON_DIAGNOSTIC_POSITIONS 0
+#endif
+
#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
#define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0
#endif
@@ -83,6 +87,12 @@
#define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS
#endif
+#if JSON_DIAGNOSTIC_POSITIONS
+ #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS _dp
+#else
+ #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS
+#endif
+
#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
#define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp
#else
@@ -94,14 +104,15 @@
#endif
// Construct the namespace ABI tags component
-#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) json_abi ## a ## b
-#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b) \
- NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b)
+#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b, c) json_abi ## a ## b ## c
+#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b, c) \
+ NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b, c)
#define NLOHMANN_JSON_ABI_TAGS \
NLOHMANN_JSON_ABI_TAGS_CONCAT( \
NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS, \
- NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON)
+ NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON, \
+ NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS)
// Construct the namespace version component
#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) \
@@ -149,10 +160,10 @@
// #include
// __ _____ _____ _____
// __| | __| | | | JSON for Modern C++
-// | | |__ | | | | | | version 3.11.3
+// | | |__ | | | | | | version 3.12.0
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
//
-// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann
+// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann
// SPDX-License-Identifier: MIT
@@ -162,6 +173,9 @@
#include // forward_list
#include // inserter, front_inserter, end
#include