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,209 @@
1
+ en:
2
+ metasploit:
3
+ model:
4
+ ancestors:
5
+ metasploit/model/architecture:
6
+ search:
7
+ operator:
8
+ names:
9
+ abbreviation:
10
+ help: "Abbreviation for architecture, such as x86, etc."
11
+ bits:
12
+ help: "Number of bits supported by the architecture. Certain architectures, such as those for programming languages like Ruby and PHP, do not have bits."
13
+ endianness:
14
+ help: "Whether the architecture is big or little endian. Certain architectures, such as those for programming languages like Ruby and PHP, do not have an endianness."
15
+ family:
16
+ help: "The CPU architecture family. For example x86_64 and x86 are both in the x86 family. Certain architectures, such as those for programming languages like Ruby and PHP, do not have a family."
17
+
18
+ metasploit/model/author:
19
+ search:
20
+ operator:
21
+ names:
22
+ name:
23
+ help: "Full name (first + last name) or handle of the author."
24
+
25
+ metasploit/model/authority:
26
+ search:
27
+ operator:
28
+ names:
29
+ abbreviation:
30
+ help: "Abbreviation or initialism for authority, such as CVE for 'Common Vulnerability and Exposures'."
31
+
32
+ metasploit/model/email_address:
33
+ search:
34
+ operator:
35
+ names:
36
+ domain:
37
+ help: "The domain part of the email address after the '@'."
38
+ full:
39
+ help: "The full email address <local>@<domain>"
40
+ local:
41
+ help: "The local part of the email address before the '@'."
42
+
43
+ metasploit/model/module/action:
44
+ search:
45
+ operator:
46
+ names:
47
+ name:
48
+ help: "The name of the module action."
49
+
50
+ metasploit/model/module/class:
51
+ search:
52
+ operator:
53
+ names:
54
+ full_name:
55
+ help: "<module_type>/<reference_name>"
56
+ module_type:
57
+ help: "The type of this module."
58
+ payload_type:
59
+ help: "For payload modules, the type of payload, either 'single' or 'staged'."
60
+ reference_name:
61
+ help: "The reference name relative to the module_type."
62
+
63
+ metasploit/model/module/instance:
64
+ search:
65
+ operator:
66
+ names:
67
+ app:
68
+ help: "The type of application. either client or server, which maps to stance:passive or stance:aggressive, respectively."
69
+ author:
70
+ help: "Either the author's name or email address. Maps to authors.name, email_addresses.local, and/or email_addresses.domain."
71
+ description:
72
+ help: "A long, paragraph description of what the module does."
73
+ disclosed_on:
74
+ help: "The date the vulnerability exploited by this module was disclosed to the public."
75
+ license:
76
+ help: "The name of the software license for the module's code."
77
+ name:
78
+ help: "The human readable name of the module. It can be thought of as the summary or title of the module."
79
+ os:
80
+ help: "Module OS in platforms.name or targets.name."
81
+ platform:
82
+ help: "Module platform in platforms.name or targets.name."
83
+ privileged:
84
+ help: "Whether the module requires privileged access to run."
85
+ ref:
86
+ help: "Reference to module using obsolete \"<context>-<id>\" syntax, which maps to the newer authorities.abbreviation, references.designation or references.url."
87
+ stance:
88
+ help: "Whether the module is active or passive."
89
+ text:
90
+ help: "Search most of the text fields of the module metadata. Maps to description, name, actions.name, architectures.abbreviation, platform, or ref."
91
+
92
+ metasploit/model/module/rank:
93
+ search:
94
+ operator:
95
+ names:
96
+ name:
97
+ help: "Name of the rank."
98
+ number:
99
+ help: "Numerical value of the rank. Higher numbers are better."
100
+
101
+ metasploit/model/module/target:
102
+ search:
103
+ operator:
104
+ names:
105
+ name:
106
+ help: "Name of module target."
107
+
108
+ metasploit/model/platform:
109
+ search:
110
+ operator:
111
+ names:
112
+ fully_qualified_name:
113
+ help: "Fully-qualified name of the platform."
114
+
115
+ metasploit/model/reference:
116
+ search:
117
+ operator:
118
+ names:
119
+ designation:
120
+ help: "A designation (usually a string of numbers and dashes) assigned by the reference's authority. If the reference has no authority, then only url will be set, such as for references to proof-of-concept (PoC) blog posts."
121
+ url:
122
+ help: "URL to web page with information about referenced exploit. The URL may be null if the authority is obsolete."
123
+
124
+ attributes:
125
+ metasploit/model/module/instance:
126
+ actions:
127
+ one: 'action'
128
+ other: 'actions'
129
+ module_authors:
130
+ one: 'module author'
131
+ other: 'module authors'
132
+ module_references:
133
+ one: 'module reference'
134
+ other: 'module references'
135
+ targets:
136
+ one: 'target'
137
+ other: 'targets'
138
+
139
+ errors:
140
+ messages:
141
+ boolean: "is not a boolean (false or true)."
142
+ model_invalid: "Validation failed: %{errors}"
143
+
144
+ models:
145
+ metasploit/model/module/instance:
146
+ attributes:
147
+ actions:
148
+ wrong_length: "cannot have any actions"
149
+
150
+ architectures:
151
+ extra: "has extra architectures (%{extra}) not found on targets"
152
+ missing: "is missing architectures (%{missing}) from targets"
153
+
154
+ module_architectures:
155
+ too_short: "is too short (minimum is %{count} module architectures)"
156
+ wrong_length: "cannot have any module architectures"
157
+
158
+ module_platforms:
159
+ too_short: "is too short (minimum is %{count} module platforms)"
160
+ wrong_length: "cannot have any module platforms"
161
+
162
+ module_references:
163
+ too_short: "is too short (minimum is %{count} module references)"
164
+ wrong_length: "cannot have any module references"
165
+
166
+ platforms:
167
+ extra: "has extra platforms (%{extra}) not found on targets"
168
+ missing: "is missing platforms (%{missing}) from targets"
169
+
170
+ targets:
171
+ too_short: "is too short (minimum is %{count} targets)"
172
+ wrong_length: "cannot have any targets"
173
+
174
+ metasploit/model/search/operation/date:
175
+ attributes:
176
+ value:
177
+ unparseable_date: "is not a parseable Date"
178
+
179
+ metasploit/model/search/operation/null:
180
+ attributes:
181
+ operator:
182
+ type: "is not a %{type}"
183
+
184
+ metasploit/model/search/operation/set:
185
+ attributes:
186
+ value:
187
+ inclusion: "is not part of the set (%{set})"
188
+
189
+ metasploit/model/search/operation/union:
190
+ attributes:
191
+ children:
192
+ too_short: "is too short (minimum is %{count} child)"
193
+
194
+ metasploit/model/search/operator/null:
195
+ attributes:
196
+ name:
197
+ unknown: "is unknown"
198
+
199
+ metasploit/model/search/query:
200
+ attributes:
201
+ operations:
202
+ too_short: "is too short (minimum is %{count} operation)"
203
+
204
+ search:
205
+ operator:
206
+ ancestors:
207
+ metasploit/model/search/operator/deprecated/authority:
208
+ help: "Modules with reference from the %{name} authority. Maps to `authorities.abbreviation:%{name} references.designation:<value>`."
209
+
@@ -0,0 +1,38 @@
1
+ #
2
+ # Gems
3
+ #
4
+ require 'active_model'
5
+ require 'active_support'
6
+ # not loaded by default with require 'active_support'
7
+ require 'active_support/dependencies'
8
+
9
+ #
10
+ # Project
11
+ #
12
+ require 'metasploit/model/version'
13
+
14
+ # Only include the Rails engine when using Rails. This allows the non-Rails projects, like metasploit-framework to use
15
+ # the validators by calling Metasploit::Model.require_validators.
16
+ if defined? Rails
17
+ require 'metasploit/model/engine'
18
+ end
19
+
20
+ # Top-level namespace shared between metasploit-model, metasploit-framework, and Pro.
21
+ module Metasploit
22
+ # The namespace for this gem. All code under the {Metasploit::Model} namespace is code that is shared between
23
+ # in-memory ActiveModels in metasploit-framework and database ActiveRecords in metasploit_data_models. Having a
24
+ # separate gem for this shard code outside of metasploit_data_models is necessary as metasploit_data_models is an
25
+ # optional dependency for metasploit-framework as metasploit-framework can work without a database.
26
+ module Model
27
+ require 'metasploit/model/configured'
28
+ extend Metasploit::Model::Configured
29
+
30
+ lib_metasploit_pathname = Pathname.new(__FILE__).dirname
31
+ lib_pathname = lib_metasploit_pathname.parent
32
+ configuration.root = lib_pathname.parent
33
+
34
+ configuration.autoload.relative_paths << File.join('app', 'validators')
35
+ end
36
+ end
37
+
38
+ Metasploit::Model.setup
@@ -0,0 +1,346 @@
1
+ module Metasploit
2
+ module Model
3
+ # Code shared between `Mdm::Architecture` and `Metasploit::Framework::Architecture`.
4
+ module Architecture
5
+ extend ActiveModel::Naming
6
+ extend ActiveSupport::Concern
7
+
8
+ include Metasploit::Model::Translation
9
+
10
+ #
11
+ # CONSTANTS
12
+ #
13
+
14
+ # Valid values for {#abbreviation}
15
+ ABBREVIATIONS = [
16
+ 'armbe',
17
+ 'armle',
18
+ 'cbea',
19
+ 'cbea64',
20
+ 'cmd',
21
+ 'dalvik',
22
+ 'firefox',
23
+ 'java',
24
+ 'mipsbe',
25
+ 'mipsle',
26
+ 'nodejs',
27
+ 'php',
28
+ 'ppc',
29
+ 'ppc64',
30
+ 'python',
31
+ 'ruby',
32
+ 'sparc',
33
+ 'tty',
34
+ 'x86',
35
+ 'x86_64'
36
+ ]
37
+ # Valid values for {#bits}.
38
+ BITS = [
39
+ 32,
40
+ 64
41
+ ]
42
+ # Valid values for {#endianness}.
43
+ ENDIANNESSES = [
44
+ 'big',
45
+ 'little'
46
+ ]
47
+ # Valid values for {#family}.
48
+ FAMILIES = [
49
+ 'arm',
50
+ 'cbea',
51
+ 'javascript',
52
+ 'mips',
53
+ 'ppc',
54
+ 'sparc',
55
+ 'x86'
56
+ ]
57
+ # Attributes for seeds. Ensures that in-database seeds for `Mdm::Architecture` and in-memory seeds for
58
+ # `Metasploit::Framework::Architecture` are the same.
59
+ SEED_ATTRIBUTES = [
60
+ {
61
+ :abbreviation => 'armbe',
62
+ :bits => 32,
63
+ :endianness => 'big',
64
+ :family => 'arm',
65
+ :summary => 'Little-endian ARM'
66
+ },
67
+ {
68
+ :abbreviation => 'armle',
69
+ :bits => 32,
70
+ :endianness => 'little',
71
+ :family => 'arm',
72
+ :summary => 'Big-endian ARM'
73
+ },
74
+ {
75
+ :abbreviation => 'cbea',
76
+ :bits => 32,
77
+ :endianness => 'big',
78
+ :family => 'cbea',
79
+ :summary => '32-bit Cell Broadband Engine Architecture'
80
+ },
81
+ {
82
+ :abbreviation => 'cbea64',
83
+ :bits => 64,
84
+ :endianness => 'big',
85
+ :family => 'cbea',
86
+ :summary => '64-bit Cell Broadband Engine Architecture'
87
+ },
88
+ {
89
+ :abbreviation => 'cmd',
90
+ :bits => nil,
91
+ :endianness => nil,
92
+ :family => nil,
93
+ :summary => 'Command Injection'
94
+ },
95
+ {
96
+ :abbreviation => 'dalvik',
97
+ :bits => nil,
98
+ :endianness => nil,
99
+ :family => nil,
100
+ :summary => 'Dalvik process virtual machine used in Google Android'
101
+ },
102
+ {
103
+ abbreviation: 'firefox',
104
+ bits: nil,
105
+ endianness: nil,
106
+ family: 'javascript',
107
+ summary: "Firefox's privileged javascript API"
108
+ },
109
+ {
110
+ :abbreviation => 'java',
111
+ :bits => nil,
112
+ :endianness => 'big',
113
+ :family => nil,
114
+ :summary => 'Java'
115
+ },
116
+ {
117
+ :abbreviation => 'mipsbe',
118
+ :bits => 32,
119
+ :endianness => 'big',
120
+ :family => 'mips',
121
+ :summary => 'Big-endian MIPS'
122
+ },
123
+ {
124
+ :abbreviation => 'mipsle',
125
+ :bits => 32,
126
+ :endianness => 'little',
127
+ :family => 'mips',
128
+ :summary => 'Little-endian MIPS'
129
+ },
130
+ {
131
+ abbreviation: 'nodejs',
132
+ bits: nil,
133
+ endianness: nil,
134
+ family: 'javascript',
135
+ summary: 'NodeJS'
136
+ },
137
+ {
138
+ :abbreviation => 'php',
139
+ :bits => nil,
140
+ :endianness => nil,
141
+ :family => nil,
142
+ :summary => 'PHP'
143
+ },
144
+ {
145
+ :abbreviation => 'ppc',
146
+ :bits => 32,
147
+ :endianness => 'big',
148
+ :family => 'ppc',
149
+ :summary => '32-bit Peformance Optimization With Enhanced RISC - Performance Computing'
150
+ },
151
+ {
152
+ :abbreviation => 'ppc64',
153
+ :bits => 64,
154
+ :endianness => 'big',
155
+ :family => 'ppc',
156
+ :summary => '64-bit Performance Optimization With Enhanced RISC - Performance Computing'
157
+ },
158
+ {
159
+ :abbreviation => 'python',
160
+ :bits => nil,
161
+ :endianness => nil,
162
+ :family => nil,
163
+ :summary => 'Python'
164
+ },
165
+ {
166
+ :abbreviation => 'ruby',
167
+ :bits => nil,
168
+ :endianness => nil,
169
+ :family => nil,
170
+ :summary => 'Ruby'
171
+ },
172
+ {
173
+ :abbreviation => 'sparc',
174
+ :bits => nil,
175
+ :endianness => nil,
176
+ :family => 'sparc',
177
+ :summary => 'Scalable Processor ARChitecture'
178
+ },
179
+ {
180
+ :abbreviation => 'tty',
181
+ :bits => nil,
182
+ :endianness => nil,
183
+ :family => nil,
184
+ :summary => '*nix terminal'
185
+ },
186
+ {
187
+ :abbreviation => 'x86',
188
+ :bits => 32,
189
+ :endianness => 'little',
190
+ :family => 'x86',
191
+ :summary => '32-bit x86'
192
+ },
193
+ {
194
+ :abbreviation => 'x86_64',
195
+ :bits => 64,
196
+ :endianness => 'little',
197
+ :family => 'x86',
198
+ :summary => '64-bit x86'
199
+ }
200
+ ]
201
+
202
+ included do
203
+ include ActiveModel::Validations
204
+ include Metasploit::Model::Search
205
+
206
+ #
207
+ # Search Attributes
208
+ #
209
+
210
+ search_attribute :abbreviation,
211
+ type: {
212
+ set: :string
213
+ }
214
+ search_attribute :bits,
215
+ type: {
216
+ set: :integer
217
+ }
218
+ search_attribute :endianness,
219
+ type: {
220
+ set: :string
221
+ }
222
+ search_attribute :family,
223
+ type: {
224
+ set: :string
225
+ }
226
+
227
+ #
228
+ # Validations
229
+ #
230
+
231
+ validates :abbreviation,
232
+ :inclusion => {
233
+ :in => ABBREVIATIONS
234
+ }
235
+ validates :bits,
236
+ :inclusion => {
237
+ :allow_nil => true,
238
+ :in => BITS
239
+ }
240
+ validates :endianness,
241
+ :inclusion => {
242
+ :allow_nil => true,
243
+ :in => ENDIANNESSES
244
+ }
245
+ validates :family,
246
+ :inclusion => {
247
+ :allow_nil => true,
248
+ :in => FAMILIES
249
+ }
250
+ validates :summary,
251
+ :presence => true
252
+ end
253
+
254
+ # Adds <attribute>_set methods to class.
255
+ module ClassMethods
256
+ # Set of valid values to search for `attribute`. Does not include `nil` as search syntax cannot differentiate
257
+ # '' and nil when parsing.
258
+ #
259
+ # @param attribute [Symbol] attribute name.
260
+ # @return [Set]
261
+ def self.set(attribute)
262
+ SEED_ATTRIBUTES.each_with_object(Set.new) { |attributes, set|
263
+ value = attributes.fetch(attribute)
264
+
265
+ unless value.nil?
266
+ set.add value
267
+ end
268
+ }
269
+ end
270
+
271
+ # @!method abbreviation_set
272
+ # Set of valid {Metasploit::Model::Architecture#abbreviation} for search.
273
+ #
274
+ # @return [Set<String>]
275
+ #
276
+ # @!method bits_set
277
+ # Set of valid {Metasploit::Model::Architecture#bits} for search.
278
+ #
279
+ # @return [Set<Integer>]
280
+ #
281
+ # @!method endianness_set
282
+ # Set of valid {Metasploit::Model::Architecture#endianness} for search.
283
+ #
284
+ # @return [Set<String>]
285
+ #
286
+ # @!method family_set
287
+ # Set of valid {Metasploit::Model::Architecture#family} for search.
288
+ #
289
+ # @return [Set<String>]
290
+ [:abbreviation, :bits, :endianness, :family].each do |attribute|
291
+ # calculate external to method so it is only calculated once
292
+ set = self.set(attribute)
293
+
294
+ define_method("#{attribute}_set") do
295
+ set
296
+ end
297
+ end
298
+ end
299
+
300
+ #
301
+ # Associations
302
+ #
303
+
304
+ # @!attribute [r] module_instances
305
+ # {Metasploit::Model::Module::Instance Modules} that have this {Metasploit::Model::Module::Architecture} as a
306
+ # {Metasploit::Model::Module::Instance#architectures support architecture}.
307
+ #
308
+ # @return [Array<Metasploit::Model::Module::Instance>]
309
+
310
+ #
311
+ # Attributes
312
+ #
313
+
314
+ # @!attribute [rw] abbreviation
315
+ # Abbreviation used for the architecture. Will match ARCH constants in metasploit-framework.
316
+ #
317
+ # @return [String]
318
+
319
+ # @!attribute [rw] bits
320
+ # Number of bits supported by this architecture.
321
+ #
322
+ # @return [32] if 32-bit
323
+ # @return [64] if 64-bit
324
+ # @return [nil] if bits aren't applicable, such as for non-CPU architectures like ruby, etc.
325
+
326
+ # @!attribute [rw] endianness
327
+ # The endianness of the architecture.
328
+ #
329
+ # @return ['big'] if big endian
330
+ # @return ['little'] if little endian
331
+ # @return [nil] if endianness is not applicable, such as for software architectures like tty.
332
+
333
+ # @!attribute [rw] family
334
+ # The CPU architecture family.
335
+ #
336
+ # @return [String] if a CPU architecture.
337
+ # @return [nil] if not a CPU architecture.
338
+
339
+ # @!attribute [rw] summary
340
+ # Sentence length summary of architecture. Usually an expansion of the abbreviation or initialism in the
341
+ # {#abbreviation} and the {#bits} and {#endianness} in prose.
342
+ #
343
+ # @return [String]
344
+ end
345
+ end
346
+ end