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,34 @@
1
+ begin
2
+ require 'rails'
3
+ # Metasploit::Model.configuration.autoload.eager_load! will load this file, but if rails is not available, it should not
4
+ # break the caller of eager_load! (i.e. metasploit-framework)
5
+ rescue LoadError => error
6
+ warn "rails could not be loaded, so Metasploit::Model::Engine will not be defined: #{error}"
7
+ else
8
+ module Metasploit
9
+ module Model
10
+ # Rails engine for Metasploit::Model. Will automatically be used if `Rails` is defined when
11
+ # 'metasploit/model' is required, as should be the case in any normal Rails application Gemfile where
12
+ # gem 'rails' is the first gem in the Gemfile.
13
+ class Engine < Rails::Engine
14
+ # @see http://viget.com/extend/rails-engine-testing-with-rspec-capybara-and-factorygirl
15
+ config.generators do |g|
16
+ g.assets false
17
+ g.fixture_replacement :factory_girl, :dir => 'spec/factories'
18
+ g.helper false
19
+ g.test_framework :rspec, :fixture => false
20
+ end
21
+
22
+ initializer 'metasploit-model.prepend_factory_path', :after => 'factory_girl.set_factory_paths' do
23
+ if defined? FactoryGirl
24
+ relative_definition_file_path = config.generators.options[:factory_girl][:dir]
25
+ definition_file_path = root.join(relative_definition_file_path)
26
+
27
+ # unshift so that dependent gems can modify metasploit-model's factories
28
+ FactoryGirl.definition_file_paths.unshift definition_file_path
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,7 @@
1
+ module Metasploit
2
+ module Model
3
+ # Base class for error hierarchy for {Metasploit::Model}
4
+ class Error < StandardError
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,49 @@
1
+ if RUBY_PLATFORM =~ /java/
2
+ require 'java'
3
+ end
4
+
5
+ module Metasploit
6
+ module Model
7
+ # Re-implement methods on ruby's File that are buggy in JRuby so that the platform specific logic can be in this
8
+ # module instead of everywhere these methods are used.
9
+ module File
10
+ if RUBY_PLATFORM =~ /java/
11
+ # On JRuby, File.realpath does not resolve symlinks, so need to drop to Java to get the real path.
12
+ #
13
+ # @param path [String] a path that may contain `'.'`, `'..'`, or symlinks
14
+ # @return [String] canonical path
15
+ # @see https://github.com/jruby/jruby/issues/538
16
+ def self.realpath(path)
17
+ file = java.io.File.new(path)
18
+
19
+ file.canonical_path
20
+ end
21
+ end
22
+
23
+ class << self
24
+ # Delegates to `::File` if `::File` supports the method when {Metasploit::Model::File} does not implement an
25
+ # override to fix different platform incompatibilities.
26
+ #
27
+ # @param method_name [Symbol] name of method.
28
+ # @param args [Array] arguments passed to method with name `method_name`.
29
+ # @param block [Proc] block to pass after `args` to method with name `method_name`.
30
+ def method_missing(method_name, *args, &block)
31
+ if ::File.respond_to?(method_name)
32
+ ::File.public_send(method_name, *args, &block)
33
+ else
34
+ super
35
+ end
36
+ end
37
+
38
+ # Whether this module or `::File` responds to `method_name`.
39
+ #
40
+ # @param method_name [Symbol] name of method.
41
+ # @param include_private [Boolean] whether to include private methods.
42
+ # @return [Boolean]
43
+ def respond_to?(method_name, include_private=false)
44
+ ::File.respond_to?(method_name, include_private) || super
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,17 @@
1
+ module Metasploit
2
+ module Model
3
+ # Error raised if a {Metasploit::Model} ActiveModel is invalid.
4
+ class Invalid < Metasploit::Model::Error
5
+ def initialize(model)
6
+ @model = model
7
+
8
+ errors = @model.errors.full_messages.join(', ')
9
+ # Must be called model_invalid so it doesn't alias errors.messages.invalid
10
+ translated_message = ::I18n.translate('metasploit.model.errors.messages.model_invalid', :errors => errors)
11
+ super(translated_message)
12
+ end
13
+
14
+ attr_reader :model
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,8 @@
1
+ module Metasploit
2
+ module Model
3
+ # Namespace that maps to `Mdm::Module` and `Metasploit::Framework::Module` and contains constants and mixins to
4
+ # DRY the implementation of the in-memory and in-database models in those namespaces.
5
+ module Module
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,58 @@
1
+ module Metasploit
2
+ module Model
3
+ module Module
4
+ # Code shared between `Mdm::Module::Action` and `Metasploit::Framework::Module::Action`.
5
+ module Action
6
+ extend ActiveModel::Naming
7
+ extend ActiveSupport::Concern
8
+
9
+ include Metasploit::Model::Translation
10
+
11
+ included do
12
+ include ActiveModel::MassAssignmentSecurity
13
+ include ActiveModel::Validations
14
+ include Metasploit::Model::Search
15
+
16
+ #
17
+ # Mass Assignment Security
18
+ #
19
+
20
+ attr_accessible :name
21
+
22
+ #
23
+ # Search Attributes
24
+ #
25
+
26
+ search_attribute :name, :type => :string
27
+
28
+ #
29
+ # Validations
30
+ #
31
+
32
+ validates :module_instance,
33
+ :presence => true
34
+ validates :name,
35
+ :presence => true
36
+ end
37
+
38
+ #
39
+ # Associations
40
+ #
41
+
42
+ # @!attribute [rw] module_instance
43
+ # Module that has this action.
44
+ #
45
+ # @return [Metasploit::Model::Module::Instance]
46
+
47
+ #
48
+ # Attributes
49
+ #
50
+
51
+ # @!attribute [rw] name
52
+ # The name of this action.
53
+ #
54
+ # @return [String]
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,494 @@
1
+ module Metasploit
2
+ module Model
3
+ module Module
4
+ # Code shared between `Mdm::Module::Ancestor` and `Metasploit::Framework::Module::Ancestor`.
5
+ module Ancestor
6
+ extend ActiveModel::Naming
7
+ extend ActiveSupport::Concern
8
+
9
+ include Metasploit::Model::Translation
10
+
11
+ #
12
+ # CONSTANTS
13
+ #
14
+
15
+ # The directory for a given {#module_type} is a not always the pluralization of #module_type, so this maps the
16
+ # #module_type to the type directory that is used to generate the #real_path from the #module_type and
17
+ # #reference_name.
18
+ DIRECTORY_BY_MODULE_TYPE = {
19
+ Metasploit::Model::Module::Type::AUX => Metasploit::Model::Module::Type::AUX,
20
+ Metasploit::Model::Module::Type::ENCODER => Metasploit::Model::Module::Type::ENCODER.pluralize,
21
+ Metasploit::Model::Module::Type::EXPLOIT => Metasploit::Model::Module::Type::EXPLOIT.pluralize,
22
+ Metasploit::Model::Module::Type::NOP => Metasploit::Model::Module::Type::NOP.pluralize,
23
+ Metasploit::Model::Module::Type::PAYLOAD => Metasploit::Model::Module::Type::PAYLOAD.pluralize,
24
+ Metasploit::Model::Module::Type::POST => Metasploit::Model::Module::Type::POST
25
+ }
26
+
27
+ # File extension used for metasploit modules.
28
+ EXTENSION = '.rb'
29
+
30
+ # The {#payload_type payload types} that require {#handler_type}.
31
+ HANDLED_TYPES = [
32
+ 'single',
33
+ 'stager'
34
+ ]
35
+
36
+ # Maps directory to {#module_type} for converting a {#real_path} into a {#module_type} and {#reference_name}
37
+ MODULE_TYPE_BY_DIRECTORY = DIRECTORY_BY_MODULE_TYPE.invert
38
+
39
+ # Valid values for {#payload_type} if {#payload?} is `true`.
40
+ PAYLOAD_TYPES = [
41
+ 'single',
42
+ 'stage',
43
+ 'stager'
44
+ ]
45
+
46
+ # Regexp to keep '\' out of reference names
47
+ REFERENCE_NAME_REGEXP = /\A[\-0-9A-Z_a-z]+(?:\/[\-0-9A-Z_a-z]+)*\Z/
48
+
49
+ # Separator used to join names in {#reference_name}. It is always '/', even on Windows, where '\' is a valid
50
+ # file separator.
51
+ REFERENCE_NAME_SEPARATOR = '/'
52
+
53
+ # Regular expression matching a full SHA-1 hex digest.
54
+ SHA1_HEX_DIGEST_REGEXP = /\A[0-9a-z]{40}\Z/
55
+
56
+ included do
57
+ include ActiveModel::MassAssignmentSecurity
58
+ include ActiveModel::Validations
59
+ include ActiveModel::Validations::Callbacks
60
+ include Metasploit::Model::Derivation
61
+ include Metasploit::Model::Derivation::FullName
62
+ include Metasploit::Model::RealPathname
63
+
64
+ #
65
+ # Derivations
66
+ #
67
+
68
+ #
69
+ # Module Cache Construction derivation of {#module_type} and {#reference_name} from {#real_path} and
70
+ # {Metasploit::Model::Module::Path#real_path}.
71
+ #
72
+
73
+ derives :module_type, :validate => false
74
+ derives :reference_name, :validate => false
75
+
76
+ #
77
+ # Normal derivation from setting {#module_type} and {#reference_name}
78
+ #
79
+
80
+ derives :full_name, :validate => true
81
+ derives :payload_type, :validate => true
82
+ derives :real_path, :validate => true
83
+
84
+ # Don't validate attributes that require accessing file system to derive value
85
+ derives :real_path_modified_at, :validate => false
86
+ derives :real_path_sha1_hex_digest, :validate => false
87
+
88
+ #
89
+ # Mass Assignment Security
90
+ #
91
+
92
+ # full_name is NOT accessible since it's derived and must match {#derived_full_name} so there's no reason for a
93
+ # user to set it.
94
+ # handler_type is accessible because it's needed to derive {Metasploit::Model::Module::Class#reference_name}.
95
+ attr_accessible :handler_type
96
+ # module_type is accessible because it's needed to derive {#full_name} and {#real_path}.
97
+ attr_accessible :module_type
98
+ # payload_type is NOT accessible since it's derived and must match {#derived_payload_type}.
99
+ # reference_name is accessible because it's needed to derive {#full_name} and {#real_path}.
100
+ attr_accessible :reference_name
101
+ # real_path is accessible since {#module_type} and {#reference_name} can be derived from real_path.
102
+ attr_accessible :real_path
103
+ # real_path_modified_at is NOT accessible since it's derived
104
+ # real_path_sha1_hex_digest is NOT accessible since it's derived
105
+
106
+ #
107
+ # Validations
108
+ #
109
+
110
+ validates :handler_type,
111
+ :unless => :loading_context?,
112
+ :nil => {
113
+ :unless => :handled?
114
+ },
115
+ :presence => {
116
+ :if => :handled?
117
+ }
118
+ validates :module_type,
119
+ :inclusion => {
120
+ :in => Metasploit::Model::Module::Type::ALL
121
+ }
122
+ validates :parent_path,
123
+ :presence => true
124
+ validates :payload_type,
125
+ :inclusion => {
126
+ :if => :payload?,
127
+ :in => PAYLOAD_TYPES
128
+ },
129
+ :nil => {
130
+ :unless => :payload?
131
+ }
132
+ validates :real_path_modified_at,
133
+ :presence => true
134
+ validates :real_path_sha1_hex_digest,
135
+ :format => {
136
+ :with => SHA1_HEX_DIGEST_REGEXP
137
+ }
138
+ validates :reference_name,
139
+ :format => {
140
+ :with => REFERENCE_NAME_REGEXP
141
+ }
142
+ end
143
+
144
+ # Defines class methods added to classes that include {Metasploit::Model::Module::Ancestor}.
145
+ module ClassMethods
146
+ # Returns whether {#handler_type} is required or must be `nil` for the given payload_type.
147
+ #
148
+ # @param options [Hash{Symbol => String,nil}]
149
+ # @option options [String, nil] module_type (nil) `nil` or an element of
150
+ # `Metasploit::Model::Module::Ancestor::MODULE_TYPES`.
151
+ # @option options [String, nil] payload_type (nil) `nil` or an element of {PAYLOAD_TYPES}.
152
+ # @return [true] if {#handler_type} must be present.
153
+ # @return [false] if {#handler_type} must be `nil`.
154
+ def handled?(options={})
155
+ options.assert_valid_keys(:module_type, :payload_type)
156
+
157
+ handled = false
158
+ module_type = options[:module_type]
159
+ payload_type = options[:payload_type]
160
+
161
+ if module_type == 'payload' and HANDLED_TYPES.include? payload_type
162
+ handled = true
163
+ end
164
+
165
+ handled
166
+ end
167
+ end
168
+
169
+ #
170
+ # Associations
171
+ #
172
+
173
+ # @!attribute [rw] parent_path
174
+ # Path under which this ancestor exists on-disk.
175
+ #
176
+ # @return [Metasploit::Model::Module::Path]
177
+
178
+ #
179
+ # Attributes
180
+ #
181
+
182
+ # @!attribute [rw] full_name
183
+ # The full name of the module. The full name is `"#{module_type}/#{reference_name}"`.
184
+ #
185
+ # @return [String]
186
+
187
+ # @!attribute [rw] handler_type
188
+ # The handler type (in the case of singles) or (in the case of stagers) the handler type alias. Handler type is
189
+ # appended to the end of the single's or stage's {#reference_name} to get the
190
+ # {Metasploit::Model::Module::Class#reference_name}.
191
+ #
192
+ # @return [String] if {Metasploit::Model::Module::Ancestor#handled?} is `true`.
193
+ # @return [nil] if {Metasploit::Model::Module::Ancestor#handled?} is `false`.
194
+
195
+ # @!attribute [rw] module_type
196
+ # The type of the module. This would be called #type, but #type is reserved for ActiveRecord's single table
197
+ # inheritance.
198
+ #
199
+ # @return [String] key in {Metasploit::Model::Module::Ancestor::DIRECTORY_BY_MODULE_TYPE}.
200
+
201
+ # @!attribute [rw] payload_type
202
+ # For payload modules, the type of payload, either 'single', 'stage', or 'stager'.
203
+ #
204
+ # @return ['single', 'stage', 'stager'] if `Metasploit::Model::Module::Ancestor#payload?` is `true`.
205
+ # @return [nil] if `Metasploit::Model::Module::Ancestor#payload?` is `false`
206
+ # @see Metasploit::Model::Module::Ancestor::PAYLOAD_TYPES
207
+
208
+ # @!attribute [rw] real_path
209
+ # The real (absolute) path to module file on-disk.
210
+ #
211
+ # @return [String]
212
+
213
+ # @!attribute [rw] real_path_modified_at
214
+ # The modification time of the module {#real_path file on-disk}.
215
+ #
216
+ # @return [DateTime]
217
+
218
+ # @!attribute [rw] real_path_sha1_hex_digest
219
+ # The SHA1 hexadecimal digest of contents of the file at {#real_path}. Stored as a string because postgres does not
220
+ # have support for a 160 bit numerical type and the hexdigest format is more recognizable when using SQL directly.
221
+ #
222
+ # @see Digest::SHA1#hexdigest
223
+ # @return [String]
224
+
225
+ # @!attribute [rw] reference_name
226
+ # The reference name of the module. The name of the module under its {#module_type type}.
227
+ #
228
+ # @return [String]
229
+
230
+ #
231
+ # Instance Methods
232
+ #
233
+
234
+ # The contents of {#real_path}.
235
+ #
236
+ # @return [String] contents of file at {#real_path}.
237
+ # @return [nil] if {#real_path} is `nil`.
238
+ # @return [nil] if {#real_path} does not exist on-disk.
239
+ def contents
240
+ contents = nil
241
+
242
+ if real_path
243
+ # rescue around both File calls since file could be deleted before size or after size and before read
244
+ begin
245
+ size = File.size(real_path)
246
+ # Specify full size of file for faster read on Windows (less chance of context switching mid-read).
247
+ # Open in binary mode in Windows to handle non-text content embedded in file.
248
+ contents = File.read(real_path, size, 0, mode: 'rb')
249
+ rescue Errno::ENOENT
250
+ contents = nil
251
+ end
252
+ end
253
+
254
+ contents
255
+ end
256
+
257
+ # Derives {#module_type} from {#real_path} and {Metasploit::Model::Module::Path#real_path}.
258
+ #
259
+ # @return [String]
260
+ # @return [nil] if {#real_path} is `nil`
261
+ # @return [nil] if {#relative_file_names} does not start with a module type directory.
262
+ def derived_module_type
263
+ module_type_directory = relative_file_names.first
264
+ derived = MODULE_TYPE_BY_DIRECTORY[module_type_directory]
265
+
266
+ derived
267
+ end
268
+
269
+ # Derives {#payload_type} from {#reference_name}.
270
+ #
271
+ # @return [String]
272
+ # @return [nil] if {#payload_type_directory} is `nil`
273
+ def derived_payload_type
274
+ derived = nil
275
+ directory = payload_type_directory
276
+
277
+ if directory
278
+ derived = directory.singularize
279
+ end
280
+
281
+ derived
282
+ end
283
+
284
+ # Derives {#real_path} by combining {Metasploit::Model::Module::Path#real_path parent_path.real_path},
285
+ # {#module_type_directory}, and {#reference_path} in the same way the module loader does in
286
+ # metasploit-framework.
287
+ #
288
+ # @return [String] the real path to the file holding the ruby Module or ruby Class represented by this ancestor.
289
+ # @return [nil] if {#parent_path} is `nil`.
290
+ # @return [nil] if {Metasploit::Model::Module::Path#real_path parent_path.real_path} is `nil`.
291
+ # @return [nil] if {#module_type_directory} is `nil`.
292
+ # @return [nil] if {#reference_name} is `nil`.
293
+ def derived_real_path
294
+ derived_real_path = nil
295
+
296
+ if parent_path and parent_path.real_path and module_type_directory and reference_path
297
+ derived_real_path = File.join(
298
+ parent_path.real_path,
299
+ module_type_directory,
300
+ reference_path
301
+ )
302
+ end
303
+
304
+ derived_real_path
305
+ end
306
+
307
+ # Derives {#real_path_modified_at} by getting the modification time of the file on-disk.
308
+ #
309
+ # @return [Time] modification time of {#real_path} if {#real_path} exists on disk and modification time can be
310
+ # queried by user.
311
+ # @return [nil] if {#real_path} does not exist or user cannot query the file's modification time.
312
+ def derived_real_path_modified_at
313
+ real_path_string = real_path.to_s
314
+
315
+ begin
316
+ mtime = File.mtime(real_path_string)
317
+ rescue Errno::ENOENT
318
+ nil
319
+ else
320
+ mtime.utc
321
+ end
322
+ end
323
+
324
+ # Derives {#real_path_sha1_hex_digest} by running the contents of {#real_path} through Digest::SHA1.hexdigest.
325
+ #
326
+ # @return [String] 40 character SHA1 hex digest if {#real_path} can be read.
327
+ # @return [nil] if {#real_path} cannot be read.
328
+ def derived_real_path_sha1_hex_digest
329
+ begin
330
+ sha1 = Digest::SHA1.file(real_path.to_s)
331
+ rescue Errno::ENOENT
332
+ hex_digest = nil
333
+ else
334
+ hex_digest = sha1.hexdigest
335
+ end
336
+
337
+ hex_digest
338
+ end
339
+
340
+ # Derives {#reference_name} from {#real_path} and {Metasploit::Model::Module::Path#real_path}.
341
+ #
342
+ # @return [String]
343
+ # @return [nil] if {#real_path} is `nil`.
344
+ def derived_reference_name
345
+ derived = nil
346
+ reference_name_file_names = relative_file_names.drop(1)
347
+ reference_name_base_name = reference_name_file_names[-1]
348
+
349
+ if reference_name_base_name
350
+ if File.extname(reference_name_base_name) == EXTENSION
351
+ reference_name_file_names[-1] = File.basename(reference_name_base_name, EXTENSION)
352
+ derived = reference_name_file_names.join(REFERENCE_NAME_SEPARATOR)
353
+ end
354
+ end
355
+
356
+ derived
357
+ end
358
+
359
+ # Returns whether {#handler_type} is required or must be `nil`.
360
+ #
361
+ # @return (see handled?)
362
+ # @see handled?
363
+ def handled?
364
+ self.class.handled?(
365
+ :module_type => module_type,
366
+ :payload_type => payload_type
367
+ )
368
+ end
369
+
370
+ # The directory for {#module_type} under {Metasploit::Model::Module::Path parent_path.real_path}.
371
+ #
372
+ # @return [String]
373
+ # @see Metasploit::Model::Module::Ancestor::DIRECTORY_BY_MODULE_TYPE
374
+ def module_type_directory
375
+ Metasploit::Model::Module::Ancestor::DIRECTORY_BY_MODULE_TYPE[module_type]
376
+ end
377
+
378
+ # Return whether this forms part of a payload (either a single, stage, or stager).
379
+ #
380
+ # @return [true] if {#module_type} == 'payload'
381
+ # @return [false] if {#module_type} != 'payload'
382
+ def payload?
383
+ if module_type == Metasploit::Model::Module::Type::PAYLOAD
384
+ true
385
+ else
386
+ false
387
+ end
388
+ end
389
+
390
+ # The name used to forming the {Metasploit::Model::Module::Class#reference_name} for payloads.
391
+ #
392
+ # @return [String] The {#reference_name} without the {#payload_type_directory} if {#payload_type} is `'single'`
393
+ # or `'stage'`
394
+ # @return [String] The {#handler_type} if {#payload_type} is `'stager'`
395
+ # @return [nil] if {#module_type} is not `'payload'`
396
+ def payload_name
397
+ payload_name = nil
398
+
399
+ if module_type == Metasploit::Model::Module::Type::PAYLOAD
400
+ case payload_type
401
+ when 'single', 'stage'
402
+ if reference_name && payload_type_directory
403
+ escaped_payload_type_directory = Regexp.escape(payload_type_directory)
404
+ payload_type_directory_regexp = /^#{escaped_payload_type_directory}\//
405
+ payload_name = reference_name.gsub(payload_type_directory_regexp, '')
406
+ end
407
+ when 'stager'
408
+ payload_name = handler_type
409
+ end
410
+ end
411
+
412
+ payload_name
413
+ end
414
+
415
+ # The directory for {#payload_type} under {#module_type_directory} in {#real_path}.
416
+ #
417
+ # @return [String] first directory in reference_name
418
+ # @return [nil] if {#payload?} is `false`.
419
+ # @return [nil] if {#reference_name} is `nil`.
420
+ def payload_type_directory
421
+ directory = nil
422
+
423
+ if payload? and reference_name
424
+ head, _tail = reference_name.split(REFERENCE_NAME_SEPARATOR, 2)
425
+ directory = head
426
+ end
427
+
428
+ directory
429
+ end
430
+
431
+ # File names on {#relative_pathname}.
432
+ #
433
+ # @return [Enumerator<String>]
434
+ def relative_file_names
435
+ relative_pathname = self.relative_pathname
436
+
437
+ if relative_pathname
438
+ relative_pathname.each_filename
439
+ else
440
+ # empty enumerator
441
+ Enumerator.new { }
442
+ end
443
+ end
444
+
445
+ # {#real_path} relative to {Metasploit::Model::Module::Path#real_path}
446
+ #
447
+ # @return [Pathname]
448
+ def relative_pathname
449
+ relative_pathname = nil
450
+ real_pathname = self.real_pathname
451
+
452
+ if real_pathname
453
+ parent_path = self.parent_path
454
+
455
+ if parent_path
456
+ parent_path_real_pathname = parent_path.real_pathname
457
+
458
+ if parent_path_real_pathname
459
+ relative_pathname = real_pathname.relative_path_from parent_path_real_pathname
460
+ end
461
+ end
462
+ end
463
+
464
+ relative_pathname
465
+ end
466
+
467
+ # The path relative to the {#module_type_directory} under the {Metasploit::Model::Module::Path
468
+ # parent_path.real_path}, including the file {EXTENSION extension}.
469
+ #
470
+ # @return [String] {#reference_name} + {EXTENSION}
471
+ # @return [nil] if {#reference_name} is `nil`.
472
+ def reference_path
473
+ path = nil
474
+
475
+ if reference_name
476
+ path = "#{reference_name}#{EXTENSION}"
477
+ end
478
+
479
+ path
480
+ end
481
+
482
+ private
483
+
484
+ # Whether this ancestor is being validated for loading.
485
+ #
486
+ # @return [true] if `#validation_context` is `:loading`
487
+ # @return [false] otherwise
488
+ def loading_context?
489
+ validation_context == :loading
490
+ end
491
+ end
492
+ end
493
+ end
494
+ end