rollbar 2.19.1 → 2.27.1
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 +5 -5
- data/.github/pull_request_template.md +25 -0
- data/.rubocop.yml +168 -0
- data/.travis.yml +63 -34
- data/Appraisals +10 -10
- data/Gemfile +35 -14
- data/README.md +5 -2
- data/Rakefile +0 -0
- data/data/rollbar.snippet.js +1 -1
- data/docs/configuration.md +17 -0
- data/gemfiles/rails30.gemfile +10 -10
- data/gemfiles/rails31.gemfile +10 -9
- data/gemfiles/rails32.gemfile +10 -9
- data/gemfiles/rails40.gemfile +10 -9
- data/gemfiles/rails41.gemfile +10 -9
- data/gemfiles/rails42.gemfile +12 -9
- data/gemfiles/rails50.gemfile +21 -14
- data/gemfiles/rails51.gemfile +21 -14
- data/gemfiles/rails52.gemfile +15 -12
- data/gemfiles/rails60.gemfile +67 -0
- data/lib/generators/rollbar/rollbar_generator.rb +1 -1
- data/lib/rails/rollbar_runner.rb +4 -2
- data/lib/rollbar/capistrano.rb +1 -1
- data/lib/rollbar/capistrano3.rb +6 -3
- data/lib/rollbar/capistrano_tasks.rb +29 -21
- data/lib/rollbar/configuration.rb +86 -16
- data/lib/rollbar/delay/girl_friday.rb +4 -8
- data/lib/rollbar/delay/resque.rb +3 -6
- data/lib/rollbar/delay/sidekiq.rb +4 -10
- data/lib/rollbar/delay/sucker_punch.rb +16 -19
- data/lib/rollbar/delay/thread.rb +16 -2
- data/lib/rollbar/deploy.rb +52 -29
- data/lib/rollbar/encoding/encoder.rb +17 -10
- data/lib/rollbar/exception_reporter.rb +19 -5
- data/lib/rollbar/item/backtrace.rb +13 -3
- data/lib/rollbar/item/frame.rb +9 -1
- data/lib/rollbar/item/locals.rb +100 -0
- data/lib/rollbar/item.rb +56 -17
- data/lib/rollbar/json.rb +6 -51
- data/lib/rollbar/language_support.rb +4 -20
- data/lib/rollbar/lazy_store.rb +5 -5
- data/lib/rollbar/logger.rb +1 -0
- data/lib/rollbar/logger_proxy.rb +6 -2
- data/lib/rollbar/middleware/js.rb +28 -18
- data/lib/rollbar/middleware/rack.rb +4 -1
- data/lib/rollbar/middleware/rails/rollbar.rb +10 -1
- data/lib/rollbar/notifier/trace_with_bindings.rb +65 -0
- data/lib/rollbar/notifier.rb +225 -89
- data/lib/rollbar/plugin.rb +54 -6
- data/lib/rollbar/plugins/active_job.rb +6 -2
- data/lib/rollbar/plugins/basic_socket.rb +21 -6
- data/lib/rollbar/plugins/delayed_job/job_data.rb +3 -3
- data/lib/rollbar/plugins/delayed_job/plugin.rb +13 -3
- data/lib/rollbar/plugins/error_context.rb +11 -0
- data/lib/rollbar/plugins/goalie.rb +11 -3
- data/lib/rollbar/plugins/rails/controller_methods.rb +15 -3
- data/lib/rollbar/plugins/rake.rb +2 -2
- data/lib/rollbar/plugins/sidekiq/plugin.rb +5 -4
- data/lib/rollbar/plugins.rb +7 -1
- data/lib/rollbar/rake_tasks.rb +4 -148
- data/lib/rollbar/request_data_extractor.rb +31 -21
- data/lib/rollbar/rollbar_test.rb +36 -0
- data/lib/rollbar/scrubbers/params.rb +19 -18
- data/lib/rollbar/scrubbers/url.rb +18 -9
- data/lib/rollbar/scrubbers.rb +3 -3
- data/lib/rollbar/truncation/frames_strategy.rb +1 -1
- data/lib/rollbar/truncation/min_body_strategy.rb +2 -3
- data/lib/rollbar/truncation/mixin.rb +1 -1
- data/lib/rollbar/truncation/remove_any_key_strategy.rb +123 -0
- data/lib/rollbar/truncation/remove_extra_strategy.rb +35 -0
- data/lib/rollbar/truncation/remove_request_strategy.rb +21 -0
- data/lib/rollbar/truncation/strings_strategy.rb +6 -5
- data/lib/rollbar/truncation.rb +9 -2
- data/lib/rollbar/util/hash.rb +15 -0
- data/lib/rollbar/util/ip_anonymizer.rb +8 -7
- data/lib/rollbar/util/ip_obfuscator.rb +1 -1
- data/lib/rollbar/util.rb +6 -2
- data/lib/rollbar/version.rb +1 -1
- data/lib/rollbar.rb +2 -3
- data/lib/tasks/benchmark.rake +103 -0
- data/rollbar.gemspec +13 -5
- data/spec/support/rollbar_api.rb +67 -0
- metadata +21 -23
- data/gemfiles/ruby_1_8_and_1_9_2.gemfile +0 -49
- data/lib/rollbar/json/default.rb +0 -11
- data/lib/rollbar/json/oj.rb +0 -16
| @@ -14,5 +14,9 @@ module Rollbar | |
| 14 14 | 
             
              end
         | 
| 15 15 | 
             
            end
         | 
| 16 16 |  | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 17 | 
            +
            if defined?(ActiveSupport) && ActiveSupport.respond_to?(:on_load)
         | 
| 18 | 
            +
              ActiveSupport.on_load(:action_mailer) do
         | 
| 19 | 
            +
                # Automatically add to ActionMailer::DeliveryJob
         | 
| 20 | 
            +
                ActionMailer::DeliveryJob.send(:include, Rollbar::ActiveJob) if defined?(ActionMailer::DeliveryJob)
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
| @@ -1,16 +1,31 @@ | |
| 1 1 | 
             
            Rollbar.plugins.define('basic_socket') do
         | 
| 2 | 
            +
              load_on_demand
         | 
| 3 | 
            +
             | 
| 2 4 | 
             
              dependency { !configuration.disable_core_monkey_patch }
         | 
| 3 5 |  | 
| 4 6 | 
             
              # Needed to avoid active_support (< 4.1.0) bug serializing JSONs
         | 
| 5 | 
            -
              dependency  | 
| 7 | 
            +
              dependency do
         | 
| 8 | 
            +
                defined?(ActiveSupport::VERSION::STRING) &&
         | 
| 9 | 
            +
                  Gem::Version.new(ActiveSupport::VERSION::STRING) < Gem::Version.new('4.1.0')
         | 
| 10 | 
            +
              end
         | 
| 6 11 |  | 
| 7 12 | 
             
              execute do
         | 
| 8 | 
            -
                 | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
                     | 
| 13 | 
            +
                class BasicSocket # :nodoc:
         | 
| 14 | 
            +
                  def new_as_json(_options = nil)
         | 
| 15 | 
            +
                    {
         | 
| 16 | 
            +
                      :value => inspect
         | 
| 17 | 
            +
                    }
         | 
| 13 18 | 
             
                  end
         | 
| 19 | 
            +
                  # alias_method is recommended over alias when aliasing at runtime.
         | 
| 20 | 
            +
                  # https://github.com/rubocop-hq/ruby-style-guide#alias-method
         | 
| 21 | 
            +
                  alias_method :original_as_json, :as_json # rubocop:disable Style/Alias
         | 
| 22 | 
            +
                  alias_method :as_json, :new_as_json # rubocop:disable Style/Alias
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              revert do
         | 
| 27 | 
            +
                class BasicSocket # :nodoc:
         | 
| 28 | 
            +
                  alias_method :as_json, :original_as_json # rubocop:disable Style/Alias
         | 
| 14 29 | 
             
                end
         | 
| 15 30 | 
             
              end
         | 
| 16 31 | 
             
            end
         | 
| @@ -10,7 +10,7 @@ module Rollbar | |
| 10 10 | 
             
                  def to_hash
         | 
| 11 11 | 
             
                    job_data = extract_job_data
         | 
| 12 12 |  | 
| 13 | 
            -
                    handler_parent = job_data['job']  | 
| 13 | 
            +
                    handler_parent = job_data['job'] || job_data
         | 
| 14 14 | 
             
                    handler_parent['handler'] = handler_data
         | 
| 15 15 |  | 
| 16 16 | 
             
                    job_data
         | 
| @@ -32,7 +32,7 @@ module Rollbar | |
| 32 32 | 
             
                    return payload_object unless payload_object.respond_to?(:object)
         | 
| 33 33 |  | 
| 34 34 | 
             
                    object_data(payload_object.object)
         | 
| 35 | 
            -
                  rescue
         | 
| 35 | 
            +
                  rescue StandardError
         | 
| 36 36 | 
             
                    {}
         | 
| 37 37 | 
             
                  end
         | 
| 38 38 |  | 
| @@ -42,7 +42,7 @@ module Rollbar | |
| 42 42 | 
             
                      :args => job.payload_object.args,
         | 
| 43 43 | 
             
                      :object => object.is_a?(Class) ? object.name : object.to_s
         | 
| 44 44 | 
             
                    }
         | 
| 45 | 
            -
                  rescue
         | 
| 45 | 
            +
                  rescue StandardError
         | 
| 46 46 | 
             
                    {}
         | 
| 47 47 | 
             
                  end
         | 
| 48 48 | 
             
                end
         | 
| @@ -9,10 +9,16 @@ module Rollbar | |
| 9 9 |  | 
| 10 10 | 
             
                class RollbarPlugin < ::Delayed::Plugin
         | 
| 11 11 | 
             
                  callbacks do |lifecycle|
         | 
| 12 | 
            -
                    lifecycle.around(:invoke_job, &Delayed | 
| 12 | 
            +
                    lifecycle.around(:invoke_job, &Delayed.invoke_job_callback)
         | 
| 13 13 | 
             
                    lifecycle.after(:failure) do |_, job, _, _|
         | 
| 14 14 | 
             
                      data = Rollbar::Delayed.build_job_data(job)
         | 
| 15 | 
            -
             | 
| 15 | 
            +
             | 
| 16 | 
            +
                      # DelayedJob < 4.1 doesn't provide job#error
         | 
| 17 | 
            +
                      if job.class.method_defined? :error
         | 
| 18 | 
            +
                        ::Rollbar.scope(:request => data).error(job.error, :use_exception_level_filters => true) if job.error
         | 
| 19 | 
            +
                      elsif job.last_error
         | 
| 20 | 
            +
                        ::Rollbar.scope(:request => data).error("Job has failed and won't be retried anymore: " + job.last_error, :use_exception_level_filters => true)
         | 
| 21 | 
            +
                      end
         | 
| 16 22 | 
             
                    end
         | 
| 17 23 | 
             
                  end
         | 
| 18 24 | 
             
                end
         | 
| @@ -37,7 +43,7 @@ module Rollbar | |
| 37 43 | 
             
                  proc do |job, *args, &block|
         | 
| 38 44 | 
             
                    begin
         | 
| 39 45 | 
             
                      block.call(job, *args)
         | 
| 40 | 
            -
                    rescue => e
         | 
| 46 | 
            +
                    rescue StandardError => e
         | 
| 41 47 | 
             
                      report(e, job)
         | 
| 42 48 |  | 
| 43 49 | 
             
                      raise e
         | 
| @@ -54,6 +60,10 @@ module Rollbar | |
| 54 60 | 
             
                end
         | 
| 55 61 |  | 
| 56 62 | 
             
                def self.skip_report?(job)
         | 
| 63 | 
            +
                  handler = ::Rollbar.configuration.async_skip_report_handler
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                  return handler.call(job) if handler.respond_to?(:call)
         | 
| 66 | 
            +
             | 
| 57 67 | 
             
                  job.attempts < ::Rollbar.configuration.dj_threshold
         | 
| 58 68 | 
             
                end
         | 
| 59 69 |  | 
| @@ -10,10 +10,18 @@ Rollbar.plugins.define('goalie') do | |
| 10 10 |  | 
| 11 11 | 
             
                      begin
         | 
| 12 12 | 
             
                        controller = env['action_controller.instance']
         | 
| 13 | 
            -
                        request_data =  | 
| 14 | 
            -
             | 
| 13 | 
            +
                        request_data = begin
         | 
| 14 | 
            +
                                         controller.rollbar_request_data
         | 
| 15 | 
            +
                                       rescue StandardError
         | 
| 16 | 
            +
                                         nil
         | 
| 17 | 
            +
                                       end
         | 
| 18 | 
            +
                        person_data = begin
         | 
| 19 | 
            +
                                        controller.rollbar_person_data
         | 
| 20 | 
            +
                                      rescue StandardError
         | 
| 21 | 
            +
                                        nil
         | 
| 22 | 
            +
                                      end
         | 
| 15 23 | 
             
                        exception_data = Rollbar.scope(:request => request_data, :person => person_data).error(exception, :use_exception_level_filters => true)
         | 
| 16 | 
            -
                      rescue => e
         | 
| 24 | 
            +
                      rescue StandardError => e
         | 
| 17 25 | 
             
                        Rollbar.log_warning "[Rollbar] Exception while reporting exception to Rollbar: #{e}"
         | 
| 18 26 | 
             
                      end
         | 
| 19 27 |  | 
| @@ -11,9 +11,21 @@ module Rollbar | |
| 11 11 | 
             
                    # include id, username, email if non-empty
         | 
| 12 12 | 
             
                    if user
         | 
| 13 13 | 
             
                      {
         | 
| 14 | 
            -
                        :id => ( | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 14 | 
            +
                        :id => (begin
         | 
| 15 | 
            +
                                  user.send(Rollbar.configuration.person_id_method)
         | 
| 16 | 
            +
                                rescue StandardError
         | 
| 17 | 
            +
                                  nil
         | 
| 18 | 
            +
                                end),
         | 
| 19 | 
            +
                        :username => (begin
         | 
| 20 | 
            +
                                        user.send(Rollbar.configuration.person_username_method)
         | 
| 21 | 
            +
                                      rescue StandardError
         | 
| 22 | 
            +
                                        nil
         | 
| 23 | 
            +
                                      end),
         | 
| 24 | 
            +
                        :email => (begin
         | 
| 25 | 
            +
                                     user.send(Rollbar.configuration.person_email_method)
         | 
| 26 | 
            +
                                   rescue StandardError
         | 
| 27 | 
            +
                                     nil
         | 
| 28 | 
            +
                                   end)
         | 
| 17 29 | 
             
                      }
         | 
| 18 30 | 
             
                    else
         | 
| 19 31 | 
             
                      {}
         | 
    
        data/lib/rollbar/plugins/rake.rb
    CHANGED
    
    
| @@ -2,10 +2,10 @@ require 'rollbar/scrubbers/params' | |
| 2 2 |  | 
| 3 3 | 
             
            module Rollbar
         | 
| 4 4 | 
             
              class Sidekiq
         | 
| 5 | 
            -
                PARAM_BLACKLIST = %w[backtrace error_backtrace error_message error_class]
         | 
| 5 | 
            +
                PARAM_BLACKLIST = %w[backtrace error_backtrace error_message error_class].freeze
         | 
| 6 6 |  | 
| 7 7 | 
             
                class ClearScope
         | 
| 8 | 
            -
                  def call( | 
| 8 | 
            +
                  def call(_worker, _msg, _queue)
         | 
| 9 9 | 
             
                    Rollbar.reset_notifier!
         | 
| 10 10 |  | 
| 11 11 | 
             
                    yield
         | 
| @@ -38,15 +38,16 @@ module Rollbar | |
| 38 38 | 
             
                  Rollbar::Scrubbers::Params.call(options)
         | 
| 39 39 | 
             
                end
         | 
| 40 40 |  | 
| 41 | 
            -
                def self.skip_report?(job_hash,  | 
| 41 | 
            +
                def self.skip_report?(job_hash, _e)
         | 
| 42 42 | 
             
                  return false if job_hash.nil?
         | 
| 43 | 
            +
             | 
| 43 44 | 
             
                  # when rollbar middleware catches, sidekiq's retry_job processor hasn't set
         | 
| 44 45 | 
             
                  # the retry_count for the current job yet, so adding 1 gives the actual retry count
         | 
| 45 46 | 
             
                  actual_retry_count = job_hash.fetch('retry_count', -1) + 1
         | 
| 46 47 | 
             
                  job_hash['retry'] && actual_retry_count < ::Rollbar.configuration.sidekiq_threshold
         | 
| 47 48 | 
             
                end
         | 
| 48 49 |  | 
| 49 | 
            -
                def call( | 
| 50 | 
            +
                def call(_worker, msg, _queue)
         | 
| 50 51 | 
             
                  Rollbar.reset_notifier!
         | 
| 51 52 |  | 
| 52 53 | 
             
                  yield
         | 
    
        data/lib/rollbar/plugins.rb
    CHANGED
    
    
    
        data/lib/rollbar/rake_tasks.rb
    CHANGED
    
    | @@ -1,154 +1,10 @@ | |
| 1 | 
            -
            require 'rollbar'
         | 
| 2 | 
            -
            begin
         | 
| 3 | 
            -
              require 'rack/mock'
         | 
| 4 | 
            -
            rescue LoadError
         | 
| 5 | 
            -
              puts 'Cannot load rack/mock'
         | 
| 6 | 
            -
            end
         | 
| 7 | 
            -
            require 'logger'
         | 
| 8 1 |  | 
| 9 2 | 
             
            namespace :rollbar do
         | 
| 10 | 
            -
              desc 'Verify your gem installation by sending a test  | 
| 3 | 
            +
              desc 'Verify your gem installation by sending a test message to Rollbar'
         | 
| 11 4 | 
             
              task :test => [:environment] do
         | 
| 12 | 
            -
                 | 
| 13 | 
            -
             | 
| 14 | 
            -
            end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
            # Module to inject into the Rails controllers or rack apps
         | 
| 17 | 
            -
            module RollbarTest # :nodoc:
         | 
| 18 | 
            -
              def test_rollbar
         | 
| 19 | 
            -
                puts 'Raising RollbarTestingException to simulate app failure.'
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                raise RollbarTestingException.new, ::RollbarTest.success_message
         | 
| 22 | 
            -
              end
         | 
| 23 | 
            -
             | 
| 24 | 
            -
              def self.run
         | 
| 25 | 
            -
                return unless confirmed_token?
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                configure_rails if defined?(Rails)
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                puts 'Testing manual report...'
         | 
| 30 | 
            -
                Rollbar.error('Test error from rollbar:test')
         | 
| 31 | 
            -
             | 
| 32 | 
            -
                return unless defined?(Rack::MockRequest)
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                protocol, app = setup_app
         | 
| 35 | 
            -
             | 
| 36 | 
            -
                puts 'Processing...'
         | 
| 37 | 
            -
                env = Rack::MockRequest.env_for("#{protocol}://www.example.com/verify", 'REMOTE_ADDR' => '127.0.0.1')
         | 
| 38 | 
            -
                status, = app.call(env)
         | 
| 39 | 
            -
             | 
| 40 | 
            -
                puts error_message unless status.to_i == 500
         | 
| 41 | 
            -
              end
         | 
| 42 | 
            -
             | 
| 43 | 
            -
              def self.configure_rails
         | 
| 44 | 
            -
                Rails.logger = if defined?(ActiveSupport::TaggedLogging)
         | 
| 45 | 
            -
                                 ActiveSupport::TaggedLogging.new(Logger.new(STDOUT))
         | 
| 46 | 
            -
                               else
         | 
| 47 | 
            -
                                 Logger.new(STDOUT)
         | 
| 48 | 
            -
                               end
         | 
| 49 | 
            -
             | 
| 50 | 
            -
                Rails.logger.level = Logger::DEBUG
         | 
| 51 | 
            -
                Rollbar.preconfigure do |config|
         | 
| 52 | 
            -
                  config.logger = Rails.logger
         | 
| 53 | 
            -
                end
         | 
| 54 | 
            -
              end
         | 
| 55 | 
            -
             | 
| 56 | 
            -
              def self.confirmed_token?
         | 
| 57 | 
            -
                return true if Rollbar.configuration.access_token
         | 
| 58 | 
            -
             | 
| 59 | 
            -
                puts token_error_message
         | 
| 60 | 
            -
             | 
| 61 | 
            -
                false
         | 
| 62 | 
            -
              end
         | 
| 63 | 
            -
             | 
| 64 | 
            -
              def self.authlogic_config
         | 
| 65 | 
            -
                # from http://stackoverflow.com/questions/5270835/authlogic-activation-problems
         | 
| 66 | 
            -
                return unless defined?(Authlogic)
         | 
| 67 | 
            -
             | 
| 68 | 
            -
                Authlogic::Session::Base.controller = Authlogic::ControllerAdapters::RailsAdapter.new(self)
         | 
| 69 | 
            -
              end
         | 
| 70 | 
            -
             | 
| 71 | 
            -
              def self.setup_app
         | 
| 72 | 
            -
                puts 'Setting up the test app.'
         | 
| 5 | 
            +
                rollbar_dir = Gem.loaded_specs['rollbar'].full_gem_path
         | 
| 6 | 
            +
                require "#{rollbar_dir}/lib/rollbar/rollbar_test"
         | 
| 73 7 |  | 
| 74 | 
            -
                 | 
| 75 | 
            -
                  app = rails_app
         | 
| 76 | 
            -
             | 
| 77 | 
            -
                  draw_rails_route(app)
         | 
| 78 | 
            -
             | 
| 79 | 
            -
                  authlogic_config
         | 
| 80 | 
            -
             | 
| 81 | 
            -
                  [rails_protocol(app), app]
         | 
| 82 | 
            -
                else
         | 
| 83 | 
            -
                  ['http', rack_app]
         | 
| 84 | 
            -
                end
         | 
| 85 | 
            -
              end
         | 
| 86 | 
            -
             | 
| 87 | 
            -
              def self.rails_app
         | 
| 88 | 
            -
                # The setup below is needed for Rails 5.x, but not for Rails 4.x and below.
         | 
| 89 | 
            -
                # (And fails on Rails 4.x in various ways depending on the exact version.)
         | 
| 90 | 
            -
                return Rails.application if Rails.version < '5.0.0'
         | 
| 91 | 
            -
             | 
| 92 | 
            -
                # Spring now runs by default in development on all new Rails installs. This causes
         | 
| 93 | 
            -
                # the new `/verify` route to not get picked up if `config.cache_classes == false`
         | 
| 94 | 
            -
                # which is also a default in development env.
         | 
| 95 | 
            -
                #
         | 
| 96 | 
            -
                # `config.cache_classes` needs to be set, but the only possible time is at app load,
         | 
| 97 | 
            -
                # so here we clone the default app with an updated config.
         | 
| 98 | 
            -
                #
         | 
| 99 | 
            -
                config = Rails.application.config
         | 
| 100 | 
            -
                config.cache_classes = true
         | 
| 101 | 
            -
             | 
| 102 | 
            -
                # Make a copy of the app, so the config can be updated.
         | 
| 103 | 
            -
                Rails.application.class.name.constantize.new(:config => config)
         | 
| 104 | 
            -
              end
         | 
| 105 | 
            -
             | 
| 106 | 
            -
              def self.draw_rails_route(app)
         | 
| 107 | 
            -
                app.routes_reloader.execute_if_updated
         | 
| 108 | 
            -
                app.routes.draw do
         | 
| 109 | 
            -
                  get 'verify' => 'rollbar_test#verify', :as => 'verify'
         | 
| 110 | 
            -
                end
         | 
| 111 | 
            -
              end
         | 
| 112 | 
            -
             | 
| 113 | 
            -
              def self.rails_protocol(app)
         | 
| 114 | 
            -
                defined?(app.config.force_ssl && app.config.force_ssl) ? 'https' : 'http'
         | 
| 115 | 
            -
              end
         | 
| 116 | 
            -
             | 
| 117 | 
            -
              def self.rack_app
         | 
| 118 | 
            -
                Class.new do
         | 
| 119 | 
            -
                  include RollbarTest
         | 
| 120 | 
            -
             | 
| 121 | 
            -
                  def self.call(_env)
         | 
| 122 | 
            -
                    new.test_rollbar
         | 
| 123 | 
            -
                  end
         | 
| 124 | 
            -
                end
         | 
| 125 | 
            -
              end
         | 
| 126 | 
            -
             | 
| 127 | 
            -
              def self.token_error_message
         | 
| 128 | 
            -
                'Rollbar needs an access token configured. Check the README for instructions.'
         | 
| 129 | 
            -
              end
         | 
| 130 | 
            -
             | 
| 131 | 
            -
              def self.error_message
         | 
| 132 | 
            -
                'Test failed! You may have a configuration issue, or you could be using a gem that\'s blocking the test. Contact support@rollbar.com if you need help troubleshooting.'
         | 
| 133 | 
            -
              end
         | 
| 134 | 
            -
             | 
| 135 | 
            -
              def self.success_message
         | 
| 136 | 
            -
                'Testing rollbar with "rake rollbar:test". If you can see this, it works.'
         | 
| 137 | 
            -
              end
         | 
| 138 | 
            -
            end
         | 
| 139 | 
            -
             | 
| 140 | 
            -
            class RollbarTestingException < RuntimeError; end
         | 
| 141 | 
            -
             | 
| 142 | 
            -
            if defined?(Rails)
         | 
| 143 | 
            -
              class RollbarTestController < ActionController::Base # :nodoc:
         | 
| 144 | 
            -
                include RollbarTest
         | 
| 145 | 
            -
              
         | 
| 146 | 
            -
                def verify
         | 
| 147 | 
            -
                  test_rollbar
         | 
| 148 | 
            -
                end
         | 
| 149 | 
            -
              
         | 
| 150 | 
            -
                def logger
         | 
| 151 | 
            -
                  nil
         | 
| 152 | 
            -
                end
         | 
| 8 | 
            +
                RollbarTest.run
         | 
| 153 9 | 
             
              end
         | 
| 154 10 | 
             
            end
         | 
| @@ -10,15 +10,19 @@ require 'rollbar/json' | |
| 10 10 |  | 
| 11 11 | 
             
            module Rollbar
         | 
| 12 12 | 
             
              module RequestDataExtractor
         | 
| 13 | 
            -
                ALLOWED_HEADERS_REGEX = /^HTTP_|^CONTENT_TYPE$|^CONTENT_LENGTH | 
| 14 | 
            -
                ALLOWED_BODY_PARSEABLE_METHODS = %w | 
| 13 | 
            +
                ALLOWED_HEADERS_REGEX = /^HTTP_|^CONTENT_TYPE$|^CONTENT_LENGTH$/.freeze
         | 
| 14 | 
            +
                ALLOWED_BODY_PARSEABLE_METHODS = %w[POST PUT PATCH DELETE].freeze
         | 
| 15 15 |  | 
| 16 16 | 
             
                def extract_person_data_from_controller(env)
         | 
| 17 | 
            -
                  if env. | 
| 17 | 
            +
                  if env.key?('rollbar.person_data')
         | 
| 18 18 | 
             
                    person_data = env['rollbar.person_data'] || {}
         | 
| 19 19 | 
             
                  else
         | 
| 20 20 | 
             
                    controller = env['action_controller.instance']
         | 
| 21 | 
            -
                    person_data =  | 
| 21 | 
            +
                    person_data = begin
         | 
| 22 | 
            +
                                    controller.rollbar_person_data
         | 
| 23 | 
            +
                                  rescue StandardError
         | 
| 24 | 
            +
                                    {}
         | 
| 25 | 
            +
                                  end
         | 
| 22 26 | 
             
                  end
         | 
| 23 27 |  | 
| 24 28 | 
             
                  person_data
         | 
| @@ -50,9 +54,7 @@ module Rollbar | |
| 50 54 | 
             
                    :method => rollbar_request_method(env)
         | 
| 51 55 | 
             
                  }
         | 
| 52 56 |  | 
| 53 | 
            -
                  if env['action_dispatch.request_id']
         | 
| 54 | 
            -
                    data[:request_id] = env['action_dispatch.request_id']
         | 
| 55 | 
            -
                  end
         | 
| 57 | 
            +
                  data[:request_id] = env['action_dispatch.request_id'] if env['action_dispatch.request_id']
         | 
| 56 58 |  | 
| 57 59 | 
             
                  data
         | 
| 58 60 | 
             
                end
         | 
| @@ -108,7 +110,7 @@ module Rollbar | |
| 108 110 | 
             
                    elsif name == 'X-Forwarded-For' && !Rollbar.configuration.collect_user_ip
         | 
| 109 111 | 
             
                      {}
         | 
| 110 112 | 
             
                    elsif name == 'X-Forwarded-For' && Rollbar.configuration.collect_user_ip && Rollbar.configuration.anonymize_user_ip
         | 
| 111 | 
            -
                      ips = env[header].sub( | 
| 113 | 
            +
                      ips = env[header].sub(' ', '').split(',')
         | 
| 112 114 | 
             
                      ips = ips.map { |ip| Rollbar::Util::IPAnonymizer.anonymize_ip(ip) }
         | 
| 113 115 | 
             
                      { name => ips.join(', ') }
         | 
| 114 116 | 
             
                    elsif name == 'X-Real-Ip' && !Rollbar.configuration.collect_user_ip
         | 
| @@ -129,13 +131,14 @@ module Rollbar | |
| 129 131 | 
             
                  host = host.split(',').first.strip unless host.empty?
         | 
| 130 132 |  | 
| 131 133 | 
             
                  path = env['ORIGINAL_FULLPATH'] || env['REQUEST_URI']
         | 
| 134 | 
            +
                  path ||= "#{env['SCRIPT_NAME']}#{env['PATH_INFO']}#{"?#{env['QUERY_STRING']}" unless env['QUERY_STRING'].to_s.empty?}"
         | 
| 132 135 | 
             
                  unless path.nil? || path.empty?
         | 
| 133 136 | 
             
                    path = '/' + path.to_s if path.to_s.slice(0, 1) != '/'
         | 
| 134 137 | 
             
                  end
         | 
| 135 138 |  | 
| 136 139 | 
             
                  port = env['HTTP_X_FORWARDED_PORT']
         | 
| 137 | 
            -
                  if port && !(!scheme.nil? && scheme. | 
| 138 | 
            -
                     !(!scheme.nil? && scheme. | 
| 140 | 
            +
                  if port && !(!scheme.nil? && scheme.casecmp('http').zero? && port.to_i == 80) && \
         | 
| 141 | 
            +
                     !(!scheme.nil? && scheme.casecmp('https').zero? && port.to_i == 443) && \
         | 
| 139 142 | 
             
                     !(host.include? ':')
         | 
| 140 143 | 
             
                    host = host + ':' + port
         | 
| 141 144 | 
             
                  end
         | 
| @@ -145,12 +148,13 @@ module Rollbar | |
| 145 148 |  | 
| 146 149 | 
             
                def rollbar_user_ip(env)
         | 
| 147 150 | 
             
                  return nil unless Rollbar.configuration.collect_user_ip
         | 
| 151 | 
            +
             | 
| 148 152 | 
             
                  user_ip_string = (env['action_dispatch.remote_ip'] || env['HTTP_X_REAL_IP'] || x_forwarded_for_client(env['HTTP_X_FORWARDED_FOR']) || env['REMOTE_ADDR']).to_s
         | 
| 149 153 |  | 
| 150 154 | 
             
                  user_ip_string = Rollbar::Util::IPAnonymizer.anonymize_ip(user_ip_string)
         | 
| 151 155 |  | 
| 152 156 | 
             
                  Rollbar::Util::IPObfuscator.obfuscate_ip(user_ip_string)
         | 
| 153 | 
            -
                rescue
         | 
| 157 | 
            +
                rescue StandardError
         | 
| 154 158 | 
             
                  nil
         | 
| 155 159 | 
             
                end
         | 
| 156 160 |  | 
| @@ -176,13 +180,13 @@ module Rollbar | |
| 176 180 |  | 
| 177 181 | 
             
                def rollbar_get_params(rack_req)
         | 
| 178 182 | 
             
                  rack_req.GET
         | 
| 179 | 
            -
                rescue
         | 
| 183 | 
            +
                rescue StandardError
         | 
| 180 184 | 
             
                  {}
         | 
| 181 185 | 
             
                end
         | 
| 182 186 |  | 
| 183 187 | 
             
                def rollbar_post_params(rack_req)
         | 
| 184 188 | 
             
                  rack_req.POST
         | 
| 185 | 
            -
                rescue
         | 
| 189 | 
            +
                rescue StandardError
         | 
| 186 190 | 
             
                  {}
         | 
| 187 191 | 
             
                end
         | 
| 188 192 |  | 
| @@ -195,18 +199,19 @@ module Rollbar | |
| 195 199 | 
             
                  raw_body = rack_req.body.read
         | 
| 196 200 | 
             
                  begin
         | 
| 197 201 | 
             
                    Rollbar::JSON.load(raw_body)
         | 
| 198 | 
            -
                  rescue
         | 
| 202 | 
            +
                  rescue StandardError
         | 
| 199 203 | 
             
                    raw_body
         | 
| 200 204 | 
             
                  end
         | 
| 201 | 
            -
                rescue
         | 
| 205 | 
            +
                rescue StandardError
         | 
| 202 206 | 
             
                  {}
         | 
| 203 207 | 
             
                ensure
         | 
| 204 208 | 
             
                  rack_req.body.rewind
         | 
| 205 209 | 
             
                end
         | 
| 206 210 |  | 
| 207 211 | 
             
                def json_request?(rack_req)
         | 
| 208 | 
            -
                   | 
| 209 | 
            -
             | 
| 212 | 
            +
                  json_regex = /\bjson\b/
         | 
| 213 | 
            +
             | 
| 214 | 
            +
                  !!(rack_req.env['CONTENT_TYPE'] =~ json_regex)
         | 
| 210 215 | 
             
                end
         | 
| 211 216 |  | 
| 212 217 | 
             
                def rollbar_route_params(env)
         | 
| @@ -219,7 +224,7 @@ module Rollbar | |
| 219 224 | 
             
                    # route params (if any)and format (if defined)
         | 
| 220 225 | 
             
                    ::Rails.application.routes.recognize_path(env['PATH_INFO'],
         | 
| 221 226 | 
             
                                                              environment)
         | 
| 222 | 
            -
                  rescue
         | 
| 227 | 
            +
                  rescue StandardError
         | 
| 223 228 | 
             
                    {}
         | 
| 224 229 | 
             
                  end
         | 
| 225 230 | 
             
                end
         | 
| @@ -228,13 +233,13 @@ module Rollbar | |
| 228 233 | 
             
                  session = env.fetch('rack.session', {})
         | 
| 229 234 |  | 
| 230 235 | 
             
                  session.to_hash
         | 
| 231 | 
            -
                rescue
         | 
| 236 | 
            +
                rescue StandardError
         | 
| 232 237 | 
             
                  {}
         | 
| 233 238 | 
             
                end
         | 
| 234 239 |  | 
| 235 240 | 
             
                def rollbar_request_cookies(rack_req)
         | 
| 236 241 | 
             
                  rack_req.cookies
         | 
| 237 | 
            -
                rescue
         | 
| 242 | 
            +
                rescue StandardError
         | 
| 238 243 | 
             
                  {}
         | 
| 239 244 | 
             
                end
         | 
| 240 245 |  | 
| @@ -243,7 +248,12 @@ module Rollbar | |
| 243 248 | 
             
                end
         | 
| 244 249 |  | 
| 245 250 | 
             
                def sensitive_headers_list
         | 
| 246 | 
            -
                  Rollbar.configuration.scrub_headers  | 
| 251 | 
            +
                  return [] unless Rollbar.configuration.scrub_headers && Rollbar.configuration.scrub_headers.is_a?(Array)
         | 
| 252 | 
            +
             | 
| 253 | 
            +
                  # Normalize into the expected matching format
         | 
| 254 | 
            +
                  Rollbar.configuration.scrub_headers.map do |header|
         | 
| 255 | 
            +
                    header.split(/[-_]/).map(&:capitalize).join('-').gsub(/^Http-/, '')
         | 
| 256 | 
            +
                  end
         | 
| 247 257 | 
             
                end
         | 
| 248 258 | 
             
              end
         | 
| 249 259 | 
             
            end
         | 
| @@ -0,0 +1,36 @@ | |
| 1 | 
            +
            require 'rollbar'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RollbarTest # :nodoc:
         | 
| 4 | 
            +
              def self.run
         | 
| 5 | 
            +
                return unless confirmed_token?
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                puts 'Test sending to Rollbar...'
         | 
| 8 | 
            +
                result = Rollbar.info('Test message from rollbar:test')
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                if result == 'error'
         | 
| 11 | 
            +
                  puts error_message
         | 
| 12 | 
            +
                else
         | 
| 13 | 
            +
                  puts success_message
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              def self.confirmed_token?
         | 
| 18 | 
            +
                return true if Rollbar.configuration.access_token
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                puts token_error_message
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                false
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              def self.token_error_message
         | 
| 26 | 
            +
                'Rollbar needs an access token configured. Check the README for instructions.'
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
              def self.error_message
         | 
| 30 | 
            +
                'Test failed! You may have a configuration issue, or you could be using a gem that\'s blocking the test. Contact support@rollbar.com if you need help troubleshooting.'
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              def self.success_message
         | 
| 34 | 
            +
                'Testing rollbar with "rake rollbar:test". If you can see this, it works.'
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
            end
         | 
| @@ -9,8 +9,8 @@ module Rollbar | |
| 9 9 | 
             
                # received parameters. It will not scrub anything that is in the scrub_whitelist
         | 
| 10 10 | 
             
                # configuration array even if :scrub_all is true.
         | 
| 11 11 | 
             
                class Params
         | 
| 12 | 
            -
                  SKIPPED_CLASSES = [::Tempfile]
         | 
| 13 | 
            -
                  ATTACHMENT_CLASSES = %w | 
| 12 | 
            +
                  SKIPPED_CLASSES = [::Tempfile].freeze
         | 
| 13 | 
            +
                  ATTACHMENT_CLASSES = %w[ActionDispatch::Http::UploadedFile Rack::Multipart::UploadedFile].freeze
         | 
| 14 14 | 
             
                  SCRUB_ALL = :scrub_all
         | 
| 15 15 |  | 
| 16 16 | 
             
                  def self.call(*args)
         | 
| @@ -52,9 +52,10 @@ module Rollbar | |
| 52 52 | 
             
                  end
         | 
| 53 53 |  | 
| 54 54 | 
             
                  def build_whitelist_regex(whitelist)
         | 
| 55 | 
            -
                    fields = whitelist.find_all { |f| f.is_a?(String) || f.is_a?(Symbol) }
         | 
| 55 | 
            +
                    fields = whitelist.find_all { |f| f.is_a?(String) || f.is_a?(Symbol) || f.is_a?(Regexp) }
         | 
| 56 56 | 
             
                    return unless fields.any?
         | 
| 57 | 
            -
             | 
| 57 | 
            +
             | 
| 58 | 
            +
                    Regexp.new(fields.map { |val| val.is_a?(Regexp) ? val : /\A#{Regexp.escape(val.to_s)}\z/ }.join('|'))
         | 
| 58 59 | 
             
                  end
         | 
| 59 60 |  | 
| 60 61 | 
             
                  def scrub(params, options)
         | 
| @@ -70,19 +71,19 @@ module Rollbar | |
| 70 71 |  | 
| 71 72 | 
             
                    params.to_hash.inject({}) do |result, (key, value)|
         | 
| 72 73 | 
             
                      encoded_key = Rollbar::Encoding.encode(key).to_s
         | 
| 73 | 
            -
                      if (fields_regex === encoded_key) && !(whitelist_regex === encoded_key)
         | 
| 74 | 
            -
             | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
             | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
             | 
| 74 | 
            +
                      result[key] = if (fields_regex === encoded_key) && !(whitelist_regex === encoded_key)
         | 
| 75 | 
            +
                                      scrub_value(value)
         | 
| 76 | 
            +
                                    elsif value.is_a?(Hash)
         | 
| 77 | 
            +
                                      scrub(value, options)
         | 
| 78 | 
            +
                                    elsif scrub_all && !(whitelist_regex === encoded_key)
         | 
| 79 | 
            +
                                      scrub_value(value)
         | 
| 80 | 
            +
                                    elsif value.is_a?(Array)
         | 
| 81 | 
            +
                                      scrub_array(value, options)
         | 
| 82 | 
            +
                                    elsif skip_value?(value)
         | 
| 83 | 
            +
                                      "Skipped value of class '#{value.class.name}'"
         | 
| 84 | 
            +
                                    else
         | 
| 85 | 
            +
                                      rollbar_filtered_param_value(value)
         | 
| 86 | 
            +
                                    end
         | 
| 86 87 |  | 
| 87 88 | 
             
                      result
         | 
| 88 89 | 
             
                    end
         | 
| @@ -102,7 +103,7 @@ module Rollbar | |
| 102 103 | 
             
                    if ATTACHMENT_CLASSES.include?(value.class.name)
         | 
| 103 104 | 
             
                      begin
         | 
| 104 105 | 
             
                        attachment_value(value)
         | 
| 105 | 
            -
                      rescue
         | 
| 106 | 
            +
                      rescue StandardError
         | 
| 106 107 | 
             
                        'Uploaded file'
         | 
| 107 108 | 
             
                      end
         | 
| 108 109 | 
             
                    else
         |