recog 3.1.1 → 3.1.2

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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/Gemfile +6 -0
  4. data/Rakefile +7 -5
  5. data/lib/recog/db.rb +67 -68
  6. data/lib/recog/db_manager.rb +22 -21
  7. data/lib/recog/fingerprint/regexp_factory.rb +10 -13
  8. data/lib/recog/fingerprint/test.rb +9 -8
  9. data/lib/recog/fingerprint.rb +252 -262
  10. data/lib/recog/fingerprint_parse_error.rb +3 -1
  11. data/lib/recog/formatter.rb +41 -39
  12. data/lib/recog/match_reporter.rb +82 -83
  13. data/lib/recog/matcher.rb +37 -40
  14. data/lib/recog/matcher_factory.rb +7 -6
  15. data/lib/recog/nizer.rb +218 -224
  16. data/lib/recog/verifier.rb +30 -28
  17. data/lib/recog/verify_reporter.rb +69 -73
  18. data/lib/recog/version.rb +3 -1
  19. data/lib/recog.rb +2 -0
  20. data/recog/bin/recog_match +21 -20
  21. data/recog/xml/apache_modules.xml +2 -0
  22. data/recog/xml/dhcp_vendor_class.xml +1 -1
  23. data/recog/xml/favicons.xml +133 -1
  24. data/recog/xml/ftp_banners.xml +1 -1
  25. data/recog/xml/html_title.xml +140 -1
  26. data/recog/xml/http_cookies.xml +20 -2
  27. data/recog/xml/http_servers.xml +38 -17
  28. data/recog/xml/http_wwwauth.xml +17 -4
  29. data/recog/xml/mdns_device-info_txt.xml +49 -15
  30. data/recog/xml/sip_banners.xml +0 -2
  31. data/recog/xml/sip_user_agents.xml +1 -1
  32. data/recog/xml/snmp_sysdescr.xml +1 -2
  33. data/recog/xml/ssh_banners.xml +8 -0
  34. data/recog/xml/telnet_banners.xml +3 -2
  35. data/recog/xml/tls_jarm.xml +1 -1
  36. data/recog/xml/x11_banners.xml +1 -0
  37. data/recog/xml/x509_issuers.xml +1 -1
  38. data/recog/xml/x509_subjects.xml +0 -1
  39. data/recog.gemspec +14 -13
  40. data/spec/lib/recog/db_spec.rb +37 -36
  41. data/spec/lib/recog/fingerprint/regexp_factory_spec.rb +19 -20
  42. data/spec/lib/recog/fingerprint_spec.rb +44 -42
  43. data/spec/lib/recog/formatter_spec.rb +20 -18
  44. data/spec/lib/recog/match_reporter_spec.rb +35 -30
  45. data/spec/lib/recog/nizer_spec.rb +85 -101
  46. data/spec/lib/recog/verify_reporter_spec.rb +45 -44
  47. data/spec/spec_helper.rb +2 -1
  48. data.tar.gz.sig +1 -3
  49. metadata +3 -3
  50. metadata.gz.sig +0 -0
@@ -1,37 +1,36 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'recog'
2
4
  require 'yaml'
3
5
 
4
-
5
- VALID_FILTER = {match_key: 'smb.native_os', protocol: 'smb', database_type: 'util.os'}
6
- NOMATCH_MATCH_KEY = {match_key: 'no_such_987', protocol: 'smb', database_type: 'util.os'}
7
- NOMATCH_PROTO = {match_key: 'smb.native_os', protocol: 'no_such_987', database_type: 'util.os'}
8
- NOMATCH_TYPE = {match_key: 'smb.native_os', protocol: 'smb', database_type: 'no_such_987'}
6
+ VALID_FILTER = { match_key: 'smb.native_os', protocol: 'smb', database_type: 'util.os' }.freeze
7
+ NOMATCH_MATCH_KEY = { match_key: 'no_such_987', protocol: 'smb', database_type: 'util.os' }.freeze
8
+ NOMATCH_PROTO = { match_key: 'smb.native_os', protocol: 'no_such_987', database_type: 'util.os' }.freeze
9
+ NOMATCH_TYPE = { match_key: 'smb.native_os', protocol: 'smb', database_type: 'no_such_987' }.freeze
9
10
 
10
11
  describe Recog::Nizer do
11
12
  subject { described_class }
12
13
 
13
- describe ".match" do
14
+ describe '.match' do
14
15
  File.readlines(File.expand_path(File.join('spec', 'data', 'smb_native_os.txt'))).each do |line|
15
16
  data = line.strip
16
17
  context "with smb_native_os:#{data}" do
17
18
  let(:match_result) { subject.match('smb.native_os', data) }
18
19
 
19
- it "returns a hash" do
20
+ it 'returns a hash' do
20
21
  expect(match_result.class).to eq(::Hash)
21
22
  end
22
23
 
23
- it "returns a successful match" do
24
+ it 'returns a successful match' do
24
25
  expect(match_result['matched'].to_s).to match(/^[A-Z]/)
25
26
  end
26
27
 
27
- it "correctly matches service or os" do
28
- if data =~ /^Windows/
29
- expect(match_result['os.product']).to match(/^Windows/)
30
- end
28
+ it 'correctly matches service or os' do
29
+ expect(match_result['os.product']).to match(/^Windows/) if data =~ /^Windows/
31
30
  end
32
31
 
33
32
  let(:nomatch_result) { subject.match('smb.native_os', 'no_such_987_76tgklh') }
34
- it "returns a nil when data cannot be matched" do
33
+ it 'returns a nil when data cannot be matched' do
35
34
  expect(nomatch_result).to be_nil
36
35
  end
37
36
 
@@ -43,51 +42,47 @@ describe Recog::Nizer do
43
42
  end
44
43
 
45
44
  line = 'non-existent'
46
- context "with non-existent match" do
47
- let(:match_result) {subject.match('smb.native_os', line) }
48
- it "returns a nil" do
45
+ context 'with non-existent match' do
46
+ let(:match_result) { subject.match('smb.native_os', line) }
47
+ it 'returns a nil' do
49
48
  expect(match_result).to be_nil
50
49
  end
51
50
  end
52
51
  end
53
52
 
54
- describe ".match_all_db" do
53
+ describe '.match_all_db' do
55
54
  File.readlines(File.expand_path(File.join('spec', 'data', 'smb_native_os.txt'))).each do |line|
56
55
  data = line.strip
57
56
  context "with smb_native_os:#{data}" do
58
57
  let(:match_all_result) { subject.match_all_db(data, VALID_FILTER) }
59
58
 
60
- it "returns an array" do
59
+ it 'returns an array' do
61
60
  expect(match_all_result.class).to eq(::Array)
62
61
  end
63
62
 
64
- it "returns a successful match" do
63
+ it 'returns a successful match' do
65
64
  expect(match_all_result[0]['matched']).to match(/^[A-Z]/)
66
65
  end
67
66
 
68
- it "correctly matches service or os" do
69
- if data =~ /^Windows/
70
- expect(match_all_result[0]['os.product']).to match(/^Windows/)
71
- end
67
+ it 'correctly matches service or os' do
68
+ expect(match_all_result[0]['os.product']).to match(/^Windows/) if data =~ /^Windows/
72
69
  end
73
70
 
74
- it "correctly matches protocol" do
71
+ it 'correctly matches protocol' do
75
72
  expect(match_all_result[0]['service.protocol']).to eq('smb')
76
73
  end
77
74
 
78
75
  let(:no_filter_result) { subject.match_all_db(data) }
79
- it "returns an array when searching without a filter" do
76
+ it 'returns an array when searching without a filter' do
80
77
  expect(no_filter_result.class).to eq(::Array)
81
78
  end
82
79
 
83
- it "returns a successful match when searching without a filter" do
80
+ it 'returns a successful match when searching without a filter' do
84
81
  expect(no_filter_result[0]['matched']).to match(/^[A-Z]/)
85
82
  end
86
83
 
87
- it "correctly matches service or os when searching without a filter" do
88
- if data =~ /^Windows/
89
- expect(no_filter_result[0]['os.product']).to match(/^Windows/)
90
- end
84
+ it 'correctly matches service or os when searching without a filter' do
85
+ expect(no_filter_result[0]['os.product']).to match(/^Windows/) if data =~ /^Windows/
91
86
  end
92
87
 
93
88
  let(:nomatch_db_result) { subject.match_all_db(data, NOMATCH_MATCH_KEY) }
@@ -117,214 +112,203 @@ describe Recog::Nizer do
117
112
  end
118
113
 
119
114
  line = 'non-existent'
120
- context "with non-existent match" do
121
- let(:match_result) {subject.match_all_db(line) }
122
- it "returns an array" do
115
+ context 'with non-existent match' do
116
+ let(:match_result) { subject.match_all_db(line) }
117
+ it 'returns an array' do
123
118
  expect(match_result.class).to eq(::Array)
124
119
  end
125
- it "returns an empty array" do
120
+ it 'returns an empty array' do
126
121
  expect(match_result).to be_empty
127
122
  end
128
123
  end
129
124
  end
130
125
 
131
- describe ".multi_match" do
126
+ describe '.multi_match' do
132
127
  File.readlines(File.expand_path(File.join('spec', 'data', 'smb_native_os.txt'))).each do |line|
133
128
  data = line.strip
134
129
 
135
130
  context "with smb_native_os:#{data}" do
136
- let(:match_results) {subject.multi_match('smb.native_os', data) }
131
+ let(:match_results) { subject.multi_match('smb.native_os', data) }
137
132
 
138
- it "returns an array" do
133
+ it 'returns an array' do
139
134
  expect(match_results.class).to eq(::Array)
140
135
  end
141
136
 
142
- it "returns at least one successful match" do
137
+ it 'returns at least one successful match' do
143
138
  expect(match_results.size).to be > 0
144
139
  end
145
140
 
146
- it "correctly matches service or os" do
141
+ it 'correctly matches service or os' do
147
142
  match_results do |mr|
148
- if data =~ /^Windows/
149
- expect(mr['os.product']).to match(/^Windows/)
150
- end
143
+ expect(mr['os.product']).to match(/^Windows/) if data =~ /^Windows/
151
144
  end
152
145
  end
153
146
 
154
147
  let(:invalid_db_result) { subject.multi_match('no_such_987', data) }
155
- it "returns an array when passed an invalid match_key" do
148
+ it 'returns an array when passed an invalid match_key' do
156
149
  expect(invalid_db_result.class).to eq(::Array)
157
150
  end
158
151
 
159
- it "returns an empty array when passed an invalid match_key" do
152
+ it 'returns an empty array when passed an invalid match_key' do
160
153
  expect(invalid_db_result).to be_empty
161
154
  end
162
155
  end
163
-
164
156
  end
165
157
 
166
158
  data = 'Windows Server 2012 R2 Standard 9600'
167
- context "with {data}" do
168
- let(:match_results) {subject.multi_match('smb.native_os', data) }
159
+ context 'with {data}' do
160
+ let(:match_results) { subject.multi_match('smb.native_os', data) }
169
161
 
170
- it "returns an array" do
162
+ it 'returns an array' do
171
163
  expect(match_results.class).to eq(::Array)
172
164
  end
173
165
 
174
- it "returns at least two successful matches" do
166
+ it 'returns at least two successful matches' do
175
167
  expect(match_results.size).to be > 1
176
168
  end
177
169
 
178
- it "correctly matches os.product for all matches" do
170
+ it 'correctly matches os.product for all matches' do
179
171
  match_results do |mr|
180
- if data =~ /^Windows/
181
- expect(mr['os.product']).to match(/^Windows/)
182
- end
172
+ expect(mr['os.product']).to match(/^Windows/) if data =~ /^Windows/
183
173
  end
184
174
  end
185
175
 
186
- it "correctly matches protocol for all matches" do
176
+ it 'correctly matches protocol for all matches' do
187
177
  match_results do |mr|
188
- if data =~ /^Windows/
189
- expect(mr['service.protocol']).to eq('smb')
190
- end
178
+ expect(mr['service.protocol']).to eq('smb') if data =~ /^Windows/
191
179
  end
192
180
  end
193
181
  end
194
182
 
195
183
  line = 'non-existent'
196
- context "with non-existent match" do
197
- let(:match_results) {subject.multi_match('smb.native_os', line) }
184
+ context 'with non-existent match' do
185
+ let(:match_results) { subject.multi_match('smb.native_os', line) }
198
186
 
199
- it "returns an array" do
187
+ it 'returns an array' do
200
188
  expect(match_results.class).to eq(::Array)
201
189
  end
202
190
 
203
- it "returns an empty array" do
191
+ it 'returns an empty array' do
204
192
  expect(match_results).to be_empty
205
193
  end
206
194
  end
207
195
  end
208
196
 
209
- describe ".best_os_match" do
197
+ describe '.best_os_match' do
210
198
  # Demonstrates how this method picks up additional attributes from other members of the winning
211
199
  # os.product match group and applies them to the result.
212
- matches1 = YAML.load(File.read(File.expand_path(File.join('spec', 'data', 'best_os_match_1.yml'))))
213
- context "with best_os_match_1.yml" do
200
+ matches1 = YAML.safe_load(File.read(File.expand_path(File.join('spec', 'data', 'best_os_match_1.yml'))))
201
+ context 'with best_os_match_1.yml' do
214
202
  let(:result) { subject.best_os_match(matches1) }
215
203
 
216
- it "returns a hash" do
204
+ it 'returns a hash' do
217
205
  expect(result.class).to eq(::Hash)
218
206
  end
219
207
 
220
- it "matches Windows 2008" do
208
+ it 'matches Windows 2008' do
221
209
  expect(result['os.product']).to eq('Windows 2008')
222
210
  end
223
211
 
224
- it "matches Microsoft" do
212
+ it 'matches Microsoft' do
225
213
  expect(result['os.vendor']).to eq('Microsoft')
226
214
  end
227
215
 
228
- it "matches English" do
216
+ it 'matches English' do
229
217
  expect(result['os.language']).to eq('English')
230
218
  end
231
219
 
232
- it "matches service pack 2" do
220
+ it 'matches service pack 2' do
233
221
  expect(result['os.version']).to eq('Service Pack 2')
234
222
  end
235
223
  end
236
224
 
237
225
  # Demonstrates how additive os.certainty values allow a 1.0 certainty rule to be overridden
238
226
  # by multiple lower certainty matches
239
- matches2 = YAML.load(File.read(File.expand_path(File.join('spec', 'data', 'best_os_match_2.yml'))))
240
- context "with best_os_match_2.yml" do
227
+ matches2 = YAML.safe_load(File.read(File.expand_path(File.join('spec', 'data', 'best_os_match_2.yml'))))
228
+ context 'with best_os_match_2.yml' do
241
229
  let(:result) { subject.best_os_match(matches2) }
242
230
 
243
- it "returns a hash" do
231
+ it 'returns a hash' do
244
232
  expect(result.class).to eq(::Hash)
245
233
  end
246
234
 
247
- it "matches Windows 2012" do
235
+ it 'matches Windows 2012' do
248
236
  expect(result['os.product']).to eq('Windows 2012')
249
237
  end
250
238
 
251
- it "matches Microsoft" do
239
+ it 'matches Microsoft' do
252
240
  expect(result['os.vendor']).to eq('Microsoft')
253
241
  end
254
242
 
255
- it "matches Arabic" do
243
+ it 'matches Arabic' do
256
244
  expect(result['os.language']).to eq('Arabic')
257
245
  end
258
246
 
259
- it "matches service pack 1" do
247
+ it 'matches service pack 1' do
260
248
  expect(result['os.version']).to eq('Service Pack 1')
261
249
  end
262
250
  end
263
-
264
251
  end
265
252
 
266
- describe ".best_service_match" do
253
+ describe '.best_service_match' do
267
254
  # Demonstrates how this method picks up additional attributes from other members of the winning
268
255
  # service.product match group and applies them to the result.
269
- matches1 = YAML.load(File.read(File.expand_path(File.join('spec', 'data', 'best_service_match_1.yml'))))
270
- context "with best_service_match_1.yml" do
256
+ matches1 = YAML.safe_load(File.read(File.expand_path(File.join('spec', 'data', 'best_service_match_1.yml'))))
257
+ context 'with best_service_match_1.yml' do
271
258
  let(:result) { subject.best_service_match(matches1) }
272
259
 
273
- it "returns a hash" do
260
+ it 'returns a hash' do
274
261
  expect(result.class).to eq(::Hash)
275
262
  end
276
263
 
277
- it "matches IIS" do
264
+ it 'matches IIS' do
278
265
  expect(result['service.product']).to eq('IIS')
279
266
  end
280
267
 
281
- it "matches Microsoft" do
268
+ it 'matches Microsoft' do
282
269
  expect(result['service.vendor']).to eq('Microsoft')
283
270
  end
284
271
 
285
- it "matches English" do
272
+ it 'matches English' do
286
273
  expect(result['service.language']).to eq('English')
287
274
  end
288
275
 
289
- it "matches version 6.0" do
276
+ it 'matches version 6.0' do
290
277
  expect(result['service.version'].to_i).to eq(6.0)
291
278
  end
292
279
  end
293
-
294
280
  end
295
281
 
296
-
297
282
  describe '.load_db' do
298
283
  file_path = File.expand_path(File.join('spec', 'data', 'test_fingerprints.xml'))
299
284
  context "with #{file_path}" do
300
285
  let(:fp_db) { subject.load_db(file_path) }
301
- it "loads without error" do
302
- expect(fp_db).to be true
303
- subject.unload_db()
286
+ it 'loads without error' do
287
+ expect(fp_db).to be true
288
+ subject.unload_db
304
289
  end
305
290
  end
306
291
 
307
- context "with no path specified" do
292
+ context 'with no path specified' do
308
293
  let(:fp_db) { subject.load_db }
309
- it "loads without error" do
310
- expect(fp_db).to be true
311
- subject.unload_db()
294
+ it 'loads without error' do
295
+ expect(fp_db).to be true
296
+ subject.unload_db
312
297
  end
313
298
  end
314
299
 
315
- context "with empty file path" do
316
- it "raises an error" do
300
+ context 'with empty file path' do
301
+ it 'raises an error' do
317
302
  expect { subject.load_db('') }.to raise_error(Errno::ENOENT)
318
- subject.unload_db()
303
+ subject.unload_db
319
304
  end
320
305
  end
321
306
 
322
- context "with invalid file path" do
323
- it "raises an error" do
307
+ context 'with invalid file path' do
308
+ it 'raises an error' do
324
309
  expect { subject.load_db('no_such_987_file_path') }.to raise_error(Errno::ENOENT)
325
- subject.unload_db()
310
+ subject.unload_db
326
311
  end
327
312
  end
328
313
  end
329
-
330
314
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'recog/verify_reporter'
2
4
 
3
5
  describe Recog::VerifyReporter do
@@ -5,142 +7,141 @@ describe Recog::VerifyReporter do
5
7
  let(:fingerprint) { double(name: 'a name', tests: tests) }
6
8
  let(:tests) { [double, double, double] }
7
9
  let(:summary_line) do
8
- "SUMMARY: Test completed with 1 successful, 1 warnings, and 1 failures"
10
+ 'SUMMARY: Test completed with 1 successful, 1 warnings, and 1 failures'
9
11
  end
10
- let(:path) { "fingerprint.xml" }
12
+ let(:path) { 'fingerprint.xml' }
11
13
 
12
14
  subject { Recog::VerifyReporter.new(double(detail: false, quiet: false, warnings: true), formatter) }
13
15
 
14
16
  def run_report
15
17
  subject.report(1) do
16
- subject.print_name fingerprint
17
- subject.success 'passed'
18
- subject.warning 'a warning'
19
- subject.failure 'a failure'
18
+ subject.print_name fingerprint
19
+ subject.success 'passed'
20
+ subject.warning 'a warning'
21
+ subject.failure 'a failure'
20
22
  end
21
23
  end
22
24
 
23
- describe "#report" do
24
- it "prints warnings" do
25
+ describe '#report' do
26
+ it 'prints warnings' do
25
27
  expect(formatter).to receive(:warning_message).with('WARN: a warning')
26
28
  run_report
27
29
  end
28
30
 
29
- it "prints failures" do
31
+ it 'prints failures' do
30
32
  expect(formatter).to receive(:failure_message).with('FAIL: a failure')
31
33
  run_report
32
34
  end
33
35
 
34
- it "prints summary" do
36
+ it 'prints summary' do
35
37
  expect(formatter).to receive(:failure_message).with(summary_line)
36
38
  run_report
37
39
  end
38
40
 
39
- context "with detail" do
41
+ context 'with detail' do
40
42
  subject { Recog::VerifyReporter.new(double(detail: true, quiet: false, warnings: true), formatter) }
41
43
 
42
- it "prints the fingerprint name" do
44
+ it 'prints the fingerprint name' do
43
45
  expect(formatter).to receive(:status_message).with("\na name")
44
46
  run_report
45
47
  end
46
48
 
47
- it "prints successes" do
49
+ it 'prints successes' do
48
50
  expect(formatter).to receive(:success_message).with(' passed')
49
51
  run_report
50
52
  end
51
53
 
52
- it "prints warnings" do
54
+ it 'prints warnings' do
53
55
  expect(formatter).to receive(:warning_message).with(' WARN: a warning')
54
56
  run_report
55
57
  end
56
58
 
57
- it "prints failures" do
59
+ it 'prints failures' do
58
60
  expect(formatter).to receive(:failure_message).with(' FAIL: a failure')
59
61
  run_report
60
62
  end
61
63
 
62
- it "prints the fingerprint count" do
64
+ it 'prints the fingerprint count' do
63
65
  expect(formatter).to receive(:status_message).with("\nVerified 1 fingerprints:")
64
66
  run_report
65
67
  end
66
68
 
67
- it "prints summary" do
69
+ it 'prints summary' do
68
70
  expect(formatter).to receive(:failure_message).with(summary_line)
69
71
  run_report
70
72
  end
71
73
 
72
- context "with no fingerprint tests" do
74
+ context 'with no fingerprint tests' do
73
75
  let(:tests) { [] }
74
76
 
75
- it "does not print the name" do
77
+ it 'does not print the name' do
76
78
  expect(formatter).not_to receive(:status_message).with("\na name")
77
79
  run_report
78
80
  end
79
81
  end
80
82
  end
81
83
 
82
- context "with fingerprint path" do
83
-
84
+ context 'with fingerprint path' do
84
85
  subject { Recog::VerifyReporter.new(double(detail: false, quiet: false, warnings: true), formatter, path) }
85
86
 
86
- it "prints warnings" do
87
+ it 'prints warnings' do
87
88
  expect(formatter).to receive(:warning_message).with("#{path}: WARN: a warning")
88
89
  run_report
89
90
  end
90
91
 
91
- it "prints failures" do
92
+ it 'prints failures' do
92
93
  expect(formatter).to receive(:failure_message).with("#{path}: FAIL: a failure")
93
94
  run_report
94
95
  end
95
96
 
96
- it "prints summary" do
97
+ it 'prints summary' do
97
98
  expect(formatter).to receive(:failure_message).with("#{path}: #{summary_line}")
98
99
  run_report
99
100
  end
100
101
  end
101
102
 
102
- context "with fingerprint path and detail" do
103
+ context 'with fingerprint path and detail' do
103
104
  subject { Recog::VerifyReporter.new(double(detail: true, quiet: false, warnings: true), formatter, path) }
104
105
 
105
- it "prints the fingerprint path" do
106
+ it 'prints the fingerprint path' do
106
107
  expect(formatter).to receive(:status_message).with("\n#{path}:\n")
107
108
  run_report
108
109
  end
109
110
 
110
- it "prints the fingerprint name" do
111
+ it 'prints the fingerprint name' do
111
112
  expect(formatter).to receive(:status_message).with("\na name")
112
113
  run_report
113
114
  end
114
115
 
115
- it "prints successes" do
116
+ it 'prints successes' do
116
117
  expect(formatter).to receive(:success_message).with(' passed')
117
118
  run_report
118
119
  end
119
120
 
120
- it "prints warnings" do
121
+ it 'prints warnings' do
121
122
  expect(formatter).to receive(:warning_message).with(' WARN: a warning')
122
123
  run_report
123
124
  end
124
125
 
125
- it "prints failures" do
126
+ it 'prints failures' do
126
127
  expect(formatter).to receive(:failure_message).with(' FAIL: a failure')
127
128
  run_report
128
129
  end
129
130
 
130
- it "prints the fingerprint count" do
131
+ it 'prints the fingerprint count' do
131
132
  expect(formatter).to receive(:status_message).with("\nVerified 1 fingerprints:")
132
133
  run_report
133
134
  end
134
135
 
135
- it "prints summary" do
136
+ it 'prints summary' do
136
137
  expect(formatter).to receive(:failure_message).with(summary_line)
137
138
  run_report
138
139
  end
139
140
 
140
- context "with no fingerprint tests" do
141
+ context 'with no fingerprint tests' do
141
142
  let(:tests) { [] }
142
143
 
143
- it "does not print the name" do
144
+ it 'does not print the name' do
144
145
  expect(formatter).not_to receive(:status_message).with("\na name")
145
146
  run_report
146
147
  end
@@ -148,32 +149,32 @@ describe Recog::VerifyReporter do
148
149
  end
149
150
  end
150
151
 
151
- describe "#print_summary" do
152
- context "with success" do
152
+ describe '#print_summary' do
153
+ context 'with success' do
153
154
  before { subject.success 'pass' }
154
155
 
155
- it "prints a successful summary" do
156
- msg = "SUMMARY: Test completed with 1 successful, 0 warnings, and 0 failures"
156
+ it 'prints a successful summary' do
157
+ msg = 'SUMMARY: Test completed with 1 successful, 0 warnings, and 0 failures'
157
158
  expect(formatter).to receive(:success_message).with(msg)
158
159
  subject.print_summary
159
160
  end
160
161
  end
161
162
 
162
- context "with warnings" do
163
+ context 'with warnings' do
163
164
  before { subject.warning 'warn' }
164
165
 
165
- it "prints a warning summary" do
166
- msg = "SUMMARY: Test completed with 0 successful, 1 warnings, and 0 failures"
166
+ it 'prints a warning summary' do
167
+ msg = 'SUMMARY: Test completed with 0 successful, 1 warnings, and 0 failures'
167
168
  expect(formatter).to receive(:warning_message).with(msg)
168
169
  subject.print_summary
169
170
  end
170
171
  end
171
172
 
172
- context "with failures" do
173
+ context 'with failures' do
173
174
  before { subject.failure 'fail' }
174
175
 
175
- it "prints a failure summary" do
176
- msg = "SUMMARY: Test completed with 0 successful, 0 warnings, and 1 failures"
176
+ it 'prints a failure summary' do
177
+ msg = 'SUMMARY: Test completed with 0 successful, 0 warnings, and 1 failures'
177
178
  expect(formatter).to receive(:failure_message).with(msg)
178
179
  subject.print_summary
179
180
  end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  FINGERPRINT_DIR = File.expand_path(File.join('..', 'recog', 'xml'), __dir__)
2
4
 
3
5
  # setup code coverage
@@ -22,7 +24,6 @@ require 'rspec'
22
24
  #
23
25
  # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
24
26
  RSpec.configure do |config|
25
-
26
27
  # Run specs in random order to surface order dependencies. If you find an
27
28
  # order dependency and want to debug it, you can fix the order by providing
28
29
  # the seed, which is printed after each run.
data.tar.gz.sig CHANGED
@@ -1,3 +1 @@
1
- ,��/�@xv4ȟD����H|C��Y���3M����X����ຮ�ނ�d
2
- �0�?�v`Ӵ�C&b��[�#T1E6������� ;i�z���a�
3
- S�v�=Ԡ^�z;X1�%���dc��p����w��,��GS�Vv����� 6%�z��r�c����V� woVʊ�ǔȳ6�B�l���C���āe�i�@�7�E#'&s���9� H����a+%Y&&$�Mw�AǮk�ip�h����~p�R�Fq<{]F��
1
+ =&�-, *K��Z�8�k���O�ٱ�N���Y���X��9{��-J�&� �Oot ��%�D�!Od�d�,�^�S
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: recog
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.1
4
+ version: 3.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rapid7 Research
@@ -93,7 +93,7 @@ cert_chain:
93
93
  EknWpNgVhohbot1lfVAMmIhdtOVaRVcQQixWPwprDj/ydB8ryDMDosIMcw+fkoXU
94
94
  9GJsSaSRRYQ9UUkVL27b64okU8D48m8=
95
95
  -----END CERTIFICATE-----
96
- date: 2023-03-18 00:00:00.000000000 Z
96
+ date: 2023-08-16 00:00:00.000000000 Z
97
97
  dependencies:
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: rspec
@@ -293,7 +293,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
293
293
  requirements:
294
294
  - - ">="
295
295
  - !ruby/object:Gem::Version
296
- version: '2.1'
296
+ version: '2.5'
297
297
  required_rubygems_version: !ruby/object:Gem::Requirement
298
298
  requirements:
299
299
  - - ">="
metadata.gz.sig CHANGED
Binary file