From a391698aa9d743c1095f51b5446eab774bca0d90 Mon Sep 17 00:00:00 2001 From: Michiel Oliemans Date: Sun, 14 Oct 2018 16:16:54 +0200 Subject: [PATCH] Added option for disabling introspection query --- .../coxautodev/graphql/tools/SchemaObjects.kt | 20 ++++++++++++------- .../coxautodev/graphql/tools/SchemaParser.kt | 4 ++-- .../graphql/tools/SchemaParserBuilder.kt | 11 +++++++--- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/main/kotlin/com/coxautodev/graphql/tools/SchemaObjects.kt b/src/main/kotlin/com/coxautodev/graphql/tools/SchemaObjects.kt index 2161da3e..7dc9b64e 100644 --- a/src/main/kotlin/com/coxautodev/graphql/tools/SchemaObjects.kt +++ b/src/main/kotlin/com/coxautodev/graphql/tools/SchemaObjects.kt @@ -13,13 +13,19 @@ data class SchemaObjects(val query: GraphQLObjectType, val mutation: GraphQLObje /** * Makes a GraphQLSchema with query, mutation and subscription. */ - fun toSchema(): GraphQLSchema = GraphQLSchema.newSchema() - .query(query) - .mutation(mutation) - .subscription(subscription) - .additionalTypes(dictionary) -// .fieldVisibility(NoIntrospectionGraphqlFieldVisibility.NO_INTROSPECTION_FIELD_VISIBILITY) - .build() + fun toSchema(introspectionEnabled: Boolean): GraphQLSchema { + val builder = GraphQLSchema.newSchema() + .query(query) + .mutation(mutation) + .subscription(subscription) + .additionalTypes(dictionary) + + if (!introspectionEnabled) { + builder.fieldVisibility(NoIntrospectionGraphqlFieldVisibility.NO_INTROSPECTION_FIELD_VISIBILITY) + } + + return builder.build() + } /** * Makes a GraphQLSchema with query but without mutation and subscription. diff --git a/src/main/kotlin/com/coxautodev/graphql/tools/SchemaParser.kt b/src/main/kotlin/com/coxautodev/graphql/tools/SchemaParser.kt index 8c701266..f41ec32d 100644 --- a/src/main/kotlin/com/coxautodev/graphql/tools/SchemaParser.kt +++ b/src/main/kotlin/com/coxautodev/graphql/tools/SchemaParser.kt @@ -44,7 +44,7 @@ import kotlin.reflect.KClass * * @author Andrew Potter */ -class SchemaParser internal constructor(scanResult: ScannedSchemaObjects) { +class SchemaParser internal constructor(scanResult: ScannedSchemaObjects, private val options: SchemaParserOptions) { companion object { const val DEFAULT_DEPRECATION_MESSAGE = "No longer supported" @@ -110,7 +110,7 @@ class SchemaParser internal constructor(scanResult: ScannedSchemaObjects) { /** * Parses the given schema with respect to the given dictionary and returns a GraphQLSchema */ - fun makeExecutableSchema(): GraphQLSchema = parseSchemaObjects().toSchema() + fun makeExecutableSchema(): GraphQLSchema = parseSchemaObjects().toSchema(options.introspectionEnabled) /** * Returns any unused type definitions that were found in the schema diff --git a/src/main/kotlin/com/coxautodev/graphql/tools/SchemaParserBuilder.kt b/src/main/kotlin/com/coxautodev/graphql/tools/SchemaParserBuilder.kt index 27cc04c0..ce406d9c 100644 --- a/src/main/kotlin/com/coxautodev/graphql/tools/SchemaParserBuilder.kt +++ b/src/main/kotlin/com/coxautodev/graphql/tools/SchemaParserBuilder.kt @@ -176,7 +176,7 @@ class SchemaParserBuilder constructor(private val dictionary: SchemaParserDictio /** * Build the parser with the supplied schema and dictionary. */ - fun build() = SchemaParser(scan()) + fun build() = SchemaParser(scan(), options) } class InvalidSchemaError(pce: ParseCancellationException, private val recognitionException: RecognitionException) : RuntimeException(pce) { @@ -247,7 +247,7 @@ class SchemaParserDictionary { } } -data class SchemaParserOptions internal constructor(val contextClass: Class<*>?, val genericWrappers: List, val allowUnimplementedResolvers: Boolean, val objectMapperProvider: PerFieldObjectMapperProvider, val proxyHandlers: List, val preferGraphQLResolver: Boolean) { +data class SchemaParserOptions internal constructor(val contextClass: Class<*>?, val genericWrappers: List, val allowUnimplementedResolvers: Boolean, val objectMapperProvider: PerFieldObjectMapperProvider, val proxyHandlers: List, val preferGraphQLResolver: Boolean, val introspectionEnabled: Boolean) { companion object { @JvmStatic fun newOptions() = Builder() @@ -264,6 +264,7 @@ data class SchemaParserOptions internal constructor(val contextClass: Class<*>?, private var objectMapperProvider: PerFieldObjectMapperProvider = PerFieldConfiguringObjectMapperProvider() private val proxyHandlers: MutableList = mutableListOf(Spring4AopProxyHandler(), GuiceAopProxyHandler(), JavassistProxyHandler()) private var preferGraphQLResolver = false + private var introspectionEnabled = true fun contextClass(contextClass: Class<*>) = this.apply { this.contextClass = contextClass @@ -309,6 +310,10 @@ data class SchemaParserOptions internal constructor(val contextClass: Class<*>?, this.proxyHandlers.add(proxyHandler) } + fun introspectionEnabled(introspectionEnabled: Boolean) = this.apply { + this.introspectionEnabled = introspectionEnabled + } + fun build(): SchemaParserOptions { val wrappers = if (useDefaultGenericWrappers) { genericWrappers + listOf( @@ -321,7 +326,7 @@ data class SchemaParserOptions internal constructor(val contextClass: Class<*>?, genericWrappers } - return SchemaParserOptions(contextClass, wrappers, allowUnimplementedResolvers, objectMapperProvider, proxyHandlers, preferGraphQLResolver) + return SchemaParserOptions(contextClass, wrappers, allowUnimplementedResolvers, objectMapperProvider, proxyHandlers, preferGraphQLResolver, introspectionEnabled) } }