diff --git a/src/main/java/org/jgroups/protocols/kubernetes/Utils.java b/src/main/java/org/jgroups/protocols/kubernetes/Utils.java index 378f04d..c426f45 100644 --- a/src/main/java/org/jgroups/protocols/kubernetes/Utils.java +++ b/src/main/java/org/jgroups/protocols/kubernetes/Utils.java @@ -11,6 +11,7 @@ import java.nio.file.Path; import java.security.AccessController; import java.security.PrivilegedAction; +import java.util.HashMap; import java.util.Map; import java.util.concurrent.Callable; import java.util.logging.Level; @@ -155,5 +156,23 @@ public static void close(AutoCloseable cl) { } } + /** + * Sanitizes a map of HTTP headers - all entries where the key equals "Authorization" (case-insensitive) are + * overridden to mask the original authorization data. + * + * @param headers HTTP header map + * @return map where all "Authorization" entries are masked + */ + public static Map sanitizeHttpHeaders(Map headers) { + HashMap newHeaders = new HashMap<>(headers); + // Iterate over all keys to find all case combinations + newHeaders.keySet().forEach(key -> { + if (key != null && key.equalsIgnoreCase("Authorization")) { + newHeaders.put(key, "***"); + } + }); + return newHeaders; + } + private Utils() {} } diff --git a/src/main/java/org/jgroups/protocols/kubernetes/stream/BaseStreamProvider.java b/src/main/java/org/jgroups/protocols/kubernetes/stream/BaseStreamProvider.java index dc3b045..9f1bc7f 100644 --- a/src/main/java/org/jgroups/protocols/kubernetes/stream/BaseStreamProvider.java +++ b/src/main/java/org/jgroups/protocols/kubernetes/stream/BaseStreamProvider.java @@ -1,5 +1,7 @@ package org.jgroups.protocols.kubernetes.stream; +import org.jgroups.protocols.kubernetes.Utils; + import java.io.IOException; import java.net.URL; import java.net.URLConnection; @@ -12,7 +14,8 @@ public abstract class BaseStreamProvider implements StreamProvider { public URLConnection openConnection(String url, Map headers, int connectTimeout, int readTimeout) throws IOException { if (log.isLoggable(Level.FINE)) { - log.log(Level.FINE, String.format("%s opening connection: url [%s], headers [%s], connectTimeout [%s], readTimeout [%s]", getClass().getSimpleName(), url, headers, connectTimeout, readTimeout)); + log.log(Level.FINE, String.format("%s opening connection: url [%s], headers [%s], connectTimeout [%s], readTimeout [%s]", + getClass().getSimpleName(), url, Utils.sanitizeHttpHeaders(headers), connectTimeout, readTimeout)); } URLConnection connection = new URL(url).openConnection(); if (headers != null) { diff --git a/src/test/java/org/jgroups/protocols/kubernetes/UtilsTest.java b/src/test/java/org/jgroups/protocols/kubernetes/UtilsTest.java new file mode 100644 index 0000000..5a39b1a --- /dev/null +++ b/src/test/java/org/jgroups/protocols/kubernetes/UtilsTest.java @@ -0,0 +1,21 @@ +package org.jgroups.protocols.kubernetes; + +import org.assertj.core.api.Assertions; +import org.junit.Test; + +import java.util.Map; + +public class UtilsTest { + + @Test + public void testSanitizeHttpHeaders() { + Map sanitized = Utils.sanitizeHttpHeaders(Map.of( + "Host", "jgroups.org", + "Authorization", "Basic abcd", + "authorization", "Bearer abcd" + )); + Assertions.assertThat(sanitized.get("Host")).isEqualTo("jgroups.org"); + Assertions.assertThat(sanitized.get("Authorization")).isEqualTo("***"); + Assertions.assertThat(sanitized.get("authorization")).isEqualTo("***"); + } +}