From 270ada9a117c7df5276ac04cfd6e2b48f7cb5ee3 Mon Sep 17 00:00:00 2001 From: Giuseppe Villani Date: Wed, 11 Dec 2024 12:54:01 +0100 Subject: [PATCH] Fixex #4256: Obfuscate JDBC Password in query.log (#4261) (#4294) --- extended/src/main/java/apoc/load/Jdbc.java | 45 ++++++++++++++----- .../main/java/apoc/load/util/JdbcUtil.java | 4 ++ .../src/test/java/apoc/load/JdbcTest.java | 45 ++++++++++++++----- .../src/test/java/apoc/load/LoadLdapTest.java | 14 +----- .../test/java/apoc/util/ExtendedTestUtil.java | 12 +++++ 5 files changed, 86 insertions(+), 34 deletions(-) diff --git a/extended/src/main/java/apoc/load/Jdbc.java b/extended/src/main/java/apoc/load/Jdbc.java index 74d444fe71..302874d736 100644 --- a/extended/src/main/java/apoc/load/Jdbc.java +++ b/extended/src/main/java/apoc/load/Jdbc.java @@ -14,16 +14,31 @@ import java.math.BigDecimal; import java.math.BigInteger; -import java.sql.*; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Types; import java.time.LocalDateTime; import java.time.OffsetDateTime; import java.time.OffsetTime; import java.time.ZoneId; -import java.util.*; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Spliterator; +import java.util.Spliterators; +import java.util.UUID; import java.util.stream.Stream; import java.util.stream.StreamSupport; -import static apoc.load.util.JdbcUtil.*; +import static apoc.load.util.JdbcUtil.getConnection; +import static apoc.load.util.JdbcUtil.getSqlOrKey; +import static apoc.load.util.JdbcUtil.getUrlOrKey; +import static apoc.load.util.JdbcUtil.obfuscateJdbcUrl; /** * @author mh @@ -96,10 +111,7 @@ private Stream executeQuery(String urlOrKey, String tableOrSelect, Ma throw sqle; } } catch (Exception e) { - log.error(String.format("Cannot execute SQL statement `%s`.%nError:%n%s", query, e.getMessage()),e); - String errorMessage = "Cannot execute SQL statement `%s`.%nError:%n%s"; - if(e.getMessage().contains("No suitable driver")) errorMessage="Cannot execute SQL statement `%s`.%nError:%n%s%n%s"; - throw new RuntimeException(String.format(errorMessage, query, e.getMessage(), "Please download and copy the JDBC driver into $NEO4J_HOME/plugins,more details at https://neo4j-contrib.github.io/neo4j-apoc-procedures/#_load_jdbc_resources"), e); + throw logsErrorAndThrowsException(e, query, log); } } @@ -134,13 +146,24 @@ private Stream executeUpdate(String urlOrKey, String query, Map assertResult(row)); } + @Test + public void testExceptionAndLogWithObfuscatedUrl() { + String url = "jdbc:ajeje://localhost:3306/data_mart?user=root&password=root"; + String errorMsgWithObfuscatedUrl = "No suitable driver found for jdbc:ajeje://*******"; + + // obfuscated exception + assertFails(db, "CALL apoc.load.jdbc($url,'SELECT * FROM PERSON WHERE NAME = ?',['John'])", + Map.of("url", url), + errorMsgWithObfuscatedUrl + ); + + // obfuscated log in `debug.log` + assertTrue(getLogFileContent().contains(errorMsgWithObfuscatedUrl)); + } + @Test public void testLoadJdbcParamsWithConfigLocalDateTime() throws Exception { testCall(db, "CALL apoc.load.jdbc('jdbc:derby:derbyDB','SELECT * FROM PERSON WHERE NAME = ?',['John'])", diff --git a/extended/src/test/java/apoc/load/LoadLdapTest.java b/extended/src/test/java/apoc/load/LoadLdapTest.java index 3a6c3c803f..76d04c7a59 100644 --- a/extended/src/test/java/apoc/load/LoadLdapTest.java +++ b/extended/src/test/java/apoc/load/LoadLdapTest.java @@ -1,7 +1,6 @@ package apoc.load; -import apoc.util.FileUtils; import apoc.util.TestUtil; import com.unboundid.ldap.sdk.LDAPConnection; import com.unboundid.ldap.sdk.SearchResult; @@ -18,13 +17,11 @@ import org.zapodot.junit.ldap.EmbeddedLdapRule; import org.zapodot.junit.ldap.EmbeddedLdapRuleBuilder; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; import java.util.List; import java.util.Map; import static apoc.ApocConfig.apocConfig; +import static apoc.util.ExtendedTestUtil.getLogFileContent; import static apoc.util.TestUtil.testCall; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -96,15 +93,6 @@ public void testLoadLDAPWithApocConfigWithoutDotBeforeLdapKey() { assertTrue(getLogFileContent().contains(logWarn)); } - private static String getLogFileContent() { - try { - File logFile = new File(FileUtils.getLogDirectory(), "debug.log"); - return Files.readString(logFile.toPath()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - private void testWithStringConfigCommon(String key) { // set a config `key=localhost:port dns pwd` String ldapValue = "%s %s %s".formatted( diff --git a/extended/src/test/java/apoc/util/ExtendedTestUtil.java b/extended/src/test/java/apoc/util/ExtendedTestUtil.java index 5335852efc..3c46fd9529 100644 --- a/extended/src/test/java/apoc/util/ExtendedTestUtil.java +++ b/extended/src/test/java/apoc/util/ExtendedTestUtil.java @@ -12,6 +12,9 @@ import org.neo4j.internal.helpers.collection.Iterators; import org.neo4j.test.assertion.Assert; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; import java.util.Collections; import java.util.List; import java.util.Map; @@ -141,4 +144,13 @@ public static void assertFails(GraphDatabaseService db, String query, Map