package-audit 0.2.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/lib/package/audit/cli.rb +42 -42
  3. data/lib/package/audit/const/cmd.rb +3 -3
  4. data/lib/package/audit/const/fields.rb +4 -4
  5. data/lib/package/audit/const/file.rb +1 -0
  6. data/lib/package/audit/const/yaml.rb +13 -0
  7. data/lib/package/audit/enum/option.rb +13 -0
  8. data/lib/package/audit/enum/report.rb +12 -0
  9. data/lib/package/audit/enum/technology.rb +14 -0
  10. data/lib/package/audit/formatter/risk.rb +1 -1
  11. data/lib/package/audit/formatter/version.rb +1 -1
  12. data/lib/package/audit/formatter/version_date.rb +1 -1
  13. data/lib/package/audit/formatter/vulnerability.rb +1 -1
  14. data/lib/package/audit/{package.rb → models/package.rb} +8 -7
  15. data/lib/package/audit/npm/node_collection.rb +25 -14
  16. data/lib/package/audit/npm/vulnerability_finder.rb +4 -3
  17. data/lib/package/audit/npm/yarn_lock_parser.rb +10 -6
  18. data/lib/package/audit/ruby/bundler_specs.rb +16 -9
  19. data/lib/package/audit/ruby/gem_collection.rb +36 -15
  20. data/lib/package/audit/ruby/gem_meta_data.rb +1 -1
  21. data/lib/package/audit/ruby/vulnerability_finder.rb +4 -3
  22. data/lib/package/audit/services/command_parser.rb +103 -0
  23. data/lib/package/audit/services/package_filter.rb +39 -0
  24. data/lib/package/audit/services/package_finder.rb +58 -0
  25. data/lib/package/audit/{printer.rb → services/package_printer.rb} +12 -11
  26. data/lib/package/audit/{risk_calculator.rb → services/risk_calculator.rb} +8 -4
  27. data/lib/package/audit/technology/detector.rb +40 -0
  28. data/lib/package/audit/technology/validator.rb +56 -0
  29. data/lib/package/audit/util/summary_printer.rb +22 -11
  30. data/lib/package/audit/version.rb +1 -1
  31. data/sig/package/audit/cli.rbs +2 -0
  32. data/sig/package/audit/const/fields.rbs +2 -1
  33. data/sig/package/audit/const/file.rbs +1 -0
  34. data/sig/package/audit/const/yaml.rbs +13 -0
  35. data/sig/package/audit/enum/option.rbs +13 -0
  36. data/sig/package/audit/enum/report.rbs +12 -0
  37. data/sig/package/audit/enum/technology.rbs +12 -0
  38. data/sig/package/audit/{package.rbs → models/package.rbs} +3 -1
  39. data/sig/package/audit/{risk.rbs → models/risk.rbs} +1 -1
  40. data/sig/package/audit/npm/node_collection.rbs +4 -5
  41. data/sig/package/audit/npm/vulnerability_finder.rbs +3 -2
  42. data/sig/package/audit/npm/yarn_lock_parser.rbs +1 -0
  43. data/sig/package/audit/ruby/bundler_specs.rbs +2 -2
  44. data/sig/package/audit/ruby/gem_collection.rbs +11 -4
  45. data/sig/package/audit/ruby/vulnerability_finder.rbs +3 -0
  46. data/sig/package/audit/services/command_parser.rbs +31 -0
  47. data/sig/package/audit/services/package_filter.rbs +19 -0
  48. data/sig/package/audit/services/package_finder.rbs +23 -0
  49. data/sig/package/audit/{printer.rbs → services/package_printer.rbs} +3 -3
  50. data/sig/package/audit/technology/detector.rbs +19 -0
  51. data/sig/package/audit/technology/validator.rbs +19 -0
  52. data/sig/package/audit/util/summary_printer.rbs +5 -5
  53. metadata +30 -14
  54. data/lib/package/audit/command_service.rb +0 -187
  55. data/sig/package/audit/command_service.rbs +0 -29
  56. /data/lib/package/audit/{risk.rb → models/risk.rb} +0 -0
  57. /data/lib/package/audit/{duplicate_package_merger.rb → services/duplicate_package_merger.rb} +0 -0
  58. /data/sig/package/audit/{duplicate_package_merger.rbs → services/duplicate_package_merger.rbs} +0 -0
  59. /data/sig/package/audit/{risk_calculator.rbs → services/risk_calculator.rbs} +0 -0
@@ -0,0 +1,31 @@
1
+ module Package
2
+ module Audit
3
+ class CommandParser
4
+ @config: Hash[String, untyped]?
5
+ @dir: String
6
+ @options: Hash[String, untyped]
7
+ @report: Symbol
8
+ @technologies: Array[String]
9
+
10
+ def initialize: (String, Hash[String, untyped], Symbol) -> void
11
+
12
+ def run: -> bool
13
+
14
+ private
15
+
16
+ def learn_more_command: (String) -> String?
17
+
18
+ def parse_config_file: -> Hash[String, untyped]?
19
+
20
+ def parse_technologies: -> Array[String]
21
+
22
+ def print_disclaimer: (String) -> void
23
+
24
+ def print_results: (String, Array[Package], Array[Package]) -> void
25
+
26
+ def print_summary: (String, Array[Package], Array[Package]) -> void
27
+
28
+ def report_fields: -> Array[Symbol]
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,19 @@
1
+ module Package
2
+ module Audit
3
+ class PackageFilter
4
+ @config: Hash[String, untyped]?
5
+
6
+ def initialize: (Hash[String, untyped]?) -> void
7
+
8
+ def ignored?: (Package) -> bool
9
+
10
+ private
11
+
12
+ def ignore_package?: (Package, Hash[String, untyped]?) -> bool
13
+
14
+ def pkg_version_in_config?: (Package, Hash[String, untyped]?) -> bool
15
+
16
+ def pkg_yaml_from_config: (Package) -> Hash[String, untyped]?
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,23 @@
1
+ module Package
2
+ module Audit
3
+ class PackageFinder
4
+ @config: Hash[String, untyped]?
5
+ @dir: String
6
+ @report: Symbol
7
+
8
+ def initialize: (Hash[String, untyped]?, String, Symbol) -> void
9
+
10
+ def run: (String) -> Array[Array[Package]]
11
+
12
+ private
13
+
14
+ def filter_pkgs_based_on_config: (Array[Package]) -> Array[Package]
15
+
16
+ def find_by_technology: (String) -> Array[Package]
17
+
18
+ def find_node: -> Array[Package]
19
+
20
+ def find_ruby: -> Array[Package]
21
+ end
22
+ end
23
+ end
@@ -1,14 +1,14 @@
1
1
  module Package
2
2
  module Audit
3
- class Printer
3
+ class PackagePrinter
4
4
  BASH_FORMATTING_REGEX: Regexp
5
5
  COLUMN_GAP: Integer
6
6
  CSV_HEADERS: Hash[Symbol, String]
7
7
 
8
8
  @pkgs: Array[Package]
9
- @options: Hash[Symbol, untyped]
9
+ @options: Hash[String, untyped]
10
10
 
11
- def initialize: (Array[Package], Hash[Symbol, untyped]) -> void
11
+ def initialize: (Hash[String, untyped], Array[Package]) -> void
12
12
 
13
13
  def print: (Array[Symbol]) -> void
14
14
 
@@ -0,0 +1,19 @@
1
+ module Package
2
+ module Audit
3
+ module Technology
4
+ class Detector
5
+ @dir: String
6
+
7
+ def initialize: (String) -> void
8
+
9
+ def detect: -> Array[String]
10
+
11
+ private
12
+
13
+ def node?: -> bool
14
+
15
+ def ruby?: -> bool
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Package
2
+ module Audit
3
+ module Technology
4
+ class Validator
5
+ @dir: String
6
+
7
+ def initialize: (String) -> void
8
+
9
+ def validate!: (String) -> void
10
+
11
+ private
12
+
13
+ def validate_node!: -> void
14
+
15
+ def validate_ruby!: -> void
16
+ end
17
+ end
18
+ end
19
+ end
@@ -2,17 +2,17 @@ module Package
2
2
  module Audit
3
3
  module Util
4
4
  module SummaryPrinter
5
- def self.deprecated: -> void
5
+ def self.all: -> void
6
6
 
7
- def self.report: -> void
7
+ def self.deprecated: -> void
8
8
 
9
9
  def self.risk: -> void
10
10
 
11
- def self.statistics: (String, Array[Package]) -> void
11
+ def self.statistics: (String, Symbol, Array[Package], Array[Package]) -> void
12
12
 
13
- def self.total: (String, Array[Package]) -> void
13
+ def self.total: (String, Symbol, Array[Package], Array[Package]) -> void
14
14
 
15
- def self.vulnerable: (String, String) -> void
15
+ def self.vulnerable: (String, String?) -> void
16
16
  end
17
17
  end
18
18
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: package-audit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vadim Kononov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-05-03 00:00:00.000000000 Z
11
+ date: 2023-07-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler-audit
@@ -49,64 +49,80 @@ extra_rdoc_files: []
49
49
  files:
50
50
  - exe/package-audit
51
51
  - lib/package/audit/cli.rb
52
- - lib/package/audit/command_service.rb
53
52
  - lib/package/audit/const/cmd.rb
54
53
  - lib/package/audit/const/fields.rb
55
54
  - lib/package/audit/const/file.rb
56
55
  - lib/package/audit/const/time.rb
57
- - lib/package/audit/duplicate_package_merger.rb
56
+ - lib/package/audit/const/yaml.rb
58
57
  - lib/package/audit/enum/environment.rb
58
+ - lib/package/audit/enum/option.rb
59
+ - lib/package/audit/enum/report.rb
59
60
  - lib/package/audit/enum/risk_explanation.rb
60
61
  - lib/package/audit/enum/risk_type.rb
62
+ - lib/package/audit/enum/technology.rb
61
63
  - lib/package/audit/enum/vulnerability_type.rb
62
64
  - lib/package/audit/formatter/base.rb
63
65
  - lib/package/audit/formatter/risk.rb
64
66
  - lib/package/audit/formatter/version.rb
65
67
  - lib/package/audit/formatter/version_date.rb
66
68
  - lib/package/audit/formatter/vulnerability.rb
69
+ - lib/package/audit/models/package.rb
70
+ - lib/package/audit/models/risk.rb
67
71
  - lib/package/audit/npm/node_collection.rb
68
72
  - lib/package/audit/npm/npm_meta_data.rb
69
73
  - lib/package/audit/npm/vulnerability_finder.rb
70
74
  - lib/package/audit/npm/yarn_lock_parser.rb
71
- - lib/package/audit/package.rb
72
- - lib/package/audit/printer.rb
73
- - lib/package/audit/risk.rb
74
- - lib/package/audit/risk_calculator.rb
75
75
  - lib/package/audit/ruby/bundler_specs.rb
76
76
  - lib/package/audit/ruby/gem_collection.rb
77
77
  - lib/package/audit/ruby/gem_meta_data.rb
78
78
  - lib/package/audit/ruby/vulnerability_finder.rb
79
+ - lib/package/audit/services/command_parser.rb
80
+ - lib/package/audit/services/duplicate_package_merger.rb
81
+ - lib/package/audit/services/package_filter.rb
82
+ - lib/package/audit/services/package_finder.rb
83
+ - lib/package/audit/services/package_printer.rb
84
+ - lib/package/audit/services/risk_calculator.rb
85
+ - lib/package/audit/technology/detector.rb
86
+ - lib/package/audit/technology/validator.rb
79
87
  - lib/package/audit/util/bash_color.rb
80
88
  - lib/package/audit/util/summary_printer.rb
81
89
  - lib/package/audit/version.rb
82
90
  - sig/package/audit/cli.rbs
83
- - sig/package/audit/command_service.rbs
84
91
  - sig/package/audit/const/cmd.rbs
85
92
  - sig/package/audit/const/fields.rbs
86
93
  - sig/package/audit/const/file.rbs
87
94
  - sig/package/audit/const/time.rbs
88
- - sig/package/audit/duplicate_package_merger.rbs
95
+ - sig/package/audit/const/yaml.rbs
89
96
  - sig/package/audit/enum/environment.rbs
97
+ - sig/package/audit/enum/option.rbs
98
+ - sig/package/audit/enum/report.rbs
90
99
  - sig/package/audit/enum/risk_explanation.rbs
91
100
  - sig/package/audit/enum/risk_type.rbs
101
+ - sig/package/audit/enum/technology.rbs
92
102
  - sig/package/audit/enum/vulnerability_type.rbs
93
103
  - sig/package/audit/formatter/base.rbs
94
104
  - sig/package/audit/formatter/risk_printer.rbs
95
105
  - sig/package/audit/formatter/version_date.rbs
96
106
  - sig/package/audit/formatter/version_printer.rbs
97
107
  - sig/package/audit/formatter/vulnerability.rbs
108
+ - sig/package/audit/models/package.rbs
109
+ - sig/package/audit/models/risk.rbs
98
110
  - sig/package/audit/npm/node_collection.rbs
99
111
  - sig/package/audit/npm/npm_meta_data.rbs
100
112
  - sig/package/audit/npm/vulnerability_finder.rbs
101
113
  - sig/package/audit/npm/yarn_lock_parser.rbs
102
- - sig/package/audit/package.rbs
103
- - sig/package/audit/printer.rbs
104
- - sig/package/audit/risk.rbs
105
- - sig/package/audit/risk_calculator.rbs
106
114
  - sig/package/audit/ruby/bundler_specs.rbs
107
115
  - sig/package/audit/ruby/gem_collection.rbs
108
116
  - sig/package/audit/ruby/gem_meta_data.rbs
109
117
  - sig/package/audit/ruby/vulnerability_finder.rbs
118
+ - sig/package/audit/services/command_parser.rbs
119
+ - sig/package/audit/services/duplicate_package_merger.rbs
120
+ - sig/package/audit/services/package_filter.rbs
121
+ - sig/package/audit/services/package_finder.rbs
122
+ - sig/package/audit/services/package_printer.rbs
123
+ - sig/package/audit/services/risk_calculator.rbs
124
+ - sig/package/audit/technology/detector.rbs
125
+ - sig/package/audit/technology/validator.rbs
110
126
  - sig/package/audit/util/bash_color.rbs
111
127
  - sig/package/audit/util/summary_printer.rbs
112
128
  - sig/package/audit/version.rbs
@@ -1,187 +0,0 @@
1
- require_relative './const/cmd'
2
- require_relative './const/file'
3
-
4
- module Package
5
- module Audit
6
- class CommandService # rubocop:disable Metrics/ClassLength
7
- RUBY_GEM = 'ruby gem'
8
- NODE_MODULE = 'node module'
9
-
10
- def initialize(dir, options)
11
- @dir = dir
12
- @options = options
13
- end
14
-
15
- def all # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/PerceivedComplexity
16
- pkgs = []
17
-
18
- if ruby?
19
- gems = Ruby::GemCollection.all
20
- pkgs += gems
21
- Printer.new(gems, @options).print(Const::Fields::REPORT)
22
-
23
- unless @options[:csv]
24
- if gems.any?
25
- Util::SummaryPrinter.statistics(RUBY_GEM, gems)
26
- Util::SummaryPrinter.vulnerable(RUBY_GEM, Const::Cmd::BUNDLE_AUDIT)
27
- else
28
- print_success_message "There are no deprecated, outdated or vulnerable #{RUBY_GEM}s!"
29
- end
30
- end
31
- end
32
-
33
- if node?
34
- npms = Npm::NodeCollection.new(@dir).all
35
- pkgs += npms
36
- Printer.new(npms, @options).print(Const::Fields::REPORT)
37
-
38
- unless @options[:csv]
39
- if npms.any?
40
- Util::SummaryPrinter.statistics(NODE_MODULE, npms)
41
- Util::SummaryPrinter.vulnerable(NODE_MODULE, Const::Cmd::YARN_AUDIT)
42
- else
43
- print_success_message "There are no deprecated, outdated or vulnerable #{NODE_MODULE}s!"
44
- end
45
- end
46
- end
47
-
48
- pkgs.any?
49
- end
50
-
51
- def vulnerable # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/PerceivedComplexity
52
- pkgs = []
53
-
54
- if ruby?
55
- gems = Ruby::GemCollection.vulnerable
56
- pkgs += gems
57
- Printer.new(gems, @options).print(Const::Fields::VULNERABLE)
58
-
59
- unless @options[:csv]
60
- if gems.any?
61
- Util::SummaryPrinter.total(RUBY_GEM, gems)
62
- Util::SummaryPrinter.vulnerable(RUBY_GEM, Const::Cmd::BUNDLE_AUDIT)
63
- else
64
- print_success_message "There are no #{RUBY_GEM} vulnerabilities!"
65
- end
66
- end
67
- end
68
-
69
- if node?
70
- npms = Npm::NodeCollection.new(@dir).vulnerable
71
- pkgs += npms
72
- Printer.new(npms, @options).print(Const::Fields::VULNERABLE)
73
-
74
- unless @options[:csv]
75
- if npms.any?
76
- Util::SummaryPrinter.total(NODE_MODULE, npms)
77
- Util::SummaryPrinter.vulnerable(NODE_MODULE, Const::Cmd::YARN_AUDIT)
78
- else
79
- print_success_message "There are no #{NODE_MODULE} vulnerabilities!"
80
- end
81
- end
82
- end
83
-
84
- pkgs.any?
85
- end
86
-
87
- def outdated # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/PerceivedComplexity
88
- pkgs = []
89
-
90
- if ruby?
91
- gems = Ruby::GemCollection.outdated
92
- pkgs += gems
93
- Printer.new(gems, @options).print(Const::Fields::OUTDATED)
94
-
95
- unless @options[:csv]
96
- if gems.any?
97
- Util::SummaryPrinter.total(RUBY_GEM, gems)
98
- else
99
- print_success_message "There are no outdated #{RUBY_GEM}s!"
100
- end
101
- end
102
- end
103
-
104
- if node?
105
- npms = Npm::NodeCollection.new(@dir).outdated
106
- pkgs += npms
107
- Printer.new(npms, @options).print(Const::Fields::OUTDATED)
108
-
109
- unless @options[:csv]
110
- if npms.any?
111
- Util::SummaryPrinter.total(NODE_MODULE, npms)
112
- else
113
- print_success_message "There are no outdated #{NODE_MODULE}s!"
114
- end
115
- end
116
- end
117
-
118
- pkgs.any?
119
- end
120
-
121
- def deprecated # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/PerceivedComplexity
122
- pkgs = []
123
-
124
- if ruby?
125
- gems = Ruby::GemCollection.deprecated
126
- pkgs += gems
127
- Printer.new(gems, @options).print(Const::Fields::OUTDATED)
128
-
129
- unless @options[:csv]
130
- if gems.any?
131
- Util::SummaryPrinter.total(RUBY_GEM, gems)
132
- Util::SummaryPrinter.deprecated
133
- else
134
- print_success_message "There are no potentially deprecated #{RUBY_GEM}s!"
135
- end
136
- end
137
- end
138
-
139
- if node?
140
- npms = Npm::NodeCollection.new(@dir).deprecated
141
- pkgs += npms
142
- Printer.new(npms, @options).print(Const::Fields::OUTDATED)
143
-
144
- unless @options[:csv]
145
- if npms.any?
146
- Util::SummaryPrinter.total(NODE_MODULE, npms)
147
- Util::SummaryPrinter.deprecated
148
- else
149
- print_success_message "There are no potentially deprecated #{NODE_MODULE}s!"
150
- end
151
- end
152
- end
153
-
154
- pkgs.any?
155
- end
156
-
157
- private
158
-
159
- def ruby?
160
- gemfile_present = File.exist?("#{@dir}/#{Const::File::GEMFILE}")
161
- gemfile_lock_present = File.exist?("#{@dir}/#{Const::File::GEMFILE_LOCK}")
162
-
163
- if gemfile_present && gemfile_lock_present
164
- true
165
- elsif gemfile_present
166
- raise "#{Const::File::GEMFILE_LOCK} was not found in #{@dir}/"
167
- end
168
- end
169
-
170
- def node?
171
- package_json_present = File.exist?("#{@dir}/#{Const::File::PACKAGE_JSON}")
172
- package_lock_json_present = File.exist?("#{@dir}/#{Const::File::PACKAGE_LOCK_JSON}")
173
- yarn_lock_present = File.exist?("#{@dir}/#{Const::File::YARN_LOCK}")
174
-
175
- if package_json_present && (package_lock_json_present || yarn_lock_present)
176
- true
177
- elsif package_json_present
178
- raise "#{Const::File::PACKAGE_LOCK_JSON} or #{Const::File::YARN_LOCK} was not found in #{@dir}/"
179
- end
180
- end
181
-
182
- def print_success_message(msg)
183
- puts Util::BashColor.green msg
184
- end
185
- end
186
- end
187
- end
@@ -1,29 +0,0 @@
1
- module Package
2
- module Audit
3
- class CommandService
4
- NODE_MODULE: String
5
- RUBY_GEM: String
6
-
7
- @dir: String
8
- @options: Hash[Symbol, untyped]
9
-
10
- def initialize: (String, Hash[Symbol, untyped]) -> void
11
-
12
- def all: -> bool
13
-
14
- def deprecated: -> bool
15
-
16
- def outdated: -> bool
17
-
18
- def vulnerable: -> bool
19
-
20
- private
21
-
22
- def node?: -> bool?
23
-
24
- def print_success_message: (String) -> void
25
-
26
- def ruby?: -> bool?
27
- end
28
- end
29
- end
File without changes