metasploit-model 0.24.1.pre.semantic.pre.versioning.pre.2.pre.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -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 +33 -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 +748 -0
@@ -0,0 +1,69 @@
|
|
1
|
+
# Visits node in a {http://en.wikipedia.org/wiki/Tree_(data_structure) tree}, such as
|
2
|
+
# {Metasploit::Model::Search::Query#tree}.
|
3
|
+
class Metasploit::Model::Visitation::Visitor < Metasploit::Model::Base
|
4
|
+
#
|
5
|
+
# Attributes
|
6
|
+
#
|
7
|
+
|
8
|
+
# @!attribute [rw] block
|
9
|
+
# Block that is instance_exec'd on instance of {#parent} and passed the node to visit.
|
10
|
+
#
|
11
|
+
# @return [Proc]
|
12
|
+
attr_accessor :block
|
13
|
+
|
14
|
+
# @!attribute [rw] module_name
|
15
|
+
# Name of `Module` (or `Class`) that can be visited by this visitor. This visitor is also assumed to be able to
|
16
|
+
# {#visit} any `Class` or `Module` that has the `Module` or `Class` with `module_name` as a `Module#ancestor`.
|
17
|
+
#
|
18
|
+
# @return [String]
|
19
|
+
attr_accessor :module_name
|
20
|
+
|
21
|
+
# @!attribute [rw] parent
|
22
|
+
# The `Class` on which this visitor was created.
|
23
|
+
#
|
24
|
+
# @return [Class]
|
25
|
+
attr_accessor :parent
|
26
|
+
|
27
|
+
#
|
28
|
+
# Validations
|
29
|
+
#
|
30
|
+
|
31
|
+
validates :block,
|
32
|
+
:presence => true
|
33
|
+
validates :module_name,
|
34
|
+
:presence => true
|
35
|
+
validates :parent,
|
36
|
+
:presence => true
|
37
|
+
|
38
|
+
#
|
39
|
+
# Methods
|
40
|
+
#
|
41
|
+
|
42
|
+
# @param attributes [Hash{Symbol => Object}]
|
43
|
+
# @option attributes [String] :module_name name of module (or class) that can be visited by this visitor.
|
44
|
+
# @option attributes [Class] :parent The `Class` on which {Metasploit::Model::Visitation::Visit::ClassMethods#visit}
|
45
|
+
# was called.
|
46
|
+
# @yield [node] Block instance_exec'd on instance of :parent class.
|
47
|
+
# @yieldparam node [Object] node being {Metasploit::Model::Visitation::Visit#visit visited}.
|
48
|
+
# @yieldreturn [Object] translation of `node`.
|
49
|
+
def initialize(attributes={}, &block)
|
50
|
+
attributes.assert_valid_keys(:module_name, :parent)
|
51
|
+
|
52
|
+
@block = block
|
53
|
+
super
|
54
|
+
end
|
55
|
+
|
56
|
+
# Visit `node` with {#block} instance_exec'd on `instance`.
|
57
|
+
#
|
58
|
+
# @param instance [Object] instance of {#parent}.
|
59
|
+
# @param node [Object] node being visited.
|
60
|
+
# @return [Object]
|
61
|
+
# @raise [TypeError] if `instance` is not a {#parent}.
|
62
|
+
def visit(instance, node)
|
63
|
+
unless instance.is_a? parent
|
64
|
+
raise TypeError, "#{instance} is not an instance of #{parent}, so it cannot be visited."
|
65
|
+
end
|
66
|
+
|
67
|
+
instance.instance_exec(node, &block)
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Validator for {Metasploit::Model::Derivation::ClassMethods#derives}.
|
2
|
+
class DerivationValidator < ActiveModel::EachValidator
|
3
|
+
# Validates that `attribute`'s `value` equals derived_<attribute>'s value. If they are not equal then the error
|
4
|
+
# message is `'must match its derivation'`.
|
5
|
+
#
|
6
|
+
# @param record [#errors, ActiveRecord::Base] ActiveModel or ActiveRecord
|
7
|
+
# @param attribute [Symbol] name of derived attribute.
|
8
|
+
# @param value [Object] value of `attribute` in `record`.
|
9
|
+
# @return [void]
|
10
|
+
def validate_each(record, attribute, value)
|
11
|
+
derived_value = record.send("derived_#{attribute}")
|
12
|
+
|
13
|
+
if value != derived_value
|
14
|
+
record.errors[attribute] << 'must match its derivation'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Validates that `value` of `attribute` on `record` is meets the
|
2
|
+
# `record.dynamic_length_validation_options(attribute)`.
|
3
|
+
#
|
4
|
+
# Works similar to `LengthValidator`, but the minimum and maximum lengths are controlled dynamically by the `record` to
|
5
|
+
# allow the validation to vary based on some other attribute in the record.
|
6
|
+
class DynamicLengthValidator < ActiveModel::EachValidator
|
7
|
+
# Validates that value's `#length` meets the minimum and maximum options in
|
8
|
+
# `record.dynamic_length_validation_options(attribute)`.
|
9
|
+
#
|
10
|
+
# @param record [Object, #dynamic_length_validation_options] record that supports dynmaic length options on
|
11
|
+
# `attribute`.
|
12
|
+
# @param attribute [Symbol] name of an attribute on `record` with the given `value`.
|
13
|
+
# @param value [Object, #length] value of `attribute`.
|
14
|
+
# @return [void]
|
15
|
+
def validate_each(record, attribute, value)
|
16
|
+
# dynamic_options are not checked for validity the way options would be for LengthValidator because
|
17
|
+
# dynamic_length_validation_options can be {} in some cases.
|
18
|
+
dynamic_options = record.dynamic_length_validation_options(attribute)
|
19
|
+
value_length = value.length
|
20
|
+
|
21
|
+
ActiveModel::Validations::LengthValidator::CHECKS.each do |key, validity_check|
|
22
|
+
check_value = dynamic_options[key]
|
23
|
+
|
24
|
+
if check_value
|
25
|
+
unless value_length.send(validity_check, check_value)
|
26
|
+
errors_options = dynamic_options.except(*ActiveModel::Validations::LengthValidator::RESERVED_OPTIONS)
|
27
|
+
errors_options[:count] = check_value
|
28
|
+
|
29
|
+
message = errors_options[:message]
|
30
|
+
message_key = ActiveModel::Validations::LengthValidator::MESSAGES[key]
|
31
|
+
|
32
|
+
unless message
|
33
|
+
default_message = dynamic_options[message_key]
|
34
|
+
|
35
|
+
if default_message
|
36
|
+
errors_options[:message] = default_message
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
record.errors.add(attribute, message_key, errors_options)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'ipaddr'
|
2
|
+
|
3
|
+
# Validates that value is an IPv4 or IPv6 address.
|
4
|
+
class IpFormatValidator < ActiveModel::EachValidator
|
5
|
+
# Validates that `value` is an IPv4 or IPv4 address. Ranges in CIDR or netmask notation are not allowed.
|
6
|
+
#
|
7
|
+
# @param record [#errors, ActiveRecord::Base] ActiveModel or ActiveRecord
|
8
|
+
# @param attribute [Symbol] name of IP address attribute.
|
9
|
+
# @param value [String, nil] IP address.
|
10
|
+
# @return [void]
|
11
|
+
# @see IPAddr#ipv4?
|
12
|
+
# @see IPAddr#ipv6?
|
13
|
+
def validate_each(record, attribute, value)
|
14
|
+
begin
|
15
|
+
potential_ip = IPAddr.new(value)
|
16
|
+
rescue ArgumentError
|
17
|
+
record.errors[attribute] << 'must be a valid IPv4 or IPv6 address'
|
18
|
+
else
|
19
|
+
# if it includes a netmask, then it's not an IP address, but an IP range.
|
20
|
+
if potential_ip.ipv4?
|
21
|
+
if potential_ip.instance_variable_get(:@mask_addr) != IPAddr::IN4MASK
|
22
|
+
record.errors[attribute] << 'must be a valid IPv4 or IPv6 address and not an IPv4 address range in CIDR or netmask notation'
|
23
|
+
end
|
24
|
+
elsif potential_ip.ipv6?
|
25
|
+
if potential_ip.instance_variable_get(:@mask_addr) != IPAddr::IN6MASK
|
26
|
+
record.errors[attribute] << 'must be a valid IPv4 or IPv6 address and not an IPv6 address range in CIDR or netmask notation'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# Validator to ensure an attribute is `nil`. Intended for use conditionally with `:if` or `:unless` to ensure an
|
2
|
+
# attribute is `nil` under one condition while a different validation, such as `:presence` or `:inclusion` is used under
|
3
|
+
# the dual of that condition.
|
4
|
+
class NilValidator < ActiveModel::EachValidator
|
5
|
+
# Validates that `value` is `nil`.
|
6
|
+
#
|
7
|
+
# @param record [#errors, ActiveRecord::Base] an ActiveModel or ActiveRecord
|
8
|
+
# @param attribute [Symbol] name of attribute being validated.
|
9
|
+
# @param value [#nil?] value of `attribute` to check with `nil?`
|
10
|
+
# @return [void]
|
11
|
+
def validate_each(record, attribute, value)
|
12
|
+
unless value.nil?
|
13
|
+
record.errors[attribute] << 'must be nil'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
# Validates that attribute's value is Array<Array(String, String)> which is the only valid type signature for serialized
|
2
|
+
# parameters.
|
3
|
+
class ParametersValidator < ActiveModel::EachValidator
|
4
|
+
# Sentence explaining the valid type signature for parameters.
|
5
|
+
TYPE_SIGNATURE_SENTENCE = 'Valid parameters are an Array<Array(String, String)>.'
|
6
|
+
|
7
|
+
# Validates that attribute's value is Array<Array(String, String)> which is the only valid type signature for
|
8
|
+
# serialized parameters. Errors are specific to the how different `value` is compared to correct format.
|
9
|
+
#
|
10
|
+
# @param record [#errors, ActiveRecord::Base] ActiveModel or ActiveRecord
|
11
|
+
# @param attribute [Symbol] serialized parameters attribute name.
|
12
|
+
# @param value [Object, nil, Array, Array<Array>, Array<Array(String, String)>] serialized parameters.
|
13
|
+
# @return [void]
|
14
|
+
def validate_each(record, attribute, value)
|
15
|
+
if value.is_a? Array
|
16
|
+
value.each_with_index do |element, index|
|
17
|
+
if element.is_a? Array
|
18
|
+
if element.length != 2
|
19
|
+
extreme = :few
|
20
|
+
|
21
|
+
if element.length > 2
|
22
|
+
extreme = :many
|
23
|
+
end
|
24
|
+
|
25
|
+
length_error = length_error_at(
|
26
|
+
:extreme => extreme,
|
27
|
+
:element => element,
|
28
|
+
:index => index
|
29
|
+
)
|
30
|
+
|
31
|
+
record.errors[attribute] << length_error
|
32
|
+
else
|
33
|
+
parameter_name = element.first
|
34
|
+
|
35
|
+
if parameter_name.is_a? String
|
36
|
+
unless parameter_name.present?
|
37
|
+
error = error_at(
|
38
|
+
:element => element,
|
39
|
+
:index => index,
|
40
|
+
:prefix => "has blank parameter name"
|
41
|
+
)
|
42
|
+
record.errors[attribute] << error
|
43
|
+
end
|
44
|
+
else
|
45
|
+
error = error_at(
|
46
|
+
:element => element,
|
47
|
+
:index => index,
|
48
|
+
:prefix => "has non-String parameter name (#{parameter_name.inspect})"
|
49
|
+
)
|
50
|
+
record.errors[attribute] << error
|
51
|
+
end
|
52
|
+
|
53
|
+
parameter_value = element.second
|
54
|
+
|
55
|
+
unless parameter_value.is_a? String
|
56
|
+
error = error_at(
|
57
|
+
:element => element,
|
58
|
+
:index => index,
|
59
|
+
:prefix => "has non-String parameter value (#{parameter_value.inspect})"
|
60
|
+
)
|
61
|
+
record.errors[attribute] << error
|
62
|
+
end
|
63
|
+
end
|
64
|
+
else
|
65
|
+
error = error_at(
|
66
|
+
:element => element,
|
67
|
+
:index => index,
|
68
|
+
:prefix => 'has non-Array'
|
69
|
+
)
|
70
|
+
record.errors[attribute] << error
|
71
|
+
end
|
72
|
+
end
|
73
|
+
else
|
74
|
+
record.errors[attribute] << "is not an Array. #{TYPE_SIGNATURE_SENTENCE}"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
# Generates error message for element at the given index. Prefix is prepened to {#location_clause} to make a
|
81
|
+
# sentence. {TYPE_SIGNATURE_SENTENCE} is appended to that sentence.
|
82
|
+
#
|
83
|
+
# @param options [Hash{Symbol => Object}]
|
84
|
+
# @option options [Object] :element The element that has the error.
|
85
|
+
# @option options [Integer] :index The index of element in its parent Array.
|
86
|
+
# @option options [String] :prefix Specific error prefix to differentiate from other calls to {#error_at}.
|
87
|
+
# @return [String]
|
88
|
+
# @see #location_clause
|
89
|
+
def error_at(options={})
|
90
|
+
options.assert_valid_keys(:element, :index, :prefix)
|
91
|
+
prefix = options.fetch(:prefix)
|
92
|
+
|
93
|
+
clause = location_clause(
|
94
|
+
:element => options[:element],
|
95
|
+
:index => options[:index]
|
96
|
+
)
|
97
|
+
sentence = "#{prefix} #{clause}."
|
98
|
+
|
99
|
+
sentences = [
|
100
|
+
sentence,
|
101
|
+
TYPE_SIGNATURE_SENTENCE
|
102
|
+
]
|
103
|
+
|
104
|
+
error = sentences.join(" ")
|
105
|
+
|
106
|
+
error
|
107
|
+
end
|
108
|
+
|
109
|
+
# Generates error message for too few or too many elements.
|
110
|
+
#
|
111
|
+
# @param options [Hash{Symbol => Object}]
|
112
|
+
# @option options [Array] :element Array that has the wrong number of elements.
|
113
|
+
# @option options [:few, :many] :extreme whether :element has too `:few` or too `:many` child elements.
|
114
|
+
# @option options [Integer] :index index of `:element` in its parent Array.
|
115
|
+
# @return [String]
|
116
|
+
# @see {#error_at}
|
117
|
+
def length_error_at(options={})
|
118
|
+
options.assert_valid_keys(:element, :extreme, :index)
|
119
|
+
extreme = options.fetch(:extreme)
|
120
|
+
|
121
|
+
prefix = "has too #{extreme} elements"
|
122
|
+
error = error_at(
|
123
|
+
:element => options[:element],
|
124
|
+
:index => options[:index],
|
125
|
+
:prefix => prefix
|
126
|
+
)
|
127
|
+
|
128
|
+
error
|
129
|
+
end
|
130
|
+
|
131
|
+
# Generates a clause with the location of element and its value.
|
132
|
+
#
|
133
|
+
# @param options [Hash{Symbol => String,Integer}]
|
134
|
+
# @option options [Object, #inspect] :element an element in a parent Array.
|
135
|
+
# @option options [Integer] :index index of `:element` in parent Array.
|
136
|
+
# @return [String] "at index <index> (<element.inspect>)"
|
137
|
+
def location_clause(options={})
|
138
|
+
options.assert_valid_keys(:element, :index)
|
139
|
+
|
140
|
+
element = options.fetch(:element)
|
141
|
+
index = options.fetch(:index)
|
142
|
+
|
143
|
+
clause = "at index #{index} (#{element.inspect})"
|
144
|
+
|
145
|
+
clause
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
# Validates that the password is strong.
|
2
|
+
class PasswordIsStrongValidator < ActiveModel::EachValidator
|
3
|
+
#
|
4
|
+
# CONSTANTS
|
5
|
+
#
|
6
|
+
|
7
|
+
# Password that are used too often and will be easily guessed.
|
8
|
+
COMMON_PASSWORDS = %w{
|
9
|
+
password pass root admin metasploit
|
10
|
+
msf 123456 qwerty abc123 letmein monkey link182 demo
|
11
|
+
changeme test1234 rapid7
|
12
|
+
}
|
13
|
+
|
14
|
+
# Validates that `value` is a strong password. A password is strong if it meets the following rules:
|
15
|
+
# * SHOULD contain at least one letter.
|
16
|
+
# * SHOULD contain at least one digit.
|
17
|
+
# * SHOULD contain at least one special character.
|
18
|
+
# * SHOULD NOT contain `record.username` (case-insensitive).
|
19
|
+
# * SHOULD NOT be in {COMMON_PASSWORDS}.
|
20
|
+
# * SHOULD NOT repetitions.
|
21
|
+
#
|
22
|
+
# @param record [#errors, #username, ActiveRecord::Base] ActiveModel or ActiveRecord that supports #username method.
|
23
|
+
# @param attribute [Symbol] password attribute name.
|
24
|
+
# @param value [String] a password.
|
25
|
+
# @return [void]
|
26
|
+
def validate_each(record, attribute, value)
|
27
|
+
return if value.blank?
|
28
|
+
|
29
|
+
if is_simple?(value)
|
30
|
+
record.errors[attribute] << 'must contain letters, numbers, and at least one special character'
|
31
|
+
end
|
32
|
+
|
33
|
+
if contains_username?(record.username, value)
|
34
|
+
record.errors[attribute] << 'must not contain the username'
|
35
|
+
end
|
36
|
+
|
37
|
+
if is_common_password?(value)
|
38
|
+
record.errors[attribute] << 'must not be a common password'
|
39
|
+
end
|
40
|
+
|
41
|
+
if contains_repetition?(value)
|
42
|
+
record.errors[attribute] << 'must not be a predictable sequence of characters'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
# Password repetition (quite basic) -- no "aaaaaa" or "ababab" or "abcabc" or
|
49
|
+
# "abcdabcd" (but note that the user can use "aaaaaab" or something).
|
50
|
+
#
|
51
|
+
# @param password [String]
|
52
|
+
# @return [Boolean]
|
53
|
+
def contains_repetition?(password)
|
54
|
+
if password.scan(/./).uniq.size < 2
|
55
|
+
return true
|
56
|
+
end
|
57
|
+
|
58
|
+
if (password.size % 2 == 0) and (password.scan(/../).uniq.size < 2)
|
59
|
+
return true
|
60
|
+
end
|
61
|
+
|
62
|
+
if (password.size % 3 == 0) and (password.scan(/.../).uniq.size < 2)
|
63
|
+
return true
|
64
|
+
end
|
65
|
+
|
66
|
+
if (password.size % 4 == 0) and (password.scan(/..../).uniq.size < 2)
|
67
|
+
return true
|
68
|
+
end
|
69
|
+
|
70
|
+
false
|
71
|
+
end
|
72
|
+
|
73
|
+
# Whether username is in password (case-insensitively).
|
74
|
+
#
|
75
|
+
# @return [false] if `password` is blank.
|
76
|
+
# @return [false] if `username` is blank.
|
77
|
+
# @return [false] unless `username` is in `password`.
|
78
|
+
# @return [true] if `username` is in `password`.
|
79
|
+
def contains_username?(username, password)
|
80
|
+
contains = false
|
81
|
+
|
82
|
+
unless password.blank? or username.blank?
|
83
|
+
escaped_username = Regexp.escape(username)
|
84
|
+
username_regexp = Regexp.new(escaped_username, Regexp::IGNORECASE)
|
85
|
+
|
86
|
+
if username_regexp.match(password)
|
87
|
+
contains = true
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
contains
|
92
|
+
end
|
93
|
+
|
94
|
+
# Whether `password` is in {COMMON_PASSWORDS} or a simple variation of a password in {COMMON_PASSWORDS}.
|
95
|
+
#
|
96
|
+
# @param password [String]
|
97
|
+
# @return [Boolean]
|
98
|
+
def is_common_password?(password)
|
99
|
+
COMMON_PASSWORDS.each do |pw|
|
100
|
+
common_pw = [pw, pw + "!", pw + "1", pw + "12", pw + "123", pw + "1234"]
|
101
|
+
if common_pw.include?(password.downcase)
|
102
|
+
return true
|
103
|
+
end
|
104
|
+
end
|
105
|
+
false
|
106
|
+
end
|
107
|
+
|
108
|
+
# Returns whether the password is simple.
|
109
|
+
#
|
110
|
+
# @return [false] if password contains a letter, digit and special character.
|
111
|
+
# @return [true] otherwise
|
112
|
+
def is_simple?(password)
|
113
|
+
not (password =~ /[A-Za-z]/ and password =~ /[0-9]/ and password =~ /[\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x3a\x3b\x3c\x3d\x3e\x3f\x5b\x5c\x5d\x5e\x5f\x60\x7b\x7c\x7d\x7e]/)
|
114
|
+
end
|
115
|
+
end
|