From 77d0a0070cc07726958e437f1977d871eabe49f4 Mon Sep 17 00:00:00 2001 From: "zxBCN Valeriu_Tuguran,Constantin (IT EDP) EXTERNAL" Date: Wed, 13 May 2026 17:40:38 +0200 Subject: [PATCH 1/3] Fix special chars by base64 encoding. --- .../core/security/util/Base64Operations.java | 38 +++++++++++++++++++ .../client/MarketplaceApiClient.java | 3 +- 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 core-security/src/main/java/org/opendevstack/apiservice/core/security/util/Base64Operations.java diff --git a/core-security/src/main/java/org/opendevstack/apiservice/core/security/util/Base64Operations.java b/core-security/src/main/java/org/opendevstack/apiservice/core/security/util/Base64Operations.java new file mode 100644 index 0000000..8a4f0a3 --- /dev/null +++ b/core-security/src/main/java/org/opendevstack/apiservice/core/security/util/Base64Operations.java @@ -0,0 +1,38 @@ +package org.opendevstack.apiservice.core.security.util; + +import java.util.Base64; + +public class Base64Operations { + + /** + * Encodes a string value using Base64 encoding. + * + * @param value the string value to encode + * @return the Base64 encoded string, or null if input is null + */ + public static String encode(String value) { + if (value == null) { + return null; + } + return Base64.getEncoder().encodeToString(value.getBytes()); + } + + /** + * Decodes a Base64 encoded string value. + * + * @param encodedValue the Base64 encoded string to decode + * @return the decoded string, or null if input is null + * @throws IllegalArgumentException if the input is not valid Base64 + */ + public static String decode(String encodedValue) { + if (encodedValue == null) { + return null; + } + try { + byte[] decodedBytes = Base64.getDecoder().decode(encodedValue); + return new String(decodedBytes); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("Invalid Base64 encoded value: " + encodedValue, e); + } + } +} diff --git a/external-service-marketplace/src/main/java/org/opendevstack/apiservice/externalservice/marketplace/client/MarketplaceApiClient.java b/external-service-marketplace/src/main/java/org/opendevstack/apiservice/externalservice/marketplace/client/MarketplaceApiClient.java index 6205674..53d2f04 100644 --- a/external-service-marketplace/src/main/java/org/opendevstack/apiservice/externalservice/marketplace/client/MarketplaceApiClient.java +++ b/external-service-marketplace/src/main/java/org/opendevstack/apiservice/externalservice/marketplace/client/MarketplaceApiClient.java @@ -4,6 +4,7 @@ import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.openapitools.jackson.nullable.JsonNullableModule; +import org.opendevstack.apiservice.core.security.util.Base64Operations; import org.opendevstack.apiservice.externalservice.marketplace.config.MarketplaceInstanceConfig; import org.opendevstack.apiservice.externalservice.marketplace.openapi.ApiClient; import org.opendevstack.apiservice.externalservice.marketplace.openapi.auth.HttpBearerAuth; @@ -39,7 +40,7 @@ public MarketplaceApiClient(String instanceName, MarketplaceInstanceConfig confi if (config.getUsername() != null && config.getPassword() != null) { this.apiClient.setUsername(config.getUsername()); - this.apiClient.setPassword(config.getPassword()); + this.apiClient.setPassword(Base64Operations.decode(config.getPassword())); log.info("MarketplaceApiClient for instance '{}' uses basic authentication", instanceName); } From 6d50e73c644a82925be86ff1f860f3192572ebea Mon Sep 17 00:00:00 2001 From: "zxBCN Valeriu_Tuguran,Constantin (IT EDP) EXTERNAL" Date: Thu, 14 May 2026 08:58:17 +0200 Subject: [PATCH 2/3] Add private constructor. --- .../apiservice/core/security/util/Base64Operations.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core-security/src/main/java/org/opendevstack/apiservice/core/security/util/Base64Operations.java b/core-security/src/main/java/org/opendevstack/apiservice/core/security/util/Base64Operations.java index 8a4f0a3..41e4a62 100644 --- a/core-security/src/main/java/org/opendevstack/apiservice/core/security/util/Base64Operations.java +++ b/core-security/src/main/java/org/opendevstack/apiservice/core/security/util/Base64Operations.java @@ -4,6 +4,8 @@ public class Base64Operations { + private Base64Operations() {} + /** * Encodes a string value using Base64 encoding. * From 63ef016517a10c2844a042f1f498d473213d4b46 Mon Sep 17 00:00:00 2001 From: "zxBCN Valeriu_Tuguran,Constantin (IT EDP) EXTERNAL" Date: Thu, 14 May 2026 09:19:25 +0200 Subject: [PATCH 3/3] Add tests. --- .../security/util/Base64OperationsTest.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 core-security/src/test/java/org/opendevstack/apiservice/core/security/util/Base64OperationsTest.java diff --git a/core-security/src/test/java/org/opendevstack/apiservice/core/security/util/Base64OperationsTest.java b/core-security/src/test/java/org/opendevstack/apiservice/core/security/util/Base64OperationsTest.java new file mode 100644 index 0000000..5b08a04 --- /dev/null +++ b/core-security/src/test/java/org/opendevstack/apiservice/core/security/util/Base64OperationsTest.java @@ -0,0 +1,51 @@ +package org.opendevstack.apiservice.core.security.util; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class Base64OperationsTest { + + @Test + void tectEncodeWhenNullInputReturnNull() { + String testString = null; + + String encodedString = Base64Operations.encode(testString); + + assertEquals(null, encodedString); + } + + @Test + void tectEncodeWhenCorrectInputReturnEncodedResult() { + String testString = "test;string"; + + String encodedString = Base64Operations.encode(testString); + + assertEquals("dGVzdDtzdHJpbmc=", encodedString); + } + + @Test + void testDecodeWhenNullInputReturnNull() { + String testString = null; + + String dencodedString = Base64Operations.decode(testString); + + assertEquals(null, dencodedString); + } + + @Test + void testDecodeWhenCorrectInputReturnDecodedResult() { + String testString = "dGVzdDtzdHJpbmc="; + + String dencodedString = Base64Operations.decode(testString); + + assertEquals("test;string", dencodedString); + } + + @Test + void testDecodeWhenBadInputThrowException() { + String testString = "NOT AN ENCODED STRING"; + + assertThrows(IllegalArgumentException.class, () -> Base64Operations.decode(testString)); + } +} \ No newline at end of file