This is an automated email from the ASF dual-hosted git repository.

jungm pushed a commit to branch tomee-10.x
in repository https://gitbox.apache.org/repos/asf/tomee.git


The following commit(s) were added to refs/heads/tomee-10.x by this push:
     new f1dd6ad2cf TOMEE-4604 - strip ssl keystore configuration params from 
outgoing URL. (#2658)
f1dd6ad2cf is described below

commit f1dd6ad2cf8505725a8eda35d88cf523f7b00edb
Author: Krzysztof Śmigrodzki <[email protected]>
AuthorDate: Thu May 7 17:18:26 2026 +0200

    TOMEE-4604 - strip ssl keystore configuration params from outgoing URL. 
(#2658)
    
    * Refactor HttpConnectionTest
    
    * TOMEE-4604 strip ssl keystore configuration params from outgoing URL.
    
    * Formatting
    
    * Comment explaining split pattern with both & and ? on query stripping
    
    * Account for edge case where query parameter has no name.
    
    (cherry picked from commit 9b442f6165be6d8d3aacc93dd4c46bbeab72cebc)
---
 .../openejb/client/HttpConnectionFactory.java      |  51 ++++----
 .../apache/openejb/client/HttpConnectionTest.java  | 137 +++++++--------------
 2 files changed, 73 insertions(+), 115 deletions(-)

diff --git 
a/server/openejb-client/src/main/java/org/apache/openejb/client/HttpConnectionFactory.java
 
b/server/openejb-client/src/main/java/org/apache/openejb/client/HttpConnectionFactory.java
index 1d8d02fefa..7aa1356a91 100644
--- 
a/server/openejb-client/src/main/java/org/apache/openejb/client/HttpConnectionFactory.java
+++ 
b/server/openejb-client/src/main/java/org/apache/openejb/client/HttpConnectionFactory.java
@@ -29,6 +29,7 @@ import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.security.KeyManagementException;
 import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
 import java.util.Map;
 import java.util.Queue;
 import java.util.concurrent.ConcurrentHashMap;
@@ -59,6 +60,13 @@ public class HttpConnectionFactory implements 
ConnectionFactory {
     }
 
     public static class HttpConnection implements Connection {
+        private static final String[] PARAMS_TO_STRIP = new String[]{
+                // must be sorted alphabetically
+                "authorization", "authorizationHeader", "basic.password", 
"basic.username",
+                "connectTimeout", "readTimeout",
+                "sslKeyStore", "sslKeyStorePassword", "sslKeyStoreType",
+                "sslTrustStore", "sslTrustStorePassword", "sslTrustStoreType"
+        };
         private final byte[] buffer;
         private HttpURLConnection httpURLConnection;
         private InputStream inputStream;
@@ -89,15 +97,8 @@ public class HttpConnectionFactory implements 
ConnectionFactory {
                 authorization = "Basic " + printBase64Binary((basicUsername + 
(basicPassword != null ? ":" + basicPassword : 
"")).getBytes(StandardCharsets.UTF_8));
             }
 
-            final String newUrl =
-                    stripQuery(
-                        stripQuery(
-                            stripQuery(
-                                stripQuery(url.toExternalForm(), 
"authorization"),
-                        "basic.username"),
-                            "basic.password"),
-                "authorizationHeader");
-            httpURLConnection = (HttpURLConnection) (authorization == null ? 
url : new URL(newUrl)).openConnection();
+            final String newUrl = stripQuery(url.toExternalForm(), 
PARAMS_TO_STRIP);
+            httpURLConnection = (HttpURLConnection) new 
URL(newUrl).openConnection();
             httpURLConnection.setDoOutput(true);
 
             final int timeout;
@@ -140,20 +141,26 @@ public class HttpConnectionFactory implements 
ConnectionFactory {
             }
         }
 
-        private String stripQuery(final String url, final String param) {
-            String result = url;
-            do {
-                final int h = result.indexOf(param + '=');
-                int end = result.indexOf('&', h);
-                if (end < 0) {
-                    end = result.length();
-                }
-                if (h <= 0) {
-                    return result.endsWith("?") ? result.substring(0, 
result.length() - 1) : result;
+        private String stripQuery(final String url, final String[] params) {
+            final int queryStartIndex = url.indexOf('?');
+            if (queryStartIndex < 0) {
+                return url;
+            }
+            if (queryStartIndex + 1 == url.length()) {
+                return url.substring(0, queryStartIndex);
+            }
+
+            final StringBuilder sb = new StringBuilder();
+            // split on [&?] to account for failover URLs with multiple http 
URLs embedded
+            for (String param : 
url.substring(queryStartIndex+1).split("[&?]")) {
+                final int p = param.indexOf('=');
+                if ((p < 0 && Arrays.binarySearch(params, param) < 0)
+                        || (p >= 0 && Arrays.binarySearch(params, 
param.substring(0, p)) < 0)) {
+                    if (!sb.isEmpty()) { sb.append('&'); }
+                    sb.append(param);
                 }
-                result = result.substring(0, h) +
-                        (end < 0 || end == result.length() ? "" : 
result.substring(end + 1, result.length()));
-            } while (true);
+            }
+            return url.substring(0, queryStartIndex) + (sb.isEmpty() ? "" : 
"?" + sb);
         }
 
         @Override
diff --git 
a/server/openejb-client/src/test/java/org/apache/openejb/client/HttpConnectionTest.java
 
b/server/openejb-client/src/test/java/org/apache/openejb/client/HttpConnectionTest.java
index 974280958f..9a7233c3f4 100644
--- 
a/server/openejb-client/src/test/java/org/apache/openejb/client/HttpConnectionTest.java
+++ 
b/server/openejb-client/src/test/java/org/apache/openejb/client/HttpConnectionTest.java
@@ -47,18 +47,28 @@ public class HttpConnectionTest {
                 exchange.sendResponseHeaders(200, 0);
 
                 final OutputStream responseBody = exchange.getResponseBody();
-                responseBody.write("secure page".getBytes());
+                responseBody.write("secure page|".getBytes());
                 final String query = exchange.getRequestURI().getQuery();
                 if (query != null) {
+                    responseBody.write("QUERY:".getBytes());
                     responseBody.write(query.getBytes());
+                } else {
+                    responseBody.write("NO_QUERY:".getBytes());
                 }
+                responseBody.write("|".getBytes());
                 final String authorization = 
exchange.getRequestHeaders().getFirst("Authorization");
                 if (authorization != null) {
+                    responseBody.write("AUTH:".getBytes("UTF-8"));
                     responseBody.write(authorization.getBytes("UTF-8"));
+                } else {
+                    responseBody.write("NO_AUTH:".getBytes("UTF-8"));
                 }
+                responseBody.write("|".getBytes());
                 final String authorization2 = 
exchange.getRequestHeaders().getFirst("AltAuthorization");
                 if (authorization2 != null) {
-                    responseBody.write(("alt" + 
authorization2).getBytes("UTF-8"));
+                    responseBody.write(("ALT_AUTH:" + 
authorization2).getBytes("UTF-8"));
+                } else {
+                    responseBody.write("NO_ALT_AUTH:".getBytes("UTF-8"));
                 }
                 responseBody.close();
             }
@@ -77,29 +87,9 @@ public class HttpConnectionTest {
         final String url = "http://localhost:"; + server.getAddress().getPort() 
+ "/e";
         for (int i = 0; i < 3; i++) {
             final Connection connection = factory.getConnection(new URI(url));
+            final String out = drainConnectionToString(connection);
 
-            BufferedReader br = null;
-            final StringBuilder sb = new StringBuilder();
-            String line;
-            try {
-                br = new BufferedReader(new 
InputStreamReader(connection.getInputStream()));
-                while ((line = br.readLine()) != null) {
-                    sb.append(line);
-                }
-            } catch (final IOException e) {
-                e.printStackTrace();
-            } finally {
-                if (br != null) {
-                    try {
-                        br.close();
-                    } catch (IOException e) {
-                        e.printStackTrace();
-                    }
-                }
-                connection.close();
-            }
-
-            Assert.assertTrue("should contain", 
sb.toString().contains("secure"));
+            Assert.assertEquals("secure page|NO_QUERY:|NO_AUTH:|NO_ALT_AUTH:", 
out);
         }
     }
 
@@ -109,29 +99,9 @@ public class HttpConnectionTest {
         final String url = "http://localhost:"; + server.getAddress().getPort() 
+ "/e?authorization=Basic%20token";
         for (int i = 0; i < 3; i++) {
             final Connection connection = factory.getConnection(new URI(url));
+            String out = drainConnectionToString(connection);
 
-            BufferedReader br = null;
-            final StringBuilder sb = new StringBuilder();
-            String line;
-            try {
-                br = new BufferedReader(new 
InputStreamReader(connection.getInputStream()));
-                while ((line = br.readLine()) != null) {
-                    sb.append(line);
-                }
-            } catch (final IOException e) {
-                e.printStackTrace();
-            } finally {
-                if (br != null) {
-                    try {
-                        br.close();
-                    } catch (IOException e) {
-                        e.printStackTrace();
-                    }
-                }
-                connection.close();
-            }
-
-            Assert.assertTrue("should contain", sb.toString().contains("secure 
pageBasic token"));
+            Assert.assertEquals("secure page|NO_QUERY:|AUTH:Basic 
token|NO_ALT_AUTH:", out);
         }
     }
 
@@ -141,29 +111,9 @@ public class HttpConnectionTest {
         final String url = "http://localhost:"; + server.getAddress().getPort() 
+ 
"/e?basic.password=pwd&basic.username=test&authorizationHeader=AltAuthorization";
         for (int i = 0; i < 3; i++) {
             final Connection connection = factory.getConnection(new URI(url));
+            String out = drainConnectionToString(connection);
 
-            BufferedReader br = null;
-            final StringBuilder sb = new StringBuilder();
-            String line;
-            try {
-                br = new BufferedReader(new 
InputStreamReader(connection.getInputStream()));
-                while ((line = br.readLine()) != null) {
-                    sb.append(line);
-                }
-            } catch (final IOException e) {
-                e.printStackTrace();
-            } finally {
-                if (br != null) {
-                    try {
-                        br.close();
-                    } catch (final IOException e) {
-                        e.printStackTrace();
-                    }
-                }
-                connection.close();
-            }
-
-            Assert.assertTrue("should contain", sb.toString().contains("secure 
pagealtBasic dGVzdDpwd2Q="));
+            Assert.assertEquals("secure page|NO_QUERY:|NO_AUTH:|ALT_AUTH:Basic 
dGVzdDpwd2Q=", out);
         }
     }
 
@@ -173,29 +123,8 @@ public class HttpConnectionTest {
         final String url = "http://localhost:"; + server.getAddress().getPort() 
+ 
"/e?basic.password=pwd&basic.username=te%26st&authorizationHeader=AltAuthorization";
         for (int i = 0; i < 3; i++) {
             final Connection connection = factory.getConnection(new URI(url));
-
-            BufferedReader br = null;
-            final StringBuilder sb = new StringBuilder();
-            String line;
-            try {
-                br = new BufferedReader(new 
InputStreamReader(connection.getInputStream()));
-                while ((line = br.readLine()) != null) {
-                    sb.append(line);
-                }
-            } catch (final IOException e) {
-                e.printStackTrace();
-            } finally {
-                if (br != null) {
-                    try {
-                        br.close();
-                    } catch (final IOException e) {
-                        e.printStackTrace();
-                    }
-                }
-                connection.close();
-            }
-
-            Assert.assertTrue("should contain", sb.toString().contains("secure 
pagealtBasic dGUmc3Q6cHdk"));
+            String out = drainConnectionToString(connection);
+            Assert.assertEquals("secure page|NO_QUERY:|NO_AUTH:|ALT_AUTH:Basic 
dGUmc3Q6cHdk", out);
         }
     }
 
@@ -204,6 +133,29 @@ public class HttpConnectionTest {
         final String baseHttp = "http://localhost:"; + 
server.getAddress().getPort() + "/e?authorization=";
         final String uri = "failover:sticky+random:" + baseHttp + 
"Basic%20ABCD&" + baseHttp + "Basic%20EFG";
         final Connection connection = ConnectionManager.getConnection(new 
URI(uri));
+        final String out = drainConnectionToString(connection);
+        Assert.assertEquals("secure page|QUERY:http://localhost:"; + 
server.getAddress().getPort() + "/e|AUTH:Basic ABCD|NO_ALT_AUTH:", out);
+    }
+
+    @Test
+    public void httpBasicStripsSpecifiedQueryParamsOnly() throws 
URISyntaxException, IOException {
+        final HttpConnectionFactory factory = new HttpConnectionFactory();
+        final String url = "http://localhost:"; + server.getAddress().getPort() 
+ "/e?authorization=Basic%20token&foo=bar&int=1";
+        final Connection connection = factory.getConnection(new URI(url));
+        final String out = drainConnectionToString(connection);
+        Assert.assertEquals("secure page|QUERY:foo=bar&int=1|AUTH:Basic 
token|NO_ALT_AUTH:", out);
+    }
+
+    @Test
+    public void httpStripsSSLQueryParams() throws URISyntaxException, 
IOException {
+        final HttpConnectionFactory factory = new HttpConnectionFactory();
+        final String url = "http://localhost:"; + server.getAddress().getPort() 
+ 
"/e?sslKeyStorePassword=changeit&foo=bar&int=1&sslTrustStorePassword=changeit";
+        final Connection connection = factory.getConnection(new URI(url));
+        final String out = drainConnectionToString(connection);
+        Assert.assertEquals("secure 
page|QUERY:foo=bar&int=1|NO_AUTH:|NO_ALT_AUTH:", out);
+    }
+
+    private static String drainConnectionToString(Connection connection) 
throws IOException {
         BufferedReader br = null;
         final StringBuilder sb = new StringBuilder();
         String line;
@@ -224,7 +176,6 @@ public class HttpConnectionTest {
             }
             connection.close();
         }
-        final String out = sb.toString();
-        Assert.assertTrue(out, out.contains("secure pagehttp://localhost:"; + 
server.getAddress().getPort() + "/eBasic ABCD"));
+        return sb.toString();
     }
 }

Reply via email to