*/ public function get_defaults(): array { return array( 'schema_version' => 3, 'build_profile' => 'free', 'hash_ip_addresses' => true, 'store_full_payloads' => false, 'log_retention_days' => 14, 'event_logging_enabled' => true, 'event_retention_days' => 14, 'max_event_records' => 100, 'log_allowed_events' => false, 'delete_data_on_uninstall' => false, 'scaffold_initialized' => true, 'contact_form_7_integration_enabled' => true, 'wpforms_integration_enabled' => true, 'elementor_form_lite_integration_enabled' => true, 'elementor_pro_forms_integration_enabled' => true, 'wordpress_comments_integration_enabled' => true, 'wordpress_login_integration_enabled' => true, 'wordpress_registration_integration_enabled' => true, 'enable_woocommerce_checkout_protection' => true, 'enable_woocommerce_registration_protection' => true, ) + SettingsSnapshot::defaults(); } /** * Get stored settings merged with defaults. * * @return array */ public function get_settings(): array { if ( ! function_exists( 'get_option' ) ) { return $this->get_defaults(); } $stored_settings = get_option( self::OPTION_NAME, array() ); if ( ! is_array( $stored_settings ) ) { return $this->get_defaults(); } return $this->sanitize_settings( $stored_settings ); } /** * Install settings if they do not exist yet. */ public function install_defaults(): void { if ( ! function_exists( 'get_option' ) || ! function_exists( 'update_option' ) ) { return; } $stored_settings = get_option( self::OPTION_NAME, null ); if ( is_array( $stored_settings ) ) { return; } update_option( self::OPTION_NAME, $this->get_defaults(), false ); } /** * Save validated settings. * * @param array $settings Settings to save. */ public function save( array $settings ): bool { if ( ! function_exists( 'update_option' ) ) { return false; } return (bool) update_option( self::OPTION_NAME, $this->sanitize_settings( $settings ), false ); } /** * Sanitize known settings and reject unknown keys. * * @param array $settings Raw settings. * * @return array */ public function sanitize_settings( array $settings ): array { $sanitized = $this->get_defaults(); if ( array_key_exists( 'hash_ip_addresses', $settings ) ) { $sanitized['hash_ip_addresses'] = $this->sanitize_boolean( $settings['hash_ip_addresses'] ); } if ( array_key_exists( 'log_retention_days', $settings ) ) { $sanitized['log_retention_days'] = $this->sanitize_retention_days( $settings['log_retention_days'] ); } if ( array_key_exists( 'event_logging_enabled', $settings ) ) { $sanitized['event_logging_enabled'] = $this->sanitize_boolean( $settings['event_logging_enabled'] ); } if ( array_key_exists( 'event_retention_days', $settings ) ) { $sanitized['event_retention_days'] = $this->sanitize_bounded_integer( $settings['event_retention_days'], 1, 90 ); } if ( array_key_exists( 'max_event_records', $settings ) ) { $sanitized['max_event_records'] = $this->sanitize_bounded_integer( $settings['max_event_records'], 25, 1000 ); } if ( array_key_exists( 'log_allowed_events', $settings ) ) { $sanitized['log_allowed_events'] = $this->sanitize_boolean( $settings['log_allowed_events'] ); } if ( array_key_exists( 'delete_data_on_uninstall', $settings ) ) { $sanitized['delete_data_on_uninstall'] = $this->sanitize_boolean( $settings['delete_data_on_uninstall'] ); } if ( array_key_exists( 'contact_form_7_integration_enabled', $settings ) ) { $sanitized['contact_form_7_integration_enabled'] = $this->sanitize_boolean( $settings['contact_form_7_integration_enabled'] ); } if ( array_key_exists( 'wpforms_integration_enabled', $settings ) ) { $sanitized['wpforms_integration_enabled'] = $this->sanitize_boolean( $settings['wpforms_integration_enabled'] ); } $has_legacy_elementor_setting = array_key_exists( 'elementor_forms_integration_enabled', $settings ); $legacy_elementor_enabled = $has_legacy_elementor_setting ? $this->sanitize_boolean( $settings['elementor_forms_integration_enabled'] ) : true; if ( array_key_exists( 'elementor_form_lite_integration_enabled', $settings ) ) { $sanitized['elementor_form_lite_integration_enabled'] = $this->sanitize_boolean( $settings['elementor_form_lite_integration_enabled'] ); } elseif ( $has_legacy_elementor_setting && ! $legacy_elementor_enabled ) { $sanitized['elementor_form_lite_integration_enabled'] = false; } if ( array_key_exists( 'elementor_pro_forms_integration_enabled', $settings ) ) { $sanitized['elementor_pro_forms_integration_enabled'] = $this->sanitize_boolean( $settings['elementor_pro_forms_integration_enabled'] ); } elseif ( $has_legacy_elementor_setting ) { $sanitized['elementor_pro_forms_integration_enabled'] = $legacy_elementor_enabled; } if ( array_key_exists( 'wordpress_comments_integration_enabled', $settings ) ) { $sanitized['wordpress_comments_integration_enabled'] = $this->sanitize_boolean( $settings['wordpress_comments_integration_enabled'] ); } if ( array_key_exists( 'wordpress_login_integration_enabled', $settings ) ) { $sanitized['wordpress_login_integration_enabled'] = $this->sanitize_boolean( $settings['wordpress_login_integration_enabled'] ); } if ( array_key_exists( 'wordpress_registration_integration_enabled', $settings ) ) { $sanitized['wordpress_registration_integration_enabled'] = $this->sanitize_boolean( $settings['wordpress_registration_integration_enabled'] ); } if ( array_key_exists( 'enable_woocommerce_checkout_protection', $settings ) ) { $sanitized['enable_woocommerce_checkout_protection'] = $this->sanitize_boolean( $settings['enable_woocommerce_checkout_protection'] ); } if ( array_key_exists( 'enable_woocommerce_registration_protection', $settings ) ) { $sanitized['enable_woocommerce_registration_protection'] = $this->sanitize_boolean( $settings['enable_woocommerce_registration_protection'] ); } $engine_settings = SettingsSnapshot::from_array( $settings )->to_array(); foreach ( $engine_settings as $key => $value ) { $sanitized[ $key ] = $value; } $sanitized['store_full_payloads'] = false; $sanitized['build_profile'] = 'free'; return $sanitized; } /** * Sanitize a boolean-like value. * * @param mixed $value Value to sanitize. */ private function sanitize_boolean( $value ): bool { if ( is_bool( $value ) ) { return $value; } if ( ! is_scalar( $value ) ) { return false; } return in_array( strtolower( (string) $value ), array( '1', 'true', 'yes', 'on' ), true ); } /** * Sanitize retention days to a bounded integer. * * @param mixed $value Retention day value. */ private function sanitize_retention_days( $value ): int { $retention_days = (int) $value; if ( $retention_days < 0 ) { return 0; } if ( $retention_days > 365 ) { return 365; } return $retention_days; } /** * Sanitize a bounded integer setting. * * @param mixed $value Value. * @param int $min Minimum. * @param int $max Maximum. */ private function sanitize_bounded_integer( $value, int $min, int $max ): int { $number = (int) $value; return max( $min, min( $max, $number ) ); } }