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,33 @@
|
|
1
|
+
# Operator that {#operate_on produces} {Metasploit::Model::Search::Operation::Union union operations}.
|
2
|
+
class Metasploit::Model::Search::Operator::Union < Metasploit::Model::Search::Operator::Delegation
|
3
|
+
#
|
4
|
+
# Methods
|
5
|
+
#
|
6
|
+
|
7
|
+
# {Metasploit::Model::Search::Operation::Union#children}.
|
8
|
+
#
|
9
|
+
# @param formatted_value [String] value parsed from formatted operation
|
10
|
+
# @return [Array<Metasploit::Model::Search::Operation::Base>]
|
11
|
+
def children(formatted_value)
|
12
|
+
raise NotImplementedError
|
13
|
+
end
|
14
|
+
|
15
|
+
# Unions children operating on `formatted_value`.
|
16
|
+
#
|
17
|
+
# @param formatted_value [String] value parsed from formatted operation.
|
18
|
+
# @return [Metasploit::Model::Search::Operation::Union] Union will not contain {#children} that are invalid.
|
19
|
+
def operate_on(formatted_value)
|
20
|
+
children = self.children(formatted_value)
|
21
|
+
|
22
|
+
# filter children for validity as valid values for one child won't necessarily be valid values for another child.
|
23
|
+
# this is specifically a problem with Metasploit::Model::Search::Operation::Set as no partial matching is allowed,
|
24
|
+
# but can also be a problem with string vs integer operations.
|
25
|
+
valid_children = children.select(&:valid?)
|
26
|
+
|
27
|
+
Metasploit::Model::Search::Operation::Union.new(
|
28
|
+
:children => valid_children,
|
29
|
+
:operator => self,
|
30
|
+
:value => formatted_value
|
31
|
+
)
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,171 @@
|
|
1
|
+
# A search query on a {#klass}. Parses query from {#formatted} string.
|
2
|
+
class Metasploit::Model::Search::Query < Metasploit::Model::Base
|
3
|
+
#
|
4
|
+
# Attributes
|
5
|
+
#
|
6
|
+
|
7
|
+
# @!attribute [rw] formatted
|
8
|
+
# Query string containing space separated <operator>:<value> pairs.
|
9
|
+
#
|
10
|
+
# @return [String]
|
11
|
+
attr_accessor :formatted
|
12
|
+
|
13
|
+
# @!attribute [rw] formatted_operations
|
14
|
+
# @note If using `Shellwords.shellsplit` to pre-parse the query, set {#formatted_operations} instead of rejoining
|
15
|
+
# the shell words with `.join(" ")` and setting {#formatted} as `Shellwords.shellsplit` strips embedded quotes,
|
16
|
+
# so quoted spaces will not be handled correctly if joining and setting {#formatted}.
|
17
|
+
#
|
18
|
+
# {#formatted} broken up into individual operation (<operator>:<value>) Strings.
|
19
|
+
attr_writer :formatted_operations
|
20
|
+
|
21
|
+
# @!attribute [rw] klass
|
22
|
+
# The klass that is being searched.
|
23
|
+
#
|
24
|
+
# @return [Class, #search_operator_by_name]
|
25
|
+
attr_accessor :klass
|
26
|
+
|
27
|
+
# @!attribute [rw] operations
|
28
|
+
# The parsed operations in this query.
|
29
|
+
#
|
30
|
+
# @return [Array<Metasploit::Model::Search::Operation::Base>] An Array of operations.
|
31
|
+
attr_writer :operations
|
32
|
+
|
33
|
+
#
|
34
|
+
# Validations
|
35
|
+
#
|
36
|
+
|
37
|
+
validates :klass, :presence => true
|
38
|
+
|
39
|
+
validates :operations,
|
40
|
+
:length => {
|
41
|
+
:minimum => 1
|
42
|
+
}
|
43
|
+
# validate recursive so misnamed operators or bad values for operator's types cause the query to be invalid as a whole
|
44
|
+
validate :operations_valid
|
45
|
+
|
46
|
+
#
|
47
|
+
# Methods
|
48
|
+
#
|
49
|
+
|
50
|
+
# Parses {#formatted} into a list of formatted operation composed of <formatted_operator>:<formatted_value> Strings.
|
51
|
+
# <formatted_value> may be quoted
|
52
|
+
#
|
53
|
+
# @param formatted [String] a String composed of space-separated <formatted_operator>:<formatted_value>
|
54
|
+
# operations. <formatted_value> may be quoted using the shell quoting rules.
|
55
|
+
# @return [Array<String>] Array of formatted operation.
|
56
|
+
# @see Shellwords.shellsplit
|
57
|
+
def self.formatted_operations(formatted)
|
58
|
+
Shellwords.shellsplit(formatted.to_s)
|
59
|
+
end
|
60
|
+
|
61
|
+
# {#formatted} broken up into individual operation (<operator>:<value>) Strings.
|
62
|
+
#
|
63
|
+
# @return [Array<String>]
|
64
|
+
def formatted_operations
|
65
|
+
@formatted_operations ||= self.class.formatted_operations(formatted)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Parses {#formatted} to create search operations that can validate if the
|
69
|
+
# {Metasploit::Model::Search::Operation::Base#value value} is correct the operation's
|
70
|
+
# {Metasploit::Model::Search::Operation::Base#operator operator's} type.
|
71
|
+
#
|
72
|
+
# @return [Array<Metasploit::Model::Search::Operation::Base>] an Array of operation parsed from {#formatted}.
|
73
|
+
def operations
|
74
|
+
unless instance_variable_defined? :@operations
|
75
|
+
@operations = formatted_operations.flat_map { |formatted_operation|
|
76
|
+
Metasploit::Model::Search::Operation.parse(
|
77
|
+
:formatted_operation => formatted_operation,
|
78
|
+
:query => self
|
79
|
+
)
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
@operations
|
84
|
+
end
|
85
|
+
|
86
|
+
# @note Query is validated before grouping the operations as {Metasploit::Model::Search::Operation::Null operation
|
87
|
+
# using unknown operators} with the same name should not be grouped together when processing this query into an actual
|
88
|
+
# search of record and/or models.
|
89
|
+
#
|
90
|
+
# Groups {#operations} together by {Metasploit::Model::Search::Operation::Base#operator}.
|
91
|
+
#
|
92
|
+
# @return [Hash{Metasploit::Model::Search::Operator::Base => Metasploit::Model::Search::Operation::Base}] Maps
|
93
|
+
# operator to all its operations.
|
94
|
+
# @raise [Metasploit::Model::Invalid] if query is invalid due to invalid operations.
|
95
|
+
def operations_by_operator
|
96
|
+
unless instance_variable_defined? :@operations_by_operator
|
97
|
+
valid!
|
98
|
+
|
99
|
+
@operations_by_operator = operations.group_by(&:operator)
|
100
|
+
end
|
101
|
+
|
102
|
+
@operations_by_operator ||= operations.group_by(&:operator)
|
103
|
+
end
|
104
|
+
|
105
|
+
# Converts formatted operator extracted from formatted operation to its {Metasploit::Model::Search::Operator::Base}
|
106
|
+
# instance.
|
107
|
+
#
|
108
|
+
# @param formatted_operator [#to_sym] formatted operator as parsed from formatted operation.
|
109
|
+
# @return [Metasploit::Model::Search::Operation::Base] a type-specific search operation if there is an
|
110
|
+
# {Metasploit::Model::Search::Operator::Base#name} on {#klass} that matches `formatted_operator`.
|
111
|
+
# @return [Metasploit::Model::Search::Operator::Null] if there is not an operator with
|
112
|
+
# {Metasploit::Model::Search::Operator::Base#name} on {#klass} that matches `formatted_operator`.
|
113
|
+
def parse_operator(formatted_operator)
|
114
|
+
operator_name = formatted_operator.to_sym
|
115
|
+
operator = klass.search_operator_by_name[operator_name]
|
116
|
+
|
117
|
+
unless operator
|
118
|
+
operator = Metasploit::Model::Search::Operator::Null.new(:name => operator_name)
|
119
|
+
end
|
120
|
+
|
121
|
+
operator
|
122
|
+
end
|
123
|
+
|
124
|
+
# Groups {#operations} together by {Metasploit::Model::Search::Operation::Base#operator} into
|
125
|
+
# {Metasploit::Model::Search::Group::Union unions} that are
|
126
|
+
# {Metasploit::Model::Search::Group::Intersection intersected}.
|
127
|
+
#
|
128
|
+
# @return [Metasploit::Model::Search::Group::Intersection<Metasploit::Model::Search::Group::Union<Metasploit::Model::Search::Operation::Base>>]
|
129
|
+
def tree
|
130
|
+
unless instance_variable_defined? :@tree
|
131
|
+
unions = operations_by_operator.collect do |_operator, operations|
|
132
|
+
Metasploit::Model::Search::Group::Union.new(:children => operations)
|
133
|
+
end
|
134
|
+
|
135
|
+
@tree = Metasploit::Model::Search::Group::Intersection.new(:children => unions)
|
136
|
+
end
|
137
|
+
|
138
|
+
@tree
|
139
|
+
end
|
140
|
+
|
141
|
+
# Returns a new query with all {#operations} on the given `operator` removed.
|
142
|
+
#
|
143
|
+
# @param operator [Metasploit::Model::Search::Operator::Base] an operator that should be removed from this query.
|
144
|
+
# @return [Metasploit::Model:Search::Query] a new query if `operator` is a key in {#operations_by_operator}; otherwise
|
145
|
+
# this query.
|
146
|
+
def without_operator(operator)
|
147
|
+
operations = operations_by_operator[operator]
|
148
|
+
|
149
|
+
if operations
|
150
|
+
filtered_operations = self.operations - operations
|
151
|
+
|
152
|
+
self.class.new(
|
153
|
+
klass: klass,
|
154
|
+
operations: filtered_operations
|
155
|
+
)
|
156
|
+
else
|
157
|
+
self
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
private
|
162
|
+
|
163
|
+
# Validates that all {#operations} are valid.
|
164
|
+
#
|
165
|
+
# @return [void]
|
166
|
+
def operations_valid
|
167
|
+
unless operations.all?(&:valid?)
|
168
|
+
errors.add(:operations, :invalid)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
@@ -0,0 +1,273 @@
|
|
1
|
+
# Processes {EXTENSION '.rb.erb'} templates to create {Metasploit::Model::Module::Ancestor#contents} that contain the
|
2
|
+
# same metadata as the {Metasploit::Model::Module::Ancestor},
|
3
|
+
# {Metasploit::Model::Module::Class}, {Metasploit::Model::Module::Instance} and associations for those contents. This
|
4
|
+
# ensures that when the {Metasploit::Model::Module::Ancestor#contents} are loaded in metasploit-framework, the same
|
5
|
+
# metadata instances are derived from the contents ensuring idempotency of the contents and metadata parsing loop.
|
6
|
+
class Metasploit::Model::Spec::Template < Metasploit::Model::Base
|
7
|
+
extend ActiveModel::Callbacks
|
8
|
+
include ActiveModel::Validations::Callbacks
|
9
|
+
|
10
|
+
#
|
11
|
+
# CONSTANTS
|
12
|
+
#
|
13
|
+
|
14
|
+
# Regular expression to parse file from backtrace line
|
15
|
+
BACKTRACE_FILE_REGEXP = /(?<file>.*):\d+:in .*/
|
16
|
+
# Trim mode for ERB templates so that lines using <%- -%> will be trimmed of new lines
|
17
|
+
EXPLICIT_TRIM_MODE = '-'
|
18
|
+
# File extension for templates.
|
19
|
+
EXTENSION = '.rb.erb'
|
20
|
+
|
21
|
+
#
|
22
|
+
# Attributes
|
23
|
+
#
|
24
|
+
|
25
|
+
# @!attribute [rw] destination_pathname
|
26
|
+
# The pathname where to {#write} the template results.
|
27
|
+
#
|
28
|
+
# @return [String]
|
29
|
+
attr_accessor :destination_pathname
|
30
|
+
|
31
|
+
# @!attribute [rw] locals
|
32
|
+
# Local variables to exposed to partials.
|
33
|
+
#
|
34
|
+
# @return [Hash{Symbol => Object}]
|
35
|
+
attr_accessor :locals
|
36
|
+
|
37
|
+
# @!attribute [rw] overwrite
|
38
|
+
# Whether to overwrite a pre-existing file.
|
39
|
+
#
|
40
|
+
# @return [Boolean]
|
41
|
+
attr_accessor :overwrite
|
42
|
+
|
43
|
+
# @!attribute [rw] search_pathnames
|
44
|
+
# Pathnames to search for partials. First item is search first, etc.
|
45
|
+
#
|
46
|
+
# @return [Array<Pathname>]
|
47
|
+
attr_accessor :search_pathnames
|
48
|
+
|
49
|
+
# @!attribute [rw] source_relative_name
|
50
|
+
# Name of template under {#search_pathnames} without {EXTENSION} similar to how to refer to partials.
|
51
|
+
#
|
52
|
+
# @return [String]
|
53
|
+
attr_accessor :source_relative_name
|
54
|
+
|
55
|
+
|
56
|
+
#
|
57
|
+
# Callbacks
|
58
|
+
#
|
59
|
+
|
60
|
+
before_validation :search_real_pathnames
|
61
|
+
|
62
|
+
#
|
63
|
+
# Validations
|
64
|
+
#
|
65
|
+
|
66
|
+
validates :destination_pathname,
|
67
|
+
presence: true
|
68
|
+
validates :overwrite,
|
69
|
+
inclusion: {
|
70
|
+
in: [
|
71
|
+
false,
|
72
|
+
true
|
73
|
+
]
|
74
|
+
}
|
75
|
+
validates :search_pathnames,
|
76
|
+
length: {
|
77
|
+
minimum: 1
|
78
|
+
}
|
79
|
+
validates :source_pathname,
|
80
|
+
presence: true
|
81
|
+
|
82
|
+
#
|
83
|
+
# Methods
|
84
|
+
#
|
85
|
+
|
86
|
+
# Converts the `partial_relative_path` to a real (absolute) pathname that can be passed to {#result} by finding the
|
87
|
+
# corresponding file in the {#search_pathnames}.
|
88
|
+
#
|
89
|
+
# @param partial_relative_path [String] partial path name as used in Rails, so no search_pathname prefix and no '_'
|
90
|
+
# or file extension in the basename.
|
91
|
+
# @return (see #find_pathname)
|
92
|
+
def partial_pathname(partial_relative_path)
|
93
|
+
partial_relative_pathname = Pathname.new(partial_relative_path)
|
94
|
+
relative_directory = partial_relative_pathname.dirname
|
95
|
+
raw_basename = partial_relative_pathname.basename
|
96
|
+
partial_basename = "_#{raw_basename}#{EXTENSION}"
|
97
|
+
relative_pathname = relative_directory.join(partial_basename)
|
98
|
+
|
99
|
+
find_pathname(relative_pathname)
|
100
|
+
end
|
101
|
+
|
102
|
+
# Renders partial in templates.
|
103
|
+
#
|
104
|
+
# @param partial_relative_path [String] relative path to partial without extension and no leading '_' to match
|
105
|
+
# Rails convention.
|
106
|
+
# @param options (see #result)
|
107
|
+
# @option (see #result)
|
108
|
+
# @return [String, nil] result of rendering partial.
|
109
|
+
def render(partial_relative_path, options={})
|
110
|
+
pathname = partial_pathname(partial_relative_path)
|
111
|
+
result(pathname, options)
|
112
|
+
end
|
113
|
+
|
114
|
+
# Renders the super template of the current template by searching for the template of the same name under super
|
115
|
+
# {#search_pathnames} (those that have a higher index).
|
116
|
+
#
|
117
|
+
# @return [String, nil] result of rendering super partial.
|
118
|
+
# @raise [IOError] if super template can't be found on super search pathnames.
|
119
|
+
# @raise [RegexpError] if file can't be parsed from backtrace.
|
120
|
+
def render_super
|
121
|
+
super_pathname = nil
|
122
|
+
backtrace = caller
|
123
|
+
match = BACKTRACE_FILE_REGEXP.match(backtrace[0])
|
124
|
+
|
125
|
+
if match
|
126
|
+
real_path = match[:file]
|
127
|
+
current_search_pathname_found = false
|
128
|
+
relative_pathname = nil
|
129
|
+
|
130
|
+
search_pathnames.each do |search_pathname|
|
131
|
+
# find the current index
|
132
|
+
unless current_search_pathname_found
|
133
|
+
if real_path.starts_with?(search_pathname.to_path)
|
134
|
+
current_search_pathname_found = true
|
135
|
+
|
136
|
+
real_pathname = Pathname.new(real_path)
|
137
|
+
relative_pathname = real_pathname.relative_path_from(search_pathname)
|
138
|
+
end
|
139
|
+
# then switch to finding the next (super) index
|
140
|
+
else
|
141
|
+
real_pathname = search_pathname.join(relative_pathname)
|
142
|
+
|
143
|
+
if real_pathname.exist?
|
144
|
+
super_pathname = real_pathname
|
145
|
+
break
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
unless super_pathname
|
151
|
+
raise IOError, "Couldn't find super template"
|
152
|
+
end
|
153
|
+
else
|
154
|
+
raise RegexpError, "Can't parse file from backtrace to determine current search path"
|
155
|
+
end
|
156
|
+
|
157
|
+
result(super_pathname)
|
158
|
+
end
|
159
|
+
|
160
|
+
# @note Must be an instance method
|
161
|
+
# @param pathname [Pathname] pathname to template
|
162
|
+
# @param options [Hash{Symbol => Object}]
|
163
|
+
# @option options [Hash{Symbol => Object}] :locals Maps name of locals to their value for this result. Can override
|
164
|
+
# {#locals}.
|
165
|
+
def result(pathname, options={})
|
166
|
+
options.assert_valid_keys(:locals)
|
167
|
+
|
168
|
+
if pathname
|
169
|
+
content = pathname.read
|
170
|
+
safe_level = nil
|
171
|
+
template = ERB.new content, safe_level, EXPLICIT_TRIM_MODE
|
172
|
+
template.filename = pathname.to_path
|
173
|
+
|
174
|
+
erb_binding = binding.dup
|
175
|
+
locals = self.locals || {}
|
176
|
+
result_locals = options[:locals] || {}
|
177
|
+
merged_locals = locals.merge(result_locals)
|
178
|
+
|
179
|
+
merged_locals.each do |name, value|
|
180
|
+
erb_binding.eval("#{name} = nil; lambda { |value| #{name} = value }").call(value)
|
181
|
+
end
|
182
|
+
|
183
|
+
# use current binding to allow templates to call {#render} and then use {#method_missing} to allow access to
|
184
|
+
# locals
|
185
|
+
template.result(erb_binding)
|
186
|
+
else
|
187
|
+
''
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
class << self
|
192
|
+
# The root of all relative {#search_pathnames}. By changing {root} you can use your own set of templates.
|
193
|
+
#
|
194
|
+
# @return [Pathname] Defaults to 'spec/support/templates/metasploit/model' under Metasploit::Model.root.
|
195
|
+
def root
|
196
|
+
@@root ||= Metasploit::Model.root.join('spec', 'support', 'templates', 'metasploit', 'model')
|
197
|
+
end
|
198
|
+
|
199
|
+
# Sets the {#root} pathname for all {#search_pathnames}, including those on subclasses.
|
200
|
+
#
|
201
|
+
# @param root [Pathname]
|
202
|
+
# @return [Pathname]
|
203
|
+
def root=(root)
|
204
|
+
@@root = root
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
# Converts {#source_relative_name} to a real (absolute) pathname.
|
209
|
+
#
|
210
|
+
# @return (see #find_pathname)
|
211
|
+
def source_pathname
|
212
|
+
unless instance_variable_defined? :@source_pathname
|
213
|
+
relative_path = "#{source_relative_name}#{EXTENSION}"
|
214
|
+
@source_pathname = find_pathname(relative_path)
|
215
|
+
end
|
216
|
+
|
217
|
+
@source_pathname
|
218
|
+
end
|
219
|
+
|
220
|
+
# Writes result of template to {#destination_pathname}.
|
221
|
+
#
|
222
|
+
# @return [void]
|
223
|
+
# @raise [Metasploit::Model::Spec::PathnameCollision] if {#overwrite} is false and {#destination_pathname} already
|
224
|
+
# exists.
|
225
|
+
def write
|
226
|
+
unless overwrite
|
227
|
+
Metasploit::Model::Spec::PathnameCollision.check!(destination_pathname)
|
228
|
+
end
|
229
|
+
|
230
|
+
result = self.result(source_pathname)
|
231
|
+
|
232
|
+
# make directory
|
233
|
+
destination_pathname.parent.mkpath
|
234
|
+
|
235
|
+
destination_pathname.open('wb') do |f|
|
236
|
+
f.write(result)
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
private
|
241
|
+
|
242
|
+
# Finds relative_path under {#search_pathnames}
|
243
|
+
#
|
244
|
+
# @return [Pathname] if relative_path exists under a search path.
|
245
|
+
# @return [nil] if `relative_path` does not exist under a search path.
|
246
|
+
def find_pathname(relative_path)
|
247
|
+
found_pathname = nil
|
248
|
+
|
249
|
+
search_pathnames.each do |search_pathname|
|
250
|
+
real_pathname = search_pathname.join(relative_path)
|
251
|
+
|
252
|
+
if real_pathname.exist?
|
253
|
+
found_pathname = real_pathname
|
254
|
+
break
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
found_pathname
|
259
|
+
end
|
260
|
+
|
261
|
+
# Makes sure all {#search_pathnames} are real (absolute). Relative pathnames are resolved against {root}.
|
262
|
+
#
|
263
|
+
# @return [void]
|
264
|
+
def search_real_pathnames
|
265
|
+
search_pathnames.collect! { |search_pathname|
|
266
|
+
if search_pathname.relative?
|
267
|
+
self.class.root.join(search_pathname)
|
268
|
+
else
|
269
|
+
search_pathname
|
270
|
+
end
|
271
|
+
}
|
272
|
+
end
|
273
|
+
end
|