From 1d43a7e20fedd1dcdc606f31ef12c07f3b0eb72a Mon Sep 17 00:00:00 2001 From: liga-oz Date: Mon, 18 Dec 2023 17:30:11 +0100 Subject: [PATCH 1/2] make the generated attributes to be in the same order Signed-off-by: liga-oz --- .../sap/cloud/security/test/JwtGenerator.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/java-security-test/src/main/java/com/sap/cloud/security/test/JwtGenerator.java b/java-security-test/src/main/java/com/sap/cloud/security/test/JwtGenerator.java index 758e67225e..4d5041c9e8 100644 --- a/java-security-test/src/main/java/com/sap/cloud/security/test/JwtGenerator.java +++ b/java-security-test/src/main/java/com/sap/cloud/security/test/JwtGenerator.java @@ -18,6 +18,7 @@ import javax.annotation.Nonnull; import java.io.IOException; +import java.lang.reflect.Field; import java.nio.charset.StandardCharsets; import java.security.*; import java.time.Instant; @@ -42,8 +43,8 @@ public class JwtGenerator { private static final String DEFAULT_JWKS_URL = "http://localhost/token_keys"; private static final char DOT = '.'; - private final JSONObject jsonHeader = new JSONObject(); - private final JSONObject jsonPayload = new JSONObject(); + private final JSONObject jsonHeader = newPredictableOrderingJSONObject(); + private final JSONObject jsonPayload = newPredictableOrderingJSONObject(); private final SignatureCalculator signatureCalculator; private final Service service; @@ -60,6 +61,23 @@ private JwtGenerator(Service service, SignatureCalculator signatureCalculator) { predefineTokenClaims(); } + /** + * Creates a new JSONObject object with LinkedHashMap with predictable iteration order. + * @return JSONObject + */ + private static JSONObject newPredictableOrderingJSONObject() { + JSONObject jsonObject = new JSONObject(); + try { + Field declaredMapField = jsonObject.getClass().getDeclaredField("map"); + declaredMapField.setAccessible(true); + declaredMapField.set(jsonObject, new LinkedHashMap<>()); + declaredMapField.setAccessible(false); + } catch (IllegalAccessException | NoSuchFieldException e) { + LOGGER.info("Couldn't create a JSONObject with a LinkedHashMap field. {}", e.getMessage()); + } + return jsonObject; + } + /** * This factory method creates an {@link JwtGenerator} instance that can be used * to create tokens for testing purposes. The tokens are prefilled with data so From f39267e060edff3ba24156250bac498ba8e52ce9 Mon Sep 17 00:00:00 2001 From: liga-oz Date: Mon, 18 Dec 2023 17:42:45 +0100 Subject: [PATCH 2/2] adapt test Signed-off-by: liga-oz --- .../com/sap/cloud/security/comp/XsuaaTokenCompTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-security-compatibility/src/test/java/com/sap/cloud/security/comp/XsuaaTokenCompTest.java b/spring-security-compatibility/src/test/java/com/sap/cloud/security/comp/XsuaaTokenCompTest.java index 39b5fe218f..061971c69c 100644 --- a/spring-security-compatibility/src/test/java/com/sap/cloud/security/comp/XsuaaTokenCompTest.java +++ b/spring-security-compatibility/src/test/java/com/sap/cloud/security/comp/XsuaaTokenCompTest.java @@ -1,6 +1,6 @@ /** - * SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Cloud Security Client Java contributors - * + * SPDX-FileCopyrightText: 2022 SAP SE or an SAP affiliate company and Cloud Security Client Java contributors* + *

* SPDX-License-Identifier: Apache-2.0 */ package com.sap.cloud.security.comp; @@ -227,7 +227,7 @@ void getSubdomainFails() { @Test void getAppToken() { token = XsuaaTokenComp.createInstance(jwtGenerator.createToken()); - assertThat(token.getAppToken(), startsWith("eyJqa3UiOiJodHRwOi8vbG9jYWx")); + assertThat(token.getAppToken(), startsWith("eyJraWQiOiJkZWZhdWx0LWtpZCIs")); } @Test