This commit is contained in:
Javier Casares 2026-03-28 09:59:53 +00:00
commit 71b471e13e
19 changed files with 771 additions and 60 deletions

View file

@ -6,7 +6,7 @@ _Release date: 2026-02-17_
**Initial Production Release** **Initial Production Release**
This is the first comprehensive release of Two Factor Extended, implementing enterprise-level two-factor authentication management for WordPress. This is the first comprehensive release of Two-Factor Extended, implementing enterprise-level two-factor authentication management for WordPress.
**Core Features** **Core Features**

View file

@ -14,7 +14,7 @@ if ( ! defined( 'ABSPATH' ) ) {
/** /**
* Class Two_Factor_Extended_CLI_Commands * Class Two_Factor_Extended_CLI_Commands
* *
* Provides WP-CLI commands for Two Factor Extended. * Provides WP-CLI commands for Two-Factor Extended.
* *
* @since 0.1.0 * @since 0.1.0
*/ */

View file

@ -292,7 +292,7 @@ class Two_Factor_Extended_Compliance_Report {
public function email_report( string $to, array $args = array() ): bool { public function email_report( string $to, array $args = array() ): bool {
$stats = $this->get_compliance_stats( $args ); $stats = $this->get_compliance_stats( $args );
$subject = __( 'Two Factor Extended - Compliance Report', 'two-factor-extended' ); $subject = __( 'Two-Factor Extended - Compliance Report', 'two-factor-extended' );
$message = sprintf( $message = sprintf(
/* translators: 1: Site name */ /* translators: 1: Site name */

View file

@ -97,7 +97,7 @@ class Two_Factor_Extended_Dependency_Checker {
?> ?>
<div class="notice notice-error"> <div class="notice notice-error">
<p> <p>
<strong><?php esc_html_e( 'Two Factor Extended', 'two-factor-extended' ); ?>:</strong> <strong><?php esc_html_e( 'Two-Factor Extended', 'two-factor-extended' ); ?>:</strong>
<?php <?php
printf( printf(
/* translators: %s: Two Factor plugin link */ /* translators: %s: Two Factor plugin link */
@ -119,7 +119,7 @@ class Two_Factor_Extended_Dependency_Checker {
?> ?>
<div class="notice notice-error"> <div class="notice notice-error">
<p> <p>
<strong><?php esc_html_e( 'Two Factor Extended', 'two-factor-extended' ); ?>:</strong> <strong><?php esc_html_e( 'Two-Factor Extended', 'two-factor-extended' ); ?>:</strong>
<?php <?php
printf( printf(
/* translators: %s: Minimum WordPress version */ /* translators: %s: Minimum WordPress version */
@ -141,7 +141,7 @@ class Two_Factor_Extended_Dependency_Checker {
?> ?>
<div class="notice notice-error"> <div class="notice notice-error">
<p> <p>
<strong><?php esc_html_e( 'Two Factor Extended', 'two-factor-extended' ); ?>:</strong> <strong><?php esc_html_e( 'Two-Factor Extended', 'two-factor-extended' ); ?>:</strong>
<?php <?php
printf( printf(
/* translators: %s: Minimum PHP version */ /* translators: %s: Minimum PHP version */

View file

@ -157,7 +157,15 @@ class Two_Factor_Extended_Enforcement {
// If site override is not allowed, return only network requirements. // If site override is not allowed, return only network requirements.
if ( empty( $network_settings['allow_site_override'] ) ) { if ( empty( $network_settings['allow_site_override'] ) ) {
return array_values( array_unique( $required ) ); $network_required = array_values( array_unique( $required ) );
// Intersect with globally-available providers (Two Factor 0.16+).
if ( class_exists( 'Two_Factor_Core' ) ) {
$available = array_keys( Two_Factor_Core::get_providers() );
$network_required = ! empty( $available ) ? array_values( array_intersect( $network_required, $available ) ) : $network_required;
}
return $network_required;
} }
} }
} }
@ -185,7 +193,19 @@ class Two_Factor_Extended_Enforcement {
} }
} }
return array_values( array_unique( $required ) ); $required = array_values( array_unique( $required ) );
// Intersect with globally-available providers (Two Factor 0.16+).
// If Two-Factor has disabled a provider site-wide, it cannot be enforced.
if ( class_exists( 'Two_Factor_Core' ) ) {
$available = array_keys( Two_Factor_Core::get_providers() );
if ( ! empty( $available ) ) {
$required = array_values( array_intersect( $required, $available ) );
}
}
return $required;
} }
/** /**
@ -316,7 +336,7 @@ class Two_Factor_Extended_Enforcement {
?> ?>
<div class="notice notice-warning"> <div class="notice notice-warning">
<p> <p>
<strong><?php esc_html_e( 'Two Factor Extended:', 'two-factor-extended' ); ?></strong> <strong><?php esc_html_e( 'Two-Factor Extended:', 'two-factor-extended' ); ?></strong>
<?php <?php
printf( printf(
esc_html( esc_html(
@ -344,7 +364,7 @@ class Two_Factor_Extended_Enforcement {
?> ?>
<div class="notice notice-error"> <div class="notice notice-error">
<p> <p>
<strong><?php esc_html_e( 'Two Factor Extended:', 'two-factor-extended' ); ?></strong> <strong><?php esc_html_e( 'Two-Factor Extended:', 'two-factor-extended' ); ?></strong>
<?php <?php
printf( printf(
/* translators: %s: Required providers list */ /* translators: %s: Required providers list */

View file

@ -64,8 +64,8 @@ class Two_Factor_Extended_Network_Settings {
add_submenu_page( add_submenu_page(
'settings.php', 'settings.php',
__( 'Two Factor Extended', 'two-factor-extended' ), __( 'Two-Factor Extended', 'two-factor-extended' ),
__( 'Two Factor Extended', 'two-factor-extended' ), __( 'Two-Factor Extended', 'two-factor-extended' ),
'manage_network_options', 'manage_network_options',
self::PAGE_SLUG, self::PAGE_SLUG,
array( $this, 'render_network_page' ) array( $this, 'render_network_page' )

View file

@ -233,7 +233,7 @@ class Two_Factor_Extended_Provider_Filter {
?> ?>
<div class="notice notice-info inline"> <div class="notice notice-info inline">
<p> <p>
<strong><?php esc_html_e( 'Two Factor Extended:', 'two-factor-extended' ); ?></strong> <strong><?php esc_html_e( 'Two-Factor Extended:', 'two-factor-extended' ); ?></strong>
<?php <?php
printf( printf(
/* translators: %s: List of hidden providers */ /* translators: %s: List of hidden providers */

View file

@ -14,7 +14,7 @@ if ( ! defined( 'ABSPATH' ) ) {
/** /**
* Class Two_Factor_Extended_REST_API * Class Two_Factor_Extended_REST_API
* *
* Provides REST API endpoints for Two Factor Extended. * Provides REST API endpoints for Two-Factor Extended.
* *
* @since 0.1.0 * @since 0.1.0
*/ */

View file

@ -66,8 +66,8 @@ class Two_Factor_Extended_Settings {
// Main settings page with tabs (Settings, Audit Log, Compliance). // Main settings page with tabs (Settings, Audit Log, Compliance).
add_options_page( add_options_page(
__( 'Two Factor Extended', 'two-factor-extended' ), __( 'Two-Factor Extended', 'two-factor-extended' ),
__( 'Two Factor Extended', 'two-factor-extended' ), __( 'Two-Factor Extended', 'two-factor-extended' ),
'manage_options', 'manage_options',
self::PAGE_SLUG, self::PAGE_SLUG,
array( $this, 'render_settings_page' ) array( $this, 'render_settings_page' )
@ -92,8 +92,8 @@ class Two_Factor_Extended_Settings {
add_submenu_page( add_submenu_page(
'settings.php', 'settings.php',
__( 'Two Factor Extended', 'two-factor-extended' ), __( 'Two-Factor Extended', 'two-factor-extended' ),
__( 'Two Factor Extended', 'two-factor-extended' ), __( 'Two-Factor Extended', 'two-factor-extended' ),
'manage_network_options', 'manage_network_options',
self::PAGE_SLUG, self::PAGE_SLUG,
array( $this, 'render_network_settings_page' ) array( $this, 'render_network_settings_page' )
@ -1406,7 +1406,7 @@ class Two_Factor_Extended_Settings {
?> ?>
<div class="wrap"> <div class="wrap">
<h1><?php esc_html_e( 'Two Factor Extended - Audit Log', 'two-factor-extended' ); ?></h1> <h1><?php esc_html_e( 'Two-Factor Extended - Audit Log', 'two-factor-extended' ); ?></h1>
<div class="card"> <div class="card">
<h2><?php esc_html_e( 'Statistics', 'two-factor-extended' ); ?></h2> <h2><?php esc_html_e( 'Statistics', 'two-factor-extended' ); ?></h2>
@ -1526,7 +1526,7 @@ class Two_Factor_Extended_Settings {
?> ?>
<div class="wrap"> <div class="wrap">
<h1><?php esc_html_e( 'Two Factor Extended - Compliance Report', 'two-factor-extended' ); ?></h1> <h1><?php esc_html_e( 'Two-Factor Extended - Compliance Report', 'two-factor-extended' ); ?></h1>
<div class="card"> <div class="card">
<h2><?php esc_html_e( 'Overview', 'two-factor-extended' ); ?></h2> <h2><?php esc_html_e( 'Overview', 'two-factor-extended' ); ?></h2>

View file

@ -34,7 +34,7 @@ class Two_Factor_Extended {
* @since 0.1.0 * @since 0.1.0
* @var string * @var string
*/ */
private string $version = '1.0.1'; private string $version = '1.0.2';
/** /**
* Plugin directory path. * Plugin directory path.

Binary file not shown.

View file

@ -0,0 +1,691 @@
# Translation of Two-Factor Extended to Catalan
# Copyright (C) 2026 javiercasares, ROBOTSTXT
# This file is distributed under the GPL-3.0-or-later.
msgid ""
msgstr ""
"Project-Id-Version: Two-Factor Extended 1.0.2\n"
"Report-Msgid-Bugs-To: https://git.robotstxt.es/ROBOTSTXT/two-factor-extended/issues\n"
"Last-Translator: javiercasares, ROBOTSTXT\n"
"Language-Team: Catalan <ca@li.org>\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"POT-Creation-Date: 2026-03-28T00:00:00+00:00\n"
"PO-Revision-Date: 2026-03-28 00:00+0000\n"
"X-Generator: Manual\n"
"X-Domain: two-factor-extended\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. Plugin Name of the plugin
#: two-factor-extended.php
#: includes/class-dependency-checker.php:100
#: includes/class-dependency-checker.php:122
#: includes/class-dependency-checker.php:144
#: includes/class-network-settings.php:67
#: includes/class-network-settings.php:68
#: includes/class-settings.php:83
#: includes/class-settings.php:84
#: includes/class-settings.php:109
#: includes/class-settings.php:110
msgid "Two-Factor Extended"
msgstr "Two-Factor Extended"
#. Plugin URI of the plugin
#: two-factor-extended.php
msgid "https://git.robotstxt.es/ROBOTSTXT/two-factor-extended"
msgstr "https://git.robotstxt.es/ROBOTSTXT/two-factor-extended"
#. Description of the plugin
#: two-factor-extended.php
msgid "Extends the WordPress Two Factor plugin with advanced role-based controls, forced 2FA methods, and enhanced administrative features for single-site and Multisite installations."
msgstr "Amplia el connector WordPress Two Factor amb controls avançats basats en rols, mètodes 2FA obligatoris i funcions administratives millorades per a instal·lacions de lloc únic i Multisitio."
#. Author of the plugin
#: two-factor-extended.php
msgid "javiercasares, ROBOTSTXT"
msgstr "javiercasares, ROBOTSTXT"
#. Author URI of the plugin
#: two-factor-extended.php
msgid "https://www.robotstxt.es/"
msgstr "https://www.robotstxt.es/"
#: includes/class-bulk-actions.php:62
msgid "Require 2FA Setup"
msgstr "Requerir configuració 2FA"
#: includes/class-bulk-actions.php:63
msgid "Reset 2FA Grace Period"
msgstr "Restablir el període de gràcia 2FA"
#. translators: %d: Number of users
#: includes/class-bulk-actions.php:221
#, php-format
msgid "2FA requirement set for %d user."
msgid_plural "2FA requirement set for %d users."
msgstr[0] "Requisit 2FA establert per a %d usuari."
msgstr[1] "Requisit 2FA establert per a %d usuaris."
#. translators: %d: Number of users
#: includes/class-bulk-actions.php:242
#, php-format
msgid "Grace period reset for %d user."
msgid_plural "Grace period reset for %d users."
msgstr[0] "Període de gràcia restablit per a %d usuari."
msgstr[1] "Període de gràcia restablit per a %d usuaris."
#: includes/class-compliance-report.php:274
#: includes/class-settings.php:1392
msgid "Two-Factor Extended - Compliance Report"
msgstr "Two-Factor Extended - Informe de compliment"
#. translators: 1: Site name
#: includes/class-compliance-report.php:278
#, php-format
msgid "Compliance Report for %s"
msgstr "Informe de compliment per a %s"
#: includes/class-compliance-report.php:282
msgid "Summary:"
msgstr "Resum:"
#: includes/class-compliance-report.php:283
#, php-format
msgid "Total Users: %d"
msgstr "Total d'usuaris: %d"
#: includes/class-compliance-report.php:284
#, php-format
msgid "Compliant: %d"
msgstr "Complint: %d"
#: includes/class-compliance-report.php:285
#, php-format
msgid "Non-Compliant: %d"
msgstr "No complint: %d"
#: includes/class-compliance-report.php:286
#, php-format
msgid "In Grace Period: %d"
msgstr "En període de gràcia: %d"
#: includes/class-compliance-report.php:287
#, php-format
msgid "No Requirements: %d"
msgstr "Sense requisits: %d"
#: includes/class-compliance-report.php:290
msgid "By Role:"
msgstr "Per rol:"
#: includes/class-compliance-report.php:303
msgid "For detailed information, please log in to the WordPress admin."
msgstr "Per a informació detallada, accediu a l'administrador de WordPress."
#. translators: %s: Two Factor plugin link
#: includes/class-dependency-checker.php:104
#, php-format
msgid "This plugin requires the %s plugin to be installed and activated."
msgstr "Aquest connector requereix que el connector %s estigui instal·lat i activat."
#: includes/class-dependency-checker.php:105
msgid "Two Factor"
msgstr "Two Factor"
#. translators: %s: Minimum WordPress version
#: includes/class-dependency-checker.php:126
#, php-format
msgid "This plugin requires WordPress %s or higher."
msgstr "Aquest connector requereix WordPress %s o superior."
#. translators: %s: Minimum PHP version
#: includes/class-dependency-checker.php:148
#, php-format
msgid "This plugin requires PHP %s or higher."
msgstr "Aquest connector requereix PHP %s o superior."
#. translators: %s: Required providers list
#: includes/class-enforcement.php:98
#, php-format
msgid "Your account requires the following 2FA methods to be configured: %s. Please contact an administrator for assistance."
msgstr "El vostre compte requereix que es configurin els mètodes 2FA següents: %s. Poseu-vos en contacte amb un administrador per obtenir ajuda."
#: includes/class-enforcement.php:292
#: includes/class-enforcement.php:320
#: includes/class-provider-filter.php:218
msgid "Two-Factor Extended:"
msgstr "Two-Factor Extended:"
#: includes/class-enforcement.php:297
#, php-format
msgid "You have %1$d day remaining to configure the required 2FA methods: %2$s"
msgid_plural "You have %1$d days remaining to configure the required 2FA methods: %2$s"
msgstr[0] "Us queda %1$d dia per configurar els mètodes 2FA requerits: %2$s"
msgstr[1] "Us queden %1$d dies per configurar els mètodes 2FA requerits: %2$s"
#: includes/class-enforcement.php:311
#: includes/class-enforcement.php:331
msgid "Configure 2FA Now"
msgstr "Configura el 2FA ara"
#. translators: %s: Required providers list
#: includes/class-enforcement.php:324
#, php-format
msgid "Your account requires the following 2FA methods: %s. Your access may be restricted until you configure them."
msgstr "El vostre compte requereix els mètodes 2FA següents: %s. L'accés pot estar restringit fins que els configureu."
#: includes/class-network-settings.php:83
#: includes/class-settings.php:936
#: includes/class-settings.php:1262
#: includes/class-settings.php:1353
#: includes/class-settings.php:1508
#: robotstxt-updater.php:367
msgid "You do not have sufficient permissions to access this page."
msgstr "No teniu permisos suficients per accedir a aquesta pàgina."
#: includes/class-network-settings.php:97
#: includes/class-settings.php:1534
msgid "Network settings saved successfully."
msgstr "La configuració de xarxa s'ha desat correctament."
#: includes/class-network-settings.php:104
msgid "Network-Wide Settings"
msgstr "Configuració de tota la xarxa"
#: includes/class-network-settings.php:110
msgid "Network-Wide Enforcement"
msgstr "Aplicació a tota la xarxa"
#: includes/class-network-settings.php:123
msgid "Apply these settings to all sites in the network"
msgstr "Aplica aquesta configuració a tots els llocs de la xarxa"
#: includes/class-network-settings.php:126
msgid "When enabled, network settings override individual site settings."
msgstr "Quan s'activa, la configuració de xarxa substitueix la configuració de llocs individuals."
#: includes/class-network-settings.php:135
msgid "Allow Site Override"
msgstr "Permet la substitució del lloc"
#: includes/class-network-settings.php:148
msgid "Allow individual sites to override network settings"
msgstr "Permet que llocs individuals substitueixin la configuració de xarxa"
#: includes/class-network-settings.php:151
msgid "Site administrators can configure their own 2FA requirements."
msgstr "Els administradors de lloc poden configurar els seus propis requisits 2FA."
#: includes/class-network-settings.php:159
msgid "Super Admin Requirements"
msgstr "Requisits del superadministrador"
#: includes/class-network-settings.php:168
msgid "Network Grace Period"
msgstr "Període de gràcia de xarxa"
#: includes/class-network-settings.php:180
msgid "days"
msgstr "dies"
#: includes/class-network-settings.php:182
msgid "Grace period for all sites in the network. Set to 0 for immediate enforcement."
msgstr "Període de gràcia per a tots els llocs de la xarxa. Establiu 0 per a l'aplicació immediata."
#: includes/class-network-settings.php:188
msgid "Network Role Requirements"
msgstr "Requisits de rols de xarxa"
#: includes/class-network-settings.php:190
msgid "Configure 2FA requirements that apply across all sites in the network."
msgstr "Configura els requisits 2FA que s'apliquen a tots els llocs de la xarxa."
#: includes/class-network-settings.php:195
#: includes/class-settings.php:1554
msgid "Save Network Settings"
msgstr "Desa la configuració de xarxa"
#: includes/class-network-settings.php:215
#: includes/class-network-settings.php:256
msgid "No 2FA providers detected."
msgstr "No s'han detectat proveïdors 2FA."
#: includes/class-network-settings.php:235
msgid "Required 2FA methods for super administrators."
msgstr "Mètodes 2FA requerits per als superadministradors."
#: includes/class-network-settings.php:266
#: includes/class-settings.php:464
#: includes/class-settings.php:546
#: includes/class-settings.php:1161
#: includes/class-settings.php:1426
msgid "Role"
msgstr "Rol"
#: includes/class-network-settings.php:267
#: includes/class-settings.php:465
msgid "Required 2FA Methods"
msgstr "Mètodes 2FA requerits"
#: includes/class-network-settings.php:306
#: includes/class-settings.php:755
#: includes/class-settings.php:767
#: includes/class-settings.php:1737
msgid "You do not have sufficient permissions to perform this action."
msgstr "No teniu permisos suficients per dur a terme aquesta acció."
#: includes/class-network-settings.php:315
#: includes/class-settings.php:1517
#: includes/class-settings.php:1732
msgid "Security check failed."
msgstr "Ha fallat la comprovació de seguretat."
#. translators: %s: List of hidden providers
#: includes/class-provider-filter.php:222
#, php-format
msgid "Some 2FA methods are hidden based on your role: %s"
msgstr "Alguns mètodes 2FA estan ocults segons el vostre rol: %s"
#: includes/class-rest-api.php:201
msgid "Unable to retrieve compliance status."
msgstr "No es pot recuperar l'estat de compliment."
#: includes/class-settings.php:161
msgid "General Settings"
msgstr "Configuració general"
#: includes/class-settings.php:169
msgid "Role-Based 2FA Requirements"
msgstr "Requisits 2FA basats en rols"
#: includes/class-settings.php:177
msgid "Role-Based Provider Visibility"
msgstr "Visibilitat de proveïdors basada en rols"
#: includes/class-settings.php:185
msgid "Data Management"
msgstr "Gestió de dades"
#: includes/class-settings.php:207
msgid "Grace Period (Days)"
msgstr "Període de gràcia (dies)"
#: includes/class-settings.php:215
msgid "Number of days users have to configure required 2FA methods before enforcement. Set to 0 for immediate enforcement."
msgstr "Nombre de dies que tenen els usuaris per configurar els mètodes 2FA requerits abans de l'aplicació. Establiu 0 per a l'aplicació immediata."
#: includes/class-settings.php:225
msgid "Role Requirements"
msgstr "Requisits de rol"
#: includes/class-settings.php:235
msgid "Provider Visibility"
msgstr "Visibilitat de proveïdors"
#: includes/class-settings.php:245
msgid "Remove Data on Uninstall"
msgstr "Elimina les dades en desinstal·lar"
#: includes/class-settings.php:252
msgid "Delete all plugin data when the plugin is uninstalled"
msgstr "Elimina totes les dades del connector quan es desinstal·li"
#: includes/class-settings.php:253
msgid "Warning: This action cannot be undone. All plugin settings and data will be permanently deleted."
msgstr "Avís: Aquesta acció no es pot desfer. Tota la configuració i les dades del connector s'eliminaran permanentment."
#: includes/class-settings.php:266
msgid "Configure general plugin settings."
msgstr "Configura els paràmetres generals del connector."
#: includes/class-settings.php:280
msgid "Configure which 2FA methods are required for each user role. Users with multiple roles must satisfy all role requirements."
msgstr "Configura quins mètodes 2FA són necessaris per a cada rol d'usuari. Els usuaris amb diversos rols han de complir tots els requisits de rol."
#: includes/class-settings.php:293
msgid "Control which 2FA methods are visible to each role. Users with multiple roles see methods visible to ANY of their roles (union logic). Required methods are always visible."
msgstr "Controla quins mètodes 2FA són visibles per a cada rol. Els usuaris amb diversos rols veuen els mètodes visibles per a QUALSEVOL dels seus rols (lògica d'unió). Els mètodes requerits sempre són visibles."
#: includes/class-settings.php:306
msgid "Manage plugin data and cleanup options."
msgstr "Gestiona les dades del connector i les opcions de neteja."
#: includes/class-settings.php:309
msgid "Import / Export Settings"
msgstr "Importa / Exporta la configuració"
#: includes/class-settings.php:314
#: includes/class-settings.php:320
msgid "Export Settings"
msgstr "Exporta la configuració"
#: includes/class-settings.php:324
msgid "Export all plugin settings to a JSON file. This can be used to backup or transfer settings to another site."
msgstr "Exporta tota la configuració del connector a un fitxer JSON. Això es pot usar per fer una còpia de seguretat o transferir la configuració a un altre lloc."
#: includes/class-settings.php:330
#: includes/class-settings.php:345
msgid "Import Settings"
msgstr "Importa la configuració"
#: includes/class-settings.php:349
msgid "Import plugin settings from a previously exported JSON file. This will overwrite your current settings. Maximum file size: 1MB."
msgstr "Importa la configuració del connector des d'un fitxer JSON exportat anteriorment. Això sobreescriurà la configuració actual. Mida màxima del fitxer: 1 MB."
#: includes/class-settings.php:355
msgid "Reset Plugin"
msgstr "Restablir el connector"
#: includes/class-settings.php:360
msgid "Reset to Default Settings"
msgstr "Restablir la configuració predeterminada"
#: includes/class-settings.php:363
msgid "Are you sure you want to reset all plugin settings to their default values? This action cannot be undone."
msgstr "Esteu segur que voleu restablir tota la configuració del connector als valors predeterminats? Aquesta acció no es pot desfer."
#: includes/class-settings.php:366
msgid "Reset All Settings"
msgstr "Restablir tota la configuració"
#: includes/class-settings.php:370
msgid "Warning: This will reset all plugin settings to their default values, including role requirements and provider visibility. User grace period data will be cleared. This action cannot be undone."
msgstr "Avís: Això restablirà tota la configuració del connector als valors predeterminats, incloent-hi els requisits de rol i la visibilitat de proveïdors. Les dades del període de gràcia dels usuaris s'esboraran. Aquesta acció no es pot desfer."
#: includes/class-settings.php:453
#: includes/class-settings.php:534
msgid "No 2FA providers detected. Please ensure the Two Factor plugin is active and properly configured."
msgstr "No s'han detectat proveïdors 2FA. Assegureu-vos que el connector Two Factor estigui actiu i configurat correctament."
#: includes/class-settings.php:497
msgid "Select which 2FA methods each role must have configured. Users will not be able to log in without these methods."
msgstr "Seleccioneu quins mètodes 2FA ha de tenir configurats cada rol. Els usuaris no podran iniciar sessió sense aquests mètodes."
#: includes/class-settings.php:547
msgid "Visible 2FA Methods"
msgstr "Mètodes 2FA visibles"
#: includes/class-settings.php:577
msgid "(Required)"
msgstr "(Requerit)"
#: includes/class-settings.php:599
msgid "Uncheck methods to hide them from users with this role. Required methods are always visible and cannot be hidden."
msgstr "Desmarqueu els mètodes per amagar-los als usuaris amb aquest rol. Els mètodes requerits sempre són visibles i no es poden amagar."
#: includes/class-settings.php:664
msgid "Network Settings Active:"
msgstr "Configuració de xarxa activa:"
#: includes/class-settings.php:667
msgid "This site inherits settings from the network, but you can override them below."
msgstr "Aquest lloc hereta la configuració de la xarxa, però podeu substituir-la a continuació."
#: includes/class-settings.php:669
msgid "This site inherits settings from the network. Site-level changes are disabled."
msgstr "Aquest lloc hereta la configuració de la xarxa. Els canvis a nivell de lloc estan desactivats."
#: includes/class-settings.php:719
#: includes/class-settings.php:851
msgid "File size exceeds 1MB limit. Please use a smaller file."
msgstr "La mida del fitxer supera el límit d'1 MB. Utilitzeu un fitxer més petit."
#: includes/class-settings.php:726
msgid "Please select a valid JSON file (.json extension)."
msgstr "Seleccioneu un fitxer JSON vàlid (extensió .json)."
#: includes/class-settings.php:731
msgid "Importing will overwrite your current settings. Are you sure you want to continue?"
msgstr "La importació sobreescriurà la configuració actual. Esteu segur que voleu continuar?"
#: includes/class-settings.php:821
msgid "Unable to export settings. Please try again later."
msgstr "No es pot exportar la configuració. Torneu-ho a intentar més tard."
#: includes/class-settings.php:822
msgid "Export Error"
msgstr "Error d'exportació"
#: includes/class-settings.php:839
msgid "Error uploading file. Please try again."
msgstr "Error en pujar el fitxer. Torneu-ho a intentar."
#: includes/class-settings.php:863
msgid "Invalid file type. Please upload a JSON file."
msgstr "Tipus de fitxer no vàlid. Pugeu un fitxer JSON."
#: includes/class-settings.php:876
msgid "Error reading file. Please try again."
msgstr "Error en llegir el fitxer. Torneu-ho a intentar."
#: includes/class-settings.php:889
msgid "Invalid JSON file. Please upload a valid settings export file."
msgstr "Fitxer JSON no vàlid. Pugeu un fitxer d'exportació de configuració vàlid."
#: includes/class-settings.php:900
msgid "Invalid settings file structure."
msgstr "Estructura del fitxer de configuració no vàlida."
#: includes/class-settings.php:923
msgid "Settings imported successfully!"
msgstr "La configuració s'ha importat correctament!"
#: includes/class-settings.php:944
msgid "Settings"
msgstr "Configuració"
#: includes/class-settings.php:945
msgid "Audit Log"
msgstr "Registre d'auditoria"
#: includes/class-settings.php:946
msgid "Compliance"
msgstr "Compliment"
#: includes/class-settings.php:998
msgid "Site-level settings are currently disabled by network administrator. Please contact your network administrator to make changes."
msgstr "La configuració a nivell de lloc està desactivada per l'administrador de xarxa. Poseu-vos en contacte amb l'administrador de xarxa per fer canvis."
#: includes/class-settings.php:1040
#: includes/class-settings.php:1283
msgid "Audit logs cleared successfully."
msgstr "Els registres d'auditoria s'han esborrat correctament."
#: includes/class-settings.php:1048
#: includes/class-settings.php:1294
msgid "Statistics"
msgstr "Estadístiques"
#: includes/class-settings.php:1049
#: includes/class-settings.php:1295
#, php-format
msgid "Total logs: %d"
msgstr "Total de registres: %d"
#: includes/class-settings.php:1050
#: includes/class-settings.php:1296
#, php-format
msgid "Recent activity (7 days): %d"
msgstr "Activitat recent (7 dies): %d"
#: includes/class-settings.php:1055
#: includes/class-settings.php:1185
#: includes/class-settings.php:1301
#: includes/class-settings.php:1450
msgid "Export to CSV"
msgstr "Exporta a CSV"
#: includes/class-settings.php:1062
#: includes/class-settings.php:1308
msgid "Date"
msgstr "Data"
#: includes/class-settings.php:1063
#: includes/class-settings.php:1309
msgid "Action"
msgstr "Acció"
#: includes/class-settings.php:1064
#: includes/class-settings.php:1310
msgid "Description"
msgstr "Descripció"
#: includes/class-settings.php:1065
#: includes/class-settings.php:1192
#: includes/class-settings.php:1311
msgid "User"
msgstr "Usuari"
#: includes/class-settings.php:1066
#: includes/class-settings.php:1312
msgid "IP Address"
msgstr "Adreça IP"
#: includes/class-settings.php:1080
msgid "Unknown"
msgstr "Desconegut"
#: includes/class-settings.php:1082
msgid "System"
msgstr "Sistema"
#: includes/class-settings.php:1091
#: includes/class-settings.php:1318
msgid "No audit logs found."
msgstr "No s'han trobat registres d'auditoria."
#: includes/class-settings.php:1099
#, php-format
msgid "Showing 50 most recent logs. Total logs: %d"
msgstr "S'mostren els 50 registres més recents. Total de registres: %d"
#: includes/class-settings.php:1130
#: includes/class-settings.php:1395
msgid "Overview"
msgstr "Resum general"
#: includes/class-settings.php:1133
#: includes/class-settings.php:1398
msgid "Total Users"
msgstr "Total d'usuaris"
#: includes/class-settings.php:1137
#: includes/class-settings.php:1163
#: includes/class-settings.php:1402
#: includes/class-settings.php:1428
msgid "Compliant"
msgstr "Complint"
#: includes/class-settings.php:1141
#: includes/class-settings.php:1164
#: includes/class-settings.php:1406
#: includes/class-settings.php:1429
msgid "Non-Compliant"
msgstr "No complint"
#: includes/class-settings.php:1145
#: includes/class-settings.php:1410
msgid "In Grace Period"
msgstr "En període de gràcia"
#: includes/class-settings.php:1149
#: includes/class-settings.php:1414
msgid "No Requirements"
msgstr "Sense requisits"
#: includes/class-settings.php:1157
#: includes/class-settings.php:1422
msgid "Compliance by Role"
msgstr "Compliment per rol"
#: includes/class-settings.php:1162
#: includes/class-settings.php:1427
msgid "Total"
msgstr "Total"
#: includes/class-settings.php:1181
#: includes/class-settings.php:1446
msgid "Non-Compliant Users"
msgstr "Usuaris no complints"
#: includes/class-settings.php:1193
#: includes/class-settings.php:1458
msgid "Email"
msgstr "Correu electrònic"
#: includes/class-settings.php:1194
#: includes/class-settings.php:1459
msgid "Roles"
msgstr "Rols"
#: includes/class-settings.php:1195
#: includes/class-settings.php:1461
msgid "Status"
msgstr "Estat"
#: includes/class-settings.php:1196
#: includes/class-settings.php:1460
msgid "Missing Providers"
msgstr "Proveïdors que falten"
#: includes/class-settings.php:1215
#, php-format
msgid "Grace period (%d days left)"
msgstr "Període de gràcia (%d dies restants)"
#: includes/class-settings.php:1221
#: includes/class-settings.php:1488
msgid "Non-compliant"
msgstr "No complint"
#: includes/class-settings.php:1229
#: includes/class-settings.php:1467
msgid "All users are compliant!"
msgstr "Tots els usuaris compleixen els requisits!"
#: includes/class-settings.php:1291
msgid "Two-Factor Extended - Audit Log"
msgstr "Two-Factor Extended - Registre d'auditoria"
#: includes/class-settings.php:1339
msgid "Showing 50 most recent logs. Export to CSV for full history."
msgstr "S'mostren els 50 registres més recents. Exporteu a CSV per a l'historial complet."
#: includes/class-settings.php:1380
msgid "Report sent successfully."
msgstr "L'informe s'ha enviat correctament."
#: includes/class-settings.php:1382
msgid "Failed to send report."
msgstr "No s'ha pogut enviar l'informe."
#: includes/class-settings.php:1457
msgid "Username"
msgstr "Nom d'usuari"
#. translators: %d: Number of days
#: includes/class-settings.php:1482
#, php-format
msgid "Grace: %d days"
msgstr "Gràcia: %d dies"
#: includes/class-settings.php:1544
msgid "Network-wide Settings"
msgstr "Configuració de tota la xarxa"
#: includes/class-settings.php:1548
msgid "Network settings will be available in future versions."
msgstr "La configuració de xarxa estarà disponible en versions futures."
#: includes/class-settings.php:1764
msgid "Plugin settings have been reset to default values successfully."
msgstr "La configuració del connector s'ha restablit als valors predeterminats correctament."
#: includes/class-settings.php:1785
msgid "Failed to reset plugin settings. Please try again."
msgstr "No s'ha pogut restablir la configuració del connector. Torneu-ho a intentar."
#: robotstxt-updater.php:362
msgid "Security check failed"
msgstr "Ha fallat la comprovació de seguretat"

View file

@ -1,9 +1,9 @@
# Translation of Two Factor Extended to Spanish (Spain) # Translation of Two-Factor Extended to Spanish (Spain)
# Copyright (C) 2026 javiercasares, ROBOTSTXT # Copyright (C) 2026 javiercasares, ROBOTSTXT
# This file is distributed under the GPL-3.0-or-later. # This file is distributed under the GPL-3.0-or-later.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Two Factor Extended 1.0.0\n" "Project-Id-Version: Two-Factor Extended 1.0.0\n"
"Report-Msgid-Bugs-To: https://git.robotstxt.es/ROBOTSTXT/two-factor-extended/issues\n" "Report-Msgid-Bugs-To: https://git.robotstxt.es/ROBOTSTXT/two-factor-extended/issues\n"
"Last-Translator: javiercasares, ROBOTSTXT\n" "Last-Translator: javiercasares, ROBOTSTXT\n"
"Language-Team: Spanish <es@li.org>\n" "Language-Team: Spanish <es@li.org>\n"
@ -28,8 +28,8 @@ msgstr ""
#: includes/class-settings.php:84 #: includes/class-settings.php:84
#: includes/class-settings.php:109 #: includes/class-settings.php:109
#: includes/class-settings.php:110 #: includes/class-settings.php:110
msgid "Two Factor Extended" msgid "Two-Factor Extended"
msgstr "Two Factor Extended" msgstr "Two-Factor Extended"
#. Plugin URI of the plugin #. Plugin URI of the plugin
#: two-factor-extended.php #: two-factor-extended.php
@ -77,8 +77,8 @@ msgstr[1] "Período de gracia restablecido para %d usuarios."
#: includes/class-compliance-report.php:274 #: includes/class-compliance-report.php:274
#: includes/class-settings.php:1392 #: includes/class-settings.php:1392
msgid "Two Factor Extended - Compliance Report" msgid "Two-Factor Extended - Compliance Report"
msgstr "Two Factor Extended - Informe de cumplimiento" msgstr "Two-Factor Extended - Informe de cumplimiento"
#. translators: 1: Site name #. translators: 1: Site name
#: includes/class-compliance-report.php:278 #: includes/class-compliance-report.php:278
@ -154,8 +154,8 @@ msgstr "Tu cuenta requiere que se configuren los siguientes métodos 2FA: %s. Po
#: includes/class-enforcement.php:292 #: includes/class-enforcement.php:292
#: includes/class-enforcement.php:320 #: includes/class-enforcement.php:320
#: includes/class-provider-filter.php:218 #: includes/class-provider-filter.php:218
msgid "Two Factor Extended:" msgid "Two-Factor Extended:"
msgstr "Two Factor Extended:" msgstr "Two-Factor Extended:"
#: includes/class-enforcement.php:297 #: includes/class-enforcement.php:297
#, php-format #, php-format
@ -645,8 +645,8 @@ msgid "All users are compliant!"
msgstr "¡Todos los usuarios están cumpliendo!" msgstr "¡Todos los usuarios están cumpliendo!"
#: includes/class-settings.php:1291 #: includes/class-settings.php:1291
msgid "Two Factor Extended - Audit Log" msgid "Two-Factor Extended - Audit Log"
msgstr "Two Factor Extended - Registro de auditoría" msgstr "Two-Factor Extended - Registro de auditoría"
#: includes/class-settings.php:1339 #: includes/class-settings.php:1339
msgid "Showing 50 most recent logs. Export to CSV for full history." msgid "Showing 50 most recent logs. Export to CSV for full history."

View file

@ -2,7 +2,7 @@
# This file is distributed under the GPL-3.0-or-later. # This file is distributed under the GPL-3.0-or-later.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Two Factor Extended 1.0.0\n" "Project-Id-Version: Two-Factor Extended 1.0.0\n"
"Report-Msgid-Bugs-To: https://git.robotstxt.es/ROBOTSTXT/two-factor-extended/issues\n" "Report-Msgid-Bugs-To: https://git.robotstxt.es/ROBOTSTXT/two-factor-extended/issues\n"
"Last-Translator: javiercasares, ROBOTSTXT\n" "Last-Translator: javiercasares, ROBOTSTXT\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -25,7 +25,7 @@ msgstr ""
#: includes/class-settings.php:84 #: includes/class-settings.php:84
#: includes/class-settings.php:109 #: includes/class-settings.php:109
#: includes/class-settings.php:110 #: includes/class-settings.php:110
msgid "Two Factor Extended" msgid "Two-Factor Extended"
msgstr "" msgstr ""
#. Plugin URI of the plugin #. Plugin URI of the plugin
@ -74,7 +74,7 @@ msgstr[1] ""
#: includes/class-compliance-report.php:274 #: includes/class-compliance-report.php:274
#: includes/class-settings.php:1420 #: includes/class-settings.php:1420
msgid "Two Factor Extended - Compliance Report" msgid "Two-Factor Extended - Compliance Report"
msgstr "" msgstr ""
#. translators: 1: Site name #. translators: 1: Site name
@ -156,7 +156,7 @@ msgstr ""
#: includes/class-enforcement.php:292 #: includes/class-enforcement.php:292
#: includes/class-enforcement.php:320 #: includes/class-enforcement.php:320
#: includes/class-provider-filter.php:220 #: includes/class-provider-filter.php:220
msgid "Two Factor Extended:" msgid "Two-Factor Extended:"
msgstr "" msgstr ""
#: includes/class-enforcement.php:297 #: includes/class-enforcement.php:297
@ -650,7 +650,7 @@ msgid "All users are compliant!"
msgstr "" msgstr ""
#: includes/class-settings.php:1309 #: includes/class-settings.php:1309
msgid "Two Factor Extended - Audit Log" msgid "Two-Factor Extended - Audit Log"
msgstr "" msgstr ""
#: includes/class-settings.php:1367 #: includes/class-settings.php:1367

View file

@ -1,9 +1,9 @@
=== Two Factor Extended === === Two-Factor Extended ===
Contributors: javiercasares, robotstxt Contributors: javiercasares, robotstxt
Tags: two-factor, 2fa, authentication, security Tags: two-factor, 2fa, authentication, security
Requires at least: 6.7 Requires at least: 6.7
Tested up to: 6.9 Tested up to: 6.9
Stable tag: 1.0.1 Stable tag: 1.0.2
Requires PHP: 8.2 Requires PHP: 8.2
Version: 1.0.1 Version: 1.0.1
License: GPL-3.0-or-later License: GPL-3.0-or-later
@ -13,7 +13,7 @@ Extends the WordPress Two Factor plugin with advanced role-based controls and en
== Description == == Description ==
Two Factor Extended is a comprehensive extension for the WordPress Two Factor plugin that provides administrators with enterprise-level controls over two-factor authentication across their site. Two-Factor Extended is a comprehensive extension for the WordPress Two Factor plugin that provides administrators with enterprise-level controls over two-factor authentication across their site.
**Core Features:** **Core Features:**
@ -43,7 +43,7 @@ This plugin requires the [Two Factor](https://wordpress.org/plugins/two-factor/)
= Automatic Installation = = Automatic Installation =
1. Visit the Plugins section in your WordPress admin 1. Visit the Plugins section in your WordPress admin
2. Search for "Two Factor Extended" 2. Search for "Two-Factor Extended"
3. Click "Install Now" and then "Activate" 3. Click "Install Now" and then "Activate"
**Important:** Make sure the [Two Factor](https://wordpress.org/plugins/two-factor/) plugin is installed and activated first. **Important:** Make sure the [Two Factor](https://wordpress.org/plugins/two-factor/) plugin is installed and activated first.
@ -56,7 +56,7 @@ This plugin requires the [Two Factor](https://wordpress.org/plugins/two-factor/)
= After Installation = = After Installation =
1. Go to Settings → Two Factor Extended 1. Go to Settings → Two-Factor Extended
2. Configure your role-based 2FA requirements 2. Configure your role-based 2FA requirements
3. Set which 2FA methods are available to different user roles 3. Set which 2FA methods are available to different user roles
@ -64,15 +64,15 @@ This plugin requires the [Two Factor](https://wordpress.org/plugins/two-factor/)
= Does this plugin replace the Two Factor plugin? = = Does this plugin replace the Two Factor plugin? =
No, Two Factor Extended is an extension that works alongside the Two Factor plugin. Both plugins must be installed and activated. No, Two-Factor Extended is an extension that works alongside the Two Factor plugin. Both plugins must be installed and activated.
= Is this compatible with WordPress Multisite? = = Is this compatible with WordPress Multisite? =
Yes! Two Factor Extended fully supports WordPress Multisite with network-wide settings and site-level overrides. Yes! Two-Factor Extended fully supports WordPress Multisite with network-wide settings and site-level overrides.
= Which PHP versions are supported? = = Which PHP versions are supported? =
Two Factor Extended requires PHP 8.2 or higher. Two-Factor Extended requires PHP 8.2 or higher.
= Can users bypass the 2FA requirements? = = Can users bypass the 2FA requirements? =
@ -87,7 +87,7 @@ No. When a 2FA method is marked as required for a user's role, they cannot disab
== Security == == Security ==
Two Factor Extended follows WordPress security best practices: Two-Factor Extended follows WordPress security best practices:
= Security Features = = Security Features =
@ -123,7 +123,7 @@ _Release date: 2026-02-17_
**Initial Production Release** **Initial Production Release**
This is the first comprehensive release of Two Factor Extended, implementing enterprise-level two-factor authentication management for WordPress. This is the first comprehensive release of Two-Factor Extended, implementing enterprise-level two-factor authentication management for WordPress.
**Core Features** **Core Features**

View file

@ -1,9 +1,9 @@
<?php <?php
/** /**
* Plugin Name: Two Factor Extended * Plugin Name: Two-Factor Extended
* Plugin URI: https://git.robotstxt.es/ROBOTSTXT/two-factor-extended * Plugin URI: https://git.robotstxt.es/ROBOTSTXT/two-factor-extended
* Description: Extends the WordPress Two Factor plugin with advanced role-based controls, forced 2FA methods, and enhanced administrative features for single-site and Multisite installations. * Description: Extends the WordPress Two Factor plugin with advanced role-based controls, forced 2FA methods, and enhanced administrative features for single-site and Multisite installations.
* Version: 1.0.1 * Version: 1.0.2
* Requires at least: 6.7 * Requires at least: 6.7
* Requires PHP: 8.2 * Requires PHP: 8.2
* Requires Plugins: two-factor * Requires Plugins: two-factor
@ -18,7 +18,7 @@
* Primary Branch: main * Primary Branch: main
* *
* @package TwoFactorExtended * @package TwoFactorExtended
* @version 1.0.1 * @version 1.0.2
*/ */
// Prevent direct access. // Prevent direct access.
@ -27,7 +27,7 @@ if ( ! defined( 'ABSPATH' ) ) {
} }
// Define plugin constants. // Define plugin constants.
define( 'TWO_FACTOR_EXTENDED_VERSION', '1.0.1' ); define( 'TWO_FACTOR_EXTENDED_VERSION', '1.0.2' );
define( 'TWO_FACTOR_EXTENDED_PLUGIN_FILE', __FILE__ ); define( 'TWO_FACTOR_EXTENDED_PLUGIN_FILE', __FILE__ );
define( 'TWO_FACTOR_EXTENDED_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); define( 'TWO_FACTOR_EXTENDED_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
define( 'TWO_FACTOR_EXTENDED_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); define( 'TWO_FACTOR_EXTENDED_PLUGIN_URL', plugin_dir_url( __FILE__ ) );

View file

@ -14,7 +14,7 @@ if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
} }
/** /**
* Uninstall Two Factor Extended plugin. * Uninstall Two-Factor Extended plugin.
* *
* Removes all plugin data based on user preferences. * Removes all plugin data based on user preferences.
* *

View file

@ -1,8 +1,8 @@
{ {
"name": "Two Factor Extended", "name": "Two-Factor Extended",
"slug": "two-factor-extended", "slug": "two-factor-extended",
"version": "1.0.1", "version": "1.0.2",
"download_url": "https://git.robotstxt.es/ROBOTSTXT/two-factor-extended/releases/download/1.0.1/two-factor-extended-1.0.1.zip", "download_url": "https://git.robotstxt.es/ROBOTSTXT/two-factor-extended/releases/download/1.0.2/two-factor-extended-1.0.2.zip",
"requires": "6.7", "requires": "6.7",
"requires_php": "8.2", "requires_php": "8.2",
"tested": "6.9", "tested": "6.9",
@ -11,12 +11,12 @@
"author_profile": "https://www.robotstxt.es/", "author_profile": "https://www.robotstxt.es/",
"homepage": "https://git.robotstxt.es/ROBOTSTXT/two-factor-extended", "homepage": "https://git.robotstxt.es/ROBOTSTXT/two-factor-extended",
"description": "Extends the WordPress Two Factor plugin with advanced role-based controls, forced 2FA methods, and enhanced administrative features for single-site and Multisite installations.", "description": "Extends the WordPress Two Factor plugin with advanced role-based controls, forced 2FA methods, and enhanced administrative features for single-site and Multisite installations.",
"changelog": "<h3>1.0.1 - 2026-03-28</h3><ul><li><strong>Compatibility:</strong> Two Factor 0.16 settings panel — settings menu now always appears after Two Factor in admin</li><li><strong>Code Quality:</strong> PHPStan level 9 clean, PHPCS WordPress Coding Standards clean</li><li><strong>Tests:</strong> PHPUnit 9.6 compatible, 28 unit tests passing (PHP 8.5, WordPress 6.7)</li></ul><h3>1.0.0 - 2026-02-17</h3><ul><li><strong>Initial Production Release:</strong> Complete enterprise-level two-factor authentication management for WordPress</li><li><strong>Core Features:</strong> Role-based 2FA requirements, provider visibility control, grace period enforcement, WordPress Multisite support</li><li><strong>Advanced Features:</strong> Audit logging, compliance reporting, bulk operations, WP-CLI integration, REST API, import/export settings</li><li><strong>Security:</strong> Grade A security audit, comprehensive input validation, output escaping, CSRF protection, XSS prevention</li><li><strong>Quality:</strong> 28 unit tests, WCAG 2.1 Level AA compliant, performance optimized, WordPress Coding Standards compliant</li><li><strong>Compatibility:</strong> WordPress 6.7-6.9, PHP 8.2-8.5, Two Factor 0.15.0 tested</li></ul>", "changelog": "<h3>1.0.2 - 2026-03-28</h3><ul><li><strong>Name:</strong> Renamed to \"Two-Factor Extended\" (hyphen added for consistency)</li><li><strong>Compatibility:</strong> Two-Factor 0.16 enforcement now respects globally-disabled providers</li><li><strong>i18n:</strong> Added Catalan (ca) translation (100% coverage); updated es_ES</li></ul><h3>1.0.1 - 2026-03-28</h3><ul><li><strong>Compatibility:</strong> Two Factor 0.16 settings panel — settings menu now always appears after Two Factor in admin</li><li><strong>Code Quality:</strong> PHPStan level 9 clean, PHPCS WordPress Coding Standards clean</li><li><strong>Tests:</strong> PHPUnit 9.6 compatible, 28 unit tests passing (PHP 8.5, WordPress 6.7)</li></ul><h3>1.0.0 - 2026-02-17</h3><ul><li><strong>Initial Production Release:</strong> Complete enterprise-level two-factor authentication management for WordPress</li><li><strong>Core Features:</strong> Role-based 2FA requirements, provider visibility control, grace period enforcement, WordPress Multisite support</li><li><strong>Advanced Features:</strong> Audit logging, compliance reporting, bulk operations, WP-CLI integration, REST API, import/export settings</li><li><strong>Security:</strong> Grade A security audit, comprehensive input validation, output escaping, CSRF protection, XSS prevention</li><li><strong>Quality:</strong> 28 unit tests, WCAG 2.1 Level AA compliant, performance optimized, WordPress Coding Standards compliant</li><li><strong>Compatibility:</strong> WordPress 6.7-6.9, PHP 8.2-8.5, Two Factor 0.15.0 tested</li></ul>",
"sections": { "sections": {
"description": "Two Factor Extended is a comprehensive extension for the WordPress Two Factor plugin that provides administrators with enterprise-level controls over two-factor authentication across their site.<br><br><strong>Core Features:</strong><ul><li>Role-Based 2FA Requirements</li><li>Provider Visibility Control</li><li>Grace Period Enforcement (0-365 days)</li><li>WordPress Multisite Support</li><li>Compliance Reporting</li><li>Audit Logging</li><li>Bulk Operations</li><li>WP-CLI Commands</li><li>REST API Endpoints</li><li>Import/Export Settings</li></ul><strong>Security:</strong> Grade A security audit, comprehensive security hardening, CSRF protection, XSS prevention, SQL injection protection.<br><br><strong>Quality Assurance:</strong> 28 unit tests, WCAG 2.1 Level AA compliant, WordPress Coding Standards compliant, PHP 8.2-8.5 compatible.", "description": "Two-Factor Extended is a comprehensive extension for the WordPress Two Factor plugin that provides administrators with enterprise-level controls over two-factor authentication across their site.<br><br><strong>Core Features:</strong><ul><li>Role-Based 2FA Requirements</li><li>Provider Visibility Control</li><li>Grace Period Enforcement (0-365 days)</li><li>WordPress Multisite Support</li><li>Compliance Reporting</li><li>Audit Logging</li><li>Bulk Operations</li><li>WP-CLI Commands</li><li>REST API Endpoints</li><li>Import/Export Settings</li></ul><strong>Security:</strong> Grade A security audit, comprehensive security hardening, CSRF protection, XSS prevention, SQL injection protection.<br><br><strong>Quality Assurance:</strong> 28 unit tests, WCAG 2.1 Level AA compliant, WordPress Coding Standards compliant, PHP 8.2-8.5 compatible.",
"changelog": "<h3>1.0.1 - 2026-03-28</h3><ul><li><strong>Compatibility:</strong> Two Factor 0.16 settings panel — settings menu now always appears after Two Factor in admin</li><li><strong>Code Quality:</strong> PHPStan level 9 clean, PHPCS WordPress Coding Standards clean</li><li><strong>Tests:</strong> PHPUnit 9.6 compatible, 28 unit tests passing (PHP 8.5, WordPress 6.7)</li></ul><h3>1.0.0 - 2026-02-17</h3><ul><li><strong>Initial Production Release:</strong> Complete enterprise-level two-factor authentication management for WordPress</li><li><strong>Core Features:</strong> Role-based 2FA requirements, provider visibility control, grace period enforcement, WordPress Multisite support</li><li><strong>Advanced Features:</strong> Audit logging, compliance reporting, bulk operations, WP-CLI integration, REST API, import/export settings</li><li><strong>Security:</strong> Grade A security audit, comprehensive input validation, output escaping, CSRF protection, XSS prevention</li><li><strong>Quality:</strong> 28 unit tests, WCAG 2.1 Level AA compliant, performance optimized, WordPress Coding Standards compliant</li><li><strong>Compatibility:</strong> WordPress 6.7-6.9, PHP 8.2-8.5, Two Factor 0.15.0 tested</li></ul>", "changelog": "<h3>1.0.2 - 2026-03-28</h3><ul><li><strong>Name:</strong> Renamed to \"Two-Factor Extended\" (hyphen added for consistency)</li><li><strong>Compatibility:</strong> Two-Factor 0.16 enforcement now respects globally-disabled providers</li><li><strong>i18n:</strong> Added Catalan (ca) translation (100% coverage); updated es_ES</li></ul><h3>1.0.1 - 2026-03-28</h3><ul><li><strong>Compatibility:</strong> Two Factor 0.16 settings panel — settings menu now always appears after Two Factor in admin</li><li><strong>Code Quality:</strong> PHPStan level 9 clean, PHPCS WordPress Coding Standards clean</li><li><strong>Tests:</strong> PHPUnit 9.6 compatible, 28 unit tests passing (PHP 8.5, WordPress 6.7)</li></ul><h3>1.0.0 - 2026-02-17</h3><ul><li><strong>Initial Production Release:</strong> Complete enterprise-level two-factor authentication management for WordPress</li><li><strong>Core Features:</strong> Role-based 2FA requirements, provider visibility control, grace period enforcement, WordPress Multisite support</li><li><strong>Advanced Features:</strong> Audit logging, compliance reporting, bulk operations, WP-CLI integration, REST API, import/export settings</li><li><strong>Security:</strong> Grade A security audit, comprehensive input validation, output escaping, CSRF protection, XSS prevention</li><li><strong>Quality:</strong> 28 unit tests, WCAG 2.1 Level AA compliant, performance optimized, WordPress Coding Standards compliant</li><li><strong>Compatibility:</strong> WordPress 6.7-6.9, PHP 8.2-8.5, Two Factor 0.15.0 tested</li></ul>",
"installation": "<ol><li>Install the Two Factor plugin (required dependency)</li><li>Upload and activate Two Factor Extended plugin</li><li>Go to Settings → Two Factor Extended</li><li>Configure grace period (7-14 days recommended)</li><li>Set role-based 2FA requirements</li><li>Configure provider visibility per role</li><li>Monitor compliance via Compliance tab</li><li>Review audit logs via Audit Log tab</li></ol>", "installation": "<ol><li>Install the Two Factor plugin (required dependency)</li><li>Upload and activate Two-Factor Extended plugin</li><li>Go to Settings → Two-Factor Extended</li><li>Configure grace period (7-14 days recommended)</li><li>Set role-based 2FA requirements</li><li>Configure provider visibility per role</li><li>Monitor compliance via Compliance tab</li><li>Review audit logs via Audit Log tab</li></ol>",
"faq": "<h4>Does this plugin replace the Two Factor plugin?</h4><p>No, Two Factor Extended is an extension that works alongside the Two Factor plugin. Both plugins must be installed and activated.</p><h4>Is this compatible with WordPress Multisite?</h4><p>Yes! Two Factor Extended fully supports WordPress Multisite with network-wide settings and site-level overrides.</p><h4>Which PHP versions are supported?</h4><p>Two Factor Extended requires PHP 8.2 or higher.</p><h4>Can users bypass the 2FA requirements?</h4><p>No. When a 2FA method is marked as required for a user's role, they cannot disable or remove it.</p>" "faq": "<h4>Does this plugin replace the Two Factor plugin?</h4><p>No, Two-Factor Extended is an extension that works alongside the Two Factor plugin. Both plugins must be installed and activated.</p><h4>Is this compatible with WordPress Multisite?</h4><p>Yes! Two-Factor Extended fully supports WordPress Multisite with network-wide settings and site-level overrides.</p><h4>Which PHP versions are supported?</h4><p>Two-Factor Extended requires PHP 8.2 or higher.</p><h4>Can users bypass the 2FA requirements?</h4><p>No. When a 2FA method is marked as required for a user's role, they cannot disable or remove it.</p>"
}, },
"banners": { "banners": {
"low": "", "low": "",
@ -27,4 +27,4 @@
"2x": "https://git.robotstxt.es/ROBOTSTXT/two-factor-extended/raw/branch/main/assets/icon-256x256.png", "2x": "https://git.robotstxt.es/ROBOTSTXT/two-factor-extended/raw/branch/main/assets/icon-256x256.png",
"svg": "https://git.robotstxt.es/ROBOTSTXT/two-factor-extended/raw/branch/main/assets/icon.svg" "svg": "https://git.robotstxt.es/ROBOTSTXT/two-factor-extended/raw/branch/main/assets/icon.svg"
} }
} }