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

radu pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-graphql-core.git


The following commit(s) were added to refs/heads/master by this push:
     new 4aa659a  SLING-12770 - Upgrade graphql-java version to 24.0
4aa659a is described below

commit 4aa659a4de384cb45e4a648a9e11a426bcdc4a1d
Author: Martin Schulze <[email protected]>
AuthorDate: Mon May 19 10:33:31 2025 +0200

    SLING-12770 - Upgrade graphql-java version to 24.0
    
    * added a maxFieldCount config to DefaultQueryExecutor, with a default of 
100_000,
    the default of the graphql-java
    * added a unit test for setting the config
    ---------
    
    Co-authored-by: Martin Schulze <[email protected]>
---
 pom.xml                                                   |  4 ++--
 .../sling/graphql/core/engine/DefaultQueryExecutor.java   |  9 +++++++++
 .../core/engine/DefaultQueryExecutorLoggingTest.java      |  4 ++--
 .../graphql/core/engine/DefaultQueryExecutorTest.java     | 15 +++++++++++++++
 .../sling/graphql/core/engine/MaxQueryTokensTest.java     |  6 +++---
 5 files changed, 31 insertions(+), 7 deletions(-)

diff --git a/pom.xml b/pom.xml
index 04ac8d8..4163230 100644
--- a/pom.xml
+++ b/pom.xml
@@ -127,13 +127,13 @@
     <dependency>
       <groupId>com.graphql-java</groupId>
       <artifactId>graphql-java</artifactId>
-      <version>20.3</version>
+      <version>24.0</version>
       <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>com.graphql-java</groupId>
       <artifactId>java-dataloader</artifactId>
-      <version>3.2.0</version>
+      <version>5.0.0</version>
       <scope>provided</scope>
     </dependency>
     <dependency>
diff --git 
a/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java 
b/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java
index aa5a975..ac16f15 100644
--- 
a/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java
+++ 
b/src/main/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutor.java
@@ -75,6 +75,7 @@ import graphql.language.StringValue;
 import graphql.language.TypeDefinition;
 import graphql.language.TypeName;
 import graphql.language.UnionTypeDefinition;
+import graphql.normalized.ExecutableNormalizedOperationFactory;
 import graphql.schema.DataFetcher;
 import graphql.schema.GraphQLScalarType;
 import graphql.schema.GraphQLSchema;
@@ -157,6 +158,13 @@ public class DefaultQueryExecutor implements QueryExecutor 
{
                         " Change ONLY if you know exactly what you are doing."
         )
         int maxWhitespaceTokens() default 200000;
+
+        @AttributeDefinition(
+                name = "Maximum Field Count",
+                description = "The number of fields queried with an GraphQL 
request. This is a safety measure to avoid denial of service attacks." +
+                        " Change ONLY if you know exactly what you are doing."
+        )
+        int maxFieldCount() default 100000;
     }
 
     private class ExecutionContext {
@@ -203,6 +211,7 @@ public class DefaultQueryExecutor implements QueryExecutor {
 
         resourceToHashMap = new LRUCache<>(schemaCacheSize);
         hashToSchemaMap = new LRUCache<>(schemaCacheSize);
+        
ExecutableNormalizedOperationFactory.Options.setDefaultOptions(ExecutableNormalizedOperationFactory.Options.defaultOptions().maxFieldsCount(config.maxFieldCount()));
     }
 
     @Override
diff --git 
a/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorLoggingTest.java
 
b/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorLoggingTest.java
index a0a74fd..f4ef843 100644
--- 
a/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorLoggingTest.java
+++ 
b/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorLoggingTest.java
@@ -82,9 +82,9 @@ public class DefaultQueryExecutorLoggingTest extends 
ResourceQueryTestBase {
         capture.assertContains(
             Level.ERROR,
             "Query failed for Resource " + resource.getPath(),
-            "query=" + invalidQuery,
+            "query=INVALID",
             "Errors:Error: type=InvalidSyntax",
-            "message=Invalid syntax with ANTLR error 'token recognition error 
at: '4ec'' at line 1 column 9",
+            "message=Invalid syntax with offending token 'INVALID' at line 1 
column 1",
             String.format("selectors=%s", Arrays.toString(selectors))
         );
     }
diff --git 
a/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
 
b/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
index d70179e..0583273 100644
--- 
a/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
+++ 
b/src/test/java/org/apache/sling/graphql/core/engine/DefaultQueryExecutorTest.java
@@ -52,10 +52,12 @@ import org.apache.sling.graphql.core.mocks.TestUtil;
 import org.apache.sling.graphql.core.schema.RankedSchemaProviders;
 import org.apache.sling.testing.mock.osgi.MockOsgi;
 import org.junit.Test;
+import org.mockito.Mockito;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 
+import graphql.normalized.ExecutableNormalizedOperationFactory;
 import graphql.schema.idl.TypeDefinitionRegistry;
 
 import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasJsonPath;
@@ -510,4 +512,17 @@ public class DefaultQueryExecutorTest extends 
ResourceQueryTestBase {
 
     }
 
+    @Test
+    public void testMaxFieldCountConfig() {
+        DefaultQueryExecutor.Config config = 
Mockito.mock(DefaultQueryExecutor.Config.class);
+        Mockito.when(config.maxFieldCount()).thenReturn(1000);
+
+        DefaultQueryExecutor executor = new DefaultQueryExecutor();
+        executor.activate(config);
+
+        int expectedMaxFieldCount = 1000;
+        int actualMaxFieldCount = 
ExecutableNormalizedOperationFactory.Options.defaultOptions().getMaxFieldsCount();
+
+        assertEquals("Max field count should match the configured value", 
expectedMaxFieldCount, actualMaxFieldCount);
+    }
 }
diff --git 
a/src/test/java/org/apache/sling/graphql/core/engine/MaxQueryTokensTest.java 
b/src/test/java/org/apache/sling/graphql/core/engine/MaxQueryTokensTest.java
index 0c10ce0..d81d22c 100644
--- a/src/test/java/org/apache/sling/graphql/core/engine/MaxQueryTokensTest.java
+++ b/src/test/java/org/apache/sling/graphql/core/engine/MaxQueryTokensTest.java
@@ -45,7 +45,7 @@ import static org.hamcrest.Matchers.containsString;
 public class MaxQueryTokensTest extends ResourceQueryTestBase {
   private static final int DEFAULT_MAX_QUERY_TOKENS = 15000;
   private static final String INVALID = "invalid ";
-  private static final String WHITESPACE = " {\t";
+  private static final String WHITESPACE = " \t";
   private final Integer maxQueryTokens;
   private final Integer maxWhitespaceTokens;
   private final int nOk;
@@ -115,14 +115,14 @@ public class MaxQueryTokensTest extends 
ResourceQueryTestBase {
 
   @Test
   public void tooManyTokens() throws Exception {
-    assertQueryFailure(repeat(INVALID, nTokensFailure),
+    assertQueryFailure("{" +  repeat(INVALID, nTokensFailure) + "}",
         "'grammar' tokens have been presented. To prevent Denial Of Service");
   }
 
   @Test
   public void tooManyWhitespaceTokens() throws Exception {
     if (nWhitespaceFailure >= 0) {
-      assertQueryFailure(repeat(WHITESPACE, nWhitespaceFailure),
+      assertQueryFailure("{" + repeat(WHITESPACE, nWhitespaceFailure) + "}",
           "'whitespace' tokens have been presented. To prevent Denial Of 
Service");
     }
   }

Reply via email to