airbrake 3.1.13 → 3.1.14
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.
- 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
|
+
[](https://codeclimate.com/github/airbrake/airbrake)
|
5
|
+
[](https://coveralls.io/r/airbrake/airbrake?branch=master)
|
6
|
+
[](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:
|