airbrake 3.1.13 → 3.1.14
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +12 -0
- data/README.md +4 -0
- data/Rakefile +15 -7
- data/airbrake.gemspec +1 -0
- data/lib/airbrake.rb +1 -0
- data/lib/airbrake/notice.rb +20 -62
- data/lib/airbrake/rails/javascript_notifier.rb +20 -18
- data/lib/airbrake/utils/params_cleaner.rb +98 -0
- data/lib/airbrake/version.rb +1 -1
- data/resources/notice.xml +2 -2
- data/test/airbrake_tasks_test.rb +0 -3
- data/test/controller_methods_test.rb +0 -1
- data/test/helper.rb +21 -1
- data/test/integration/javascript_notifier_test.rb +6 -0
- data/test/notice_test.rb +6 -74
- data/test/params_cleaner_test.rb +83 -0
- metadata +21 -3
data/CHANGELOG
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
Version 3.1.14 - 2013-08-22 09:03:14 +0200
|
2
|
+
===============================================================================
|
3
|
+
|
4
|
+
Hrvoje Šimić (5):
|
5
|
+
use Coveralls for code coverage
|
6
|
+
use Gemnasium for dependency monitoring
|
7
|
+
use Code Climate for code analysis
|
8
|
+
extract ParamsCleaner class
|
9
|
+
being more careful with javascript_notifier and non-public requests
|
10
|
+
|
11
|
+
|
1
12
|
Version 3.1.13 - 2013-08-20 09:39:41 +0200
|
2
13
|
===============================================================================
|
3
14
|
|
@@ -1225,4 +1236,5 @@ Nick Quaranto (3):
|
|
1225
1236
|
|
1226
1237
|
|
1227
1238
|
|
1239
|
+
|
1228
1240
|
|
data/README.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
Airbrake
|
2
2
|
========
|
3
3
|
|
4
|
+
[![Code Climate](https://codeclimate.com/github/airbrake/airbrake.png)](https://codeclimate.com/github/airbrake/airbrake)
|
5
|
+
[![Coverage Status](https://coveralls.io/repos/airbrake/airbrake/badge.png?branch=master)](https://coveralls.io/r/airbrake/airbrake?branch=master)
|
6
|
+
[![Dependency Status](https://gemnasium.com/airbrake/airbrake.png)](https://gemnasium.com/airbrake/airbrake)
|
7
|
+
|
4
8
|
This is the notifier gem for integrating apps with [Airbrake](http://airbrake.io).
|
5
9
|
|
6
10
|
When an uncaught exception occurs, Airbrake will POST the relevant data
|
data/Rakefile
CHANGED
@@ -3,6 +3,7 @@ require "bundler/setup"
|
|
3
3
|
require 'appraisal'
|
4
4
|
require 'rake'
|
5
5
|
require 'rake/testtask'
|
6
|
+
require 'coveralls/rake/task'
|
6
7
|
require 'rubygems/package_task'
|
7
8
|
begin
|
8
9
|
require 'cucumber/rake/task'
|
@@ -12,13 +13,10 @@ rescue LoadError
|
|
12
13
|
end
|
13
14
|
require './lib/airbrake/version'
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
'&& rake appraisal:rails-3.0 integration_test'\
|
20
|
-
'&& rake appraisal cucumber'
|
21
|
-
end
|
16
|
+
Coveralls::RakeTask.new
|
17
|
+
|
18
|
+
task :default => [:test, "test:integration", "coveralls:push"]
|
19
|
+
|
22
20
|
|
23
21
|
desc 'Test the airbrake gem.'
|
24
22
|
Rake::TestTask.new(:test) do |t|
|
@@ -27,6 +25,16 @@ Rake::TestTask.new(:test) do |t|
|
|
27
25
|
t.verbose = true
|
28
26
|
end
|
29
27
|
|
28
|
+
namespace :test do
|
29
|
+
desc "Test the integration of airbrake gem with Rails."
|
30
|
+
task :integration do
|
31
|
+
system 'INTEGRATION=true rake appraisal:rails-3.2 integration_test'\
|
32
|
+
'&& INTEGRATION=true rake appraisal:rails-3.1 integration_test'\
|
33
|
+
'&& INTEGRATION=true rake appraisal:rails-3.0 integration_test'\
|
34
|
+
'&& INTEGRATION=true rake appraisal cucumber'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
30
38
|
desc "Test the integration of airbrake gem with Rails."
|
31
39
|
Rake::TestTask.new(:integration_test) do |t|
|
32
40
|
t.libs << 'lib'
|
data/airbrake.gemspec
CHANGED
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
|
|
31
31
|
s.add_development_dependency("shoulda-matchers")
|
32
32
|
s.add_development_dependency("shoulda-context")
|
33
33
|
s.add_development_dependency("pry")
|
34
|
+
s.add_development_dependency("coveralls")
|
34
35
|
|
35
36
|
s.authors = ["Airbrake"]
|
36
37
|
s.email = %q{support@airbrake.io}
|
data/lib/airbrake.rb
CHANGED
data/lib/airbrake/notice.rb
CHANGED
@@ -87,6 +87,9 @@ module Airbrake
|
|
87
87
|
# Details about the user who experienced the error
|
88
88
|
attr_reader :user
|
89
89
|
|
90
|
+
# Instance that's used for cleaning out data that should be filtered out, should respond to #clean
|
91
|
+
attr_accessor :cleaner
|
92
|
+
|
90
93
|
public
|
91
94
|
|
92
95
|
def initialize(args)
|
@@ -120,12 +123,17 @@ module Airbrake
|
|
120
123
|
end
|
121
124
|
|
122
125
|
@hostname = local_hostname
|
123
|
-
@user
|
126
|
+
@user = args[:user] || {}
|
127
|
+
|
124
128
|
|
125
129
|
also_use_rack_params_filters
|
126
130
|
find_session_data
|
127
|
-
|
128
|
-
|
131
|
+
|
132
|
+
@cleaner = args[:cleaner] ||
|
133
|
+
Airbrake::Utils::ParamsCleaner.new(:filters => params_filters,
|
134
|
+
:to_clean => data_to_clean)
|
135
|
+
|
136
|
+
clean_data!
|
129
137
|
end
|
130
138
|
|
131
139
|
# Converts the given notice to XML
|
@@ -293,69 +301,19 @@ module Airbrake
|
|
293
301
|
end
|
294
302
|
end
|
295
303
|
|
296
|
-
# Removes non-serializable data from the given attribute.
|
297
|
-
# See #clean_unserializable_data
|
298
|
-
def clean_unserializable_data_from(attribute)
|
299
|
-
self.instance_variable_set("@#{attribute}", clean_unserializable_data(send(attribute)))
|
300
|
-
end
|
301
|
-
|
302
|
-
# Removes non-serializable data. Allowed data types are strings, arrays,
|
303
|
-
# and hashes. All other types are converted to strings.
|
304
|
-
# TODO: move this onto Hash
|
305
|
-
def clean_unserializable_data(data, stack = [])
|
306
|
-
return "[possible infinite recursion halted]" if stack.any?{|item| item == data.object_id }
|
307
|
-
|
308
|
-
if data.respond_to?(:to_hash)
|
309
|
-
data.to_hash.inject({}) do |result, (key, value)|
|
310
|
-
result.merge(key => clean_unserializable_data(value, stack + [data.object_id]))
|
311
|
-
end
|
312
|
-
elsif data.respond_to?(:to_ary)
|
313
|
-
data.to_ary.collect do |value|
|
314
|
-
clean_unserializable_data(value, stack + [data.object_id])
|
315
|
-
end
|
316
|
-
else
|
317
|
-
data.to_s
|
318
|
-
end
|
319
|
-
end
|
320
|
-
|
321
304
|
# Replaces the contents of params that match params_filters.
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
clean_unserializable_data_from(:cgi_data)
|
328
|
-
filter(cgi_data)
|
329
|
-
end
|
330
|
-
if session_data
|
331
|
-
clean_unserializable_data_from(:session_data)
|
332
|
-
filter(session_data)
|
333
|
-
end
|
334
|
-
end
|
335
|
-
|
336
|
-
def clean_rack_request_data
|
337
|
-
if cgi_data
|
338
|
-
cgi_data.delete("rack.request.form_vars")
|
339
|
-
cgi_data.delete("action_dispatch.secret_token")
|
305
|
+
def clean_data!
|
306
|
+
cleaner.clean.tap do |c|
|
307
|
+
@parameters = c.parameters
|
308
|
+
@cgi_data = c.cgi_data
|
309
|
+
@session_data = c.session_data
|
340
310
|
end
|
341
311
|
end
|
342
312
|
|
343
|
-
def
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
hash[key] = "[FILTERED]"
|
348
|
-
elsif value.respond_to?(:to_hash)
|
349
|
-
filter(hash[key])
|
350
|
-
end
|
351
|
-
end
|
352
|
-
end
|
353
|
-
end
|
354
|
-
|
355
|
-
def filter_key?(key)
|
356
|
-
params_filters.any? do |filter|
|
357
|
-
key.to_s.eql?(filter.to_s)
|
358
|
-
end
|
313
|
+
def data_to_clean
|
314
|
+
{:parameters => parameters,
|
315
|
+
:cgi_data => cgi_data,
|
316
|
+
:session_data => session_data}
|
359
317
|
end
|
360
318
|
|
361
319
|
def find_session_data
|
@@ -10,31 +10,33 @@ module Airbrake
|
|
10
10
|
private
|
11
11
|
|
12
12
|
def airbrake_javascript_notifier
|
13
|
-
|
13
|
+
if Airbrake.configuration.public?
|
14
|
+
airbrake_javascript_loader + airbrake_javascript_configuration
|
15
|
+
end
|
14
16
|
end
|
15
17
|
|
16
18
|
def airbrake_javascript_loader
|
17
|
-
|
18
|
-
|
19
|
-
path = File.join File.dirname(__FILE__), '..', '..', 'templates', 'javascript_notifier_loader'
|
19
|
+
if Airbrake.configuration.public?
|
20
|
+
path = File.join File.dirname(__FILE__), '..', '..', 'templates', 'javascript_notifier_loader'
|
20
21
|
|
21
|
-
|
22
|
+
_airbrake_render_part path
|
23
|
+
end
|
22
24
|
end
|
23
25
|
|
24
26
|
def airbrake_javascript_configuration
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
27
|
+
if Airbrake.configuration.public?
|
28
|
+
path = File.join File.dirname(__FILE__), '..', '..', 'templates', 'javascript_notifier_configuration'
|
29
|
+
|
30
|
+
options = {
|
31
|
+
:api_key => Airbrake.configuration.js_api_key,
|
32
|
+
:environment => Airbrake.configuration.environment_name,
|
33
|
+
:action_name => action_name,
|
34
|
+
:controller_name => controller_name,
|
35
|
+
:url => request.url
|
36
|
+
}
|
37
|
+
|
38
|
+
_airbrake_render_part path, options
|
39
|
+
end
|
38
40
|
end
|
39
41
|
|
40
42
|
protected
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module Airbrake
|
2
|
+
module Utils
|
3
|
+
class ParamsCleaner
|
4
|
+
attr_writer :filters, :to_clean
|
5
|
+
attr_reader :parameters, :cgi_data, :session_data
|
6
|
+
|
7
|
+
# Public: Initialize a new Airbrake::Utils::ParamsCleaner
|
8
|
+
#
|
9
|
+
# opts - The Hash options that contain filters and params (default: {}):
|
10
|
+
# :filters - The Array of param keys that should be filtered
|
11
|
+
# :to_clean - The Hash of unfiltered params
|
12
|
+
def initialize(opts = {})
|
13
|
+
@filters = opts[:filters] || {}
|
14
|
+
@to_clean = opts[:to_clean]
|
15
|
+
end
|
16
|
+
|
17
|
+
# Public: Takes the params to_clean passed in an initializer
|
18
|
+
# and filters them out by filters passed.
|
19
|
+
#
|
20
|
+
# Also normalizes unserializable data.
|
21
|
+
#
|
22
|
+
# Returns self, so that :parameters, :cgi_data, :session_data
|
23
|
+
# could be extracted
|
24
|
+
def clean
|
25
|
+
clean_parameters
|
26
|
+
clean_session_data
|
27
|
+
clean_cgi_data
|
28
|
+
clean_rack_request_data
|
29
|
+
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def clean_parameters
|
36
|
+
if params = @to_clean[:parameters]
|
37
|
+
@parameters = clean_unserializable_data(params)
|
38
|
+
@parameters = filter @parameters
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def clean_cgi_data
|
43
|
+
if params = @to_clean[:cgi_data]
|
44
|
+
@cgi_data = clean_unserializable_data params
|
45
|
+
@cgi_data = filter @cgi_data
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def clean_session_data
|
50
|
+
if params = @to_clean[:session_data]
|
51
|
+
@session_data = clean_unserializable_data params
|
52
|
+
@session_data = filter @session_data
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def clean_rack_request_data
|
57
|
+
if @cgi_data
|
58
|
+
@cgi_data.delete("rack.request.form_vars")
|
59
|
+
@cgi_data.delete("action_dispatch.secret_token")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def filter_key?(key)
|
64
|
+
@filters.any? do |filter|
|
65
|
+
key.to_s.eql?(filter.to_s)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def filter(hash)
|
70
|
+
hash.each do |key, value|
|
71
|
+
if filter_key?(key)
|
72
|
+
hash[key] = "[FILTERED]"
|
73
|
+
elsif value.respond_to?(:to_hash)
|
74
|
+
filter(hash[key])
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Removes non-serializable data. Allowed data types are strings, arrays,
|
80
|
+
# and hashes. All other types are converted to strings.
|
81
|
+
def clean_unserializable_data(data, stack = [])
|
82
|
+
return "[possible infinite recursion halted]" if stack.any?{|item| item == data.object_id }
|
83
|
+
|
84
|
+
if data.respond_to?(:to_hash)
|
85
|
+
data.to_hash.inject({}) do |result, (key, value)|
|
86
|
+
result.merge(key => clean_unserializable_data(value, stack + [data.object_id]))
|
87
|
+
end
|
88
|
+
elsif data.respond_to?(:to_ary)
|
89
|
+
data.to_ary.collect do |value|
|
90
|
+
clean_unserializable_data(value, stack + [data.object_id])
|
91
|
+
end
|
92
|
+
else
|
93
|
+
data.to_s
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
data/lib/airbrake/version.rb
CHANGED
data/resources/notice.xml
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?><notice version="2.4"><api-key>myapikey</api-key><notifier><name>Airbrake Notifier</name><version>3.1.
|
2
|
-
Testing airbrake via "rake airbrake:test". If you can see this, it works.</message><backtrace><line number="432" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?><notice version="2.4"><api-key>myapikey</api-key><notifier><name>Airbrake Notifier</name><version>3.1.13</version><url>https://github.com/airbrake/airbrake</url></notifier><error><class>AirbrakeTestingException</class><message>AirbrakeTestingException:
|
2
|
+
Testing airbrake via "rake airbrake:test". If you can see this, it works.</message><backtrace><line number="432" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="_run__1847088340968181607__process_action__2679515661620244747__callbacks"/><line number="410" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="_run_process_action_callbacks"/><line number="94" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="run_callbacks"/><line number="17" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/abstract_controller/callbacks.rb" method="process_action"/><line number="17" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/rescue.rb" method="process_action"/><line number="30" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/instrumentation.rb" method="block in process_action"/><line number="52" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/notifications.rb" method="block in instrument"/><line number="21" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/notifications/instrumenter.rb" method="instrument"/><line number="52" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/notifications.rb" method="instrument"/><line number="29" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/instrumentation.rb" method="process_action"/><line number="119" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/abstract_controller/base.rb" method="process"/><line number="41" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/abstract_controller/rendering.rb" method="process"/><line number="138" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal.rb" method="dispatch"/><line number="14" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal/rack_delegation.rb" method="dispatch"/><line number="178" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_controller/metal.rb" method="block in action"/><line number="68" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/routing/route_set.rb" method="call"/><line number="68" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/routing/route_set.rb" method="dispatch"/><line number="33" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/routing/route_set.rb" method="call"/><line number="148" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/route_set.rb" method="block in call"/><line number="93" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/code_generation.rb" method="block in recognize"/><line number="68" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/code_generation.rb" method="optimized_each"/><line number="92" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/code_generation.rb" method="recognize"/><line number="139" file="[GEM_ROOT]/gems/rack-mount-0.6.14/lib/rack/mount/route_set.rb" method="call"/><line number="499" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/routing/route_set.rb" method="call"/><line number="17" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/best_standards_support.rb" method="call"/><line number="14" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/head.rb" method="call"/><line number="24" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/methodoverride.rb" method="call"/><line number="21" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/params_parser.rb" method="call"/><line number="182" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/flash.rb" method="call"/><line number="149" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/session/abstract_store.rb" method="call"/><line number="302" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/cookies.rb" method="call"/><line number="46" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/callbacks.rb" method="block in call"/><line number="416" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/callbacks.rb" method="_run_call_callbacks"/><line number="44" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/callbacks.rb" method="call"/><line number="106" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/sendfile.rb" method="call"/><line number="48" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/remote_ip.rb" method="call"/><line number="13" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/rack/logger.rb" method="call"/><line number="17" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/runtime.rb" method="call"/><line number="72" file="[GEM_ROOT]/gems/activesupport-3.0.20/lib/active_support/cache/strategy/local_cache.rb" method="call"/><line number="13" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/lock.rb" method="block in call"/><line number="" file="" method=""/><line number="13" file="[GEM_ROOT]/gems/rack-1.2.8/lib/rack/lock.rb" method="call"/><line number="30" file="[GEM_ROOT]/gems/actionpack-3.0.20/lib/action_dispatch/middleware/static.rb" method="call"/><line number="168" file="[GEM_ROOT]/gems/railties-3.0.20/lib/rails/application.rb" method="call"/><line number="236" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="call"/><line number="236" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="block in execute"/><line number="231" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="each"/><line number="231" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="execute"/><line number="175" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="block in invoke_with_call_chain"/><line number="211" file="/opt/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/monitor.rb" method="mon_synchronize"/><line number="168" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="invoke_with_call_chain"/><line number="161" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/task.rb" method="invoke"/><line number="149" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="invoke_task"/><line number="106" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="block (2 levels) in top_level"/><line number="106" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="each"/><line number="106" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="block in top_level"/><line number="115" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="run_with_threads"/><line number="100" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="top_level"/><line number="78" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="block in run"/><line number="165" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="standard_exception_handling"/><line number="75" file="[GEM_ROOT]/gems/rake-10.1.0/lib/rake/application.rb" method="run"/><line number="33" file="[GEM_ROOT]/gems/rake-10.1.0/bin/rake" method="<top (required)>"/><line number="23" file="[GEM_ROOT]/bin/rake" method="load"/><line number="23" file="[GEM_ROOT]/bin/rake" method="<main>"/></backtrace></error><request><url>http://www.example.com/verify</url><component>application</component><action>verify</action><params><var key="action">verify</var><var key="controller">application</var></params><cgi-data><var key="rack.version">["1", "1"]</var><var key="rack.input">#<StringIO:0x0000000357f410></var><var key="rack.errors">#<StringIO:0x0000000357f4b0></var><var key="rack.multithread">false</var><var key="rack.multiprocess">true</var><var key="rack.run_once">false</var><var key="REQUEST_METHOD">GET</var><var key="SERVER_NAME">www.example.com</var><var key="SERVER_PORT">80</var><var key="QUERY_STRING"></var><var key="PATH_INFO">/verify</var><var key="rack.url_scheme">http</var><var key="HTTPS">off</var><var key="SCRIPT_NAME"></var><var key="CONTENT_LENGTH">0</var><var key="action_dispatch.parameter_filter">["password"]</var><var key="action_dispatch.show_exceptions">false</var><var key="action_dispatch.remote_ip"></var><var key="rack.session"></var><var key="rack.session.options"><var key="path">/</var><var key="domain"></var><var key="expire_after"></var><var key="secure">false</var><var key="httponly">true</var><var key="id"></var></var><var key="action_dispatch.cookies"></var><var key="action_dispatch.request.unsigned_session_cookie"></var><var key="action_dispatch.request.path_parameters"><var key="action">verify</var><var key="controller">application</var></var><var key="action_controller.instance">#<ApplicationController:0x000000035906e8></var><var key="action_dispatch.request.content_type"></var><var key="action_dispatch.request.request_parameters"></var><var key="rack.request.query_string"></var><var key="rack.request.query_hash"></var><var key="action_dispatch.request.query_parameters"></var><var key="action_dispatch.request.parameters"><var key="action">verify</var><var key="controller">application</var></var><var key="action_dispatch.request.formats">["text/html"]</var></cgi-data></request><server-environment><project-root>/home/hrvoje/code/work/airbrake/tmp/rails_root</project-root><environment-name>test</environment-name><hostname>hrvoje-Aspire-5741G</hostname></server-environment><framework>Rails: 3.0.20</framework></notice>
|
data/test/airbrake_tasks_test.rb
CHANGED
@@ -2,9 +2,6 @@ require File.expand_path '../helper', __FILE__
|
|
2
2
|
require 'rubygems'
|
3
3
|
|
4
4
|
require File.dirname(__FILE__) + '/../lib/airbrake_tasks'
|
5
|
-
require 'fakeweb'
|
6
|
-
|
7
|
-
FakeWeb.allow_net_connect = false
|
8
5
|
|
9
6
|
class AirbrakeTasksTest < Test::Unit::TestCase
|
10
7
|
def successful_response(body = "")
|
data/test/helper.rb
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
require "simplecov"
|
2
|
+
|
3
|
+
if ENV["INTEGRATION"] then SimpleCov.command_name "test:integration"
|
4
|
+
else SimpleCov.command_name "test:units"
|
5
|
+
end
|
6
|
+
|
7
|
+
SimpleCov.merge_timeout 3600
|
8
|
+
SimpleCov.start
|
9
|
+
|
10
|
+
if ENV["CI"]
|
11
|
+
require "coveralls"
|
12
|
+
Coveralls.wear_merged!
|
13
|
+
end
|
14
|
+
|
1
15
|
$VERBOSE = ENV["VERBOSE"]
|
2
16
|
|
3
17
|
module Kernel
|
@@ -27,14 +41,20 @@ silence_warnings do
|
|
27
41
|
require 'json-schema'
|
28
42
|
require "shoulda-matchers"
|
29
43
|
require "shoulda-context"
|
44
|
+
require "fakeweb"
|
45
|
+
|
30
46
|
begin require 'redgreen'; rescue LoadError; end
|
31
47
|
end
|
32
48
|
|
33
49
|
$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
|
34
50
|
|
35
|
-
|
36
51
|
require "airbrake"
|
37
52
|
|
53
|
+
XSD_SCHEMA_PATH = "http://airbrake.io/airbrake_#{Airbrake::API_VERSION.tr(".","_")}.xsd"
|
54
|
+
COVERALLS_API_URL = "https://coveralls.io/api/v1"
|
55
|
+
|
56
|
+
FakeWeb.allow_net_connect = %r{#{XSD_SCHEMA_PATH}|#{COVERALLS_API_URL}}
|
57
|
+
|
38
58
|
module TestMethods
|
39
59
|
def rescue_action e
|
40
60
|
raise e
|
@@ -47,4 +47,10 @@ class JavascriptNotifierTest < Test::Unit::TestCase
|
|
47
47
|
assert controller.send(:airbrake_javascript_notifier)['"ESCbad_javascriptESC"']
|
48
48
|
assert ! controller.send(:airbrake_javascript_notifier)['"bad_javascript"']
|
49
49
|
end
|
50
|
+
|
51
|
+
should "not raise exceptions for the non-public requests" do
|
52
|
+
Airbrake::Configuration.any_instance.stubs(:public? => false)
|
53
|
+
controller = FakeController.new
|
54
|
+
assert_nothing_raised { controller.send(:airbrake_javascript_notifier) }
|
55
|
+
end
|
50
56
|
end
|
data/test/notice_test.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
require File.expand_path '../helper', __FILE__
|
2
2
|
|
3
|
-
XSD_SCHEMA_PATH = "http://airbrake.io/airbrake_#{Airbrake::API_VERSION.tr(".","_")}.xsd"
|
4
|
-
FakeWeb.allow_net_connect = %r{#{XSD_SCHEMA_PATH}}
|
5
3
|
|
6
4
|
class NoticeTest < Test::Unit::TestCase
|
7
5
|
|
@@ -44,25 +42,6 @@ class NoticeTest < Test::Unit::TestCase
|
|
44
42
|
"#{attribute} was not correctly set from a hash"
|
45
43
|
end
|
46
44
|
|
47
|
-
def assert_serializes_hash(attribute)
|
48
|
-
[File.open(__FILE__), Proc.new { puts "boo!" }, Module.new].each do |object|
|
49
|
-
hash = {
|
50
|
-
:strange_object => object,
|
51
|
-
:sub_hash => {
|
52
|
-
:sub_object => object
|
53
|
-
},
|
54
|
-
:array => [object]
|
55
|
-
}
|
56
|
-
notice = build_notice(attribute => hash)
|
57
|
-
hash = notice.send(attribute)
|
58
|
-
assert_equal object.to_s, hash[:strange_object], "objects should be serialized"
|
59
|
-
assert_kind_of Hash, hash[:sub_hash], "subhashes should be kept"
|
60
|
-
assert_equal object.to_s, hash[:sub_hash][:sub_object], "subhash members should be serialized"
|
61
|
-
assert_kind_of Array, hash[:array], "arrays should be kept"
|
62
|
-
assert_equal object.to_s, hash[:array].first, "array members should be serialized"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
45
|
def assert_valid_notice_document(document)
|
67
46
|
xsd_path = URI(XSD_SCHEMA_PATH)
|
68
47
|
schema = Nokogiri::XML::Schema.new(Net::HTTP.get(xsd_path))
|
@@ -76,22 +55,6 @@ class NoticeTest < Test::Unit::TestCase
|
|
76
55
|
assert errors.empty?, errors.join
|
77
56
|
end
|
78
57
|
|
79
|
-
def assert_filters_hash(attribute)
|
80
|
-
filters = ["abc", :def]
|
81
|
-
original = { 'abc' => "123", 'def' => "456", 'ghi' => "789", 'nested' => { 'abc' => '100' },
|
82
|
-
'something_with_abc' => 'match the entire string'}
|
83
|
-
filtered = { 'abc' => "[FILTERED]",
|
84
|
-
'def' => "[FILTERED]",
|
85
|
-
'something_with_abc' => "match the entire string",
|
86
|
-
'ghi' => "789",
|
87
|
-
'nested' => { 'abc' => '[FILTERED]' } }
|
88
|
-
|
89
|
-
notice = build_notice(:params_filters => filters, attribute => original)
|
90
|
-
|
91
|
-
assert_equal(filtered,
|
92
|
-
notice.send(attribute))
|
93
|
-
end
|
94
|
-
|
95
58
|
def build_backtrace_array
|
96
59
|
["app/models/user.rb:13:in `magic'",
|
97
60
|
"app/controllers/users_controller.rb:8:in `index'"]
|
@@ -106,6 +69,12 @@ class NoticeTest < Test::Unit::TestCase
|
|
106
69
|
new("darth@vader.com",1,"Anakin Skywalker")
|
107
70
|
end
|
108
71
|
|
72
|
+
should "call the cleaner on initialization" do
|
73
|
+
cleaner = stub
|
74
|
+
cleaner.expects(:clean).returns(stub(:parameters => {}, :cgi_data => {}, :session_data => {}))
|
75
|
+
Airbrake::Notice.new(:cleaner => cleaner)
|
76
|
+
end
|
77
|
+
|
109
78
|
should "set the api key" do
|
110
79
|
api_key = 'key'
|
111
80
|
notice = build_notice(:api_key => api_key)
|
@@ -249,43 +218,6 @@ class NoticeTest < Test::Unit::TestCase
|
|
249
218
|
assert_array_starts_with backtrace.lines, notice.backtrace.lines
|
250
219
|
end
|
251
220
|
|
252
|
-
should "convert unserializable objects to strings" do
|
253
|
-
assert_serializes_hash(:parameters)
|
254
|
-
assert_serializes_hash(:cgi_data)
|
255
|
-
assert_serializes_hash(:session_data)
|
256
|
-
end
|
257
|
-
|
258
|
-
should "filter parameters" do
|
259
|
-
assert_filters_hash(:parameters)
|
260
|
-
end
|
261
|
-
|
262
|
-
should "filter cgi data" do
|
263
|
-
assert_filters_hash(:cgi_data)
|
264
|
-
end
|
265
|
-
|
266
|
-
should "filter session" do
|
267
|
-
assert_filters_hash(:session_data)
|
268
|
-
end
|
269
|
-
|
270
|
-
should "should always remove a Rails application's secret token" do
|
271
|
-
original = {
|
272
|
-
"action_dispatch.secret_token" => "abc123xyz456",
|
273
|
-
"abc" => "123"
|
274
|
-
}
|
275
|
-
notice = build_notice(:cgi_data => original)
|
276
|
-
assert_equal({"abc" => "123"}, notice.cgi_data)
|
277
|
-
end
|
278
|
-
|
279
|
-
should "remove rack.request.form_vars" do
|
280
|
-
original = {
|
281
|
-
"rack.request.form_vars" => "story%5Btitle%5D=The+TODO+label",
|
282
|
-
"abc" => "123"
|
283
|
-
}
|
284
|
-
|
285
|
-
notice = build_notice(:cgi_data => original)
|
286
|
-
assert_equal({"abc" => "123"}, notice.cgi_data)
|
287
|
-
end
|
288
|
-
|
289
221
|
context "a Notice turned into JSON" do
|
290
222
|
setup do
|
291
223
|
@exception = build_exception
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require File.expand_path '../helper', __FILE__
|
2
|
+
|
3
|
+
class ParamsCleanerTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def clean(opts = {})
|
6
|
+
cleaner = Airbrake::Utils::ParamsCleaner.new(:filters => opts.delete(:params_filters),
|
7
|
+
:to_clean => opts)
|
8
|
+
cleaner.clean
|
9
|
+
end
|
10
|
+
|
11
|
+
def assert_serializes_hash(attribute)
|
12
|
+
[File.open(__FILE__), Proc.new { puts "boo!" }, Module.new].each do |object|
|
13
|
+
hash = {
|
14
|
+
:strange_object => object,
|
15
|
+
:sub_hash => {
|
16
|
+
:sub_object => object
|
17
|
+
},
|
18
|
+
:array => [object]
|
19
|
+
}
|
20
|
+
clean_params = clean(attribute => hash)
|
21
|
+
hash = clean_params.send(attribute)
|
22
|
+
assert_equal object.to_s, hash[:strange_object], "objects should be serialized"
|
23
|
+
assert_kind_of Hash, hash[:sub_hash], "subhashes should be kept"
|
24
|
+
assert_equal object.to_s, hash[:sub_hash][:sub_object], "subhash members should be serialized"
|
25
|
+
assert_kind_of Array, hash[:array], "arrays should be kept"
|
26
|
+
assert_equal object.to_s, hash[:array].first, "array members should be serialized"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def assert_filters_hash(attribute)
|
31
|
+
filters = ["abc", :def]
|
32
|
+
original = { 'abc' => "123", 'def' => "456", 'ghi' => "789", 'nested' => { 'abc' => '100' },
|
33
|
+
'something_with_abc' => 'match the entire string'}
|
34
|
+
filtered = { 'abc' => "[FILTERED]",
|
35
|
+
'def' => "[FILTERED]",
|
36
|
+
'something_with_abc' => "match the entire string",
|
37
|
+
'ghi' => "789",
|
38
|
+
'nested' => { 'abc' => '[FILTERED]' } }
|
39
|
+
|
40
|
+
clean_params = clean(:params_filters => filters,
|
41
|
+
attribute => original)
|
42
|
+
|
43
|
+
assert_equal(filtered,
|
44
|
+
clean_params.send(attribute))
|
45
|
+
end
|
46
|
+
|
47
|
+
should "should always remove a Rails application's secret token" do
|
48
|
+
original = {
|
49
|
+
"action_dispatch.secret_token" => "abc123xyz456",
|
50
|
+
"abc" => "123"
|
51
|
+
}
|
52
|
+
clean_params = clean(:cgi_data => original)
|
53
|
+
assert_equal({"abc" => "123"}, clean_params.cgi_data)
|
54
|
+
end
|
55
|
+
|
56
|
+
should "remove rack.request.form_vars" do
|
57
|
+
original = {
|
58
|
+
"rack.request.form_vars" => "story%5Btitle%5D=The+TODO+label",
|
59
|
+
"abc" => "123"
|
60
|
+
}
|
61
|
+
|
62
|
+
clean_params = clean(:cgi_data => original)
|
63
|
+
assert_equal({"abc" => "123"}, clean_params.cgi_data)
|
64
|
+
end
|
65
|
+
|
66
|
+
should "filter parameters" do
|
67
|
+
assert_filters_hash(:parameters)
|
68
|
+
end
|
69
|
+
|
70
|
+
should "filter cgi data" do
|
71
|
+
assert_filters_hash(:cgi_data)
|
72
|
+
end
|
73
|
+
|
74
|
+
should "filter session" do
|
75
|
+
assert_filters_hash(:session_data)
|
76
|
+
end
|
77
|
+
|
78
|
+
should "convert unserializable objects to strings" do
|
79
|
+
assert_serializes_hash(:parameters)
|
80
|
+
assert_serializes_hash(:cgi_data)
|
81
|
+
assert_serializes_hash(:session_data)
|
82
|
+
end
|
83
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: airbrake
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.
|
4
|
+
version: 3.1.14
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-08-
|
12
|
+
date: 2013-08-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: builder
|
@@ -283,6 +283,22 @@ dependencies:
|
|
283
283
|
- - ! '>='
|
284
284
|
- !ruby/object:Gem::Version
|
285
285
|
version: '0'
|
286
|
+
- !ruby/object:Gem::Dependency
|
287
|
+
name: coveralls
|
288
|
+
requirement: !ruby/object:Gem::Requirement
|
289
|
+
none: false
|
290
|
+
requirements:
|
291
|
+
- - ! '>='
|
292
|
+
- !ruby/object:Gem::Version
|
293
|
+
version: '0'
|
294
|
+
type: :development
|
295
|
+
prerelease: false
|
296
|
+
version_requirements: !ruby/object:Gem::Requirement
|
297
|
+
none: false
|
298
|
+
requirements:
|
299
|
+
- - ! '>='
|
300
|
+
- !ruby/object:Gem::Version
|
301
|
+
version: '0'
|
286
302
|
description:
|
287
303
|
email: support@airbrake.io
|
288
304
|
executables:
|
@@ -303,6 +319,7 @@ files:
|
|
303
319
|
- lib/airbrake/rails.rb
|
304
320
|
- lib/airbrake/version.rb
|
305
321
|
- lib/airbrake/rails3_tasks.rb
|
322
|
+
- lib/airbrake/utils/params_cleaner.rb
|
306
323
|
- lib/airbrake/user_informer.rb
|
307
324
|
- lib/airbrake/cli/project_factory.rb
|
308
325
|
- lib/airbrake/cli/printer.rb
|
@@ -352,6 +369,7 @@ files:
|
|
352
369
|
- test/integration/javascript_notifier_test.rb
|
353
370
|
- test/integration/catcher_test.rb
|
354
371
|
- test/notifier_test.rb
|
372
|
+
- test/params_cleaner_test.rb
|
355
373
|
- test/configuration_test.rb
|
356
374
|
- test/integration.rb
|
357
375
|
- test/airbrake_tasks_test.rb
|
@@ -414,6 +432,7 @@ test_files:
|
|
414
432
|
- test/integration/javascript_notifier_test.rb
|
415
433
|
- test/integration/catcher_test.rb
|
416
434
|
- test/notifier_test.rb
|
435
|
+
- test/params_cleaner_test.rb
|
417
436
|
- test/configuration_test.rb
|
418
437
|
- test/integration.rb
|
419
438
|
- test/airbrake_tasks_test.rb
|
@@ -445,4 +464,3 @@ test_files:
|
|
445
464
|
- features/rake.feature
|
446
465
|
- features/rails_with_js_notifier.feature
|
447
466
|
- features/sinatra.feature
|
448
|
-
has_rdoc:
|