v1.1.0
This commit is contained in:
parent
71b471e13e
commit
231ef59bb9
15 changed files with 254 additions and 135 deletions
|
|
@ -120,11 +120,11 @@ class Two_Factor_Extended_Audit_Log {
|
|||
return;
|
||||
}
|
||||
|
||||
$providers = Two_Factor_Extended_Provider_Detector::get_user_enabled_providers( $user_id );
|
||||
$providers = Two_Factor_Extended_Provider_Detector::get_user_enabled_providers( $user_id );
|
||||
$provider_names = array();
|
||||
|
||||
foreach ( array_keys( $providers ) as $class ) {
|
||||
$names = Two_Factor_Extended_Provider_Detector::get_provider_names();
|
||||
$names = Two_Factor_Extended_Provider_Detector::get_provider_names();
|
||||
$provider_names[] = $names[ $class ] ?? $class;
|
||||
}
|
||||
|
||||
|
|
@ -301,7 +301,7 @@ class Two_Factor_Extended_Audit_Log {
|
|||
* @since 0.1.0
|
||||
*/
|
||||
public function cleanup_old_logs(): void {
|
||||
$logs = $this->get_logs();
|
||||
$logs = $this->get_logs();
|
||||
$cutoff_time = current_time( 'timestamp' ) - ( self::RETENTION_DAYS * DAY_IN_SECONDS );
|
||||
|
||||
$filtered_logs = array_filter(
|
||||
|
|
@ -328,7 +328,7 @@ class Two_Factor_Extended_Audit_Log {
|
|||
public function export_to_csv( array $filters = array() ): string {
|
||||
$logs = $this->get_logs( $filters );
|
||||
|
||||
$csv = array();
|
||||
$csv = array();
|
||||
$csv[] = array( 'Timestamp', 'Action', 'Description', 'User', 'Actor', 'IP Address' );
|
||||
|
||||
foreach ( $logs as $log ) {
|
||||
|
|
@ -424,8 +424,8 @@ class Two_Factor_Extended_Audit_Log {
|
|||
$logs = $this->get_logs();
|
||||
|
||||
$stats = array(
|
||||
'total' => count( $logs ),
|
||||
'by_action' => array(),
|
||||
'total' => count( $logs ),
|
||||
'by_action' => array(),
|
||||
'recent_count' => 0,
|
||||
);
|
||||
|
||||
|
|
@ -439,11 +439,11 @@ class Two_Factor_Extended_Audit_Log {
|
|||
if ( ! isset( $stats['by_action'][ $action ] ) ) {
|
||||
$stats['by_action'][ $action ] = 0;
|
||||
}
|
||||
$stats['by_action'][ $action ]++;
|
||||
++$stats['by_action'][ $action ];
|
||||
|
||||
// Count recent logs (last 7 days).
|
||||
if ( $ts >= $recent_cutoff ) {
|
||||
$stats['recent_count']++;
|
||||
++$stats['recent_count'];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -158,7 +158,7 @@ class Two_Factor_Extended_Bulk_Actions {
|
|||
);
|
||||
}
|
||||
|
||||
$processed++;
|
||||
++$processed;
|
||||
}
|
||||
|
||||
return $processed;
|
||||
|
|
@ -203,7 +203,7 @@ class Two_Factor_Extended_Bulk_Actions {
|
|||
);
|
||||
}
|
||||
|
||||
$processed++;
|
||||
++$processed;
|
||||
}
|
||||
|
||||
return $processed;
|
||||
|
|
|
|||
|
|
@ -66,29 +66,29 @@ class Two_Factor_Extended_CLI_Commands {
|
|||
|
||||
$overview = array(
|
||||
array(
|
||||
'Metric' => 'Total Users',
|
||||
'Count' => $stats['total_users'],
|
||||
'Percentage' => '100%',
|
||||
'Metric' => 'Total Users',
|
||||
'Count' => $stats['total_users'],
|
||||
'Percentage' => '100%',
|
||||
),
|
||||
array(
|
||||
'Metric' => 'Compliant',
|
||||
'Count' => $stats['compliant_users'],
|
||||
'Percentage' => $this->calculate_percentage( $stats['compliant_users'], $stats['total_users'] ),
|
||||
'Metric' => 'Compliant',
|
||||
'Count' => $stats['compliant_users'],
|
||||
'Percentage' => $this->calculate_percentage( $stats['compliant_users'], $stats['total_users'] ),
|
||||
),
|
||||
array(
|
||||
'Metric' => 'Non-Compliant',
|
||||
'Count' => $stats['non_compliant'],
|
||||
'Percentage' => $this->calculate_percentage( $stats['non_compliant'], $stats['total_users'] ),
|
||||
'Metric' => 'Non-Compliant',
|
||||
'Count' => $stats['non_compliant'],
|
||||
'Percentage' => $this->calculate_percentage( $stats['non_compliant'], $stats['total_users'] ),
|
||||
),
|
||||
array(
|
||||
'Metric' => 'In Grace Period',
|
||||
'Count' => $stats['grace_period'],
|
||||
'Percentage' => $this->calculate_percentage( $stats['grace_period'], $stats['total_users'] ),
|
||||
'Metric' => 'In Grace Period',
|
||||
'Count' => $stats['grace_period'],
|
||||
'Percentage' => $this->calculate_percentage( $stats['grace_period'], $stats['total_users'] ),
|
||||
),
|
||||
array(
|
||||
'Metric' => 'No Requirements',
|
||||
'Count' => $stats['no_requirements'],
|
||||
'Percentage' => $this->calculate_percentage( $stats['no_requirements'], $stats['total_users'] ),
|
||||
'Metric' => 'No Requirements',
|
||||
'Count' => $stats['no_requirements'],
|
||||
'Percentage' => $this->calculate_percentage( $stats['no_requirements'], $stats['total_users'] ),
|
||||
),
|
||||
);
|
||||
|
||||
|
|
@ -105,11 +105,11 @@ class Two_Factor_Extended_CLI_Commands {
|
|||
$role_name = Two_Factor_Extended_Role_Manager::get_role_display_name( $role_key );
|
||||
|
||||
$by_role[] = array(
|
||||
'Role' => $role_name,
|
||||
'Total' => $role_stats['total'],
|
||||
'Compliant' => $role_stats['compliant'],
|
||||
'Non-Compliant' => $role_stats['non_compliant'],
|
||||
'Compliance %' => $this->calculate_percentage( $role_stats['compliant'], $role_stats['total'] ),
|
||||
'Role' => $role_name,
|
||||
'Total' => $role_stats['total'],
|
||||
'Compliant' => $role_stats['compliant'],
|
||||
'Non-Compliant' => $role_stats['non_compliant'],
|
||||
'Compliance %' => $this->calculate_percentage( $role_stats['compliant'], $role_stats['total'] ),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -196,7 +196,7 @@ class Two_Factor_Extended_CLI_Commands {
|
|||
);
|
||||
}
|
||||
|
||||
$processed++;
|
||||
++$processed;
|
||||
$progress->tick();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -53,12 +53,12 @@ class Two_Factor_Extended_Compliance_Report {
|
|||
$users = get_users( $user_args );
|
||||
|
||||
$stats = array(
|
||||
'total_users' => count( $users ),
|
||||
'compliant_users' => 0,
|
||||
'non_compliant' => 0,
|
||||
'grace_period' => 0,
|
||||
'no_requirements' => 0,
|
||||
'by_role' => array(),
|
||||
'total_users' => count( $users ),
|
||||
'compliant_users' => 0,
|
||||
'non_compliant' => 0,
|
||||
'grace_period' => 0,
|
||||
'no_requirements' => 0,
|
||||
'by_role' => array(),
|
||||
);
|
||||
|
||||
$enforcement = two_factor_extended()->get_enforcement();
|
||||
|
|
@ -71,7 +71,7 @@ class Two_Factor_Extended_Compliance_Report {
|
|||
$required = $enforcement->get_required_providers_for_user( $user->ID );
|
||||
|
||||
if ( empty( $required ) ) {
|
||||
$stats['no_requirements']++;
|
||||
++$stats['no_requirements'];
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -79,11 +79,11 @@ class Two_Factor_Extended_Compliance_Report {
|
|||
$in_grace = $enforcement->is_in_grace_period( $user->ID );
|
||||
|
||||
if ( $compliant ) {
|
||||
$stats['compliant_users']++;
|
||||
++$stats['compliant_users'];
|
||||
} elseif ( $in_grace ) {
|
||||
$stats['grace_period']++;
|
||||
++$stats['grace_period'];
|
||||
} else {
|
||||
$stats['non_compliant']++;
|
||||
++$stats['non_compliant'];
|
||||
}
|
||||
|
||||
// Count by role.
|
||||
|
|
@ -92,18 +92,18 @@ class Two_Factor_Extended_Compliance_Report {
|
|||
foreach ( $roles as $role ) {
|
||||
if ( ! isset( $stats['by_role'][ $role ] ) ) {
|
||||
$stats['by_role'][ $role ] = array(
|
||||
'total' => 0,
|
||||
'compliant' => 0,
|
||||
'total' => 0,
|
||||
'compliant' => 0,
|
||||
'non_compliant' => 0,
|
||||
);
|
||||
}
|
||||
|
||||
$stats['by_role'][ $role ]['total']++;
|
||||
++$stats['by_role'][ $role ]['total'];
|
||||
|
||||
if ( $compliant ) {
|
||||
$stats['by_role'][ $role ]['compliant']++;
|
||||
++$stats['by_role'][ $role ]['compliant'];
|
||||
} else {
|
||||
$stats['by_role'][ $role ]['non_compliant']++;
|
||||
++$stats['by_role'][ $role ]['non_compliant'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -194,13 +194,13 @@ class Two_Factor_Extended_Compliance_Report {
|
|||
return array();
|
||||
}
|
||||
|
||||
$sites = get_sites( array( 'number' => 999 ) );
|
||||
$sites = get_sites( array( 'number' => 999 ) );
|
||||
$report = array(
|
||||
'total_sites' => count( $sites ),
|
||||
'total_users' => 0,
|
||||
'compliant' => 0,
|
||||
'non_compliant' => 0,
|
||||
'by_site' => array(),
|
||||
'total_sites' => count( $sites ),
|
||||
'total_users' => 0,
|
||||
'compliant' => 0,
|
||||
'non_compliant' => 0,
|
||||
'by_site' => array(),
|
||||
);
|
||||
|
||||
foreach ( $sites as $site ) {
|
||||
|
|
@ -216,8 +216,8 @@ class Two_Factor_Extended_Compliance_Report {
|
|||
'non_compliant' => $site_stats['non_compliant'],
|
||||
);
|
||||
|
||||
$report['total_users'] += $site_stats['total_users'];
|
||||
$report['compliant'] += $site_stats['compliant_users'];
|
||||
$report['total_users'] += $site_stats['total_users'];
|
||||
$report['compliant'] += $site_stats['compliant_users'];
|
||||
$report['non_compliant'] += $site_stats['non_compliant'];
|
||||
|
||||
restore_current_blog();
|
||||
|
|
@ -238,7 +238,7 @@ class Two_Factor_Extended_Compliance_Report {
|
|||
public function export_to_csv( array $args = array() ): string {
|
||||
$non_compliant = $this->get_non_compliant_users( $args );
|
||||
|
||||
$csv = array();
|
||||
$csv = array();
|
||||
$csv[] = array( 'User ID', 'Username', 'Email', 'Roles', 'Missing Providers', 'Grace Period', 'Days Remaining' );
|
||||
|
||||
foreach ( $non_compliant as $user_data ) {
|
||||
|
|
@ -317,7 +317,7 @@ class Two_Factor_Extended_Compliance_Report {
|
|||
|
||||
foreach ( $stats['by_role'] as $role => $role_stats ) {
|
||||
$role_name = Two_Factor_Extended_Role_Manager::get_role_display_name( $role );
|
||||
$message .= sprintf(
|
||||
$message .= sprintf(
|
||||
' %s: %d/%d compliant',
|
||||
$role_name,
|
||||
$role_stats['compliant'],
|
||||
|
|
|
|||
|
|
@ -393,7 +393,7 @@ class Two_Factor_Extended_Enforcement {
|
|||
* @return array<int, string> Array of provider labels.
|
||||
*/
|
||||
private function get_provider_labels( array $provider_classes ): array {
|
||||
$names = Two_Factor_Extended_Provider_Detector::get_provider_names();
|
||||
$names = Two_Factor_Extended_Provider_Detector::get_provider_names();
|
||||
$labels = array();
|
||||
|
||||
foreach ( $provider_classes as $class ) {
|
||||
|
|
|
|||
|
|
@ -247,9 +247,9 @@ class Two_Factor_Extended_Network_Settings {
|
|||
* @param array<string, mixed> $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();
|
||||
$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 ) ) {
|
||||
?>
|
||||
|
|
@ -384,7 +384,7 @@ class Two_Factor_Extended_Network_Settings {
|
|||
|
||||
// Grace period days.
|
||||
if ( isset( $input['grace_period_days'] ) && is_numeric( $input['grace_period_days'] ) ) {
|
||||
$days = (int) $input['grace_period_days'];
|
||||
$days = (int) $input['grace_period_days'];
|
||||
$sanitized['grace_period_days'] = max( 0, min( 365, $days ) );
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -368,7 +368,7 @@ class Two_Factor_Extended_REST_API {
|
|||
);
|
||||
}
|
||||
|
||||
$processed++;
|
||||
++$processed;
|
||||
}
|
||||
|
||||
return new WP_REST_Response(
|
||||
|
|
@ -435,7 +435,7 @@ class Two_Factor_Extended_REST_API {
|
|||
);
|
||||
}
|
||||
|
||||
$processed++;
|
||||
++$processed;
|
||||
}
|
||||
|
||||
return new WP_REST_Response(
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ class Two_Factor_Extended_Role_Manager {
|
|||
require_once ABSPATH . 'wp-admin/includes/user.php';
|
||||
}
|
||||
|
||||
$roles = array();
|
||||
$wp_roles = get_editable_roles();
|
||||
$roles = array();
|
||||
$wp_roles = get_editable_roles();
|
||||
|
||||
foreach ( $wp_roles as $role_slug => $role_data ) {
|
||||
$roles[ $role_slug ] = translate_user_role( $role_data['name'] );
|
||||
|
|
|
|||
|
|
@ -453,7 +453,7 @@ class Two_Factor_Extended_Settings {
|
|||
</td>
|
||||
<td>
|
||||
<?php
|
||||
$role_req_raw = $requirements[ $role_slug ] ?? array();
|
||||
$role_req_raw = $requirements[ $role_slug ] ?? array();
|
||||
$role_requirements = is_array( $role_req_raw ) ? $role_req_raw : array();
|
||||
|
||||
foreach ( $providers as $provider_class => $provider_name ) :
|
||||
|
|
@ -537,16 +537,16 @@ class Two_Factor_Extended_Settings {
|
|||
</td>
|
||||
<td>
|
||||
<?php
|
||||
$role_vis_raw = $visibility[ $role_slug ] ?? array();
|
||||
$role_req_raw = $requirements[ $role_slug ] ?? array();
|
||||
$role_vis_raw = $visibility[ $role_slug ] ?? array();
|
||||
$role_req_raw = $requirements[ $role_slug ] ?? array();
|
||||
$role_visibility = is_array( $role_vis_raw ) ? $role_vis_raw : array();
|
||||
$role_required = is_array( $role_req_raw ) ? $role_req_raw : array();
|
||||
|
||||
foreach ( $providers as $provider_class => $provider_name ) :
|
||||
$checked = in_array( $provider_class, $role_visibility, true );
|
||||
$is_required = in_array( $provider_class, $role_required, true );
|
||||
$disabled = $is_required ? 'disabled' : '';
|
||||
$checked = $checked || $is_required;
|
||||
$disabled = $is_required ? 'disabled' : '';
|
||||
$checked = $checked || $is_required;
|
||||
?>
|
||||
<label style="display: block; margin-bottom: 5px;">
|
||||
<input
|
||||
|
|
@ -989,7 +989,7 @@ class Two_Factor_Extended_Settings {
|
|||
<h2 class="nav-tab-wrapper">
|
||||
<?php foreach ( $tabs as $tab_key => $tab_label ) : ?>
|
||||
<a href="<?php echo esc_url( add_query_arg( 'tab', $tab_key, admin_url( 'options-general.php?page=' . self::PAGE_SLUG ) ) ); ?>"
|
||||
class="nav-tab <?php echo $current_tab === $tab_key ? 'nav-tab-active' : ''; ?>">
|
||||
class="nav-tab <?php echo $current_tab === $tab_key ? 'nav-tab-active' : ''; ?>">
|
||||
<?php echo esc_html( $tab_label ); ?>
|
||||
</a>
|
||||
<?php endforeach; ?>
|
||||
|
|
@ -1106,7 +1106,7 @@ class Two_Factor_Extended_Settings {
|
|||
wp_nonce_url(
|
||||
add_query_arg(
|
||||
array(
|
||||
'tab' => 'audit-log',
|
||||
'tab' => 'audit-log',
|
||||
'action' => 'export',
|
||||
)
|
||||
),
|
||||
|
|
@ -1133,11 +1133,11 @@ class Two_Factor_Extended_Settings {
|
|||
<?php if ( ! empty( $logs ) ) : ?>
|
||||
<?php foreach ( array_slice( $logs, 0, 50 ) as $log ) : ?>
|
||||
<?php
|
||||
$log_ts = isset( $log['timestamp'] ) && is_int( $log['timestamp'] ) ? $log['timestamp'] : null;
|
||||
$log_action = isset( $log['action'] ) && is_string( $log['action'] ) ? $log['action'] : '';
|
||||
$log_desc = isset( $log['description'] ) && is_string( $log['description'] ) ? $log['description'] : '';
|
||||
$log_actor_id = isset( $log['actor_id'] ) && is_int( $log['actor_id'] ) ? $log['actor_id'] : 0;
|
||||
$log_ip = isset( $log['ip_address'] ) && is_string( $log['ip_address'] ) ? $log['ip_address'] : '-';
|
||||
$log_ts = isset( $log['timestamp'] ) && is_int( $log['timestamp'] ) ? $log['timestamp'] : null;
|
||||
$log_action = isset( $log['action'] ) && is_string( $log['action'] ) ? $log['action'] : '';
|
||||
$log_desc = isset( $log['description'] ) && is_string( $log['description'] ) ? $log['description'] : '';
|
||||
$log_actor_id = isset( $log['actor_id'] ) && is_int( $log['actor_id'] ) ? $log['actor_id'] : 0;
|
||||
$log_ip = isset( $log['ip_address'] ) && is_string( $log['ip_address'] ) ? $log['ip_address'] : '-';
|
||||
?>
|
||||
<tr>
|
||||
<td><?php echo esc_html( gmdate( 'Y-m-d H:i:s', $log_ts ) ); ?></td>
|
||||
|
|
@ -1200,8 +1200,8 @@ class Two_Factor_Extended_Settings {
|
|||
exit;
|
||||
}
|
||||
|
||||
$stats = $compliance->get_compliance_stats();
|
||||
$non_compliant = $compliance->get_non_compliant_users();
|
||||
$stats = $compliance->get_compliance_stats();
|
||||
$non_compliant = $compliance->get_non_compliant_users();
|
||||
|
||||
?>
|
||||
<div class="card">
|
||||
|
|
@ -1265,7 +1265,7 @@ class Two_Factor_Extended_Settings {
|
|||
wp_nonce_url(
|
||||
add_query_arg(
|
||||
array(
|
||||
'tab' => 'compliance',
|
||||
'tab' => 'compliance',
|
||||
'action' => 'export',
|
||||
)
|
||||
),
|
||||
|
|
@ -1292,16 +1292,16 @@ class Two_Factor_Extended_Settings {
|
|||
<?php if ( ! empty( $non_compliant ) ) : ?>
|
||||
<?php foreach ( $non_compliant as $user_data ) : ?>
|
||||
<?php
|
||||
$user_id_val = isset( $user_data['user_id'] ) && is_int( $user_data['user_id'] ) ? $user_data['user_id'] : 0;
|
||||
$user_login_val = isset( $user_data['user_login'] ) && is_string( $user_data['user_login'] ) ? $user_data['user_login'] : '';
|
||||
$user_email_val = isset( $user_data['user_email'] ) && is_string( $user_data['user_email'] ) ? $user_data['user_email'] : '';
|
||||
$roles_raw = isset( $user_data['roles'] ) && is_array( $user_data['roles'] ) ? $user_data['roles'] : array();
|
||||
$missing_raw = isset( $user_data['missing_providers'] ) && is_array( $user_data['missing_providers'] ) ? $user_data['missing_providers'] : array();
|
||||
$in_grace = ! empty( $user_data['in_grace_period'] );
|
||||
$grace_remaining = isset( $user_data['grace_remaining'] ) && is_numeric( $user_data['grace_remaining'] ) ? (int) $user_data['grace_remaining'] : 0;
|
||||
$user_id_val = isset( $user_data['user_id'] ) && is_int( $user_data['user_id'] ) ? $user_data['user_id'] : 0;
|
||||
$user_login_val = isset( $user_data['user_login'] ) && is_string( $user_data['user_login'] ) ? $user_data['user_login'] : '';
|
||||
$user_email_val = isset( $user_data['user_email'] ) && is_string( $user_data['user_email'] ) ? $user_data['user_email'] : '';
|
||||
$roles_raw = isset( $user_data['roles'] ) && is_array( $user_data['roles'] ) ? $user_data['roles'] : array();
|
||||
$missing_raw = isset( $user_data['missing_providers'] ) && is_array( $user_data['missing_providers'] ) ? $user_data['missing_providers'] : array();
|
||||
$in_grace = ! empty( $user_data['in_grace_period'] );
|
||||
$grace_remaining = isset( $user_data['grace_remaining'] ) && is_numeric( $user_data['grace_remaining'] ) ? (int) $user_data['grace_remaining'] : 0;
|
||||
// Get user object for display name.
|
||||
$user = $user_id_val ? get_userdata( $user_id_val ) : null;
|
||||
$roles_display = array_map(
|
||||
$user = $user_id_val ? get_userdata( $user_id_val ) : null;
|
||||
$roles_display = array_map(
|
||||
function ( $role_slug ) {
|
||||
if ( ! is_string( $role_slug ) ) {
|
||||
return '';
|
||||
|
|
@ -1401,7 +1401,7 @@ class Two_Factor_Extended_Settings {
|
|||
echo '<div class="notice notice-success"><p>' . esc_html__( 'Audit logs cleared successfully.', 'two-factor-extended' ) . '</p></div>';
|
||||
}
|
||||
|
||||
$logs = $audit_log->get_logs();
|
||||
$logs = $audit_log->get_logs();
|
||||
$stats = $audit_log->get_statistics();
|
||||
|
||||
?>
|
||||
|
|
@ -1448,12 +1448,12 @@ class Two_Factor_Extended_Settings {
|
|||
<?php else : ?>
|
||||
<?php foreach ( array_slice( $logs, 0, 50 ) as $log ) : ?>
|
||||
<?php
|
||||
$log_user_id = isset( $log['user_id'] ) && is_int( $log['user_id'] ) ? $log['user_id'] : 0;
|
||||
$log_ts = isset( $log['timestamp'] ) && is_int( $log['timestamp'] ) ? $log['timestamp'] : null;
|
||||
$log_action = isset( $log['action'] ) && is_string( $log['action'] ) ? $log['action'] : '';
|
||||
$log_desc = isset( $log['description'] ) && is_string( $log['description'] ) ? $log['description'] : '';
|
||||
$log_ip = isset( $log['ip_address'] ) && is_string( $log['ip_address'] ) ? $log['ip_address'] : '';
|
||||
$user = $log_user_id ? get_userdata( $log_user_id ) : null;
|
||||
$log_user_id = isset( $log['user_id'] ) && is_int( $log['user_id'] ) ? $log['user_id'] : 0;
|
||||
$log_ts = isset( $log['timestamp'] ) && is_int( $log['timestamp'] ) ? $log['timestamp'] : null;
|
||||
$log_action = isset( $log['action'] ) && is_string( $log['action'] ) ? $log['action'] : '';
|
||||
$log_desc = isset( $log['description'] ) && is_string( $log['description'] ) ? $log['description'] : '';
|
||||
$log_ip = isset( $log['ip_address'] ) && is_string( $log['ip_address'] ) ? $log['ip_address'] : '';
|
||||
$user = $log_user_id ? get_userdata( $log_user_id ) : null;
|
||||
?>
|
||||
<tr>
|
||||
<td><?php echo esc_html( gmdate( 'Y-m-d H:i:s', $log_ts ) ); ?></td>
|
||||
|
|
@ -1521,7 +1521,7 @@ class Two_Factor_Extended_Settings {
|
|||
}
|
||||
}
|
||||
|
||||
$stats = $compliance->get_compliance_stats();
|
||||
$stats = $compliance->get_compliance_stats();
|
||||
$non_compliant = $compliance->get_non_compliant_users();
|
||||
|
||||
?>
|
||||
|
|
@ -1790,7 +1790,7 @@ class Two_Factor_Extended_Settings {
|
|||
|
||||
// Sanitize grace period days.
|
||||
if ( isset( $input['grace_period_days'] ) && is_numeric( $input['grace_period_days'] ) ) {
|
||||
$grace_days = (int) $input['grace_period_days'];
|
||||
$grace_days = (int) $input['grace_period_days'];
|
||||
$sanitized['grace_period_days'] = max( 0, min( 365, $grace_days ) );
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ class Two_Factor_Extended {
|
|||
* @since 0.1.0
|
||||
* @var string
|
||||
*/
|
||||
private string $version = '1.0.2';
|
||||
private string $version = '1.1.0';
|
||||
|
||||
/**
|
||||
* Plugin directory path.
|
||||
|
|
|
|||
Loading…
Reference in a new issue