Skip to content

Commit

Permalink
Adapt to new preparser API
Browse files Browse the repository at this point in the history
  • Loading branch information
loveleif committed Jan 30, 2025
1 parent 1e50f41 commit a3f7809
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 8 deletions.
8 changes: 4 additions & 4 deletions common/src/main/java/apoc/util/LogsUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package apoc.util;

import org.neo4j.configuration.Config;
import org.neo4j.cypher.internal.CypherVersion;
import org.neo4j.cypher.internal.PreParser;
import org.neo4j.cypher.internal.ast.Statement;
import org.neo4j.cypher.internal.ast.prettifier.DefaultExpressionStringifier;
Expand All @@ -33,17 +34,16 @@
import scala.Option;

public class LogsUtil {
public static String sanitizeQuery(Config config, String query) {
public static String sanitizeQuery(Config config, String query, CypherVersion defaultCypherVersion) {
try {
final var exceptionFactory = new OpenCypherExceptionFactory(scala.Option.empty());
final var extension =
ExpressionStringifier.Extension$.MODULE$.simple((ExpressionStringifier$.MODULE$.failingExtender()));
final var stringifier = new DefaultExpressionStringifier(extension, false, false, false, false);
final var prettifier = new Prettifier(stringifier, Prettifier.EmptyExtension$.MODULE$, true);
var notifications = new RecordingNotificationLogger();
final var preParsed = new PreParser(CypherConfiguration.fromConfig(config)).preParse(query, notifications);
final var preParsed = new PreParser(CypherConfiguration.fromConfig(config)).preParse(query, defaultCypherVersion);
final var statement = AstParserFactory$.MODULE$
.apply(preParsed.options().queryOptions().cypherVersion().actualVersion())
.apply(preParsed.cypherVersion())
.apply(preParsed.statement(), exceptionFactory, Option.apply(null))
.singleStatement();
var rewriter = sensitiveLiteralReplacement.apply(statement)._1;
Expand Down
4 changes: 3 additions & 1 deletion core/src/main/java/apoc/cypher/CypherInitializer.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import org.apache.commons.lang3.StringUtils;
import org.neo4j.common.DependencyResolver;
import org.neo4j.configuration.Config;
import org.neo4j.cypher.internal.CypherVersion;
import org.neo4j.dbms.api.DatabaseManagementService;
import org.neo4j.graphdb.Label;
import org.neo4j.graphdb.Node;
Expand Down Expand Up @@ -106,8 +107,9 @@ public void available() {
.resolveDependency(ApocConfig.class)
.getConfig();
for (final var query : collectInitializers(config)) {
final var defaultLanguage = CypherVersion.Default; // TODO Replace with db specific default when available
final var sanitizedQuery =
LogsUtil.sanitizeQuery(dependencyResolver.resolveDependency(Config.class), query);
LogsUtil.sanitizeQuery(dependencyResolver.resolveDependency(Config.class), query, defaultLanguage);
try {
// we need to apply a retry strategy here since in systemdb we potentially conflict
// with
Expand Down
15 changes: 12 additions & 3 deletions core/src/test/java/apoc/util/LogsUtilTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,28 @@

import org.junit.Test;
import org.neo4j.configuration.Config;
import org.neo4j.cypher.internal.CypherVersion;

public class LogsUtilTest {

@Test
public void shouldRedactPasswords() {
String sanitized = LogsUtil.sanitizeQuery(
Config.defaults(), "CREATE USER dummy IF NOT EXISTS SET PASSWORD 'pass12345' CHANGE NOT REQUIRED");
Config.defaults(), "CREATE USER dummy IF NOT EXISTS SET PASSWORD 'pass12345' CHANGE NOT REQUIRED", CypherVersion.Cypher5);
assertEquals(sanitized, "CREATE USER dummy IF NOT EXISTS SET PASSWORD '******' CHANGE NOT REQUIRED");
}

@Test
public void shouldSanitizeCypher25Query() {
String sanitized = LogsUtil.sanitizeQuery(
Config.defaults(), "RETURN CASE $x WHEN IN ['a', 'b'] THEN true ELSE false END AS res", CypherVersion.Cypher25);
assertEquals(sanitized, "CREATE USER dummy IF NOT EXISTS SET PASSWORD '******' CHANGE NOT REQUIRED");
}

@Test
public void shouldReturnInputIfInvalidQuery() {
String invalidQuery = "MATCH USER dummy IF NOT EXISTS SET PASSWORD 'pass12345' CHANGE NOT REQUIRED";
String sanitized = LogsUtil.sanitizeQuery(Config.defaults(), invalidQuery);
String sanitized = LogsUtil.sanitizeQuery(Config.defaults(), invalidQuery, CypherVersion.Cypher5);

assertEquals(sanitized, invalidQuery);
}
Expand All @@ -44,7 +52,8 @@ public void shouldReturnInputIfInvalidQuery() {
public void whitespaceDeprecationSucceedsSanitization() {
String sanitized = LogsUtil.sanitizeQuery(
Config.defaults(),
"CREATE USER dum\u0085my IF NOT EXISTS SET PASSWORD 'pass12345' CHANGE NOT REQUIRED");
"CREATE USER dum\u0085my IF NOT EXISTS SET PASSWORD 'pass12345' CHANGE NOT REQUIRED",
CypherVersion.Cypher5);
assertEquals(sanitized, "CREATE USER `dum\u0085my` IF NOT EXISTS SET PASSWORD '******' CHANGE NOT REQUIRED");
}
}

0 comments on commit a3f7809

Please sign in to comment.