This commit is contained in:
Javier Casares 2026-03-28 09:59:03 +00:00
commit b8e17df2db
17 changed files with 1145 additions and 732 deletions

View file

@ -185,7 +185,18 @@ class Two_Factor_Extended_REST_API {
$role = $request->get_param( 'role' );
$compliance = two_factor_extended()->get_compliance_report();
$stats = $compliance->get_compliance_stats( array( 'role' => $role ) );
if ( null === $compliance ) {
return new WP_REST_Response(
array(
'success' => false,
'message' => __( 'Compliance report module is not available.', 'two-factor-extended' ),
),
500
);
}
$stats = $compliance->get_compliance_stats( array( 'role' => is_string( $role ) ? $role : '' ) );
return new WP_REST_Response(
array(
@ -217,33 +228,54 @@ class Two_Factor_Extended_REST_API {
public function get_users( WP_REST_Request $request ): WP_REST_Response {
$role = $request->get_param( 'role' );
$non_compliant_only = $request->get_param( 'non_compliant_only' );
$role_string = is_string( $role ) ? $role : '';
$compliance = two_factor_extended()->get_compliance_report();
if ( null === $compliance ) {
return new WP_REST_Response(
array(
'success' => false,
'message' => __( 'Compliance report module is not available.', 'two-factor-extended' ),
),
500
);
}
if ( $non_compliant_only ) {
$users = $compliance->get_non_compliant_users( array( 'role' => $role ) );
$users = $compliance->get_non_compliant_users( array( 'role' => $role_string ) );
} else {
// Get all users with compliance status.
$user_args = array( 'fields' => 'all' );
if ( ! empty( $role ) ) {
$user_args['role'] = $role;
if ( ! empty( $role_string ) ) {
$user_args['role'] = $role_string;
}
$all_users = get_users( $user_args );
$all_users = get_users( $user_args );
$enforcement = two_factor_extended()->get_enforcement();
$users = array();
$users = array();
if ( null === $enforcement ) {
return new WP_REST_Response(
array(
'success' => false,
'message' => __( 'Enforcement module is not available.', 'two-factor-extended' ),
),
500
);
}
foreach ( $all_users as $user ) {
$required = $enforcement->get_required_providers_for_user( $user->ID );
$users[] = array(
'user_id' => $user->ID,
'user_login' => $user->user_login,
'user_email' => $user->user_email,
'roles' => Two_Factor_Extended_Role_Manager::get_user_roles( $user->ID ),
'compliant' => empty( $required ) || $enforcement->user_meets_requirements( $user->ID, $required ),
'in_grace' => $enforcement->is_in_grace_period( $user->ID ),
'user_id' => $user->ID,
'user_login' => $user->user_login,
'user_email' => $user->user_email,
'roles' => Two_Factor_Extended_Role_Manager::get_user_roles( $user->ID ),
'compliant' => empty( $required ) || $enforcement->user_meets_requirements( $user->ID, $required ),
'in_grace' => $enforcement->is_in_grace_period( $user->ID ),
'grace_remaining' => $enforcement->get_grace_period_remaining_days( $user->ID ),
);
}
@ -272,19 +304,45 @@ class Two_Factor_Extended_REST_API {
$user_ids = $request->get_param( 'user_ids' );
$reset_grace = $request->get_param( 'reset_grace' );
if ( ! is_array( $user_ids ) ) {
return new WP_REST_Response(
array(
'success' => false,
'message' => __( 'Invalid user_ids parameter.', 'two-factor-extended' ),
),
400
);
}
$enforcement = two_factor_extended()->get_enforcement();
$processed = 0;
$errors = array();
if ( null === $enforcement ) {
return new WP_REST_Response(
array(
'success' => false,
'message' => __( 'Enforcement module is not available.', 'two-factor-extended' ),
),
500
);
}
$processed = 0;
$errors = array();
foreach ( $user_ids as $user_id ) {
$user = get_userdata( $user_id );
if ( ! is_numeric( $user_id ) ) {
$errors[] = 'Invalid user_id value provided.';
continue;
}
$user_id_int = (int) $user_id;
$user = get_userdata( $user_id_int );
if ( ! $user ) {
$errors[] = sprintf( 'User not found: %d', $user_id );
$errors[] = sprintf( 'User not found: %d', $user_id_int );
continue;
}
$required = $enforcement->get_required_providers_for_user( $user_id );
$required = $enforcement->get_required_providers_for_user( $user_id_int );
if ( empty( $required ) ) {
$errors[] = sprintf( 'No 2FA requirements for user: %s', $user->user_login );
@ -292,19 +350,23 @@ class Two_Factor_Extended_REST_API {
}
// Set enforcement start date.
update_user_meta( $user_id, Two_Factor_Extended_Enforcement::META_ENFORCEMENT_START, time() );
update_user_meta( $user_id_int, Two_Factor_Extended_Enforcement::META_ENFORCEMENT_START, time() );
if ( $reset_grace ) {
delete_user_meta( $user_id, Two_Factor_Extended_Enforcement::META_GRACE_NOTIFIED );
delete_user_meta( $user_id_int, Two_Factor_Extended_Enforcement::META_GRACE_NOTIFIED );
}
// Log the action.
two_factor_extended()->get_audit_log()->log_event(
'api_enforce',
sprintf( 'REST API: Enforced 2FA for user %s', $user->user_login ),
$user_id,
array( 'required_providers' => $required )
);
$audit_log = two_factor_extended()->get_audit_log();
if ( null !== $audit_log ) {
$audit_log->log_event(
'api_enforce',
sprintf( 'REST API: Enforced 2FA for user %s', $user->user_login ),
$user_id_int,
array( 'required_providers' => $required )
);
}
$processed++;
}
@ -333,26 +395,45 @@ class Two_Factor_Extended_REST_API {
$processed = 0;
$errors = array();
if ( ! is_array( $user_ids ) ) {
return new WP_REST_Response(
array(
'success' => false,
'message' => __( 'Invalid user_ids parameter.', 'two-factor-extended' ),
),
400
);
}
foreach ( $user_ids as $user_id ) {
$user = get_userdata( $user_id );
if ( ! is_numeric( $user_id ) ) {
$errors[] = 'Invalid user_id value provided.';
continue;
}
$user_id_int = (int) $user_id;
$user = get_userdata( $user_id_int );
if ( ! $user ) {
$errors[] = sprintf( 'User not found: %d', $user_id );
$errors[] = sprintf( 'User not found: %d', $user_id_int );
continue;
}
// Reset enforcement start date.
update_user_meta( $user_id, Two_Factor_Extended_Enforcement::META_ENFORCEMENT_START, time() );
update_user_meta( $user_id_int, Two_Factor_Extended_Enforcement::META_ENFORCEMENT_START, time() );
// Clear grace period notified flag.
delete_user_meta( $user_id, Two_Factor_Extended_Enforcement::META_GRACE_NOTIFIED );
delete_user_meta( $user_id_int, Two_Factor_Extended_Enforcement::META_GRACE_NOTIFIED );
// Log the action.
two_factor_extended()->get_audit_log()->log_event(
'api_reset_grace',
sprintf( 'REST API: Reset grace period for user %s', $user->user_login ),
$user_id
);
$audit_log = two_factor_extended()->get_audit_log();
if ( null !== $audit_log ) {
$audit_log->log_event(
'api_reset_grace',
sprintf( 'REST API: Reset grace period for user %s', $user->user_login ),
$user_id_int
);
}
$processed++;
}
@ -377,13 +458,24 @@ class Two_Factor_Extended_REST_API {
* @return WP_REST_Response Response object.
*/
public function get_report( WP_REST_Request $request ): WP_REST_Response {
$role = $request->get_param( 'role' );
$format = $request->get_param( 'format' );
$role = $request->get_param( 'role' );
$format = $request->get_param( 'format' );
$role_string = is_string( $role ) ? $role : '';
$compliance = two_factor_extended()->get_compliance_report();
if ( null === $compliance ) {
return new WP_REST_Response(
array(
'success' => false,
'message' => __( 'Compliance report module is not available.', 'two-factor-extended' ),
),
500
);
}
if ( 'csv' === $format ) {
$csv = $compliance->export_to_csv( array( 'role' => $role ) );
$csv = $compliance->export_to_csv( array( 'role' => $role_string ) );
return new WP_REST_Response(
array(
@ -399,14 +491,14 @@ class Two_Factor_Extended_REST_API {
}
// JSON format.
$non_compliant = $compliance->get_non_compliant_users( array( 'role' => $role ) );
$stats = $compliance->get_compliance_stats( array( 'role' => $role ) );
$non_compliant = $compliance->get_non_compliant_users( array( 'role' => $role_string ) );
$stats = $compliance->get_compliance_stats( array( 'role' => $role_string ) );
return new WP_REST_Response(
array(
'success' => true,
'statistics' => $stats,
'non_compliant' => $non_compliant,
'success' => true,
'statistics' => $stats,
'non_compliant' => $non_compliant,
),
200
);