guard-brakeman 0.1.8 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +4 -2
- data/lib/guard/brakeman.rb +65 -20
- metadata +6 -38
data/README.md
CHANGED
@@ -46,8 +46,10 @@ Please read the [Guard documentation](http://github.com/guard/guard#readme) for
|
|
46
46
|
### List of available options
|
47
47
|
|
48
48
|
```ruby
|
49
|
-
:notifications
|
50
|
-
:run_on_start
|
49
|
+
:notifications => false # display Growl notifications, defaults to true
|
50
|
+
:run_on_start => true # run all checks on startup, defaults to false
|
51
|
+
:min_confidence => 3 # only alert on warnings above a threshold, defaults to 1
|
52
|
+
:chatty => true # notify on ALL changes. Defaults to false, only new or fixed warnings trigger a Growl
|
51
53
|
```
|
52
54
|
|
53
55
|
## Brakeman configuration
|
data/lib/guard/brakeman.rb
CHANGED
@@ -11,9 +11,23 @@ module Guard
|
|
11
11
|
class Brakeman < Guard
|
12
12
|
def initialize(watchers = [], options = { })
|
13
13
|
super
|
14
|
+
|
15
|
+
if options[:skip_checks]
|
16
|
+
options[:skip_checks] = options[:skip_checks].map do |val|
|
17
|
+
# mimic Brakeman::set_options behavior
|
18
|
+
val[0,5] == "Check" ? val : "Check" << val
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# chatty implies notifications
|
23
|
+
options[:notifications] = true if options[:chatty]
|
24
|
+
|
25
|
+
# TODO mixing the use of this attr, good to match? Bad to couple?
|
14
26
|
@options = {
|
15
27
|
:notifications => true,
|
16
|
-
:run_on_start => false
|
28
|
+
:run_on_start => false,
|
29
|
+
:chatty => false,
|
30
|
+
:min_confidence => 1
|
17
31
|
}.update(options)
|
18
32
|
end
|
19
33
|
|
@@ -22,11 +36,15 @@ module Guard
|
|
22
36
|
# @raise [:task_has_failed] when stop has failed
|
23
37
|
#
|
24
38
|
def start
|
25
|
-
scanner_opts = ::Brakeman::set_options(:app_path => '.')
|
39
|
+
scanner_opts = ::Brakeman::set_options({:app_path => '.'}.merge(@options))
|
26
40
|
@scanner = ::Brakeman::Scanner.new(scanner_opts)
|
27
41
|
@tracker = @scanner.process
|
28
42
|
|
29
|
-
|
43
|
+
if @options[:run_on_start]
|
44
|
+
run_all
|
45
|
+
elsif @options[:chatty]
|
46
|
+
Notifier.notify("Brakeman is ready to work!", :title => "Brakeman started", :image => :pending)
|
47
|
+
end
|
30
48
|
end
|
31
49
|
|
32
50
|
# Gets called when all checks should be run.
|
@@ -48,7 +66,7 @@ module Guard
|
|
48
66
|
def run_on_change(paths)
|
49
67
|
return run_all unless @tracker.checks
|
50
68
|
|
51
|
-
UI.info "
|
69
|
+
UI.info "\n\nrescanning #{paths}, running all checks"
|
52
70
|
report = ::Brakeman::rescan(@tracker, paths)
|
53
71
|
print_changed(report)
|
54
72
|
throw :task_has_failed if report.any_warnings?
|
@@ -59,41 +77,68 @@ module Guard
|
|
59
77
|
def print_failed report
|
60
78
|
UI.info "\n------ brakeman warnings --------\n"
|
61
79
|
|
62
|
-
icon = report.all_warnings.count > 0 ? :
|
80
|
+
icon = report.all_warnings.count > 0 ? :failed : :success
|
81
|
+
|
82
|
+
all_warnings = reject_below_threshold(report.all_warnings)
|
63
83
|
|
64
|
-
|
65
|
-
|
84
|
+
puts all_warnings.sort_by { |w| w.confidence }
|
85
|
+
|
86
|
+
if @options[:chatty] && all_warnings.any?
|
87
|
+
Notifier.notify("#{all_warnings.count} brakeman findings", :title => "Full Brakeman results", :image => icon)
|
88
|
+
end
|
66
89
|
end
|
67
90
|
|
68
91
|
def print_changed report
|
69
92
|
UI.info "\n------ brakeman warnings --------\n"
|
70
93
|
|
71
94
|
message = ""
|
95
|
+
should_alert = false
|
72
96
|
|
73
|
-
|
74
|
-
|
97
|
+
fixed_warnings = reject_below_threshold(report.fixed_warnings)
|
98
|
+
if fixed_warnings.any?
|
75
99
|
icon = :success
|
76
|
-
|
77
|
-
|
100
|
+
results_notification = "#{fixed_warnings.length} fixed warning(s)\n"
|
101
|
+
UI.info(UI.send(:color, results_notification, 'green')) # janky
|
102
|
+
|
103
|
+
should_alert = true
|
104
|
+
message += results_notification
|
105
|
+
|
106
|
+
puts fixed_warnings.sort_by { |w| w.confidence }
|
78
107
|
puts
|
79
108
|
end
|
80
109
|
|
81
|
-
|
82
|
-
|
110
|
+
new_warnings = reject_below_threshold(report.new_warnings)
|
111
|
+
if new_warnings.any?
|
112
|
+
new_warning_message = "#{new_warnings.length} new warning(s)\n"
|
113
|
+
UI.error new_warning_message
|
114
|
+
message += new_warning_message
|
115
|
+
|
116
|
+
should_alert = true
|
83
117
|
icon = :failed
|
84
|
-
|
85
|
-
puts
|
118
|
+
|
119
|
+
puts new_warnings.sort_by { |w| w.confidence }
|
86
120
|
puts
|
87
121
|
end
|
88
122
|
|
89
|
-
|
123
|
+
existing_warnings = reject_below_threshold(report.existing_warnings)
|
124
|
+
if existing_warnings.any?
|
125
|
+
should_alert = true if @options[:chatty]
|
90
126
|
icon ||= :pending
|
91
|
-
|
92
|
-
|
93
|
-
|
127
|
+
|
128
|
+
existing_warning_message = "#{existing_warnings.length} previous warning(s)\n"
|
129
|
+
UI.warning existing_warning_message
|
130
|
+
message += existing_warning_message
|
131
|
+
|
132
|
+
puts existing_warnings.sort_by { |w| w.confidence }
|
133
|
+
end
|
134
|
+
|
135
|
+
if @options[:notifications] && should_alert
|
136
|
+
Notifier.notify(message.chomp, :title => "Brakeman results", :image => icon)
|
94
137
|
end
|
138
|
+
end
|
95
139
|
|
96
|
-
|
140
|
+
def reject_below_threshold(warnings)
|
141
|
+
warnings.reject {|w| w.confidence > (3 - @options[:min_confidence].to_i)}
|
97
142
|
end
|
98
143
|
end
|
99
144
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: guard-brakeman
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Neil Matatall
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-02-
|
18
|
+
date: 2012-02-02 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -50,38 +50,6 @@ dependencies:
|
|
50
50
|
version: 1.2.2
|
51
51
|
type: :runtime
|
52
52
|
version_requirements: *id002
|
53
|
-
- !ruby/object:Gem::Dependency
|
54
|
-
name: rspec
|
55
|
-
prerelease: false
|
56
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
hash: 23
|
62
|
-
segments:
|
63
|
-
- 2
|
64
|
-
- 6
|
65
|
-
- 0
|
66
|
-
version: 2.6.0
|
67
|
-
type: :development
|
68
|
-
version_requirements: *id003
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: guard-rspec
|
71
|
-
prerelease: false
|
72
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
|
-
requirements:
|
75
|
-
- - ~>
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
hash: 17
|
78
|
-
segments:
|
79
|
-
- 0
|
80
|
-
- 3
|
81
|
-
- 1
|
82
|
-
version: 0.3.1
|
83
|
-
type: :development
|
84
|
-
version_requirements: *id004
|
85
53
|
description: Guard::Brakeman automatically scans your Rails app for vulnerabilities
|
86
54
|
email:
|
87
55
|
- neil@matatall.com
|
@@ -128,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
128
96
|
requirements: []
|
129
97
|
|
130
98
|
rubyforge_project: guard-brakeman
|
131
|
-
rubygems_version: 1.6.
|
99
|
+
rubygems_version: 1.6.1
|
132
100
|
signing_key:
|
133
101
|
specification_version: 3
|
134
102
|
summary: Guard gem for Brakeman
|