tainted_love 0.1.5 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (169) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +2 -0
  4. data/bin/setup +3 -3
  5. data/bin/test +6 -2
  6. data/dev.yml +1 -1
  7. data/lib/tainted_love.rb +2 -2
  8. data/lib/tainted_love/replacer/base.rb +5 -1
  9. data/lib/tainted_love/replacer/replace_action_controller.rb +0 -4
  10. data/lib/tainted_love/replacer/replace_active_record.rb +21 -1
  11. data/lib/tainted_love/replacer/replace_graphql.rb +27 -0
  12. data/lib/tainted_love/replacer/replace_kernel.rb +1 -1
  13. data/lib/tainted_love/replacer/replace_object.rb +8 -2
  14. data/lib/tainted_love/replacer/replace_rack_builder.rb +51 -0
  15. data/lib/tainted_love/replacer/replace_rack_file.rb +25 -0
  16. data/lib/tainted_love/replacer/replace_rack_query_parser.rb +50 -0
  17. data/lib/tainted_love/replacer/replace_rails_user_input.rb +12 -27
  18. data/lib/tainted_love/replacer/replace_string.rb +69 -0
  19. data/lib/tainted_love/replacer/replace_tag_builder.rb +16 -0
  20. data/lib/tainted_love/reporter/base.rb +4 -1
  21. data/lib/tainted_love/reporter/stdout_reporter.rb +1 -0
  22. data/lib/tainted_love/utils.rb +4 -19
  23. data/lib/tainted_love/utils/proxy.rb +95 -0
  24. data/lib/tainted_love/validator/action_dispatch_diagnostics.rb +20 -0
  25. data/lib/tainted_love/validator/active_record_find.rb +15 -0
  26. data/lib/tainted_love/validator/erb_eval.rb +1 -3
  27. data/lib/tainted_love/validator/haml_eval.rb +25 -0
  28. data/lib/tainted_love/validator/i18n_load.rb +17 -0
  29. data/lib/tainted_love/validator/ignore.rb +21 -0
  30. data/lib/tainted_love/version.rb +1 -1
  31. data/service.yml +6 -0
  32. data/{example → tests/rails}/.gitignore +0 -0
  33. data/{example → tests/rails}/.ruby-version +0 -0
  34. data/{example → tests/rails}/Gemfile +5 -4
  35. data/{example → tests/rails}/Gemfile.lock +29 -32
  36. data/{example → tests/rails}/README.md +0 -0
  37. data/{example → tests/rails}/Rakefile +0 -0
  38. data/{example → tests/rails}/app/assets/config/manifest.js +0 -0
  39. data/{example → tests/rails}/app/assets/images/.keep +0 -0
  40. data/{example → tests/rails}/app/assets/javascripts/application.js +0 -0
  41. data/{example → tests/rails}/app/assets/javascripts/cable.js +0 -0
  42. data/{example → tests/rails}/app/assets/javascripts/channels/.keep +0 -0
  43. data/{example → tests/rails}/app/assets/javascripts/products.coffee +0 -0
  44. data/{example → tests/rails}/app/assets/stylesheets/application.css +0 -0
  45. data/{example → tests/rails}/app/assets/stylesheets/products.scss +0 -0
  46. data/{example → tests/rails}/app/assets/stylesheets/scaffolds.scss +0 -0
  47. data/{example → tests/rails}/app/channels/application_cable/channel.rb +0 -0
  48. data/{example → tests/rails}/app/channels/application_cable/connection.rb +0 -0
  49. data/{example → tests/rails}/app/controllers/application_controller.rb +0 -0
  50. data/{example → tests/rails}/app/controllers/concerns/.keep +0 -0
  51. data/tests/rails/app/controllers/graphql_controller.rb +43 -0
  52. data/{example → tests/rails}/app/controllers/products_controller.rb +0 -0
  53. data/tests/rails/app/controllers/test_cases_controller.rb +43 -0
  54. data/tests/rails/app/graphql/example_schema.rb +4 -0
  55. data/{example/app/models/concerns → tests/rails/app/graphql/mutations}/.keep +0 -0
  56. data/{example/lib/assets → tests/rails/app/graphql/types}/.keep +0 -0
  57. data/tests/rails/app/graphql/types/base_enum.rb +4 -0
  58. data/tests/rails/app/graphql/types/base_input_object.rb +4 -0
  59. data/tests/rails/app/graphql/types/base_interface.rb +5 -0
  60. data/tests/rails/app/graphql/types/base_object.rb +4 -0
  61. data/tests/rails/app/graphql/types/base_scalar.rb +4 -0
  62. data/tests/rails/app/graphql/types/base_union.rb +4 -0
  63. data/tests/rails/app/graphql/types/mutation_type.rb +10 -0
  64. data/tests/rails/app/graphql/types/product_type.rb +10 -0
  65. data/tests/rails/app/graphql/types/query_type.rb +46 -0
  66. data/tests/rails/app/graphql/types/taint_test_case_input.rb +8 -0
  67. data/{example → tests/rails}/app/helpers/application_helper.rb +0 -0
  68. data/{example → tests/rails}/app/helpers/products_helper.rb +0 -0
  69. data/{example → tests/rails}/app/helpers/test_cases_helper.rb +0 -0
  70. data/{example → tests/rails}/app/jobs/application_job.rb +0 -0
  71. data/{example → tests/rails}/app/mailers/application_mailer.rb +0 -0
  72. data/{example → tests/rails}/app/models/application_record.rb +0 -0
  73. data/{example/lib/tasks → tests/rails/app/models/concerns}/.keep +0 -0
  74. data/{example → tests/rails}/app/models/product.rb +0 -0
  75. data/{example → tests/rails}/app/views/layouts/application.html.erb +0 -0
  76. data/{example → tests/rails}/app/views/layouts/mailer.html.erb +0 -0
  77. data/{example → tests/rails}/app/views/layouts/mailer.text.erb +0 -0
  78. data/{example → tests/rails}/app/views/products/_form.html.erb +0 -0
  79. data/{example → tests/rails}/app/views/products/_product.json.jbuilder +0 -0
  80. data/{example → tests/rails}/app/views/products/edit.html.erb +0 -0
  81. data/{example → tests/rails}/app/views/products/index.html.erb +0 -0
  82. data/{example → tests/rails}/app/views/products/index.json.jbuilder +0 -0
  83. data/{example → tests/rails}/app/views/products/new.html.erb +0 -0
  84. data/{example → tests/rails}/app/views/products/show.html.erb +0 -0
  85. data/{example → tests/rails}/app/views/products/show.json.jbuilder +0 -0
  86. data/{example → tests/rails}/app/views/test_cases/xss.html.erb +0 -0
  87. data/{example → tests/rails}/bin/bundle +0 -0
  88. data/{example → tests/rails}/bin/rails +0 -0
  89. data/{example → tests/rails}/bin/rake +0 -0
  90. data/{example → tests/rails}/bin/setup +0 -0
  91. data/{example → tests/rails}/bin/spring +0 -0
  92. data/{example → tests/rails}/bin/update +0 -0
  93. data/{example → tests/rails}/bin/yarn +0 -0
  94. data/{example → tests/rails}/config.ru +0 -0
  95. data/{example → tests/rails}/config/application.rb +0 -0
  96. data/{example → tests/rails}/config/boot.rb +0 -0
  97. data/{example → tests/rails}/config/cable.yml +0 -0
  98. data/{example → tests/rails}/config/credentials.yml.enc +0 -0
  99. data/{example → tests/rails}/config/database.yml +0 -0
  100. data/{example → tests/rails}/config/environment.rb +0 -0
  101. data/{example → tests/rails}/config/environments/development.rb +0 -0
  102. data/{example → tests/rails}/config/environments/production.rb +0 -0
  103. data/{example → tests/rails}/config/environments/test.rb +0 -0
  104. data/{example → tests/rails}/config/initializers/application_controller_renderer.rb +0 -0
  105. data/{example → tests/rails}/config/initializers/assets.rb +0 -0
  106. data/{example → tests/rails}/config/initializers/backtrace_silencers.rb +0 -0
  107. data/{example → tests/rails}/config/initializers/content_security_policy.rb +0 -0
  108. data/{example → tests/rails}/config/initializers/cookies_serializer.rb +0 -0
  109. data/{example → tests/rails}/config/initializers/filter_parameter_logging.rb +0 -0
  110. data/{example → tests/rails}/config/initializers/inflections.rb +0 -0
  111. data/{example → tests/rails}/config/initializers/mime_types.rb +0 -0
  112. data/{example → tests/rails}/config/initializers/tainted_love.rb +0 -0
  113. data/{example → tests/rails}/config/initializers/wrap_parameters.rb +0 -0
  114. data/{example → tests/rails}/config/locales/en.yml +0 -0
  115. data/{example → tests/rails}/config/puma.rb +0 -0
  116. data/{example → tests/rails}/config/routes.rb +6 -0
  117. data/{example → tests/rails}/config/spring.rb +0 -0
  118. data/{example → tests/rails}/config/storage.yml +0 -0
  119. data/{example → tests/rails}/db/migrate/20190311220346_create_products.rb +0 -0
  120. data/{example → tests/rails}/db/schema.rb +0 -0
  121. data/{example → tests/rails}/db/seeds.rb +0 -0
  122. data/{example/log → tests/rails/lib/assets}/.keep +0 -0
  123. data/{example/storage → tests/rails/lib/tasks}/.keep +0 -0
  124. data/{example/test/controllers → tests/rails/log}/.keep +0 -0
  125. data/{example → tests/rails}/package.json +0 -0
  126. data/{example → tests/rails}/public/404.html +0 -0
  127. data/{example → tests/rails}/public/422.html +0 -0
  128. data/{example → tests/rails}/public/500.html +0 -0
  129. data/{example → tests/rails}/public/apple-touch-icon-precomposed.png +0 -0
  130. data/{example → tests/rails}/public/apple-touch-icon.png +0 -0
  131. data/{example → tests/rails}/public/favicon.ico +0 -0
  132. data/{example → tests/rails}/public/robots.txt +0 -0
  133. data/{example/test/fixtures → tests/rails/storage}/.keep +0 -0
  134. data/tests/rails/test.sh +1 -0
  135. data/{example → tests/rails}/test/application_system_test_case.rb +0 -0
  136. data/{example/test/fixtures/files → tests/rails/test/controllers}/.keep +0 -0
  137. data/tests/rails/test/controllers/graphql_controller_test.rb +28 -0
  138. data/{example → tests/rails}/test/controllers/products_controller_test.rb +0 -0
  139. data/tests/rails/test/controllers/test_cases_controller_test.rb +54 -0
  140. data/{example/test/helpers → tests/rails/test/fixtures}/.keep +0 -0
  141. data/{example/test/integration → tests/rails/test/fixtures/files}/.keep +0 -0
  142. data/{example → tests/rails}/test/fixtures/products.yml +0 -0
  143. data/{example/test/mailers → tests/rails/test/helpers}/.keep +0 -0
  144. data/{example/test/models → tests/rails/test/integration}/.keep +0 -0
  145. data/{example/test/system → tests/rails/test/mailers}/.keep +0 -0
  146. data/{example/tmp → tests/rails/test/models}/.keep +0 -0
  147. data/{example → tests/rails}/test/models/product_test.rb +0 -0
  148. data/{example → tests/rails}/test/replacers/replace_active_record_test.rb +28 -0
  149. data/tests/rails/test/replacers/replace_rails_user_input_test.rb +13 -0
  150. data/{example → tests/rails}/test/replacers/replace_sprokets_test.rb +0 -0
  151. data/{example/vendor → tests/rails/test/system}/.keep +0 -0
  152. data/{example → tests/rails}/test/system/products_test.rb +0 -0
  153. data/{example → tests/rails}/test/test_helper.rb +0 -0
  154. data/tests/rails/tmp/.keep +0 -0
  155. data/tests/rails/vendor/.keep +0 -0
  156. data/tests/sinatra/Gemfile +3 -0
  157. data/tests/sinatra/Gemfile.lock +29 -0
  158. data/tests/sinatra/app.rb +26 -0
  159. data/tests/sinatra/test.sh +1 -0
  160. data/tests/sinatra/views/xss.erb +1 -0
  161. data/tools/web/Gemfile +1 -1
  162. data/tools/web/application.rb +17 -2
  163. data/tools/web/public/application.css +38 -2
  164. data/tools/web/views/index.erb +5 -11
  165. data/tools/web/views/input.erb +4 -0
  166. data/tools/web/views/line.erb +2 -2
  167. metadata +146 -111
  168. data/example/app/controllers/test_cases_controller.rb +0 -20
  169. data/example/test/controllers/test_cases_controller_test.rb +0 -39
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TaintedLove
4
+ module Replacer
5
+ class ReplaceTagBuilder < Base
6
+ def replace!
7
+ block = lambda do |return_value, *args|
8
+ return_value.untaint
9
+ end
10
+
11
+ TaintedLove.proxy_method('ActionView::Helpers::TagHelper::TagBuilder', :content_tag_string, &block)
12
+ TaintedLove.proxy_method('ActionView::Helpers::TagHelper::TagBuilder', :tag_options, &block)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -33,7 +33,10 @@ module TaintedLove
33
33
  message: warning.message,
34
34
  )
35
35
 
36
- @warnings[key][:inputs][warning.tainted_input] = warning.reported_at
36
+ @warnings[key][:inputs][warning.tainted_input] = {
37
+ reported_at: warning.reported_at,
38
+ taint_tags: warning.tainted_input.tainted_love_tags.uniq
39
+ }
37
40
  end
38
41
 
39
42
  # Adds a warning to the reporter
@@ -30,6 +30,7 @@ module TaintedLove
30
30
  end
31
31
 
32
32
  puts 'Tainted input: ' + tainted_input
33
+ puts 'Taint tags: ' + warning.tainted_input.tainted_love_tags.uniq.inspect
33
34
 
34
35
  warning.stack_trace.lines.take(@stack_trace_size).each do |line|
35
36
  puts format_line(line)
@@ -43,34 +43,19 @@ module TaintedLove
43
43
  # Adds information about the object. The information can be about
44
44
  # where the object is coming from, validation that has been done on the object, etc.
45
45
  #
46
- # If the object is frozen, the given block will be called with a new object.
47
- # The caller has the responsability of replacing the frozen object with this
48
- # new object.
49
- #
50
46
  # @param object [Object] Object to add tracking
51
47
  # @param payload [Hash] Data to add to the object
52
- # @yield [Object] Invoked with a duplicate unfrozen version of object
53
48
  # @return [Object] Given object or dup of it
54
- def add_tracking(object, payload = {}, &block)
55
- frozen = object.frozen?
56
-
57
- return if frozen && block.nil?
58
-
59
- payload[:stacktrace] = StackTrace.current
60
-
61
- object = object.dup if frozen
62
-
63
- object.tainted_love_tracking << payload
64
-
65
- block.call(object) if frozen
49
+ def tag(object, payload = {})
50
+ object.tainted_love_tags << payload
66
51
 
67
52
  object
68
53
  end
69
54
 
70
55
  # Create a hex encoded MD5 hash
71
56
  #
72
- # @params str [String] Input string
73
- # @returns [String]
57
+ # @param str [String] Input string
58
+ # @return [String]
74
59
  def hash(str)
75
60
  h = Digest::MD5.new
76
61
  h.update(str)
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+ module TaintedLove
3
+ module Utils
4
+ # Utility to wrap a an instance function.
5
+ #
6
+ # @example
7
+ # TaintedLove::Utils::Proxy.new('MyClass', :my_method) do
8
+ # def before
9
+ # if arguments.first.tainted?
10
+ # @should_taint = true
11
+ # do_something
12
+ # end
13
+ # end
14
+ #
15
+ # def around
16
+ # yield # calls the real method
17
+ # end
18
+ #
19
+ # def after
20
+ # return_value.taint if @should_taint
21
+ # end
22
+ # end
23
+ class Proxy
24
+ attr_accessor :object, :return_value, :block, :arguments
25
+
26
+ # Creates a new proxy. If klass and `method` are provided, it will invoke {#apply} with those arguments.
27
+ #
28
+ # @param klass [Class, String] The target class
29
+ # @param method [Symbol] The method name to replace
30
+ # @yield [] Evaluated the block in the context of the instance to customize the before, around and after methods
31
+ def initialize(klass = nil, method = nil, &block)
32
+ instance_eval(&block) unless block.nil?
33
+
34
+ if !klass.nil? && !method.nil?
35
+ apply(klass, method)
36
+ end
37
+ end
38
+
39
+ # Invoked before invoking the original method
40
+ def before
41
+ end
42
+
43
+ # Invoked after invoking the original method
44
+ def after
45
+ end
46
+
47
+ # Controls the call to the original function. The default implementation of this method will yield.
48
+ #
49
+ # @yield [] The given block will invoke the original method
50
+ def around
51
+ yield
52
+ end
53
+
54
+ def handle(object, method, *args, &block)
55
+ # thread safety maybe?
56
+ @arguments = args
57
+ @block = block
58
+ @object = object
59
+
60
+ before
61
+
62
+ around do
63
+ @return_value = object.send(method, *@arguments, &@block)
64
+ end
65
+
66
+ after
67
+
68
+ @return_value
69
+ end
70
+
71
+ # Replaces the method in the given klass.
72
+ #
73
+ # @param klass [Class, String] The target class
74
+ # @param method [Symbol] The method name to replace
75
+ def apply(klass, method)
76
+ if klass.is_a?(String)
77
+ return unless Object.const_defined?(klass)
78
+
79
+ klass = Object.const_get(klass)
80
+ end
81
+
82
+ proxy = self
83
+ original_method = "_tainted_love_original_#{method}"
84
+
85
+ klass.class_eval do
86
+ alias_method original_method, method
87
+
88
+ define_method method do |*args, &given_block|
89
+ proxy.handle(self, original_method, *args, &given_block)
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TaintedLove
4
+ module Validator
5
+ class ActionDispatchDiagnostics < Base
6
+ FILES = %w(
7
+ action_dispatch/middleware/templates/rescues/routing_error.html.erb
8
+ action_dispatch/middleware/templates/rescues/diagnostics.html.erb
9
+ )
10
+ def remove?(warning)
11
+ return unless warning.replacer == :ReplaceActionView
12
+
13
+
14
+ FILES.any? do |file|
15
+ warning.stack_trace_line[:file][file]
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TaintedLove
4
+ module Validator
5
+ class ActiveRecordFind < Base
6
+ def remove?(warning)
7
+ return unless warning.replacer == :ReplaceActiveRecord
8
+
9
+ warning.stack_trace.lines.take(2).any? do |line|
10
+ line[:file]['lib/active_record/core.rb'] && line[:method] == 'find'
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -4,9 +4,7 @@ module TaintedLove
4
4
  module Validator
5
5
  class ErbEval < Base
6
6
  def remove?(warning)
7
- if Object.const_defined?('Rails') || Object.const_defined?('ERB')
8
- return true if warning.tainted_input['_erbout']
9
- end
7
+ return true if warning.replacer == :ReplaceKernel && warning.tainted_input.include?('_erbout')
10
8
  end
11
9
  end
12
10
  end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TaintedLove
4
+ module Validator
5
+ class HamlEval < Base
6
+ CALLS = [
7
+ ['haml/attribute_compiler.rb', 'static_build'],
8
+ ['haml/parser.rb', 'parse_static_hash'],
9
+ ['haml/util.rb', 'block in unescape_interpolation']
10
+ ]
11
+
12
+ def remove?(warning)
13
+ return unless warning.replacer == :ReplaceKernel
14
+
15
+ line = warning.stack_trace_line
16
+
17
+ return unless line[:file]['gems/haml']
18
+
19
+ CALLS.any? do |file, method|
20
+ line[:method] == method && line[:file][file]
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TaintedLove
4
+ module Validator
5
+ class I18nLoad < Base
6
+ def remove?(warning)
7
+ return unless [:ReplaceYAML, :ReplaceKernel].include?(warning.replacer)
8
+
9
+ line = warning.stack_trace.lines.first
10
+
11
+ if line[:file]['i18n/backend/base.rb'] && line[:method].start_with?('load_')
12
+ return true
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TaintedLove
4
+ module Validator
5
+ class Ignore < Base
6
+ class << self
7
+ attr_accessor :trace_hashes
8
+ end
9
+
10
+ self.trace_hashes = []
11
+
12
+ def remove?(warning)
13
+ hash = warning.stack_trace.trace_hash
14
+
15
+ Ignore.trace_hashes.any? do |s|
16
+ hash.start_with?(s)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TaintedLove
4
- VERSION = '0.1.5'
4
+ VERSION = '0.4.0'
5
5
  end
@@ -0,0 +1,6 @@
1
+ # https://services.shopify.io/services/tainted_love/rubygems
2
+ org_line:
3
+ owners:
4
+ - Shopify/appsec
5
+ rubygems:
6
+ classification: library
File without changes
File without changes
@@ -8,7 +8,7 @@ ruby('2.5.3')
8
8
  # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
9
9
  gem('rails', '~> 5.2.2')
10
10
 
11
- gem('tainted_love', path: '..')
11
+ gem('tainted_love', path: '../..')
12
12
 
13
13
  gem('sqlite3', '~> 1.3.6')
14
14
 
@@ -50,9 +50,6 @@ group :development do
50
50
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
51
51
  gem 'web-console', '>= 3.3.0'
52
52
  gem 'listen', '>= 3.0.5', '< 3.2'
53
- # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
54
- gem 'spring'
55
- gem 'spring-watcher-listen', '~> 2.0.0'
56
53
  end
57
54
 
58
55
  group :test do
@@ -65,3 +62,7 @@ end
65
62
 
66
63
  # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
67
64
  gem('tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby])
65
+
66
+ gem('graphql')
67
+
68
+ gem('graphiql-rails', group: :development)
@@ -1,7 +1,7 @@
1
1
  PATH
2
- remote: ..
2
+ remote: ../..
3
3
  specs:
4
- tainted_love (0.1.4)
4
+ tainted_love (0.4.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -52,21 +52,21 @@ GEM
52
52
  archive-zip (0.12.0)
53
53
  io-like (~> 0.3.0)
54
54
  arel (9.0.0)
55
- bindex (0.6.0)
56
- bootsnap (1.4.2)
55
+ bindex (0.7.0)
56
+ bootsnap (1.4.4)
57
57
  msgpack (~> 1.0)
58
58
  builder (3.2.3)
59
59
  byebug (11.0.1)
60
- capybara (3.16.1)
60
+ capybara (3.25.0)
61
61
  addressable
62
62
  mini_mime (>= 0.1.3)
63
63
  nokogiri (~> 1.8)
64
64
  rack (>= 1.6.0)
65
65
  rack-test (>= 0.6.3)
66
- regexp_parser (~> 1.2)
66
+ regexp_parser (~> 1.5)
67
67
  xpath (~> 3.2)
68
- childprocess (0.9.0)
69
- ffi (~> 1.0, >= 1.0.11)
68
+ childprocess (1.0.1)
69
+ rake (< 13.0)
70
70
  chromedriver-helper (2.1.1)
71
71
  archive-zip (~> 0.10)
72
72
  nokogiri (~> 1.8)
@@ -81,15 +81,18 @@ GEM
81
81
  crass (1.0.4)
82
82
  erubi (1.8.0)
83
83
  execjs (2.7.0)
84
- ffi (1.10.0)
84
+ ffi (1.11.1)
85
85
  globalid (0.4.2)
86
86
  activesupport (>= 4.2.0)
87
+ graphiql-rails (1.7.0)
88
+ railties
89
+ sprockets-rails
90
+ graphql (1.9.6)
87
91
  i18n (1.6.0)
88
92
  concurrent-ruby (~> 1.0)
89
93
  io-like (0.3.0)
90
- jbuilder (2.8.0)
94
+ jbuilder (2.9.1)
91
95
  activesupport (>= 4.2.0)
92
- multi_json (>= 1.2)
93
96
  listen (3.1.5)
94
97
  rb-fsevent (~> 0.9, >= 0.9.4)
95
98
  rb-inotify (~> 0.9, >= 0.9.7)
@@ -103,17 +106,16 @@ GEM
103
106
  mimemagic (~> 0.3.2)
104
107
  method_source (0.9.2)
105
108
  mimemagic (0.3.3)
106
- mini_mime (1.0.1)
109
+ mini_mime (1.0.2)
107
110
  mini_portile2 (2.4.0)
108
111
  minitest (5.11.3)
109
- msgpack (1.2.9)
110
- multi_json (1.13.1)
111
- nio4r (2.3.1)
112
- nokogiri (1.10.2)
112
+ msgpack (1.3.0)
113
+ nio4r (2.4.0)
114
+ nokogiri (1.10.3)
113
115
  mini_portile2 (~> 2.4.0)
114
- public_suffix (3.0.3)
116
+ public_suffix (3.1.1)
115
117
  puma (3.12.1)
116
- rack (2.0.6)
118
+ rack (2.0.7)
117
119
  rack-test (1.1.0)
118
120
  rack (>= 1.0, < 3)
119
121
  rails (5.2.3)
@@ -144,10 +146,10 @@ GEM
144
146
  rb-fsevent (0.10.3)
145
147
  rb-inotify (0.10.0)
146
148
  ffi (~> 1.0)
147
- regexp_parser (1.3.0)
149
+ regexp_parser (1.5.1)
148
150
  ruby_dep (1.5.0)
149
- rubyzip (1.2.2)
150
- sass (3.7.3)
151
+ rubyzip (1.2.3)
152
+ sass (3.7.4)
151
153
  sass-listen (~> 4.0.0)
152
154
  sass-listen (4.0.0)
153
155
  rb-fsevent (~> 0.9, >= 0.9.4)
@@ -158,14 +160,9 @@ GEM
158
160
  sprockets (>= 2.8, < 4.0)
159
161
  sprockets-rails (>= 2.0, < 4.0)
160
162
  tilt (>= 1.1, < 3)
161
- selenium-webdriver (3.141.0)
162
- childprocess (~> 0.5)
163
+ selenium-webdriver (3.142.3)
164
+ childprocess (>= 0.5, < 2.0)
163
165
  rubyzip (~> 1.2, >= 1.2.2)
164
- spring (2.0.2)
165
- activesupport (>= 4.2)
166
- spring-watcher-listen (2.0.1)
167
- listen (>= 2.7, < 4.0)
168
- spring (>= 1.2, < 3.0)
169
166
  sprockets (3.7.2)
170
167
  concurrent-ruby (~> 1.0)
171
168
  rack (> 1, < 3)
@@ -189,9 +186,9 @@ GEM
189
186
  activemodel (>= 5.0)
190
187
  bindex (>= 0.4.0)
191
188
  railties (>= 5.0)
192
- websocket-driver (0.7.0)
189
+ websocket-driver (0.7.1)
193
190
  websocket-extensions (>= 0.1.0)
194
- websocket-extensions (0.1.3)
191
+ websocket-extensions (0.1.4)
195
192
  xpath (3.2.0)
196
193
  nokogiri (~> 1.8)
197
194
 
@@ -204,14 +201,14 @@ DEPENDENCIES
204
201
  capybara (>= 2.15)
205
202
  chromedriver-helper
206
203
  coffee-rails (~> 4.2)
204
+ graphiql-rails
205
+ graphql
207
206
  jbuilder (~> 2.5)
208
207
  listen (>= 3.0.5, < 3.2)
209
208
  puma (~> 3.11)
210
209
  rails (~> 5.2.2)
211
210
  sass-rails (~> 5.0)
212
211
  selenium-webdriver
213
- spring
214
- spring-watcher-listen (~> 2.0.0)
215
212
  sqlite3 (~> 1.3.6)
216
213
  tainted_love!
217
214
  turbolinks (~> 5)