Also see: */ $GLOBALS['WS_PLUGIN__']['s2member']['c']['streaming_file_extns'] = array_unique(array('avi', 'wav', 'mpa', 'mpeg', 'mpv', 'mps', 'm1v', 'm2v', 'mp4', 'mp3', 'm3u', 'mp4', 'flv', 'f4v', '3gp', '3g2', 'aac', 'm4a', 'webm', 'ogg', 'ogv', 'pls', 'm3u', 'ogm', 'm4u', 'mov', 'qtl', 'mp4', 'asf', 'wmv', 'wvx', 'wma', 'wax', 'ra', 'rm', 'ram')); /* Configure directory and .htaccess for files protected by s2Member. */ $GLOBALS['WS_PLUGIN__']['s2member']['c']['default_files_dir'] = dirname(dirname(dirname(__FILE__))).'-files'.((stripos(PHP_OS, 'win') === 0 && stripos($_SERVER['SERVER_SOFTWARE'], 'apache') === FALSE) ? '/app_data' : ''); $GLOBALS['WS_PLUGIN__']['s2member']['c']['files_dir'] = apply_filters('ws_plugin__s2member_files_dir', $GLOBALS['WS_PLUGIN__']['s2member']['c']['default_files_dir']); $GLOBALS['WS_PLUGIN__']['s2member']['c']['files_no_gzip_htaccess'] = dirname(__FILE__).'/templates/cfg-files/s2member-files-no-gzip.php'; $GLOBALS['WS_PLUGIN__']['s2member']['c']['files_dir_htaccess'] = dirname(__FILE__).'/templates/cfg-files/s2member-files.php'; /* Configure the directory for logs protected by s2Member. */ $GLOBALS['WS_PLUGIN__']['s2member']['c']['default_logs_dir'] = dirname(dirname(dirname(__FILE__))).'-logs'.((stripos(PHP_OS, 'win') === 0 && stripos($_SERVER['SERVER_SOFTWARE'], 'apache') === FALSE) ? '/app_data' : ''); $GLOBALS['WS_PLUGIN__']['s2member']['c']['logs_dir'] = apply_filters('ws_plugin__s2member_logs_dir', $GLOBALS['WS_PLUGIN__']['s2member']['c']['default_logs_dir']); $GLOBALS['WS_PLUGIN__']['s2member']['c']['logs_dir_htaccess'] = dirname(__FILE__).'/templates/cfg-files/s2member-logs.php'; /* Configure the global reCaptcha (www.websharks-inc.net / or any domain). These public/private keys work on any installation. */ $GLOBALS['WS_PLUGIN__']['s2member']['c']['recaptcha'] = array('public_key' => '6LeCANsSAAAAAIIrlB3FrXe42mr0OSSZpT0pkpFK', 'private_key' => '6LeCANsSAAAAAGBXMIKAirv6G4PmaGa-ORxdD-oZ', 'lang' => 'en'); /* Configure the right menu options panel for s2Member. */ $GLOBALS['WS_PLUGIN__']['s2member']['c']['menu_pages'] = array('updates' => TRUE, 'upsell-pro' => TRUE, 'installation' => FALSE, 'tools' => FALSE, 'kb' => TRUE, 'videos' => TRUE, 'support' => TRUE, 'donations' => TRUE, 'beta' => TRUE); /* Check if s2Member has been configured *should be set after the first config via options panel*. */ $GLOBALS['WS_PLUGIN__']['s2member']['c']['configured'] = get_option('ws_plugin__s2member_configured'); /* This is a special option cache that holds some additional information autoloaded into WordPress. */ $GLOBALS['WS_PLUGIN__']['s2member']['c']['cache'] = get_option('ws_plugin__s2member_cache'); /* Configure checksum time for the syscon.inc.php file. */ $GLOBALS['WS_PLUGIN__']['s2member']['c']['checksum'] = filemtime(__FILE__); /* Configure an array of pluggable functions handled by s2Member. */ $GLOBALS['WS_PLUGIN__']['s2member']['c']['pluggables'] = array(); /* Configure & validate all of the s2Member options; and set their defaults. */ if(!function_exists('ws_plugin__s2member_configure_options_and_their_defaults')) { /** * Configures an options array for the s2Member plugin. * * **WARNING:** This is a system configuration function, please DO NOT EDIT this function directly. * Instead, use the plugin options panel in WordPress to override these settings. * * @package s2Member * @since 3.0 * * @param boolean|array $options Optional. An array of new options, to be merged with the defaults. * * @return array This merged array of options: ``$GLOBALS['WS_PLUGIN__']['s2member']['o']`` */ function ws_plugin__s2member_configure_options_and_their_defaults($options = FALSE) { global $current_site, $current_blog; $default_options['options_checksum'] = ''; $default_options['options_version'] = '1.0'; $default_options['gateway_debug_logs'] = '0'; $default_options['gateway_debug_logs_extensive'] = '0'; $default_options['lazy_load_css_js'] = '0'; $default_options['static_css'] = '0'; //260903.0612 Generated static CSS delivery remains opt-in while frontend asset generation is beta. $default_options['static_css_minify'] = '0'; //260902.2107 Static CSS minification is independently opt-in while generated asset delivery is beta. $default_options['static_js'] = '0'; //260903.0437 Static frontend JavaScript delivery remains opt-in while generated assets are beta. $default_options['static_js_text'] = 'static'; //260906.2049 Keep JavaScript text in cacheable static files by default; multilingual sites can load it with each WordPress page instead. $default_options['static_js_minify'] = '0'; //260903.0437 Static JavaScript minification is independently opt-in and uses readable source files. $default_options['static_assets_combine'] = '0'; //260903.1918 Keep Framework/Pro generated files separate by default; combining is an explicit request-reduction optimization. $default_options['asset_health_wait_seconds'] = '3'; //260912.0522 Wait briefly after page load before treating an asset that cannot be confirmed active as Late. //260904.1923 Keep the repaired s2Member Dynamic Loader as the default; WordPress routing is an explicit compatibility option. $default_options['dynamic_asset_loader'] = 's2o'; //260910.0724 In current terminology, that established default is the s2Member-Only Dynamic Loader served by s2member-o.php. $default_options['no_cache_headers_mode'] = 'always'; //260308 No-cache headers mode: `always`, `selective`, `evaluative`. $default_options['no_cache_headers_debug'] = '0'; //260308 Adds Server-Timing no-cache debug header (support use only). $default_options['sc_conds_allow_arbitrary_php'] = '0'; $default_options['sc_conds_whitelist'] = ''; //260812 New shared whitelist; keep the old s2Get option synchronized temporarily for rollback compatibility. $default_options['sc_user_fields_whitelist'] = ''; $default_options['sc_s2get_userid_whitelist'] = ''; $default_options['sec_encryption_key'] = ''; $default_options['sec_encryption_key_history'] = array(); $default_options['def_combo_encryption_key'] = ''; $default_options['def_combo_encryption_key_history'] = array(); $default_options['def_custom_combo_encryption_keys'] = array(); //260809 Store new Defuse key mappings by one-way hashes instead of raw secret keys. $default_options['secret_key_to_defuse_key'] = array(); $default_options['secret_key_to_defuse_key_history'] = array(); $default_options['custom_secret_key_to_defuse_key'] = array(); $default_options['s_badge_status_enabled'] = '0'; $default_options['max_ip_restriction'] = '5'; $default_options['max_ip_restriction_time'] = '3600'; $default_options['max_failed_login_attempts'] = '5'; $default_options['max_simultaneous_logins'] = '0'; $default_options['max_simultaneous_logins_timeout'] = '30 minutes'; $default_options['run_uninstall_routines'] = '0'; $default_options['custom_reg_fields'] = ''; $default_options['custom_reg_names'] = '1'; $default_options['custom_reg_display_name'] = 'full'; $default_options['custom_reg_password'] = '0'; $default_options['custom_reg_password_min_length'] = '8'; // Minimum characters. $default_options['custom_reg_password_min_strength'] = 'good'; // `weak`, `good` or `strong`. $default_options['custom_reg_opt_in'] = '1'; $default_options['custom_reg_opt_in_label'] = 'Yes, I want to receive updates via email.'; $default_options['custom_reg_auto_opt_outs'] = array(); $default_options['custom_reg_auto_opt_out_transitions'] = '0'; $default_options['custom_reg_fields_4bp'] = array(); $default_options['custom_reg_force_personal_emails'] = ''; $default_options['allow_subscribers_in'] = '0'; $default_options['force_admin_lockouts'] = '0'; $default_options['filter_wp_query'] = array('all'); $default_options['default_url_shortener'] = 's2member'; //260612 $default_options['default_url_shortener_key'] = ''; $default_options['default_custom_str_url_shortener'] = ''; $default_options['mms_auto_patch'] = '1'; $default_options['mms_registration_file'] = 'wp-login'; $default_options['mms_registration_grants'] = 'none'; for($n = 0, $v = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++, $v = $v + 5) $default_options['mms_registration_blogs_level'.$n] = (string)$v; $default_options['login_welcome_page'] = ''; $default_options['login_redirection_override'] = ''; $default_options['membership_options_page'] = ''; $default_options['membership_options_page_vars_enable'] = '1'; $default_options['membership_options_page_ga_vars_enable'] = '1'; $default_options['login_reg_design_enabled'] = '1'; $default_options['login_reg_background_color'] = 'FFFFFF'; $default_options['login_reg_background_image'] = $GLOBALS['WS_PLUGIN__']['s2member']['c']['dir_url'].'/src/images/bg.png'; $default_options['login_reg_background_image_repeat'] = 'repeat'; $default_options['login_reg_background_text_color'] = '000000'; $default_options['login_reg_background_text_shadow_color'] = 'EEEEEE'; $default_options['login_reg_background_box_shadow_color'] = 'EEEEEE'; $default_options['login_reg_logo_src'] = $GLOBALS['WS_PLUGIN__']['s2member']['c']['dir_url'].'/src/images/logo.png'; $default_options['login_reg_logo_src_width'] = '550'; $default_options['login_reg_logo_src_height'] = '100'; $default_options['login_reg_logo_url'] = home_url('/'); $default_options['login_reg_logo_title'] = get_bloginfo('name'); $default_options['login_reg_font_size'] = '12px'; $default_options['login_reg_font_family'] = "'Verdana', 'Arial', sans-serif"; $default_options['login_reg_font_field_size'] = '18px'; $default_options['login_reg_footer_backtoblog'] = '0'; $default_options['login_reg_footer_design'] = ''; $default_options['html_emails_enabled'] = 0; //250615 $default_options['reg_email_from_name'] = get_bloginfo('name'); $default_options['reg_email_from_email'] = get_bloginfo('admin_email'); $default_options['reg_email_support_link'] = 'mailto:'.get_bloginfo('admin_email'); $default_options['new_user_emails_enabled'] = '0'; $default_options['new_user_email_subject'] = sprintf('[%s] Username/Password', get_bloginfo('name')); $default_options['new_user_email_message'] = sprintf("Your Username/Password for: \n%s\n\nUsername: %%%%user_login%%%%\nTo set your password, visit: %%%%wp_set_pass_url%%%%\n\n%%%%wp_login_url%%%%", get_bloginfo('name')); $default_options['new_user_admin_email_recipients'] = get_bloginfo('admin_email'); $default_options['new_user_admin_email_subject'] = sprintf('[%s] New User Registration', get_bloginfo('name')); $default_options['new_user_admin_email_message'] = sprintf("New User Registration on your site: \n%s\n\nUser ID: %%%%user_id%%%%\nUsername: %%%%user_login%%%%\nEmail: %%%%user_email%%%%\nIP Address: %%%%user_ip%%%%", get_bloginfo('name')); $default_options['paypal_sandbox'] = '0'; $default_options['paypal_business'] = ''; $default_options['paypal_merchant_id'] = ''; $default_options['paypal_api_username'] = ''; $default_options['paypal_api_password'] = ''; $default_options['paypal_api_signature'] = ''; $default_options['paypal_identity_token'] = ''; $default_options['paypal_btn_encryption'] = '0'; //260106 $default_options['paypal_checkout_enable'] = '0'; $default_options['paypal_checkout_sandbox'] = '0'; $default_options['paypal_checkout_client_id'] = ''; $default_options['paypal_checkout_client_secret'] = ''; $default_options['paypal_checkout_sandbox_client_id'] = ''; $default_options['paypal_checkout_sandbox_client_secret']= ''; $default_options['paypal_checkout_webhook_id'] = ''; $default_options['paypal_checkout_sandbox_webhook_id'] = ''; $default_options['paypal_checkout_cache'] = array(); $default_options['paypal_payflow_api_username'] = ''; $default_options['paypal_payflow_api_partner'] = 'PayPal'; $default_options['paypal_payflow_api_vendor'] = ''; $default_options['paypal_payflow_api_password'] = ''; $default_options['ipn_signup_vars_fallback'] = '0'; //250427 $default_options['skip_ipn_domain_validation'] = '0'; //250606 $default_options['signup_tracking_codes'] = ''; $default_options['modification_tracking_codes'] = ''; $default_options['ccap_tracking_codes'] = ''; $default_options['sp_tracking_codes'] = ''; $default_options['signup_email_recipients'] = '"%%full_name%%" <%%payer_email%%>'; $default_options['signup_email_subject'] = 'Congratulations! (your membership has been approved)'; $default_options['signup_email_message'] = sprintf("Thanks %%%%first_name%%%%! Your membership has been approved.\n\nIf you haven't already done so, the next step is to Register a Username.\n\nComplete your registration here: \n%%%%registration_url%%%%\n\nIf you have any trouble, please feel free to contact us.\n\nBest Regards,\n%s", get_bloginfo('name')); $default_options['modification_email_recipients'] = '"%%full_name%%" <%%payer_email%%>'; $default_options['modification_email_subject'] = 'Thank you! Your account has been updated.'; $default_options['modification_email_message'] = sprintf("Thanks %%%%first_name%%%%! Your account now has access to: %%%%item_name%%%%.\n\nIf you have any trouble, please feel free to contact us.\n\nBest Regards,\n%s", get_bloginfo('name')); $default_options['ccap_email_recipients'] = '"%%full_name%%" <%%payer_email%%>'; $default_options['ccap_email_subject'] = 'Thank you! Your account has been updated.'; $default_options['ccap_email_message'] = sprintf("Thanks %%%%first_name%%%%! Your account now has access to: %%%%item_name%%%%.\n\nIf you have any trouble, please feel free to contact us.\n\nBest Regards,\n%s", get_bloginfo('name')); $default_options['sp_email_recipients'] = '"%%full_name%%" <%%payer_email%%>'; $default_options['sp_email_subject'] = 'Thank You! (instructions for access)'; $default_options['sp_email_message'] = sprintf("Thanks %%%%first_name%%%%! \n\n%%%%item_name%%%%\n\nYour order can be retrieved here: \n%%%%sp_access_url%%%%\n(link expires in %%%%sp_access_exp%%%%)\n\nIf you have any trouble, please feel free to contact us.\n\nBest Regards,\n%s", get_bloginfo('name')); $default_options['mailchimp_api_key'] = ''; $default_options['getresponse_api_key'] = ''; $default_options['aweber_api_key'] = ''; $default_options['aweber_internal_api_key'] = ''; $default_options['aweber_api_type'] = 'api'; if($GLOBALS['WS_PLUGIN__']['s2member']['c']['configured']) $default_options['aweber_api_type'] = 'email'; for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++) $default_options['level'.$n.'_mailchimp_list_ids'] = ''; for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++) $default_options['level'.$n.'_getresponse_list_ids'] = ''; for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++) $default_options['level'.$n.'_aweber_list_ids'] = ''; $default_options['signup_notification_urls'] = ''; $default_options['registration_notification_urls'] = ''; $default_options['payment_notification_urls'] = ''; $default_options['modification_notification_urls'] = ''; $default_options['cancellation_notification_urls'] = ''; $default_options['eot_del_notification_urls'] = ''; $default_options['ref_rev_notification_urls'] = ''; $default_options['sp_sale_notification_urls'] = ''; $default_options['sp_ref_rev_notification_urls'] = ''; $default_options['signup_notification_recipients'] = ''; $default_options['registration_notification_recipients'] = ''; $default_options['payment_notification_recipients'] = ''; $default_options['modification_notification_recipients'] = ''; $default_options['cancellation_notification_recipients'] = ''; $default_options['eot_del_notification_recipients'] = ''; $default_options['ref_rev_notification_recipients'] = ''; $default_options['sp_sale_notification_recipients'] = ''; $default_options['sp_ref_rev_notification_recipients'] = ''; for ($n = 0, $l = array('Free Subscriber', 'Bronze Member', 'Silver Member', 'Gold Member', 'Platinum Member'); $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++) { $default_options['level'.$n.'_label'] = (!empty($l[$n])) ? $l[$n] : 'Level '.$n.' Member'; } $default_options['apply_label_translations'] = '0'; for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++) $default_options['level'.$n.'_file_downloads_allowed'] = ''; for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++) $default_options['level'.$n.'_file_downloads_allowed_days'] = ''; $default_options['file_download_limit_exceeded_page'] = ''; $default_options['file_download_inline_extensions'] = ''; $default_options['file_download_stream_extensions'] = ''; $default_options['file_download_content_encodong_none'] = '0'; $default_options['amazon_s3_files_bucket'] = ''; $default_options['amazon_s3_files_bucket_region'] = ''; $default_options['amazon_s3_files_access_key'] = ''; $default_options['amazon_s3_files_secret_key'] = ''; $default_options['amazon_cf_files_private_key'] = ''; $default_options['amazon_cf_files_private_key_id'] = ''; $default_options['amazon_cf_files_distros_access_id'] = ''; $default_options['amazon_cf_files_distros_s3_access_id'] = ''; $default_options['amazon_cf_files_distro_downloads_id'] = ''; $default_options['amazon_cf_files_distro_downloads_cname'] = ''; $default_options['amazon_cf_files_distro_downloads_dname'] = ''; $default_options['amazon_cf_files_distro_streaming_id'] = ''; $default_options['amazon_cf_files_distro_streaming_cname'] = ''; $default_options['amazon_cf_files_distro_streaming_dname'] = ''; $default_options['amazon_cf_files_distros_auto_config_status'] = ''; $default_options['amazon_cf_files_rtmp_policy_include_ip'] = '1'; $default_options['ruris_case_sensitive'] = '0'; // No by default. for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++) $default_options['level'.$n.'_ruris'] = ''; for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++) $default_options['level'.$n.'_catgs'] = ''; for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++) $default_options['level'.$n.'_ptags'] = ''; for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++) $default_options['level'.$n.'_posts'] = ''; for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++) $default_options['level'.$n.'_pages'] = ''; $default_options['specific_ids'] = ''; $default_options['triggers_immediate_eot'] = 'reversals'; $default_options['membership_eot_behavior'] = 'demote'; $default_options['eot_time_ext_behavior'] = 'extend'; $default_options['auto_eot_system_enabled'] = '1'; $default_options['auto_eot_system_runtime_mode'] = 'auto'; $default_options['auto_eot_system_runtime_custom'] = '30'; $default_options['eots_remove_ccaps'] = '1'; $default_options['eot_grace_time'] = '86400'; $default_options['wp_footer_code'] = ''; $default_options = apply_filters('ws_plugin__s2member_default_options', $default_options); unset($n, $v, $l); // Unset/cleanup these working variables from the routines above. /* Here they are merged. User options will overwrite some or all default values. */ $_stored_options = (($options !== FALSE) ? (array)$options : (array)get_option('ws_plugin__s2member_options')); $GLOBALS['WS_PLUGIN__']['s2member']['o'] = array_merge($default_options, $_stored_options); //260812 Keep both whitelist option names synchronized, with the legacy value taking precedence after a rollback. if(isset($_stored_options['sc_s2get_userid_whitelist']) && is_string($_stored_options['sc_s2get_userid_whitelist'])) { if(!array_key_exists('sc_user_fields_whitelist', $_stored_options) || $GLOBALS['WS_PLUGIN__']['s2member']['o']['sc_user_fields_whitelist'] !== $_stored_options['sc_s2get_userid_whitelist']) $GLOBALS['WS_PLUGIN__']['s2member']['o']['sc_user_fields_whitelist'] = $_stored_options['sc_s2get_userid_whitelist']; } else if(isset($_stored_options['sc_user_fields_whitelist']) && is_string($_stored_options['sc_user_fields_whitelist'])) $GLOBALS['WS_PLUGIN__']['s2member']['o']['sc_s2get_userid_whitelist'] = $_stored_options['sc_user_fields_whitelist']; unset($_stored_options); /* * Ditch this old option key; no longer in use. */ if(isset($GLOBALS['WS_PLUGIN__']['s2member']['o']['run_deactivation_routines'])) unset($GLOBALS['WS_PLUGIN__']['s2member']['o']['run_deactivation_routines']); /* This builds an MD5 checksum for the full array of options. This also includes the config checksum and the current set of default options. */ $checksum = md5(($checksum_prefix = $GLOBALS['WS_PLUGIN__']['s2member']['c']['checksum'].serialize($default_options)).serialize(array_merge($GLOBALS['WS_PLUGIN__']['s2member']['o'], array('options_checksum' => 0)))); /* Validate each option, possibly reverting back to the default value in some cases. This is only processed when/if the checksum is not up-to-date. */ if($options !== FALSE || ($GLOBALS['WS_PLUGIN__']['s2member']['o']['options_checksum'] !== $checksum && $GLOBALS['WS_PLUGIN__']['s2member']['o'] !== $default_options)) { foreach($GLOBALS['WS_PLUGIN__']['s2member']['o'] as $key => &$value) { if(!isset($default_options[$key]) && !preg_match('/^pro_/', $key)) unset($GLOBALS['WS_PLUGIN__']['s2member']['o'][$key]); else if($key === 'options_checksum' && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if($key === 'options_version' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if(preg_match('/^gateway_debug_logs|gateway_debug_logs_extensive/', $key) && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if($key === 'lazy_load_css_js' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if(preg_match('/^static_(?:css|js)(?:_minify)?$/', $key) && (!is_string($value) || !is_numeric($value))) //260903.0437 $value = $default_options[$key]; //260912.0522 Keep the operator-facing wait bounded so an accidental value cannot effectively disable health checking. //260911.0010 Here, bounded means the explicit 1–60-second range exposed by the setting. else if($key === 'asset_health_wait_seconds') $value = (!is_string($value) || !is_numeric($value) || (int)$value < 1 || (int)$value > 60) ? $default_options[$key] : (string)(int)$value; else if($key === 'no_cache_headers_mode' && (!is_string($value) || !in_array($value, array('always', 'selective', 'evaluative'), TRUE))) $value = $default_options[$key]; else if($key === 'no_cache_headers_debug' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if($key === 'sc_conds_allow_arbitrary_php' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if($key === 'sc_s2get_userid_whitelist' && !is_string($value)) //260324 $value = $default_options[$key]; else if($key === 'sc_user_fields_whitelist' && !is_string($value)) //260812 $value = $default_options[$key]; else if($key === 'sec_encryption_key' && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if($key === 'sec_encryption_key_history' && (!is_array($value) || empty($value))) $value = $default_options[$key]; else if($key === 'def_combo_encryption_key' && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if($key === 'def_combo_encryption_key_history' && (!is_array($value) || empty($value))) $value = $default_options[$key]; else if($key === 'def_custom_combo_encryption_keys' && (!is_array($value) || empty($value))) $value = $default_options[$key]; //260809 Validate the hashed Defuse key mappings independently of the legacy options. else if(preg_match('/^(?:secret_key_to_defuse_key|secret_key_to_defuse_key_history|custom_secret_key_to_defuse_key)$/', $key) && (!is_array($value) || empty($value))) $value = $default_options[$key]; else if($key === 's_badge_status_enabled' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if($key === 'max_ip_restriction' && (!is_string($value) || !is_numeric($value) || $value < 0 || $value > 100)) $value = $default_options[$key]; else if($key === 'max_ip_restriction_time' && (!is_string($value) || !is_numeric($value) || $value < 300 || $value > 31556926)) $value = $default_options[$key]; else if($key === 'max_failed_login_attempts' && (!is_string($value) || !is_numeric($value) || $value < 0 || $value > 100)) $value = $default_options[$key]; else if($key === 'max_simultaneous_logins' && (!is_string($value) || !is_numeric($value) || $value < 0)) $value = $default_options[$key]; else if($key === 'max_simultaneous_logins_timeout' && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if($key === 'run_uninstall_routines' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if($key === 'custom_reg_fields' && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if(preg_match('/^custom_reg_(?:names|password|password_min_length|opt_in|auto_opt_out_transitions)$/', $key) && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if($key === 'custom_reg_password_min_strength' && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if($key === 'custom_reg_display_name' && (!is_string($value) || !preg_match('/^(?:full|first|last|login|0)$/', $value))) $value = $default_options[$key]; else if($key === 'custom_reg_opt_in_label' && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if($key === 'custom_reg_auto_opt_outs' && (!is_array($value) || empty($value))) $value = $default_options[$key]; else if($key === 'custom_reg_fields_4bp' && (!is_array($value) || empty($value))) $value = $default_options[$key]; else if($key === 'custom_reg_force_personal_emails' && (!is_string($value) || !strlen($value = preg_replace('/\s+/', '', $value)))) $value = $default_options[$key]; else if($key === 'allow_subscribers_in' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if($key === 'mms_auto_patch' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if($key === 'mms_registration_file' && (!is_string($value) || !preg_match('/^(?:wp-login|wp-signup)$/', $value))) $value = $default_options[$key]; else if($key === 'mms_registration_grants' && (!is_string($value) || !preg_match('/^(?:none|user|all)$/', $value))) $value = $default_options[$key]; else if(preg_match('/^mms_registration_blogs_level[0-9]+$/', $key) && (!is_string($value) || !is_numeric($value) || $value < 0)) $value = $default_options[$key]; else if($key === 'force_admin_lockouts' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if($key === 'filter_wp_query' && !is_array($value) /* This array CAN be empty. */) $value = $default_options[$key]; else if(preg_match('/^default_(?:custom_str_)?url_shortener$/', $key) && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if($key === 'login_welcome_page' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if($key === 'login_redirection_override' && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if($key === 'membership_options_page' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if($key === 'membership_options_page_vars_enable' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if($key === 'membership_options_page_ga_vars_enable' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if($key === 'login_reg_design_enabled' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if($key === 'login_reg_background_image' && !is_string($value) /* This is optional. */) $value = $default_options[$key]; else if($key === 'login_reg_background_image_repeat' && (!is_string($value) || !preg_match('/^(?:repeat|repeat-x|repeat-y|no-repeat)$/', $value))) $value = $default_options[$key]; else if(preg_match('/^login_reg_(?:background|logo|font|footer)_/', $key) && !preg_match('/background_image/', $key) && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if($key === 'login_reg_footer_backtoblog' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if(preg_match('/^reg_email_(?:from_name|from_email|support_link)$/', $key) && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if($key === 'new_user_emails_enabled' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if(preg_match('/^new_user_email_(?:subject|message)$/', $key) && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if(preg_match('/^new_user_admin_email_(?:recipients|subject|message)$/', $key) && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if($key === 'paypal_sandbox' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if(preg_match('/^paypal_(?:business|merchant_id|api_username|api_password|api_signature|identity_token)$/', $key) && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if(preg_match('/^paypal_payflow(?:api_username|api_partner|api_vendor|api_password)$/', $key) && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if($key === 'paypal_btn_encryption' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; //260106 else if($key === 'paypal_checkout_enable' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if($key === 'paypal_checkout_sandbox' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if(preg_match('/^paypal_checkout_(?:client_id|client_secret|sandbox_client_id|sandbox_client_secret)$/', $key) && !is_string($value)) $value = $default_options[$key]; else if(preg_match('/^(?:signup|modification|ccap|sp)_tracking_codes$/', $key) && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if(preg_match('/^(?:signup|modification|ccap|sp)_email_recipients$/', $key) && !is_string($value) /* Can be empty. */) $value = $default_options[$key]; else if(preg_match('/^(?:signup|modification|ccap|sp)_email_(?:subject|message)$/', $key) && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if($key === 'aweber_api_type' && (!is_string($value) || !preg_match('/^(?:api|email)$/', $value))) $value = $default_options[$key]; else if(preg_match('/^(?:mailchimp|getresponse|aweber)(?:_internal)?_api_key$/', $key) && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if(preg_match('/^level[0-9]+_mailchimp_list_ids$/', $key) && (!is_string($value) || !strlen($value = preg_replace('/['."\r\n\t".']+/', '', $value)))) $value = $default_options[$key]; else if(preg_match('/^level[0-9]+_getresponse_list_ids$/', $key) && (!is_string($value) || !strlen($value = preg_replace('/\s+/', '', $value)))) $value = $default_options[$key]; else if(preg_match('/^level[0-9]+_aweber_list_ids$/', $key) && (!is_string($value) || !strlen($value = preg_replace('/\s+/', '', $value)))) $value = $default_options[$key]; else if(preg_match('/^(?:signup|registration|payment|modification|cancellation|eot_del|ref_rev|sp_sale|sp_ref_rev)_notification_urls$/', $key) && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if(preg_match('/^(?:signup|registration|payment|modification|cancellation|eot_del|ref_rev|sp_sale|sp_ref_rev)_notification_recipients$/', $key) && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if(preg_match('/^level[0-9]+_label$/', $key) && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if($key === 'apply_label_translations' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if(preg_match('/^level[0-9]+_file_downloads_allowed$/', $key) && (!is_string($value) || !is_numeric($value) || $value < 0)) $value = $default_options[$key]; else if(preg_match('/^level[0-9]+_file_downloads_allowed_days$/', $key) && (!is_string($value) || !is_numeric($value) || $value < 0)) $value = $default_options[$key]; else if($key === 'file_download_limit_exceeded_page' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if(preg_match('/^file_download_(?:inline|stream)_extensions$/', $key) && (!is_string($value) || !($value = strtolower(preg_replace('/\s+/', '', $value))))) $value = $default_options[$key]; else if(preg_match('/^amazon_(?:s3|cf)_files_/', $key) && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if($key === 'ruris_case_sensitive' && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if(preg_match('/^level[0-9]+_ruris$/', $key) && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; else if(preg_match('/^level[0-9]+_catgs$/', $key) && (!is_string($value) || !($value = ((strcasecmp($value, 'all') === 0) ? strtolower($value) : trim(preg_replace('/[^0-9,]/', '', $value), ','))))) $value = $default_options[$key]; else if(preg_match('/^level[0-9]+_ptags$/', $key) && (!is_string($value) || !($value = ((strcasecmp($value, 'all') === 0) ? strtolower($value) : trim(preg_replace('/ +/', ' ', trim(preg_replace('/ *, */', ',', $value))), ','))))) $value = $default_options[$key]; else if(preg_match('/^level[0-9]+_posts$/', $key) && (!is_string($value) || !($value = trim( /* Supports `all` or `1,2,3,all-[type]s`. */ preg_replace('/[^a-z0-9_\-,]/', '', strtolower($value)), ','))) ) $value = $default_options[$key]; else if(preg_match('/^level[0-9]+_pages$/', $key) && (!is_string($value) || !($value = ((strcasecmp($value, 'all') === 0) ? strtolower($value) : trim(preg_replace('/[^0-9,]/', '', $value), ','))))) $value = $default_options[$key]; else if($key === 'specific_ids' && (!is_string($value) || !($value = trim(preg_replace('/[^0-9,]/', '', $value), ',')))) $value = $default_options[$key]; else if($key === 'triggers_immediate_eot' && (!is_string($value) || !preg_match('/^(?:none|refunds|reversals|refunds,reversals|refunds,partial_refunds,reversals)$/', $value))) $value = $default_options[$key]; else if($key === 'membership_eot_behavior' && (!is_string($value) || !preg_match('/^(?:demote|delete)$/', $value))) $value = $default_options[$key]; else if($key === 'eot_time_ext_behavior' && (!is_string($value) || !preg_match('/^(?:extend|reset)$/', $value))) $value = $default_options[$key]; else if($key === 'auto_eot_system_runtime_mode' && (!is_string($value) || !preg_match('/^(?:auto|custom)$/', $value))) $value = $default_options[$key]; else if($key === 'auto_eot_system_runtime_custom' && (!is_string($value) || !is_numeric($value) || (float)$value < 1 || (float)$value > 3600)) $value = $default_options[$key]; else if(preg_match('/^(?:auto_eot_system_enabled|eot_grace_time|eots_remove_ccaps)$/', $key) && (!is_string($value) || !is_numeric($value))) $value = $default_options[$key]; else if($key === 'wp_footer_code' && (!is_string($value) || !strlen($value))) $value = $default_options[$key]; } if($options !== FALSE && is_string($options['sec_encryption_key']) && strlen($options['sec_encryption_key']) && !in_array($options['sec_encryption_key'], $GLOBALS['WS_PLUGIN__']['s2member']['o']['sec_encryption_key_history'])) { array_unshift($GLOBALS['WS_PLUGIN__']['s2member']['o']['sec_encryption_key_history'], $options['sec_encryption_key']); $GLOBALS['WS_PLUGIN__']['s2member']['o']['sec_encryption_key_history'] = array_slice($GLOBALS['WS_PLUGIN__']['s2member']['o']['sec_encryption_key_history'], 0, 10); } if($options !== FALSE && is_string($options['def_combo_encryption_key']) && strlen($options['def_combo_encryption_key']) && !in_array($options['def_combo_encryption_key'], $GLOBALS['WS_PLUGIN__']['s2member']['o']['def_combo_encryption_key_history'])) { array_unshift($GLOBALS['WS_PLUGIN__']['s2member']['o']['def_combo_encryption_key_history'], $options['def_combo_encryption_key']); $GLOBALS['WS_PLUGIN__']['s2member']['o']['def_combo_encryption_key_history'] = array_slice($GLOBALS['WS_PLUGIN__']['s2member']['o']['def_combo_encryption_key_history'], 0, 10); } //260809 Keep a recovery-only history of default hashed Defuse key mappings. if($options !== FALSE && is_array($options['secret_key_to_defuse_key']) && !empty($options['secret_key_to_defuse_key']) && !in_array($options['secret_key_to_defuse_key'], $GLOBALS['WS_PLUGIN__']['s2member']['o']['secret_key_to_defuse_key_history'], TRUE)) { array_unshift($GLOBALS['WS_PLUGIN__']['s2member']['o']['secret_key_to_defuse_key_history'], $options['secret_key_to_defuse_key']); $GLOBALS['WS_PLUGIN__']['s2member']['o']['secret_key_to_defuse_key_history'] = array_slice($GLOBALS['WS_PLUGIN__']['s2member']['o']['secret_key_to_defuse_key_history'], 0, 10); } $GLOBALS['WS_PLUGIN__']['s2member']['o'] = apply_filters_ref_array('ws_plugin__s2member_options_before_checksum', array(&$GLOBALS['WS_PLUGIN__']['s2member']['o'])); $GLOBALS['WS_PLUGIN__']['s2member']['o']['options_checksum'] = md5($checksum_prefix.serialize(array_merge($GLOBALS['WS_PLUGIN__']['s2member']['o'], array('options_checksum' => 0)))); } return apply_filters_ref_array('ws_plugin__s2member_options', array(&$GLOBALS['WS_PLUGIN__']['s2member']['o'])); } } //250506 Move _x's to init to avoid PHP Notice since WP 6.7 add_action('init', function () { $o =& $GLOBALS['WS_PLUGIN__']['s2member']['o']; // Apply the filter to retrieve default values (not global) $default_values = apply_filters('ws_plugin__s2member_default_options', []); // Translated defaults for $o[...] options, only applied if still at their original defaults $translated_defaults = [ 'custom_reg_opt_in_label' => _x('Yes, I want to receive updates via email.', 's2member-front', 's2member'), 'new_user_email_subject' => sprintf(_x('[%s] Username/Password', 's2member-front', 's2member'), get_bloginfo('name')), 'new_user_email_message' => sprintf(_x("Your Username/Password for: \n%s\n\nUsername: %%%%user_login%%%%\nTo set your password, visit: %%%%wp_set_pass_url%%%%\n\n%%%%wp_login_url%%%%", 's2member-front', 's2member'), get_bloginfo('name')), 'new_user_admin_email_subject' => sprintf(_x('[%s] New User Registration', 's2member-front', 's2member'), get_bloginfo('name')), 'new_user_admin_email_message' => sprintf(_x("New User Registration on your site: \n%s\n\nUser ID: %%%%user_id%%%%\nUsername: %%%%user_login%%%%\nEmail: %%%%user_email%%%%\nIP Address: %%%%user_ip%%%%", 's2member-front', 's2member'), get_bloginfo('name')), 'signup_email_subject' => _x('Congratulations! (your membership has been approved)', 's2member-front', 's2member'), 'signup_email_message' => sprintf(_x("Thanks %%%%first_name%%%%! Your membership has been approved.\n\nIf you haven't already done so, the next step is to Register a Username.\n\nComplete your registration here: \n%%%%registration_url%%%%\n\nIf you have any trouble, please feel free to contact us.\n\nBest Regards,\n%s", 's2member-front', 's2member'), get_bloginfo('name')), 'modification_email_subject' => _x('Thank you! Your account has been updated.', 's2member-front', 's2member'), 'modification_email_message' => sprintf(_x("Thanks %%%%first_name%%%%! Your account now has access to: %%%%item_name%%%%.\n\nIf you have any trouble, please feel free to contact us.\n\nBest Regards,\n%s", 's2member-front', 's2member'), get_bloginfo('name')), 'ccap_email_subject' => _x('Thank you! Your account has been updated.', 's2member-front', 's2member'), 'ccap_email_message' => sprintf(_x("Thanks %%%%first_name%%%%! Your account now has access to: %%%%item_name%%%%.\n\nIf you have any trouble, please feel free to contact us.\n\nBest Regards,\n%s", 's2member-front', 's2member'), get_bloginfo('name')), 'sp_email_subject' => _x('Thank You! (instructions for access)', 's2member-front', 's2member'), 'sp_email_message' => sprintf(_x("Thanks %%%%first_name%%%%! \n\n%%%%item_name%%%%\n\nYour order can be retrieved here: \n%%%%sp_access_url%%%%\n(link expires in %%%%sp_access_exp%%%%)\n\nIf you have any trouble, please feel free to contact us.\n\nBest Regards,\n%s", 's2member-front', 's2member'), get_bloginfo('name')), 'level0_label' => _x('Free Subscriber', 's2member-front', 's2member'), 'level1_label' => _x('Bronze Member', 's2member-front', 's2member'), 'level2_label' => _x('Silver Member', 's2member-front', 's2member'), 'level3_label' => _x('Gold Member', 's2member-front', 's2member'), 'level4_label' => _x('Platinum Member', 's2member-front', 's2member'), ]; // Add extra levels if they exist. for ($n = 5; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++) { $translated_defaults['level'.$n.'_label'] = sprintf(_x('Level %s Member', 's2member-front', 's2member'), $n); } // Apply translations to options if they are at their default foreach ($translated_defaults as $key => $translated) { if (isset($default_values[$key]) && isset($o[$key]) && $default_values[$key] === $o[$key]) { $o[$key] = $translated; } } // Handle recaptcha_lang separately if (isset($GLOBALS['WS_PLUGIN__']['s2member']['c']['recaptcha']['lang']) && $GLOBALS['WS_PLUGIN__']['s2member']['c']['recaptcha']['lang'] === 'en') { $GLOBALS['WS_PLUGIN__']['s2member']['c']['recaptcha']['lang'] = _x('en', 's2member-front recaptcha-lang-code', 's2member'); } });