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.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +27 -0
- data/.rspec +4 -0
- data/.simplecov +38 -0
- data/.travis.yml +6 -0
- data/.yardopts +5 -0
- data/Gemfile +43 -0
- data/LICENSE +27 -0
- data/README.md +33 -0
- data/Rakefile +52 -0
- data/app/models/metasploit/model/association/reflection.rb +46 -0
- data/app/models/metasploit/model/module/ancestor/spec/template.rb +125 -0
- data/app/models/metasploit/model/module/class/spec/template.rb +92 -0
- data/app/models/metasploit/model/module/instance/spec/template.rb +97 -0
- data/app/models/metasploit/model/search/group/base.rb +21 -0
- data/app/models/metasploit/model/search/group/intersection.rb +4 -0
- data/app/models/metasploit/model/search/group/union.rb +4 -0
- data/app/models/metasploit/model/search/operation/base.rb +39 -0
- data/app/models/metasploit/model/search/operation/boolean.rb +36 -0
- data/app/models/metasploit/model/search/operation/date.rb +37 -0
- data/app/models/metasploit/model/search/operation/integer.rb +14 -0
- data/app/models/metasploit/model/search/operation/null.rb +26 -0
- data/app/models/metasploit/model/search/operation/set.rb +34 -0
- data/app/models/metasploit/model/search/operation/set/integer.rb +5 -0
- data/app/models/metasploit/model/search/operation/set/string.rb +5 -0
- data/app/models/metasploit/model/search/operation/string.rb +11 -0
- data/app/models/metasploit/model/search/operation/union.rb +59 -0
- data/app/models/metasploit/model/search/operator/association.rb +43 -0
- data/app/models/metasploit/model/search/operator/attribute.rb +60 -0
- data/app/models/metasploit/model/search/operator/base.rb +34 -0
- data/app/models/metasploit/model/search/operator/delegation.rb +40 -0
- data/app/models/metasploit/model/search/operator/deprecated/app.rb +27 -0
- data/app/models/metasploit/model/search/operator/deprecated/author.rb +33 -0
- data/app/models/metasploit/model/search/operator/deprecated/authority.rb +43 -0
- data/app/models/metasploit/model/search/operator/deprecated/platform.rb +45 -0
- data/app/models/metasploit/model/search/operator/deprecated/ref.rb +50 -0
- data/app/models/metasploit/model/search/operator/deprecated/text.rb +32 -0
- data/app/models/metasploit/model/search/operator/null.rb +44 -0
- data/app/models/metasploit/model/search/operator/single.rb +98 -0
- data/app/models/metasploit/model/search/operator/union.rb +33 -0
- data/app/models/metasploit/model/search/query.rb +171 -0
- data/app/models/metasploit/model/spec/template.rb +273 -0
- data/app/models/metasploit/model/visitation/visitor.rb +69 -0
- data/app/validators/derivation_validator.rb +17 -0
- data/app/validators/dynamic_length_validator.rb +45 -0
- data/app/validators/ip_format_validator.rb +31 -0
- data/app/validators/nil_validator.rb +16 -0
- data/app/validators/parameters_validator.rb +147 -0
- data/app/validators/password_is_strong_validator.rb +115 -0
- data/config/locales/en.yml +209 -0
- data/lib/metasploit/model.rb +38 -0
- data/lib/metasploit/model/architecture.rb +346 -0
- data/lib/metasploit/model/association.rb +49 -0
- data/lib/metasploit/model/association/error.rb +40 -0
- data/lib/metasploit/model/author.rb +58 -0
- data/lib/metasploit/model/authority.rb +134 -0
- data/lib/metasploit/model/authority/bid.rb +10 -0
- data/lib/metasploit/model/authority/cve.rb +10 -0
- data/lib/metasploit/model/authority/msb.rb +10 -0
- data/lib/metasploit/model/authority/osvdb.rb +10 -0
- data/lib/metasploit/model/authority/pmasa.rb +10 -0
- data/lib/metasploit/model/authority/secunia.rb +10 -0
- data/lib/metasploit/model/authority/us_cert_vu.rb +10 -0
- data/lib/metasploit/model/authority/waraxe.rb +31 -0
- data/lib/metasploit/model/authority/zdi.rb +10 -0
- data/lib/metasploit/model/base.rb +25 -0
- data/lib/metasploit/model/configuration.rb +72 -0
- data/lib/metasploit/model/configuration/autoload.rb +109 -0
- data/lib/metasploit/model/configuration/child.rb +12 -0
- data/lib/metasploit/model/configuration/error.rb +4 -0
- data/lib/metasploit/model/configuration/i18n.rb +54 -0
- data/lib/metasploit/model/configuration/parent.rb +50 -0
- data/lib/metasploit/model/configured.rb +46 -0
- data/lib/metasploit/model/derivation.rb +110 -0
- data/lib/metasploit/model/derivation/full_name.rb +25 -0
- data/lib/metasploit/model/email_address.rb +128 -0
- data/lib/metasploit/model/engine.rb +34 -0
- data/lib/metasploit/model/error.rb +7 -0
- data/lib/metasploit/model/file.rb +49 -0
- data/lib/metasploit/model/invalid.rb +17 -0
- data/lib/metasploit/model/module.rb +8 -0
- data/lib/metasploit/model/module/action.rb +58 -0
- data/lib/metasploit/model/module/ancestor.rb +494 -0
- data/lib/metasploit/model/module/architecture.rb +40 -0
- data/lib/metasploit/model/module/author.rb +47 -0
- data/lib/metasploit/model/module/class.rb +406 -0
- data/lib/metasploit/model/module/handler.rb +35 -0
- data/lib/metasploit/model/module/instance.rb +626 -0
- data/lib/metasploit/model/module/path.rb +165 -0
- data/lib/metasploit/model/module/platform.rb +38 -0
- data/lib/metasploit/model/module/rank.rb +91 -0
- data/lib/metasploit/model/module/reference.rb +38 -0
- data/lib/metasploit/model/module/stance.rb +22 -0
- data/lib/metasploit/model/module/target.rb +80 -0
- data/lib/metasploit/model/module/target/architecture.rb +42 -0
- data/lib/metasploit/model/module/target/platform.rb +42 -0
- data/lib/metasploit/model/module/type.rb +44 -0
- data/lib/metasploit/model/nilify_blanks.rb +53 -0
- data/lib/metasploit/model/platform.rb +250 -0
- data/lib/metasploit/model/real_pathname.rb +18 -0
- data/lib/metasploit/model/reference.rb +108 -0
- data/lib/metasploit/model/search.rb +63 -0
- data/lib/metasploit/model/search/association.rb +32 -0
- data/lib/metasploit/model/search/attribute.rb +51 -0
- data/lib/metasploit/model/search/operation.rb +31 -0
- data/lib/metasploit/model/search/operation/integer/value.rb +33 -0
- data/lib/metasploit/model/search/operation/string/value.rb +14 -0
- data/lib/metasploit/model/search/operator.rb +10 -0
- data/lib/metasploit/model/search/operator/help.rb +47 -0
- data/lib/metasploit/model/search/with.rb +40 -0
- data/lib/metasploit/model/spec.rb +140 -0
- data/lib/metasploit/model/spec/error.rb +9 -0
- data/lib/metasploit/model/spec/i18n_exception_handler.rb +19 -0
- data/lib/metasploit/model/spec/pathname_collision.rb +28 -0
- data/lib/metasploit/model/spec/template/write.rb +42 -0
- data/lib/metasploit/model/spec/temporary_pathname.rb +59 -0
- data/lib/metasploit/model/translation.rb +31 -0
- data/lib/metasploit/model/version.rb +31 -0
- data/lib/metasploit/model/visitation.rb +9 -0
- data/lib/metasploit/model/visitation/visit.rb +103 -0
- data/lib/tasks/yard.rake +30 -0
- data/metasploit-model.gemspec +39 -0
- data/script/rails +9 -0
- data/spec/app/models/metasploit/model/association/reflection_spec.rb +48 -0
- data/spec/app/models/metasploit/model/module/ancestor/spec/template_spec.rb +174 -0
- data/spec/app/models/metasploit/model/module/class/spec/template_spec.rb +222 -0
- data/spec/app/models/metasploit/model/module/instance/spec/template_spec.rb +201 -0
- data/spec/app/models/metasploit/model/search/group/base_spec.rb +5 -0
- data/spec/app/models/metasploit/model/search/group/intersection_spec.rb +5 -0
- data/spec/app/models/metasploit/model/search/group/union_spec.rb +5 -0
- data/spec/app/models/metasploit/model/search/operation/base_spec.rb +70 -0
- data/spec/app/models/metasploit/model/search/operation/boolean_spec.rb +56 -0
- data/spec/app/models/metasploit/model/search/operation/date_spec.rb +89 -0
- data/spec/app/models/metasploit/model/search/operation/integer_spec.rb +9 -0
- data/spec/app/models/metasploit/model/search/operation/null_spec.rb +64 -0
- data/spec/app/models/metasploit/model/search/operation/set/integer_spec.rb +7 -0
- data/spec/app/models/metasploit/model/search/operation/set/string_spec.rb +7 -0
- data/spec/app/models/metasploit/model/search/operation/set_spec.rb +126 -0
- data/spec/app/models/metasploit/model/search/operation/string_spec.rb +9 -0
- data/spec/app/models/metasploit/model/search/operation/union_spec.rb +124 -0
- data/spec/app/models/metasploit/model/search/operator/association_spec.rb +108 -0
- data/spec/app/models/metasploit/model/search/operator/attribute_spec.rb +104 -0
- data/spec/app/models/metasploit/model/search/operator/base_spec.rb +34 -0
- data/spec/app/models/metasploit/model/search/operator/delegation_spec.rb +108 -0
- data/spec/app/models/metasploit/model/search/operator/deprecated/app_spec.rb +62 -0
- data/spec/app/models/metasploit/model/search/operator/deprecated/author_spec.rb +161 -0
- data/spec/app/models/metasploit/model/search/operator/deprecated/authority_spec.rb +123 -0
- data/spec/app/models/metasploit/model/search/operator/deprecated/platform_spec.rb +112 -0
- data/spec/app/models/metasploit/model/search/operator/deprecated/ref_spec.rb +327 -0
- data/spec/app/models/metasploit/model/search/operator/deprecated/text_spec.rb +357 -0
- data/spec/app/models/metasploit/model/search/operator/null_spec.rb +41 -0
- data/spec/app/models/metasploit/model/search/operator/single_spec.rb +327 -0
- data/spec/app/models/metasploit/model/search/operator/union_spec.rb +92 -0
- data/spec/app/models/metasploit/model/search/query_spec.rb +742 -0
- data/spec/app/models/metasploit/model/spec/template_spec.rb +23 -0
- data/spec/app/models/metasploit/model/visitation/visitor_spec.rb +45 -0
- data/spec/app/validators/derivation_validator_spec.rb +92 -0
- data/spec/app/validators/dynamic_length_validator_spec.rb +293 -0
- data/spec/app/validators/ip_format_validator_spec.rb +124 -0
- data/spec/app/validators/nil_validator_spec.rb +69 -0
- data/spec/app/validators/parameters_validator_spec.rb +342 -0
- data/spec/app/validators/password_is_strong_validator_spec.rb +250 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.gitkeep +0 -0
- data/spec/dummy/app/models/dummy/architecture.rb +92 -0
- data/spec/dummy/app/models/dummy/author.rb +15 -0
- data/spec/dummy/app/models/dummy/authority.rb +130 -0
- data/spec/dummy/app/models/dummy/email_address.rb +27 -0
- data/spec/dummy/app/models/dummy/module/action.rb +25 -0
- data/spec/dummy/app/models/dummy/module/ancestor.rb +67 -0
- data/spec/dummy/app/models/dummy/module/architecture.rb +19 -0
- data/spec/dummy/app/models/dummy/module/author.rb +28 -0
- data/spec/dummy/app/models/dummy/module/class.rb +69 -0
- data/spec/dummy/app/models/dummy/module/instance.rb +209 -0
- data/spec/dummy/app/models/dummy/module/path.rb +64 -0
- data/spec/dummy/app/models/dummy/module/platform.rb +19 -0
- data/spec/dummy/app/models/dummy/module/rank.rb +44 -0
- data/spec/dummy/app/models/dummy/module/reference.rb +19 -0
- data/spec/dummy/app/models/dummy/module/target.rb +62 -0
- data/spec/dummy/app/models/dummy/module/target/architecture.rb +19 -0
- data/spec/dummy/app/models/dummy/module/target/platform.rb +19 -0
- data/spec/dummy/app/models/dummy/platform.rb +58 -0
- data/spec/dummy/app/models/dummy/reference.rb +31 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +43 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +27 -0
- data/spec/dummy/config/environments/production.rb +63 -0
- data/spec/dummy/config/environments/test.rb +29 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +9 -0
- data/spec/dummy/config/locales/en.yml +1 -0
- data/spec/dummy/config/routes.rb +2 -0
- data/spec/dummy/db/schema.rb +707 -0
- data/spec/dummy/lib/assets/.gitkeep +0 -0
- data/spec/dummy/log/.gitkeep +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/dummy/spec/factories/dummy/architectures.rb +13 -0
- data/spec/dummy/spec/factories/dummy/authorities.rb +32 -0
- data/spec/dummy/spec/factories/dummy/authors.rb +8 -0
- data/spec/dummy/spec/factories/dummy/email_addresses.rb +8 -0
- data/spec/dummy/spec/factories/dummy/module/actions.rb +13 -0
- data/spec/dummy/spec/factories/dummy/module/ancestors.rb +45 -0
- data/spec/dummy/spec/factories/dummy/module/architectures.rb +35 -0
- data/spec/dummy/spec/factories/dummy/module/authors.rb +10 -0
- data/spec/dummy/spec/factories/dummy/module/classes.rb +40 -0
- data/spec/dummy/spec/factories/dummy/module/instances.rb +86 -0
- data/spec/dummy/spec/factories/dummy/module/paths.rb +16 -0
- data/spec/dummy/spec/factories/dummy/module/platforms.rb +35 -0
- data/spec/dummy/spec/factories/dummy/module/ranks.rb +14 -0
- data/spec/dummy/spec/factories/dummy/module/references.rb +17 -0
- data/spec/dummy/spec/factories/dummy/module/target/architectures.rb +40 -0
- data/spec/dummy/spec/factories/dummy/module/target/platforms.rb +41 -0
- data/spec/dummy/spec/factories/dummy/module/targets.rb +46 -0
- data/spec/dummy/spec/factories/dummy/platforms.rb +3 -0
- data/spec/dummy/spec/factories/dummy/references.rb +26 -0
- data/spec/factories/metasploit/model/architectures.rb +6 -0
- data/spec/factories/metasploit/model/association/reflections.rb +9 -0
- data/spec/factories/metasploit/model/authorities.rb +28 -0
- data/spec/factories/metasploit/model/authors.rb +9 -0
- data/spec/factories/metasploit/model/bases.rb +10 -0
- data/spec/factories/metasploit/model/email_addresses.rb +14 -0
- data/spec/factories/metasploit/model/module/actions.rb +9 -0
- data/spec/factories/metasploit/model/module/ancestors.rb +180 -0
- data/spec/factories/metasploit/model/module/architectures.rb +15 -0
- data/spec/factories/metasploit/model/module/classes.rb +47 -0
- data/spec/factories/metasploit/model/module/handlers.rb +3 -0
- data/spec/factories/metasploit/model/module/instances.rb +83 -0
- data/spec/factories/metasploit/model/module/paths.rb +51 -0
- data/spec/factories/metasploit/model/module/platforms.rb +15 -0
- data/spec/factories/metasploit/model/module/ranks.rb +9 -0
- data/spec/factories/metasploit/model/module/references.rb +11 -0
- data/spec/factories/metasploit/model/module/stances.rb +3 -0
- data/spec/factories/metasploit/model/module/targets.rb +22 -0
- data/spec/factories/metasploit/model/module/types.rb +5 -0
- data/spec/factories/metasploit/model/references.rb +88 -0
- data/spec/factories/metasploit/model/search/operator/associations.rb +5 -0
- data/spec/factories/metasploit/model/search/operator/attributes.rb +7 -0
- data/spec/factories/metasploit/model/search/operator/bases.rb +5 -0
- data/spec/lib/metasploit/model/architecture_spec.rb +52 -0
- data/spec/lib/metasploit/model/association/error_spec.rb +48 -0
- data/spec/lib/metasploit/model/association_spec.rb +145 -0
- data/spec/lib/metasploit/model/author_spec.rb +6 -0
- data/spec/lib/metasploit/model/authority/bid_spec.rb +17 -0
- data/spec/lib/metasploit/model/authority/cve_spec.rb +17 -0
- data/spec/lib/metasploit/model/authority/msb_spec.rb +17 -0
- data/spec/lib/metasploit/model/authority/osvdb_spec.rb +17 -0
- data/spec/lib/metasploit/model/authority/pmasa_spec.rb +17 -0
- data/spec/lib/metasploit/model/authority/secunia_spec.rb +17 -0
- data/spec/lib/metasploit/model/authority/us_cert_vu_spec.rb +17 -0
- data/spec/lib/metasploit/model/authority/waraxe_spec.rb +51 -0
- data/spec/lib/metasploit/model/authority/zdi_spec.rb +21 -0
- data/spec/lib/metasploit/model/authority_spec.rb +10 -0
- data/spec/lib/metasploit/model/base_spec.rb +58 -0
- data/spec/lib/metasploit/model/configuration/autoload_spec.rb +165 -0
- data/spec/lib/metasploit/model/configuration/child_spec.rb +24 -0
- data/spec/lib/metasploit/model/configuration/error_spec.rb +5 -0
- data/spec/lib/metasploit/model/configuration/i18n_spec.rb +103 -0
- data/spec/lib/metasploit/model/configuration_spec.rb +106 -0
- data/spec/lib/metasploit/model/configured_spec.rb +41 -0
- data/spec/lib/metasploit/model/derivation/full_name_spec.rb +75 -0
- data/spec/lib/metasploit/model/derivation_spec.rb +217 -0
- data/spec/lib/metasploit/model/email_address_spec.rb +19 -0
- data/spec/lib/metasploit/model/engine_spec.rb +84 -0
- data/spec/lib/metasploit/model/file_spec.rb +43 -0
- data/spec/lib/metasploit/model/invalid_spec.rb +54 -0
- data/spec/lib/metasploit/model/module/action_spec.rb +6 -0
- data/spec/lib/metasploit/model/module/ancestor_spec.rb +6 -0
- data/spec/lib/metasploit/model/module/architecture_spec.rb +9 -0
- data/spec/lib/metasploit/model/module/author_spec.rb +6 -0
- data/spec/lib/metasploit/model/module/class_spec.rb +19 -0
- data/spec/lib/metasploit/model/module/handler_spec.rb +61 -0
- data/spec/lib/metasploit/model/module/instance_spec.rb +183 -0
- data/spec/lib/metasploit/model/module/path_spec.rb +6 -0
- data/spec/lib/metasploit/model/module/platform_spec.rb +9 -0
- data/spec/lib/metasploit/model/module/rank_spec.rb +29 -0
- data/spec/lib/metasploit/model/module/reference_spec.rb +9 -0
- data/spec/lib/metasploit/model/module/stance_spec.rb +30 -0
- data/spec/lib/metasploit/model/module/target/architecture_spec.rb +9 -0
- data/spec/lib/metasploit/model/module/target/platform_spec.rb +9 -0
- data/spec/lib/metasploit/model/module/target_spec.rb +9 -0
- data/spec/lib/metasploit/model/module/type_spec.rb +125 -0
- data/spec/lib/metasploit/model/nilify_blanks_spec.rb +156 -0
- data/spec/lib/metasploit/model/platform_spec.rb +100 -0
- data/spec/lib/metasploit/model/reference_spec.rb +21 -0
- data/spec/lib/metasploit/model/search/association_spec.rb +33 -0
- data/spec/lib/metasploit/model/search/attribute_spec.rb +99 -0
- data/spec/lib/metasploit/model/search/operation/integer/value_spec.rb +20 -0
- data/spec/lib/metasploit/model/search/operation/string/value_spec.rb +20 -0
- data/spec/lib/metasploit/model/search/operation_spec.rb +144 -0
- data/spec/lib/metasploit/model/search/operator/help_spec.rb +41 -0
- data/spec/lib/metasploit/model/search/with_spec.rb +81 -0
- data/spec/lib/metasploit/model/search_spec.rb +230 -0
- data/spec/lib/metasploit/model/spec/error_spec.rb +5 -0
- data/spec/lib/metasploit/model/spec/i18n_exception_handler_spec.rb +42 -0
- data/spec/lib/metasploit/model/spec/pathname_collision_spec.rb +55 -0
- data/spec/lib/metasploit/model/spec_spec.rb +114 -0
- data/spec/lib/metasploit/model/translation_spec.rb +82 -0
- data/spec/lib/metasploit/model/version_spec.rb +141 -0
- data/spec/lib/metasploit/model/visitation/visit_spec.rb +316 -0
- data/spec/lib/metasploit/model_spec.rb +68 -0
- data/spec/spec_helper.rb +48 -0
- data/spec/support/shared/contexts/metasploit/model/configuration.rb +11 -0
- data/spec/support/shared/contexts/metasploit/model/module/ancestor/contents/metasploit_module.rb +12 -0
- data/spec/support/shared/contexts/metasploit/model/module/ancestor/factory/contents.rb +10 -0
- data/spec/support/shared/contexts/metasploit/model/module/ancestor/factory/contents/metasploit_module.rb +15 -0
- data/spec/support/shared/contexts/metasploit/model/search/operator/union/children.rb +13 -0
- data/spec/support/shared/examples/derives.rb +115 -0
- data/spec/support/shared/examples/metasploit/model/architecture.rb +425 -0
- data/spec/support/shared/examples/metasploit/model/architecture/seed.rb +25 -0
- data/spec/support/shared/examples/metasploit/model/author.rb +27 -0
- data/spec/support/shared/examples/metasploit/model/authority.rb +124 -0
- data/spec/support/shared/examples/metasploit/model/authority/seed.rb +49 -0
- data/spec/support/shared/examples/metasploit/model/configuration/parent/child.rb +60 -0
- data/spec/support/shared/examples/metasploit/model/email_address.rb +220 -0
- data/spec/support/shared/examples/metasploit/model/module/action.rb +26 -0
- data/spec/support/shared/examples/metasploit/model/module/ancestor.rb +2004 -0
- data/spec/support/shared/examples/metasploit/model/module/ancestor/payload_factory.rb +63 -0
- data/spec/support/shared/examples/metasploit/model/module/architecture.rb +36 -0
- data/spec/support/shared/examples/metasploit/model/module/author.rb +29 -0
- data/spec/support/shared/examples/metasploit/model/module/class.rb +1514 -0
- data/spec/support/shared/examples/metasploit/model/module/handler.rb +21 -0
- data/spec/support/shared/examples/metasploit/model/module/instance.rb +1384 -0
- data/spec/support/shared/examples/metasploit/model/module/instance/class_methods.rb +537 -0
- data/spec/support/shared/examples/metasploit/model/module/instance/is_not_stanced_with_module_type.rb +22 -0
- data/spec/support/shared/examples/metasploit/model/module/instance/is_stanced_with_module_type.rb +38 -0
- data/spec/support/shared/examples/metasploit/model/module/instance/validates/dynamic_length_of.rb +131 -0
- data/spec/support/shared/examples/metasploit/model/module/path.rb +493 -0
- data/spec/support/shared/examples/metasploit/model/module/platform.rb +36 -0
- data/spec/support/shared/examples/metasploit/model/module/rank.rb +92 -0
- data/spec/support/shared/examples/metasploit/model/module/reference.rb +16 -0
- data/spec/support/shared/examples/metasploit/model/module/target.rb +29 -0
- data/spec/support/shared/examples/metasploit/model/module/target/architecture.rb +56 -0
- data/spec/support/shared/examples/metasploit/model/module/target/platform.rb +56 -0
- data/spec/support/shared/examples/metasploit/model/platform.rb +213 -0
- data/spec/support/shared/examples/metasploit/model/real_pathname.rb +29 -0
- data/spec/support/shared/examples/metasploit/model/reference.rb +410 -0
- data/spec/support/shared/examples/metasploit/model/search/operation/integer/value.rb +79 -0
- data/spec/support/shared/examples/metasploit/model/search/operation/string/value.rb +53 -0
- data/spec/support/shared/examples/metasploit/model/search/operator/help.rb +134 -0
- data/spec/support/shared/examples/metasploit/model/translation.rb +37 -0
- data/spec/support/shared/examples/search/query.rb +43 -0
- data/spec/support/shared/examples/search/query/metasploit/model/search/operator/deprecated/app.rb +44 -0
- data/spec/support/shared/examples/search/query/metasploit/model/search/operator/deprecated/authority.rb +60 -0
- data/spec/support/shared/examples/search_association.rb +13 -0
- data/spec/support/shared/examples/search_attribute.rb +27 -0
- data/spec/support/shared/examples/search_with.rb +36 -0
- data/spec/support/shared/matchers/allow_attribute.rb +17 -0
- data/spec/support/templates/metasploit/model/module/ancestors/_attributes.rb.erb +9 -0
- data/spec/support/templates/metasploit/model/module/ancestors/_methods.rb.erb +8 -0
- data/spec/support/templates/metasploit/model/module/ancestors/_validations.rb.erb +6 -0
- data/spec/support/templates/metasploit/model/module/ancestors/base.rb.erb +3 -0
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_auxiliary.rb.erb +1 -0
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_encoder.rb.erb +1 -0
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_exploit.rb.erb +1 -0
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_non_payload.rb.erb +5 -0
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_nop.rb.erb +1 -0
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_payload.rb.erb +4 -0
- data/spec/support/templates/metasploit/model/module/ancestors/module_types/_post.rb.erb +1 -0
- data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_handled.rb.erb +20 -0
- data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_single.rb.erb +1 -0
- data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_stage.rb.erb +0 -0
- data/spec/support/templates/metasploit/model/module/ancestors/payload_types/_stager.rb.erb +1 -0
- data/spec/support/templates/metasploit/model/module/classes/_methods.rb.erb +9 -0
- metadata +747 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
module Metasploit
|
2
|
+
module Model
|
3
|
+
module Module
|
4
|
+
# Model that joins {Metasploit::Model::Architecture} and {Metasploit::Model::Module::Instance}.
|
5
|
+
module Architecture
|
6
|
+
extend ActiveModel::Naming
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
include Metasploit::Model::Translation
|
10
|
+
|
11
|
+
included do
|
12
|
+
include ActiveModel::Validations
|
13
|
+
|
14
|
+
#
|
15
|
+
# Validations
|
16
|
+
#
|
17
|
+
|
18
|
+
validates :architecture,
|
19
|
+
:presence => true
|
20
|
+
validates :module_instance,
|
21
|
+
:presence => true
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# Attributes
|
26
|
+
#
|
27
|
+
|
28
|
+
# @!attribute [rw] architecture
|
29
|
+
# The architecture supported by the {#module_instance}.
|
30
|
+
#
|
31
|
+
# @return [Metasploit::Model::Architecture]
|
32
|
+
|
33
|
+
# @!attribute [rw] module_instance
|
34
|
+
# The module instance that supports {#architecture}.
|
35
|
+
#
|
36
|
+
# @return [Metasploit::Model::Module::Instance]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Metasploit
|
2
|
+
module Model
|
3
|
+
module Module
|
4
|
+
# Code shared between `Mdm::Module::Author` and `Metasploit::Framework::Module::Author`.
|
5
|
+
module Author
|
6
|
+
extend ActiveModel::Naming
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
include Metasploit::Model::Translation
|
10
|
+
|
11
|
+
included do
|
12
|
+
include ActiveModel::Validations
|
13
|
+
|
14
|
+
#
|
15
|
+
# Validations
|
16
|
+
#
|
17
|
+
|
18
|
+
validates :author,
|
19
|
+
:presence => true
|
20
|
+
validates :module_instance,
|
21
|
+
:presence => true
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# Associations
|
26
|
+
#
|
27
|
+
|
28
|
+
# @!attribute [rw] author
|
29
|
+
# Author who wrote the {#module_instance module}.
|
30
|
+
#
|
31
|
+
# @return [Metasploit::Model::Author]
|
32
|
+
|
33
|
+
# @!attribute [rw] email_address
|
34
|
+
# Email address {#author} used when writing {#module_instance module}.
|
35
|
+
#
|
36
|
+
# @return [Metasploit::Model::EmailAddress] if {#author} gave an email address.
|
37
|
+
# @return [nil] if {#author} only gave a name.
|
38
|
+
|
39
|
+
# @!attribute [rw] module_instance
|
40
|
+
# Module written by {#author}.
|
41
|
+
#
|
42
|
+
# @return [Metasploit::Model::Module::Instance]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
@@ -0,0 +1,406 @@
|
|
1
|
+
module Metasploit
|
2
|
+
module Model
|
3
|
+
module Module
|
4
|
+
# Code shared between `Mdm::Module::Class` and `Metasploit::Framework::Module::Class`.
|
5
|
+
module Class
|
6
|
+
extend ActiveModel::Naming
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
include Metasploit::Model::Translation
|
10
|
+
|
11
|
+
#
|
12
|
+
# CONSTANTS
|
13
|
+
#
|
14
|
+
|
15
|
+
# Valid values for {#payload_type} when {#payload?} is `true`.
|
16
|
+
PAYLOAD_TYPES = [
|
17
|
+
'single',
|
18
|
+
'staged'
|
19
|
+
]
|
20
|
+
|
21
|
+
# The {Metasploit::Model::Module::Ancestor#payload_type} when {#payload_type} is 'staged'.
|
22
|
+
STAGED_ANCESTOR_PAYLOAD_TYPES = [
|
23
|
+
'stage',
|
24
|
+
'stager'
|
25
|
+
]
|
26
|
+
|
27
|
+
included do
|
28
|
+
include ActiveModel::Validations
|
29
|
+
include Metasploit::Model::Derivation
|
30
|
+
include Metasploit::Model::Derivation::FullName
|
31
|
+
include Metasploit::Model::Search
|
32
|
+
|
33
|
+
#
|
34
|
+
# Derivations
|
35
|
+
#
|
36
|
+
|
37
|
+
derives :module_type, :validate => true
|
38
|
+
derives :payload_type, :validate => true
|
39
|
+
# reference_name depends on module_type and conditionally depends on payload_type if module_type is 'payload'
|
40
|
+
derives :reference_name, :validate => true
|
41
|
+
|
42
|
+
# full_name depends on module_type and reference_name
|
43
|
+
derives :full_name, :validate => true
|
44
|
+
|
45
|
+
#
|
46
|
+
# Search Attributes
|
47
|
+
#
|
48
|
+
|
49
|
+
search_attribute :full_name, :type => :string
|
50
|
+
search_attribute :module_type, :type => :string
|
51
|
+
search_attribute :payload_type, :type => :string
|
52
|
+
search_attribute :reference_name, :type => :string
|
53
|
+
|
54
|
+
#
|
55
|
+
# Validations
|
56
|
+
#
|
57
|
+
|
58
|
+
validate :ancestors_size
|
59
|
+
validate :ancestor_payload_types
|
60
|
+
validate :ancestor_module_types
|
61
|
+
|
62
|
+
validates :module_type,
|
63
|
+
:inclusion => {
|
64
|
+
:in => Metasploit::Model::Module::Type::ALL
|
65
|
+
}
|
66
|
+
validates :payload_type,
|
67
|
+
:inclusion => {
|
68
|
+
:if => :payload?,
|
69
|
+
:in => PAYLOAD_TYPES
|
70
|
+
},
|
71
|
+
:nil => {
|
72
|
+
:unless => :payload?
|
73
|
+
}
|
74
|
+
validates :rank,
|
75
|
+
:presence => true
|
76
|
+
validates :reference_name,
|
77
|
+
:presence => true
|
78
|
+
end
|
79
|
+
|
80
|
+
#
|
81
|
+
# Associations
|
82
|
+
#
|
83
|
+
|
84
|
+
# @!attribute [rw] rank
|
85
|
+
# The reliability of the module and likelyhood that the module won't knock over the service or host being
|
86
|
+
# exploited. Bigger values is better.
|
87
|
+
#
|
88
|
+
# @return [Metasploit::Model::Module::Rank]
|
89
|
+
|
90
|
+
# @!attribute [r] ancestors
|
91
|
+
# The Class or Modules that were loaded to make this module Class.
|
92
|
+
#
|
93
|
+
# @return [Array<Metasploit::Model::Module::Ancestor>]
|
94
|
+
|
95
|
+
#
|
96
|
+
# Attributes
|
97
|
+
#
|
98
|
+
|
99
|
+
# @!attribute [rw] full_name
|
100
|
+
# The full name (type + reference) for the Class<Msf::Module>. This is merely a denormalized cache of
|
101
|
+
# `"#{{#module_type}}/#{{#reference_name}}"` as full_name is used in numerous queries and reports.
|
102
|
+
#
|
103
|
+
# @return [String]
|
104
|
+
|
105
|
+
# @!attribute [rw] module_type
|
106
|
+
# A denormalized cache of the {Metasploit::Model::Module::Class#module_type ancestors' module_types}, which
|
107
|
+
# must all be the same. This cache exists so that queries for modules of a given type don't need include the
|
108
|
+
# {#ancestors}.
|
109
|
+
#
|
110
|
+
# @return [String]
|
111
|
+
|
112
|
+
# @!attribute [rw] payload_type
|
113
|
+
# For payload modules, the {PAYLOAD_TYPES type} of payload, either 'single' or 'staged'.
|
114
|
+
#
|
115
|
+
# @return [String] if {#payload?} is `true`.
|
116
|
+
# @return [nil] if {#payload?} is `false`
|
117
|
+
|
118
|
+
# @!attribute [rw] reference_name
|
119
|
+
# The reference name for the Class<Msf::Module>. For non-payloads, this will just be
|
120
|
+
# {Metasploit::Model::Module::Ancestor#reference_name} for the only element in {#ancestors}. For payloads
|
121
|
+
# composed of a stage and stager, the reference name will be derived from the
|
122
|
+
# {Metasploit::Model::Module::Ancestor#reference_name} of each element {#ancestors} or an alias defined in
|
123
|
+
# those Modules.
|
124
|
+
#
|
125
|
+
# @return [String]
|
126
|
+
|
127
|
+
#
|
128
|
+
# Instance Methods
|
129
|
+
#
|
130
|
+
|
131
|
+
# Derives {#module_type} from the consensus of {#ancestors ancestors'}
|
132
|
+
# {Metasploit::Model::Module::Ancestor#module_type module_types}.
|
133
|
+
#
|
134
|
+
# @return [String] if all {#ancestors} have the same
|
135
|
+
# {Metasploit::Model::Module::Ancestor#module_type module_type}.
|
136
|
+
# @return [nil] if there are no {#ancestors}.
|
137
|
+
# @return [nil] if {#ancestors} do not have the same
|
138
|
+
# {Metasploit::Model::Module::Ancestor#module_type module_type}.
|
139
|
+
def derived_module_type
|
140
|
+
module_type_consensus = nil
|
141
|
+
module_type_set = Set.new
|
142
|
+
|
143
|
+
ancestors.each do |ancestor|
|
144
|
+
module_type_set.add ancestor.module_type
|
145
|
+
end
|
146
|
+
|
147
|
+
if module_type_set.length == 1
|
148
|
+
module_type_consensus = module_type_set.to_a.first
|
149
|
+
end
|
150
|
+
|
151
|
+
module_type_consensus
|
152
|
+
end
|
153
|
+
|
154
|
+
# Derives {#payload_type} based on {#ancestors ancestor's}
|
155
|
+
# {Metasploit::Model::Module::Ancestor#payload_type payload_type}.
|
156
|
+
#
|
157
|
+
# @return ['single'] if {#payload?} and single ancestor with
|
158
|
+
# {Metasploit::Model::Module::Ancestor#payload_type payload_tye} 'single'.
|
159
|
+
# @return ['staged'] if {#payload?} and one ancestor with
|
160
|
+
# {Metasploit::Model::Module::Ancestor#payload_type payload_type} 'stager' and another ancestor with
|
161
|
+
# {Metasploit::Model::Module::Ancestor#payload_type payload_type} 'stage'.
|
162
|
+
# @return [nil] otherwise
|
163
|
+
def derived_payload_type
|
164
|
+
derived = nil
|
165
|
+
|
166
|
+
if payload?
|
167
|
+
case ancestors.length
|
168
|
+
when 1
|
169
|
+
if ancestors.first.payload_type == 'single'
|
170
|
+
derived = 'single'
|
171
|
+
end
|
172
|
+
when 2
|
173
|
+
payload_type_set = Set.new
|
174
|
+
|
175
|
+
ancestors.each do |ancestor|
|
176
|
+
payload_type_set.add ancestor.payload_type
|
177
|
+
end
|
178
|
+
|
179
|
+
if payload_type_set.include? 'stager' and payload_type_set.include? 'stage'
|
180
|
+
derived = 'staged'
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
derived
|
186
|
+
end
|
187
|
+
|
188
|
+
# Derives {#reference_name} from {#ancestors}.
|
189
|
+
#
|
190
|
+
# @return [String] '<single_ancestor.reference_name>/<single_ancestor.handler_type>' if {#payload_type} is
|
191
|
+
# 'single'.
|
192
|
+
# @return [String] '<stage_ancestor.reference_name>/<stager_ancestor.handler_type>' if {#payload_type} is
|
193
|
+
# 'staged'.
|
194
|
+
# @return [String] '<ancestor.reference_name>' if not {#payload?}.
|
195
|
+
# @return [nil] otherwise
|
196
|
+
def derived_reference_name
|
197
|
+
derived = nil
|
198
|
+
|
199
|
+
if payload?
|
200
|
+
case payload_type
|
201
|
+
when 'single'
|
202
|
+
derived = derived_single_payload_reference_name
|
203
|
+
when 'staged'
|
204
|
+
derived = derived_staged_payload_reference_name
|
205
|
+
end
|
206
|
+
else
|
207
|
+
if ancestors.length == 1
|
208
|
+
derived = ancestors.first.reference_name
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
derived
|
213
|
+
end
|
214
|
+
|
215
|
+
# Returns whether this represents a Class<Msf::Payload>.
|
216
|
+
#
|
217
|
+
# @return [true] if {#module_type} == 'payload'
|
218
|
+
# @return [false] if {#module_type} != 'payload'
|
219
|
+
def payload?
|
220
|
+
if module_type == 'payload'
|
221
|
+
true
|
222
|
+
else
|
223
|
+
false
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
private
|
228
|
+
|
229
|
+
# Validates that {#ancestors} all have the same {Metasploit::Model::Module::Ancestor#module_type} as
|
230
|
+
# {#module_type}.
|
231
|
+
#
|
232
|
+
# @return [void]
|
233
|
+
def ancestor_module_types
|
234
|
+
ancestor_module_type_set = Set.new
|
235
|
+
|
236
|
+
ancestors.each do |ancestor|
|
237
|
+
if module_type and ancestor.module_type != module_type
|
238
|
+
errors[:ancestors] << "can contain ancestors only with same module_type (#{module_type}); " \
|
239
|
+
"#{ancestor.full_name} cannot be an ancestor due to its module_type " \
|
240
|
+
"(#{ancestor.module_type})"
|
241
|
+
end
|
242
|
+
|
243
|
+
ancestor_module_type_set.add ancestor.module_type
|
244
|
+
end
|
245
|
+
|
246
|
+
if ancestor_module_type_set.length > 1
|
247
|
+
ancestor_module_type_sentence = ancestor_module_type_set.sort.to_sentence
|
248
|
+
errors[:ancestors] << "can only contain ancestors with one module_type, " \
|
249
|
+
"but contains multiple module_types (#{ancestor_module_type_sentence})"
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
# Validates that {#ancestors} have correct {Metasploit::Model::Module::Ancestor#payload_type payload_types} for
|
254
|
+
# the {#module_type} and {#payload_type}.
|
255
|
+
#
|
256
|
+
# @return [void]
|
257
|
+
def ancestor_payload_types
|
258
|
+
if payload?
|
259
|
+
case payload_type
|
260
|
+
when 'single'
|
261
|
+
ancestors.each do |ancestor|
|
262
|
+
unless ancestor.payload_type == 'single'
|
263
|
+
errors[:ancestors] << "cannot have an ancestor (#{ancestor.full_name}) " \
|
264
|
+
"with payload_type (#{ancestor.payload_type}) " \
|
265
|
+
"for class payload_type (#{payload_type})"
|
266
|
+
end
|
267
|
+
end
|
268
|
+
when 'staged'
|
269
|
+
ancestors_by_payload_type = ancestors.group_by(&:payload_type)
|
270
|
+
|
271
|
+
STAGED_ANCESTOR_PAYLOAD_TYPES.each do |ancestor_payload_type|
|
272
|
+
staged_payload_type_count(ancestors_by_payload_type, ancestor_payload_type)
|
273
|
+
end
|
274
|
+
|
275
|
+
ancestors_by_payload_type.each do |ancestor_payload_type, ancestors|
|
276
|
+
unless STAGED_ANCESTOR_PAYLOAD_TYPES.include? ancestor_payload_type
|
277
|
+
full_names = ancestors.map(&:full_name)
|
278
|
+
full_name_sentence = full_names.to_sentence
|
279
|
+
|
280
|
+
errors[:ancestors] << "cannot have ancestors (#{full_name_sentence}) " \
|
281
|
+
"with payload_type (#{ancestor_payload_type}) " \
|
282
|
+
"for class payload_type (#{payload_type}); " \
|
283
|
+
"only one stage and one stager ancestor is allowed"
|
284
|
+
end
|
285
|
+
end
|
286
|
+
end
|
287
|
+
else
|
288
|
+
ancestors.each do |ancestor|
|
289
|
+
if ancestor.payload_type
|
290
|
+
errors[:ancestors] << "cannot have an ancestor (#{ancestor.full_name}) " \
|
291
|
+
"with a payload_type (#{ancestor.payload_type}) " \
|
292
|
+
"for class module_type (#{module_type})"
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
# Validates that number of {#ancestors} is correct for the {#module_type}.
|
299
|
+
#
|
300
|
+
# @return [void]
|
301
|
+
def ancestors_size
|
302
|
+
if payload?
|
303
|
+
case payload_type
|
304
|
+
when 'single'
|
305
|
+
unless ancestors.size == 1
|
306
|
+
errors[:ancestors] << 'must have exactly one ancestor for single payload module class'
|
307
|
+
end
|
308
|
+
when 'staged'
|
309
|
+
unless ancestors.size == 2
|
310
|
+
errors[:ancestors] << 'must have exactly two ancestors (stager + stage) for staged payload module class'
|
311
|
+
end
|
312
|
+
# other (invalid) types are handled by validation on payload_type
|
313
|
+
end
|
314
|
+
else
|
315
|
+
unless ancestors.size == 1
|
316
|
+
errors[:ancestors] << 'must have exactly one ancestor as a non-payload module class'
|
317
|
+
end
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
# @note Caller should check that {#payload?} is `true` and {#payload_type} is 'single' before calling
|
322
|
+
# {#derived_single_payload_reference_name}.
|
323
|
+
#
|
324
|
+
# Derives {#reference_name} for single payload.
|
325
|
+
#
|
326
|
+
# @return [String, nil] '<ancestor.payload_name>'
|
327
|
+
# @return [nil] unless exactly one {#ancestors ancestor}.
|
328
|
+
# @return [nil] unless ancestor's {Metasploit::Model::Module::Ancestor#payload_type} is `'single'`.
|
329
|
+
def derived_single_payload_reference_name
|
330
|
+
derived = nil
|
331
|
+
|
332
|
+
if ancestors.length == 1
|
333
|
+
ancestor = ancestors.first
|
334
|
+
|
335
|
+
if ancestor.payload_type == 'single'
|
336
|
+
derived = ancestor.payload_name
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
derived
|
341
|
+
end
|
342
|
+
|
343
|
+
# @note Caller should check that {#payload?} is `true` and {#payload_type} is 'staged' before calling
|
344
|
+
# {#derived_staged_payload_reference_name}.
|
345
|
+
#
|
346
|
+
# Derives {#reference_name} for staged payload.
|
347
|
+
#
|
348
|
+
# @return [String] '<stage_ancestor.payload_name>/<stager_ancestor.payload_name>'
|
349
|
+
# @return [nil] unless exactly two {#ancestors ancestor}.
|
350
|
+
# @return [nil] unless {Metasploit::Model::Module::Ancestor#payload_type} is 'single'.
|
351
|
+
# @return [nil] if {Metasploit::Model::Module::Ancestor#payload_name} is `nil` for the stage.
|
352
|
+
# @return [nil] if {Metasploit::Model::Module::Ancestor#payload_name} is `nil` for the stager.
|
353
|
+
def derived_staged_payload_reference_name
|
354
|
+
derived = nil
|
355
|
+
|
356
|
+
if ancestors.length == 2
|
357
|
+
ancestors_by_payload_type = ancestors.group_by(&:payload_type)
|
358
|
+
stage_ancestors = ancestors_by_payload_type.fetch('stage', [])
|
359
|
+
|
360
|
+
# length can be 0..2
|
361
|
+
if stage_ancestors.length == 1
|
362
|
+
stage_ancestor = stage_ancestors.first
|
363
|
+
|
364
|
+
if stage_ancestor.payload_name
|
365
|
+
stager_ancestors = ancestors_by_payload_type.fetch('stager', [])
|
366
|
+
|
367
|
+
# length can be 0..1
|
368
|
+
if stager_ancestors.length == 1
|
369
|
+
stager_ancestor = stager_ancestors.first
|
370
|
+
|
371
|
+
if stager_ancestor.payload_name
|
372
|
+
derived = "#{stage_ancestor.payload_name}/#{stager_ancestor.payload_name}"
|
373
|
+
end
|
374
|
+
end
|
375
|
+
end
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
379
|
+
derived
|
380
|
+
end
|
381
|
+
|
382
|
+
# Validates that only 1 ancestor with the given payload_type exists.
|
383
|
+
#
|
384
|
+
# @param ancestors_by_payload_type [Hash{String => Array<Metasploit::Model::Module::Ancestor>}] Maps
|
385
|
+
# {Metasploit::Model::Module::Ancestor#payload_type} to the Array of {Metasploit::Model::Module::Ancestor}
|
386
|
+
# with that {Metasploit::Model::Module::Ancestor#payload_type}.
|
387
|
+
# @param ancestor_payload_type [String] {Metasploit::Model::Module::Ancestor#payload_type}.
|
388
|
+
# @return [void]
|
389
|
+
def staged_payload_type_count(ancestors_by_payload_type, ancestor_payload_type)
|
390
|
+
payload_type_ancestors = ancestors_by_payload_type.fetch(ancestor_payload_type, [])
|
391
|
+
payload_type_ancestor_count = payload_type_ancestors.length
|
392
|
+
|
393
|
+
if payload_type_ancestor_count < 1
|
394
|
+
errors[:ancestors] << "needs exactly one ancestor with payload_type (#{ancestor_payload_type}), " \
|
395
|
+
"but there are none."
|
396
|
+
elsif payload_type_ancestor_count > 1
|
397
|
+
full_names = payload_type_ancestors.map(&:full_name).sort
|
398
|
+
full_name_sentence = full_names.to_sentence
|
399
|
+
errors[:ancestors] << "needs exactly one ancestor with payload_type (#{ancestor_payload_type}), " \
|
400
|
+
"but there are #{payload_type_ancestor_count} (#{full_name_sentence})"
|
401
|
+
end
|
402
|
+
end
|
403
|
+
end
|
404
|
+
end
|
405
|
+
end
|
406
|
+
end
|