sentry-sanitizer 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 17e8a5a1dcd6a12efae12b9f326fe9c1df140f02428782a6f6ecb6c102bda038
4
- data.tar.gz: 342037b0b4f1bd0e45e4ae5b9fe3698914275320bc45162bcd69d03236a3b8cf
3
+ metadata.gz: fbeef1bae28044c2da929cc9ea538ec08982a55ce2a36ceb556ee455cad34e51
4
+ data.tar.gz: 0fb66fff71d7b78a01f08cefa08cb809ec3cb29f52d36704b71db038885e81a5
5
5
  SHA512:
6
- metadata.gz: 39b42429f3b7ee5783a29ebf796220167370d4038a48bd19c1a6809d23aace59dddf3c2498e4777edccf0badb1784f0250196e413347cea77817923fa79b5ed2
7
- data.tar.gz: cb70a216f92b749b68acdb158277277d4d9d0e0b19966b1aff8275c5456794025291b3730b64c91e6b31df89d5f2af077b3aa057d84ac67bdbb89168cf1555f9
6
+ metadata.gz: 8020e375a0c1c5ae217c51bd63e5ad3dc47be4359f70f2e9eaed9ed9ff258de8c6df33a076e24e783f31874d695d3ce2a5e63a95388b47803c311699c3f39008
7
+ data.tar.gz: 7f541bae3f4cadd941cfd99eb3b669e604619baea6b2286fdb348f7cc4666ccbbef5812c3432ebdfc235f65b24e0fb98bb63662346bd8e411c6323fa57f400a2
@@ -10,11 +10,12 @@ jobs:
10
10
  strategy:
11
11
  matrix:
12
12
  include:
13
- - { ruby_version: 2.5 }
14
13
  - { ruby_version: 2.7 }
15
14
  - { ruby_version: 3.0 }
16
15
  - { ruby_version: 3.1 }
17
16
  - { ruby_version: 3.2 }
17
+ - { ruby_version: 3.3 }
18
+ - { ruby_version: 3.4 }
18
19
  - { ruby_version: jruby }
19
20
  steps:
20
21
  - uses: actions/checkout@v1
@@ -10,11 +10,12 @@ jobs:
10
10
  strategy:
11
11
  matrix:
12
12
  include:
13
- - { ruby_version: 2.5 }
14
13
  - { ruby_version: 2.7 }
15
14
  - { ruby_version: 3.0 }
16
15
  - { ruby_version: 3.1 }
17
16
  - { ruby_version: 3.2 }
17
+ - { ruby_version: 3.3 }
18
+ - { ruby_version: 3.4 }
18
19
  - { ruby_version: jruby }
19
20
  steps:
20
21
  - uses: actions/checkout@v1
@@ -34,5 +34,5 @@ jobs:
34
34
  env:
35
35
  COVERALLS_SERVICE_NUMBER: ${{ github.sha }}
36
36
  with:
37
- carryforward: "ruby-2.5,ruby-2.6,ruby-2.7,ruby-3.0,ruby-3.1,ruby-jruby"
37
+ carryforward: "ruby-2.7,ruby-3.0,ruby-3.1,ruby-3.2,ruby-3.3,ruby-3.4,ruby-jruby"
38
38
  parallel-finished: true
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.8.0
4
+
5
+ - Add `breadcrumbs.json_data_fields` configuration option [#18](https://github.com/mrexox/sentry-sanitizer/pull/18)
6
+
3
7
  ## 0.7.0
4
8
 
5
9
  - fix: filter extra even without request [#14](https://github.com/mrexox/sentry-sanitizer/pull/14)
data/Gemfile CHANGED
@@ -7,10 +7,11 @@ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
7
7
  # Specify your gem's dependencies in sentry-sanitizer.gemspec
8
8
  gemspec
9
9
 
10
+ gem "base64"
10
11
  gem "rubocop", "~> 1.28.2"
11
12
  gem "simplecov", require: false, group: :test
12
13
 
13
- gem "bundler", ">= 1.17"
14
+ gem "bundler", ">= 2.3"
14
15
  gem "rack"
15
- gem "rake", "~> 10.0"
16
+ gem "rake", "~> 12"
16
17
  gem "rspec", "~> 3.0"
data/Gemfile.lock CHANGED
@@ -1,25 +1,29 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sentry-sanitizer (0.7.0)
5
- sentry-ruby (~> 5.3)
4
+ sentry-sanitizer (0.8.0)
5
+ sentry-ruby (>= 5.3, < 7.0.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- ast (2.4.2)
11
- bigdecimal (3.1.9)
10
+ ast (2.4.3)
11
+ base64 (0.3.0)
12
+ bigdecimal (3.3.1)
12
13
  concurrent-ruby (1.3.5)
13
14
  diff-lcs (1.5.0)
14
15
  docile (1.4.0)
15
- parallel (1.23.0)
16
- parser (3.2.2.1)
16
+ parallel (1.27.0)
17
+ parser (3.3.10.0)
17
18
  ast (~> 2.4.1)
19
+ racc
20
+ prism (1.6.0)
21
+ racc (1.8.1)
18
22
  rack (2.2.3.1)
19
23
  rainbow (3.1.1)
20
- rake (10.5.0)
21
- regexp_parser (2.8.0)
22
- rexml (3.2.5)
24
+ rake (12.3.3)
25
+ regexp_parser (2.11.3)
26
+ rexml (3.4.4)
23
27
  rspec (3.11.0)
24
28
  rspec-core (~> 3.11.0)
25
29
  rspec-expectations (~> 3.11.0)
@@ -42,25 +46,27 @@ GEM
42
46
  rubocop-ast (>= 1.17.0, < 2.0)
43
47
  ruby-progressbar (~> 1.7)
44
48
  unicode-display_width (>= 1.4.0, < 3.0)
45
- rubocop-ast (1.29.0)
46
- parser (>= 3.2.1.0)
49
+ rubocop-ast (1.47.1)
50
+ parser (>= 3.3.7.2)
51
+ prism (~> 1.4)
47
52
  ruby-progressbar (1.13.0)
48
- sentry-ruby (5.22.2)
53
+ sentry-ruby (6.0.0)
49
54
  bigdecimal
50
55
  concurrent-ruby (~> 1.0, >= 1.0.2)
51
56
  simplecov (0.18.5)
52
57
  docile (~> 1.1)
53
58
  simplecov-html (~> 0.11)
54
59
  simplecov-html (0.12.3)
55
- unicode-display_width (2.4.2)
60
+ unicode-display_width (2.6.0)
56
61
 
57
62
  PLATFORMS
58
63
  ruby
59
64
 
60
65
  DEPENDENCIES
61
- bundler (>= 1.17)
66
+ base64
67
+ bundler (>= 2.3)
62
68
  rack
63
- rake (~> 10.0)
69
+ rake (~> 12)
64
70
  rspec (~> 3.0)
65
71
  rubocop (~> 1.28.2)
66
72
  sentry-sanitizer!
data/README.md CHANGED
@@ -59,6 +59,9 @@ Sentry.init do |config|
59
59
  # You can sanitize query string params for GET requests
60
60
  config.sanitize.query_string = true
61
61
 
62
+ # Sanitize breadcrumbs data[:body] payload (Setry::Net:HTTP)
63
+ config.sanitize.breadcrumbs.json_data_fields = [:body]
64
+
62
65
  # ...
63
66
  end
64
67
  ```
data/Rakefile CHANGED
@@ -6,3 +6,4 @@ require "rspec/core/rake_task"
6
6
  RSpec::Core::RakeTask.new(:spec)
7
7
 
8
8
  task default: :spec
9
+ task test: :spec
data/bin/bundle ADDED
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'bundle' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "rubygems"
12
+
13
+ m = Module.new do
14
+ module_function
15
+
16
+ def invoked_as_script?
17
+ File.expand_path($0) == File.expand_path(__FILE__)
18
+ end
19
+
20
+ def env_var_version
21
+ ENV["BUNDLER_VERSION"]
22
+ end
23
+
24
+ def cli_arg_version
25
+ return unless invoked_as_script? # don't want to hijack other binstubs
26
+ return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update`
27
+ bundler_version = nil
28
+ update_index = nil
29
+ ARGV.each_with_index do |a, i|
30
+ if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN
31
+ bundler_version = a
32
+ end
33
+ next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/
34
+ bundler_version = $1
35
+ update_index = i
36
+ end
37
+ bundler_version
38
+ end
39
+
40
+ def gemfile
41
+ gemfile = ENV["BUNDLE_GEMFILE"]
42
+ return gemfile if gemfile && !gemfile.empty?
43
+
44
+ File.expand_path("../Gemfile", __dir__)
45
+ end
46
+
47
+ def lockfile
48
+ lockfile =
49
+ case File.basename(gemfile)
50
+ when "gems.rb" then gemfile.sub(/\.rb$/, gemfile)
51
+ else "#{gemfile}.lock"
52
+ end
53
+ File.expand_path(lockfile)
54
+ end
55
+
56
+ def lockfile_version
57
+ return unless File.file?(lockfile)
58
+ lockfile_contents = File.read(lockfile)
59
+ return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/
60
+ Regexp.last_match(1)
61
+ end
62
+
63
+ def bundler_requirement
64
+ @bundler_requirement ||=
65
+ env_var_version || cli_arg_version ||
66
+ bundler_requirement_for(lockfile_version)
67
+ end
68
+
69
+ def bundler_requirement_for(version)
70
+ return "#{Gem::Requirement.default}.a" unless version
71
+
72
+ bundler_gem_version = Gem::Version.new(version)
73
+
74
+ requirement = bundler_gem_version.approximate_recommendation
75
+
76
+ return requirement unless Gem.rubygems_version < Gem::Version.new("2.7.0")
77
+
78
+ requirement += ".a" if bundler_gem_version.prerelease?
79
+
80
+ requirement
81
+ end
82
+
83
+ def load_bundler!
84
+ ENV["BUNDLE_GEMFILE"] ||= gemfile
85
+
86
+ activate_bundler
87
+ end
88
+
89
+ def activate_bundler
90
+ gem_error = activation_error_handling do
91
+ gem "bundler", bundler_requirement
92
+ end
93
+ return if gem_error.nil?
94
+ require_error = activation_error_handling do
95
+ require "bundler/version"
96
+ end
97
+ return if require_error.nil? && Gem::Requirement.new(bundler_requirement).satisfied_by?(Gem::Version.new(Bundler::VERSION))
98
+ warn "Activating bundler (#{bundler_requirement}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_requirement}'`"
99
+ exit 42
100
+ end
101
+
102
+ def activation_error_handling
103
+ yield
104
+ nil
105
+ rescue StandardError, LoadError => e
106
+ e
107
+ end
108
+ end
109
+
110
+ m.load_bundler!
111
+
112
+ if m.invoked_as_script?
113
+ load Gem.bin_path("bundler", "bundle")
114
+ end
data/bin/rake ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rake' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
12
+
13
+ bundle_binstub = File.expand_path("bundle", __dir__)
14
+
15
+ if File.file?(bundle_binstub)
16
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
17
+ load(bundle_binstub)
18
+ else
19
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
20
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
21
+ end
22
+ end
23
+
24
+ require "rubygems"
25
+ require "bundler/setup"
26
+
27
+ load Gem.bin_path("rake", "rake")
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "json"
4
+
3
5
  module Sentry
4
6
  module Sanitizer
5
7
  class Cleaner
@@ -17,46 +19,64 @@ module Sentry
17
19
  @do_cookies = config.cookies || false
18
20
  @do_query_string = config.query_string || false
19
21
  @mask = config.mask || DEFAULT_MASK
22
+ @breadcrumbs_json_data_fields = config.breadcrumbs.json_data_fields || []
20
23
  end
21
24
 
22
25
  def call(event)
23
26
  case event
24
27
  when Sentry::Event
25
- sanitize(event, :event)
28
+ sanitize_event!(event)
26
29
  when Hash
27
- sanitize(event, :hash)
30
+ sanitize_hash!(event)
31
+ when Sentry::Breadcrumb
32
+ sanitize_breadcrumb!(event)
28
33
  end
29
34
  end
30
35
 
31
- def sanitize(event, type) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
32
- case type
33
- when :event
34
- if event.request
35
- event.request.data = sanitize_data(event.request.data)
36
- event.request.headers = sanitize_headers(event.request.headers)
37
- event.request.cookies = sanitize_cookies(event.request.cookies)
38
- event.request.query_string = sanitize_query_string(event.request.query_string)
39
- end
40
- event.extra = sanitize_data(event.extra)
41
- when :hash
42
- if event["request"]
43
- event["request"]["data"] = sanitize_data(event["request"]["data"])
44
- event["request"]["headers"] = sanitize_headers(event["request"]["headers"])
45
- event["request"]["cookies"] = sanitize_cookies(event["request"]["cookies"])
46
- event["request"]["query_string"] = sanitize_query_string(event["request"]["query_string"])
47
- elsif event[:request]
48
- event[:request][:data] = sanitize_data(event[:request][:data])
49
- event[:request][:headers] = sanitize_headers(event[:request][:headers])
50
- event[:request][:cookies] = sanitize_cookies(event[:request][:cookies])
51
- event[:request][:query_string] = sanitize_query_string(event[:request][:query_string])
52
- end
36
+ def sanitize_event!(event)
37
+ if event.request
38
+ event.request.data = sanitize_data(event.request.data)
39
+ event.request.headers = sanitize_headers(event.request.headers)
40
+ event.request.cookies = sanitize_cookies(event.request.cookies)
41
+ event.request.query_string = sanitize_query_string(event.request.query_string)
42
+ end
43
+ event.extra = sanitize_data(event.extra)
44
+ end
53
45
 
54
- if event["extra"]
55
- event["extra"] = sanitize_data(event["extra"])
56
- elsif event[:extra]
57
- event[:extra] = sanitize_data(event[:extra])
58
- end
46
+ def sanitize_hash!(event)
47
+ if event["request"]
48
+ event["request"]["data"] = sanitize_data(event["request"]["data"])
49
+ event["request"]["headers"] = sanitize_headers(event["request"]["headers"])
50
+ event["request"]["cookies"] = sanitize_cookies(event["request"]["cookies"])
51
+ event["request"]["query_string"] = sanitize_query_string(event["request"]["query_string"])
52
+ elsif event[:request]
53
+ event[:request][:data] = sanitize_data(event[:request][:data])
54
+ event[:request][:headers] = sanitize_headers(event[:request][:headers])
55
+ event[:request][:cookies] = sanitize_cookies(event[:request][:cookies])
56
+ event[:request][:query_string] = sanitize_query_string(event[:request][:query_string])
57
+ end
58
+
59
+ if event["extra"]
60
+ event["extra"] = sanitize_data(event["extra"])
61
+ elsif event[:extra]
62
+ event[:extra] = sanitize_data(event[:extra])
63
+ end
64
+ end
65
+
66
+ def sanitize_breadcrumb!(breadcrumb)
67
+ return unless breadcrumbs_json_data_fields
68
+ return unless breadcrumbs_json_data_fields.size.positive?
69
+ return unless breadcrumb.data
70
+
71
+ breadcrumbs_json_data_fields.each do |field|
72
+ next unless breadcrumb.data.key?(field)
73
+
74
+ json_data = JSON.parse(breadcrumb.data[field])
75
+
76
+ breadcrumb.data[field] = JSON.dump(sanitize_data(json_data))
59
77
  end
78
+ rescue JSON::ParserError
79
+ # ignore
60
80
  end
61
81
 
62
82
  def sanitize_data(hash)
@@ -72,7 +92,8 @@ module Sentry
72
92
  :http_headers,
73
93
  :do_cookies,
74
94
  :do_query_string,
75
- :mask
95
+ :mask,
96
+ :breadcrumbs_json_data_fields
76
97
 
77
98
  # Sanitize specified headers
78
99
  def sanitize_headers(headers)
@@ -21,11 +21,27 @@ module Sentry
21
21
 
22
22
  event
23
23
  }
24
+
25
+ self.before_breadcrumb = lambda { |breadcrumb, _hint|
26
+ Sentry::Sanitizer::Cleaner.new(Sentry.configuration.sanitize).call(breadcrumb)
27
+
28
+ breadcrumb
29
+ }
24
30
  end
25
31
  end
26
32
 
27
33
  module Sanitizer
28
34
  class Configuration
35
+ class Breadcrumbs
36
+ attr_reader :json_data_fields
37
+
38
+ def json_data_fields=(fields)
39
+ raise ArgumentError, "json_data_fields must be Array of Symbol" unless fields.is_a? Array
40
+
41
+ @json_data_fields = fields
42
+ end
43
+ end
44
+
29
45
  attr_reader :fields,
30
46
  :http_headers,
31
47
  :cookies,
@@ -37,10 +53,15 @@ module Sentry
37
53
  fields,
38
54
  http_headers,
39
55
  cookies,
40
- query_string
56
+ query_string,
57
+ @breadcrumbs
41
58
  ].any? { |setting| !setting.nil? }
42
59
  end
43
60
 
61
+ def breadcrumbs
62
+ @breadcrumbs ||= Breadcrumbs.new
63
+ end
64
+
44
65
  def fields=(fields)
45
66
  raise ArgumentError, "sanitize_fields must be array" unless fields.is_a? Array
46
67
 
@@ -3,12 +3,12 @@
3
3
  module Sentry
4
4
  module Sanitizer
5
5
  module ConfigurationMixin
6
- # Allow adding multiple hooks for this extension
6
+ # Allow adding multiple hooks to `before_send`, so user hooks are not ignored.
7
7
  #
8
- # @param [nil, false, #call] value
8
+ # @param [nil, #call] value
9
9
  #
10
10
  def before_send=(value)
11
- raise ArgumentError, "before_send must be callable (or false to disable)" unless value.nil? || value == false || value.respond_to?(:call)
11
+ raise ArgumentError, "before_send must be callable (or nil to disable)" unless value.nil? || value == false || value.respond_to?(:call)
12
12
 
13
13
  return unless value
14
14
 
@@ -23,6 +23,28 @@ module Sentry
23
23
  event
24
24
  }
25
25
  end
26
+
27
+ # Allow adding multiple hooks to `before_breadcrumb`, so user hooks are not ignored.
28
+ #
29
+ # @param [nil, #call] value
30
+ #
31
+ def before_breadcrumb=(value) # rubocop:disable Metrics/CyclomaticComplexity
32
+ raise ArgumentError, "before_breadcrumb must be callable (or nil to disable)" unless value.nil? || value == false || value.respond_to?(:call)
33
+
34
+ return unless value
35
+
36
+ @before_breadcrumb_hook_list ||= []
37
+ @before_breadcrumb_hook_list << value
38
+
39
+ @before_breadcrumb = lambda { |breadcrumb, hint|
40
+ @before_breadcrumb_hook_list.each do |hook|
41
+ breadcrumb = hook.call(breadcrumb, hint)
42
+ break unless breadcrumb
43
+ end
44
+
45
+ breadcrumb
46
+ }
47
+ end
26
48
  end
27
49
  end
28
50
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sentry
4
4
  module Sanitizer
5
- VERSION = "0.7.0"
5
+ VERSION = "0.8.0"
6
6
  end
7
7
  end
@@ -27,6 +27,6 @@ Gem::Specification.new do |spec|
27
27
 
28
28
  spec.require_paths = ["lib"]
29
29
 
30
- spec.add_runtime_dependency "sentry-ruby", "~> 5.3"
30
+ spec.add_runtime_dependency "sentry-ruby", ">= 5.3", "< 7.0.0"
31
31
  spec.metadata["rubygems_mfa_required"] = "true"
32
32
  end
metadata CHANGED
@@ -1,29 +1,34 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sentry-sanitizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Valentine Kiselev
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-01-27 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: sentry-ruby
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
- - - "~>"
16
+ - - ">="
18
17
  - !ruby/object:Gem::Version
19
18
  version: '5.3'
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: 7.0.0
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
23
25
  requirements:
24
- - - "~>"
26
+ - - ">="
25
27
  - !ruby/object:Gem::Version
26
28
  version: '5.3'
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: 7.0.0
27
32
  description: Add missing sanitizing support for sentry-ruby (previous sentry-raven)
28
33
  email:
29
34
  - mrexox@outlook.com
@@ -44,7 +49,9 @@ files:
44
49
  - LICENSE.txt
45
50
  - README.md
46
51
  - Rakefile
52
+ - bin/bundle
47
53
  - bin/console
54
+ - bin/rake
48
55
  - bin/setup
49
56
  - lefthook.yml
50
57
  - lib/sentry-sanitizer.rb
@@ -63,7 +70,6 @@ metadata:
63
70
  source_code_uri: https://github.com/mrexox/sentry-sanitizer
64
71
  changelog_uri: https://github.com/mrexox/sentry-sanitizer
65
72
  rubygems_mfa_required: 'true'
66
- post_install_message:
67
73
  rdoc_options: []
68
74
  require_paths:
69
75
  - lib
@@ -78,8 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
84
  - !ruby/object:Gem::Version
79
85
  version: '0'
80
86
  requirements: []
81
- rubygems_version: 3.4.19
82
- signing_key:
87
+ rubygems_version: 3.6.9
83
88
  specification_version: 4
84
89
  summary: Sanitizing middleware for sentry-ruby gem
85
90
  test_files: []