'boolean', 'sanitize_callback' => array( $this, 'sanitize_boolean' ), 'default' => true, ) ); register_setting( 'ability_guard_settings', 'ability_guard_log_output_data', array( 'type' => 'boolean', 'sanitize_callback' => array( $this, 'sanitize_boolean' ), 'default' => false, ) ); register_setting( 'ability_guard_settings', 'ability_guard_delete_data_on_uninstall', array( 'type' => 'boolean', 'sanitize_callback' => array( $this, 'sanitize_boolean' ), 'default' => false, ) ); register_setting( 'ability_guard_settings', 'ability_guard_log_retention_limit', array( 'type' => 'integer', 'sanitize_callback' => array( $this, 'sanitize_retention_limit' ), 'default' => ABILITY_GUARD_LOG_LIMIT, ) ); register_setting( 'ability_guard_settings', 'ability_guard_watchlist', array( 'type' => 'array', 'sanitize_callback' => array( $this, 'sanitize_ability_list' ), 'default' => array(), ) ); $boolean_defaults = array( 'ability_guard_alerts_enabled' => false, 'ability_guard_alert_on_high_risk' => true, 'ability_guard_alert_on_errors' => true, 'ability_guard_alert_on_watched' => true, 'ability_guard_reports_enabled' => false, ); foreach ( $boolean_defaults as $option_name => $default_value ) { register_setting( 'ability_guard_settings', $option_name, array( 'type' => 'boolean', 'sanitize_callback' => array( $this, 'sanitize_boolean' ), 'default' => $default_value, ) ); } foreach ( array( 'ability_guard_alert_email', 'ability_guard_report_email' ) as $option_name ) { register_setting( 'ability_guard_settings', $option_name, array( 'type' => 'string', 'sanitize_callback' => 'sanitize_email', 'default' => get_option( 'admin_email' ), ) ); } register_setting( 'ability_guard_settings', 'ability_guard_report_frequency', array( 'type' => 'string', 'sanitize_callback' => array( $this, 'sanitize_report_frequency' ), 'default' => 'weekly', ) ); add_settings_section( 'ability_guard_logging', esc_html__( 'Logging', 'ability-guard' ), array( $this, 'render_logging_section' ), 'ability_guard_settings' ); add_settings_section( 'ability_guard_alerting', esc_html__( 'Monitoring', 'ability-guard' ), array( $this, 'render_alerting_section' ), 'ability_guard_settings' ); add_settings_field( 'ability_guard_log_input_data', esc_html__( 'Log input data', 'ability-guard' ), array( $this, 'render_log_input_field' ), 'ability_guard_settings', 'ability_guard_logging' ); add_settings_field( 'ability_guard_log_output_data', esc_html__( 'Log output data', 'ability-guard' ), array( $this, 'render_log_output_field' ), 'ability_guard_settings', 'ability_guard_logging' ); add_settings_field( 'ability_guard_log_retention_limit', esc_html__( 'Log retention', 'ability-guard' ), array( $this, 'render_retention_field' ), 'ability_guard_settings', 'ability_guard_logging' ); add_settings_field( 'ability_guard_delete_data_on_uninstall', esc_html__( 'Delete data on uninstall', 'ability-guard' ), array( $this, 'render_delete_data_field' ), 'ability_guard_settings', 'ability_guard_logging' ); add_settings_field( 'ability_guard_watchlist', esc_html__( 'Sensitive watchlist', 'ability-guard' ), array( $this, 'render_watchlist_field' ), 'ability_guard_settings', 'ability_guard_alerting' ); add_settings_field( 'ability_guard_alerts_enabled', esc_html__( 'Email alerts', 'ability-guard' ), array( $this, 'render_alert_fields' ), 'ability_guard_settings', 'ability_guard_alerting' ); add_settings_field( 'ability_guard_reports_enabled', esc_html__( 'Scheduled reports', 'ability-guard' ), array( $this, 'render_report_fields' ), 'ability_guard_settings', 'ability_guard_alerting' ); } /** * Sanitize checkbox value. * * @param mixed $value Raw value. * @return bool */ public function sanitize_boolean( $value ): bool { return (bool) $value; } /** * Sanitize retention limit. Zero means unlimited. * * @param mixed $value Raw value. * @return int */ public function sanitize_retention_limit( $value ): int { return max( 0, absint( $value ) ); } /** * Sanitize textarea ability list. * * @param mixed $value Raw value. * @return array */ public function sanitize_ability_list( $value ): array { if ( is_string( $value ) ) { $value = preg_split( '/\r\n|\r|\n/', $value ); } if ( ! is_array( $value ) ) { return array(); } $items = array(); foreach ( $value as $item ) { $item = sanitize_text_field( (string) $item ); if ( '' !== $item ) { $items[] = $item; } } return array_values( array_unique( $items ) ); } /** * Sanitize report frequency. * * @param mixed $value Raw value. * @return string */ public function sanitize_report_frequency( $value ): string { $value = sanitize_key( (string) $value ); return in_array( $value, array( 'daily', 'weekly' ), true ) ? $value : 'weekly'; } /** * Render section copy. */ public function render_logging_section(): void { echo '

' . esc_html__( 'Choose what ability execution context AbilityGuard stores and how long logs are retained.', 'ability-guard' ) . '

'; } /** * Render alerting section copy. */ public function render_alerting_section(): void { echo '

' . esc_html__( 'Configure watchlists, email alerts, and scheduled activity reports.', 'ability-guard' ) . '

'; } /** * Render input logging field. */ public function render_log_input_field(): void { $this->render_checkbox( 'ability_guard_log_input_data', esc_html__( 'Store the validated input passed to each ability.', 'ability-guard' ) ); } /** * Render output logging field. */ public function render_log_output_field(): void { $this->render_checkbox( 'ability_guard_log_output_data', esc_html__( 'Store successful ability output. Leave this off if outputs may contain sensitive or large data.', 'ability-guard' ) ); } /** * Render retention field. */ public function render_retention_field(): void { $value = absint( get_option( 'ability_guard_log_retention_limit', ABILITY_GUARD_LOG_LIMIT ) ); ?>

render_checkbox( 'ability_guard_delete_data_on_uninstall', esc_html__( 'Remove AbilityGuard logs and settings when the plugin is uninstalled.', 'ability-guard' ) ); } /** * Render watchlist field. */ public function render_watchlist_field(): void { $watchlist = get_option( 'ability_guard_watchlist', array() ); $value = is_array( $watchlist ) ? implode( "\n", $watchlist ) : ''; ?>

'; $this->render_checkbox( 'ability_guard_alerts_enabled', esc_html__( 'Send email alerts for selected ability activity.', 'ability-guard' ) ); ?>

'; $this->render_checkbox( 'ability_guard_alert_on_high_risk', esc_html__( 'Alert when high-risk abilities execute.', 'ability-guard' ) ); $this->render_checkbox( 'ability_guard_alert_on_errors', esc_html__( 'Alert when ability executions fail.', 'ability-guard' ) ); $this->render_checkbox( 'ability_guard_alert_on_watched', esc_html__( 'Alert when watched abilities execute.', 'ability-guard' ) ); echo ''; echo ''; } /** * Render report fields. */ public function render_report_fields(): void { echo '
'; $this->render_checkbox( 'ability_guard_reports_enabled', esc_html__( 'Email a summary report of recent ability activity.', 'ability-guard' ) ); ?>

'; } /** * Render a checkbox. * * @param string $option_name Option name. * @param string $label Label text. */ private function render_checkbox( string $option_name, string $label ): void { $value = (bool) get_option( $option_name, false ); ?>