Skip to content

Commit 8ca3659

Browse files
ENGCOM-3957: Allow introspection by default in production mode magento#308
- Merge Pull Request magento/graphql-ce#308 from pmclain/graphql-ce:issue/232 - Merged commits: 1. 410b012 2. 0b4e017 3. b6fe3ff 4. 5b53536
2 parents b8eb424 + 5b53536 commit 8ca3659

File tree

3 files changed

+55
-10
lines changed

3 files changed

+55
-10
lines changed

dev/tests/api-functional/testsuite/Magento/GraphQl/IntrospectionQueryTest.php

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
class IntrospectionQueryTest extends GraphQlAbstract
1313
{
1414
/**
15-
* Tests that Introspection is disabled when not in developer mode
15+
* Tests that Introspection is allowed by default
1616
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
1717
*/
18-
public function testIntrospectionQueryWithFieldArgs()
18+
public function testIntrospectionQuery()
1919
{
2020
$query
2121
= <<<QUERY
@@ -54,11 +54,6 @@ public function testIntrospectionQueryWithFieldArgs()
5454
}
5555
QUERY;
5656

57-
$this->expectException(\Exception::class);
58-
$this->expectExceptionMessage(
59-
'GraphQL response contains errors: GraphQL introspection is not allowed, but ' .
60-
'the query contained __schema or __type'
61-
);
62-
$this->graphQlQuery($query);
57+
$this->assertArrayHasKey('__schema', $this->graphQlQuery($query));
6358
}
6459
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Framework\GraphQl\Query;
9+
10+
use Magento\Framework\App\DeploymentConfig;
11+
12+
/**
13+
* Class for fetching the availability of introspection queries
14+
*/
15+
class IntrospectionConfiguration
16+
{
17+
private const CONFIG_PATH_DISABLE_INTROSPECTION = 'graphql/disable_introspection';
18+
19+
/**
20+
* @var DeploymentConfig
21+
*/
22+
private $deploymentConfig;
23+
24+
/**
25+
* @param DeploymentConfig $deploymentConfig
26+
*/
27+
public function __construct(
28+
DeploymentConfig $deploymentConfig
29+
) {
30+
$this->deploymentConfig = $deploymentConfig;
31+
}
32+
33+
/**
34+
* Check the the environment config to determine if introspection should be disabled.
35+
*
36+
* @return bool
37+
*/
38+
public function isIntrospectionDisabled(): bool
39+
{
40+
return (bool)$this->deploymentConfig->get(self::CONFIG_PATH_DISABLE_INTROSPECTION);
41+
}
42+
}

lib/internal/Magento/Framework/GraphQl/Query/QueryComplexityLimiter.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,24 @@ class QueryComplexityLimiter
3333
*/
3434
private $queryComplexity;
3535

36+
/**
37+
* @var IntrospectionConfiguration
38+
*/
39+
private $introspectionConfig;
40+
3641
/**
3742
* @param int $queryDepth
3843
* @param int $queryComplexity
44+
* @param IntrospectionConfiguration $introspectionConfig
3945
*/
4046
public function __construct(
4147
int $queryDepth,
42-
int $queryComplexity
48+
int $queryComplexity,
49+
IntrospectionConfiguration $introspectionConfig
4350
) {
4451
$this->queryDepth = $queryDepth;
4552
$this->queryComplexity = $queryComplexity;
53+
$this->introspectionConfig = $introspectionConfig;
4654
}
4755

4856
/**
@@ -53,7 +61,7 @@ public function __construct(
5361
public function execute(): void
5462
{
5563
DocumentValidator::addRule(new QueryComplexity($this->queryComplexity));
56-
DocumentValidator::addRule(new DisableIntrospection());
64+
DocumentValidator::addRule(new DisableIntrospection((int) $this->introspectionConfig->isIntrospectionDisabled()));
5765
DocumentValidator::addRule(new QueryDepth($this->queryDepth));
5866
}
5967
}

0 commit comments

Comments
 (0)