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();
?>
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() );
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'] ) ) {
$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( 'sanitize_text_field', $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( $role );
if ( Two_Factor_Extended_Role_Manager::role_exists( $role_slug ) && is_array( $providers ) ) {
$sanitized['role_requirements'][ $role_slug ] = array_map( 'sanitize_text_field', $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'] );
}
}