wpxf 2.0.0a
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/bin/wpxf +52 -0
- data/data/banners/default.txt +16 -0
- data/data/js/ajax_download.js +33 -0
- data/data/js/ajax_post.js +18 -0
- data/data/js/create_wp_user.js +24 -0
- data/data/js/post.js +20 -0
- data/data/json/browser_usage_by_frequency.json +64 -0
- data/data/json/commands.json +116 -0
- data/data/php/bind_php.php +43 -0
- data/data/php/download_exec.php +36 -0
- data/data/php/exec.php +3 -0
- data/data/php/exec_methods.php +47 -0
- data/data/php/meterpreter_bind_tcp.php +1 -0
- data/data/php/meterpreter_bind_tcp_ipv6.php +1 -0
- data/data/php/meterpreter_reverse_tcp.php +1 -0
- data/data/php/preamble.php +17 -0
- data/data/php/reverse_tcp.php +76 -0
- data/db/config.yml +17 -0
- data/db/env.rb +19 -0
- data/db/migrations/001_create_workspaces.rb +15 -0
- data/db/migrations/002_create_credentials.rb +20 -0
- data/db/migrations/003_add_credential_type.rb +13 -0
- data/db/migrations/004_add_unique_workspace_name_index.rb +19 -0
- data/db/migrations/005_add_logs.rb +16 -0
- data/db/migrations/006_create_modules.rb +18 -0
- data/db/migrations/007_create_loot_items.rb +21 -0
- data/lib/wpxf.rb +54 -0
- data/lib/wpxf/cli/auto_complete.rb +121 -0
- data/lib/wpxf/cli/banner.rb +47 -0
- data/lib/wpxf/cli/console.rb +146 -0
- data/lib/wpxf/cli/context.rb +35 -0
- data/lib/wpxf/cli/creds.rb +56 -0
- data/lib/wpxf/cli/help.rb +125 -0
- data/lib/wpxf/cli/loaded_module.rb +67 -0
- data/lib/wpxf/cli/loot.rb +81 -0
- data/lib/wpxf/cli/module_cache.rb +59 -0
- data/lib/wpxf/cli/module_info.rb +62 -0
- data/lib/wpxf/cli/modules.rb +94 -0
- data/lib/wpxf/cli/options.rb +105 -0
- data/lib/wpxf/cli/output.rb +110 -0
- data/lib/wpxf/cli/workspace.rb +80 -0
- data/lib/wpxf/core.rb +18 -0
- data/lib/wpxf/core/data_file.rb +27 -0
- data/lib/wpxf/core/event_emitter.rb +30 -0
- data/lib/wpxf/core/module.rb +140 -0
- data/lib/wpxf/core/module_authentication.rb +48 -0
- data/lib/wpxf/core/module_info.rb +74 -0
- data/lib/wpxf/core/options.rb +175 -0
- data/lib/wpxf/core/opts/boolean_option.rb +37 -0
- data/lib/wpxf/core/opts/enum_option.rb +15 -0
- data/lib/wpxf/core/opts/integer_option.rb +74 -0
- data/lib/wpxf/core/opts/option.rb +121 -0
- data/lib/wpxf/core/opts/path_option.rb +15 -0
- data/lib/wpxf/core/opts/port_option.rb +25 -0
- data/lib/wpxf/core/opts/string_option.rb +33 -0
- data/lib/wpxf/core/output_emitters.rb +67 -0
- data/lib/wpxf/core/payload.rb +135 -0
- data/lib/wpxf/db.rb +17 -0
- data/lib/wpxf/db/credentials.rb +37 -0
- data/lib/wpxf/db/loot.rb +19 -0
- data/lib/wpxf/helpers/export.rb +48 -0
- data/lib/wpxf/models/credential.rb +29 -0
- data/lib/wpxf/models/log.rb +22 -0
- data/lib/wpxf/models/loot_item.rb +37 -0
- data/lib/wpxf/models/module.rb +32 -0
- data/lib/wpxf/models/workspace.rb +28 -0
- data/lib/wpxf/modules.rb +62 -0
- data/lib/wpxf/modules/auxiliary/dos/load_scripts_dos.rb +129 -0
- data/lib/wpxf/modules/auxiliary/dos/long_password_dos.rb +141 -0
- data/lib/wpxf/modules/auxiliary/dos/post_grid_file_deletion.rb +67 -0
- data/lib/wpxf/modules/auxiliary/dos/wp_v4.7.2_csrf_dos.rb +83 -0
- data/lib/wpxf/modules/auxiliary/file_download/ad_widget_php_file_download.rb +54 -0
- data/lib/wpxf/modules/auxiliary/file_download/all_in_one_migration_export.rb +68 -0
- data/lib/wpxf/modules/auxiliary/file_download/antioch_arbitrary_file_download.rb +41 -0
- data/lib/wpxf/modules/auxiliary/file_download/candidate_application_form_arbitrary_file_download.rb +41 -0
- data/lib/wpxf/modules/auxiliary/file_download/cp_image_store_arbitrary_file_download.rb +82 -0
- data/lib/wpxf/modules/auxiliary/file_download/direct_download_for_woocommerce_file_download.rb +60 -0
- data/lib/wpxf/modules/auxiliary/file_download/duplicator_csrf_db_export.rb +169 -0
- data/lib/wpxf/modules/auxiliary/file_download/ghost_unrestricted_export_download.rb +85 -0
- data/lib/wpxf/modules/auxiliary/file_download/history_collection_arbitrary_file_download.rb +50 -0
- data/lib/wpxf/modules/auxiliary/file_download/imdb_profile_widget_arbitrary_file_download.rb +42 -0
- data/lib/wpxf/modules/auxiliary/file_download/mail_masta_unauthenticated_local_file_inclusion.rb +48 -0
- data/lib/wpxf/modules/auxiliary/file_download/membership_simplified_arbitrary_file_download.rb +50 -0
- data/lib/wpxf/modules/auxiliary/file_download/memphis_documents_library_arbitrary_file_download.rb +41 -0
- data/lib/wpxf/modules/auxiliary/file_download/recent_backups_arbitrary_file_download.rb +42 -0
- data/lib/wpxf/modules/auxiliary/file_download/simple_download_monitor_file_disclosure.rb +79 -0
- data/lib/wpxf/modules/auxiliary/file_download/simple_download_monitor_file_download.rb +69 -0
- data/lib/wpxf/modules/auxiliary/file_download/simple_image_manipulator_arbitrary_file_download.rb +43 -0
- data/lib/wpxf/modules/auxiliary/file_download/site_editor_file_download.rb +53 -0
- data/lib/wpxf/modules/auxiliary/file_download/wp_background_takeover_file_download.rb +42 -0
- data/lib/wpxf/modules/auxiliary/file_download/wp_hide_security_enhancer_file_download.rb +51 -0
- data/lib/wpxf/modules/auxiliary/file_download/wp_marketplace_v2.4_file_download.rb +141 -0
- data/lib/wpxf/modules/auxiliary/file_download/wp_vault_file_download.rb +46 -0
- data/lib/wpxf/modules/auxiliary/file_download/wptf_image_gallery_arbitrary_file_download.rb +43 -0
- data/lib/wpxf/modules/auxiliary/hash_dump/events_hash_dump.rb +59 -0
- data/lib/wpxf/modules/auxiliary/hash_dump/gallery_album_hash_dump.rb +61 -0
- data/lib/wpxf/modules/auxiliary/hash_dump/jtrt_responsive_tables_hash_dump.rb +69 -0
- data/lib/wpxf/modules/auxiliary/hash_dump/registrationmagic_hash_dump.rb +62 -0
- data/lib/wpxf/modules/auxiliary/hash_dump/simple_ads_manager_hash_dump.rb +67 -0
- data/lib/wpxf/modules/auxiliary/hash_dump/simple_events_calendar_hash_dump.rb +69 -0
- data/lib/wpxf/modules/auxiliary/hash_dump/sql_shortcode_hash_dump.rb +59 -0
- data/lib/wpxf/modules/auxiliary/hash_dump/ultimate_csv_importer_user_extract.rb +133 -0
- data/lib/wpxf/modules/auxiliary/hash_dump/ultimate_product_catalogue_hash_dump.rb +60 -0
- data/lib/wpxf/modules/auxiliary/info/download_manager_directory_listing_disclosure.rb +106 -0
- data/lib/wpxf/modules/auxiliary/info/download_monitor_log_export.rb +111 -0
- data/lib/wpxf/modules/auxiliary/info/email_subscribers_user_list_disclosure.rb +103 -0
- data/lib/wpxf/modules/auxiliary/info/file_manager_database_credentials.rb +86 -0
- data/lib/wpxf/modules/auxiliary/info/user_meta_manager_information_disclosure.rb +96 -0
- data/lib/wpxf/modules/auxiliary/info/woocommerce_email_test_order_disclosure.rb +53 -0
- data/lib/wpxf/modules/auxiliary/info/woocommerce_order_import_export_order_disclosure.rb +60 -0
- data/lib/wpxf/modules/auxiliary/info/wp_v4.7_user_info_disclosure.rb +86 -0
- data/lib/wpxf/modules/auxiliary/misc/email_users_csrf_bulk_mail.rb +89 -0
- data/lib/wpxf/modules/auxiliary/misc/qards_local_port_scan.rb +66 -0
- data/lib/wpxf/modules/auxiliary/misc/simple_ads_manager_sql_injection.rb +124 -0
- data/lib/wpxf/modules/auxiliary/misc/wp_v4.7.1_content_injection.rb +107 -0
- data/lib/wpxf/modules/auxiliary/priv_esc/custom_contact_forms_privilege_escalation.rb +125 -0
- data/lib/wpxf/modules/auxiliary/priv_esc/download_manager_authenticated_privilege_escalation.rb +71 -0
- data/lib/wpxf/modules/auxiliary/priv_esc/download_manager_privilege_escalation.rb +92 -0
- data/lib/wpxf/modules/auxiliary/priv_esc/easy_cart_privilege_escalation.rb +92 -0
- data/lib/wpxf/modules/auxiliary/priv_esc/platform_privilege_escalation.rb +93 -0
- data/lib/wpxf/modules/auxiliary/priv_esc/super_socializer_auth_bypass.rb +154 -0
- data/lib/wpxf/modules/auxiliary/priv_esc/user_meta_manager_privilege_escalation.rb +76 -0
- data/lib/wpxf/modules/auxiliary/priv_esc/user_role_editor_privilege_escalation.rb +57 -0
- data/lib/wpxf/modules/auxiliary/priv_esc/wp_front_end_profile_privilege_escalation.rb +92 -0
- data/lib/wpxf/modules/auxiliary/priv_esc/wplms_privilege_escalation.rb +117 -0
- data/lib/wpxf/modules/exploit/rfi/advanced_custom_fields_remote_file_inclusion.rb +98 -0
- data/lib/wpxf/modules/exploit/rfi/fast_image_adder_v1.1_rfi_shell_upload.rb +91 -0
- data/lib/wpxf/modules/exploit/rfi/flickr_picture_backup_rfi_shell_upload.rb +94 -0
- data/lib/wpxf/modules/exploit/rfi/gwolle_guestbook_remote_file_inclusion.rb +96 -0
- data/lib/wpxf/modules/exploit/rfi/wp_mobile_detector_rfi_shell_upload.rb +90 -0
- data/lib/wpxf/modules/exploit/shell/accesspress_anonymous_post_pro_shell_upload.rb +71 -0
- data/lib/wpxf/modules/exploit/shell/acf_frontend_display_shell_upload.rb +41 -0
- data/lib/wpxf/modules/exploit/shell/adblock_blocker_shell_upload.rb +41 -0
- data/lib/wpxf/modules/exploit/shell/admin_shell_upload.rb +47 -0
- data/lib/wpxf/modules/exploit/shell/aries_revslider_shell_upload.rb +17 -0
- data/lib/wpxf/modules/exploit/shell/avada_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/awake_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/beach_apollo_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/bretheon_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/centum_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/charity_theme_shell_upload.rb +38 -0
- data/lib/wpxf/modules/exploit/shell/construct_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/creative_contact_form_shell_upload.rb +82 -0
- data/lib/wpxf/modules/exploit/shell/delete_all_comments_shell_upload.rb +65 -0
- data/lib/wpxf/modules/exploit/shell/designfolio_plus_shell_upload.rb +50 -0
- data/lib/wpxf/modules/exploit/shell/divi_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/easy_cart_shell_upload.rb +174 -0
- data/lib/wpxf/modules/exploit/shell/echelon_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/elegance_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/estatik_v2.2.5_shell_upload.rb +53 -0
- data/lib/wpxf/modules/exploit/shell/evo_theme_shell_upload.rb +37 -0
- data/lib/wpxf/modules/exploit/shell/front_end_file_upload_and_manager_shell_upload.rb +42 -0
- data/lib/wpxf/modules/exploit/shell/fusion_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/gallery_pro_theme_shell_upload.rb +37 -0
- data/lib/wpxf/modules/exploit/shell/gravity_forms_v1.8.19_shell_upload.rb +92 -0
- data/lib/wpxf/modules/exploit/shell/holding_pattern_shell_upload.rb +56 -0
- data/lib/wpxf/modules/exploit/shell/inboundio_marketing_shell_upload.rb +82 -0
- data/lib/wpxf/modules/exploit/shell/incredible_wp_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/infusionsoft_shell_upload.rb +76 -0
- data/lib/wpxf/modules/exploit/shell/mailcwp_authenticated_shell_upload.rb +35 -0
- data/lib/wpxf/modules/exploit/shell/mailcwp_unauthenticated_shell_upload.rb +51 -0
- data/lib/wpxf/modules/exploit/shell/mailpoet_newsletters_shell_upload.rb +90 -0
- data/lib/wpxf/modules/exploit/shell/manbiz2_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/medicate_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/method_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/micro_theme_shell_upload.rb +37 -0
- data/lib/wpxf/modules/exploit/shell/mobile_app_builder_shell_upload.rb +31 -0
- data/lib/wpxf/modules/exploit/shell/mobile_app_native_v3_shell_upload.rb +46 -0
- data/lib/wpxf/modules/exploit/shell/mobile_friendly_app_builder_shell_upload.rb +29 -0
- data/lib/wpxf/modules/exploit/shell/modular_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/myriad_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/n_media_website_contact_form_shell_upload.rb +82 -0
- data/lib/wpxf/modules/exploit/shell/n_media_website_contact_form_v1.9_shell_upload.rb +45 -0
- data/lib/wpxf/modules/exploit/shell/neosense_shell_upload.rb +41 -0
- data/lib/wpxf/modules/exploit/shell/ninja_forms_unauthenticated_shell_upload.rb +83 -0
- data/lib/wpxf/modules/exploit/shell/participants_database_v1.5.4.8_shell_upload.rb +153 -0
- data/lib/wpxf/modules/exploit/shell/persuasion_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/photo_album_plus_xss_shell_upload.rb +89 -0
- data/lib/wpxf/modules/exploit/shell/photo_gallery_shell_upload.rb +128 -0
- data/lib/wpxf/modules/exploit/shell/premium_seo_pack_shell_upload.rb +35 -0
- data/lib/wpxf/modules/exploit/shell/reflex_gallery_shell_upload.rb +91 -0
- data/lib/wpxf/modules/exploit/shell/revslider_shell_upload.rb +93 -0
- data/lib/wpxf/modules/exploit/shell/seabird_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/showbiz_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/simplecart_shell_upload.rb +91 -0
- data/lib/wpxf/modules/exploit/shell/soulmedic_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/striking_r_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/super_socializer_shell_upload.rb +110 -0
- data/lib/wpxf/modules/exploit/shell/symposium_shell_upload.rb +85 -0
- data/lib/wpxf/modules/exploit/shell/tevolution_shell_upload.rb +50 -0
- data/lib/wpxf/modules/exploit/shell/ultimate_member_shell_upload.rb +132 -0
- data/lib/wpxf/modules/exploit/shell/ultimate_product_catalogue_shell_upload.rb +47 -0
- data/lib/wpxf/modules/exploit/shell/ultimatum_revslider_shell_upload.rb +15 -0
- data/lib/wpxf/modules/exploit/shell/userpro_shell_upload.rb +70 -0
- data/lib/wpxf/modules/exploit/shell/webapp_builder_shell_upload.rb +29 -0
- data/lib/wpxf/modules/exploit/shell/windows_desktop_and_iphone_photo_uploader_shell_upload.rb +45 -0
- data/lib/wpxf/modules/exploit/shell/woocommerce_amazon_affiliates_v8_shell_upload.rb +81 -0
- data/lib/wpxf/modules/exploit/shell/woocommerce_product_addons_shell_upload.rb +42 -0
- data/lib/wpxf/modules/exploit/shell/work_the_flow_shell_upload.rb +57 -0
- data/lib/wpxf/modules/exploit/shell/wp2android_shell_upload.rb +29 -0
- data/lib/wpxf/modules/exploit/shell/wp_front_end_repository_manager_shell_upload.rb +42 -0
- data/lib/wpxf/modules/exploit/shell/wp_marketplace_shell_upload.rb +40 -0
- data/lib/wpxf/modules/exploit/shell/wp_support_plus_responsive_ticket_system_shell_upload.rb +46 -0
- data/lib/wpxf/modules/exploit/shell/wpshop_shell_upload.rb +45 -0
- data/lib/wpxf/modules/exploit/shell/wptouch_authenticated_shell_upload.rb +66 -0
- data/lib/wpxf/modules/exploit/shell/wsecure_lite_shell_upload.rb +57 -0
- data/lib/wpxf/modules/exploit/xss/reflected/2kb_amazon_affiliates_store_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/admin_custom_login_reflected_xss_shell_upload.rb +42 -0
- data/lib/wpxf/modules/exploit/xss/reflected/adsense_plugin_reflected_xss_shell_upload.rb +21 -0
- data/lib/wpxf/modules/exploit/xss/reflected/affiliate_ads_builder_xss_shell_upload.rb +53 -0
- data/lib/wpxf/modules/exploit/xss/reflected/affiliatewp_reflected_xss_shell_upload.rb +39 -0
- data/lib/wpxf/modules/exploit/xss/reflected/ajax_random_post_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/all_in_one_migration_reflected_xss_shell_upload.rb +33 -0
- data/lib/wpxf/modules/exploit/xss/reflected/all_in_one_schema_rich_snippets_reflected_xss_shell_upload.rb +39 -0
- data/lib/wpxf/modules/exploit/xss/reflected/all_in_one_wp_security_reflected_xss_shell_upload.rb +37 -0
- data/lib/wpxf/modules/exploit/xss/reflected/alpine_photo_tile_for_instagram_reflected_xss_shell_upload.rb +40 -0
- data/lib/wpxf/modules/exploit/xss/reflected/answer_my_question_reflected_xss_shell_upload.rb +41 -0
- data/lib/wpxf/modules/exploit/xss/reflected/anti_plagiarism_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/anyvar_reflected_xss_shell_upload.rb +40 -0
- data/lib/wpxf/modules/exploit/xss/reflected/atahualpa_reflected_xss_shell_upload.rb +66 -0
- data/lib/wpxf/modules/exploit/xss/reflected/backup_guard_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/brafton_content_importer_reflected_xss_shell_upload.rb +35 -0
- data/lib/wpxf/modules/exploit/xss/reflected/bws_featured_posts_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/bws_google_analytics_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/bws_google_maps_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/bws_latest_posts_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/bws_linkedin_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/bws_panel_reflected_xss_shell_upload.rb +45 -0
- data/lib/wpxf/modules/exploit/xss/reflected/bws_pinterest_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/bws_popular_posts_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/bws_portfolio_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/bws_smtp_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/bws_testimonials_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/caldera_forms_v1.5.4_xss_shell_upload.rb +33 -0
- data/lib/wpxf/modules/exploit/xss/reflected/captcha_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/car_rental_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/check_email_reflected_xss_shell_upload.rb +44 -0
- data/lib/wpxf/modules/exploit/xss/reflected/claptastic_clap_button_reflected_xss_shell_upload.rb +46 -0
- data/lib/wpxf/modules/exploit/xss/reflected/code_snippets_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/colorway_reflected_xss_shell_upload.rb +47 -0
- data/lib/wpxf/modules/exploit/xss/reflected/concours_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/connections_reflected_xss_shell_upload.rb +35 -0
- data/lib/wpxf/modules/exploit/xss/reflected/contact_form_multi_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/contact_form_plugin_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/contact_form_to_db_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/content_grabber_reflected_xss_shell_upload.rb +43 -0
- data/lib/wpxf/modules/exploit/xss/reflected/content_slide_reflected_xss_shell_upload.rb +38 -0
- data/lib/wpxf/modules/exploit/xss/reflected/count_per_day_reflected_xss_shell_upload.rb +40 -0
- data/lib/wpxf/modules/exploit/xss/reflected/csv_import_export_xss_shell_upload.rb +35 -0
- data/lib/wpxf/modules/exploit/xss/reflected/csv_import_reflected_xss_shell_upload.rb +37 -0
- data/lib/wpxf/modules/exploit/xss/reflected/custom_admin_page_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/custom_fields_search_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/custom_map_xss_shell_upload.rb +35 -0
- data/lib/wpxf/modules/exploit/xss/reflected/custom_metas_reflected_xss_shell_upload.rb +35 -0
- data/lib/wpxf/modules/exploit/xss/reflected/custom_permalinks_xss_shell_upload.rb +33 -0
- data/lib/wpxf/modules/exploit/xss/reflected/custom_search_plugin_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/defa_online_image_protector_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/donate_button_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/download_manager_reflected_xss_shell_upload.rb +39 -0
- data/lib/wpxf/modules/exploit/xss/reflected/duplicator_csrf_xss_shell_upload.rb +37 -0
- data/lib/wpxf/modules/exploit/xss/reflected/easy_contact_form_builder_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/emag_marketplace_connector_xss_shell_upload.rb +38 -0
- data/lib/wpxf/modules/exploit/xss/reflected/email_queue_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/email_users_reflected_xss_shell_upload.rb +40 -0
- data/lib/wpxf/modules/exploit/xss/reflected/enhanced_tooltip_glossary_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/error_log_viewer_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/events_made_easy_reflected_xss_shell_upload.rb +111 -0
- data/lib/wpxf/modules/exploit/xss/reflected/facebook_button_plugin_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/faq_wd_reflected_xss_shell_upload.rb +41 -0
- data/lib/wpxf/modules/exploit/xss/reflected/formbuilder_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/gallery_categories_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/gallery_plugin_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/gd_rating_system_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/google_analytics_dashboard_reflected_xss_shell_upload.rb +41 -0
- data/lib/wpxf/modules/exploit/xss/reflected/google_captcha_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/google_maps_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/google_one_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/google_shortlink_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/google_sitemap_plugin_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/gravity_forms_v1.9.15.11_reflected_xss_shell_upload.rb +35 -0
- data/lib/wpxf/modules/exploit/xss/reflected/hdw_tube_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/hero_maps_pro_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/htaccess_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/huge_it_image_gallery_reflected_xss_shell_upload.rb +41 -0
- data/lib/wpxf/modules/exploit/xss/reflected/import_woocommerce_reflected_xss_shell_upload.rb +37 -0
- data/lib/wpxf/modules/exploit/xss/reflected/impress_listings_reflected_xss_shell_upload.rb +87 -0
- data/lib/wpxf/modules/exploit/xss/reflected/indexisto_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/infusionsoft_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/instagram_feed_csrf_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/instalinker_reflected_xss_shell_upload.rb +40 -0
- data/lib/wpxf/modules/exploit/xss/reflected/job_board_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/job_manager_reflected_xss_shell_upload.rb +55 -0
- data/lib/wpxf/modules/exploit/xss/reflected/leenkme_reflected_xss_shell_upload.rb +41 -0
- data/lib/wpxf/modules/exploit/xss/reflected/lightbox_reflected_xss_shell_upload.rb +64 -0
- data/lib/wpxf/modules/exploit/xss/reflected/limit_attempts_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/link_library_reflected_xss_shell_upload.rb +33 -0
- data/lib/wpxf/modules/exploit/xss/reflected/magic_fields_reflected_xss_shell_upload.rb +36 -0
- data/lib/wpxf/modules/exploit/xss/reflected/mailchimp_for_wp_reflected_xss_shell_upload.rb +33 -0
- data/lib/wpxf/modules/exploit/xss/reflected/mailpoet_newsletters_reflected_xss_shell_upload.rb +49 -0
- data/lib/wpxf/modules/exploit/xss/reflected/mailpoet_newsletters_v272_reflected_xss_shell_upload.rb +36 -0
- data/lib/wpxf/modules/exploit/xss/reflected/master_slider_reflected_xss_shell_upload.rb +41 -0
- data/lib/wpxf/modules/exploit/xss/reflected/maxbuttons_reflected_xss_shell_upload.rb +38 -0
- data/lib/wpxf/modules/exploit/xss/reflected/minimax_page_layout_builder_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/msmc_redirect_after_comment_reflected_xss_shell_upload.rb +38 -0
- data/lib/wpxf/modules/exploit/xss/reflected/multilanguage_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/new_year_firework_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/ninja_forms_reflected_xss_shell_upload.rb +37 -0
- data/lib/wpxf/modules/exploit/xss/reflected/no_external_links_reflected_xss_shell_upload.rb +39 -0
- data/lib/wpxf/modules/exploit/xss/reflected/ocim_mp3_reflected_xss_shell_upload.rb +38 -0
- data/lib/wpxf/modules/exploit/xss/reflected/pagination_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/pdf_print_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/peters_login_redirect_reflected_xss_shell_upload.rb +53 -0
- data/lib/wpxf/modules/exploit/xss/reflected/photo_gallery_xss_shell_upload.rb +46 -0
- data/lib/wpxf/modules/exploit/xss/reflected/pinterest_feed_xss_shell_upload.rb +37 -0
- data/lib/wpxf/modules/exploit/xss/reflected/podlove_podcast_publisher_reflected_xss_shell_upload.rb +36 -0
- data/lib/wpxf/modules/exploit/xss/reflected/pondol_form_to_mail_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/pootle_button_reflected_xss_shell_upload.rb +32 -0
- data/lib/wpxf/modules/exploit/xss/reflected/popcash_integration_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/popup_maker_reflected_xss_shell_upload.rb +39 -0
- data/lib/wpxf/modules/exploit/xss/reflected/portfolio_reflected_xss_shell_upload.rb +36 -0
- data/lib/wpxf/modules/exploit/xss/reflected/post_to_csv_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/profile_builder_reflected_xss_shell_upload.rb +40 -0
- data/lib/wpxf/modules/exploit/xss/reflected/profile_extra_fields_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/promobar_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/propertyhive_csrf_xss_shell_upload.rb +37 -0
- data/lib/wpxf/modules/exploit/xss/reflected/quiz_and_survey_master_reflected_xss_shell_upload.rb +44 -0
- data/lib/wpxf/modules/exploit/xss/reflected/quotes_and_tips_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/quotes_collection_reflected_xss_shell_upload.rb +38 -0
- data/lib/wpxf/modules/exploit/xss/reflected/rating_bws_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/re_attacher_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/realty_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/registrationmagic_reflected_xss_shell_upload.rb +38 -0
- data/lib/wpxf/modules/exploit/xss/reflected/relevant_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/responsive_lightbox_reflected_xss_shell_upload.rb +39 -0
- data/lib/wpxf/modules/exploit/xss/reflected/rockhoist_badges_reflected_xss_shell_upload.rb +41 -0
- data/lib/wpxf/modules/exploit/xss/reflected/sender_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/simpel_reserveren_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/simple_slideshow_manager_reflected_xss_shell_upload.rb +39 -0
- data/lib/wpxf/modules/exploit/xss/reflected/slideshow_gallery_reflected_xss_shell_upload.rb +35 -0
- data/lib/wpxf/modules/exploit/xss/reflected/smart_marketing_xss_shell_upload.rb +37 -0
- data/lib/wpxf/modules/exploit/xss/reflected/social_buttons_pack_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/social_login_bws_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/social_pug_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/sp_project_document_manager_reflected_xss_shell_upload.rb +41 -0
- data/lib/wpxf/modules/exploit/xss/reflected/spamfree_reflected_xss_shell_upload.rb +44 -0
- data/lib/wpxf/modules/exploit/xss/reflected/spiffy_calendar_reflected_xss_shell_upload.rb +49 -0
- data/lib/wpxf/modules/exploit/xss/reflected/splashing_images_reflected_xss_shell_upload.rb +39 -0
- data/lib/wpxf/modules/exploit/xss/reflected/subscriber_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/tidio_gallery_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/timesheet_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/tracking_code_manager_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/tribulant_newsletter_reflected_xss_shell_upload.rb +39 -0
- data/lib/wpxf/modules/exploit/xss/reflected/tribulant_slideshow_gallery_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/trust_form_reflected_xss_shell_upload.rb +37 -0
- data/lib/wpxf/modules/exploit/xss/reflected/twitter_plugin_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/ultimate_csv_importer_reflected_xss_shell_upload.rb +83 -0
- data/lib/wpxf/modules/exploit/xss/reflected/ultimate_form_builder_lite_reflected_xss_shell_upload.rb +30 -0
- data/lib/wpxf/modules/exploit/xss/reflected/updater_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/user_access_manager_reflected_xss_shell_upload.rb +35 -0
- data/lib/wpxf/modules/exploit/xss/reflected/user_login_history_xss_shell_upload.rb +35 -0
- data/lib/wpxf/modules/exploit/xss/reflected/user_role_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/visitors_online_reflected_xss_shell_upload.rb +20 -0
- data/lib/wpxf/modules/exploit/xss/reflected/w3_total_cache_reflected_xss_shell_upload.rb +38 -0
- data/lib/wpxf/modules/exploit/xss/reflected/wang_guard_reflected_xss_shell_upload.rb +33 -0
- data/lib/wpxf/modules/exploit/xss/reflected/whizz_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/woo_email_control_reflected_xss_shell_upload.rb +41 -0
- data/lib/wpxf/modules/exploit/xss/reflected/wordpress_firewall_reflected_xss_shell_upload.rb +38 -0
- data/lib/wpxf/modules/exploit/xss/reflected/wp_advanced_importer_reflected_xss_shell_upload.rb +37 -0
- data/lib/wpxf/modules/exploit/xss/reflected/wp_filebase_download_manager_reflected_xss_shell_upload.rb +37 -0
- data/lib/wpxf/modules/exploit/xss/reflected/wp_live_chat_support_reflected_xss_shell_upload.rb +40 -0
- data/lib/wpxf/modules/exploit/xss/reflected/wp_mailster_reflected_xss_shell_upload.rb +38 -0
- data/lib/wpxf/modules/exploit/xss/reflected/wp_members_reflected_xss_shell_upload.rb +39 -0
- data/lib/wpxf/modules/exploit/xss/reflected/wp_retina_2x_xss_shell_upload.rb +39 -0
- data/lib/wpxf/modules/exploit/xss/reflected/wp_statistics_12.0.9_reflected_xss_shell_upload.rb +39 -0
- data/lib/wpxf/modules/exploit/xss/reflected/wp_statistics_reflected_xss_shell_upload.rb +38 -0
- data/lib/wpxf/modules/exploit/xss/reflected/wp_v4.4_xss_shell_upload.rb +54 -0
- data/lib/wpxf/modules/exploit/xss/reflected/wp_whois_domain_reflected_xss_shell_upload.rb +41 -0
- data/lib/wpxf/modules/exploit/xss/reflected/wpsolr_reflected_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/yoast_seo_xss_shell_upload.rb +34 -0
- data/lib/wpxf/modules/exploit/xss/reflected/zurl_preview_xss_shell_upload.rb +38 -0
- data/lib/wpxf/modules/exploit/xss/stored/admin_management_xtended_xss_shell_upload.rb +172 -0
- data/lib/wpxf/modules/exploit/xss/stored/all_in_one_seo_pack_xss_shell_upload.rb +208 -0
- data/lib/wpxf/modules/exploit/xss/stored/alo_easymail_csrf_xss_shell_upload.rb +48 -0
- data/lib/wpxf/modules/exploit/xss/stored/appointment_schedule_booking_system_stored_xss_shell_upload.rb +41 -0
- data/lib/wpxf/modules/exploit/xss/stored/arabic_font_csrf_stored_xss_shell_upload.rb +39 -0
- data/lib/wpxf/modules/exploit/xss/stored/caldera_forms_stored_xss_shell_upload.rb +38 -0
- data/lib/wpxf/modules/exploit/xss/stored/content_audit_csrf_stored_xss_shell_upload.rb +83 -0
- data/lib/wpxf/modules/exploit/xss/stored/dw_question_answer_stored_xss_shell_upload.rb +91 -0
- data/lib/wpxf/modules/exploit/xss/stored/dwnldr_xss_shell_upload.rb +58 -0
- data/lib/wpxf/modules/exploit/xss/stored/embed_comment_images_stored_xss_shell_upload.rb +57 -0
- data/lib/wpxf/modules/exploit/xss/stored/flickr_rss_csrf_xss_shell_upload.rb +38 -0
- data/lib/wpxf/modules/exploit/xss/stored/four04_to_three01_stored_xss_shell_upload.rb +50 -0
- data/lib/wpxf/modules/exploit/xss/stored/gwolle_guestbook_stored_xss_shell_upload.rb +47 -0
- data/lib/wpxf/modules/exploit/xss/stored/imageinject_csrf_xss_shell_upload.rb +53 -0
- data/lib/wpxf/modules/exploit/xss/stored/instagram_feed_csrf_stored_xss_shell_upload.rb +51 -0
- data/lib/wpxf/modules/exploit/xss/stored/ithemes_security_stored_xss_shell_upload.rb +40 -0
- data/lib/wpxf/modules/exploit/xss/stored/ithemes_security_v6.9.0_stored_xss_shell_upload.rb +40 -0
- data/lib/wpxf/modules/exploit/xss/stored/mdc_private_message_xss_shell_upload.rb +118 -0
- data/lib/wpxf/modules/exploit/xss/stored/newsletter_by_supsystic_csrf_stored_xss_shell_upload.rb +43 -0
- data/lib/wpxf/modules/exploit/xss/stored/participants_database_v1.7.5.9_stored_xss_shell_upload.rb +80 -0
- data/lib/wpxf/modules/exploit/xss/stored/safe_editor_xss_shell_upload.rb +60 -0
- data/lib/wpxf/modules/exploit/xss/stored/smart_google_code_inserter_xss_shell_upload.rb +39 -0
- data/lib/wpxf/modules/exploit/xss/stored/social_media_widget_csrf_xss_shell_upload.rb +39 -0
- data/lib/wpxf/modules/exploit/xss/stored/srbtranslatin_csrf_xss_shell_upload.rb +42 -0
- data/lib/wpxf/modules/exploit/xss/stored/ultimate_addons_for_vc_authenticated_stored_xss_shell_upload.rb +48 -0
- data/lib/wpxf/modules/exploit/xss/stored/ultimate_addons_for_vc_reflected_stored_xss_shell_upload.rb +37 -0
- data/lib/wpxf/modules/exploit/xss/stored/universal_analytics_authenticated_xss_shell_upload.rb +90 -0
- data/lib/wpxf/modules/exploit/xss/stored/user_login_log_authenticated_stored_xss_shell_upload.rb +45 -0
- data/lib/wpxf/modules/exploit/xss/stored/woo_custom_checkout_field_xss_shell_upload.rb +44 -0
- data/lib/wpxf/modules/exploit/xss/stored/wp_google_maps_stored_xss_shell_upload.rb +55 -0
- data/lib/wpxf/modules/exploit/xss/stored/wp_live_chat_support_stored_xss_shell_upload.rb +99 -0
- data/lib/wpxf/modules/exploit/xss/stored/wp_piwik_stored_xss_shell_upload.rb +36 -0
- data/lib/wpxf/modules/exploit/xss/stored/wp_v4.3_shortcode_xss_shell_upload.rb +55 -0
- data/lib/wpxf/net.rb +16 -0
- data/lib/wpxf/net/cookie_jar.rb +37 -0
- data/lib/wpxf/net/http_client.rb +206 -0
- data/lib/wpxf/net/http_options.rb +98 -0
- data/lib/wpxf/net/http_response.rb +44 -0
- data/lib/wpxf/net/http_server.rb +186 -0
- data/lib/wpxf/net/typhoeus_helper.rb +46 -0
- data/lib/wpxf/net/user_agent.rb +193 -0
- data/lib/wpxf/payloads/bind_php.rb +95 -0
- data/lib/wpxf/payloads/custom.rb +42 -0
- data/lib/wpxf/payloads/download_exec.rb +43 -0
- data/lib/wpxf/payloads/exec.rb +43 -0
- data/lib/wpxf/payloads/meterpreter_bind_tcp.rb +64 -0
- data/lib/wpxf/payloads/meterpreter_reverse_tcp.rb +50 -0
- data/lib/wpxf/payloads/reverse_tcp.rb +152 -0
- data/lib/wpxf/payloads/socket_helper.rb +50 -0
- data/lib/wpxf/utility.rb +12 -0
- data/lib/wpxf/utility/body_builder.rb +151 -0
- data/lib/wpxf/utility/reference_inflater.rb +34 -0
- data/lib/wpxf/utility/text.rb +81 -0
- data/lib/wpxf/versioning.rb +11 -0
- data/lib/wpxf/versioning/browser_versions.rb +56 -0
- data/lib/wpxf/versioning/os_versions.rb +18 -0
- data/lib/wpxf/wordpress.rb +24 -0
- data/lib/wpxf/wordpress/comments.rb +89 -0
- data/lib/wpxf/wordpress/file_download.rb +168 -0
- data/lib/wpxf/wordpress/fingerprint.rb +238 -0
- data/lib/wpxf/wordpress/hash_dump.rb +264 -0
- data/lib/wpxf/wordpress/login.rb +60 -0
- data/lib/wpxf/wordpress/options.rb +27 -0
- data/lib/wpxf/wordpress/plugin.rb +102 -0
- data/lib/wpxf/wordpress/posts.rb +26 -0
- data/lib/wpxf/wordpress/reflected_xss.rb +40 -0
- data/lib/wpxf/wordpress/shell_upload.rb +172 -0
- data/lib/wpxf/wordpress/staged_reflected_xss.rb +82 -0
- data/lib/wpxf/wordpress/stored_xss.rb +73 -0
- data/lib/wpxf/wordpress/urls.rb +131 -0
- data/lib/wpxf/wordpress/user.rb +35 -0
- data/lib/wpxf/wordpress/xss.rb +143 -0
- data/wpxf.gemspec +33 -0
- metadata +708 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Wpxf
|
|
4
|
+
module Cli
|
|
5
|
+
# Provides functionality for interacting with workspaces.
|
|
6
|
+
module Workspace
|
|
7
|
+
def initialize
|
|
8
|
+
super
|
|
9
|
+
|
|
10
|
+
self.active_workspace = Wpxf::Models::Workspace.first(name: 'default')
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def workspace(*args)
|
|
14
|
+
return list_workspaces if args.length.zero?
|
|
15
|
+
|
|
16
|
+
case args[0]
|
|
17
|
+
when '-a'
|
|
18
|
+
add_workspace(args[1])
|
|
19
|
+
when '-d'
|
|
20
|
+
delete_workspace(args[1])
|
|
21
|
+
else
|
|
22
|
+
switch_workspace(args[0])
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def workspaces
|
|
27
|
+
Wpxf::Models::Workspace.all
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def add_workspace(name)
|
|
31
|
+
unless Wpxf::Models::Workspace.where(name: name).count.zero?
|
|
32
|
+
return print_warning "#{name} already exists"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
begin
|
|
36
|
+
Wpxf::Models::Workspace.create(name: name)
|
|
37
|
+
return print_good "Added workspace: #{name}"
|
|
38
|
+
rescue Sequel::ValidationFailed
|
|
39
|
+
print_warning 'Workspace names may only contain 1-50 alphanumeric characters and underscores'
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def list_workspaces
|
|
44
|
+
workspaces.each do |workspace|
|
|
45
|
+
if workspace.id == active_workspace.id
|
|
46
|
+
print_info "#{workspace.name} #{'(active)'.green}"
|
|
47
|
+
else
|
|
48
|
+
print_info workspace.name
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def switch_workspace(name)
|
|
54
|
+
next_workspace = Wpxf::Models::Workspace.first(name: name)
|
|
55
|
+
|
|
56
|
+
if next_workspace
|
|
57
|
+
self.active_workspace = next_workspace
|
|
58
|
+
context.module.active_workspace = active_workspace if context&.module
|
|
59
|
+
print_good "Switched to workspace: #{name}"
|
|
60
|
+
else
|
|
61
|
+
print_bad "#{name} is not a valid workspace"
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def delete_workspace(name)
|
|
66
|
+
if name == 'default'
|
|
67
|
+
print_warning 'You cannot delete the default workspace'
|
|
68
|
+
return
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
current_name = active_workspace.name
|
|
72
|
+
Wpxf::Models::Workspace.where(name: name).destroy
|
|
73
|
+
print_good "Deleted workspace: #{name}"
|
|
74
|
+
switch_workspace 'default' if name == current_name
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
attr_accessor :active_workspace
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
data/lib/wpxf/core.rb
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'wpxf/db'
|
|
4
|
+
require 'wpxf/utility'
|
|
5
|
+
|
|
6
|
+
require 'wpxf/core/data_file'
|
|
7
|
+
require 'wpxf/core/options'
|
|
8
|
+
require 'wpxf/core/payload'
|
|
9
|
+
require 'wpxf/core/event_emitter'
|
|
10
|
+
require 'wpxf/core/output_emitters'
|
|
11
|
+
require 'wpxf/core/module_info'
|
|
12
|
+
require 'wpxf/core/module_authentication'
|
|
13
|
+
|
|
14
|
+
require 'wpxf/versioning'
|
|
15
|
+
require 'wpxf/net'
|
|
16
|
+
require 'wpxf/wordpress'
|
|
17
|
+
|
|
18
|
+
require 'wpxf/core/module'
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Wpxf
|
|
4
|
+
# Represents a data file found in the data directory.
|
|
5
|
+
class DataFile
|
|
6
|
+
# Initialize a new instance of {DataFile}.
|
|
7
|
+
# @param path_parts the path to the file, relative to the data directory.
|
|
8
|
+
def initialize(*path_parts)
|
|
9
|
+
self.content = File.read(File.join(Wpxf.data_directory, path_parts))
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# @return [String] the contents of a PHP data file without the surrounding
|
|
13
|
+
# <?php ?> tags.
|
|
14
|
+
def php_content
|
|
15
|
+
content.strip.sub(/^<\?php/i, '').sub(/\?>$/i, '')
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# @return [String] the contents of the data file with variable replacements.
|
|
19
|
+
def content_with_named_vars(vars)
|
|
20
|
+
matcher = /#{vars.keys.map { |k| Regexp.escape(k) }.join('|')}/
|
|
21
|
+
content.gsub(matcher, vars)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @return the content of the file.
|
|
25
|
+
attr_accessor :content
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Wpxf
|
|
4
|
+
# An event emitter that allows one or more subscribers.
|
|
5
|
+
class EventEmitter
|
|
6
|
+
def initialize
|
|
7
|
+
@subscribers = []
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Subscribe to the events emitted by this {EventEmitter}.
|
|
11
|
+
# @param subscriber [Object] the event subscriber.
|
|
12
|
+
def subscribe(subscriber)
|
|
13
|
+
@subscribers.push(subscriber)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Unsubscribe from the events emitted by this {EventEmitter}.
|
|
17
|
+
# @param subscriber [Object] the event subscriber.
|
|
18
|
+
def unsubscribe(subscriber)
|
|
19
|
+
@subscribers -= [subscriber]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Emit an event to be handled by each subscriber.
|
|
23
|
+
# @param event [Object] the event object to emit.
|
|
24
|
+
def emit(event)
|
|
25
|
+
@subscribers.each do |s|
|
|
26
|
+
s.on_event_emitted(event) if s.respond_to? 'on_event_emitted'
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Wpxf
|
|
4
|
+
# The base class for all modules.
|
|
5
|
+
class Module
|
|
6
|
+
include Wpxf::ModuleInfo
|
|
7
|
+
include Wpxf::OutputEmitters
|
|
8
|
+
include Wpxf::Options
|
|
9
|
+
include Wpxf::Net::HttpClient
|
|
10
|
+
include Wpxf::WordPress::Fingerprint
|
|
11
|
+
include Wpxf::WordPress::Login
|
|
12
|
+
include Wpxf::WordPress::Options
|
|
13
|
+
include Wpxf::WordPress::Urls
|
|
14
|
+
include Wpxf::ModuleAuthentication
|
|
15
|
+
include Wpxf::Db::Credentials
|
|
16
|
+
|
|
17
|
+
def initialize
|
|
18
|
+
super
|
|
19
|
+
|
|
20
|
+
register_option(
|
|
21
|
+
BooleanOption.new(
|
|
22
|
+
name: 'verbose',
|
|
23
|
+
desc: 'Enable verbose output',
|
|
24
|
+
required: true,
|
|
25
|
+
default: false
|
|
26
|
+
)
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
register_advanced_options([
|
|
30
|
+
BooleanOption.new(
|
|
31
|
+
name: 'check_wordpress_and_online',
|
|
32
|
+
desc: 'Check that the target is running WordPress and is online',
|
|
33
|
+
required: true,
|
|
34
|
+
default: true
|
|
35
|
+
)
|
|
36
|
+
])
|
|
37
|
+
|
|
38
|
+
self.event_emitter = EventEmitter.new
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @return [Boolean] true if all the required options are set.
|
|
42
|
+
def can_execute?
|
|
43
|
+
all_options_valid? && (aux_module? || (payload&.all_options_valid?))
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @return [Boolean] true if the target is running WordPress.
|
|
47
|
+
def check_wordpress_and_online
|
|
48
|
+
unless wordpress_and_online?
|
|
49
|
+
emit_error "#{full_uri} does not appear to be running WordPress"
|
|
50
|
+
return false
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
true
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# @return [Array] an array of missing option names that are required.
|
|
57
|
+
def missing_options
|
|
58
|
+
opts = super
|
|
59
|
+
opts.push('payload') if exploit_module? && !payload
|
|
60
|
+
|
|
61
|
+
if payload
|
|
62
|
+
payload_opts = payload.missing_options
|
|
63
|
+
opts = [*opts, *payload_opts] unless payload_opts.empty?
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
opts
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Set the value of a module option.
|
|
70
|
+
# @param name the name of the option to set.
|
|
71
|
+
# @param value the value to use.
|
|
72
|
+
# @return [String, Symbol] the normalized value, :invalid if the
|
|
73
|
+
# specified value is invalid or :not_found if the name is invalid.
|
|
74
|
+
def set_option_value(name, value)
|
|
75
|
+
res = super(name, value)
|
|
76
|
+
|
|
77
|
+
if payload
|
|
78
|
+
return payload.set_option_value(name, value) if res == :not_found
|
|
79
|
+
payload.set_option_value(name, value)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
res
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Unset an option or reset it back to its default value.
|
|
86
|
+
# @param name [String] the name of the option to unset.
|
|
87
|
+
def unset_option(name)
|
|
88
|
+
super(name)
|
|
89
|
+
payload&.unset_option(name)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Run the module.
|
|
93
|
+
# @return [Boolean] true if successful.
|
|
94
|
+
def run
|
|
95
|
+
if normalized_option_value('check_wordpress_and_online')
|
|
96
|
+
return false unless check_wordpress_and_online
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
if requires_authentication
|
|
100
|
+
@session_cookie = authenticate_with_wordpress(datastore['username'], datastore['password'])
|
|
101
|
+
return false unless @session_cookie
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
true
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Cleanup any allocated resource to the module.
|
|
108
|
+
def cleanup
|
|
109
|
+
payload&.cleanup
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Check if the target is vulnerable.
|
|
113
|
+
# @return [Symbol] :unknown, :vulnerable or :safe.
|
|
114
|
+
def check
|
|
115
|
+
:unknown
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# @return [Boolean] true if the module is an auxiliary module.
|
|
119
|
+
def aux_module?
|
|
120
|
+
to_s.split('::')[-2].eql? 'Auxiliary'
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# @return [Boolean] true if the module is an exploit module.
|
|
124
|
+
def exploit_module?
|
|
125
|
+
to_s.split('::')[-2].eql? 'Exploit'
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# @return [Payload] the {Payload} to use with the current module.
|
|
129
|
+
attr_accessor :payload
|
|
130
|
+
|
|
131
|
+
# @return [EventEmitter] the {EventEmitter} for the module's events.
|
|
132
|
+
attr_accessor :event_emitter
|
|
133
|
+
|
|
134
|
+
# @return [Models::Workspace] the currently active {Models::Workspace}.
|
|
135
|
+
attr_accessor :active_workspace
|
|
136
|
+
|
|
137
|
+
# @return [String, nil] the current session cookie, if authenticated with the target.
|
|
138
|
+
attr_reader :session_cookie
|
|
139
|
+
end
|
|
140
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Wpxf
|
|
4
|
+
# Provides functionality for authenticating modules with a WordPress target.
|
|
5
|
+
module ModuleAuthentication
|
|
6
|
+
# Initialize a new instance of {ModuleAuthentication}.
|
|
7
|
+
def initialize
|
|
8
|
+
super
|
|
9
|
+
return unless requires_authentication
|
|
10
|
+
|
|
11
|
+
register_options([
|
|
12
|
+
StringOption.new(
|
|
13
|
+
name: 'username',
|
|
14
|
+
desc: 'The WordPress username to authenticate with',
|
|
15
|
+
required: true
|
|
16
|
+
),
|
|
17
|
+
StringOption.new(
|
|
18
|
+
name: 'password',
|
|
19
|
+
desc: 'The WordPress password to authenticate with',
|
|
20
|
+
required: true
|
|
21
|
+
)
|
|
22
|
+
])
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @return [Boolean] true if the module requires the user to authenticate.
|
|
26
|
+
def requires_authentication
|
|
27
|
+
false
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Authenticate with WordPress and return the cookie.
|
|
31
|
+
# @param username [String] the username to authenticate with.
|
|
32
|
+
# @param password [String] the password to authenticate with.
|
|
33
|
+
# @return [CookieJar, Boolean] the cookie in a CookieJar if successful,
|
|
34
|
+
# otherwise, returns false.
|
|
35
|
+
def authenticate_with_wordpress(username, password)
|
|
36
|
+
emit_info "Authenticating with WordPress using #{username}:#{password}..."
|
|
37
|
+
cookie = wordpress_login(username, password)
|
|
38
|
+
if cookie.nil?
|
|
39
|
+
emit_error 'Failed to authenticate with WordPress'
|
|
40
|
+
return false
|
|
41
|
+
else
|
|
42
|
+
store_credentials username, password
|
|
43
|
+
emit_success 'Authenticated with WordPress', true
|
|
44
|
+
return cookie
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Wpxf
|
|
4
|
+
# Provides functionality for specifying module metadata.
|
|
5
|
+
module ModuleInfo
|
|
6
|
+
# Initialize a new instance of {ModuleInfo}.
|
|
7
|
+
def initialize
|
|
8
|
+
super
|
|
9
|
+
@_module_info = {}
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Update the module info.
|
|
13
|
+
# @param info [Hash] a hash containing the module info.
|
|
14
|
+
def update_info(info)
|
|
15
|
+
required_keys = %i[name desc author date]
|
|
16
|
+
unless required_keys.all? { |key| info.key?(key) || @_module_info.key?(key) }
|
|
17
|
+
raise 'Missing one or more required module info keys'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
_update_info_without_validation(info)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# @return [String] the name of the module.
|
|
24
|
+
def module_name
|
|
25
|
+
@_module_info[:name]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# @return [String] the description of the module.
|
|
29
|
+
def module_desc
|
|
30
|
+
@_module_info[:desc]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# @return [Array] an aray of references relating to the module.
|
|
34
|
+
def module_references
|
|
35
|
+
@_module_info[:references]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# @return [Array] the name of the module author(s).
|
|
39
|
+
def module_author
|
|
40
|
+
@_module_info[:author]
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# @return [Date] the disclosure date of the vulnerability.
|
|
44
|
+
def module_date
|
|
45
|
+
@_module_info[:date]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# @return [Boolean] true if the description is preformatted.
|
|
49
|
+
def module_description_preformatted
|
|
50
|
+
@_module_info[:desc_preformatted]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Emits any information that the user should be aware of before using the module.
|
|
54
|
+
def emit_usage_info
|
|
55
|
+
nil
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
private
|
|
59
|
+
|
|
60
|
+
def _update_info_without_validation(info)
|
|
61
|
+
@_module_info.merge!(info)
|
|
62
|
+
|
|
63
|
+
if @_module_info[:date]
|
|
64
|
+
@_module_info[:date] = Date.parse(@_module_info[:date].to_s)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
if @_module_info[:desc]
|
|
68
|
+
@_module_info[:desc] = @_module_info[:desc].gsub(/ +/, ' ')
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
@_module_info
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'wpxf/core/opts/option'
|
|
4
|
+
require 'wpxf/core/opts/boolean_option'
|
|
5
|
+
require 'wpxf/core/opts/enum_option'
|
|
6
|
+
require 'wpxf/core/opts/integer_option'
|
|
7
|
+
require 'wpxf/core/opts/path_option'
|
|
8
|
+
require 'wpxf/core/opts/port_option'
|
|
9
|
+
require 'wpxf/core/opts/string_option'
|
|
10
|
+
|
|
11
|
+
module Wpxf
|
|
12
|
+
# A mixin to provide option registering and datastore functionality.
|
|
13
|
+
module Options
|
|
14
|
+
# Initialize a new instance of {Options}.
|
|
15
|
+
def initialize
|
|
16
|
+
super
|
|
17
|
+
|
|
18
|
+
self.options = []
|
|
19
|
+
self.datastore = {}
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Unregister an {Option}.
|
|
23
|
+
# @param opt the {Option} to unregister.
|
|
24
|
+
# @return [Void] nothing.
|
|
25
|
+
def unregister_option(opt)
|
|
26
|
+
options.delete_if { |o| o.name.eql?(opt.name) }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Register an {Option}.
|
|
30
|
+
# @param opt the {Option} to register.
|
|
31
|
+
# @return [Void] nothing.
|
|
32
|
+
def register_option(opt)
|
|
33
|
+
raise 'payload is a reserved name' if opt.name.eql? 'payload'
|
|
34
|
+
unregister_option(opt)
|
|
35
|
+
options.push(opt)
|
|
36
|
+
datastore[opt.name] = opt.default unless opt.default.nil?
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Register an array of {Option}.
|
|
40
|
+
# @param opts the array of {Option} to register.
|
|
41
|
+
# @return [Void] nothing.
|
|
42
|
+
def register_options(opts)
|
|
43
|
+
opts.each do |opt|
|
|
44
|
+
register_option(opt)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Register an array of advanced {Option}.
|
|
49
|
+
# @param opts the array of {Option} to register.
|
|
50
|
+
# @return [Void] nothing.
|
|
51
|
+
def register_advanced_options(opts)
|
|
52
|
+
opts.each do |opt|
|
|
53
|
+
opt.advanced = true
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
register_options(opts)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Register an array of evasion {Option}.
|
|
60
|
+
# @param opts the array of {Option} to register.
|
|
61
|
+
# @return [Void] nothing.
|
|
62
|
+
def register_evasion_options(opts)
|
|
63
|
+
opts.each do |opt|
|
|
64
|
+
opt.evasion = true
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
register_options(opts)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Find and return an {Option} by its registered name.
|
|
71
|
+
# @param name the name of the {Option}.
|
|
72
|
+
# @return [Option, nil] the matching option or nil if not found.
|
|
73
|
+
def get_option(name)
|
|
74
|
+
options.find { |o| o.name.eql?(name) }
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Set the value of a module option.
|
|
78
|
+
# @param name the name of the option to set.
|
|
79
|
+
# @param value the value to use.
|
|
80
|
+
# @return [String, Symbol] the normalized value, :invalid if the
|
|
81
|
+
# specified value is invalid or :not_found if the name is invalid.
|
|
82
|
+
def set_option_value(name, value)
|
|
83
|
+
opt = get_option(name)
|
|
84
|
+
return :not_found unless opt
|
|
85
|
+
return :invalid unless opt.valid?(value)
|
|
86
|
+
|
|
87
|
+
datastore[name] = value
|
|
88
|
+
opt.normalize(value)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Get the value of a module option.
|
|
92
|
+
# @param name the name of the option.
|
|
93
|
+
# @return the option value.
|
|
94
|
+
def get_option_value(name)
|
|
95
|
+
datastore[name]
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Get the normalized value of a module option.
|
|
99
|
+
# @param name the name of the option.
|
|
100
|
+
# @return the option value.
|
|
101
|
+
def normalized_option_value(name)
|
|
102
|
+
option = get_option(name)
|
|
103
|
+
return option.normalize(datastore[name]) unless option.nil?
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# @param name the name of the option.
|
|
107
|
+
# @return [Boolean] true if the specified option has a value.
|
|
108
|
+
def option_value?(name)
|
|
109
|
+
!datastore[name].nil? && !datastore[name].empty?
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Temporarily change the value of an option and yield a block that
|
|
113
|
+
# uses the scoped value before resetting it back to the original value.
|
|
114
|
+
# @param name [String] the name of the option.
|
|
115
|
+
# @param value [Object] the scoped value.
|
|
116
|
+
# @yieldparam value [Object] the scoped value of the option.
|
|
117
|
+
# @return [Nil] nothing.
|
|
118
|
+
def scoped_option_change(name, value)
|
|
119
|
+
original_value = get_option_value(name)
|
|
120
|
+
|
|
121
|
+
# Set the scoped option value and invoke the proc.
|
|
122
|
+
set_option_value(name, value)
|
|
123
|
+
yield(get_option_value(name))
|
|
124
|
+
|
|
125
|
+
# Reset the option value back to the original.
|
|
126
|
+
set_option_value(name, original_value)
|
|
127
|
+
|
|
128
|
+
nil
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Unset an option or reset it back to its default value.
|
|
132
|
+
# @param name [String] the name of the option to unset.
|
|
133
|
+
def unset_option(name)
|
|
134
|
+
opt = get_option(name)
|
|
135
|
+
return unless opt
|
|
136
|
+
|
|
137
|
+
datastore.delete(name)
|
|
138
|
+
datastore[opt.name] = opt.default if opt.required?
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# @return [Boolean] true if all the required options are set.
|
|
142
|
+
def all_options_valid?
|
|
143
|
+
options.each do |opt|
|
|
144
|
+
return false unless opt.valid?(datastore[opt.name])
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
true
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Check if an option is valid.
|
|
151
|
+
# @param opt [String, Option] the {Option} or name of the option to check.
|
|
152
|
+
# @return [Boolean] true if valid.
|
|
153
|
+
def option_valid?(opt)
|
|
154
|
+
return opt.valid?(datastore[opt.name]) if opt.is_a? Option
|
|
155
|
+
|
|
156
|
+
get_option(opt).valid?(datastore[opt])
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# @return [Array] an array of missing option names that are required.
|
|
160
|
+
def missing_options
|
|
161
|
+
opts = []
|
|
162
|
+
options.each do |opt|
|
|
163
|
+
opts.push(opt.name) unless !opt.required? || option_valid?(opt)
|
|
164
|
+
end
|
|
165
|
+
opts
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# @return [Array] an array of {Option} objects used to configure
|
|
169
|
+
# the current module.
|
|
170
|
+
attr_accessor :options
|
|
171
|
+
|
|
172
|
+
# @return [Hash] a hash containing the option values specified by the user.
|
|
173
|
+
attr_accessor :datastore
|
|
174
|
+
end
|
|
175
|
+
end
|