diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 91958b916..39fa386f5 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -42,16 +42,16 @@ jobs:
name: 'codeql: ${{ matrix.language }}'
steps:
- name: Checkout repository
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Set up JDK 25
if: ${{ matrix.language == 'java-kotlin' }}
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
+ uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5.6.0
with:
distribution: 'zulu'
java-version: 25
cache: 'maven'
- name: Initialize CodeQL
- uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2
+ uses: github/codeql-action/init@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4.37.3
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}
@@ -60,7 +60,7 @@ jobs:
if: ${{ matrix.language == 'java-kotlin' }}
run: mvn package $MVN_BATCH_MODE_FAIL_AT_END $MVN_SKIP_MOST -DskipTests
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2
+ uses: github/codeql-action/analyze@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4.37.3
with:
category: "/language:${{matrix.language}}"
@@ -73,9 +73,9 @@ jobs:
main: ${{ steps.main.outputs.main }}
steps:
- name: Checkout repository
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Set up JDK 25
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
+ uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5.6.0
with:
distribution: 'zulu'
java-version: 25
@@ -106,7 +106,7 @@ jobs:
id: version
run: echo "version=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:3.6.3:exec)" >> $GITHUB_OUTPUT
- name: Checkout main branch
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: main
- name: Check if ref is main HEAD
@@ -142,14 +142,14 @@ jobs:
timeout-minutes: 8
steps:
- name: Checkout repository
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Download quick-build results
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: quick_build
path: ./
- name: Set up JDK 25
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
+ uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5.6.0
with:
distribution: 'zulu'
java-version: 25
@@ -178,25 +178,25 @@ jobs:
name: 'trivy: ${{ matrix.image.name }}'
steps:
- name: Checkout repository
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Download quick-build results
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: quick_build
path: ./
- name: Set up Buildx
- uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
+ uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
- name: Build Docker image
run: docker build -t ghcr.io/${{ github.repository_owner }}/${{ matrix.image.name }}:${{ github.sha }} ${{ matrix.image.context }}
- name: Scan Docker image with Trivy
- uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # v0.35.0
+ uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
image-ref: ghcr.io/${{ github.repository_owner }}/${{ matrix.image.name }}:${{ github.sha }}
format: 'sarif'
output: 'trivy-results-${{ matrix.image.name }}.sarif'
trivyignores: './.trivyignore'
- name: Upload Trivy scan results to GitHub Security tab
- uses: github/codeql-action/upload-sarif@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2
+ uses: github/codeql-action/upload-sarif@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4.37.3
if: always()
with:
sarif_file: 'trivy-results-${{ matrix.image.name }}.sarif'
@@ -225,24 +225,24 @@ jobs:
name: 'docker-deploy: ${{ matrix.image.name }}'
steps:
- name: Checkout repository
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Download quick-build results
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: quick_build
path: ./
- name: Set up QEMU
- uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
+ uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0
- name: Set up Buildx
- uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
+ uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
- name: Login to GitHub Container Registry
- uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
+ uses: docker/login-action@371161bbe7024a29a25c5e19bfcbc0804fe9ad2c # v4.5.2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Docker metadata
- uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
+ uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6.2.0
id: meta
with:
images: ghcr.io/${{ github.repository_owner }}/${{ matrix.image.name }}
@@ -257,7 +257,7 @@ jobs:
# latest only for stable releases
# develop builds
- name: Build and Push
- uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
+ uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
id: push
with:
push: true
@@ -273,7 +273,7 @@ jobs:
- name: Generate SBOM
run: syft ghcr.io/${{ github.repository_owner }}/${{ matrix.image.name }}@${DIGEST} -o cyclonedx-json > sbom.json
- name: Set up cosign
- uses: sigstore/cosign-installer@cad07c2e89fa2edd6e2d7bab4c1aa38e53f76003 # v4.1.1
+ uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 # v4.1.2
- name: Attach SBOM
run: cosign attest --yes --predicate sbom.json --type cyclonedx ghcr.io/${{ github.repository_owner }}/${{ matrix.image.name }}@${DIGEST}
- name: Sign image
@@ -287,14 +287,14 @@ jobs:
contents: read
steps:
- name: Checkout repository
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Download quick-build results
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: quick_build
path: ./
- name: Set up JDK 25
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
+ uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5.6.0
with:
distribution: 'zulu'
java-version: 25
diff --git a/.trivyignore b/.trivyignore
index 1e04d74d0..0cd739a94 100644
--- a/.trivyignore
+++ b/.trivyignore
@@ -1,3 +1,19 @@
+#
+# Copyright 2018-2025 Heilbronn University of Applied Sciences
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
# Ignore reason: Vulnerable code not used in DSF
# CVE title: FHIR Validator HTTP service has SSRF via /loadIG Chains with startsWith() Credential Leak for Authentication Token Theft
CVE-2026-34361
diff --git a/CITATION.cff b/CITATION.cff
index 4ecc275eb..00d750be0 100644
--- a/CITATION.cff
+++ b/CITATION.cff
@@ -24,8 +24,8 @@ preferred-citation:
doi: 10.3233/SHTI210060
type: proceedings
title: "Data Sharing Framework (DSF)"
-version: 2.1.0
-date-released: 2026-04-14
+version: 2.1.1
+date-released: 2026-08-04
url: https://dsf.dev
repository-code: https://github.com/datasharingframework/dsf
repository-artifact: https://github.com/datasharingframework/dsf/releases
diff --git a/dsf-bpe/dsf-bpe-process-api-v1-base/pom.xml b/dsf-bpe/dsf-bpe-process-api-v1-base/pom.xml
index eb44c20f9..a6b2dd82d 100644
--- a/dsf-bpe/dsf-bpe-process-api-v1-base/pom.xml
+++ b/dsf-bpe/dsf-bpe-process-api-v1-base/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-bpe-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-bpe/dsf-bpe-process-api-v1-impl/pom.xml b/dsf-bpe/dsf-bpe-process-api-v1-impl/pom.xml
index 1323ee3b1..c5d2d4fcb 100644
--- a/dsf-bpe/dsf-bpe-process-api-v1-impl/pom.xml
+++ b/dsf-bpe/dsf-bpe-process-api-v1-impl/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-bpe-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-bpe/dsf-bpe-process-api-v1-operaton/pom.xml b/dsf-bpe/dsf-bpe-process-api-v1-operaton/pom.xml
index 3e3bae16c..95816cf97 100644
--- a/dsf-bpe/dsf-bpe-process-api-v1-operaton/pom.xml
+++ b/dsf-bpe/dsf-bpe-process-api-v1-operaton/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-bpe-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-bpe/dsf-bpe-process-api-v1/pom.xml b/dsf-bpe/dsf-bpe-process-api-v1/pom.xml
index cb46d8890..328e41ef5 100644
--- a/dsf-bpe/dsf-bpe-process-api-v1/pom.xml
+++ b/dsf-bpe/dsf-bpe-process-api-v1/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-bpe-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-bpe/dsf-bpe-process-api-v2-impl/pom.xml b/dsf-bpe/dsf-bpe-process-api-v2-impl/pom.xml
index d5e52227a..cd1ea1a2e 100644
--- a/dsf-bpe/dsf-bpe-process-api-v2-impl/pom.xml
+++ b/dsf-bpe/dsf-bpe-process-api-v2-impl/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-bpe-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/activity/MessageSendTaskDelegate.java b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/activity/MessageSendTaskDelegate.java
index 7ac1d3470..fa1e2ed14 100644
--- a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/activity/MessageSendTaskDelegate.java
+++ b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/activity/MessageSendTaskDelegate.java
@@ -47,13 +47,7 @@ public void execute(DelegateExecution execution) throws Exception
// do not stop process execution
catch (ErrorBoundaryEvent event)
{
- MessageSendTaskErrorHandler handler = delegate.getErrorHandler();
- if (handler != null)
- event = handler.handleErrorBoundaryEvent(api, variables, event);
-
- if (event != null)
- throw new BpmnError(event.getErrorCode(), event.getErrorMessage(), event);
- // else, do nothing if event was absorbed by error handler
+ handleErrorBoundaryEvent(variables, event);
}
// stop process execution if exception not absorbed by error handler
catch (Exception exception)
@@ -62,10 +56,25 @@ public void execute(DelegateExecution execution) throws Exception
if (handler != null)
exception = handler.handleException(api, variables, sendTaskValues, exception);
- if (exception != null)
+ // do not stop process execution if exception translated to error boundary event
+ if (exception instanceof ErrorBoundaryEvent event)
+ handleErrorBoundaryEvent(variables, event);
+
+ else if (exception != null)
execution.getProcessEngine().getRuntimeService().deleteProcessInstance(execution.getProcessInstanceId(),
exception.getMessage());
// else, do nothing if exception was absorbed by error handler
}
}
+
+ private void handleErrorBoundaryEvent(Variables variables, ErrorBoundaryEvent event)
+ {
+ MessageSendTaskErrorHandler handler = delegate.getErrorHandler();
+ if (handler != null)
+ event = handler.handleErrorBoundaryEvent(api, variables, event);
+
+ // do nothing if event was absorbed by error handler
+ if (event != null)
+ throw new BpmnError(event.getErrorCode(), event.getErrorMessage(), event);
+ }
}
diff --git a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/variables/JsonHolder.java b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/variables/JsonHolder.java
index 92ea7188c..f747eda08 100644
--- a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/variables/JsonHolder.java
+++ b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/variables/JsonHolder.java
@@ -19,19 +19,33 @@
public class JsonHolder
{
- private final String dataClassName;
- private final byte[] data;
-
/**
* @param dataClassName
* not null
* @param data
* not null
+ * @return
*/
- public JsonHolder(String dataClassName, byte[] data)
+ public static JsonHolder of(String dataClassName, byte[] data)
+ {
+ Objects.requireNonNull(dataClassName, "dataClassName");
+ Objects.requireNonNull(data, "data");
+
+ return new JsonHolder(dataClassName, data);
+ }
+
+ public static JsonHolder empty()
+ {
+ return new JsonHolder(null, null);
+ }
+
+ private final String dataClassName;
+ private final byte[] data;
+
+ private JsonHolder(String dataClassName, byte[] data)
{
- this.dataClassName = Objects.requireNonNull(dataClassName, "dataClassName");
- this.data = Objects.requireNonNull(data, "data");
+ this.dataClassName = dataClassName;
+ this.data = data;
}
public String getDataClassName()
@@ -43,4 +57,9 @@ public byte[] getData()
{
return data;
}
+
+ public boolean isEmpty()
+ {
+ return dataClassName == null || data == null;
+ }
}
diff --git a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/variables/JsonHolderSerializer.java b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/variables/JsonHolderSerializer.java
index 12e55449f..45caed302 100644
--- a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/variables/JsonHolderSerializer.java
+++ b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/variables/JsonHolderSerializer.java
@@ -52,7 +52,8 @@ public JsonHolderValue readValue(ValueFields valueFields, boolean asTransientVal
String dataClassName = valueFields.getTextValue();
byte[] data = valueFields.getByteArrayValue();
- return JsonHolderValues.create(new JsonHolder(dataClassName, data));
+ return JsonHolderValues.create(
+ dataClassName == null || data == null ? JsonHolder.empty() : JsonHolder.of(dataClassName, data));
}
@Override
diff --git a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/variables/VariablesImpl.java b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/variables/VariablesImpl.java
index 39b56d71c..f85f9dc65 100644
--- a/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/variables/VariablesImpl.java
+++ b/dsf-bpe/dsf-bpe-process-api-v2-impl/src/main/java/dev/dsf/bpe/v2/variables/VariablesImpl.java
@@ -107,12 +107,15 @@ public VariablesImpl(DelegateExecution execution, ObjectMapper objectMapper, Dsf
private JsonHolder toJsonHolder(Object json)
{
+ if (json == null)
+ return JsonHolder.empty();
+
try
{
byte[] data = objectMapper.writeValueAsBytes(json);
String dataClassName = json.getClass().getName();
- return new JsonHolder(dataClassName, data);
+ return JsonHolder.of(dataClassName, data);
}
catch (JsonProcessingException e)
{
@@ -123,11 +126,15 @@ private JsonHolder toJsonHolder(Object json)
@SuppressWarnings("unchecked")
private T fromJsonHolder(JsonHolder holder)
{
+ if (holder.isEmpty())
+ return null;
+
try
{
byte[] data = holder.getData();
- Class> dataClass = getClassLoader().loadClass(holder.getDataClassName());
+ String dataClassName = holder.getDataClassName();
+ Class> dataClass = getClassLoader().loadClass(dataClassName);
return (T) objectMapper.readValue(data, dataClass);
}
catch (ClassNotFoundException | IOException e)
diff --git a/dsf-bpe/dsf-bpe-process-api-v2/pom.xml b/dsf-bpe/dsf-bpe-process-api-v2/pom.xml
index ddc147bc6..0fc973937 100644
--- a/dsf-bpe/dsf-bpe-process-api-v2/pom.xml
+++ b/dsf-bpe/dsf-bpe-process-api-v2/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-bpe-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-bpe/dsf-bpe-process-api/pom.xml b/dsf-bpe/dsf-bpe-process-api/pom.xml
index ba27d7158..0205d2748 100644
--- a/dsf-bpe/dsf-bpe-process-api/pom.xml
+++ b/dsf-bpe/dsf-bpe-process-api/pom.xml
@@ -25,7 +25,7 @@
dev.dsf
dsf-bpe-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-bpe/dsf-bpe-server-jetty/docker/Dockerfile b/dsf-bpe/dsf-bpe-server-jetty/docker/Dockerfile
index 725bfa58f..fc0d51a23 100755
--- a/dsf-bpe/dsf-bpe-server-jetty/docker/Dockerfile
+++ b/dsf-bpe/dsf-bpe-server-jetty/docker/Dockerfile
@@ -14,7 +14,7 @@
# limitations under the License.
#
-FROM debian:trixie-slim@sha256:4ffb3a1511099754cddc70eb1b12e50ffdb67619aa0ab6c13fcd800a78ef7c7a AS builder
+FROM docker.io/library/debian:trixie-slim@sha256:020c0d20b9880058cbe785a9db107156c3c75c2ac944a6aa7ab59f2add76a7bd AS builder
WORKDIR /opt/bpe
COPY --chown=root:2202 ./ ./
RUN chown root:2202 ./ && \
@@ -23,7 +23,7 @@ RUN chown root:2202 ./ && \
chmod 1775 ./log
-FROM azul/zulu-openjdk:25-jre-headless@sha256:9a30f9ac9b51aba2f0ee76daf6440c03d59a7690b4fd6070e85fba1da9fd32ff
+FROM docker.io/azul/zulu-openjdk:25-jre-headless@sha256:44df5eb4a2055e85fff47cb5c6bd4edca4045210a1b05beecd8114822e2f2cdd
LABEL org.opencontainers.image.source=https://github.com/datasharingframework/dsf
LABEL org.opencontainers.image.description="DSF BPE Server"
LABEL org.opencontainers.image.licenses="Apache License, Version 2.0"
diff --git a/dsf-bpe/dsf-bpe-server-jetty/pom.xml b/dsf-bpe/dsf-bpe-server-jetty/pom.xml
index 94a6b1839..608b48094 100755
--- a/dsf-bpe/dsf-bpe-server-jetty/pom.xml
+++ b/dsf-bpe/dsf-bpe-server-jetty/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-bpe-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-bpe/dsf-bpe-server/pom.xml b/dsf-bpe/dsf-bpe-server/pom.xml
index 9ba226efb..30c57b695 100755
--- a/dsf-bpe/dsf-bpe-server/pom.xml
+++ b/dsf-bpe/dsf-bpe-server/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-bpe-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/client/oidc/OidcClientJersey.java b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/client/oidc/OidcClientJersey.java
index 513d8597e..7f96d9c16 100644
--- a/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/client/oidc/OidcClientJersey.java
+++ b/dsf-bpe/dsf-bpe-server/src/main/java/dev/dsf/bpe/client/oidc/OidcClientJersey.java
@@ -15,6 +15,7 @@
*/
package dev.dsf.bpe.client.oidc;
+import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.KeyStore;
import java.time.Duration;
@@ -152,8 +153,10 @@ public DecodedJWT getAccessTokenDecoded(OidcConfiguration configuration, Jwks jw
Response response = client.target(tokenEndpoint).request(MediaType.APPLICATION_JSON_TYPE)
.header(HttpHeaders.AUTHORIZATION,
"Basic " + Base64.getEncoder()
- .encodeToString(new StringBuilder().append(clientId).append(':').append(clientSecret)
- .toString().getBytes(StandardCharsets.US_ASCII)))
+ .encodeToString(new StringBuilder()
+ .append(URLEncoder.encode(clientId, StandardCharsets.UTF_8)).append(':')
+ .append(URLEncoder.encode(String.valueOf(clientSecret), StandardCharsets.UTF_8))
+ .toString().getBytes(StandardCharsets.UTF_8)))
.post(Entity.form(new Form().param("grant_type", "client_credentials")));
if (response.getStatus() == Status.OK.getStatusCode())
@@ -184,7 +187,7 @@ private DecodedJWT verifyAndDecodeAccessToken(String accessToken, Jwks jwks) thr
throw new OidcClientException("Access token key with kid '" + keyId + "' and use 'sig' not in JWKS");
Optional algorithm = key.flatMap(JwksKey::toAlgorithm);
- if (key.isEmpty())
+ if (algorithm.isEmpty())
{
throw new OidcClientException("Access token key with kid '" + keyId
+ "' has unsupported type (kty) / algorithm (alg) / key-size in JWKS");
diff --git a/dsf-bpe/dsf-bpe-server/src/test/java/dev/dsf/bpe/client/oidc/OidcClientJerseyTest.java b/dsf-bpe/dsf-bpe-server/src/test/java/dev/dsf/bpe/client/oidc/OidcClientJerseyTest.java
index e9f6360bf..573879205 100644
--- a/dsf-bpe/dsf-bpe-server/src/test/java/dev/dsf/bpe/client/oidc/OidcClientJerseyTest.java
+++ b/dsf-bpe/dsf-bpe-server/src/test/java/dev/dsf/bpe/client/oidc/OidcClientJerseyTest.java
@@ -15,22 +15,48 @@
*/
package dev.dsf.bpe.client.oidc;
-import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.*;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
import java.nio.file.Paths;
import java.security.KeyStore;
import java.time.Duration;
+import java.util.Base64;
+import java.util.List;
+import java.util.Set;
import org.junit.Ignore;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.ExternalResource;
+import com.sun.net.httpserver.HttpsConfigurator;
+import com.sun.net.httpserver.HttpsServer;
+
+import de.hsheilbronn.mi.utils.crypto.context.SSLContextFactory;
import de.hsheilbronn.mi.utils.crypto.io.PemReader;
import de.hsheilbronn.mi.utils.crypto.keystore.KeyStoreCreator;
+import dev.dsf.bpe.api.client.oidc.OidcClientException;
+import dev.dsf.bpe.integration.X509Certificates;
+import dev.dsf.common.oidc.Jwks;
+import dev.dsf.common.oidc.OidcConfiguration;
+import jakarta.ws.rs.core.HttpHeaders;
-@Ignore
-// Needs keycloak service from 3dic-ttp dev setup, "Service accounts roles" needs to be activated for dic1-fhir client
public class OidcClientJerseyTest
{
+ @Rule
+ public final X509Certificates certificates = new X509Certificates();
+
+ @Rule
+ public final TokenEndpointServerResource tokenEndpointServerResource = new TokenEndpointServerResource();
+
+ // Needs keycloak service from 3dic-ttp dev setup, "Service accounts roles" needs to be activated for dic1-fhir
+ // client
+ @Ignore
@Test
public void getAccessToken() throws Exception
{
@@ -45,4 +71,126 @@ public void getAccessToken() throws Exception
char[] accessToken = client.asOidcClientWithDecodedJwt().getAccessToken();
assertNotNull(accessToken);
}
-}
\ No newline at end of file
+
+ @Test
+ public void basicAuthorizationClientIdAndSecretShouldBeUrlEncoded() throws Exception
+ {
+ var clientId = "client/id:+";
+ var clientSecret = "client/s€cr€t:+";
+ var expectedAuthorizationHeaderValue = "Basic "
+ .concat(clientId.transform(id -> URLEncoder.encode(id, StandardCharsets.UTF_8)).concat(":")
+ .concat(clientSecret.transform(secret -> URLEncoder.encode(secret, StandardCharsets.UTF_8)))
+ .transform(s -> Base64.getEncoder().encodeToString(s.getBytes(StandardCharsets.UTF_8))));
+ var client = new OidcClientJersey("https://localhost:" + tokenEndpointServerResource.getPort(),
+ "/.well-known/openid-configuration", clientId, clientSecret.toCharArray(),
+ certificates.getFhirServerCertificate().trustStore(), null, null, null, null, null, "Test Client",
+ Duration.ofSeconds(10), Duration.ofSeconds(5), true, Duration.ofSeconds(10), null, false);
+ var config = new OidcConfiguration("https://localhost:" + tokenEndpointServerResource.getPort(),
+ "https://localhost:" + tokenEndpointServerResource.getPort() + "/token", "https://localhost/jwks",
+ Set.of("client_credentials"));
+
+ // token is intentionally invalid as it is not the focus of this test
+ // and to simplify test code
+ assertThrows(OidcClientException.class, () -> client.getAccessTokenDecoded(config, new Jwks(List.of())));
+
+ assertEquals(expectedAuthorizationHeaderValue, tokenEndpointServerResource.getAuthorizationHeaderValue());
+ }
+
+ private class TokenEndpointServerResource extends ExternalResource
+ {
+ private HttpsServer server;
+ private String authorizationHeaderValue;
+
+ @Override
+ protected void before() throws Throwable
+ {
+ // Server will be created lazily when getPort() is first called
+ }
+
+ @Override
+ protected void after()
+ {
+ if (server != null)
+ {
+ server.stop(0);
+ }
+ }
+
+ int getPort() throws Exception
+ {
+ if (server == null)
+ {
+ server = createServer();
+ server.start();
+ }
+ return server.getAddress().getPort();
+ }
+
+ String getAuthorizationHeaderValue()
+ {
+ return authorizationHeaderValue;
+ }
+
+ private HttpsServer createServer() throws Exception
+ {
+ var newServer = HttpsServer.create(new InetSocketAddress("localhost", 0), 0);
+ var serverCertificate = certificates.getFhirServerCertificate();
+
+ var keyStorePassword = "server-password".toCharArray();
+ KeyStore keyStore = KeyStoreCreator.jksForPrivateKeyAndCertificateChain(serverCertificate.privateKey(),
+ keyStorePassword, serverCertificate.certificate(), serverCertificate.caCertificate());
+
+ newServer.setHttpsConfigurator(
+ new HttpsConfigurator(SSLContextFactory.createSSLContext(null, keyStore, keyStorePassword, "TLS")));
+
+ newServer.createContext("/token", exchange ->
+ {
+ authorizationHeaderValue = exchange.getRequestHeaders().getFirst(HttpHeaders.AUTHORIZATION);
+
+ byte[] response = "{\"access_token\":\"invalid\",\"expires_in\":300}".getBytes(StandardCharsets.UTF_8);
+ exchange.getResponseHeaders().set(HttpHeaders.CONTENT_TYPE, "application/json");
+ exchange.sendResponseHeaders(200, response.length);
+ try (OutputStream out = exchange.getResponseBody())
+ {
+ out.write(response);
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
+ exchange.close();
+ });
+
+ return newServer;
+ }
+ }
+
+ @Test
+ public void testEncoding() throws Exception
+ {
+ /*
+ * RFC 6749, Appendix B - https://datatracker.ietf.org/doc/html/rfc6749#appendix-B
+ *
+ * [...]
+ *
+ * When parsing data from a payload using this media type, the names and values resulting from reversing the
+ * name/value encoding consequently need to be treated as octet sequences, to be decoded using the UTF-8
+ * character encoding scheme.
+ *
+ * For example, the value consisting of the six Unicode code points (1) U+0020 (SPACE), (2) U+0025 (PERCENT
+ * SIGN), (3) U+0026 (AMPERSAND), (4) U+002B (PLUS SIGN), (5) U+00A3 (POUND SIGN), and (6) U+20AC (EURO SIGN)
+ * would be encoded into the octet sequence below (using hexadecimal notation):
+ *
+ * 20 25 26 2B C2 A3 E2 82 AC
+ *
+ * and then represented in the payload as:
+ *
+ * +%25%26%2B%C2%A3%E2%82%AC
+ */
+
+ String example = "\u0020\u0025\u0026\u002B\u00A3\u20AC";
+ String expected = "+%25%26%2B%C2%A3%E2%82%AC";
+
+ assertEquals(expected, URLEncoder.encode(example, StandardCharsets.UTF_8));
+ }
+}
diff --git a/dsf-bpe/dsf-bpe-server/src/test/java/dev/dsf/bpe/integration/PluginV2IntegrationTest.java b/dsf-bpe/dsf-bpe-server/src/test/java/dev/dsf/bpe/integration/PluginV2IntegrationTest.java
index 74751a493..3ce5d2dce 100644
--- a/dsf-bpe/dsf-bpe-server/src/test/java/dev/dsf/bpe/integration/PluginV2IntegrationTest.java
+++ b/dsf-bpe/dsf-bpe-server/src/test/java/dev/dsf/bpe/integration/PluginV2IntegrationTest.java
@@ -111,6 +111,12 @@ public void startSendTaskTest() throws Exception
executePluginTest(createTestTask("SendTaskTest"));
}
+ @Test
+ public void startSendTaskErrorBoundaryEventTestThrow() throws Exception
+ {
+ executePluginTest(createTestTask("SendTaskErrorBoundaryEventTestThrow"));
+ }
+
@Test
public void startFieldInjectionTest() throws Exception
{
diff --git a/dsf-bpe/dsf-bpe-test-plugin-v1/pom.xml b/dsf-bpe/dsf-bpe-test-plugin-v1/pom.xml
index 512dd8b7b..8192f0a65 100644
--- a/dsf-bpe/dsf-bpe-test-plugin-v1/pom.xml
+++ b/dsf-bpe/dsf-bpe-test-plugin-v1/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-bpe-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-bpe/dsf-bpe-test-plugin-v1/src/main/resources/bpe/test.bpmn b/dsf-bpe/dsf-bpe-test-plugin-v1/src/main/resources/bpe/test.bpmn
index c506ff46b..e3b6edbff 100644
--- a/dsf-bpe/dsf-bpe-test-plugin-v1/src/main/resources/bpe/test.bpmn
+++ b/dsf-bpe/dsf-bpe-test-plugin-v1/src/main/resources/bpe/test.bpmn
@@ -16,7 +16,7 @@
limitations under the License.
-->
-
+
Flow_112zq99
@@ -37,13 +37,14 @@
Flow_112zq99
Flow_1bqddk1
-
+
Flow_1bqddk1
Flow_14rzc0j
Flow_0iy74da
Flow_1h0pa8u
Flow_1hhwby8
Flow_0u49lp5
+ Flow_04yuv8k
@@ -88,106 +89,118 @@
${testActivity == 'EnvironmentVariableTest'}
+
+ Flow_04yuv8k
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
+
+
+
+
+
diff --git a/dsf-bpe/dsf-bpe-test-plugin-v2/pom.xml b/dsf-bpe/dsf-bpe-test-plugin-v2/pom.xml
index cddcddb30..7dfcb7880 100644
--- a/dsf-bpe/dsf-bpe-test-plugin-v2/pom.xml
+++ b/dsf-bpe/dsf-bpe-test-plugin-v2/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-bpe-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/message/SendTaskErrorBoundaryEventTestThrow.java b/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/message/SendTaskErrorBoundaryEventTestThrow.java
new file mode 100644
index 000000000..51ef77640
--- /dev/null
+++ b/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/message/SendTaskErrorBoundaryEventTestThrow.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2018-2025 Heilbronn University of Applied Sciences
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package dev.dsf.bpe.test.message;
+
+import dev.dsf.bpe.test.AbstractTest;
+import dev.dsf.bpe.v2.ProcessPluginApi;
+import dev.dsf.bpe.v2.activity.MessageSendTask;
+import dev.dsf.bpe.v2.activity.values.SendTaskValues;
+import dev.dsf.bpe.v2.error.MessageSendTaskErrorHandler;
+import dev.dsf.bpe.v2.error.impl.ExceptionToErrorBoundaryEventTranslationErrorHandler;
+import dev.dsf.bpe.v2.variables.Variables;
+
+public class SendTaskErrorBoundaryEventTestThrow extends AbstractTest implements MessageSendTask
+{
+ public static final String TEST_ERROR_CODE = "testErrorCode";
+ public static final String TEST_ERROR_MESSAGE = "testErrorMessage";
+
+ @Override
+ public void execute(ProcessPluginApi api, Variables variables, SendTaskValues sendTask) throws Exception
+ {
+ throw new RuntimeException(TEST_ERROR_MESSAGE);
+ }
+
+ @Override
+ public MessageSendTaskErrorHandler getErrorHandler()
+ {
+ return new ExceptionToErrorBoundaryEventTranslationErrorHandler(_ -> TEST_ERROR_CODE);
+ }
+}
diff --git a/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/service/JsonVariableTestGet.java b/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/service/JsonVariableTestGet.java
index 638db9972..7514efebc 100644
--- a/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/service/JsonVariableTestGet.java
+++ b/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/service/JsonVariableTestGet.java
@@ -16,6 +16,7 @@
package dev.dsf.bpe.test.service;
import static dev.dsf.bpe.test.PluginTestExecutor.expectNotNull;
+import static dev.dsf.bpe.test.PluginTestExecutor.expectNull;
import static dev.dsf.bpe.test.PluginTestExecutor.expectSame;
import dev.dsf.bpe.test.AbstractTest;
@@ -62,4 +63,12 @@ public void getIntegerVariable(Variables variables) throws Exception
expectNotNull(variable);
expectSame(JsonVariableTestSet.TEST_INTEGER, variable);
}
+
+ @PluginTest
+ public void getJsonNullVariable(Variables variables) throws Exception
+ {
+ JsonPojo variable = variables.getVariable(JsonVariableTestSet.JSON_NULL_VARIABLE);
+
+ expectNull(variable);
+ }
}
diff --git a/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/service/JsonVariableTestSet.java b/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/service/JsonVariableTestSet.java
index fe0564455..82d2668f6 100644
--- a/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/service/JsonVariableTestSet.java
+++ b/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/service/JsonVariableTestSet.java
@@ -26,6 +26,7 @@
public class JsonVariableTestSet implements ServiceTask
{
public static final String JSON_VARIABLE = "json-variable";
+ public static final String JSON_NULL_VARIABLE = "json-null-variable";
public static final String STRING_VARIABLE = "string-variable";
public static final String INTEGER_VARIABLE = "integer-variable";
@@ -41,5 +42,6 @@ public void execute(ProcessPluginApi api, Variables variables) throws ErrorBound
variables.setJsonVariable(JSON_VARIABLE, new JsonPojo(TEST_VALUE_1, TEST_VALUE_2, TEST_ZONED_DATE_TIME_VALUE));
variables.setString(STRING_VARIABLE, TEST_STRING);
variables.setInteger(INTEGER_VARIABLE, TEST_INTEGER);
+ variables.setJsonVariable(JSON_NULL_VARIABLE, null);
}
}
diff --git a/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/spring/config/Config.java b/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/spring/config/Config.java
index e1577c881..19eb319ac 100644
--- a/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/spring/config/Config.java
+++ b/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/java/dev/dsf/bpe/test/spring/config/Config.java
@@ -30,6 +30,7 @@
import dev.dsf.bpe.test.listener.StartFieldInjectionTestListener;
import dev.dsf.bpe.test.listener.StartSendTaskTestListener;
import dev.dsf.bpe.test.message.ContinueSendTestSend;
+import dev.dsf.bpe.test.message.SendTaskErrorBoundaryEventTestThrow;
import dev.dsf.bpe.test.message.SendTaskTest;
import dev.dsf.bpe.test.service.ApiTest;
import dev.dsf.bpe.test.service.AutowireTest;
@@ -90,13 +91,13 @@ public static ActivityPrototypeBeanCreator activityPrototypeBeanCreator()
return new ActivityPrototypeBeanCreator(TestActivitySelector.class, ProxyTest.class, ApiTest.class,
OrganizationProviderTest.class, EndpointProviderTest.class, FhirClientProviderTest.class,
FhirClientConfigProviderTest.class, StartSendTaskTestListener.class, SendTaskTest.class,
- StartFieldInjectionTestListener.class, FieldInjectionTest.class, ErrorBoundaryEventTestThrow.class,
- ErrorBoundaryEventTestVerify.class, ExceptionTest.class, CompressionServiceTest.class,
- ContinueSendTest.class, ContinueSendTestSend.class, ContinueSendTestEvaluate.class,
- JsonVariableTestSet.class, JsonVariableTestGet.class, CryptoServiceTest.class,
- MimeTypeServiceTest.class, FhirBinaryVariableTestSet.class, FhirBinaryVariableTestGet.class,
- DsfClientTest.class, TargetProviderTest.class, DataLoggerTest.class, AutowireTest.class,
- QuestionnaireTestAnswer.class, QuestionnaireTestAnswerCheck.class,
+ SendTaskErrorBoundaryEventTestThrow.class, StartFieldInjectionTestListener.class,
+ FieldInjectionTest.class, ErrorBoundaryEventTestThrow.class, ErrorBoundaryEventTestVerify.class,
+ ExceptionTest.class, CompressionServiceTest.class, ContinueSendTest.class, ContinueSendTestSend.class,
+ ContinueSendTestEvaluate.class, JsonVariableTestSet.class, JsonVariableTestGet.class,
+ CryptoServiceTest.class, MimeTypeServiceTest.class, FhirBinaryVariableTestSet.class,
+ FhirBinaryVariableTestGet.class, DsfClientTest.class, TargetProviderTest.class, DataLoggerTest.class,
+ AutowireTest.class, QuestionnaireTestAnswer.class, QuestionnaireTestAnswerCheck.class,
QuestionnaireTestSetIdentifies.class);
}
diff --git a/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/resources/bpe/test.bpmn b/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/resources/bpe/test.bpmn
index 31e3ceee0..5b5cf6346 100644
--- a/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/resources/bpe/test.bpmn
+++ b/dsf-bpe/dsf-bpe-test-plugin-v2/src/main/resources/bpe/test.bpmn
@@ -16,7 +16,7 @@
limitations under the License.
-->
-
+
Flow_112zq99
@@ -37,7 +37,7 @@
Flow_112zq99
Flow_1bqddk1
-
+
Flow_1bqddk1
Flow_14rzc0j
Flow_0iy74da
@@ -64,6 +64,8 @@
Flow_0paqotx
Flow_1wpvvjm
Flow_1ih8var
+ Flow_1gt50du
+ Flow_1phdcxi
@@ -99,6 +101,7 @@
Flow_1xuklwp
Flow_1u24rv8
Flow_0civp0p
+ Flow_10cr72e
Flow_0a1kwg9
@@ -578,667 +581,741 @@
Flow_1ih8var
Flow_1mo1h7u
+
+
+
+ instantiatesCanonicalValue
+
+
+ messageNameValue
+
+
+ profileValue
+
+
+ Flow_1gt50du
+ Flow_063u1ol
+
+
+ ${testActivity == 'SendTaskErrorBoundaryEventTestThrow'}
+
+
+ Flow_1upv70e
+ Flow_063u1ol
+ Flow_10cr72e
+
+
+ Flow_1upv70e
+
+
+
+
+
+
+
+ Flow_1phdcxi
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
+
-
+
-
+
-
+
+
+
+
-
+
-
-
+
+
+
-
-
+
+
+
-
-
+
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
-
-
-
-
-
-
-
-
+
+
+
-
-
-
-
-
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dsf-bpe/dsf-bpe-test-plugin/pom.xml b/dsf-bpe/dsf-bpe-test-plugin/pom.xml
index 83fe44e36..61bea458f 100644
--- a/dsf-bpe/dsf-bpe-test-plugin/pom.xml
+++ b/dsf-bpe/dsf-bpe-test-plugin/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-bpe-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-bpe/dsf-bpe-test-plugin/src/main/java/dev/dsf/bpe/test/PluginTestExecutor.java b/dsf-bpe/dsf-bpe-test-plugin/src/main/java/dev/dsf/bpe/test/PluginTestExecutor.java
index 627ce5714..0b4e690c3 100644
--- a/dsf-bpe/dsf-bpe-test-plugin/src/main/java/dev/dsf/bpe/test/PluginTestExecutor.java
+++ b/dsf-bpe/dsf-bpe-test-plugin/src/main/java/dev/dsf/bpe/test/PluginTestExecutor.java
@@ -31,11 +31,11 @@ public final class PluginTestExecutor
{
private static final Logger logger = LoggerFactory.getLogger(PluginTestExecutor.class);
- private static final class TestAssertException extends RuntimeException
+ public static final class TestAssertException extends RuntimeException
{
private static final long serialVersionUID = 1L;
- public TestAssertException(String message)
+ private TestAssertException(String message)
{
super(message);
}
diff --git a/dsf-bpe/pom.xml b/dsf-bpe/pom.xml
index 5d9a7aa0e..08fef2cbb 100755
--- a/dsf-bpe/pom.xml
+++ b/dsf-bpe/pom.xml
@@ -24,7 +24,7 @@
dev.dsf
dsf-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-common/dsf-common-auth/pom.xml b/dsf-common/dsf-common-auth/pom.xml
index a0b85b5db..a7b809b77 100644
--- a/dsf-common/dsf-common-auth/pom.xml
+++ b/dsf-common/dsf-common-auth/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-common-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-common/dsf-common-build-info-reader/pom.xml b/dsf-common/dsf-common-build-info-reader/pom.xml
index c9df2445a..fade0b103 100644
--- a/dsf-common/dsf-common-build-info-reader/pom.xml
+++ b/dsf-common/dsf-common-build-info-reader/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-common-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-common/dsf-common-config/pom.xml b/dsf-common/dsf-common-config/pom.xml
index ea99ec487..5f5f2b5b4 100644
--- a/dsf-common/dsf-common-config/pom.xml
+++ b/dsf-common/dsf-common-config/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-common-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-common/dsf-common-db/pom.xml b/dsf-common/dsf-common-db/pom.xml
index e4ebab9a5..d2d8c3414 100644
--- a/dsf-common/dsf-common-db/pom.xml
+++ b/dsf-common/dsf-common-db/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-common-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-common/dsf-common-docker-secrets-reader/pom.xml b/dsf-common/dsf-common-docker-secrets-reader/pom.xml
index 53738b0cf..87ac31219 100644
--- a/dsf-common/dsf-common-docker-secrets-reader/pom.xml
+++ b/dsf-common/dsf-common-docker-secrets-reader/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-common-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-common/dsf-common-documentation/pom.xml b/dsf-common/dsf-common-documentation/pom.xml
index ce16e5f65..1dd75fa0f 100644
--- a/dsf-common/dsf-common-documentation/pom.xml
+++ b/dsf-common/dsf-common-documentation/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-common-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-common/dsf-common-jetty/pom.xml b/dsf-common/dsf-common-jetty/pom.xml
index a2f4612f7..34f905682 100644
--- a/dsf-common/dsf-common-jetty/pom.xml
+++ b/dsf-common/dsf-common-jetty/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-common-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-common/dsf-common-oidc/pom.xml b/dsf-common/dsf-common-oidc/pom.xml
index 4113ca264..b42aa9a2a 100644
--- a/dsf-common/dsf-common-oidc/pom.xml
+++ b/dsf-common/dsf-common-oidc/pom.xml
@@ -25,7 +25,7 @@
dev.dsf
dsf-common-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-common/dsf-common-status/pom.xml b/dsf-common/dsf-common-status/pom.xml
index 59f9c67b1..b8a03f6e1 100644
--- a/dsf-common/dsf-common-status/pom.xml
+++ b/dsf-common/dsf-common-status/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-common-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-common/dsf-common-ui/pom.xml b/dsf-common/dsf-common-ui/pom.xml
index 32f6c8f27..3adb67d79 100644
--- a/dsf-common/dsf-common-ui/pom.xml
+++ b/dsf-common/dsf-common-ui/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-common-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-common/pom.xml b/dsf-common/pom.xml
index 85108968c..c2fd7997f 100644
--- a/dsf-common/pom.xml
+++ b/dsf-common/pom.xml
@@ -24,7 +24,7 @@
dev.dsf
dsf-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-docker-dev-setup-3dic-ttp/docker-compose.yml b/dsf-docker-dev-setup-3dic-ttp/docker-compose.yml
index 3cd1ac2b8..6f53d56dd 100644
--- a/dsf-docker-dev-setup-3dic-ttp/docker-compose.yml
+++ b/dsf-docker-dev-setup-3dic-ttp/docker-compose.yml
@@ -16,7 +16,7 @@
services:
proxy:
- image: nginx:1.29
+ image: nginx:1.31
restart: "no"
ports:
- 127.0.0.1:443:443
@@ -34,23 +34,27 @@ services:
source: ./proxy/nginx.conf
target: /etc/nginx/nginx.conf
read_only: true
+ - type: bind
+ source: ./proxy/index.html
+ target: /usr/share/nginx/html/index.html
+ read_only: true
networks:
dic1-fhir-frontend:
ipv4_address: 172.20.0.2
dic2-fhir-frontend:
- ipv4_address: 172.20.0.10
- dic3-fhir-frontend:
ipv4_address: 172.20.0.18
+ dic3-fhir-frontend:
+ ipv4_address: 172.20.0.34
ttp-fhir-frontend:
- ipv4_address: 172.20.0.26
+ ipv4_address: 172.20.0.50
dic1-bpe-frontend:
- ipv4_address: 172.20.0.34
+ ipv4_address: 172.20.0.66
dic2-bpe-frontend:
- ipv4_address: 172.20.0.42
+ ipv4_address: 172.20.0.82
dic3-bpe-frontend:
- ipv4_address: 172.20.0.50
+ ipv4_address: 172.20.0.98
ttp-bpe-frontend:
- ipv4_address: 172.20.0.58
+ ipv4_address: 172.20.0.114
internet:
aliases:
- dic1
@@ -94,7 +98,7 @@ services:
read_only: true
keycloak:
- image: quay.io/keycloak/keycloak:26.3
+ image: quay.io/keycloak/keycloak:26.7
restart: "no"
ports:
- 127.0.0.1:8443:8443
@@ -290,7 +294,7 @@ services:
DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET_FILE: /run/secrets/oidc_client_dic2_fhir.secret
networks:
dic2-fhir-frontend:
- ipv4_address: 172.20.0.11
+ ipv4_address: 172.20.0.19
dic2-fhir-backend:
internet:
depends_on:
@@ -369,7 +373,7 @@ services:
DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET_FILE: /run/secrets/oidc_client_dic3_fhir.secret
networks:
dic3-fhir-frontend:
- ipv4_address: 172.20.0.19
+ ipv4_address: 172.20.0.35
dic3-fhir-backend:
internet:
depends_on:
@@ -456,7 +460,7 @@ services:
DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET_FILE: /run/secrets/oidc_client_ttp_fhir.secret
networks:
ttp-fhir-frontend:
- ipv4_address: 172.20.0.27
+ ipv4_address: 172.20.0.51
ttp-fhir-backend:
internet:
depends_on:
@@ -573,7 +577,7 @@ services:
DEV_DSF_BPE_FHIR_CLIENT_CONNECTIONS_CONFIG_DEFAULT_TRUST_SERVER_CERTIFICATE_CAS: /run/secrets/root_ca.crt
networks:
dic1-bpe-frontend:
- ipv4_address: 172.20.0.35
+ ipv4_address: 172.20.0.67
dic1-bpe-backend:
internet:
forward-proxy:
@@ -664,7 +668,7 @@ services:
DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET_FILE: /run/secrets/oidc_client_dic2_bpe.secret
networks:
dic2-bpe-frontend:
- ipv4_address: 172.20.0.43
+ ipv4_address: 172.20.0.83
dic2-bpe-backend:
internet:
depends_on:
@@ -753,7 +757,7 @@ services:
DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET_FILE: /run/secrets/oidc_client_dic3_bpe.secret
networks:
dic3-bpe-frontend:
- ipv4_address: 172.20.0.51
+ ipv4_address: 172.20.0.99
dic3-bpe-backend:
internet:
depends_on:
@@ -843,7 +847,7 @@ services:
DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET_FILE: /run/secrets/oidc_client_ttp_bpe.secret
networks:
ttp-bpe-frontend:
- ipv4_address: 172.20.0.59
+ ipv4_address: 172.20.0.115
ttp-bpe-backend:
internet:
depends_on:
@@ -964,57 +968,107 @@ networks:
config:
- subnet: 172.20.0.0/29
dic1-fhir-backend:
- dic2-fhir-frontend:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.20.0.8/29
+ dic2-fhir-frontend:
+ driver: bridge
+ ipam:
+ driver: default
+ config:
+ - subnet: 172.20.0.16/29
dic2-fhir-backend:
+ driver: bridge
+ ipam:
+ driver: default
+ config:
+ - subnet: 172.20.0.24/29
dic3-fhir-frontend:
driver: bridge
ipam:
driver: default
config:
- - subnet: 172.20.0.16/29
+ - subnet: 172.20.0.32/29
dic3-fhir-backend:
+ driver: bridge
+ ipam:
+ driver: default
+ config:
+ - subnet: 172.20.0.40/29
ttp-fhir-frontend:
driver: bridge
ipam:
driver: default
config:
- - subnet: 172.20.0.24/29
+ - subnet: 172.20.0.48/29
ttp-fhir-backend:
+ driver: bridge
+ ipam:
+ driver: default
+ config:
+ - subnet: 172.20.0.56/29
dic1-bpe-frontend:
driver: bridge
ipam:
driver: default
config:
- - subnet: 172.20.0.32/29
+ - subnet: 172.20.0.64/29
dic1-bpe-backend:
+ driver: bridge
+ ipam:
+ driver: default
+ config:
+ - subnet: 172.20.0.72/29
dic2-bpe-frontend:
driver: bridge
ipam:
driver: default
config:
- - subnet: 172.20.0.40/29
+ - subnet: 172.20.0.80/29
dic2-bpe-backend:
+ driver: bridge
+ ipam:
+ driver: default
+ config:
+ - subnet: 172.20.0.88/29
dic3-bpe-frontend:
driver: bridge
ipam:
driver: default
config:
- - subnet: 172.20.0.48/29
+ - subnet: 172.20.0.96/29
dic3-bpe-backend:
+ driver: bridge
+ ipam:
+ driver: default
+ config:
+ - subnet: 172.20.0.104/29
ttp-bpe-frontend:
driver: bridge
ipam:
driver: default
config:
- - subnet: 172.20.0.56/29
+ - subnet: 172.20.0.112/29
ttp-bpe-backend:
+ driver: bridge
+ ipam:
+ driver: default
+ config:
+ - subnet: 172.20.0.120/29
internet:
+ driver: bridge
+ ipam:
+ driver: default
+ config:
+ - subnet: 172.20.0.128/28
forward-proxy:
+ driver: bridge
+ ipam:
+ driver: default
+ config:
+ - subnet: 172.20.0.144/29
volumes:
postgresql:
diff --git a/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic1.conf b/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic1.conf
index 0580cae33..e7e86ae66 100644
--- a/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic1.conf
+++ b/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic1.conf
@@ -38,7 +38,7 @@ server {
location /bpe {
proxy_set_header X-ClientCert $ssl_client_escaped_cert;
- proxy_pass http://172.20.0.35:8080/bpe;
+ proxy_pass http://172.20.0.67:8080/bpe;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
diff --git a/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic2.conf b/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic2.conf
index e7cffb32d..7246c61e8 100644
--- a/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic2.conf
+++ b/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic2.conf
@@ -22,7 +22,7 @@ server {
location /fhir {
proxy_set_header X-ClientCert $ssl_client_escaped_cert;
- proxy_pass http://172.20.0.11:8080/fhir;
+ proxy_pass http://172.20.0.19:8080/fhir;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
@@ -38,7 +38,7 @@ server {
location /bpe {
proxy_set_header X-ClientCert $ssl_client_escaped_cert;
- proxy_pass http://172.20.0.43:8080/bpe;
+ proxy_pass http://172.20.0.83:8080/bpe;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
diff --git a/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic3.conf b/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic3.conf
index 2b5668b8a..3b9856925 100644
--- a/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic3.conf
+++ b/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/dic3.conf
@@ -22,7 +22,7 @@ server {
location /fhir {
proxy_set_header X-ClientCert $ssl_client_escaped_cert;
- proxy_pass http://172.20.0.19:8080/fhir;
+ proxy_pass http://172.20.0.35:8080/fhir;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
@@ -38,7 +38,7 @@ server {
location /bpe {
proxy_set_header X-ClientCert $ssl_client_escaped_cert;
- proxy_pass http://172.20.0.51:8080/bpe;
+ proxy_pass http://172.20.0.99:8080/bpe;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
diff --git a/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/localhost.conf b/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/localhost.conf
new file mode 100644
index 000000000..0ef58e453
--- /dev/null
+++ b/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/localhost.conf
@@ -0,0 +1,28 @@
+#
+# Copyright 2018-2025 Heilbronn University of Applied Sciences
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+server {
+ listen 443 ssl;
+ listen [::]:443 ssl;
+
+ server_name localhost;
+
+ root /usr/share/nginx/html;
+
+ location / {
+ try_files /index.html =404;
+ }
+}
\ No newline at end of file
diff --git a/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/ttp.conf b/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/ttp.conf
index da3d7d9fc..7fd6b7c49 100644
--- a/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/ttp.conf
+++ b/dsf-docker-dev-setup-3dic-ttp/proxy/conf.d/ttp.conf
@@ -22,7 +22,7 @@ server {
location /fhir {
proxy_set_header X-ClientCert $ssl_client_escaped_cert;
- proxy_pass http://172.20.0.27:8080/fhir;
+ proxy_pass http://172.20.0.51:8080/fhir;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
@@ -38,7 +38,7 @@ server {
location /bpe {
proxy_set_header X-ClientCert $ssl_client_escaped_cert;
- proxy_pass http://172.20.0.59:8080/bpe;
+ proxy_pass http://172.20.0.115:8080/bpe;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
diff --git a/dsf-docker-dev-setup-3dic-ttp/proxy/index.html b/dsf-docker-dev-setup-3dic-ttp/proxy/index.html
new file mode 100644
index 000000000..7676a16f5
--- /dev/null
+++ b/dsf-docker-dev-setup-3dic-ttp/proxy/index.html
@@ -0,0 +1,91 @@
+
+
+
+localhost
+
+
+
+
+
+
3 DIC / TTP Dev Setup
+
+
+
TTP
+
+
DIC 1
+
+
DIC 2
+
+
DIC 3
+
+
Keycloak
+
+
Mailhog
+
+
+
+
\ No newline at end of file
diff --git a/dsf-docker-dev-setup-3dic-ttp/proxy/nginx.conf b/dsf-docker-dev-setup-3dic-ttp/proxy/nginx.conf
index 6885c87a0..04fa214ef 100644
--- a/dsf-docker-dev-setup-3dic-ttp/proxy/nginx.conf
+++ b/dsf-docker-dev-setup-3dic-ttp/proxy/nginx.conf
@@ -28,9 +28,7 @@ http {
ssl_certificate /run/secrets/localhost.chain.crt;
ssl_certificate_key /run/secrets/localhost.key.plain;
- ssl_protocols TLSv1.2 TLSv1.3;
- ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
- ssl_prefer_server_ciphers on;
+ ssl_protocols TLSv1.3;
add_header Strict-Transport-Security "max-age=63072000" always;
ssl_client_certificate /run/secrets/issuing_ca.crt;
diff --git a/dsf-docker/bpe_proxy/Dockerfile b/dsf-docker/bpe_proxy/Dockerfile
index 3a2c06070..557f326f8 100644
--- a/dsf-docker/bpe_proxy/Dockerfile
+++ b/dsf-docker/bpe_proxy/Dockerfile
@@ -14,7 +14,7 @@
# limitations under the License.
#
-FROM httpd:2.4-alpine@sha256:8f26f33a7002658050e9ab2cd6b77502619dfc89d0a6ba2e9e4a202e0ef04596
+FROM docker.io/library/httpd:2.4-alpine@sha256:1b766f17b84026429b7cb243317b142921b24432336e798bc881c43f45ed9567
LABEL org.opencontainers.image.source=https://github.com/datasharingframework/dsf
LABEL org.opencontainers.image.description="DSF BPE Reverse Proxy"
LABEL org.opencontainers.image.licenses="Apache License, Version 2.0"
diff --git a/dsf-docker/fhir_proxy/Dockerfile b/dsf-docker/fhir_proxy/Dockerfile
index 168144f25..750e9f816 100755
--- a/dsf-docker/fhir_proxy/Dockerfile
+++ b/dsf-docker/fhir_proxy/Dockerfile
@@ -14,7 +14,7 @@
# limitations under the License.
#
-FROM httpd:2.4-alpine@sha256:8f26f33a7002658050e9ab2cd6b77502619dfc89d0a6ba2e9e4a202e0ef04596
+FROM docker.io/library/httpd:2.4-alpine@sha256:1b766f17b84026429b7cb243317b142921b24432336e798bc881c43f45ed9567
LABEL org.opencontainers.image.source=https://github.com/datasharingframework/dsf
LABEL org.opencontainers.image.description="DSF FHIR Reverse Proxy"
LABEL org.opencontainers.image.licenses="Apache License, Version 2.0"
diff --git a/dsf-fhir/dsf-fhir-rest-adapter/pom.xml b/dsf-fhir/dsf-fhir-rest-adapter/pom.xml
index 70f5bb7f9..6f2a8869d 100755
--- a/dsf-fhir/dsf-fhir-rest-adapter/pom.xml
+++ b/dsf-fhir/dsf-fhir-rest-adapter/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-fhir-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-fhir/dsf-fhir-server-jetty/docker/Dockerfile b/dsf-fhir/dsf-fhir-server-jetty/docker/Dockerfile
index 22d148838..576b73e4d 100755
--- a/dsf-fhir/dsf-fhir-server-jetty/docker/Dockerfile
+++ b/dsf-fhir/dsf-fhir-server-jetty/docker/Dockerfile
@@ -14,7 +14,7 @@
# limitations under the License.
#
-FROM debian:trixie-slim@sha256:4ffb3a1511099754cddc70eb1b12e50ffdb67619aa0ab6c13fcd800a78ef7c7a AS builder
+FROM docker.io/library/debian:trixie-slim@sha256:020c0d20b9880058cbe785a9db107156c3c75c2ac944a6aa7ab59f2add76a7bd AS builder
WORKDIR /opt/fhir
COPY --chown=root:2101 ./ ./
RUN chown root:2101 ./ && \
@@ -23,7 +23,7 @@ RUN chown root:2101 ./ && \
chmod 1775 ./log
-FROM azul/zulu-openjdk:25-jre-headless@sha256:9a30f9ac9b51aba2f0ee76daf6440c03d59a7690b4fd6070e85fba1da9fd32ff
+FROM docker.io/azul/zulu-openjdk:25-jre-headless@sha256:44df5eb4a2055e85fff47cb5c6bd4edca4045210a1b05beecd8114822e2f2cdd
LABEL org.opencontainers.image.source=https://github.com/datasharingframework/dsf
LABEL org.opencontainers.image.description="DSF FHIR Server"
LABEL org.opencontainers.image.licenses="Apache License, Version 2.0"
diff --git a/dsf-fhir/dsf-fhir-server-jetty/pom.xml b/dsf-fhir/dsf-fhir-server-jetty/pom.xml
index fb873c6bd..ac31c551b 100755
--- a/dsf-fhir/dsf-fhir-server-jetty/pom.xml
+++ b/dsf-fhir/dsf-fhir-server-jetty/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-fhir-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-fhir/dsf-fhir-server/pom.xml b/dsf-fhir/dsf-fhir-server/pom.xml
index d269e7be3..5ab54be76 100755
--- a/dsf-fhir/dsf-fhir-server/pom.xml
+++ b/dsf-fhir/dsf-fhir-server/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-fhir-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-fhir/dsf-fhir-server/src/main/resources/fhir/static/form.js b/dsf-fhir/dsf-fhir-server/src/main/resources/fhir/static/form.js
index 0d96348e3..a598a329d 100644
--- a/dsf-fhir/dsf-fhir-server/src/main/resources/fhir/static/form.js
+++ b/dsf-fhir/dsf-fhir-server/src/main/resources/fhir/static/form.js
@@ -1108,12 +1108,10 @@ function handlePendingTask() {
const count = baseIdCount.get(baseId) || 0
baseIdCount.set(baseId, count + 1)
- const suffix = count === 0 ? "" : `|${count}`
-
if (count > 0)
- appendInputRowAfter(baseId)
+ appendInputRowAfter(`${baseId}|${count - 1}`)
- const fullId = (id) => id + suffix
+ const fullId = (suffix) => `${baseId}|${count}${suffix != null ? `-${suffix}` : ""}`
const primitiveValue =
values.boolean ?? values.string ?? values.integer ??
@@ -1121,7 +1119,7 @@ function handlePendingTask() {
values.dateTime ?? values.instant ?? values.uri
if (primitiveValue != null) {
- const id = fullId(baseId + (values.boolean !== undefined ? `-${values.boolean}` : ""))
+ const id = fullId(values.boolean)
const input = getInputById(id)
@@ -1138,14 +1136,14 @@ function handlePendingTask() {
const { reference, identifier } = values.reference
if (reference) {
- const input = getInputById(fullId(baseId))
+ const input = getInputById(fullId())
if (input) input.value = reference
} else if (identifier) {
const { system, value } = identifier
- const inputSystem = getInputById(fullId(baseId + "-system"))
- const inputValue = getInputById(fullId(baseId + "-value"))
+ const inputSystem = getInputById(fullId("system"))
+ const inputValue = getInputById(fullId("value"))
if (inputSystem) inputSystem.value = system
if (inputValue) inputValue.value = value
@@ -1153,16 +1151,16 @@ function handlePendingTask() {
} else if (values.identifier) {
const { system, value } = values.identifier
- const inputSystem = getInputById(fullId(baseId + "-system"))
- const inputValue = getInputById(fullId(baseId + "-value"))
+ const inputSystem = getInputById(fullId("system"))
+ const inputValue = getInputById(fullId("value"))
if (inputSystem) inputSystem.value = system
if (inputValue) inputValue.value = value
} else if (values.coding) {
const { system, code } = values.coding
- const inputSystem = getInputById(fullId(baseId + "-system"))
- const inputCode = getInputById(fullId(baseId + "-code"))
+ const inputSystem = getInputById(fullId("system"))
+ const inputCode = getInputById(fullId("code"))
if (inputSystem) inputSystem.value = system
if (inputCode) inputCode.value = code
@@ -1173,7 +1171,7 @@ function handlePendingTask() {
Object.entries(fields).forEach(([key, val]) => {
if (val == null) return
- const input = getInputById(fullId(`${baseId}-${key}`))
+ const input = getInputById(fullId(key))
if (input) input.value = val
})
}
diff --git a/dsf-fhir/dsf-fhir-validation/pom.xml b/dsf-fhir/dsf-fhir-validation/pom.xml
index 5abbd43de..f6d6bca09 100644
--- a/dsf-fhir/dsf-fhir-validation/pom.xml
+++ b/dsf-fhir/dsf-fhir-validation/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-fhir-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-fhir/dsf-fhir-webservice-client/pom.xml b/dsf-fhir/dsf-fhir-webservice-client/pom.xml
index 89031ffa8..0a3dc99eb 100755
--- a/dsf-fhir/dsf-fhir-webservice-client/pom.xml
+++ b/dsf-fhir/dsf-fhir-webservice-client/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-fhir-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-fhir/dsf-fhir-websocket-client/pom.xml b/dsf-fhir/dsf-fhir-websocket-client/pom.xml
index 71d83c108..f3ab0962d 100755
--- a/dsf-fhir/dsf-fhir-websocket-client/pom.xml
+++ b/dsf-fhir/dsf-fhir-websocket-client/pom.xml
@@ -23,7 +23,7 @@
dev.dsf
dsf-fhir-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-fhir/pom.xml b/dsf-fhir/pom.xml
index 648ff250a..29fc49467 100755
--- a/dsf-fhir/pom.xml
+++ b/dsf-fhir/pom.xml
@@ -24,7 +24,7 @@
dev.dsf
dsf-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-maven/dsf-maven-plugin/pom.xml b/dsf-maven/dsf-maven-plugin/pom.xml
index f8b6a5da5..fa6486a2f 100644
--- a/dsf-maven/dsf-maven-plugin/pom.xml
+++ b/dsf-maven/dsf-maven-plugin/pom.xml
@@ -26,7 +26,7 @@
dev.dsf
dsf-maven-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/dsf-maven/pom.xml b/dsf-maven/pom.xml
index d25a615d1..79adadeee 100644
--- a/dsf-maven/pom.xml
+++ b/dsf-maven/pom.xml
@@ -26,7 +26,7 @@
dev.dsf
dsf-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
diff --git a/pom.xml b/pom.xml
index 60d592342..f98d59295 100755
--- a/pom.xml
+++ b/pom.xml
@@ -20,7 +20,7 @@
dev.dsf
dsf-pom
- 2.1.0
+ 2.1.1-SNAPSHOT
pom
@@ -39,18 +39,18 @@
${project.basedir}
2.0.17
- 2.25.4
- 12.1.8
+ 2.25.5
+ 12.1.10
3.1.11
2.2.2
- 6.2.17
- 2.21.2
+ 6.2.19
+ 2.21.5
1.1.1
5.1.0
8.4.2
6.5.27
8.4.2
- 1.83
+ 1.84
3.8.0
5.2.1
5.2.1
@@ -183,7 +183,7 @@
org.postgresql
postgresql
- 42.7.10
+ 42.7.13
org.checkerframework
@@ -453,7 +453,7 @@
org.thymeleaf
thymeleaf
- 3.1.3.RELEASE
+ 3.1.5.RELEASE
com.nimbusds
@@ -542,7 +542,7 @@
org.apache.maven.plugins
maven-jar-plugin
- 3.5.0
+ 3.5.1
@@ -569,12 +569,12 @@
org.apache.maven.plugins
maven-surefire-plugin
- 3.5.5
+ 3.5.6
org.apache.maven.plugins
maven-failsafe-plugin
- 3.5.5
+ 3.5.6
org.apache.maven.plugins
@@ -604,7 +604,7 @@
org.apache.maven.plugins
maven-dependency-plugin
- 3.10.0
+ 3.11.0
org.codehaus.mojo
@@ -619,17 +619,17 @@
org.apache.maven.plugins
maven-enforcer-plugin
- 3.6.2
+ 3.6.3
org.apache.maven.plugins
maven-site-plugin
- 3.21.0
+ 3.22.0
com.github.spotbugs
spotbugs-maven-plugin
- 4.9.8.3
+ 4.10.3.0
org.apache.maven.plugins
@@ -644,7 +644,7 @@
org.sonatype.central
central-publishing-maven-plugin
- 0.10.0
+ 0.11.0
org.apache.maven.plugins
@@ -654,7 +654,7 @@
com.mycila
license-maven-plugin
- 5.0.0
+ 5.1.1
org.apache.maven.plugins
@@ -1092,6 +1092,7 @@
SCRIPT_STYLE
SCRIPT_STYLE
SCRIPT_STYLE
+ SCRIPT_STYLE