From 5710369e38721c7678455ba06b978066116a9d50 Mon Sep 17 00:00:00 2001 From: Brian Date: Sun, 14 Jun 2026 19:31:23 +0200 Subject: [PATCH] add early notice feature --- providers/class-two-factor-backup-codes.php | 92 ++++++++++++++++----- 1 file changed, 71 insertions(+), 21 deletions(-) diff --git a/providers/class-two-factor-backup-codes.php b/providers/class-two-factor-backup-codes.php index 465e1f8f..d74592b3 100644 --- a/providers/class-two-factor-backup-codes.php +++ b/providers/class-two-factor-backup-codes.php @@ -28,6 +28,14 @@ class Two_Factor_Backup_Codes extends Two_Factor_Provider { */ const NUMBER_OF_CODES = 10; + /** + * The default number of remaining codes at or below which the user is + * warned to regenerate, before they run out entirely. + * + * @type int + */ + const LOW_CODES_THRESHOLD = 2; + /** * Class constructor. * @@ -97,7 +105,7 @@ public function register_rest_routes() { } /** - * Displays an admin notice when backup codes have run out. + * Displays an admin notice when backup codes have run out, or are running low. * * @since 0.1-dev * @@ -111,28 +119,70 @@ public function admin_notices() { return; } - // Return if we are not out of codes. - if ( $this->is_available_for_user( $user ) ) { + $count = self::codes_remaining_for_user( $user ); + $regenerate_url = esc_url( get_edit_user_link( $user->ID ) . '#two-factor-backup-codes' ); + + // Out of codes: show an error and bail. + if ( 0 === $count ) { + ?> +
+

+ + regenerate!', 'two-factor' ), + $regenerate_url + ), + array( 'a' => array( 'href' => true ) ) + ); + ?> + +

+
+ -
-

- - regenerate!', 'two-factor' ), - esc_url( get_edit_user_link( $user->ID ) . '#two-factor-backup-codes' ) - ), - array( 'a' => array( 'href' => true ) ) - ); - ?> - -

-
- +
+

+ + Regenerate your codes now before you run out.', + 'Two-Factor: You only have %1$s recovery codes left. Regenerate your codes now before you run out.', + $count, + 'two-factor' + ), + number_format_i18n( $count ), + $regenerate_url + ), + array( 'a' => array( 'href' => true ) ) + ); + ?> + +

+
+