init_hooks(); } /** * Initialize WordPress hooks. * * @since 0.1.0 */ private function init_hooks(): void { add_action( 'network_admin_menu', array( $this, 'register_network_menu' ) ); add_action( 'network_admin_edit_two_factor_extended_network', array( $this, 'save_network_settings' ) ); } /** * Register network admin menu. * * @since 0.1.0 */ public function register_network_menu(): void { if ( ! current_user_can( 'manage_network_options' ) ) { return; } add_submenu_page( 'settings.php', __( 'Two Factor Extended', 'two-factor-extended' ), __( 'Two Factor Extended', 'two-factor-extended' ), 'manage_network_options', self::PAGE_SLUG, array( $this, 'render_network_page' ) ); } /** * Render network settings page. * * @since 0.1.0 */ public function render_network_page(): void { // Check capability. if ( ! current_user_can( 'manage_network_options' ) ) { wp_die( esc_html__( 'You do not have sufficient permissions to access this page.', 'two-factor-extended' ) ); } $settings = $this->get_network_settings(); ?>

render_super_admin_requirements( $settings ); ?>

render_network_role_requirements( $settings ); ?>
$settings Current network settings. */ private function render_super_admin_requirements( array $settings ): void { $providers = Two_Factor_Extended_Provider_Detector::get_provider_names(); $super_admin_reqs = isset( $settings['super_admin_requirements'] ) && is_array( $settings['super_admin_requirements'] ) ? $settings['super_admin_requirements'] : array(); if ( empty( $providers ) ) { ?>

$name ) : ?>

$settings Current network settings. */ private function render_network_role_requirements( array $settings ): void { $roles = Two_Factor_Extended_Role_Manager::get_all_roles(); $providers = Two_Factor_Extended_Provider_Detector::get_provider_names(); $network_reqs = isset( $settings['role_requirements'] ) && is_array( $settings['role_requirements'] ) ? $settings['role_requirements'] : array(); if ( empty( $providers ) ) { ?>

$role_name ) : ?>
$name ) : ?>
sanitize_network_settings( $input ); // Save settings. update_site_option( TWO_FACTOR_EXTENDED_NETWORK_OPTION_SETTINGS, $sanitized ); // Redirect with success message. wp_safe_redirect( add_query_arg( 'updated', 'true', network_admin_url( 'settings.php?page=' . self::PAGE_SLUG ) ) ); exit; } /** * Get network settings. * * @since 0.1.0 * * @return array Network settings. */ public function get_network_settings(): array { $defaults = array( 'enforce_network_wide' => false, 'allow_site_override' => true, 'grace_period_days' => 7, 'super_admin_requirements' => array(), 'role_requirements' => array(), ); $settings = get_site_option( TWO_FACTOR_EXTENDED_NETWORK_OPTION_SETTINGS, array() ); if ( ! is_array( $settings ) ) { $settings = array(); } return wp_parse_args( $settings, $defaults ); } /** * Sanitize network settings. * * @since 0.1.0 * * @param array $input Raw input. * * @return array Sanitized settings. */ private function sanitize_network_settings( array $input ): array { $sanitized = array(); // Enforce network wide. $sanitized['enforce_network_wide'] = ! empty( $input['enforce_network_wide'] ); // Allow site override. $sanitized['allow_site_override'] = ! empty( $input['allow_site_override'] ); // Grace period days. if ( isset( $input['grace_period_days'] ) && is_numeric( $input['grace_period_days'] ) ) { $days = (int) $input['grace_period_days']; $sanitized['grace_period_days'] = max( 0, min( 365, $days ) ); } // Super admin requirements. if ( isset( $input['super_admin_requirements'] ) && is_array( $input['super_admin_requirements'] ) ) { $sanitized['super_admin_requirements'] = array_map( function ( mixed $item ): string { return sanitize_text_field( is_string( $item ) ? $item : '' ); }, $input['super_admin_requirements'] ); } // Role requirements. if ( isset( $input['role_requirements'] ) && is_array( $input['role_requirements'] ) ) { $sanitized['role_requirements'] = array(); foreach ( $input['role_requirements'] as $role => $providers ) { $role_slug = sanitize_key( is_string( $role ) ? $role : '' ); if ( Two_Factor_Extended_Role_Manager::role_exists( $role_slug ) && is_array( $providers ) ) { $sanitized['role_requirements'][ $role_slug ] = array_map( function ( mixed $item ): string { return sanitize_text_field( is_string( $item ) ? $item : '' ); }, $providers ); } } } return $sanitized; } /** * Check if network enforcement is enabled. * * @since 0.1.0 * * @return bool True if network enforcement is enabled. */ public function is_network_enforcement_enabled(): bool { $settings = $this->get_network_settings(); return ! empty( $settings['enforce_network_wide'] ); } /** * Check if site override is allowed. * * @since 0.1.0 * * @return bool True if site override is allowed. */ public function is_site_override_allowed(): bool { $settings = $this->get_network_settings(); return ! empty( $settings['allow_site_override'] ); } }