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();
?>
$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 ) ) {
?>
$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 ) ) {
?>
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'] );
}
}