wg-metasploit_data_models 4.1.4.01 → 4.1.4.02

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 (440) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.github/workflows/verify.yml +68 -0
  4. data/.gitignore +29 -0
  5. data/.rspec +3 -0
  6. data/.simplecov +38 -0
  7. data/.yardopts +4 -0
  8. data/CHANGELOG.md +6 -0
  9. data/CONTRIBUTING.md +133 -0
  10. data/Gemfile +46 -0
  11. data/LICENSE +27 -0
  12. data/README.md +65 -0
  13. data/RELEASING.md +82 -0
  14. data/Rakefile +72 -0
  15. data/UPGRADING.md +1 -0
  16. data/app/models/mdm/api_key.rb +61 -0
  17. data/app/models/mdm/async_callback.rb +64 -0
  18. data/app/models/mdm/client.rb +50 -0
  19. data/app/models/mdm/cred.rb +205 -0
  20. data/app/models/mdm/event.rb +83 -0
  21. data/app/models/mdm/exploit_attempt.rb +105 -0
  22. data/app/models/mdm/exploited_host.rb +42 -0
  23. data/app/models/mdm/host.rb +619 -0
  24. data/app/models/mdm/host_detail.rb +62 -0
  25. data/app/models/mdm/host_tag.rb +49 -0
  26. data/app/models/mdm/listener.rb +82 -0
  27. data/app/models/mdm/loot.rb +161 -0
  28. data/app/models/mdm/macro.rb +62 -0
  29. data/app/models/mdm/mod_ref.rb +24 -0
  30. data/app/models/mdm/module/action.rb +33 -0
  31. data/app/models/mdm/module/arch.rb +28 -0
  32. data/app/models/mdm/module/author.rb +34 -0
  33. data/app/models/mdm/module/detail.rb +388 -0
  34. data/app/models/mdm/module/mixin.rb +31 -0
  35. data/app/models/mdm/module/platform.rb +29 -0
  36. data/app/models/mdm/module/ref.rb +42 -0
  37. data/app/models/mdm/module/target.rb +37 -0
  38. data/app/models/mdm/nexpose_console.rb +121 -0
  39. data/app/models/mdm/note.rb +125 -0
  40. data/app/models/mdm/payload.rb +103 -0
  41. data/app/models/mdm/profile.rb +45 -0
  42. data/app/models/mdm/ref.rb +48 -0
  43. data/app/models/mdm/route.rb +28 -0
  44. data/app/models/mdm/service.rb +267 -0
  45. data/app/models/mdm/session.rb +203 -0
  46. data/app/models/mdm/session_event.rb +44 -0
  47. data/app/models/mdm/tag.rb +114 -0
  48. data/app/models/mdm/task.rb +168 -0
  49. data/app/models/mdm/task_cred.rb +45 -0
  50. data/app/models/mdm/task_host.rb +41 -0
  51. data/app/models/mdm/task_service.rb +41 -0
  52. data/app/models/mdm/task_session.rb +41 -0
  53. data/app/models/mdm/user.rb +230 -0
  54. data/app/models/mdm/vuln.rb +204 -0
  55. data/app/models/mdm/vuln_attempt.rb +76 -0
  56. data/app/models/mdm/vuln_detail.rb +156 -0
  57. data/app/models/mdm/vuln_ref.rb +21 -0
  58. data/app/models/mdm/web_form.rb +53 -0
  59. data/app/models/mdm/web_page.rb +92 -0
  60. data/app/models/mdm/web_site.rb +113 -0
  61. data/app/models/mdm/web_vuln.rb +193 -0
  62. data/app/models/mdm/wmap_request.rb +101 -0
  63. data/app/models/mdm/wmap_target.rb +56 -0
  64. data/app/models/mdm/workspace.rb +286 -0
  65. data/app/models/metasploit_data_models/automatic_exploitation/match.rb +43 -0
  66. data/app/models/metasploit_data_models/automatic_exploitation/match_result.rb +71 -0
  67. data/app/models/metasploit_data_models/automatic_exploitation/match_set.rb +40 -0
  68. data/app/models/metasploit_data_models/automatic_exploitation/run.rb +29 -0
  69. data/app/models/metasploit_data_models/ip_address/v4/cidr.rb +14 -0
  70. data/app/models/metasploit_data_models/ip_address/v4/nmap.rb +14 -0
  71. data/app/models/metasploit_data_models/ip_address/v4/range.rb +12 -0
  72. data/app/models/metasploit_data_models/ip_address/v4/segment/nmap/list.rb +125 -0
  73. data/app/models/metasploit_data_models/ip_address/v4/segment/nmap/range.rb +12 -0
  74. data/app/models/metasploit_data_models/ip_address/v4/segment/single.rb +123 -0
  75. data/app/models/metasploit_data_models/ip_address/v4/segmented.rb +200 -0
  76. data/app/models/metasploit_data_models/ip_address/v4/single.rb +53 -0
  77. data/app/models/metasploit_data_models/module_run.rb +213 -0
  78. data/app/models/metasploit_data_models/search/operation/ip_address.rb +60 -0
  79. data/app/models/metasploit_data_models/search/operation/port/number.rb +25 -0
  80. data/app/models/metasploit_data_models/search/operation/port/range.rb +79 -0
  81. data/app/models/metasploit_data_models/search/operation/range.rb +56 -0
  82. data/app/models/metasploit_data_models/search/operator/ip_address.rb +33 -0
  83. data/app/models/metasploit_data_models/search/operator/multitext.rb +73 -0
  84. data/app/models/metasploit_data_models/search/operator/port/list.rb +67 -0
  85. data/app/models/metasploit_data_models/search/visitor/attribute.rb +17 -0
  86. data/app/models/metasploit_data_models/search/visitor/includes.rb +47 -0
  87. data/app/models/metasploit_data_models/search/visitor/joins.rb +67 -0
  88. data/app/models/metasploit_data_models/search/visitor/method.rb +16 -0
  89. data/app/models/metasploit_data_models/search/visitor/relation.rb +91 -0
  90. data/app/models/metasploit_data_models/search/visitor/where.rb +128 -0
  91. data/config/initializers/arel_helper.rb +5 -0
  92. data/config/initializers/ipaddr.rb +29 -0
  93. data/config/locales/en.yml +94 -0
  94. data/console_db.yml +9 -0
  95. data/db/migrate/000_create_tables.rb +79 -0
  96. data/db/migrate/001_add_wmap_tables.rb +35 -0
  97. data/db/migrate/002_add_workspaces.rb +36 -0
  98. data/db/migrate/003_move_notes.rb +20 -0
  99. data/db/migrate/004_add_events_table.rb +16 -0
  100. data/db/migrate/005_expand_info.rb +58 -0
  101. data/db/migrate/006_add_timestamps.rb +26 -0
  102. data/db/migrate/007_add_loots.rb +20 -0
  103. data/db/migrate/008_create_users.rb +16 -0
  104. data/db/migrate/009_add_loots_ctype.rb +10 -0
  105. data/db/migrate/010_add_alert_fields.rb +16 -0
  106. data/db/migrate/011_add_reports.rb +19 -0
  107. data/db/migrate/012_add_tasks.rb +24 -0
  108. data/db/migrate/013_add_tasks_result.rb +10 -0
  109. data/db/migrate/014_add_loots_fields.rb +12 -0
  110. data/db/migrate/015_rename_user.rb +16 -0
  111. data/db/migrate/016_add_host_purpose.rb +10 -0
  112. data/db/migrate/017_expand_info2.rb +58 -0
  113. data/db/migrate/018_add_workspace_user_info.rb +29 -0
  114. data/db/migrate/019_add_workspace_desc.rb +23 -0
  115. data/db/migrate/020_add_user_preferences.rb +11 -0
  116. data/db/migrate/021_standardize_info_and_data.rb +18 -0
  117. data/db/migrate/022_enlarge_event_info.rb +10 -0
  118. data/db/migrate/023_add_report_downloaded_at.rb +10 -0
  119. data/db/migrate/024_convert_service_info_to_text.rb +12 -0
  120. data/db/migrate/025_add_user_admin.rb +19 -0
  121. data/db/migrate/026_add_creds_table.rb +19 -0
  122. data/db/migrate/20100819123300_migrate_cred_data.rb +154 -0
  123. data/db/migrate/20100824151500_add_exploited_table.rb +16 -0
  124. data/db/migrate/20100908001428_add_owner_to_workspaces.rb +9 -0
  125. data/db/migrate/20100911122000_add_report_templates.rb +18 -0
  126. data/db/migrate/20100916151530_require_admin_flag.rb +15 -0
  127. data/db/migrate/20100916175000_add_campaigns_and_templates.rb +61 -0
  128. data/db/migrate/20100920012100_add_generate_exe_column.rb +8 -0
  129. data/db/migrate/20100926214000_add_template_prefs.rb +11 -0
  130. data/db/migrate/20101001000000_add_web_tables.rb +57 -0
  131. data/db/migrate/20101002000000_add_query.rb +10 -0
  132. data/db/migrate/20101007000000_add_vuln_info.rb +15 -0
  133. data/db/migrate/20101008111800_add_clients_to_campaigns.rb +10 -0
  134. data/db/migrate/20101009023300_add_campaign_attachments.rb +15 -0
  135. data/db/migrate/20101104135100_add_imported_creds.rb +17 -0
  136. data/db/migrate/20101203000000_fix_web_tables.rb +34 -0
  137. data/db/migrate/20101203000001_expand_host_comment.rb +12 -0
  138. data/db/migrate/20101206212033_add_limit_to_network_to_workspaces.rb +9 -0
  139. data/db/migrate/20110112154300_add_module_uuid_to_tasks.rb +9 -0
  140. data/db/migrate/20110204112800_add_host_tags.rb +28 -0
  141. data/db/migrate/20110317144932_add_session_table.rb +110 -0
  142. data/db/migrate/20110414180600_add_local_id_to_session_table.rb +11 -0
  143. data/db/migrate/20110415175705_add_routes_table.rb +18 -0
  144. data/db/migrate/20110422000000_convert_binary.rb +73 -0
  145. data/db/migrate/20110425095900_add_last_seen_to_sessions.rb +8 -0
  146. data/db/migrate/20110513143900_track_successful_exploits.rb +31 -0
  147. data/db/migrate/20110517160800_rename_and_prune_nessus_vulns.rb +26 -0
  148. data/db/migrate/20110527000000_add_task_id_to_reports_table.rb +11 -0
  149. data/db/migrate/20110527000001_add_api_keys_table.rb +12 -0
  150. data/db/migrate/20110606000001_add_macros_table.rb +16 -0
  151. data/db/migrate/20110622000000_add_settings_to_tasks_table.rb +12 -0
  152. data/db/migrate/20110624000001_add_listeners_table.rb +19 -0
  153. data/db/migrate/20110625000001_add_macro_to_listeners_table.rb +12 -0
  154. data/db/migrate/20110630000001_add_nexpose_consoles_table.rb +21 -0
  155. data/db/migrate/20110630000002_add_name_to_nexpose_consoles_table.rb +12 -0
  156. data/db/migrate/20110717000001_add_profiles_table.rb +15 -0
  157. data/db/migrate/20110727163801_expand_cred_ptype_column.rb +9 -0
  158. data/db/migrate/20110730000001_add_initial_indexes.rb +85 -0
  159. data/db/migrate/20110812000001_prune_indexes.rb +23 -0
  160. data/db/migrate/20110922000000_expand_notes.rb +9 -0
  161. data/db/migrate/20110928101300_add_mod_ref_table.rb +17 -0
  162. data/db/migrate/20111011110000_add_display_name_to_reports_table.rb +24 -0
  163. data/db/migrate/20111203000000_inet_columns.rb +13 -0
  164. data/db/migrate/20111204000000_more_inet_columns.rb +17 -0
  165. data/db/migrate/20111210000000_add_scope_to_hosts.rb +9 -0
  166. data/db/migrate/20120126110000_add_virtual_host_to_hosts.rb +9 -0
  167. data/db/migrate/20120411173220_rename_workspace_members.rb +9 -0
  168. data/db/migrate/20120601152442_add_counter_caches_to_hosts.rb +21 -0
  169. data/db/migrate/20120625000000_add_vuln_details.rb +34 -0
  170. data/db/migrate/20120625000001_add_host_details.rb +16 -0
  171. data/db/migrate/20120625000002_expand_details.rb +16 -0
  172. data/db/migrate/20120625000003_expand_details2.rb +24 -0
  173. data/db/migrate/20120625000004_add_vuln_attempts.rb +19 -0
  174. data/db/migrate/20120625000005_add_vuln_and_host_counter_caches.rb +14 -0
  175. data/db/migrate/20120625000006_add_module_details.rb +118 -0
  176. data/db/migrate/20120625000007_add_exploit_attempts.rb +26 -0
  177. data/db/migrate/20120625000008_add_fail_message.rb +12 -0
  178. data/db/migrate/20120718202805_add_owner_and_payload_to_web_vulns.rb +13 -0
  179. data/db/migrate/20130228214900_change_required_columns_to_null_false_in_web_vulns.rb +19 -0
  180. data/db/migrate/20130412154159_change_foreign_key_in_module_actions.rb +25 -0
  181. data/db/migrate/20130412171844_change_foreign_key_in_module_archs.rb +25 -0
  182. data/db/migrate/20130412173121_change_foreign_key_in_module_authors.rb +25 -0
  183. data/db/migrate/20130412173640_change_foreign_key_in_module_mixins.rb +25 -0
  184. data/db/migrate/20130412174254_change_foreign_key_in_module_platforms.rb +25 -0
  185. data/db/migrate/20130412174719_change_foreign_key_in_module_refs.rb +25 -0
  186. data/db/migrate/20130412175040_change_foreign_key_in_module_targets.rb +25 -0
  187. data/db/migrate/20130423211152_add_creds_counter_cache.rb +24 -0
  188. data/db/migrate/20130430151353_change_required_columns_to_null_false_in_hosts.rb +11 -0
  189. data/db/migrate/20130430162145_enforce_address_uniqueness_in_workspace_in_hosts.rb +101 -0
  190. data/db/migrate/20130510021637_remove_campaigns.rb +11 -0
  191. data/db/migrate/20130515164311_change_web_vulns_confidence_to_integer.rb +48 -0
  192. data/db/migrate/20130515172727_valid_mdm_web_vuln_params.rb +30 -0
  193. data/db/migrate/20130516204810_making_vulns_refs_a_real_ar_model.rb +5 -0
  194. data/db/migrate/20130522001343_create_task_creds.rb +9 -0
  195. data/db/migrate/20130522032517_create_task_hosts.rb +9 -0
  196. data/db/migrate/20130522041110_create_task_services.rb +9 -0
  197. data/db/migrate/20130525015035_remove_campaign_id_from_clients.rb +9 -0
  198. data/db/migrate/20130525212420_drop_table_imported_creds.rb +14 -0
  199. data/db/migrate/20130531144949_making_host_tags_a_real_ar_model.rb +6 -0
  200. data/db/migrate/20130604145732_create_task_sessions.rb +9 -0
  201. data/db/migrate/20130717150737_remove_pname_validation.rb +7 -0
  202. data/db/migrate/20131002004641_create_automatic_exploitation_matches.rb +13 -0
  203. data/db/migrate/20131002164449_create_automatic_exploitation_match_sets.rb +12 -0
  204. data/db/migrate/20131008213344_create_automatic_exploitation_runs.rb +11 -0
  205. data/db/migrate/20131011184338_module_detail_on_automatic_exploitation_match.rb +10 -0
  206. data/db/migrate/20131017150735_create_automatic_exploitation_match_results.rb +11 -0
  207. data/db/migrate/20131021185657_make_match_polymorphic.rb +11 -0
  208. data/db/migrate/20140905031549_add_detected_arch_to_host.rb +5 -0
  209. data/db/migrate/20150112203945_remove_duplicate_services.rb +17 -0
  210. data/db/migrate/20150205192745_drop_service_uniqueness_index.rb +5 -0
  211. data/db/migrate/20150209195939_add_vuln_id_to_note.rb +6 -0
  212. data/db/migrate/20150212214222_remove_duplicate_services2.rb +17 -0
  213. data/db/migrate/20150219173821_create_module_runs.rb +23 -0
  214. data/db/migrate/20150219215039_add_module_run_to_session.rb +8 -0
  215. data/db/migrate/20150226151459_add_module_run_fk_to_loot.rb +8 -0
  216. data/db/migrate/20150312155312_add_module_full_name_to_match.rb +6 -0
  217. data/db/migrate/20150317145455_rename_module_indices.rb +29 -0
  218. data/db/migrate/20150326183742_add_missing_ae_indices.rb +13 -0
  219. data/db/migrate/20150421211719_rename_automatic_exploitation_index.rb +16 -0
  220. data/db/migrate/20150514182921_add_origin_to_mdm_vuln.rb +13 -0
  221. data/db/migrate/20160415153312_remove_not_null_from_web_vuln_p_arams.rb +5 -0
  222. data/db/migrate/20161004165612_add_fingerprinted_to_workspace.rb +5 -0
  223. data/db/migrate/20161227212223_add_os_family_to_hosts.rb +5 -0
  224. data/db/migrate/20180904120211_create_payloads.rb +21 -0
  225. data/db/migrate/20190308134512_create_async_callbacks.rb +13 -0
  226. data/db/migrate/20190507120211_remove_payload_workspaces.rb +5 -0
  227. data/lib/mdm/host/operating_system_normalization.rb +942 -0
  228. data/lib/mdm/module.rb +13 -0
  229. data/lib/mdm.rb +57 -0
  230. data/lib/metasploit_data_models/automatic_exploitation.rb +25 -0
  231. data/lib/metasploit_data_models/base64_serializer.rb +99 -0
  232. data/lib/metasploit_data_models/change_required_columns_to_null_false.rb +21 -0
  233. data/lib/metasploit_data_models/engine.rb +32 -0
  234. data/lib/metasploit_data_models/ip_address/cidr.rb +174 -0
  235. data/lib/metasploit_data_models/ip_address/range.rb +181 -0
  236. data/lib/metasploit_data_models/ip_address/v4/segment/nmap.rb +7 -0
  237. data/lib/metasploit_data_models/ip_address/v4/segment.rb +7 -0
  238. data/lib/metasploit_data_models/ip_address/v4.rb +11 -0
  239. data/lib/metasploit_data_models/ip_address.rb +9 -0
  240. data/lib/metasploit_data_models/match/child.rb +48 -0
  241. data/lib/metasploit_data_models/match/parent.rb +103 -0
  242. data/lib/metasploit_data_models/match.rb +8 -0
  243. data/lib/metasploit_data_models/search/operation/port.rb +9 -0
  244. data/lib/metasploit_data_models/search/operation.rb +9 -0
  245. data/lib/metasploit_data_models/search/operator/port.rb +6 -0
  246. data/lib/metasploit_data_models/search/operator.rb +8 -0
  247. data/lib/metasploit_data_models/search/visitor.rb +11 -0
  248. data/lib/metasploit_data_models/search.rb +8 -0
  249. data/lib/metasploit_data_models/serialized_prefs.rb +27 -0
  250. data/lib/metasploit_data_models/version.rb +13 -0
  251. data/lib/metasploit_data_models.rb +56 -0
  252. data/metasploit_data_models.gemspec +65 -0
  253. data/script/rails +8 -0
  254. data/spec/app/models/mdm/api_key_spec.rb +3 -0
  255. data/spec/app/models/mdm/client_spec.rb +43 -0
  256. data/spec/app/models/mdm/cred_spec.rb +346 -0
  257. data/spec/app/models/mdm/event_spec.rb +90 -0
  258. data/spec/app/models/mdm/exploit_attempt_spec.rb +59 -0
  259. data/spec/app/models/mdm/exploited_host_spec.rb +44 -0
  260. data/spec/app/models/mdm/host_detail_spec.rb +48 -0
  261. data/spec/app/models/mdm/host_spec.rb +1139 -0
  262. data/spec/app/models/mdm/host_tag_spec.rb +69 -0
  263. data/spec/app/models/mdm/listener_spec.rb +107 -0
  264. data/spec/app/models/mdm/loot_spec.rb +84 -0
  265. data/spec/app/models/mdm/macro_spec.rb +3 -0
  266. data/spec/app/models/mdm/mod_ref_spec.rb +3 -0
  267. data/spec/app/models/mdm/module/action_spec.rb +34 -0
  268. data/spec/app/models/mdm/module/arch_spec.rb +34 -0
  269. data/spec/app/models/mdm/module/author_spec.rb +52 -0
  270. data/spec/app/models/mdm/module/detail_spec.rb +746 -0
  271. data/spec/app/models/mdm/module/mixin_spec.rb +34 -0
  272. data/spec/app/models/mdm/module/platform_spec.rb +34 -0
  273. data/spec/app/models/mdm/module/ref_spec.rb +58 -0
  274. data/spec/app/models/mdm/module/target_spec.rb +36 -0
  275. data/spec/app/models/mdm/nexpose_console_spec.rb +146 -0
  276. data/spec/app/models/mdm/note_spec.rb +91 -0
  277. data/spec/app/models/mdm/profile_spec.rb +3 -0
  278. data/spec/app/models/mdm/ref_spec.rb +71 -0
  279. data/spec/app/models/mdm/route_spec.rb +35 -0
  280. data/spec/app/models/mdm/service_spec.rb +232 -0
  281. data/spec/app/models/mdm/session_event_spec.rb +42 -0
  282. data/spec/app/models/mdm/session_spec.rb +118 -0
  283. data/spec/app/models/mdm/tag_spec.rb +116 -0
  284. data/spec/app/models/mdm/task_cred_spec.rb +51 -0
  285. data/spec/app/models/mdm/task_host_spec.rb +50 -0
  286. data/spec/app/models/mdm/task_service_spec.rb +50 -0
  287. data/spec/app/models/mdm/task_session_spec.rb +46 -0
  288. data/spec/app/models/mdm/task_spec.rb +71 -0
  289. data/spec/app/models/mdm/user_spec.rb +50 -0
  290. data/spec/app/models/mdm/vuln_attempt_spec.rb +53 -0
  291. data/spec/app/models/mdm/vuln_detail_spec.rb +65 -0
  292. data/spec/app/models/mdm/vuln_ref_spec.rb +46 -0
  293. data/spec/app/models/mdm/vuln_spec.rb +299 -0
  294. data/spec/app/models/mdm/web_form_spec.rb +46 -0
  295. data/spec/app/models/mdm/web_page_spec.rb +101 -0
  296. data/spec/app/models/mdm/web_site_spec.rb +85 -0
  297. data/spec/app/models/mdm/web_vuln_spec.rb +312 -0
  298. data/spec/app/models/mdm/wmap_request_spec.rb +5 -0
  299. data/spec/app/models/mdm/wmap_target_spec.rb +5 -0
  300. data/spec/app/models/mdm/workspace_spec.rb +500 -0
  301. data/spec/app/models/metasploit_data_models/automatic_exploitation/match_result_spec.rb +86 -0
  302. data/spec/app/models/metasploit_data_models/automatic_exploitation/match_set_spec.rb +46 -0
  303. data/spec/app/models/metasploit_data_models/automatic_exploitation/match_spec.rb +37 -0
  304. data/spec/app/models/metasploit_data_models/automatic_exploitation/run_spec.rb +38 -0
  305. data/spec/app/models/metasploit_data_models/ip_address/v4/cidr_spec.rb +119 -0
  306. data/spec/app/models/metasploit_data_models/ip_address/v4/nmap_spec.rb +149 -0
  307. data/spec/app/models/metasploit_data_models/ip_address/v4/range_spec.rb +298 -0
  308. data/spec/app/models/metasploit_data_models/ip_address/v4/segment/nmap/list_spec.rb +276 -0
  309. data/spec/app/models/metasploit_data_models/ip_address/v4/segment/nmap/range_spec.rb +302 -0
  310. data/spec/app/models/metasploit_data_models/ip_address/v4/segment/segmented_spec.rb +27 -0
  311. data/spec/app/models/metasploit_data_models/ip_address/v4/segment/single_spec.rb +324 -0
  312. data/spec/app/models/metasploit_data_models/ip_address/v4/single_spec.rb +181 -0
  313. data/spec/app/models/metasploit_data_models/module_run_spec.rb +134 -0
  314. data/spec/app/models/metasploit_data_models/search/operation/ip_address_spec.rb +180 -0
  315. data/spec/app/models/metasploit_data_models/search/operation/port/number_spec.rb +39 -0
  316. data/spec/app/models/metasploit_data_models/search/operation/port/range_spec.rb +138 -0
  317. data/spec/app/models/metasploit_data_models/search/operation/range_spec.rb +233 -0
  318. data/spec/app/models/metasploit_data_models/search/operator/ip_address_spec.rb +17 -0
  319. data/spec/app/models/metasploit_data_models/search/operator/multitext_spec.rb +160 -0
  320. data/spec/app/models/metasploit_data_models/search/operator/port/list_spec.rb +162 -0
  321. data/spec/app/models/metasploit_data_models/search/visitor/attribute_spec.rb +96 -0
  322. data/spec/app/models/metasploit_data_models/search/visitor/includes_spec.rb +175 -0
  323. data/spec/app/models/metasploit_data_models/search/visitor/joins_spec.rb +396 -0
  324. data/spec/app/models/metasploit_data_models/search/visitor/method_spec.rb +49 -0
  325. data/spec/app/models/metasploit_data_models/search/visitor/relation_spec.rb +925 -0
  326. data/spec/app/models/metasploit_data_models/search/visitor/where_spec.rb +187 -0
  327. data/spec/dummy/Rakefile +7 -0
  328. data/spec/dummy/app/assets/config/manifest.js +1 -0
  329. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  330. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  331. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  332. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  333. data/spec/dummy/app/mailers/.gitkeep +0 -0
  334. data/spec/dummy/app/models/.gitkeep +0 -0
  335. data/spec/dummy/app/models/application_record.rb +3 -0
  336. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  337. data/spec/dummy/bin/bundle +3 -0
  338. data/spec/dummy/bin/rails +4 -0
  339. data/spec/dummy/bin/rake +4 -0
  340. data/spec/dummy/config/application.rb +61 -0
  341. data/spec/dummy/config/boot.rb +4 -0
  342. data/spec/dummy/config/database.yml.example +22 -0
  343. data/spec/dummy/config/database.yml.github_actions +21 -0
  344. data/spec/dummy/config/environment.rb +5 -0
  345. data/spec/dummy/config/environments/development.rb +37 -0
  346. data/spec/dummy/config/environments/production.rb +78 -0
  347. data/spec/dummy/config/environments/test.rb +39 -0
  348. data/spec/dummy/config/initializers/active_record_migrations.rb +4 -0
  349. data/spec/dummy/config/initializers/assets.rb +8 -0
  350. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  351. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  352. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  353. data/spec/dummy/config/initializers/inflections.rb +16 -0
  354. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  355. data/spec/dummy/config/initializers/session_store.rb +3 -0
  356. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  357. data/spec/dummy/config/locales/en.yml +23 -0
  358. data/spec/dummy/config/routes.rb +2 -0
  359. data/spec/dummy/config.ru +4 -0
  360. data/spec/dummy/db/structure.sql +3430 -0
  361. data/spec/dummy/db/structure.sql.from_rails_3 +3403 -0
  362. data/spec/dummy/lib/assets/.gitkeep +0 -0
  363. data/spec/dummy/log/.gitkeep +0 -0
  364. data/spec/dummy/public/404.html +26 -0
  365. data/spec/dummy/public/422.html +26 -0
  366. data/spec/dummy/public/500.html +25 -0
  367. data/spec/dummy/public/favicon.ico +0 -0
  368. data/spec/dummy/script/rails +6 -0
  369. data/spec/factories/mdm/addresses.rb +12 -0
  370. data/spec/factories/mdm/clients.rb +8 -0
  371. data/spec/factories/mdm/creds.rb +17 -0
  372. data/spec/factories/mdm/events.rb +15 -0
  373. data/spec/factories/mdm/exploit_attempts.rb +8 -0
  374. data/spec/factories/mdm/exploited_hosts.rb +7 -0
  375. data/spec/factories/mdm/fingerprints/nessus_fingerprints.rb +6 -0
  376. data/spec/factories/mdm/fingerprints/nexpose_fingerprints.rb +6 -0
  377. data/spec/factories/mdm/fingerprints/nmap_fingerprints.rb +6 -0
  378. data/spec/factories/mdm/fingerprints/retina_fingerprints.rb +6 -0
  379. data/spec/factories/mdm/fingerprints/session_fingerprints.rb +6 -0
  380. data/spec/factories/mdm/host_details.rb +8 -0
  381. data/spec/factories/mdm/host_tags.rb +9 -0
  382. data/spec/factories/mdm/hosts.rb +85 -0
  383. data/spec/factories/mdm/listeners.rb +12 -0
  384. data/spec/factories/mdm/loots.rb +11 -0
  385. data/spec/factories/mdm/module/actions.rb +14 -0
  386. data/spec/factories/mdm/module/archs.rb +14 -0
  387. data/spec/factories/mdm/module/authors.rb +22 -0
  388. data/spec/factories/mdm/module/details.rb +73 -0
  389. data/spec/factories/mdm/module/mixins.rb +14 -0
  390. data/spec/factories/mdm/module/platforms.rb +14 -0
  391. data/spec/factories/mdm/module/refs.rb +14 -0
  392. data/spec/factories/mdm/module/targets.rb +19 -0
  393. data/spec/factories/mdm/nexpose_consoles.rb +15 -0
  394. data/spec/factories/mdm/notes.rb +12 -0
  395. data/spec/factories/mdm/refs.rb +9 -0
  396. data/spec/factories/mdm/routes.rb +36 -0
  397. data/spec/factories/mdm/services.rb +41 -0
  398. data/spec/factories/mdm/session_events.rb +8 -0
  399. data/spec/factories/mdm/sessions.rb +13 -0
  400. data/spec/factories/mdm/tags.rb +14 -0
  401. data/spec/factories/mdm/task.rb +16 -0
  402. data/spec/factories/mdm/task_creds.rb +9 -0
  403. data/spec/factories/mdm/task_hosts.rb +9 -0
  404. data/spec/factories/mdm/task_services.rb +8 -0
  405. data/spec/factories/mdm/task_sessions.rb +8 -0
  406. data/spec/factories/mdm/users.rb +22 -0
  407. data/spec/factories/mdm/vuln_attempts.rb +8 -0
  408. data/spec/factories/mdm/vuln_details.rb +8 -0
  409. data/spec/factories/mdm/vuln_refs.rb +4 -0
  410. data/spec/factories/mdm/vulns.rb +20 -0
  411. data/spec/factories/mdm/web_forms.rb +33 -0
  412. data/spec/factories/mdm/web_pages.rb +64 -0
  413. data/spec/factories/mdm/web_sites.rb +8 -0
  414. data/spec/factories/mdm/web_vulns.rb +64 -0
  415. data/spec/factories/mdm/workspaces.rb +23 -0
  416. data/spec/factories/metasploit_data_models/automatic_exploitation/match_results.rb +7 -0
  417. data/spec/factories/metasploit_data_models/automatic_exploitation/match_sets.rb +8 -0
  418. data/spec/factories/metasploit_data_models/automatic_exploitation/matches.rb +7 -0
  419. data/spec/factories/metasploit_data_models/automatic_exploitation/runs.rb +6 -0
  420. data/spec/factories/module_runs.rb +40 -0
  421. data/spec/lib/base64_serializer_spec.rb +172 -0
  422. data/spec/lib/ipaddr_spec.rb +29 -0
  423. data/spec/lib/metasploit_data_models/ip_address/cidr_spec.rb +356 -0
  424. data/spec/lib/metasploit_data_models/ip_address/range_spec.rb +75 -0
  425. data/spec/lib/metasploit_data_models/match/child_spec.rb +59 -0
  426. data/spec/lib/metasploit_data_models/match/parent_spec.rb +153 -0
  427. data/spec/lib/metasploit_data_models_spec.rb +13 -0
  428. data/spec/spec_helper.rb +148 -0
  429. data/spec/support/matchers/match_regex_exactly.rb +28 -0
  430. data/spec/support/shared/contexts/rex/text.rb +15 -0
  431. data/spec/support/shared/examples/coerces_inet_column_type_to_string.rb +15 -0
  432. data/spec/support/shared/examples/mdm/module/detail/does_not_support_stance_with_mtype.rb +20 -0
  433. data/spec/support/shared/examples/mdm/module/detail/supports_stance_with_mtype.rb +36 -0
  434. data/spec/support/shared/examples/metasploit_data_models/search/operation/ipaddress/match.rb +109 -0
  435. data/spec/support/shared/examples/metasploit_data_models/search/visitor/includes/visit/with_children.rb +38 -0
  436. data/spec/support/shared/examples/metasploit_data_models/search/visitor/includes/visit/with_metasploit_model_search_operation_base.rb +26 -0
  437. data/spec/support/shared/examples/metasploit_data_models/search/visitor/relation/visit/matching_record.rb +50 -0
  438. data/spec/support/shared/examples/metasploit_data_models/search/visitor/where/visit/with_equality.rb +34 -0
  439. data/spec/support/shared/examples/metasploit_data_models/search/visitor/where/visit/with_metasploit_model_search_group_base.rb +51 -0
  440. metadata +444 -6
@@ -0,0 +1,148 @@
1
+ # Configure Rails Environment
2
+ ENV['RAILS_ENV'] = 'test'
3
+
4
+ require 'rubygems'
5
+ require 'bundler'
6
+ Bundler.setup(:default, :test)
7
+
8
+ # Require simplecov before loading ..dummy/config/environment.rb because it will cause metasploit_data_models/lib to
9
+ # be loaded, which would result in Coverage not recording hits for any of the files.
10
+ require 'simplecov'
11
+ require 'coveralls'
12
+
13
+ # if ENV['TRAVIS'] == 'true'
14
+ # # don't generate local report as it is inaccessible on travis-ci, which is why coveralls is being used.
15
+ # SimpleCov.formatter = Coveralls::SimpleCov::Formatter
16
+ # else
17
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
18
+ # either generate the local report
19
+ SimpleCov::Formatter::HTMLFormatter
20
+ ])
21
+ # end
22
+
23
+ require File.expand_path('../dummy/config/environment.rb', __FILE__)
24
+ require 'rspec/rails'
25
+
26
+ # full backtrace in logs so its easier to trace errors
27
+ Rails.backtrace_cleaner.remove_silencers!
28
+
29
+ # Requires supporting ruby files with custom matchers and macros, etc,
30
+ # in spec/support/ and its subdirectories.
31
+
32
+ Dir["./spec/support/**/*.rb"].sort.each { |f| require f}
33
+
34
+ roots = [
35
+ Metasploit::Concern::Engine.root,
36
+ Metasploit::Model::Engine.root,
37
+ MetasploitDataModels::Engine.root
38
+ ]
39
+
40
+ roots.each do |root|
41
+ support_glob = File.join(root, 'spec', 'support', '**', '*.rb')
42
+
43
+ Dir.glob(support_glob) do |path|
44
+ require path
45
+ end
46
+ end
47
+
48
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
49
+ RSpec.configure do |config|
50
+ # rspec-expectations config goes here. You can use an alternate
51
+ # assertion/expectation library such as wrong or the stdlib/minitest
52
+ # assertions if you prefer.
53
+ config.expect_with :rspec do |expectations|
54
+ # This option will default to `true` in RSpec 4. It makes the `description`
55
+ # and `failure_message` of custom matchers include text for helper methods
56
+ # defined using `chain`, e.g.:
57
+ # be_bigger_than(2).and_smaller_than(4).description
58
+ # # => "be bigger than 2 and smaller than 4"
59
+ # ...rather than:
60
+ # # => "be bigger than 2"
61
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
62
+ end
63
+
64
+ # rspec-mocks config goes here. You can use an alternate test double
65
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
66
+ config.mock_with :rspec do |mocks|
67
+ # Prevents you from mocking or stubbing a method that does not exist on
68
+ # a real object. This is generally recommended, and will default to
69
+ # `true` in RSpec 4.
70
+ mocks.verify_partial_doubles = true
71
+ end
72
+
73
+ # These two settings work together to allow you to limit a spec run
74
+ # to individual examples or groups you care about by tagging them with
75
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
76
+ # get run.
77
+ config.filter_run :focus
78
+ config.run_all_when_everything_filtered = true
79
+
80
+ # Limits the available syntax to the non-monkey patched syntax that is
81
+ # recommended. For more details, see:
82
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
83
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
84
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
85
+ config.disable_monkey_patching!
86
+
87
+ # This setting enables warnings. It's recommended, but in some cases may
88
+ # be too noisy due to issues in dependencies.
89
+ config.warnings = true
90
+
91
+ # Many RSpec users commonly either run the entire suite or an individual
92
+ # file, and it's useful to allow more verbose output when running an
93
+ # individual spec file.
94
+ if config.files_to_run.one?
95
+ # Use the documentation formatter for detailed output,
96
+ # unless a formatter has already been configured
97
+ # (e.g. via a command-line flag).
98
+ config.default_formatter = 'doc'
99
+ end
100
+
101
+ # Print the 10 slowest examples and example groups at the
102
+ # end of the spec run, to help surface which specs are running
103
+ # particularly slow.
104
+ config.profile_examples = 10
105
+
106
+ # Run specs in random order to surface order dependencies. If you find an
107
+ # order dependency and want to debug it, you can fix the order by providing
108
+ # the seed, which is printed after each run.
109
+ # --seed 1234
110
+ config.order = :random
111
+
112
+ # Seed global randomization in this process using the `--seed` CLI option.
113
+ # Setting this allows you to use `--seed` to deterministically reproduce
114
+ # test failures related to randomization by passing the same `--seed` value
115
+ # as the one that triggered the failure.
116
+ Kernel.srand config.seed
117
+
118
+ config.use_transactional_fixtures = true
119
+
120
+ # rspec-rails 3 will no longer automatically infer an example group's spec type
121
+ # from the file location. You can explicitly opt-in to the feature using this
122
+ # config option.
123
+ # To explicitly tag specs without using automatic inference, set the `:type`
124
+ # metadata manually:
125
+ #
126
+ # describe ThingsController, :type => :controller do
127
+ # # Equivalent to being in spec/controllers
128
+ # end
129
+ config.infer_spec_type_from_file_location!
130
+
131
+ # Setting this config option `false` removes rspec-core's monkey patching of the
132
+ # top level methods like `describe`, `shared_examples_for` and `shared_context`
133
+ # on `main` and `Module`. The methods are always available through the `RSpec`
134
+ # module like `RSpec.describe` regardless of this setting.
135
+ # For backwards compatibility this defaults to `true`.
136
+ #
137
+ # https://relishapp.com/rspec/rspec-core/v/3-0/docs/configuration/global-namespace-dsl
138
+ config.expose_dsl_globally = false
139
+ end
140
+
141
+ Shoulda::Matchers.configure do |config|
142
+ config.integrate do |with|
143
+ with.library :active_record
144
+ with.library :active_model
145
+
146
+ with.test_framework :rspec
147
+ end
148
+ end
@@ -0,0 +1,28 @@
1
+ # Checks that the string matches the
2
+ RSpec::Matchers.define :match_string_exactly do |string|
3
+ failure_message do |regexp|
4
+ match = regexp.match(string)
5
+
6
+ failure_message = "expected #{regexp} to match #{string}"
7
+
8
+ if match
9
+ failure_message << ', but'
10
+
11
+ unless match.pre_match.empty?
12
+ failure_message << " pre-match is #{match.pre_match}"
13
+ end
14
+
15
+ unless match.post_match.empty?
16
+ failure_message << " post-match is #{match.post_match}"
17
+ end
18
+ end
19
+
20
+ failure_message
21
+ end
22
+
23
+ match do |regexp|
24
+ match = regexp.match(string)
25
+
26
+ match && match.pre_match.empty? && match.post_match.empty?
27
+ end
28
+ end
@@ -0,0 +1,15 @@
1
+ RSpec.shared_context 'Rex::Text' do
2
+ before(:example) do
3
+ rex_text = Module.new do
4
+ def self.ascii_safe_hex(str, whitespace=false)
5
+ if whitespace
6
+ str.gsub(/([\x00-\x20\x80-\xFF])/n){ |x| "\\x%.2x" % x.unpack("C*")[0] }
7
+ else
8
+ str.gsub(/([\x00-\x08\x0b\x0c\x0e-\x1f\x80-\xFF])/n){ |x| "\\x%.2x" % x.unpack("C*")[0]}
9
+ end
10
+ end
11
+ end
12
+
13
+ stub_const('Rex::Text', rex_text)
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ RSpec.shared_examples_for 'coerces inet column type to string' do |column|
2
+ raise ArgumentError, 'must pass the column name' unless column
3
+
4
+ context 'with an inet column' do
5
+ let(:address) { '10.0.0.1' }
6
+
7
+ before(:example) do
8
+ subject.update_attribute column, address
9
+ end
10
+
11
+ it 'should cast the column as a string when fetching from the database' do
12
+ expect(subject.send(column)).to eq(address)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,20 @@
1
+ RSpec.shared_examples_for 'Mdm::Module::Detail does not support stance with mtype' do |mtype|
2
+ context "with #{mtype.inspect}" do
3
+ # define as a let so that lets from outer context can access option to set detail.
4
+ let(:mtype) do
5
+ mtype
6
+ end
7
+
8
+ it 'should return false for supports_stance?' do
9
+ expect(detail.supports_stance?).to eq(false)
10
+ end
11
+
12
+ context 'with nil stance' do
13
+ let(:stance) do
14
+ nil
15
+ end
16
+
17
+ it { is_expected.to be_valid }
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,36 @@
1
+ RSpec.shared_examples_for 'Mdm::Module::Detail supports stance with mtype' do |mtype|
2
+ context "with #{mtype.inspect}" do
3
+ # define as a let so that lets from outer context can access option to set detail.
4
+ let(:mtype) do
5
+ mtype
6
+ end
7
+
8
+ it 'should return true for supports_stance?' do
9
+ expect(detail.supports_stance?).to eq(true)
10
+ end
11
+
12
+ context 'with nil stance' do
13
+ let(:stance) do
14
+ nil
15
+ end
16
+
17
+ it { is_expected.to be_invalid }
18
+ end
19
+
20
+ context "with 'aggresive' stance" do
21
+ let(:stance) do
22
+ 'aggressive'
23
+ end
24
+
25
+ it { is_expected.to be_valid }
26
+ end
27
+
28
+ context "with 'passive' stance" do
29
+ let(:stance) do
30
+ 'passive'
31
+ end
32
+
33
+ it { is_expected.to be_valid }
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,109 @@
1
+ RSpec.shared_examples_for 'MetasploitDataModels::Search::Operation::IPAddress::*.match' do |options={}|
2
+ options.assert_valid_keys(4, 6)
3
+
4
+ subject(:match) {
5
+ described_class.match(formatted_value)
6
+ }
7
+
8
+ #
9
+ # Shared Examples
10
+ #
11
+
12
+ shared_examples_for 'match' do |boolean|
13
+ if boolean
14
+ it { is_expected.to be_a described_class }
15
+
16
+ it 'does not set #operator' do
17
+ expect(match.operator).to be_nil
18
+ end
19
+
20
+ it 'sets #value' do
21
+ expect(match.value).not_to be_nil
22
+ end
23
+ else
24
+ it { is_expected.to be_nil }
25
+ end
26
+ end
27
+
28
+ context 'with IPv4' do
29
+ ipv4 = options.fetch(4, [])
30
+ ipv4 = Set.new Array.wrap(ipv4)
31
+
32
+ key_set = Set.new([:cidr, :nmap, :range, :single])
33
+
34
+ unless key_set.superset?(ipv4)
35
+ unknown_keys = ipv4 - key_set
36
+
37
+ raise ArgumentError, "keys (#{unknown_keys.sort.to_sentence}) not in known keys (#{key_set.sort.to_sentence})"
38
+ end
39
+
40
+ context 'with CIDR' do
41
+ let(:formatted_value) {
42
+ '1.2.3.4/24'
43
+ }
44
+
45
+ it_should_behave_like 'match', ipv4.include?(:cidr)
46
+ end
47
+
48
+ context 'with NMAP' do
49
+ let(:formatted_value) {
50
+ '1-2,4.5,6-7.8-9,10-11.12,13'
51
+ }
52
+
53
+ it_should_behave_like 'match', ipv4.include?(:nmap)
54
+ end
55
+
56
+ context 'with range' do
57
+ let(:formatted_value) {
58
+ '1.2.3.4-5.6.7.8'
59
+ }
60
+
61
+ it_should_behave_like 'match', ipv4.include?(:range)
62
+ end
63
+
64
+ context 'with single' do
65
+ let(:formatted_value) {
66
+ '1.2.3.4'
67
+ }
68
+
69
+ it_should_behave_like 'match', ipv4.include?(:single)
70
+ end
71
+ end
72
+
73
+ context 'with IPv6' do
74
+ ipv6 = options.fetch(6, [])
75
+ ipv6 = Set.new Array.wrap(ipv6)
76
+
77
+ key_set = Set.new([:cidr, :range, :single])
78
+
79
+ unless key_set.superset?(ipv6)
80
+ unknown_keys = ipv6 - key_set
81
+
82
+ raise ArgumentError, "keys (#{unknown_keys.sort.to_sentence}) not in known keys (#{key_set.sort.to_sentence})"
83
+ end
84
+
85
+ context 'with CIDR' do
86
+ let(:formatted_value) {
87
+ '1:2:3:4:5:6:7:8/48'
88
+ }
89
+
90
+ it_should_behave_like 'match', ipv6.include?(:cidr)
91
+ end
92
+
93
+ context 'with range' do
94
+ let(:formatted_value) {
95
+ '1:2:3:4:5:6:7:8-9:10:11:12:13:14:15:16'
96
+ }
97
+
98
+ it_should_behave_like 'match', ipv6.include?(:range)
99
+ end
100
+
101
+ context 'with single' do
102
+ let(:formatted_value) {
103
+ '1:2:3:4:5:6:7:8'
104
+ }
105
+
106
+ it_should_behave_like 'match', ipv6.include?(:single)
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,38 @@
1
+ RSpec.shared_examples_for 'MetasploitDataModels::Search::Visitor::Includes#visit with #children' do
2
+ let(:children) do
3
+ 2.times.collect { |n|
4
+ double("Child #{n}")
5
+ }
6
+ end
7
+
8
+ let(:node) do
9
+ node_class.new(
10
+ :children => children
11
+ )
12
+ end
13
+
14
+ it 'should visit each child' do
15
+ # needed for call to visit subject
16
+ expect(visitor).to receive(:visit).with(node).and_call_original
17
+
18
+ children.each do |child|
19
+ expect(visitor).to receive(:visit).with(child).and_return([])
20
+ end
21
+
22
+ visit
23
+ end
24
+
25
+ it 'should return Array of all child visits' do
26
+ child_visits = []
27
+
28
+ expect(visitor).to receive(:visit).with(node).and_call_original
29
+
30
+ children.each_with_index do |child, i|
31
+ child_visit = ["Visited Child #{i}"]
32
+ allow(visitor).to receive(:visit).with(child).and_return(child_visit)
33
+ child_visits.concat(child_visit)
34
+ end
35
+
36
+ expect(visit).to eq(child_visits)
37
+ end
38
+ end
@@ -0,0 +1,26 @@
1
+ RSpec.shared_examples_for 'MetasploitDataModels::Search::Visitor::Includes#visit with Metasploit::Model::Search::Operation::Base' do
2
+ let(:operator) do
3
+ double('Operation Operator')
4
+ end
5
+
6
+ let(:node) do
7
+ node_class.new(
8
+ :operator => operator
9
+ )
10
+ end
11
+
12
+ it 'should visit operator' do
13
+ expect(visitor).to receive(:visit).with(node).and_call_original
14
+ expect(visitor).to receive(:visit).with(operator).and_return([])
15
+
16
+ visit
17
+ end
18
+
19
+ it 'should return operator visit' do
20
+ operator_visit = ["Visited Operator"]
21
+ expect(visitor).to receive(:visit).with(node).and_call_original
22
+ allow(visitor).to receive(:visit).with(operator).and_return(operator_visit)
23
+
24
+ expect(visit).to eq(operator_visit)
25
+ end
26
+ end
@@ -0,0 +1,50 @@
1
+ RSpec.shared_examples_for 'MetasploitDataModels::Search::Visitor::Relation#visit matching record' do |options={}|
2
+ options.assert_valid_keys(:attribute, :association)
3
+
4
+ attribute = options.fetch(:attribute)
5
+ association = options[:association]
6
+
7
+ def self.nested_hash_to_array(association)
8
+ case association
9
+ when Hash
10
+ hash = association
11
+ keys = hash.keys
12
+
13
+ unless keys.length == 1
14
+ raise ArgumentError, 'Only single key Hashes are allowed to nest associations'
15
+ end
16
+
17
+ parent_association = keys.first
18
+ child_association = hash[parent_association]
19
+
20
+ [parent_association, *nested_hash_to_array(child_association)]
21
+ when Symbol
22
+ [association]
23
+ when nil
24
+ []
25
+ else
26
+ raise TypeError, "Cannot convert #{association.class} (#{association}) to array"
27
+ end
28
+ end
29
+
30
+ associations = nested_hash_to_array(association)
31
+ messages = [*associations, attribute]
32
+ formatted_operator = messages.map(&:to_s).join('.')
33
+
34
+ context "with #{formatted_operator}" do
35
+ let(:formatted) do
36
+ "#{formatted_operator}:\"#{value}\""
37
+ end
38
+
39
+ let(:value) do
40
+ messages.inject(matching_record) { |instance, message|
41
+ # wrap in array so singel and plural associatins can be handled the same
42
+ Array.wrap(instance.send(message)).first
43
+ }
44
+ end
45
+
46
+ it 'should find only matching record' do
47
+ expect(visit).to match_array([matching_record])
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,34 @@
1
+ RSpec.shared_examples_for 'MetasploitDataModels::Search::Visitor::Where#visit with equality operation' do
2
+ let(:node) do
3
+ node_class.new(
4
+ :operator => operator,
5
+ :value => value
6
+ )
7
+ end
8
+
9
+ let(:operator) do
10
+ Metasploit::Model::Search::Operator::Attribute.new(
11
+ # any class that responds to arel_table
12
+ :klass => Mdm::Host
13
+ )
14
+ end
15
+
16
+ let(:value) do
17
+ "value"
18
+ end
19
+
20
+ it 'should visit operation.operator with attribute_visitor' do
21
+ expect(visitor.attribute_visitor).to receive(:visit).with(operator).and_call_original
22
+
23
+ visit
24
+ end
25
+
26
+ it 'should call eq on Arel::Attributes::Attribute from attribute_visitor' do
27
+ attribute = double('Visited Operator')
28
+ allow(visitor.attribute_visitor).to receive(:visit).with(operator).and_return(attribute)
29
+
30
+ expect(attribute).to receive(:eq).with(value)
31
+
32
+ visit
33
+ end
34
+ end
@@ -0,0 +1,51 @@
1
+ RSpec.shared_examples_for 'MetasploitDataModels::Search::Visitor::Where#visit with Metasploit::Model::Search*::Group::Base' do |options={}|
2
+ options.assert_valid_keys(:arel_class)
3
+
4
+ arel_class = options.fetch(:arel_class)
5
+
6
+ let(:children) do
7
+ 2.times.collect { |n|
8
+ double("Group Child #{n}")
9
+ }
10
+ end
11
+
12
+ let(:node) do
13
+ node_class.new(
14
+ :children => children
15
+ )
16
+ end
17
+
18
+ it 'should visit each child' do
19
+ expect(visitor).to receive(:visit).with(node).and_call_original
20
+
21
+ children.each do |child|
22
+ expect(visitor).to receive(:visit).with(child).and_return(Arel::Nodes::Equality.new(1, 1))
23
+ end
24
+
25
+ visit
26
+ end
27
+
28
+ it "should combine children AREL with #{arel_class}" do
29
+ allow(visitor).to receive(:visit).with(node).and_call_original
30
+ child_visits = []
31
+
32
+ children.each_with_index do |child, i|
33
+ child_visit = Arel::Nodes::Equality.new(i, i)
34
+ allow(visitor).to receive(:visit).with(child).and_return(child_visit)
35
+ child_visits << child_visit
36
+ end
37
+
38
+ root = visit
39
+
40
+ if root.is_a? Arel::Nodes::Grouping
41
+ arel_pair = root.expr
42
+ else
43
+ arel_pair = root
44
+ end
45
+
46
+ expect(arel_pair).to be_a arel_class
47
+
48
+ expect(arel_pair.left).to eq(child_visits[0])
49
+ expect(arel_pair.right).to eq(child_visits[1])
50
+ end
51
+ end