recog 2.3.21 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +42 -16
  4. data/Rakefile +2 -9
  5. data/lib/recog/db.rb +2 -1
  6. data/lib/recog/db_manager.rb +1 -1
  7. data/lib/recog/fingerprint.rb +33 -6
  8. data/lib/recog/fingerprint_parse_error.rb +10 -0
  9. data/lib/recog/verifier.rb +9 -9
  10. data/lib/recog/verify_reporter.rb +17 -6
  11. data/lib/recog/version.rb +1 -1
  12. data/{bin → recog/bin}/recog_match +0 -1
  13. data/{xml → recog/xml}/apache_modules.xml +0 -0
  14. data/{xml → recog/xml}/apache_os.xml +98 -56
  15. data/{xml → recog/xml}/architecture.xml +15 -1
  16. data/recog/xml/dhcp_vendor_class.xml +206 -0
  17. data/{xml → recog/xml}/dns_versionbind.xml +16 -13
  18. data/{xml → recog/xml}/favicons.xml +297 -47
  19. data/{xml → recog/xml}/fingerprints.xsd +9 -1
  20. data/{xml → recog/xml}/ftp_banners.xml +160 -156
  21. data/{xml → recog/xml}/h323_callresp.xml +101 -101
  22. data/{xml → recog/xml}/hp_pjl_id.xml +84 -84
  23. data/{xml → recog/xml}/html_title.xml +727 -34
  24. data/{xml → recog/xml}/http_cookies.xml +160 -77
  25. data/{xml → recog/xml}/http_servers.xml +556 -283
  26. data/{xml → recog/xml}/http_wwwauth.xml +190 -75
  27. data/{xml → recog/xml}/imap_banners.xml +5 -5
  28. data/{xml → recog/xml}/ldap_searchresult.xml +0 -0
  29. data/{xml → recog/xml}/mdns_device-info_txt.xml +389 -26
  30. data/{xml → recog/xml}/mdns_workstation_txt.xml +0 -0
  31. data/{xml → recog/xml}/mysql_banners.xml +1 -1
  32. data/{xml → recog/xml}/mysql_error.xml +0 -0
  33. data/{xml → recog/xml}/nntp_banners.xml +11 -8
  34. data/{xml → recog/xml}/ntp_banners.xml +97 -97
  35. data/{xml → recog/xml}/operating_system.xml +95 -80
  36. data/{xml → recog/xml}/pop_banners.xml +23 -23
  37. data/{xml → recog/xml}/rsh_resp.xml +3 -3
  38. data/{xml → recog/xml}/rtsp_servers.xml +0 -0
  39. data/{xml → recog/xml}/sip_banners.xml +43 -5
  40. data/{xml → recog/xml}/sip_user_agents.xml +175 -27
  41. data/{xml → recog/xml}/smb_native_lm.xml +5 -5
  42. data/{xml → recog/xml}/smb_native_os.xml +25 -25
  43. data/{xml → recog/xml}/smtp_banners.xml +147 -146
  44. data/{xml → recog/xml}/smtp_debug.xml +0 -0
  45. data/{xml → recog/xml}/smtp_ehlo.xml +1 -1
  46. data/{xml → recog/xml}/smtp_expn.xml +0 -0
  47. data/{xml → recog/xml}/smtp_help.xml +11 -11
  48. data/{xml → recog/xml}/smtp_mailfrom.xml +0 -0
  49. data/{xml → recog/xml}/smtp_noop.xml +2 -2
  50. data/{xml → recog/xml}/smtp_quit.xml +0 -0
  51. data/{xml → recog/xml}/smtp_rcptto.xml +0 -0
  52. data/{xml → recog/xml}/smtp_rset.xml +0 -0
  53. data/{xml → recog/xml}/smtp_turn.xml +0 -0
  54. data/{xml → recog/xml}/smtp_vrfy.xml +0 -0
  55. data/{xml → recog/xml}/snmp_sysdescr.xml +1570 -1430
  56. data/{xml → recog/xml}/snmp_sysobjid.xml +38 -27
  57. data/{xml → recog/xml}/ssh_banners.xml +16 -10
  58. data/{xml → recog/xml}/telnet_banners.xml +238 -21
  59. data/{xml → recog/xml}/tls_jarm.xml +56 -6
  60. data/{xml → recog/xml}/x11_banners.xml +3 -3
  61. data/{xml → recog/xml}/x509_issuers.xml +49 -1
  62. data/{xml → recog/xml}/x509_subjects.xml +139 -38
  63. data/recog.gemspec +9 -5
  64. data/spec/data/external_example_fingerprint/hp_printer_ex_01.txt +1 -0
  65. data/spec/data/external_example_fingerprint/hp_printer_ex_02.txt +1 -0
  66. data/spec/data/external_example_fingerprint.xml +8 -0
  67. data/spec/data/external_example_illegal_path_fingerprint.xml +7 -0
  68. data/spec/lib/recog/db_spec.rb +84 -61
  69. data/spec/lib/recog/fingerprint_spec.rb +4 -4
  70. data/spec/lib/recog/verify_reporter_spec.rb +73 -4
  71. data/spec/spec_helper.rb +4 -0
  72. metadata +65 -134
  73. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -37
  74. data/.github/ISSUE_TEMPLATE/feature_request.md +0 -17
  75. data/.github/ISSUE_TEMPLATE/fingerprint_request.md +0 -27
  76. data/.github/PULL_REQUEST_TEMPLATE +0 -24
  77. data/.github/SECURITY.md +0 -35
  78. data/.github/workflows/ci.yml +0 -26
  79. data/.gitignore +0 -23
  80. data/.rspec +0 -3
  81. data/.ruby-gemset +0 -1
  82. data/.ruby-version +0 -1
  83. data/.snyk +0 -10
  84. data/.travis.yml +0 -25
  85. data/CONTRIBUTING.md +0 -270
  86. data/bin/recog_cleanup +0 -16
  87. data/bin/recog_export +0 -81
  88. data/bin/recog_standardize +0 -148
  89. data/bin/recog_verify +0 -64
  90. data/cpe-remap.yaml +0 -343
  91. data/features/data/failing_banners_fingerprints.xml +0 -20
  92. data/features/data/matching_banners_fingerprints.xml +0 -23
  93. data/features/data/multiple_banners_fingerprints.xml +0 -32
  94. data/features/data/no_tests.xml +0 -3
  95. data/features/data/sample_banner.txt +0 -2
  96. data/features/data/successful_tests.xml +0 -18
  97. data/features/data/tests_with_failures.xml +0 -20
  98. data/features/data/tests_with_warnings.xml +0 -17
  99. data/features/match.feature +0 -36
  100. data/features/support/aruba.rb +0 -3
  101. data/features/support/env.rb +0 -6
  102. data/features/verify.feature +0 -48
  103. data/identifiers/README.md +0 -70
  104. data/identifiers/fields.txt +0 -104
  105. data/identifiers/hw_device.txt +0 -78
  106. data/identifiers/hw_family.txt +0 -113
  107. data/identifiers/hw_product.txt +0 -410
  108. data/identifiers/os_architecture.txt +0 -10
  109. data/identifiers/os_device.txt +0 -75
  110. data/identifiers/os_family.txt +0 -233
  111. data/identifiers/os_product.txt +0 -340
  112. data/identifiers/service_family.txt +0 -249
  113. data/identifiers/service_product.txt +0 -752
  114. data/identifiers/vendor.txt +0 -798
  115. data/lib/recog/verifier_factory.rb +0 -13
  116. data/misc/convert_mysql_err +0 -61
  117. data/misc/order.xsl +0 -17
  118. data/requirements.txt +0 -2
  119. data/spec/lib/fingerprint_self_test_spec.rb +0 -174
  120. data/update_cpes.py +0 -250
@@ -69,13 +69,12 @@
69
69
 
70
70
  <fingerprint pattern="^SERIALNUMBER=PID:([^ ]+) SN:([^,]+),CN=(?:[a-zA-Z0-9\-]+)-SEP([a-fA-F0-9]{12}),OU=[CV]TG,O=Cisco Systems Inc\.$">
71
71
  <description>Cisco IP phone with serial number</description>
72
- <example host.mac="B07D47D33A1C" hw.product="CP-8851" cisco.serial_number="FCH1924AHCA" hw.serial_number="FCH1924AHCA">SERIALNUMBER=PID:CP-8851 SN:FCH1924AHCA,CN=CP-8851-SEPB07D47D33A1C,OU=CTG,O=Cisco Systems Inc.</example>
73
- <example host.mac="64D989000000" hw.product="CP-9951" cisco.serial_number="FCH15200000" hw.serial_number="FCH15200000">SERIALNUMBER=PID:CP-9951 SN:FCH15200000,CN=CP-9951-SEP64D989000000,OU=VTG,O=Cisco Systems Inc.</example>
72
+ <example host.mac="B07D47D33A1C" hw.product="CP-8851" hw.serial_number="FCH1924AHCA">SERIALNUMBER=PID:CP-8851 SN:FCH1924AHCA,CN=CP-8851-SEPB07D47D33A1C,OU=CTG,O=Cisco Systems Inc.</example>
73
+ <example host.mac="64D989000000" hw.product="CP-9951" hw.serial_number="FCH15200000">SERIALNUMBER=PID:CP-9951 SN:FCH15200000,CN=CP-9951-SEP64D989000000,OU=VTG,O=Cisco Systems Inc.</example>
74
74
  <param pos="0" name="hw.device" value="VoIP"/>
75
75
  <param pos="0" name="hw.vendor" value="Cisco"/>
76
76
  <param pos="1" name="hw.product"/>
77
77
  <param pos="2" name="hw.serial_number"/>
78
- <param pos="2" name="cisco.serial_number"/>
79
78
  <param pos="3" name="host.mac"/>
80
79
  </fingerprint>
81
80
 
@@ -217,7 +216,7 @@
217
216
 
218
217
  <fingerprint pattern="^CN=([A-Za-z0-9\_\-\.]+),OU=ISS,O=Hewlett-Packard Company,L=Houston,ST=Texas,C=US$">
219
218
  <description>HP iLO</description>
220
- <example>CN=SERVER-1231,OU=ISS,O=Hewlett-Packard Company,L=Houston,ST=Texas,C=US</example>
219
+ <example host.name="SERVER-1231">CN=SERVER-1231,OU=ISS,O=Hewlett-Packard Company,L=Houston,ST=Texas,C=US</example>
221
220
  <param pos="0" name="hw.device" value="Lights Out Management"/>
222
221
  <param pos="0" name="hw.vendor" value="HP"/>
223
222
  <param pos="0" name="hw.family" value="iLO"/>
@@ -248,8 +247,8 @@
248
247
 
249
248
  <fingerprint pattern="^CN=OA\-([a-fA-F0-9]+),OU=Onboard Administrator,">
250
249
  <description>HP iLO (Onboard Administrator)</description>
251
- <example>CN=OA-001F296E21A3,OU=Onboard Administrator,O=Corp.,L=Location,ST=N/A,C=US</example>
252
- <example>CN=OA-80C16E999999,OU=Onboard Administrator,O=Hewlett-Packard</example>
250
+ <example host.mac="001F296E21A3">CN=OA-001F296E21A3,OU=Onboard Administrator,O=Corp.,L=Location,ST=N/A,C=US</example>
251
+ <example host.mac="80C16E999999">CN=OA-80C16E999999,OU=Onboard Administrator,O=Hewlett-Packard</example>
253
252
  <param pos="0" name="hw.device" value="Lights Out Management"/>
254
253
  <param pos="0" name="hw.vendor" value="HP"/>
255
254
  <param pos="0" name="hw.family" value="iLO"/>
@@ -265,7 +264,7 @@
265
264
 
266
265
  <fingerprint pattern="^CN=([A-Za-z0-9\_\-\.]+),OU=Hewlett Packard Enterprise Network Management Software \(SMH\),O=Hewlett Packard Enterprise,L=Houston,ST=Texas,C=US$">
267
266
  <description>HP iLO - Enterprise Mgmt variant</description>
268
- <example>CN=bigsrv99,OU=Hewlett Packard Enterprise Network Management Software (SMH),O=Hewlett Packard Enterprise,L=Houston,ST=Texas,C=US</example>
267
+ <example host.name="bigsrv99">CN=bigsrv99,OU=Hewlett Packard Enterprise Network Management Software (SMH),O=Hewlett Packard Enterprise,L=Houston,ST=Texas,C=US</example>
269
268
  <param pos="0" name="hw.device" value="Lights Out Management"/>
270
269
  <param pos="0" name="hw.vendor" value="HP"/>
271
270
  <param pos="0" name="hw.family" value="iLO"/>
@@ -309,29 +308,27 @@
309
308
 
310
309
  <fingerprint pattern="^CN=C-series CIMC,OU=PID:([^ ]+) SERIAL:([^,]+),O=Cisco">
311
310
  <description>Cisco Integrated Management Controller</description>
312
- <example cisco.serial_number="FCH18999AAA" hw.serial_number="FCH18999AAA" cisco.imc_model="UCSC-C220-M3S">CN=C-series CIMC,OU=PID:UCSC-C220-M3S SERIAL:FCH18999AAA,O=Cisco Self Signed,L=San Jose,ST=California,C=US</example>
311
+ <example hw.serial_number="FCH18999AAA" cisco.imc_model="UCSC-C220-M3S">CN=C-series CIMC,OU=PID:UCSC-C220-M3S SERIAL:FCH18999AAA,O=Cisco Self Signed,L=San Jose,ST=California,C=US</example>
313
312
  <param pos="0" name="hw.device" value="Lights Out Management"/>
314
313
  <param pos="0" name="hw.vendor" value="Cisco"/>
315
314
  <param pos="0" name="hw.product" value="IMC"/>
316
- <param pos="2" name="hw.serial_number"/>
317
315
  <param pos="0" name="os.vendor" value="Cisco"/>
318
316
  <param pos="0" name="os.family" value="Linux"/>
319
317
  <param pos="0" name="os.product" value="IMC"/>
320
- <param pos="2" name="cisco.serial_number"/>
318
+ <param pos="2" name="hw.serial_number"/>
321
319
  <param pos="1" name="cisco.imc_model"/>
322
320
  </fingerprint>
323
321
 
324
322
  <fingerprint pattern="^CN=C220-(FCH[^,]+),OU=null,O=Cisco Systems Inc">
325
323
  <description>Cisco Integrated Management Controller C220</description>
326
- <example cisco.serial_number="FCH17999AAA" hw.serial_number="FCH17999AAA">CN=C220-FCH17999AAA,OU=null,O=Cisco Systems Inc.,L=San Jose,ST=California,C=US</example>
324
+ <example hw.serial_number="FCH17999AAA">CN=C220-FCH17999AAA,OU=null,O=Cisco Systems Inc.,L=San Jose,ST=California,C=US</example>
327
325
  <param pos="0" name="hw.device" value="Lights Out Management"/>
328
326
  <param pos="0" name="hw.vendor" value="Cisco"/>
329
327
  <param pos="0" name="hw.product" value="IMC"/>
330
- <param pos="1" name="hw.serial_number"/>
331
328
  <param pos="0" name="os.vendor" value="Cisco"/>
332
329
  <param pos="0" name="os.family" value="Linux"/>
333
330
  <param pos="0" name="os.product" value="IMC"/>
334
- <param pos="1" name="cisco.serial_number"/>
331
+ <param pos="1" name="hw.serial_number"/>
335
332
  </fingerprint>
336
333
 
337
334
  <fingerprint pattern="^CN=avocent.com,OU=AESS,O=Avocent,L=Sunrise,ST=FL,C=US$">
@@ -356,8 +353,8 @@
356
353
 
357
354
  <fingerprint pattern="^CN=HP Jetdirect [a-zA-Z0-9]+,OU=([a-fA-F0-9]{12})\+OU=([a-zA-Z0-9]+),O=Hewlett-Packard Co\.$">
358
355
  <description>HP Jet Direct - with host MAC and product</description>
359
- <example host.mac="2C413883186A" hw.product="J8028E">CN=HP Jetdirect 38831831,OU=2C413883186A+OU=J8028E,O=Hewlett-Packard Co.</example>
360
- <example os.product="J8016E">CN=HP Jetdirect FBFA31E7,OU=8851FBE33ABB+OU=J8016E,O=Hewlett-Packard Co.</example>
356
+ <example host.mac="2C413883186A" hw.product="J8028E" os.product="J8028E">CN=HP Jetdirect 38831831,OU=2C413883186A+OU=J8028E,O=Hewlett-Packard Co.</example>
357
+ <example os.product="J8016E" host.mac="8851FBE33ABB" hw.product="J8016E">CN=HP Jetdirect FBFA31E7,OU=8851FBE33ABB+OU=J8016E,O=Hewlett-Packard Co.</example>
361
358
  <param pos="0" name="hw.device" value="Printer"/>
362
359
  <param pos="0" name="hw.vendor" value="HP"/>
363
360
  <param pos="0" name="hw.family" value="JetDirect"/>
@@ -411,12 +408,11 @@
411
408
 
412
409
  <fingerprint pattern="^SERIALNUMBER=([a-zA-Z0-9]+),CN=DEVICE-vWLC,O=Cisco Virtual WLC$">
413
410
  <description>Cisco vWLC</description>
414
- <example cisco.serial_number="9C89M2088D1" hw.serial_number="9C89M2088D1">SERIALNUMBER=9C89M2088D1,CN=DEVICE-vWLC,O=Cisco Virtual WLC</example>
411
+ <example hw.serial_number="9C89M2088D1">SERIALNUMBER=9C89M2088D1,CN=DEVICE-vWLC,O=Cisco Virtual WLC</example>
415
412
  <param pos="0" name="os.vendor" value="Cisco"/>
416
413
  <param pos="0" name="os.device" value="Wireless Controller"/>
417
414
  <param pos="0" name="os.product" value="Wireless LAN Controller"/>
418
415
  <param pos="0" name="os.cpe23" value="cpe:/o:cisco:wireless_lan_controller_software:-"/>
419
- <param pos="1" name="cisco.serial_number"/>
420
416
  <param pos="1" name="hw.serial_number"/>
421
417
  </fingerprint>
422
418
 
@@ -508,7 +504,7 @@
508
504
 
509
505
  <fingerprint pattern="^CN=([a-zA-Z0-9\.\-\_]+),OU=VMware ESX Server Default Certificate,O=VMware\\, Inc,L=Palo Alto,ST=California,C=US$">
510
506
  <description>VMware ESX</description>
511
- <example>CN=server99.,OU=VMware ESX Server Default Certificate,O=VMware\, Inc,L=Palo Alto,ST=California,C=US</example>
507
+ <example host.name="server99.">CN=server99.,OU=VMware ESX Server Default Certificate,O=VMware\, Inc,L=Palo Alto,ST=California,C=US</example>
512
508
  <param pos="0" name="service.vendor" value="VMware"/>
513
509
  <param pos="0" name="os.vendor" value="VMware"/>
514
510
  <param pos="0" name="os.family" value="VMware ESX/ESXi"/>
@@ -619,8 +615,8 @@
619
615
 
620
616
  <fingerprint pattern="^CN=([a-zA-Z0-9]{5,12}) ([a-zA-Z0-9]{12}),OU=(?:Cast|Google TV),O=Google Inc,L=Mountain View,ST=California,C=US$">
621
617
  <description>Google Chromecast</description>
622
- <example chromecast.serial_number="LVDZG5" host.mac_local="FA8FCA67413D" hw.serial_number="LVDZG5">CN=LVDZG5 FA8FCA67413D,OU=Cast,O=Google Inc,L=Mountain View,ST=California,C=US</example>
623
- <example chromecast.serial_number="YRBLE" host.mac_local="FA8FCA7DE87D" hw.serial_number="YRBLE">CN=YRBLE FA8FCA7DE87D,OU=Google TV,O=Google Inc,L=Mountain View,ST=California,C=US</example>
618
+ <example host.mac_local="FA8FCA67413D" hw.serial_number="LVDZG5">CN=LVDZG5 FA8FCA67413D,OU=Cast,O=Google Inc,L=Mountain View,ST=California,C=US</example>
619
+ <example host.mac_local="FA8FCA7DE87D" hw.serial_number="YRBLE">CN=YRBLE FA8FCA7DE87D,OU=Google TV,O=Google Inc,L=Mountain View,ST=California,C=US</example>
624
620
  <param pos="0" name="os.vendor" value="Google"/>
625
621
  <param pos="0" name="os.product" value="Chrome OS"/>
626
622
  <param pos="0" name="os.certainty" value="0.5"/>
@@ -628,9 +624,9 @@
628
624
  <param pos="0" name="hw.device" value="Media Server"/>
629
625
  <param pos="0" name="hw.vendor" value="Google"/>
630
626
  <param pos="0" name="hw.product" value="Chromecast"/>
631
- <param pos="1" name="hw.serial_number"/>
632
627
  <param pos="0" name="hw.certainty" value="0.5"/>
633
- <param pos="1" name="chromecast.serial_number"/>
628
+ <param pos="1" name="hw.serial_number"/>
629
+ <param pos="0" name="hw.cpe23" value="cpe:/h:google:chromecast:-"/>
634
630
  <!-- This is the hotspot-mode MAC address (clear bit 2) -->
635
631
 
636
632
  <param pos="2" name="host.mac_local"/>
@@ -638,7 +634,7 @@
638
634
 
639
635
  <fingerprint pattern="^CN=([a-zA-Z0-9]{5,12}) ([a-zA-Z0-9]{12}),OU=Cast TV \(Vizio\),O=Google Inc,L=Mountain View,ST=California,C=US$">
640
636
  <description>Vizio SmartTV (Android) with Google Cast</description>
641
- <example chromecast.serial_number="9V039WC9" hw.serial_number="9V039WC9" host.mac_local="FA8FCA697898">CN=9V039WC9 FA8FCA697898,OU=Cast TV (Vizio),O=Google Inc,L=Mountain View,ST=California,C=US</example>
637
+ <example hw.serial_number="9V039WC9" host.mac_local="FA8FCA697898">CN=9V039WC9 FA8FCA697898,OU=Cast TV (Vizio),O=Google Inc,L=Mountain View,ST=California,C=US</example>
642
638
  <param pos="0" name="os.vendor" value="Google"/>
643
639
  <param pos="0" name="os.family" value="Linux"/>
644
640
  <param pos="0" name="os.product" value="Android"/>
@@ -646,7 +642,6 @@
646
642
  <param pos="0" name="hw.device" value="Smart TV"/>
647
643
  <param pos="0" name="hw.vendor" value="Vizio"/>
648
644
  <param pos="1" name="hw.serial_number"/>
649
- <param pos="1" name="chromecast.serial_number"/>
650
645
  <!-- This is the hotspot-mode MAC address (clear bit 2) -->
651
646
 
652
647
  <param pos="2" name="host.mac_local"/>
@@ -885,31 +880,29 @@
885
880
 
886
881
  <fingerprint pattern="^CN=([A-Za-z0-9]+),OU=FortiGate,O=Fortinet,L=Sunnyvale,ST=California,C=US$">
887
882
  <description>Fortinet Gateway</description>
888
- <example fortinet.serial_number="FG100ETK1800118" hw.serial_number="FG100ETK1800118">CN=FG100ETK1800118,OU=FortiGate,O=Fortinet,L=Sunnyvale,ST=California,C=US</example>
889
- <example fortinet.serial_number="FGT30D3X15038375" hw.serial_number="FGT30D3X15038375">CN=FGT30D3X15038375,OU=FortiGate,O=Fortinet,L=Sunnyvale,ST=California,C=US</example>
883
+ <example hw.serial_number="FG100ETK1800118">CN=FG100ETK1800118,OU=FortiGate,O=Fortinet,L=Sunnyvale,ST=California,C=US</example>
884
+ <example hw.serial_number="FGT30D3X15038375">CN=FGT30D3X15038375,OU=FortiGate,O=Fortinet,L=Sunnyvale,ST=California,C=US</example>
890
885
  <param pos="0" name="hw.vendor" value="Fortinet"/>
891
886
  <param pos="0" name="hw.device" value="Firewall"/>
892
- <param pos="1" name="hw.serial_number"/>
893
887
  <param pos="0" name="os.vendor" value="Fortinet"/>
894
888
  <param pos="0" name="os.family" value="Linux"/>
895
889
  <param pos="0" name="os.device" value="Firewall"/>
896
890
  <param pos="0" name="os.product" value="FortiOS"/>
897
891
  <param pos="0" name="os.cpe23" value="cpe:/o:fortinet:fortios:-"/>
898
- <param pos="1" name="fortinet.serial_number"/>
892
+ <param pos="1" name="hw.serial_number"/>
899
893
  </fingerprint>
900
894
 
901
895
  <fingerprint pattern="^CN=([A-Za-z0-9]+),O=Fortinet Ltd\.$">
902
896
  <description>Fortinet Gateway (Older)</description>
903
- <example fortinet.serial_number="FG100D3G13803999" hw.serial_number="FG100D3G13803999">CN=FG100D3G13803999,O=Fortinet Ltd.</example>
897
+ <example hw.serial_number="FG100D3G13803999">CN=FG100D3G13803999,O=Fortinet Ltd.</example>
904
898
  <param pos="0" name="hw.vendor" value="Fortinet"/>
905
899
  <param pos="0" name="hw.device" value="Firewall"/>
906
- <param pos="1" name="hw.serial_number"/>
907
900
  <param pos="0" name="os.vendor" value="Fortinet"/>
908
901
  <param pos="0" name="os.family" value="Linux"/>
909
902
  <param pos="0" name="os.device" value="Firewall"/>
910
903
  <param pos="0" name="os.product" value="FortiOS"/>
911
904
  <param pos="0" name="os.cpe23" value="cpe:/o:fortinet:fortios:-"/>
912
- <param pos="1" name="fortinet.serial_number"/>
905
+ <param pos="1" name="hw.serial_number"/>
913
906
  </fingerprint>
914
907
 
915
908
  <fingerprint pattern="^CN=FortiMail,OU=FortiMail,O=Fortinet,L=Sunnyvale,ST=California,C=US$">
@@ -1139,10 +1132,11 @@
1139
1132
  <param pos="0" name="os.product" value="Linux"/>
1140
1133
  </fingerprint>
1141
1134
 
1142
- <fingerprint pattern="^CN=MAC([a-fA-F0-9]{12}),OU=([^,]+),O=Mercury Security Products\\, LLC,L=Long Beach,ST=CA,C=US$">
1135
+ <fingerprint pattern="^CN=MAC([a-fA-F0-9]{12}),OU=([^,]+),O=Mercury Security Products\\, LLC,L=Long Beach,ST=CA,C=US(?:,\S+)?$">
1143
1136
  <description>Mercurity Security (now HID Global)</description>
1144
1137
  <example hw.product="M5IC" host.mac="000FE507A1F1">CN=MAC000FE507A1F1,OU=M5IC,O=Mercury Security Products\, LLC,L=Long Beach,ST=CA,C=US</example>
1145
1138
  <example hw.product="EP-1502" host.mac="000FE508BC71">CN=MAC000FE508BC71,OU=EP-1502,O=Mercury Security Products\, LLC,L=Long Beach,ST=CA,C=US</example>
1139
+ <example hw.product="LP-1501" host.mac="000FE5091111">CN=MAC000FE5091111,OU=LP-1501,O=Mercury Security Products\, LLC,L=Long Beach,ST=CA,C=US,2.5.4.4=#111111111111111111</example>
1146
1140
  <param pos="0" name="hw.vendor" value="Mercury Security"/>
1147
1141
  <param pos="0" name="hw.device" value="Access Control"/>
1148
1142
  <param pos="1" name="host.mac"/>
@@ -1242,7 +1236,7 @@
1242
1236
 
1243
1237
  <fingerprint pattern="^CN=Canon (iR-[a-zA-Z0-9\.\-\_]+)$">
1244
1238
  <description>Canon iR-ADV Printer with product info</description>
1245
- <example os.product="iR-ADV">CN=Canon iR-ADV</example>
1239
+ <example os.product="iR-ADV" hw.product="iR-ADV">CN=Canon iR-ADV</example>
1246
1240
  <param pos="0" name="hw.device" value="Printer"/>
1247
1241
  <param pos="0" name="hw.vendor" value="Canon"/>
1248
1242
  <param pos="0" name="os.device" value="Printer"/>
@@ -1307,20 +1301,28 @@
1307
1301
 
1308
1302
  <fingerprint pattern="^CN=Ruckus Wireless ZoneDirector SN-(\d+),O=Ruckus Wireless\\, Inc\.,ST=CA,C=US$">
1309
1303
  <description>Ruckus Zone Director</description>
1310
- <example ruckus.serial_number="221301007591" hw.serial_number="221301007591">CN=Ruckus Wireless ZoneDirector SN-221301007591,O=Ruckus Wireless\, Inc.,ST=CA,C=US</example>
1304
+ <example hw.serial_number="221301007591">CN=Ruckus Wireless ZoneDirector SN-221301007591,O=Ruckus Wireless\, Inc.,ST=CA,C=US</example>
1311
1305
  <param pos="0" name="hw.device" value="Wireless Controller"/>
1312
1306
  <param pos="0" name="hw.vendor" value="Ruckus"/>
1313
1307
  <param pos="0" name="hw.product" value="Zone Director"/>
1314
- <param pos="1" name="hw.serial_number"/>
1315
1308
  <param pos="0" name="os.device" value="Wireless Controller"/>
1316
1309
  <param pos="0" name="os.vendor" value="Ruckus"/>
1317
1310
  <param pos="0" name="os.product" value="Zone Director"/>
1318
- <param pos="1" name="ruckus.serial_number"/>
1311
+ <param pos="1" name="hw.serial_number"/>
1312
+ </fingerprint>
1313
+
1314
+ <fingerprint pattern="^CN=SN-(\d+),O=Ruckus Wireless Inc.,L=Sunnyvale,ST=California,C=US$">
1315
+ <description>Ruckus Wireless Access Point</description>
1316
+ <example hw.serial_number="010101010101">CN=SN-010101010101,O=Ruckus Wireless Inc.,L=Sunnyvale,ST=California,C=US</example>
1317
+ <param pos="0" name="hw.device" value="WAP"/>
1318
+ <param pos="0" name="hw.vendor" value="Ruckus"/>
1319
+ <param pos="0" name="hw.product" value="Access Point"/>
1320
+ <param pos="1" name="hw.serial_number"/>
1319
1321
  </fingerprint>
1320
1322
 
1321
1323
  <fingerprint pattern="^CN=DT([^\s]+) Series,O=NEC Corporation,ST=Tokyo,C=JP$">
1322
1324
  <description>NEC DT Series IP Phone</description>
1323
- <example>CN=DT800 Series,O=NEC Corporation,ST=Tokyo,C=JP</example>
1325
+ <example hw.product="800">CN=DT800 Series,O=NEC Corporation,ST=Tokyo,C=JP</example>
1324
1326
  <param pos="0" name="os.vendor" value="NEC"/>
1325
1327
  <param pos="0" name="os.device" value="VoIP"/>
1326
1328
  <param pos="0" name="hw.vendor" value="NEC"/>
@@ -1469,9 +1471,10 @@
1469
1471
  <param pos="0" name="hw.product" value="Sensor"/>
1470
1472
  </fingerprint>
1471
1473
 
1472
- <fingerprint pattern="^CN=HiveAP,OU=Default,O=Aerohive,ST=California,C=US$">
1474
+ <fingerprint pattern="^CN=HiveAP,OU=Default,O=Aerohive,(?:L=Sunnyvale,)?ST=California,C=US$">
1473
1475
  <description>Aerohive Access Point</description>
1474
1476
  <example>CN=HiveAP,OU=Default,O=Aerohive,ST=California,C=US</example>
1477
+ <example>CN=HiveAP,OU=Default,O=Aerohive,L=Sunnyvale,ST=California,C=US</example>
1475
1478
  <param pos="0" name="hw.vendor" value="Aerohive"/>
1476
1479
  <param pos="0" name="hw.device" value="WAP"/>
1477
1480
  <param pos="0" name="hw.product" value="Access Point"/>
@@ -1654,4 +1657,102 @@
1654
1657
  <param pos="1" name="host.name"/>
1655
1658
  </fingerprint>
1656
1659
 
1660
+ <fingerprint pattern="^CN=Freebox Intermediate CA,O=Freebox,ST=France,C=FR$">
1661
+ <description>Freebox Device</description>
1662
+ <example>CN=Freebox Intermediate CA,O=Freebox,ST=France,C=FR</example>
1663
+ <param pos="0" name="hw.vendor" value="Freebox"/>
1664
+ </fingerprint>
1665
+
1666
+ <fingerprint pattern="^CN=TP-LINK CA,O=TP-LINK Technologies CO.\\, LTD.,L=Shenzhen,ST=Guangdong,C=CN(?:,\S+)?$">
1667
+ <description>TP-LINK Device</description>
1668
+ <example>CN=TP-LINK CA,O=TP-LINK Technologies CO.\, LTD.,L=Shenzhen,ST=Guangdong,C=CN,1.2.840.113549.1.9.1=#0c16736572766963654074702d6c696e6b2e636f6d2e636e</example>
1669
+ <param pos="0" name="hw.vendor" value="TP-LINK"/>
1670
+ </fingerprint>
1671
+
1672
+ <fingerprint pattern="^CN=BHA-([0-9a-fA-F]{12}),O=Bird Home Automation$">
1673
+ <description>Bird Home Automation</description>
1674
+ <example host.mac="0123456789AB">CN=BHA-0123456789AB,O=Bird Home Automation</example>
1675
+ <param pos="0" name="hw.device" value="Device"/>
1676
+ <param pos="0" name="hw.vendor" value="Bird Home Automation"/>
1677
+ <param pos="1" name="host.mac"/>
1678
+ </fingerprint>
1679
+
1680
+ <fingerprint pattern="^CN=\S+,OU=Media Server,O=Avaya Inc\.,C=US">
1681
+ <description>Avaya Media Server</description>
1682
+ <example>CN=192.168.0.3,OU=Media Server,O=Avaya Inc.,C=US</example>
1683
+ <param pos="0" name="os.vendor" value="Avaya"/>
1684
+ <param pos="0" name="os.device" value="Media Gateway"/>
1685
+ <param pos="0" name="os.product" value="Media Server"/>
1686
+ </fingerprint>
1687
+
1688
+ <fingerprint pattern="^CN=iSTAR Ultra">
1689
+ <description>iSTAR Ultra</description>
1690
+ <example>CN=iSTAR Ultra,OU=Access Control and Video Division,O=Johnson Controls,L=Westford,ST=Massachusetts,C=US</example>
1691
+ <param pos="0" name="os.vendor" value="Software House"/>
1692
+ <param pos="0" name="os.family" value="Linux"/>
1693
+ <param pos="0" name="os.product" value="{hw.product} Firmware"/>
1694
+ <param pos="0" name="hw.vendor" value="Software House"/>
1695
+ <param pos="0" name="hw.device" value="Access Control"/>
1696
+ <param pos="0" name="hw.family" value="iSTAR Door Controllers"/>
1697
+ <param pos="0" name="hw.product" value="iSTAR Ultra"/>
1698
+ <param pos="0" name="hw.cpe23" value="cpe:/h:swhouse:istar_ultra:-"/>
1699
+ </fingerprint>
1700
+
1701
+ <fingerprint pattern="^O=SpotteRF - NetworkedIO$">
1702
+ <description>SpotterRF</description>
1703
+ <example>O=SpotteRF - NetworkedIO</example>
1704
+ <param pos="0" name="os.vendor" value="SpotterRF"/>
1705
+ <param pos="0" name="os.family" value="Linux"/>
1706
+ <param pos="0" name="os.certainty" value="0.90"/>
1707
+ <param pos="0" name="hw.vendor" value="SpotterRF"/>
1708
+ <param pos="0" name="hw.device" value="Sensor"/>
1709
+ <param pos="0" name="hw.product" value="Drone Detector"/>
1710
+ </fingerprint>
1711
+
1712
+ <fingerprint pattern="(?i)^CN=.{0,1000}myboschcam.net,O=Bosch Sicherheitssysteme">
1713
+ <description>Bosch AutoDome IP Camera</description>
1714
+ <example>CN=local.myboschcam.net,O=Bosch Sicherheitssysteme GmbH,L=Grasbrunn,ST=Bayern,C=DE</example>
1715
+ <param pos="0" name="hw.vendor" value="Bosch"/>
1716
+ <param pos="0" name="hw.device" value="Web Cam"/>
1717
+ <param pos="0" name="hw.product" value="AutoDome"/>
1718
+ <param pos="0" name="hw.certainty" value="0.50"/>
1719
+ </fingerprint>
1720
+
1721
+ <fingerprint pattern="(?i)CN=(\w+),OU=BWI,O=Redline Communications Inc">
1722
+ <description>Redline Communication Radios</description>
1723
+ <example hw.product="an80i">CN=an80i,OU=BWI,O=Redline Communications Inc.,C=CA</example>
1724
+ <param pos="0" name="hw.vendor" value="Redline"/>
1725
+ <param pos="0" name="hw.device" value="WAP"/>
1726
+ <param pos="1" name="hw.product"/>
1727
+ </fingerprint>
1728
+
1729
+ <fingerprint pattern="(?i)CN=Vaddio Device,O=Vaddio,L=Minnetonka,ST=MN,C=US">
1730
+ <description>Vadio DocCom</description>
1731
+ <example>CN=Vaddio Device,O=Vaddio,L=Minnetonka,ST=MN,C=US</example>
1732
+ <param pos="0" name="hw.vendor" value="Vaddio"/>
1733
+ <param pos="0" name="hw.device" value="Web Cam"/>
1734
+ <param pos="0" name="hw.product" value="DocCam"/>
1735
+ <param pos="0" name="hw.certainty" value="0.50"/>
1736
+ </fingerprint>
1737
+
1738
+ <fingerprint pattern="(?i)CN=.{0,1000},OU=2N IP Intercoms,O=2N Telekomunikace a.s.,L=Prague,ST=Czech Republic,C=CZ">
1739
+ <description>2N IP Intercoms</description>
1740
+ <example>CN=11111111111d,OU=2N IP Intercoms,O=2N Telekomunikace a.s.,L=Prague,ST=Czech Republic,C=CZ</example>
1741
+ <param pos="0" name="hw.vendor" value="2N Telekomunikace"/>
1742
+ <param pos="0" name="hw.device" value="IP Camera"/>
1743
+ <param pos="0" name="hw.certainty" value="0.50"/>
1744
+ </fingerprint>
1745
+
1746
+ <fingerprint pattern="^CN=(.{1,256}),OU=PVE Cluster Node,O=Proxmox Virtual Environment$">
1747
+ <description>Proxmox open-source virtualization platform</description>
1748
+ <example host.name="pve.example.org">CN=pve.example.org,OU=PVE Cluster Node,O=Proxmox Virtual Environment</example>
1749
+ <param pos="1" name="host.name"/>
1750
+ <param pos="0" name="service.vendor" value="Proxmox"/>
1751
+ <param pos="0" name="service.product" value="Virtual Environment"/>
1752
+ <param pos="0" name="service.cpe23" value="cpe:/a:proxmox:virtual_environment:-"/>
1753
+ <param pos="0" name="os.vendor" value="Proxmox"/>
1754
+ <param pos="0" name="os.family" value="Linux"/>
1755
+ <param pos="0" name="os.product" value="Proxmox"/>
1756
+ </fingerprint>
1757
+
1657
1758
  </fingerprints>
data/recog.gemspec CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
12
12
  s.email = [
13
13
  'research@rapid7.com'
14
14
  ]
15
- s.homepage = "https://www.github.com/rapid7/recog"
15
+ s.homepage = "https://www.github.com/rapid7/recog-ruby"
16
16
  s.summary = %q{Network service fingerprint database, classes, and utilities}
17
17
  s.description = %q{
18
18
  Recog is a framework for identifying products, services, operating systems, and hardware by matching
@@ -20,9 +20,14 @@ Gem::Specification.new do |s|
20
20
  information from web server banners, snmp system description fields, and a whole lot more.
21
21
  }.gsub(/\s+/, ' ').strip
22
22
 
23
- s.files = `git ls-files`.split("\n")
24
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
25
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
+ s.bindir = 'recog/bin'
24
+ s.files = %w(Gemfile Rakefile COPYING LICENSE README.md recog.gemspec .yardopts) +
25
+ Dir.glob('lib/**/*.rb') +
26
+ Dir.glob('spec/**/*') +
27
+ Dir.glob('recog/xml/*') +
28
+ Dir.glob('recog/bin/recog_match')
29
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
30
+ s.executables = s.files.grep(%r{^recog/bin/}).map{ |f| File.basename(f) }
26
31
  s.require_paths = ['lib']
27
32
 
28
33
  # ---- Dependencies ----
@@ -36,7 +41,6 @@ Gem::Specification.new do |s|
36
41
  # markdown formatting for yard
37
42
  s.add_development_dependency 'redcarpet'
38
43
  end
39
- s.add_development_dependency 'cucumber'
40
44
  s.add_development_dependency 'aruba'
41
45
  s.add_development_dependency 'simplecov'
42
46
 
@@ -0,0 +1 @@
1
+ HP LaserJet 4100 Series
@@ -0,0 +1 @@
1
+ HP LaserJet 2200
@@ -0,0 +1,8 @@
1
+ <fingerprints>
2
+ <fingerprint pattern="laserjet (.*)(?: series)?" flags="REG_ICASE">
3
+ <description>HP JetDirect Printer</description>
4
+ <example _filename="hp_printer_ex_01.txt"/>
5
+ <example _filename="hp_printer_ex_02.txt"/>
6
+ <param pos="0" name="service.vendor" value="HP"/>
7
+ </fingerprint>
8
+ </fingerprints>
@@ -0,0 +1,7 @@
1
+ <fingerprints>
2
+ <fingerprint pattern="laserjet (.*)(?: series)?" flags="REG_ICASE">
3
+ <description>HP JetDirect Printer</description>
4
+ <example _filename="../bad_path.txt"/>
5
+ <param pos="0" name="service.vendor" value="HP"/>
6
+ </fingerprint>
7
+ </fingerprints>
@@ -1,97 +1,120 @@
1
1
  require 'recog/db'
2
2
 
3
3
  describe Recog::DB do
4
- let(:xml_file) { File.expand_path File.join('spec', 'data', 'test_fingerprints.xml') }
5
- subject { Recog::DB.new(xml_file) }
6
4
 
7
5
  describe "#fingerprints" do
8
- subject(:fingerprints) { described_class.new(xml_file).fingerprints }
6
+ context "with inline example content" do
7
+ let(:xml_file) { File.expand_path File.join('spec', 'data', 'test_fingerprints.xml') }
8
+ subject { Recog::DB.new(xml_file) }
9
9
 
10
- it { is_expected.to be_a(Enumerable) }
10
+ subject(:fingerprints) { described_class.new(xml_file).fingerprints }
11
11
 
12
- context "with only a pattern" do
13
- subject(:entry) { described_class.new(xml_file).fingerprints[0] }
12
+ it { is_expected.to be_a(Enumerable) }
14
13
 
15
- it "has a blank name with no description" do
16
- expect(entry.name).to be_empty
17
- end
14
+ context "with only a pattern" do
15
+ subject(:entry) { described_class.new(xml_file).fingerprints[0] }
18
16
 
19
- it "has a pattern" do
20
- expect(entry.regex.source).to eq(".*\\(iSeries\\).*")
21
- end
17
+ it "has a blank name with no description" do
18
+ expect(entry.name).to be_empty
19
+ end
22
20
 
23
- it "has no params" do
24
- expect(entry.params).to be_empty
25
- end
21
+ it "has a pattern" do
22
+ expect(entry.regex.source).to eq(".*\\(iSeries\\).*")
23
+ end
24
+
25
+ it "has no params" do
26
+ expect(entry.params).to be_empty
27
+ end
26
28
 
27
- it "has no tests" do
28
- expect(entry.tests).to be_empty
29
+ it "has no tests" do
30
+ expect(entry.tests).to be_empty
31
+ end
29
32
  end
30
- end
31
33
 
32
- context "with params" do
33
- subject(:entry) { described_class.new(xml_file).fingerprints[1] }
34
+ context "with params" do
35
+ subject(:entry) { described_class.new(xml_file).fingerprints[1] }
34
36
 
35
- it "has a name" do
36
- expect(entry.name).to eq('PalmOS')
37
- end
37
+ it "has a name" do
38
+ expect(entry.name).to eq('PalmOS')
39
+ end
38
40
 
39
- it "has a pattern" do
40
- expect(entry.regex.source).to eq(".*\\(PalmOS\\).*")
41
- end
41
+ it "has a pattern" do
42
+ expect(entry.regex.source).to eq(".*\\(PalmOS\\).*")
43
+ end
42
44
 
43
- it "has params" do
44
- expect(entry.params).to eq({"os.vendor"=>[1, "Palm"], "os.device"=>[2, "General"]})
45
- end
45
+ it "has params" do
46
+ expect(entry.params).to eq({"os.vendor"=>[1, "Palm"], "os.device"=>[2, "General"]})
47
+ end
46
48
 
47
- it "has no tests" do
48
- expect(entry.tests).to be_empty
49
+ it "has no tests" do
50
+ expect(entry.tests).to be_empty
51
+ end
49
52
  end
50
- end
51
53
 
52
- context "with pattern flags" do
53
- subject(:entry) { described_class.new(xml_file).fingerprints[2] }
54
+ context "with pattern flags" do
55
+ subject(:entry) { described_class.new(xml_file).fingerprints[2] }
54
56
 
55
- it "has a name and only uses the first value" do
56
- expect(entry.name).to eq('HP Designjet printer')
57
- end
57
+ it "has a name and only uses the first value" do
58
+ expect(entry.name).to eq('HP Designjet printer')
59
+ end
58
60
 
59
- it 'creates a Regexp with expected flags' do
60
- expect(entry.regex).to be_a(Regexp)
61
- expect(entry.regex.options).to eq(Recog::Fingerprint::RegexpFactory::DEFAULT_FLAGS | Regexp::IGNORECASE)
62
- end
61
+ it 'creates a Regexp with expected flags' do
62
+ expect(entry.regex).to be_a(Regexp)
63
+ expect(entry.regex.options).to eq(Recog::Fingerprint::RegexpFactory::DEFAULT_FLAGS | Regexp::IGNORECASE)
64
+ end
63
65
 
64
- it "has a pattern" do
65
- expect(entry.regex).to be_a(Regexp)
66
- expect(entry.regex.source).to eq("(designjet \\S+)")
67
- end
66
+ it "has a pattern" do
67
+ expect(entry.regex).to be_a(Regexp)
68
+ expect(entry.regex.source).to eq("(designjet \\S+)")
69
+ end
70
+
71
+ it "has params" do
72
+ expect(entry.params).to eq({"service.vendor"=>[0, "HP"]})
73
+ end
68
74
 
69
- it "has params" do
70
- expect(entry.params).to eq({"service.vendor"=>[0, "HP"]})
75
+ it "has no tests" do
76
+ expect(entry.tests).to be_empty
77
+ end
71
78
  end
72
79
 
73
- it "has no tests" do
74
- expect(entry.tests).to be_empty
80
+ context "with test" do
81
+ subject(:entry) { described_class.new(xml_file).fingerprints[3] }
82
+
83
+ it "has a name" do
84
+ expect(entry.name).to eq('HP JetDirect Printer')
85
+ end
86
+
87
+ it "has a pattern" do
88
+ expect(entry.regex.source).to eq("laserjet (.*)(?: series)?")
89
+ end
90
+
91
+ it "has params" do
92
+ expect(entry.params).to eq({"service.vendor"=>[0, "HP"]})
93
+ end
94
+
95
+ it "has tests" do
96
+ expect(entry.tests.map(&:content)).to match_array(["HP LaserJet 4100 Series", "HP LaserJet 2200"])
97
+ end
75
98
  end
76
99
  end
77
100
 
78
- context "with test" do
79
- subject(:entry) { described_class.new(xml_file).fingerprints[3] }
101
+ context "with external example content" do
102
+ let(:xml_file) { File.expand_path File.join('spec', 'data', 'external_example_fingerprint.xml') }
103
+ subject { Recog::DB.new(xml_file) }
80
104
 
81
- it "has a name" do
82
- expect(entry.name).to eq('HP JetDirect Printer')
83
- end
105
+ subject(:entry) { described_class.new(xml_file).fingerprints[0] }
84
106
 
85
- it "has a pattern" do
86
- expect(entry.regex.source).to eq("laserjet (.*)(?: series)?")
107
+ it "has tests" do
108
+ expect(entry.tests.map(&:content)).to match_array(["HP LaserJet 4100 Series", "HP LaserJet 2200"])
87
109
  end
110
+ end
88
111
 
89
- it "has params" do
90
- expect(entry.params).to eq({"service.vendor"=>[0, "HP"]})
91
- end
112
+ context "with external example content illegal path" do
113
+ let(:xml_file) { File.expand_path File.join('spec', 'data', 'external_example_illegal_path_fingerprint.xml') }
114
+ subject { Recog::DB.new(xml_file) }
92
115
 
93
- it "has no tests" do
94
- expect(entry.tests.map(&:content)).to match_array(["HP LaserJet 4100 Series", "HP LaserJet 2200"])
116
+ it "raises an illegal file path error" do
117
+ expect { subject }.to raise_error(/an example specifies an illegal file path '.+'/)
95
118
  end
96
119
  end
97
120
  end