govuk_app_config 2.1.0 → 2.2.2

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: 11deec0d472bf1602ab757e77ec8d84ac51b6c5ea656b0f5ee566a2c30e53001
4
- data.tar.gz: 3c8b333046cc448c7100392138fcb1804b84f3b0f02d319e4dc5274266db5a92
3
+ metadata.gz: c5f678cf6bda651a47bdef20c6797c07dd441d65e32cab0f19f95ce4041aa3ea
4
+ data.tar.gz: bf3c17de28c3c7ca1499af447635f7a43047e05208d24be705796f7a4e5a92d6
5
5
  SHA512:
6
- metadata.gz: e66e03d60d51b38fe1d0c9205ce6b2d063d492241274a41856bd540f1dbf61aebc42bc99aa2b95968241419f48fe607de0e88d091513c0009869a1705559d245
7
- data.tar.gz: dcb5537f539f72f8495da6c7269ef5d45c4b696221fb3302aff5f8ba02600b26e5a2a8cd81025ea3ca607524762bb28217b64a6bc3e1181f349a251a0039be58
6
+ metadata.gz: 1849ad797e75cea6e7524d56ae97330ac6803725b28324c32f398679d270bf7f8e2f2f1badd9defdc362be68869b5cb8187521a55bac21e53c71fb79d023e4db
7
+ data.tar.gz: 153f6f67e25d21d098bf86495a353c75189b895a1f8cfff2cc756f42269d6698cea6da7a40fcbb69d7a685e6d2157856c19487d00e4fb4fde3561e400dcc8089
@@ -0,0 +1,3 @@
1
+ inherit_gem:
2
+ rubocop-govuk:
3
+ - config/default.yml
@@ -1,3 +1,23 @@
1
+ # 2.2.2
2
+
3
+ * Add www.googletagmanager.com and www.gstatic.com to Content Security Policy (https://github.com/alphagov/govuk_app_config/pull/153)
4
+
5
+ # 2.2.1
6
+
7
+ * Fix linting issues (https://github.com/alphagov/govuk_app_config/pull/149)
8
+
9
+ # 2.2.0
10
+
11
+ * Monkey patch `ActionDispatch::DebugExceptions#log_error` so it logs errors on a single line (https://github.com/alphagov/govuk_app_config/pull/147)
12
+
13
+ # 2.1.2
14
+
15
+ * Add missing ActiveRecord rescue_responses (https://github.com/alphagov/govuk_app_config/pull/142)
16
+
17
+ # 2.1.1
18
+
19
+ * Revert using sentry option of rails_report_rescued_exceptions (https://github.com/alphagov/govuk_app_config/pull/140)
20
+
1
21
  # 2.1.0
2
22
 
3
23
  * Stop exceptions rescued by rails from appearing in Sentry (https://github.com/alphagov/govuk_app_config/pull/138)
data/Rakefile CHANGED
@@ -3,4 +3,9 @@ require "rspec/core/rake_task"
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task :default => :spec
6
+ desc "Lint Ruby"
7
+ task :lint do
8
+ sh "bundle exec rubocop --format clang"
9
+ end
10
+
11
+ task default: %i[spec lint]
@@ -1,5 +1,3 @@
1
- # coding: utf-8
2
-
3
1
  lib = File.expand_path("lib", __dir__)
4
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
3
  require "govuk_app_config/version"
@@ -23,15 +21,17 @@ Gem::Specification.new do |spec|
23
21
  spec.require_paths = %w[lib]
24
22
 
25
23
  spec.add_dependency "logstasher", ">= 1.2.2", "< 1.4.0"
26
- spec.add_dependency "sentry-raven", ">= 2.7.1", "< 2.14.0"
24
+ spec.add_dependency "sentry-raven", ">= 2.7.1", "< 3.1.0"
27
25
  spec.add_dependency "statsd-ruby", "~> 1.4.0"
28
- spec.add_dependency "unicorn", ">= 5.4", "< 5.6"
26
+ spec.add_dependency "unicorn", ">= 5.4", "< 5.7"
29
27
 
30
28
  spec.add_development_dependency "bundler", "~> 1.15"
31
29
  spec.add_development_dependency "climate_control"
30
+ spec.add_development_dependency "rack-test", "~> 1.1.0"
32
31
  spec.add_development_dependency "rails", "~> 6"
33
32
  spec.add_development_dependency "rake", "~> 13.0"
34
33
  spec.add_development_dependency "rspec", "~> 3.9.0"
35
34
  spec.add_development_dependency "rspec-its", "~> 1.3.0"
35
+ spec.add_development_dependency "rubocop-govuk"
36
36
  spec.add_development_dependency "webmock"
37
37
  end
@@ -1,5 +1,5 @@
1
1
  GovukError.configure do |config|
2
- config.before_send = Proc.new { |e|
2
+ config.before_send = proc { |e|
3
3
  GovukStatsd.increment("errors_occurred")
4
4
  GovukStatsd.increment("error_types.#{e.class.name.demodulize.underscore}")
5
5
  e
@@ -8,14 +8,34 @@ GovukError.configure do |config|
8
8
  config.silence_ready = !Rails.env.production? if defined?(Rails)
9
9
 
10
10
  config.excluded_exceptions = [
11
- 'ActionController::UnknownAction',
12
- 'ActionDispatch::RemoteIp::IpSpoofAttackError',
13
- 'ActiveJob::DeserializationError',
14
- 'CGI::Session::CookieStore::TamperedWithCookie',
15
- 'GdsApi::HTTPIntermittentServerError',
16
- 'GdsApi::TimedOutException',
17
- 'Mongoid::Errors::DocumentNotFound',
18
- 'Sinatra::NotFound',
11
+ # Default ActionDispatch rescue responses
12
+ "ActionController::RoutingError",
13
+ "AbstractController::ActionNotFound",
14
+ "ActionController::MethodNotAllowed",
15
+ "ActionController::UnknownHttpMethod",
16
+ "ActionController::NotImplemented",
17
+ "ActionController::UnknownFormat",
18
+ "Mime::Type::InvalidMimeType",
19
+ "ActionController::MissingExactTemplate",
20
+ "ActionController::InvalidAuthenticityToken",
21
+ "ActionController::InvalidCrossOriginRequest",
22
+ "ActionDispatch::Http::Parameters::ParseError",
23
+ "ActionController::BadRequest",
24
+ "ActionController::ParameterMissing",
25
+ "Rack::QueryParser::ParameterTypeError",
26
+ "Rack::QueryParser::InvalidParameterError",
27
+ # Default ActiveRecord rescue responses
28
+ "ActiveRecord::RecordNotFound",
29
+ "ActiveRecord::StaleObjectError",
30
+ "ActiveRecord::RecordInvalid",
31
+ "ActiveRecord::RecordNotSaved",
32
+ # Additional items
33
+ "ActiveJob::DeserializationError",
34
+ "CGI::Session::CookieStore::TamperedWithCookie",
35
+ "GdsApi::HTTPIntermittentServerError",
36
+ "GdsApi::TimedOutException",
37
+ "Mongoid::Errors::DocumentNotFound",
38
+ "Sinatra::NotFound",
19
39
  ]
20
40
 
21
41
  # This will exclude exceptions that are triggered by one of the ignored
@@ -23,11 +43,7 @@ GovukError.configure do |config|
23
43
  # Rails will raise a ActionView::Template::Error, instead of the original error.
24
44
  config.inspect_exception_causes_for_exclusion = true
25
45
 
26
- config.transport_failure_callback = Proc.new {
46
+ config.transport_failure_callback = proc {
27
47
  GovukStatsd.increment("error_reports_failed")
28
48
  }
29
-
30
- # This stops exceptions rescued by rails from appearing in Sentry.
31
- # See https://www.rubydoc.info/gems/sentry-raven/1.2.2/Raven%2FConfiguration:rails_report_rescued_exceptions
32
- config.rails_report_rescued_exceptions = false
33
49
  end
@@ -9,15 +9,18 @@ module GovukContentSecurityPolicy
9
9
  # - https://cspvalidator.org
10
10
 
11
11
  GOVUK_DOMAINS = [
12
- '*.publishing.service.gov.uk',
12
+ "*.publishing.service.gov.uk",
13
13
  "*.#{ENV['GOVUK_APP_DOMAIN_EXTERNAL'] || ENV['GOVUK_APP_DOMAIN'] || 'dev.gov.uk'}",
14
14
  "www.gov.uk",
15
- "*.dev.gov.uk"
15
+ "*.dev.gov.uk",
16
16
  ].uniq.freeze
17
17
 
18
- GOOGLE_ANALYTICS_DOMAINS = %w(www.google-analytics.com
18
+ GOOGLE_ANALYTICS_DOMAINS = %w[www.google-analytics.com
19
19
  ssl.google-analytics.com
20
- stats.g.doubleclick.net).freeze
20
+ stats.g.doubleclick.net
21
+ www.googletagmanager.com].freeze
22
+
23
+ GOOGLE_STATIC_DOMAINS = %w[www.gstatic.com].freeze
21
24
 
22
25
  def self.build_policy(policy)
23
26
  # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/default-src
@@ -35,6 +38,7 @@ module GovukContentSecurityPolicy
35
38
  policy.script_src :self,
36
39
  *GOVUK_DOMAINS,
37
40
  *GOOGLE_ANALYTICS_DOMAINS,
41
+ *GOOGLE_STATIC_DOMAINS,
38
42
  # Allow JSONP call to Verify to check whether the user is logged in
39
43
  "www.signin.service.gov.uk",
40
44
  # Allow YouTube Embeds (Govspeak turns YouTube links into embeds)
@@ -51,6 +55,7 @@ module GovukContentSecurityPolicy
51
55
  # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src
52
56
  policy.style_src :self,
53
57
  *GOVUK_DOMAINS,
58
+ *GOOGLE_STATIC_DOMAINS,
54
59
  # We use the `style=""` attribute on some HTML elements
55
60
  :unsafe_inline
56
61
 
@@ -13,8 +13,8 @@ module GovukHealthcheck
13
13
  proc do
14
14
  [
15
15
  200,
16
- {"Content-Type" => "application/json"},
17
- [JSON.dump(healthcheck(checks))]
16
+ { "Content-Type" => "application/json" },
17
+ [JSON.dump(healthcheck(checks))],
18
18
  ]
19
19
  end
20
20
  end
@@ -7,7 +7,7 @@ module GovukHealthcheck
7
7
  def status
8
8
  ::ActiveRecord::Base.connection
9
9
  OK
10
- rescue StandardError => e
10
+ rescue StandardError
11
11
  CRITICAL
12
12
  end
13
13
  end
@@ -43,7 +43,7 @@ module GovukHealthcheck
43
43
  end
44
44
 
45
45
  def status?(status)
46
- component_statuses.values.any? {|s| s[:status] == status }
46
+ component_statuses.values.any? { |s| s[:status] == status }
47
47
  end
48
48
 
49
49
  def build_component_status(check)
@@ -41,7 +41,7 @@ module GovukHealthcheck
41
41
  thresholds: {
42
42
  critical: critical_threshold(queue: name),
43
43
  warning: warning_threshold(queue: name),
44
- }.select { |_, val| !(val.to_f.infinite? || val.to_f.nan?) },
44
+ }.reject { |_, val| val.to_f.infinite? || val.to_f.nan? },
45
45
  }
46
46
  end,
47
47
  }
@@ -51,11 +51,11 @@ module GovukHealthcheck
51
51
  raise "This method must be overriden to be a hash of queue names and data."
52
52
  end
53
53
 
54
- def critical_threshold(queue:)
54
+ def critical_threshold(queue:) # rubocop:disable Lint/UnusedMethodArgument
55
55
  raise "This method must be overriden to be the critical threshold."
56
56
  end
57
57
 
58
- def warning_threshold(queue:)
58
+ def warning_threshold(queue:) # rubocop:disable Lint/UnusedMethodArgument
59
59
  raise "This method must be overriden to be the warning threshold."
60
60
  end
61
61
  end
@@ -6,7 +6,6 @@ module GovukHealthcheck
6
6
 
7
7
  def status
8
8
  Sidekiq.redis_info ? OK : CRITICAL
9
-
10
9
  rescue StandardError
11
10
  # One would expect a Redis::BaseConnectionError, but this should be
12
11
  # critical if any exception is raised when making a call to redis.
@@ -1,5 +1,6 @@
1
- require 'logstasher'
2
- require 'action_controller'
1
+ require "logstasher"
2
+ require "action_controller"
3
+ require_relative "rails_ext/action_dispatch/debug_exceptions"
3
4
 
4
5
  module GovukLogging
5
6
  def self.configure
@@ -13,8 +14,11 @@ module GovukLogging
13
14
  #
14
15
  # To resolve this we've directed stdout to stderr, to cover any Rails
15
16
  # writing. This frees up the normal stdout for the logstasher logs.
17
+
18
+ # rubocop:disable Style/GlobalVars
16
19
  $real_stdout = $stdout.clone
17
20
  $stdout.reopen($stderr)
21
+ # rubocop:enable Style/GlobalVars
18
22
 
19
23
  # Send Rails' logs to STDERR because they're not JSON formatted.
20
24
  Rails.logger = ActiveSupport::TaggedLogging.new(Logger.new($stderr, level: Rails.logger.level))
@@ -22,7 +26,7 @@ module GovukLogging
22
26
  # Custom that will be added to the Rails request logs
23
27
  LogStasher.add_custom_fields do |fields|
24
28
  # Mirrors Nginx request logging, e.g GET /path/here HTTP/1.1
25
- fields[:request] = "#{request.request_method} #{request.fullpath} #{request.headers["SERVER_PROTOCOL"]}"
29
+ fields[:request] = "#{request.request_method} #{request.fullpath} #{request.headers['SERVER_PROTOCOL']}"
26
30
 
27
31
  # Pass request Id to logging
28
32
  fields[:govuk_request_id] = request.headers["GOVUK-Request-Id"]
@@ -44,13 +48,13 @@ module GovukLogging
44
48
  Rails.application.config.logstasher.job_enabled = false
45
49
 
46
50
  Rails.application.config.logstasher.logger = Logger.new(
47
- $real_stdout,
51
+ $real_stdout, # rubocop:disable Style/GlobalVars
48
52
  level: Rails.logger.level,
49
53
  formatter: proc { |_severity, _datetime, _progname, msg|
50
- "#{String === msg ? msg : msg.inspect}\n"
51
- }
54
+ "#{msg.is_a?(String) ? msg : msg.inspect}\n"
55
+ },
52
56
  )
53
- Rails.application.config.logstasher.supress_app_log = true
57
+ Rails.application.config.logstasher.suppress_app_log = true
54
58
 
55
59
  if defined?(GdsApi::Base)
56
60
  GdsApi::Base.default_options ||= {}
@@ -61,5 +65,7 @@ module GovukLogging
61
65
  GdsApi::Base.default_options[:logger] =
62
66
  Rails.application.config.logstasher.logger
63
67
  end
68
+
69
+ RailsExt::ActionDispatch.monkey_patch_log_error if RailsExt::ActionDispatch.should_monkey_patch_log_error?
64
70
  end
65
71
  end
@@ -4,10 +4,10 @@ require "forwardable"
4
4
  module GovukStatsd
5
5
  extend SingleForwardable
6
6
  def_delegators :client, :increment, :decrement, :count, :time, :timing,
7
- :gauge, :set, :batch
7
+ :gauge, :set, :batch
8
8
 
9
9
  def self.client
10
- @statsd_client ||= begin
10
+ @client ||= begin
11
11
  statsd_client = ::Statsd.new("localhost")
12
12
  statsd_client.namespace = ENV["GOVUK_STATSD_PREFIX"].to_s
13
13
  statsd_client
@@ -9,8 +9,9 @@ module GovukUnicorn
9
9
  config.stderr_path "#{ENV['GOVUK_APP_LOGROOT']}/app.err.log"
10
10
  end
11
11
 
12
- config.before_exec do |server|
12
+ config.before_exec do |_server|
13
13
  next unless ENV["GOVUK_APP_ROOT"]
14
+
14
15
  ENV["BUNDLE_GEMFILE"] = "#{ENV['GOVUK_APP_ROOT']}/Gemfile"
15
16
  end
16
17
 
@@ -0,0 +1,52 @@
1
+ require "action_dispatch/middleware/debug_exceptions"
2
+
3
+ module GovukLogging
4
+ module RailsExt
5
+ module ActionDispatch
6
+ def self.should_monkey_patch_log_error?(clazz = ::ActionDispatch::DebugExceptions)
7
+ empty_instance = clazz.new nil
8
+ target_method = empty_instance.method :log_error
9
+
10
+ expected_parameters = [%i[req request], %i[req wrapper]]
11
+ actual_parameters = target_method.parameters
12
+
13
+ should_monkey_patch = actual_parameters == expected_parameters
14
+
15
+ unless should_monkey_patch
16
+ Rails.logger.warn "Refused to monkey patch ::ActionDispatch::DebugExceptions#log_error - " \
17
+ "signatures do not match. " \
18
+ "Expected #{expected_parameters}, but got #{actual_parameters}"
19
+ end
20
+
21
+ should_monkey_patch
22
+ rescue StandardError => e
23
+ Rails.logger.warn "Failed to detect whether to monkey patch " \
24
+ "::ActionDispatch::DebugExceptions#log_error - #{e.inspect}"
25
+ false
26
+ end
27
+
28
+ def self.monkey_patch_log_error(clazz = ::ActionDispatch::DebugExceptions)
29
+ clazz.class_eval do
30
+ private
31
+
32
+ def log_error(request, wrapper)
33
+ logger = logger(request)
34
+
35
+ return unless logger
36
+
37
+ exception = wrapper.exception
38
+
39
+ trace = wrapper.application_trace
40
+ trace = wrapper.framework_trace if trace.empty?
41
+
42
+ logger.fatal({
43
+ exception_class: exception.class.to_s,
44
+ exception_message: exception.message,
45
+ stacktrace: trace,
46
+ }.to_json)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,3 +1,3 @@
1
1
  module GovukAppConfig
2
- VERSION = "2.1.0"
2
+ VERSION = "2.2.2".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: govuk_app_config
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - GOV.UK Dev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-09 00:00:00.000000000 Z
11
+ date: 2020-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logstasher
@@ -39,7 +39,7 @@ dependencies:
39
39
  version: 2.7.1
40
40
  - - "<"
41
41
  - !ruby/object:Gem::Version
42
- version: 2.14.0
42
+ version: 3.1.0
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -49,7 +49,7 @@ dependencies:
49
49
  version: 2.7.1
50
50
  - - "<"
51
51
  - !ruby/object:Gem::Version
52
- version: 2.14.0
52
+ version: 3.1.0
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: statsd-ruby
55
55
  requirement: !ruby/object:Gem::Requirement
@@ -73,7 +73,7 @@ dependencies:
73
73
  version: '5.4'
74
74
  - - "<"
75
75
  - !ruby/object:Gem::Version
76
- version: '5.6'
76
+ version: '5.7'
77
77
  type: :runtime
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
@@ -83,7 +83,7 @@ dependencies:
83
83
  version: '5.4'
84
84
  - - "<"
85
85
  - !ruby/object:Gem::Version
86
- version: '5.6'
86
+ version: '5.7'
87
87
  - !ruby/object:Gem::Dependency
88
88
  name: bundler
89
89
  requirement: !ruby/object:Gem::Requirement
@@ -112,6 +112,20 @@ dependencies:
112
112
  - - ">="
113
113
  - !ruby/object:Gem::Version
114
114
  version: '0'
115
+ - !ruby/object:Gem::Dependency
116
+ name: rack-test
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: 1.1.0
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: 1.1.0
115
129
  - !ruby/object:Gem::Dependency
116
130
  name: rails
117
131
  requirement: !ruby/object:Gem::Requirement
@@ -168,6 +182,20 @@ dependencies:
168
182
  - - "~>"
169
183
  - !ruby/object:Gem::Version
170
184
  version: 1.3.0
185
+ - !ruby/object:Gem::Dependency
186
+ name: rubocop-govuk
187
+ requirement: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - ">="
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ type: :development
193
+ prerelease: false
194
+ version_requirements: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - ">="
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
171
199
  - !ruby/object:Gem::Dependency
172
200
  name: webmock
173
201
  requirement: !ruby/object:Gem::Requirement
@@ -191,6 +219,7 @@ extra_rdoc_files: []
191
219
  files:
192
220
  - ".gitignore"
193
221
  - ".rspec"
222
+ - ".rubocop.yml"
194
223
  - ".ruby-version"
195
224
  - CHANGELOG.md
196
225
  - Gemfile
@@ -218,6 +247,7 @@ files:
218
247
  - lib/govuk_app_config/govuk_logging.rb
219
248
  - lib/govuk_app_config/govuk_statsd.rb
220
249
  - lib/govuk_app_config/govuk_unicorn.rb
250
+ - lib/govuk_app_config/rails_ext/action_dispatch/debug_exceptions.rb
221
251
  - lib/govuk_app_config/railtie.rb
222
252
  - lib/govuk_app_config/version.rb
223
253
  homepage: https://github.com/alphagov/govuk_app_config