spektr 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1fc431414443b9c71ebb40106d82714215ba142d1226b3580e324faf786f86ad
4
- data.tar.gz: d768f7a18250b9ad59f6331cf65a03fadd38a8501b2f24489a139c62c33d0730
3
+ metadata.gz: a10d35b4824401e5731ad470bbdc042ee63a11e9df5abd1eec5552005e44f25f
4
+ data.tar.gz: 28859b54116afb3847fcc96a32260aa00f8deb3d02135149a219d14fe58f4261
5
5
  SHA512:
6
- metadata.gz: 463d421a7a50013946fee4768b474fe2f0222522cd472351c2cb7a1a8d61a618c653944507fc7e101c606350a51731a30ec6d42a363da5e6b96d597035700ed9
7
- data.tar.gz: 185c2584b1dba4e5a81fbf6c31b9ae029c2292eedd6c8366d1bb89eb146f02329810465306c2e0bc99482782d3fbe81782f36511c57c52a21341e8d26bd647ca
6
+ metadata.gz: a78047b2e601f90fe6008ebfb2ea0c440e4168ee9493fcd5f6ad83108a752fabfec9f957d0892b302565a0549220179e3a796dc9bc0fd7ab35ccfd9db61bffd9
7
+ data.tar.gz: fdc98737aed0b3fcc042cb745b6093d2a17790705932096df952ff48e8eea714275f57a3a9f9313d60e5fb5fc4798da23e5af8695e5e914c7aa08c79cc5074a4
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
1
  # Change Log
2
2
 
3
3
  ## Unreleased
4
+
5
+ ## 0.3.0
6
+
7
+ * Add support to ignore findings
8
+
9
+ ## 0.2.0
10
+
11
+ * add Slim support
data/Gemfile.lock CHANGED
@@ -1,13 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- spektr (0.1.0)
4
+ spektr (0.3.0)
5
5
  activesupport (~> 6.1.0)
6
6
  erubi
7
7
  haml (~> 5.1)
8
8
  parser (~> 3.0.0)
9
9
  pastel
10
10
  ruby_parser (~> 3.13)
11
+ slim
11
12
  tty-color
12
13
  tty-option
13
14
  tty-spinner
@@ -18,7 +19,7 @@ PATH
18
19
  GEM
19
20
  remote: https://rubygems.org/
20
21
  specs:
21
- activesupport (6.1.6)
22
+ activesupport (6.1.7)
22
23
  concurrent-ruby (~> 1.0, >= 1.0.2)
23
24
  i18n (>= 1.6, < 2)
24
25
  minitest (>= 5.1)
@@ -29,7 +30,7 @@ GEM
29
30
  coderay (1.1.3)
30
31
  concurrent-ruby (1.1.10)
31
32
  diff-lcs (1.5.0)
32
- erubi (1.10.0)
33
+ erubi (1.11.0)
33
34
  ffi (1.15.5)
34
35
  formatador (0.3.0)
35
36
  guard (2.18.0)
@@ -48,7 +49,7 @@ GEM
48
49
  haml (5.2.2)
49
50
  temple (>= 0.8.0)
50
51
  tilt
51
- i18n (1.10.0)
52
+ i18n (1.12.0)
52
53
  concurrent-ruby (~> 1.0)
53
54
  listen (3.7.1)
54
55
  rb-fsevent (~> 0.10, >= 0.10.3)
@@ -91,6 +92,9 @@ GEM
91
92
  sexp_processor (~> 4.16)
92
93
  sexp_processor (4.16.1)
93
94
  shellany (0.0.1)
95
+ slim (4.1.0)
96
+ temple (>= 0.7.6, < 0.9)
97
+ tilt (>= 2.0.6, < 2.1)
94
98
  strings (0.2.1)
95
99
  strings-ansi (~> 0.2)
96
100
  unicode-display_width (>= 1.5, < 3.0)
@@ -98,7 +102,7 @@ GEM
98
102
  strings-ansi (0.2.0)
99
103
  temple (0.8.2)
100
104
  thor (1.2.1)
101
- tilt (2.0.10)
105
+ tilt (2.0.11)
102
106
  tty-color (0.6.0)
103
107
  tty-cursor (0.7.1)
104
108
  tty-option (0.2.0)
@@ -109,14 +113,14 @@ GEM
109
113
  pastel (~> 0.8)
110
114
  strings (~> 0.2.0)
111
115
  tty-screen (~> 0.8)
112
- tzinfo (2.0.4)
116
+ tzinfo (2.0.5)
113
117
  concurrent-ruby (~> 1.0)
114
118
  unicode-display_width (2.1.0)
115
119
  unicode_utils (1.4.0)
116
120
  unparser (0.6.2)
117
121
  diff-lcs (~> 1.3)
118
122
  parser (>= 3.0.0)
119
- zeitwerk (2.6.0)
123
+ zeitwerk (2.6.1)
120
124
 
121
125
  PLATFORMS
122
126
  ruby
data/README.md CHANGED
@@ -34,6 +34,20 @@ If you want to scan an app in another folder:
34
34
  spektr path/to/app
35
35
  ```
36
36
 
37
+ To see the available options, you can run `spektr --help`.
38
+
39
+ To ignore a finding, you can use the `--ignore` flag with a comma separated list of fingerprints from the report.
40
+
41
+
42
+ ### Railsgoat Example output
43
+
44
+ ![Railgoat example](https://github.com/gregmolnar/spektr/blob/master/railsgoat-example.png)
45
+
46
+ ### False positives
47
+
48
+ Due to the nature of static-code analysis, Spektr might report false positives. Please report them, so I can try
49
+ to tweak the check.
50
+
37
51
 
38
52
  ## Development
39
53
 
@@ -43,12 +57,13 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
43
57
 
44
58
  ## Contributing
45
59
 
46
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/spektr. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/gregmolnar/spektr/blob/master/CODE_OF_CONDUCT.md).
60
+ Bug reports and pull requests are welcome on GitHub at https://github.com/gregmolnar/spektr. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/gregmolnar/spektr/blob/master/CODE_OF_CONDUCT.md).
47
61
 
48
62
 
49
63
  ## License
50
64
 
51
- The gem is available as open source under the terms described in the [licence](https://github.com/gregmolnar/spektr/blob/master/licence.txt). Non-commercial use is free of charge, to obtain a commercial licence, contact us at info[at]spektrhq.com.
65
+ The gem is available as open source under the terms described in the [licence](https://github.com/gregmolnar/spektr/blob/master/LICENSE.txt). Non-commercial use is free of charge, to obtain a commercial licence, contact us at info[at]spektrhq.com.
66
+ If you are looking for a hosted solution, take a look at [SpektrHQ](https://spektrhq.com).
52
67
 
53
68
 
54
69
  ## Code of Conduct
@@ -63,7 +78,7 @@ Yes, this is perfectly fine without obtaining a licence. You can however donate
63
78
 
64
79
  ### I want to use Spektr in my automated code analyser SaaS, do I need a commercial licence?
65
80
 
66
- Yes, plese get in touch at info[at]spektrhq.com and we will work something out.
81
+ Yes, please get in touch at info[at]spektrhq.com and we will work something out.
67
82
 
68
83
  ### I am a penetration tester and I'd like to use Spektr to audit on a paid engagement. Do I need a commercial licence?
69
84
 
data/lib/spektr/app.rb CHANGED
@@ -7,7 +7,7 @@ module Spektr
7
7
  @@parser ||= Parser::CurrentRuby
8
8
  end
9
9
 
10
- def initialize(checks:, root: './')
10
+ def initialize(checks:, ignore:, root: './')
11
11
  @root = root
12
12
  @checks = checks
13
13
  @controllers = []
@@ -17,6 +17,7 @@ module Spektr
17
17
  app: {},
18
18
  advisories: []
19
19
  }
20
+ @ignore = ignore || []
20
21
  @ruby_version = '2.7.1'
21
22
  version_file = File.join(root, '.ruby-version')
22
23
  @ruby_version = File.read(version_file).lines.first if File.exist?(version_file)
@@ -137,7 +138,7 @@ module Spektr
137
138
  self
138
139
  end
139
140
 
140
- def report(_format = 'terminal')
141
+ def report
141
142
  @json_output[:app][:rails_version] = @rails_version
142
143
  @json_output[:app][:initializers] = @initializers.size
143
144
  @json_output[:app][:controllers] = @controllers.size
@@ -147,13 +148,16 @@ module Spektr
147
148
  @json_output[:app][:lib_files] = @lib_files.size
148
149
 
149
150
  @warnings.each do |warning|
151
+ next if @ignore.include?(warning.fingerprint)
152
+
150
153
  @json_output[:advisories] << {
151
154
  name: warning.check.name,
152
155
  description: warning.message,
153
156
  path: warning.path,
154
157
  location: warning.location&.line,
155
158
  line: warning.line,
156
- check: warning.check.class.name
159
+ check: warning.check.class.name,
160
+ fingerprint: warning.fingerprint
157
161
  }
158
162
  end
159
163
 
data/lib/spektr/cli.rb CHANGED
@@ -25,6 +25,11 @@ module Spektr
25
25
  desc 'run this single check'
26
26
  end
27
27
 
28
+ flag :ignore do
29
+ long '--ignore string'
30
+ desc 'comma separated list of fingerprints to ignore'
31
+ end
32
+
28
33
  flag :debug do
29
34
  long '--debug'
30
35
  short '-d'
@@ -42,7 +47,8 @@ module Spektr
42
47
  print help
43
48
  exit
44
49
  else
45
- report = Spektr.run(params[:root], params[:output_format], params[:debug], params[:check])
50
+ ignore = params[:ignore] ? params[:ignore].split(',') : []
51
+ report = Spektr.run(params[:root], params[:output_format], params[:debug], params[:check], ignore)
46
52
  case params[:output_format]
47
53
  when 'json'
48
54
  puts JSON.pretty_generate report
@@ -1,7 +1,7 @@
1
1
  module Spektr
2
2
  module Targets
3
3
  class View < Base
4
- TEMPLATE_EXTENSIONS = /.*\.(erb|rhtml|haml)$/
4
+ TEMPLATE_EXTENSIONS = /.*\.(erb|rhtml|haml|slim)$/
5
5
  attr_accessor :view_path
6
6
 
7
7
  def initialize(path, content)
@@ -27,6 +27,9 @@ module Spektr
27
27
  Erubi.new(content, trim_mode: '-').src
28
28
  when :haml
29
29
  Haml::Engine.new(content).precompiled
30
+ when :slim
31
+ erb = Slim::ERBConverter.new.call(content)
32
+ Erubi.new(erb, trim_mode: '-').src
30
33
  end
31
34
  end
32
35
  end
@@ -1,3 +1,3 @@
1
1
  module Spektr
2
- VERSION = "0.1.0"
2
+ VERSION = '0.3.0'
3
3
  end
@@ -1,15 +1,16 @@
1
+ require 'digest'
2
+
1
3
  module Spektr
2
4
  class Warning
3
5
  attr_accessor :path, :full_path, :check, :location, :message, :confidence, :line
6
+
4
7
  def initialize(path, full_path, check, location, message, confidence = :high)
5
8
  @path = path
6
9
  @check = check
7
10
  @location = location
8
11
  @message = message
9
12
  @confidence = confidence
10
- if full_path && @location && File.exist?(full_path)
11
- @line = IO.readlines(full_path)[@location.line - 1].strip
12
- end
13
+ @line = IO.readlines(full_path)[@location.line - 1].strip if full_path && @location && File.exist?(full_path)
13
14
  end
14
15
 
15
16
  def full_message
@@ -19,5 +20,9 @@ module Spektr
19
20
  "#{message}"
20
21
  end
21
22
  end
23
+
24
+ def fingerprint
25
+ Digest::MD5.hexdigest("#{path}:#{line}:#{check.name}")
26
+ end
22
27
  end
23
28
  end
data/lib/spektr.rb CHANGED
@@ -1,9 +1,11 @@
1
- require 'spektr/version'
1
+ # frozen_string_literal: true
2
+
2
3
  require 'bundler'
3
4
  require 'parser'
4
5
  require 'parser/current'
5
6
  require 'unparser'
6
7
  require 'erb'
8
+ require 'slim/erb_converter'
7
9
  require 'haml'
8
10
  require 'active_support/core_ext/string/inflections'
9
11
  require 'logger'
@@ -13,33 +15,37 @@ require 'tty/table'
13
15
  require 'zeitwerk'
14
16
  loader = Zeitwerk::Loader.for_gem
15
17
  loader.collapse("#{__dir__}/processors")
16
- loader.setup # ready!
17
- loader.eager_load
18
+ loader.setup
18
19
 
19
20
  module Spektr
20
21
  class Error < StandardError; end
21
22
 
22
- def self.run(root = nil, output_format = 'terminal', debug = false, checks = nil)
23
+ def self.run(root = nil, output_format = 'terminal', debug = false, checks = nil, ignore = [])
23
24
  pastel = Pastel.new
24
25
  @output_format = output_format
25
26
  start_spinner('Initializing')
26
- @log_level = debug ? Logger::DEBUG : Logger::WARN
27
+ if debug
28
+ Logger::DEBUG
29
+ elsif terminal?
30
+ Logger::ERROR
31
+ else
32
+ Logger::WARN
33
+ end
27
34
  checks = Checks.load(checks)
28
35
  root = './' if root.nil?
29
- @app = App.new(checks: checks, root: root)
36
+ @app = App.new(checks: checks, root: root, ignore: ignore)
30
37
  stop_spinner
31
- puts "\n"
32
- puts pastel.bold('Checks:')
33
- puts "\n"
34
- puts checks.collect(&:name).join(', ')
35
- # table = TTY::Table.new([['Checks', checks.collect(&:name).join(', ')]])
36
- # puts table.render(:basic)
37
- puts "\n"
38
+ if terminal?
39
+ puts "\n"
40
+ puts pastel.bold('Checks:')
41
+ puts "\n"
42
+ puts checks.collect(&:name).join(', ')
43
+ puts "\n"
44
+ end
38
45
 
39
46
  start_spinner('Loading files')
40
47
  @app.load
41
48
  stop_spinner
42
- puts "\n"
43
49
  table = TTY::Table.new([
44
50
  ['Rails version', @app.rails_version],
45
51
  ['Initializers', @app.initializers.size],
@@ -49,13 +55,17 @@ module Spektr
49
55
  ['Routes', @app.routes.size],
50
56
  ['Lib files', @app.lib_files.size]
51
57
  ])
52
- puts table.render(:basic)
53
- puts "\n"
58
+ if terminal?
59
+ puts "\n"
60
+ puts table.render(:basic)
61
+ puts "\n"
62
+ end
54
63
  start_spinner('Scanning files')
55
64
  @app.scan!
56
65
  stop_spinner
57
66
  puts "\n"
58
67
  json = @app.report
68
+
59
69
  case output_format
60
70
  when 'json'
61
71
  json
@@ -69,6 +79,7 @@ module Spektr
69
79
  puts "#{pastel.green('Path:')} #{advisory[:path]}\n"
70
80
  puts "#{pastel.green('Location:')} #{advisory[:location]}\n"
71
81
  puts "#{pastel.green('Code:')} #{advisory[:line]}\n"
82
+ puts "#{pastel.green('Fingerprint:')} #{advisory[:fingerprint]}\n"
72
83
  puts "\n"
73
84
  puts "\n"
74
85
  end
@@ -112,7 +123,7 @@ module Spektr
112
123
 
113
124
  def self.logger
114
125
  @logger ||= begin
115
- logger = Logger.new(STDOUT)
126
+ logger = Logger.new($stdout)
116
127
  logger.level = @log_level || Logger::WARN
117
128
  logger
118
129
  end
Binary file
data/spektr.gemspec CHANGED
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
33
33
  spec.add_dependency 'parser', '~> 3.0.0'
34
34
  spec.add_dependency 'pastel'
35
35
  spec.add_dependency 'ruby_parser', '~>3.13'
36
+ spec.add_dependency 'slim'
36
37
  spec.add_dependency 'tty-color'
37
38
  spec.add_dependency 'tty-option'
38
39
  spec.add_dependency 'tty-spinner'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spektr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Greg Molnar
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-06-21 00:00:00.000000000 Z
11
+ date: 2022-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '3.13'
97
+ - !ruby/object:Gem::Dependency
98
+ name: slim
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: tty-color
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -334,6 +348,7 @@ files:
334
348
  - lib/spektr/targets/view.rb
335
349
  - lib/spektr/version.rb
336
350
  - lib/spektr/warning.rb
351
+ - railsgoat-example.png
337
352
  - spektr.gemspec
338
353
  homepage: https://railscop.com
339
354
  licenses: