metasploit-model 0.24.1-java

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 (380) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +27 -0
  4. data/.rspec +4 -0
  5. data/.simplecov +38 -0
  6. data/.travis.yml +6 -0
  7. data/.yardopts +5 -0
  8. data/Gemfile +43 -0
  9. data/LICENSE +27 -0
  10. data/README.md +33 -0
  11. data/Rakefile +52 -0
  12. data/app/models/metasploit/model/association/reflection.rb +46 -0
  13. data/app/models/metasploit/model/module/ancestor/spec/template.rb +125 -0
  14. data/app/models/metasploit/model/module/class/spec/template.rb +92 -0
  15. data/app/models/metasploit/model/module/instance/spec/template.rb +97 -0
  16. data/app/models/metasploit/model/search/group/base.rb +21 -0
  17. data/app/models/metasploit/model/search/group/intersection.rb +4 -0
  18. data/app/models/metasploit/model/search/group/union.rb +4 -0
  19. data/app/models/metasploit/model/search/operation/base.rb +39 -0
  20. data/app/models/metasploit/model/search/operation/boolean.rb +36 -0
  21. data/app/models/metasploit/model/search/operation/date.rb +37 -0
  22. data/app/models/metasploit/model/search/operation/integer.rb +14 -0
  23. data/app/models/metasploit/model/search/operation/null.rb +26 -0
  24. data/app/models/metasploit/model/search/operation/set.rb +34 -0
  25. data/app/models/metasploit/model/search/operation/set/integer.rb +5 -0
  26. data/app/models/metasploit/model/search/operation/set/string.rb +5 -0
  27. data/app/models/metasploit/model/search/operation/string.rb +11 -0
  28. data/app/models/metasploit/model/search/operation/union.rb +59 -0
  29. data/app/models/metasploit/model/search/operator/association.rb +43 -0
  30. data/app/models/metasploit/model/search/operator/attribute.rb +60 -0
  31. data/app/models/metasploit/model/search/operator/base.rb +34 -0
  32. data/app/models/metasploit/model/search/operator/delegation.rb +40 -0
  33. data/app/models/metasploit/model/search/operator/deprecated/app.rb +27 -0
  34. data/app/models/metasploit/model/search/operator/deprecated/author.rb +33 -0
  35. data/app/models/metasploit/model/search/operator/deprecated/authority.rb +43 -0
  36. data/app/models/metasploit/model/search/operator/deprecated/platform.rb +45 -0
  37. data/app/models/metasploit/model/search/operator/deprecated/ref.rb +50 -0
  38. data/app/models/metasploit/model/search/operator/deprecated/text.rb +32 -0
  39. data/app/models/metasploit/model/search/operator/null.rb +44 -0
  40. data/app/models/metasploit/model/search/operator/single.rb +98 -0
  41. data/app/models/metasploit/model/search/operator/union.rb +33 -0
  42. data/app/models/metasploit/model/search/query.rb +171 -0
  43. data/app/models/metasploit/model/spec/template.rb +273 -0
  44. data/app/models/metasploit/model/visitation/visitor.rb +69 -0
  45. data/app/validators/derivation_validator.rb +17 -0
  46. data/app/validators/dynamic_length_validator.rb +45 -0
  47. data/app/validators/ip_format_validator.rb +31 -0
  48. data/app/validators/nil_validator.rb +16 -0
  49. data/app/validators/parameters_validator.rb +147 -0
  50. data/app/validators/password_is_strong_validator.rb +115 -0
  51. data/config/locales/en.yml +209 -0
  52. data/lib/metasploit/model.rb +38 -0
  53. data/lib/metasploit/model/architecture.rb +346 -0
  54. data/lib/metasploit/model/association.rb +49 -0
  55. data/lib/metasploit/model/association/error.rb +40 -0
  56. data/lib/metasploit/model/author.rb +58 -0
  57. data/lib/metasploit/model/authority.rb +134 -0
  58. data/lib/metasploit/model/authority/bid.rb +10 -0
  59. data/lib/metasploit/model/authority/cve.rb +10 -0
  60. data/lib/metasploit/model/authority/msb.rb +10 -0
  61. data/lib/metasploit/model/authority/osvdb.rb +10 -0
  62. data/lib/metasploit/model/authority/pmasa.rb +10 -0
  63. data/lib/metasploit/model/authority/secunia.rb +10 -0
  64. data/lib/metasploit/model/authority/us_cert_vu.rb +10 -0
  65. data/lib/metasploit/model/authority/waraxe.rb +31 -0
  66. data/lib/metasploit/model/authority/zdi.rb +10 -0
  67. data/lib/metasploit/model/base.rb +25 -0
  68. data/lib/metasploit/model/configuration.rb +72 -0
  69. data/lib/metasploit/model/configuration/autoload.rb +109 -0
  70. data/lib/metasploit/model/configuration/child.rb +12 -0
  71. data/lib/metasploit/model/configuration/error.rb +4 -0
  72. data/lib/metasploit/model/configuration/i18n.rb +54 -0
  73. data/lib/metasploit/model/configuration/parent.rb +50 -0
  74. data/lib/metasploit/model/configured.rb +46 -0
  75. data/lib/metasploit/model/derivation.rb +110 -0
  76. data/lib/metasploit/model/derivation/full_name.rb +25 -0
  77. data/lib/metasploit/model/email_address.rb +128 -0
  78. data/lib/metasploit/model/engine.rb +34 -0
  79. data/lib/metasploit/model/error.rb +7 -0
  80. data/lib/metasploit/model/file.rb +49 -0
  81. data/lib/metasploit/model/invalid.rb +17 -0
  82. data/lib/metasploit/model/module.rb +8 -0
  83. data/lib/metasploit/model/module/action.rb +58 -0
  84. data/lib/metasploit/model/module/ancestor.rb +494 -0
  85. data/lib/metasploit/model/module/architecture.rb +40 -0
  86. data/lib/metasploit/model/module/author.rb +47 -0
  87. data/lib/metasploit/model/module/class.rb +406 -0
  88. data/lib/metasploit/model/module/handler.rb +35 -0
  89. data/lib/metasploit/model/module/instance.rb +626 -0
  90. data/lib/metasploit/model/module/path.rb +165 -0
  91. data/lib/metasploit/model/module/platform.rb +38 -0
  92. data/lib/metasploit/model/module/rank.rb +91 -0
  93. data/lib/metasploit/model/module/reference.rb +38 -0
  94. data/lib/metasploit/model/module/stance.rb +22 -0
  95. data/lib/metasploit/model/module/target.rb +80 -0
  96. data/lib/metasploit/model/module/target/architecture.rb +42 -0
  97. data/lib/metasploit/model/module/target/platform.rb +42 -0
  98. data/lib/metasploit/model/module/type.rb +44 -0
  99. data/lib/metasploit/model/nilify_blanks.rb +53 -0
  100. data/lib/metasploit/model/platform.rb +250 -0
  101. data/lib/metasploit/model/real_pathname.rb +18 -0
  102. data/lib/metasploit/model/reference.rb +108 -0
  103. data/lib/metasploit/model/search.rb +63 -0
  104. data/lib/metasploit/model/search/association.rb +32 -0
  105. data/lib/metasploit/model/search/attribute.rb +51 -0
  106. data/lib/metasploit/model/search/operation.rb +31 -0
  107. data/lib/metasploit/model/search/operation/integer/value.rb +33 -0
  108. data/lib/metasploit/model/search/operation/string/value.rb +14 -0
  109. data/lib/metasploit/model/search/operator.rb +10 -0
  110. data/lib/metasploit/model/search/operator/help.rb +47 -0
  111. data/lib/metasploit/model/search/with.rb +40 -0
  112. data/lib/metasploit/model/spec.rb +140 -0
  113. data/lib/metasploit/model/spec/error.rb +9 -0
  114. data/lib/metasploit/model/spec/i18n_exception_handler.rb +19 -0
  115. data/lib/metasploit/model/spec/pathname_collision.rb +28 -0
  116. data/lib/metasploit/model/spec/template/write.rb +42 -0
  117. data/lib/metasploit/model/spec/temporary_pathname.rb +59 -0
  118. data/lib/metasploit/model/translation.rb +31 -0
  119. data/lib/metasploit/model/version.rb +31 -0
  120. data/lib/metasploit/model/visitation.rb +9 -0
  121. data/lib/metasploit/model/visitation/visit.rb +103 -0
  122. data/lib/tasks/yard.rake +30 -0
  123. data/metasploit-model.gemspec +39 -0
  124. data/script/rails +9 -0
  125. data/spec/app/models/metasploit/model/association/reflection_spec.rb +48 -0
  126. data/spec/app/models/metasploit/model/module/ancestor/spec/template_spec.rb +174 -0
  127. data/spec/app/models/metasploit/model/module/class/spec/template_spec.rb +222 -0
  128. data/spec/app/models/metasploit/model/module/instance/spec/template_spec.rb +201 -0
  129. data/spec/app/models/metasploit/model/search/group/base_spec.rb +5 -0
  130. data/spec/app/models/metasploit/model/search/group/intersection_spec.rb +5 -0
  131. data/spec/app/models/metasploit/model/search/group/union_spec.rb +5 -0
  132. data/spec/app/models/metasploit/model/search/operation/base_spec.rb +70 -0
  133. data/spec/app/models/metasploit/model/search/operation/boolean_spec.rb +56 -0
  134. data/spec/app/models/metasploit/model/search/operation/date_spec.rb +89 -0
  135. data/spec/app/models/metasploit/model/search/operation/integer_spec.rb +9 -0
  136. data/spec/app/models/metasploit/model/search/operation/null_spec.rb +64 -0
  137. data/spec/app/models/metasploit/model/search/operation/set/integer_spec.rb +7 -0
  138. data/spec/app/models/metasploit/model/search/operation/set/string_spec.rb +7 -0
  139. data/spec/app/models/metasploit/model/search/operation/set_spec.rb +126 -0
  140. data/spec/app/models/metasploit/model/search/operation/string_spec.rb +9 -0
  141. data/spec/app/models/metasploit/model/search/operation/union_spec.rb +124 -0
  142. data/spec/app/models/metasploit/model/search/operator/association_spec.rb +108 -0
  143. data/spec/app/models/metasploit/model/search/operator/attribute_spec.rb +104 -0
  144. data/spec/app/models/metasploit/model/search/operator/base_spec.rb +34 -0
  145. data/spec/app/models/metasploit/model/search/operator/delegation_spec.rb +108 -0
  146. data/spec/app/models/metasploit/model/search/operator/deprecated/app_spec.rb +62 -0
  147. data/spec/app/models/metasploit/model/search/operator/deprecated/author_spec.rb +161 -0
  148. data/spec/app/models/metasploit/model/search/operator/deprecated/authority_spec.rb +123 -0
  149. data/spec/app/models/metasploit/model/search/operator/deprecated/platform_spec.rb +112 -0
  150. data/spec/app/models/metasploit/model/search/operator/deprecated/ref_spec.rb +327 -0
  151. data/spec/app/models/metasploit/model/search/operator/deprecated/text_spec.rb +357 -0
  152. data/spec/app/models/metasploit/model/search/operator/null_spec.rb +41 -0
  153. data/spec/app/models/metasploit/model/search/operator/single_spec.rb +327 -0
  154. data/spec/app/models/metasploit/model/search/operator/union_spec.rb +92 -0
  155. data/spec/app/models/metasploit/model/search/query_spec.rb +742 -0
  156. data/spec/app/models/metasploit/model/spec/template_spec.rb +23 -0
  157. data/spec/app/models/metasploit/model/visitation/visitor_spec.rb +45 -0
  158. data/spec/app/validators/derivation_validator_spec.rb +92 -0
  159. data/spec/app/validators/dynamic_length_validator_spec.rb +293 -0
  160. data/spec/app/validators/ip_format_validator_spec.rb +124 -0
  161. data/spec/app/validators/nil_validator_spec.rb +69 -0
  162. data/spec/app/validators/parameters_validator_spec.rb +342 -0
  163. data/spec/app/validators/password_is_strong_validator_spec.rb +250 -0
  164. data/spec/dummy/Rakefile +7 -0
  165. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  166. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  167. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  168. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  169. data/spec/dummy/app/mailers/.gitkeep +0 -0
  170. data/spec/dummy/app/models/dummy/architecture.rb +92 -0
  171. data/spec/dummy/app/models/dummy/author.rb +15 -0
  172. data/spec/dummy/app/models/dummy/authority.rb +130 -0
  173. data/spec/dummy/app/models/dummy/email_address.rb +27 -0
  174. data/spec/dummy/app/models/dummy/module/action.rb +25 -0
  175. data/spec/dummy/app/models/dummy/module/ancestor.rb +67 -0
  176. data/spec/dummy/app/models/dummy/module/architecture.rb +19 -0
  177. data/spec/dummy/app/models/dummy/module/author.rb +28 -0
  178. data/spec/dummy/app/models/dummy/module/class.rb +69 -0
  179. data/spec/dummy/app/models/dummy/module/instance.rb +209 -0
  180. data/spec/dummy/app/models/dummy/module/path.rb +64 -0
  181. data/spec/dummy/app/models/dummy/module/platform.rb +19 -0
  182. data/spec/dummy/app/models/dummy/module/rank.rb +44 -0
  183. data/spec/dummy/app/models/dummy/module/reference.rb +19 -0
  184. data/spec/dummy/app/models/dummy/module/target.rb +62 -0
  185. data/spec/dummy/app/models/dummy/module/target/architecture.rb +19 -0
  186. data/spec/dummy/app/models/dummy/module/target/platform.rb +19 -0
  187. data/spec/dummy/app/models/dummy/platform.rb +58 -0
  188. data/spec/dummy/app/models/dummy/reference.rb +31 -0
  189. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  190. data/spec/dummy/config.ru +4 -0
  191. data/spec/dummy/config/application.rb +43 -0
  192. data/spec/dummy/config/boot.rb +10 -0
  193. data/spec/dummy/config/environment.rb +5 -0
  194. data/spec/dummy/config/environments/development.rb +27 -0
  195. data/spec/dummy/config/environments/production.rb +63 -0
  196. data/spec/dummy/config/environments/test.rb +29 -0
  197. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  198. data/spec/dummy/config/initializers/inflections.rb +15 -0
  199. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  200. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  201. data/spec/dummy/config/initializers/session_store.rb +3 -0
  202. data/spec/dummy/config/initializers/wrap_parameters.rb +9 -0
  203. data/spec/dummy/config/locales/en.yml +1 -0
  204. data/spec/dummy/config/routes.rb +2 -0
  205. data/spec/dummy/db/schema.rb +707 -0
  206. data/spec/dummy/lib/assets/.gitkeep +0 -0
  207. data/spec/dummy/log/.gitkeep +0 -0
  208. data/spec/dummy/public/404.html +26 -0
  209. data/spec/dummy/public/422.html +26 -0
  210. data/spec/dummy/public/500.html +25 -0
  211. data/spec/dummy/public/favicon.ico +0 -0
  212. data/spec/dummy/script/rails +6 -0
  213. data/spec/dummy/spec/factories/dummy/architectures.rb +13 -0
  214. data/spec/dummy/spec/factories/dummy/authorities.rb +32 -0
  215. data/spec/dummy/spec/factories/dummy/authors.rb +8 -0
  216. data/spec/dummy/spec/factories/dummy/email_addresses.rb +8 -0
  217. data/spec/dummy/spec/factories/dummy/module/actions.rb +13 -0
  218. data/spec/dummy/spec/factories/dummy/module/ancestors.rb +45 -0
  219. data/spec/dummy/spec/factories/dummy/module/architectures.rb +35 -0
  220. data/spec/dummy/spec/factories/dummy/module/authors.rb +10 -0
  221. data/spec/dummy/spec/factories/dummy/module/classes.rb +40 -0
  222. data/spec/dummy/spec/factories/dummy/module/instances.rb +86 -0
  223. data/spec/dummy/spec/factories/dummy/module/paths.rb +16 -0
  224. data/spec/dummy/spec/factories/dummy/module/platforms.rb +35 -0
  225. data/spec/dummy/spec/factories/dummy/module/ranks.rb +14 -0
  226. data/spec/dummy/spec/factories/dummy/module/references.rb +17 -0
  227. data/spec/dummy/spec/factories/dummy/module/target/architectures.rb +40 -0
  228. data/spec/dummy/spec/factories/dummy/module/target/platforms.rb +41 -0
  229. data/spec/dummy/spec/factories/dummy/module/targets.rb +46 -0
  230. data/spec/dummy/spec/factories/dummy/platforms.rb +3 -0
  231. data/spec/dummy/spec/factories/dummy/references.rb +26 -0
  232. data/spec/factories/metasploit/model/architectures.rb +6 -0
  233. data/spec/factories/metasploit/model/association/reflections.rb +9 -0
  234. data/spec/factories/metasploit/model/authorities.rb +28 -0
  235. data/spec/factories/metasploit/model/authors.rb +9 -0
  236. data/spec/factories/metasploit/model/bases.rb +10 -0
  237. data/spec/factories/metasploit/model/email_addresses.rb +14 -0
  238. data/spec/factories/metasploit/model/module/actions.rb +9 -0
  239. data/spec/factories/metasploit/model/module/ancestors.rb +180 -0
  240. data/spec/factories/metasploit/model/module/architectures.rb +15 -0
  241. data/spec/factories/metasploit/model/module/classes.rb +47 -0
  242. data/spec/factories/metasploit/model/module/handlers.rb +3 -0
  243. data/spec/factories/metasploit/model/module/instances.rb +83 -0
  244. data/spec/factories/metasploit/model/module/paths.rb +51 -0
  245. data/spec/factories/metasploit/model/module/platforms.rb +15 -0
  246. data/spec/factories/metasploit/model/module/ranks.rb +9 -0
  247. data/spec/factories/metasploit/model/module/references.rb +11 -0
  248. data/spec/factories/metasploit/model/module/stances.rb +3 -0
  249. data/spec/factories/metasploit/model/module/targets.rb +22 -0
  250. data/spec/factories/metasploit/model/module/types.rb +5 -0
  251. data/spec/factories/metasploit/model/references.rb +88 -0
  252. data/spec/factories/metasploit/model/search/operator/associations.rb +5 -0
  253. data/spec/factories/metasploit/model/search/operator/attributes.rb +7 -0
  254. data/spec/factories/metasploit/model/search/operator/bases.rb +5 -0
  255. data/spec/lib/metasploit/model/architecture_spec.rb +52 -0
  256. data/spec/lib/metasploit/model/association/error_spec.rb +48 -0
  257. data/spec/lib/metasploit/model/association_spec.rb +145 -0
  258. data/spec/lib/metasploit/model/author_spec.rb +6 -0
  259. data/spec/lib/metasploit/model/authority/bid_spec.rb +17 -0
  260. data/spec/lib/metasploit/model/authority/cve_spec.rb +17 -0
  261. data/spec/lib/metasploit/model/authority/msb_spec.rb +17 -0
  262. data/spec/lib/metasploit/model/authority/osvdb_spec.rb +17 -0
  263. data/spec/lib/metasploit/model/authority/pmasa_spec.rb +17 -0
  264. data/spec/lib/metasploit/model/authority/secunia_spec.rb +17 -0
  265. data/spec/lib/metasploit/model/authority/us_cert_vu_spec.rb +17 -0
  266. data/spec/lib/metasploit/model/authority/waraxe_spec.rb +51 -0
  267. data/spec/lib/metasploit/model/authority/zdi_spec.rb +21 -0
  268. data/spec/lib/metasploit/model/authority_spec.rb +10 -0
  269. data/spec/lib/metasploit/model/base_spec.rb +58 -0
  270. data/spec/lib/metasploit/model/configuration/autoload_spec.rb +165 -0
  271. data/spec/lib/metasploit/model/configuration/child_spec.rb +24 -0
  272. data/spec/lib/metasploit/model/configuration/error_spec.rb +5 -0
  273. data/spec/lib/metasploit/model/configuration/i18n_spec.rb +103 -0
  274. data/spec/lib/metasploit/model/configuration_spec.rb +106 -0
  275. data/spec/lib/metasploit/model/configured_spec.rb +41 -0
  276. data/spec/lib/metasploit/model/derivation/full_name_spec.rb +75 -0
  277. data/spec/lib/metasploit/model/derivation_spec.rb +217 -0
  278. data/spec/lib/metasploit/model/email_address_spec.rb +19 -0
  279. data/spec/lib/metasploit/model/engine_spec.rb +84 -0
  280. data/spec/lib/metasploit/model/file_spec.rb +43 -0
  281. data/spec/lib/metasploit/model/invalid_spec.rb +54 -0
  282. data/spec/lib/metasploit/model/module/action_spec.rb +6 -0
  283. data/spec/lib/metasploit/model/module/ancestor_spec.rb +6 -0
  284. data/spec/lib/metasploit/model/module/architecture_spec.rb +9 -0
  285. data/spec/lib/metasploit/model/module/author_spec.rb +6 -0
  286. data/spec/lib/metasploit/model/module/class_spec.rb +19 -0
  287. data/spec/lib/metasploit/model/module/handler_spec.rb +61 -0
  288. data/spec/lib/metasploit/model/module/instance_spec.rb +183 -0
  289. data/spec/lib/metasploit/model/module/path_spec.rb +6 -0
  290. data/spec/lib/metasploit/model/module/platform_spec.rb +9 -0
  291. data/spec/lib/metasploit/model/module/rank_spec.rb +29 -0
  292. data/spec/lib/metasploit/model/module/reference_spec.rb +9 -0
  293. data/spec/lib/metasploit/model/module/stance_spec.rb +30 -0
  294. data/spec/lib/metasploit/model/module/target/architecture_spec.rb +9 -0
  295. data/spec/lib/metasploit/model/module/target/platform_spec.rb +9 -0
  296. data/spec/lib/metasploit/model/module/target_spec.rb +9 -0
  297. data/spec/lib/metasploit/model/module/type_spec.rb +125 -0
  298. data/spec/lib/metasploit/model/nilify_blanks_spec.rb +156 -0
  299. data/spec/lib/metasploit/model/platform_spec.rb +100 -0
  300. data/spec/lib/metasploit/model/reference_spec.rb +21 -0
  301. data/spec/lib/metasploit/model/search/association_spec.rb +33 -0
  302. data/spec/lib/metasploit/model/search/attribute_spec.rb +99 -0
  303. data/spec/lib/metasploit/model/search/operation/integer/value_spec.rb +20 -0
  304. data/spec/lib/metasploit/model/search/operation/string/value_spec.rb +20 -0
  305. data/spec/lib/metasploit/model/search/operation_spec.rb +144 -0
  306. data/spec/lib/metasploit/model/search/operator/help_spec.rb +41 -0
  307. data/spec/lib/metasploit/model/search/with_spec.rb +81 -0
  308. data/spec/lib/metasploit/model/search_spec.rb +230 -0
  309. data/spec/lib/metasploit/model/spec/error_spec.rb +5 -0
  310. data/spec/lib/metasploit/model/spec/i18n_exception_handler_spec.rb +42 -0
  311. data/spec/lib/metasploit/model/spec/pathname_collision_spec.rb +55 -0
  312. data/spec/lib/metasploit/model/spec_spec.rb +114 -0
  313. data/spec/lib/metasploit/model/translation_spec.rb +82 -0
  314. data/spec/lib/metasploit/model/version_spec.rb +141 -0
  315. data/spec/lib/metasploit/model/visitation/visit_spec.rb +316 -0
  316. data/spec/lib/metasploit/model_spec.rb +68 -0
  317. data/spec/spec_helper.rb +48 -0
  318. data/spec/support/shared/contexts/metasploit/model/configuration.rb +11 -0
  319. data/spec/support/shared/contexts/metasploit/model/module/ancestor/contents/metasploit_module.rb +12 -0
  320. data/spec/support/shared/contexts/metasploit/model/module/ancestor/factory/contents.rb +10 -0
  321. data/spec/support/shared/contexts/metasploit/model/module/ancestor/factory/contents/metasploit_module.rb +15 -0
  322. data/spec/support/shared/contexts/metasploit/model/search/operator/union/children.rb +13 -0
  323. data/spec/support/shared/examples/derives.rb +115 -0
  324. data/spec/support/shared/examples/metasploit/model/architecture.rb +425 -0
  325. data/spec/support/shared/examples/metasploit/model/architecture/seed.rb +25 -0
  326. data/spec/support/shared/examples/metasploit/model/author.rb +27 -0
  327. data/spec/support/shared/examples/metasploit/model/authority.rb +124 -0
  328. data/spec/support/shared/examples/metasploit/model/authority/seed.rb +49 -0
  329. data/spec/support/shared/examples/metasploit/model/configuration/parent/child.rb +60 -0
  330. data/spec/support/shared/examples/metasploit/model/email_address.rb +220 -0
  331. data/spec/support/shared/examples/metasploit/model/module/action.rb +26 -0
  332. data/spec/support/shared/examples/metasploit/model/module/ancestor.rb +2004 -0
  333. data/spec/support/shared/examples/metasploit/model/module/ancestor/payload_factory.rb +63 -0
  334. data/spec/support/shared/examples/metasploit/model/module/architecture.rb +36 -0
  335. data/spec/support/shared/examples/metasploit/model/module/author.rb +29 -0
  336. data/spec/support/shared/examples/metasploit/model/module/class.rb +1514 -0
  337. data/spec/support/shared/examples/metasploit/model/module/handler.rb +21 -0
  338. data/spec/support/shared/examples/metasploit/model/module/instance.rb +1384 -0
  339. data/spec/support/shared/examples/metasploit/model/module/instance/class_methods.rb +537 -0
  340. data/spec/support/shared/examples/metasploit/model/module/instance/is_not_stanced_with_module_type.rb +22 -0
  341. data/spec/support/shared/examples/metasploit/model/module/instance/is_stanced_with_module_type.rb +38 -0
  342. data/spec/support/shared/examples/metasploit/model/module/instance/validates/dynamic_length_of.rb +131 -0
  343. data/spec/support/shared/examples/metasploit/model/module/path.rb +493 -0
  344. data/spec/support/shared/examples/metasploit/model/module/platform.rb +36 -0
  345. data/spec/support/shared/examples/metasploit/model/module/rank.rb +92 -0
  346. data/spec/support/shared/examples/metasploit/model/module/reference.rb +16 -0
  347. data/spec/support/shared/examples/metasploit/model/module/target.rb +29 -0
  348. data/spec/support/shared/examples/metasploit/model/module/target/architecture.rb +56 -0
  349. data/spec/support/shared/examples/metasploit/model/module/target/platform.rb +56 -0
  350. data/spec/support/shared/examples/metasploit/model/platform.rb +213 -0
  351. data/spec/support/shared/examples/metasploit/model/real_pathname.rb +29 -0
  352. data/spec/support/shared/examples/metasploit/model/reference.rb +410 -0
  353. data/spec/support/shared/examples/metasploit/model/search/operation/integer/value.rb +79 -0
  354. data/spec/support/shared/examples/metasploit/model/search/operation/string/value.rb +53 -0
  355. data/spec/support/shared/examples/metasploit/model/search/operator/help.rb +134 -0
  356. data/spec/support/shared/examples/metasploit/model/translation.rb +37 -0
  357. data/spec/support/shared/examples/search/query.rb +43 -0
  358. data/spec/support/shared/examples/search/query/metasploit/model/search/operator/deprecated/app.rb +44 -0
  359. data/spec/support/shared/examples/search/query/metasploit/model/search/operator/deprecated/authority.rb +60 -0
  360. data/spec/support/shared/examples/search_association.rb +13 -0
  361. data/spec/support/shared/examples/search_attribute.rb +27 -0
  362. data/spec/support/shared/examples/search_with.rb +36 -0
  363. data/spec/support/shared/matchers/allow_attribute.rb +17 -0
  364. data/spec/support/templates/metasploit/model/module/ancestors/_attributes.rb.erb +9 -0
  365. data/spec/support/templates/metasploit/model/module/ancestors/_methods.rb.erb +8 -0
  366. data/spec/support/templates/metasploit/model/module/ancestors/_validations.rb.erb +6 -0
  367. data/spec/support/templates/metasploit/model/module/ancestors/base.rb.erb +3 -0
  368. data/spec/support/templates/metasploit/model/module/ancestors/module_types/_auxiliary.rb.erb +1 -0
  369. data/spec/support/templates/metasploit/model/module/ancestors/module_types/_encoder.rb.erb +1 -0
  370. data/spec/support/templates/metasploit/model/module/ancestors/module_types/_exploit.rb.erb +1 -0
  371. data/spec/support/templates/metasploit/model/module/ancestors/module_types/_non_payload.rb.erb +5 -0
  372. data/spec/support/templates/metasploit/model/module/ancestors/module_types/_nop.rb.erb +1 -0
  373. data/spec/support/templates/metasploit/model/module/ancestors/module_types/_payload.rb.erb +4 -0
  374. data/spec/support/templates/metasploit/model/module/ancestors/module_types/_post.rb.erb +1 -0
  375. data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_handled.rb.erb +20 -0
  376. data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_single.rb.erb +1 -0
  377. data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_stage.rb.erb +0 -0
  378. data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_stager.rb.erb +1 -0
  379. data/spec/support/templates/metasploit/model/module/classes/_methods.rb.erb +9 -0
  380. metadata +747 -0
@@ -0,0 +1,35 @@
1
+ module Metasploit
2
+ module Model
3
+ module Module
4
+ # The handler Module for a {Metasploit::Model::Module::Ancestor#handled?} {Metasploit::Model::Module::Ancestor}.
5
+ module Handler
6
+ #
7
+ # CONSTANTS
8
+ #
9
+
10
+ # Maps {TYPES} to {GENERAL_TYPES} used as connection types for `Msf::Payload`.
11
+ GENERAL_TYPE_BY_TYPE = {
12
+ 'bind_tcp' => 'bind',
13
+ 'find_port' => 'find',
14
+ 'find_shell' => 'find',
15
+ 'find_tag' => 'find',
16
+ 'none' => 'none',
17
+ 'reverse_http' => 'tunnel',
18
+ 'reverse_https' => 'tunnel',
19
+ 'reverse_https_proxy' => 'tunnel',
20
+ 'reverse_ipv6_http' => 'tunnel',
21
+ 'reverse_ipv6_https' => 'tunnel',
22
+ 'reverse_tcp' => 'reverse',
23
+ 'reverse_tcp_allports' => 'reverse',
24
+ 'reverse_tcp_double' => 'reverse',
25
+ 'reverse_tcp_double_ssl' => 'reverse',
26
+ 'reverse_tcp_ssl' => 'reverse'
27
+ }
28
+ # General handler types that are used as connection types for Msf::Payloads.
29
+ GENERAL_TYPES = GENERAL_TYPE_BY_TYPE.values.uniq.sort
30
+ # Types of handlers
31
+ TYPES = GENERAL_TYPE_BY_TYPE.keys.sort
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,626 @@
1
+ module Metasploit
2
+ module Model
3
+ module Module
4
+ # Code shared between `Mdm::Module::Instance` and `Metasploit::Framework::Module::Instance`.
5
+ module Instance
6
+ extend ActiveModel::Naming
7
+ extend ActiveSupport::Concern
8
+
9
+ include Metasploit::Model::Translation
10
+
11
+ #
12
+ # CONSTANTS
13
+ #
14
+
15
+ # {#dynamic_length_validation_options} by {#module_type} by attribute.
16
+ DYNAMIC_LENGTH_VALIDATION_OPTIONS_BY_MODULE_TYPE_BY_ATTRIBUTE = {
17
+ actions: {
18
+ Metasploit::Model::Module::Type::AUX => {
19
+ minimum: 0
20
+ },
21
+ Metasploit::Model::Module::Type::ENCODER => {
22
+ is: 0
23
+ },
24
+ Metasploit::Model::Module::Type::EXPLOIT => {
25
+ is: 0
26
+ },
27
+ Metasploit::Model::Module::Type::NOP => {
28
+ is: 0
29
+ },
30
+ Metasploit::Model::Module::Type::PAYLOAD => {
31
+ is: 0
32
+ },
33
+ Metasploit::Model::Module::Type::POST => {
34
+ minimum: 0
35
+ }
36
+ },
37
+ module_architectures: {
38
+ Metasploit::Model::Module::Type::AUX => {
39
+ is: 0
40
+ },
41
+ Metasploit::Model::Module::Type::ENCODER => {
42
+ minimum: 1
43
+ },
44
+ Metasploit::Model::Module::Type::EXPLOIT => {
45
+ minimum: 1
46
+ },
47
+ Metasploit::Model::Module::Type::NOP => {
48
+ minimum: 1
49
+ },
50
+ Metasploit::Model::Module::Type::PAYLOAD => {
51
+ minimum: 1
52
+ },
53
+ Metasploit::Model::Module::Type::POST => {
54
+ minimum: 1
55
+ }
56
+ },
57
+ module_platforms: {
58
+ Metasploit::Model::Module::Type::AUX => {
59
+ is: 0
60
+ },
61
+ Metasploit::Model::Module::Type::ENCODER => {
62
+ is: 0
63
+ },
64
+ Metasploit::Model::Module::Type::EXPLOIT => {
65
+ minimum: 1
66
+ },
67
+ Metasploit::Model::Module::Type::NOP => {
68
+ is: 0
69
+ },
70
+ Metasploit::Model::Module::Type::PAYLOAD => {
71
+ minimum: 1
72
+ },
73
+ Metasploit::Model::Module::Type::POST => {
74
+ minimum: 1
75
+ }
76
+ },
77
+ module_references: {
78
+ Metasploit::Model::Module::Type::AUX => {
79
+ minimum: 0
80
+ },
81
+ Metasploit::Model::Module::Type::ENCODER => {
82
+ is: 0
83
+ },
84
+ Metasploit::Model::Module::Type::EXPLOIT => {
85
+ minimum: 1
86
+ },
87
+ Metasploit::Model::Module::Type::NOP => {
88
+ is: 0
89
+ },
90
+ Metasploit::Model::Module::Type::PAYLOAD => {
91
+ is: 0
92
+ },
93
+ Metasploit::Model::Module::Type::POST => {
94
+ minimum: 0
95
+ }
96
+ },
97
+ targets: {
98
+ Metasploit::Model::Module::Type::AUX => {
99
+ is: 0
100
+ },
101
+ Metasploit::Model::Module::Type::ENCODER => {
102
+ is: 0
103
+ },
104
+ Metasploit::Model::Module::Type::EXPLOIT => {
105
+ minimum: 1
106
+ },
107
+ Metasploit::Model::Module::Type::NOP => {
108
+ is: 0
109
+ },
110
+ Metasploit::Model::Module::Type::PAYLOAD => {
111
+ is: 0
112
+ },
113
+ Metasploit::Model::Module::Type::POST => {
114
+ is: 0
115
+ }
116
+ }
117
+ }
118
+
119
+ # Minimum length of {#module_authors}.
120
+ MINIMUM_MODULE_AUTHORS_LENGTH = 1
121
+
122
+ # {#privileged} is Boolean so, valid values are just `true` and `false`, but since both the validation and
123
+ # factory need an array of valid values, this constant exists.
124
+ PRIVILEGES = [
125
+ false,
126
+ true
127
+ ]
128
+
129
+ # Member of {Metasploit::Model::Module::Type::ALL} that require {#stance} to be non-`nil`.
130
+ STANCED_MODULE_TYPES = [
131
+ Metasploit::Model::Module::Type::AUX,
132
+ Metasploit::Model::Module::Type::EXPLOIT
133
+ ]
134
+
135
+ included do
136
+ include ActiveModel::Validations
137
+ include Metasploit::Model::Search
138
+
139
+ #
140
+ #
141
+ # Search
142
+ #
143
+ #
144
+
145
+ #
146
+ # Search Associations
147
+ #
148
+
149
+ search_association :actions
150
+ search_association :architectures
151
+ search_association :authorities
152
+ search_association :authors
153
+ search_association :email_addresses
154
+ search_association :module_class
155
+ search_association :platforms
156
+ search_association :rank
157
+ search_association :references
158
+ search_association :targets
159
+
160
+ #
161
+ # Search Attributes
162
+ #
163
+
164
+ search_attribute :description, :type => :string
165
+ search_attribute :disclosed_on, :type => :date
166
+ search_attribute :license, :type => :string
167
+ search_attribute :name, :type => :string
168
+ search_attribute :privileged, :type => :boolean
169
+ search_attribute :stance, :type => :string
170
+
171
+ #
172
+ # Search Withs
173
+ #
174
+
175
+ search_with Metasploit::Model::Search::Operator::Deprecated::App
176
+ search_with Metasploit::Model::Search::Operator::Deprecated::Author
177
+ search_with Metasploit::Model::Search::Operator::Deprecated::Authority,
178
+ :abbreviation => :bid
179
+ search_with Metasploit::Model::Search::Operator::Deprecated::Authority,
180
+ :abbreviation => :cve
181
+ search_with Metasploit::Model::Search::Operator::Deprecated::Authority,
182
+ :abbreviation => :edb
183
+ search_with Metasploit::Model::Search::Operator::Deprecated::Authority,
184
+ :abbreviation => :osvdb
185
+ search_with Metasploit::Model::Search::Operator::Deprecated::Platform,
186
+ :name => :os
187
+ search_with Metasploit::Model::Search::Operator::Deprecated::Platform,
188
+ :name => :platform
189
+ search_with Metasploit::Model::Search::Operator::Deprecated::Ref
190
+ search_with Metasploit::Model::Search::Operator::Deprecated::Text
191
+
192
+ #
193
+ #
194
+ # Validations
195
+ #
196
+ #
197
+
198
+ #
199
+ # Method Validations
200
+ #
201
+
202
+ validate :architectures_from_targets,
203
+ if: 'allows?(:targets)'
204
+ validate :platforms_from_targets,
205
+ if: 'allows?(:targets)'
206
+
207
+ #
208
+ # Attribute Validations
209
+ #
210
+
211
+ validates :actions,
212
+ dynamic_length: true
213
+ validates :description,
214
+ :presence => true
215
+ validates :license,
216
+ :presence => true
217
+ validates :module_architectures,
218
+ dynamic_length: true
219
+ validates :module_authors,
220
+ :length => {
221
+ :minimum => MINIMUM_MODULE_AUTHORS_LENGTH
222
+ }
223
+ validates :module_class,
224
+ :presence => true
225
+ validates :module_platforms,
226
+ dynamic_length: true
227
+ validates :module_references,
228
+ dynamic_length: true
229
+ validates :name,
230
+ :presence => true
231
+ validates :privileged,
232
+ :inclusion => {
233
+ :in => PRIVILEGES
234
+ }
235
+ validates :stance,
236
+ inclusion: {
237
+ if: :stanced?,
238
+ in: Metasploit::Model::Module::Stance::ALL
239
+ },
240
+ nil: {
241
+ unless: :stanced?
242
+ }
243
+ validates :targets,
244
+ dynamic_length: true
245
+ end
246
+
247
+ #
248
+ #
249
+ # Associations
250
+ #
251
+ #
252
+
253
+ # @!attribute [rw] actions
254
+ # Auxiliary actions to perform when this running this module.
255
+ #
256
+ # @return [Array<Metasploit::Model::Module::Action>]
257
+
258
+ # @!attribute [rw] default_action
259
+ # The default action in {#actions}.
260
+ #
261
+ # @return [Metasploit::Model::Module::Action]
262
+
263
+ # @!attribute [rw] default_target
264
+ # The default target in {#targets}.
265
+ #
266
+ # @return [Metasploit::Model::Module::Target]
267
+
268
+ # @!attribute [rw] module_architectures
269
+ # Joins this with {#architectures}.
270
+ #
271
+ # @return [Array<Metasploit::Model::Module::Architecture>]
272
+
273
+ # @!attribute [rw] module_authors
274
+ # Joins this with {#authors} and {#email_addresses} to model the name and email address used for an author
275
+ # entry in the module metadata.
276
+ #
277
+ # @return [Array<Metasploit::Model::Module::Author>]
278
+
279
+ # @!attribute [rw] module_class
280
+ # Class-derived metadata to go along with the instance-derived metadata in this model.
281
+ #
282
+ # @return [Metasploit::Model::Module::Class]
283
+
284
+ # @!attribute [rw] module_platforms
285
+ # Joins this with {#platforms}.
286
+ #
287
+ # @return [Array<Metasploit::Model::Module::Platform>]
288
+
289
+ # @!attribute [rw] targets
290
+ # Names of targets with different configurations that can be exploited by this module.
291
+ #
292
+ # @return [Array<Metasploit::Model::Module::Target>]
293
+
294
+ # @!attribute [r] architectures
295
+ # The {Metasploit::Model::Architecture architectures} supported by this module.
296
+ #
297
+ # @return [Array<Metasploit::Model::Architecture>]
298
+
299
+ # @!attribute [r] authors
300
+ # The names of the authors of this module.
301
+ #
302
+ # @return [Array<Metasploit::Model::Author>]
303
+
304
+ # @!attribute [r] email_addresses
305
+ # The email addresses of the authors of this module.
306
+ #
307
+ # @return [Array<Metasploit::Model::EmailAddress>]
308
+
309
+ # @!attribute [r] platforms
310
+ # Platforms supported by this module.
311
+ #
312
+ # @return [Array<Metasploit::Model::Module::Platform>]
313
+
314
+ # @!attribute [r] references
315
+ # External references to the exploit or proof-of-concept (PoC) code in this module.
316
+ #
317
+ # @return [Array<Metasploit::Model::Reference>]
318
+
319
+ # @!attribute [r] vulns
320
+ # Vulnerabilities with same {Metasploit::Model::Reference reference} as this module.
321
+ #
322
+ # @return [Array<Metasploit::Model::Vuln>]
323
+
324
+ # @!attribute [r] vulnerable_hosts
325
+ # Hosts vulnerable to this module.
326
+ #
327
+ # @return [Array<Metasploit::Model::Host>]
328
+
329
+ # @!attribute [r] vulnerable_services
330
+ # Services vulnerable to this module.
331
+ #
332
+ # @return [Array<Metasploit::Model::Service>]
333
+
334
+ #
335
+ # Attributes
336
+ #
337
+
338
+ # @!attribute [rw] description
339
+ # A long, paragraph description of what the module does.
340
+ #
341
+ # @return [String]
342
+
343
+ # @!attribute [rw] disclosed_on
344
+ # The date the vulnerability exploited by this module was disclosed to the public.
345
+ #
346
+ # @return [Date, nil]
347
+
348
+ # @!attribute [rw] license
349
+ # The name of the software license for the module's code.
350
+ #
351
+ # @return [String]
352
+
353
+ # @!attribute [rw] name
354
+ # The human readable name of the module. It is unrelated to {Metasploit::Model::Module::Class#full_name} or
355
+ # {Metasploit::Model::Module::Class#reference_name} and is better thought of as a short summary of the
356
+ # {#description}.
357
+ #
358
+ # @return [String]
359
+
360
+ # @!attribute [rw] privileged
361
+ # Whether this module requires privileged access to run.
362
+ #
363
+ # @return [Boolean]
364
+
365
+ # @!attribute [rw] stance
366
+ # Whether the module is active or passive. `nil` if the {#module_type} is not {#stanced?}.
367
+ #
368
+ # @return ['active', 'passive', nil]
369
+
370
+ #
371
+ # Module Methods
372
+ #
373
+
374
+ module ClassMethods
375
+ # Whether the given `:attribute` is allowed to be present for the given `:module_type`. An attribute is
376
+ # considered allowed if it allows greatrr than 0 elements for a collection.
377
+ #
378
+ # @raise [KeyError] if `:attribute` is not given in `options`.
379
+ # @raise [KeyError] if `:module_type` is not given in `options`.
380
+ # @return [true] if maximum elements is greater than 0 or value can be non-nil
381
+ def allows?(options={})
382
+ allowed = false
383
+ length_validation_options = dynamic_length_validation_options(options)
384
+
385
+ is = length_validation_options[:is]
386
+
387
+ if is
388
+ if is > 0
389
+ allowed = true
390
+ end
391
+ else
392
+ maximum = length_validation_options[:maximum]
393
+
394
+ if maximum
395
+ if maximum > 0
396
+ allowed = true
397
+ end
398
+ else
399
+ # if there is no maximum, then it's treated as infinite
400
+ allowed = true
401
+ end
402
+ end
403
+
404
+ allowed
405
+ end
406
+
407
+ # The length validation options for the given `:attribute` and `:module_type`.
408
+ # @return [Hash{Symbol => Integer}] Hash containing either `:is` (meaning :maximum and :minimum are the same) or
409
+ # `:minimum` (no attribute has an explicit :maximum currently).
410
+ # @raise [KeyError] if `:attribute` is not given in `options`.
411
+ # @raise [KeyError] if `:module_type` is not given in `options`.
412
+ # @raise [KeyError] if `:attribute` value is not a key in
413
+ # {DYNAMIC_LENGTH_VALIDATION_OPTIONS_BY_MODULE_TYPE_BY_ATTRIBUTE}.
414
+ # @raise [KeyError] if `:module_type` value is a not a {Metasploit::Model::Module::Type::ALL} member.
415
+ def dynamic_length_validation_options(options={})
416
+ options.assert_valid_keys(:attribute, :module_type)
417
+ attribute = options.fetch(:attribute)
418
+ module_type = options.fetch(:module_type)
419
+
420
+ dynamic_length_validation_options_by_module_type = DYNAMIC_LENGTH_VALIDATION_OPTIONS_BY_MODULE_TYPE_BY_ATTRIBUTE.fetch(attribute)
421
+ dynamic_length_validation_options_by_module_type.fetch(module_type)
422
+ end
423
+
424
+ # Whether the `:module_type` requires stance to be in {Metasploit::Model::Module::Stance::ALL} or if it must
425
+ # be `nil`.
426
+ #
427
+ # @param module_type [String] A member of `Metasploit::Model::Module::Type::ALL`.
428
+ # @return [true] if `module_type` is in {STANCED_MODULE_TYPES}.
429
+ # @return [false] otherwise.
430
+ def stanced?(module_type)
431
+ STANCED_MODULE_TYPES.include? module_type
432
+ end
433
+ end
434
+
435
+ # make ClassMethods directly callable on Metasploit::Model::Module::Instance for factories
436
+ extend ClassMethods
437
+
438
+ #
439
+ # Module Methods
440
+ #
441
+
442
+ # Values of {#module_type} (members of {Metasploit::Model::Module::Type::ALL}), which have an exact length
443
+ # (`:is`) or maximum length (`:maximum`) greater than 0 for the given `attribute`.
444
+ #
445
+ # @return [Array<String>] Array with members of {Metasploit::Model::Module::Type::ALL}.
446
+ # @see DYNAMIC_LENGTH_VALIDATION_OPTIONS_BY_MODULE_TYPE_BY_ATTRIBUTE
447
+ def self.module_types_that_allow(attribute)
448
+ dynamic_length_validation_options_by_module_type = DYNAMIC_LENGTH_VALIDATION_OPTIONS_BY_MODULE_TYPE_BY_ATTRIBUTE.fetch(attribute)
449
+
450
+ dynamic_length_validation_options_by_module_type.each_with_object([]) { |(module_type, dynamic_length_validation_options), module_types|
451
+ is = dynamic_length_validation_options[:is]
452
+
453
+ if is
454
+ if is > 0
455
+ module_types << module_type
456
+ end
457
+ else
458
+ maximum = dynamic_length_validation_options[:maximum]
459
+
460
+ if maximum
461
+ if maximum > 0
462
+ module_types << module_type
463
+ end
464
+ else
465
+ module_types << module_type
466
+ end
467
+ end
468
+
469
+ }
470
+ end
471
+
472
+ #
473
+ # Instance Methods
474
+ #
475
+
476
+ # Whether the given `attribute` is allowed to have elements.
477
+ #
478
+ # @param attribute [Symbol] name of attribute to check if {#module_type} allows it to have one or more
479
+ # elements.
480
+ # @return (see Metasploit::Model::Module::Instance::ClassMethods#allows?)
481
+ # @return [false] if {#module_type} is not valid
482
+ def allows?(attribute)
483
+ if Metasploit::Model::Module::Type::ALL.include? module_type
484
+ self.class.allows?(
485
+ attribute: attribute,
486
+ module_type: module_type
487
+ )
488
+ else
489
+ false
490
+ end
491
+ end
492
+
493
+ # The dynamic length valdiations, such as `:is` and `:minimum` for the given attribute for the current
494
+ # {#module_type}.
495
+ #
496
+ # @param attribute [Symbol] name of attribute whose dynamic length validation options to be
497
+ # @return (see Metasploit::Model::Module::Instance::ClassMethods#dynamic_length_validation_options)
498
+ # @return [{}] an empty Hash if {#module_type} is not a member of {Metasploit::Model::Module::Type::ALL}
499
+ def dynamic_length_validation_options(attribute)
500
+ if Metasploit::Model::Module::Type::ALL.include? module_type
501
+ self.class.dynamic_length_validation_options(
502
+ module_type: module_type,
503
+ attribute: attribute
504
+ )
505
+ else
506
+ {}
507
+ end
508
+ end
509
+
510
+ # @!method module_type
511
+ # The {Metasploit::Model::Module::Class#module_type} of the {#module_class}.
512
+ #
513
+ # @return (see Metasploit;:Model::Module::Class#module_type)
514
+ delegate :module_type,
515
+ allow_nil: true,
516
+ to: :module_class
517
+
518
+ # Whether {#module_type} requires {#stance} to be set or to be `nil`.
519
+ #
520
+ # @return (see Metasploit::Model::Module::Instance::ClassMethods#stanced?)
521
+ # @return [false] if {#module_type} is not valid
522
+ def stanced?
523
+ self.class.stanced?(module_type)
524
+ end
525
+
526
+ private
527
+
528
+ # Validates that the {#module_architectures}
529
+ # {Metasploit::Model::Module::Architecture#architecture architectures} match the {#targets}
530
+ # {Metasploit::Model::Module::Target#target_architectures target_architectures}
531
+ # {Metasploit::Model::Module::Target::Architecture#architecture architectures}.
532
+ #
533
+ # @return [void]
534
+ def architectures_from_targets
535
+ actual_architecture_set = Set.new module_architectures.map(&:architecture)
536
+ expected_architecture_set = Set.new
537
+
538
+ targets.each do |module_target|
539
+ module_target.target_architectures.each do |target_architecture|
540
+ expected_architecture_set.add target_architecture.architecture
541
+ end
542
+ end
543
+
544
+ extra_architecture_set = actual_architecture_set - expected_architecture_set
545
+
546
+ unless extra_architecture_set.empty?
547
+ human_extra_architectures = human_architecture_set(extra_architecture_set)
548
+
549
+ errors.add(:architectures, :extra, extra: human_extra_architectures)
550
+ end
551
+
552
+ missing_architecture_set = expected_architecture_set - actual_architecture_set
553
+
554
+ unless missing_architecture_set.empty?
555
+ human_missing_architectures = human_architecture_set(missing_architecture_set)
556
+
557
+ errors.add(:architectures, :missing, missing: human_missing_architectures)
558
+ end
559
+ end
560
+
561
+ # Converts a Set<Metasploit::Model::Architecture> to a human readable representation including the
562
+ # {Metasploit::Model::Architecture#abbreviation}.
563
+ #
564
+ # @return [String]
565
+ def human_architecture_set(architecture_set)
566
+ abbreviations = architecture_set.map(&:abbreviation)
567
+
568
+ human_set(abbreviations)
569
+ end
570
+
571
+ # Converts a Set<Metasploit::Model::Platform> to a human-readable representation including the
572
+ # {Metasploit::Model::Platform#fully_qualified_name}.
573
+ #
574
+ # @return [String]
575
+ def human_platform_set(platform_set)
576
+ fully_qualified_names = platform_set.map(&:fully_qualified_name)
577
+
578
+ human_set(fully_qualified_names)
579
+ end
580
+
581
+ # Converts strings to a human-readable set notation.
582
+ #
583
+ # @return [String]
584
+ def human_set(strings)
585
+ sorted = strings.sort
586
+ comma_separated = sorted.join(', ')
587
+
588
+ "{#{comma_separated}}"
589
+ end
590
+
591
+ # Validates that {#module_platforms} {Metasploit::Model::Module::Platform#platform platforms} match the
592
+ # {#targets} {Metasploit::Model::Module::Target#target_platforms target_platforms}
593
+ # {Metasploit::Model::Module::Target::Platform#platform platforms}.
594
+ #
595
+ # @return [void]
596
+ def platforms_from_targets
597
+ actual_platform_set = Set.new module_platforms.map(&:platform)
598
+ expected_platform_set = Set.new
599
+
600
+ targets.each do |module_target|
601
+ module_target.target_platforms.each do |target_platform|
602
+ expected_platform_set.add target_platform.platform
603
+ end
604
+ end
605
+
606
+ extra_platform_set = actual_platform_set - expected_platform_set
607
+
608
+ unless extra_platform_set.empty?
609
+ human_extra_platforms = human_platform_set(extra_platform_set)
610
+
611
+ errors.add(:platforms, :extra, extra: human_extra_platforms)
612
+ end
613
+
614
+ missing_platform_set = expected_platform_set - actual_platform_set
615
+
616
+ unless missing_platform_set.empty?
617
+ human_missing_platforms = human_platform_set(missing_platform_set)
618
+
619
+ errors.add(:platforms, :missing, missing: human_missing_platforms)
620
+ end
621
+ end
622
+ end
623
+ end
624
+ end
625
+ end
626
+