agoo 2.14.2 → 2.14.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e538b3f1c7ed9ea23d8529c29bf5104d0882b0dcda49e6114bb011491b1e3ed7
4
- data.tar.gz: ee1a1284779ec7108675794f4eff89f826c76f3a5e10a7f07a42bab8bbae31cb
3
+ metadata.gz: 843f3aa4a15a6ab57c7ff231930405c9ca55d3a6e33da3169a0677c420195fbe
4
+ data.tar.gz: 03f6b8760c6f08c0a3f9b5f75c747b77d1d4666b00af20d7db231418dfeb3c69
5
5
  SHA512:
6
- metadata.gz: e28b50c1bea0934691679719532108fdd6d912f3beed8b9eabe6071ccd71af393b14f3c81d094cb82b5777a22884cc716e12d3c66629e39c5f7f1290919fc030
7
- data.tar.gz: 1d478668d82b79acc3d2cabb56fe9aca55fb3513b4c5a5810c0d200a69b081573ff532a346c13d513fae0980fa6331f3701ee041d43ea7cfc32cd2d2a586d0c2
6
+ metadata.gz: '0684900cea98fbe812e5ae973ccd15dfaa054218340238dedfde382c535340945aea9857b98366fe52b2ff865129b299af541e940112200f2191b3b2247dfd58'
7
+ data.tar.gz: 95e68a0a7bc5a3eb8cd34b9853e8d89285ef9a1c78765bf970e80cdeb51f7f41f53db4948ca2885e29eef3fa7a6b738e015d01c4cbb25e41b2f50bac1fcb50a9
data/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  All changes to the Agoo gem are documented here. Releases follow semantic versioning.
4
4
 
5
+ ## [2.14.3] - 2022-05-05
6
+
7
+ ### Fixed
8
+ - Agoo now reports an error if the developer make the mistake of
9
+ building a schema that loops back on itself too many times using
10
+ fragments.
11
+
5
12
  ## [2.14.2] - 2022-02-22
6
13
 
7
14
  ### Fixed
data/ext/agoo/gqleval.c CHANGED
@@ -21,6 +21,7 @@
21
21
  #include "websocket.h"
22
22
 
23
23
  #define MAX_RESOLVE_ARGS 16
24
+ #define MAX_DEPTH 100
24
25
 
25
26
  gqlRef gql_root = NULL;
26
27
  gqlType _gql_root_type = NULL;
@@ -273,7 +274,10 @@ gql_eval_sels(agooErr err, gqlDoc doc, gqlRef ref, gqlField field, gqlSel sels,
273
274
  gqlSel sel;
274
275
  gqlField sf = NULL;
275
276
 
276
- // TBD if depth over max then return an error
277
+ if (MAX_DEPTH < depth) {
278
+ return agoo_err_set(err, AGOO_ERR_EVAL, "Maximum resolve depth of %d exceeded.", MAX_DEPTH);
279
+ }
280
+ depth++;
277
281
 
278
282
  for (sel = sels; NULL != sel; sel = sel->next) {
279
283
  if (NULL != field) {
data/ext/agoo/gqlintro.c CHANGED
@@ -1497,13 +1497,13 @@ gql_intro_eval(agooErr err, gqlDoc doc, gqlSel sel, gqlValue result, int depth)
1497
1497
  struct _gqlCobj obj;
1498
1498
 
1499
1499
  if (0 == strcmp("__type", sel->name)) {
1500
- if (1 < depth) {
1500
+ if (2 < depth) {
1501
1501
  return agoo_err_set(err, AGOO_ERR_EVAL, "__type can only be called from a query root.");
1502
1502
  }
1503
1503
  obj.clas = &root_class;
1504
1504
  obj.ptr = NULL;
1505
1505
  } else if (0 == strcmp("__schema", sel->name)) {
1506
- if (1 < depth) {
1506
+ if (2 < depth) {
1507
1507
  return agoo_err_set(err, AGOO_ERR_EVAL, "__scheme can only be called from a query root.");
1508
1508
  }
1509
1509
  obj.clas = &root_class;
data/lib/agoo/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
 
2
2
  module Agoo
3
3
  # Agoo version.
4
- VERSION = '2.14.2'
4
+ VERSION = '2.14.3'
5
5
  end
data/test/graphql_test.rb CHANGED
@@ -458,6 +458,32 @@ fragment basic on Artist {
458
458
  post_test(uri, body, 'application/graphql', expect)
459
459
  end
460
460
 
461
+ def test_post_fragment_loop
462
+ uri = URI('http://localhost:6472/graphql?indent=2')
463
+ body = %^
464
+ {
465
+ artist(name:"Fazerdaze") {
466
+ ...loop
467
+ }
468
+ }
469
+
470
+ fragment loop on Artist {
471
+ name
472
+ ...loop
473
+ }
474
+ ^
475
+ expect = %^{
476
+ "errors":[
477
+ {
478
+ "message":"Maximum resolve depth of 100 exceeded.",
479
+ "code":"eval error"
480
+ }
481
+ ]
482
+ }
483
+ ^
484
+ post_test(uri, body, 'application/graphql', expect, 'errors.0.timestamp')
485
+ end
486
+
461
487
  def test_post_json_fragment
462
488
  uri = URI('http://localhost:6472/graphql?indent=2')
463
489
  body = %^{
@@ -1044,7 +1070,7 @@ mutation {
1044
1070
  assert_equal(expect, content)
1045
1071
  end
1046
1072
 
1047
- def post_test(uri, body, content_type, expect)
1073
+ def post_test(uri, body, content_type, expect, ignore=nil)
1048
1074
  uri = URI(uri)
1049
1075
  req = Net::HTTP::Post.new(uri)
1050
1076
  req['Accept-Encoding'] = '*'
@@ -1055,6 +1081,11 @@ mutation {
1055
1081
  }
1056
1082
  content = res.body
1057
1083
  assert_equal('application/json', res['Content-Type'])
1084
+ unless ignore.nil?
1085
+ result = Oj.load(content, mode: :strict)
1086
+ deep_delete(result, ignore.split('.'))
1087
+ content = Oj.dump(result, indent: 2)
1088
+ end
1058
1089
  assert_equal(expect, content)
1059
1090
  end
1060
1091
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: agoo
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.14.2
4
+ version: 2.14.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Ohler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-22 00:00:00.000000000 Z
11
+ date: 2022-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj