diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo
index 5362d0f..9de482f 100644
Binary files a/locale/de/LC_MESSAGES/django.mo and b/locale/de/LC_MESSAGES/django.mo differ
diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po
index 3a7ef16..fbbbf6e 100644
--- a/locale/de/LC_MESSAGES/django.po
+++ b/locale/de/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-03-13 20:41-0300\n"
+"POT-Creation-Date: 2026-03-14 08:47-0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -68,8 +68,8 @@ msgstr ""
#: app_gateway/forms.py:129 app_gateway/forms.py:147 app_gateway/forms.py:195
#: app_gateway/forms.py:236 cluster/forms.py:67 cluster/forms.py:124
#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:41
-#: gatekeeper/forms.py:75 gatekeeper/forms.py:137 gatekeeper/forms.py:224
-#: gatekeeper/forms.py:254 gatekeeper/forms.py:285
+#: gatekeeper/forms.py:75 gatekeeper/forms.py:139 gatekeeper/forms.py:226
+#: gatekeeper/forms.py:256 gatekeeper/forms.py:287
#: routing_templates/forms.py:71 scheduler/forms.py:102
#: templates/firewall/manage_firewall_rule.html:379
#: templates/firewall/manage_firewall_settings.html:59
@@ -134,9 +134,9 @@ msgstr "Aktiviert"
#: app_gateway/views.py:399 cluster/views.py:18 cluster/views.py:45
#: cluster/views.py:114 gatekeeper/views.py:23 gatekeeper/views.py:48
#: gatekeeper/views.py:78 gatekeeper/views.py:101 gatekeeper/views.py:131
-#: gatekeeper/views.py:154 gatekeeper/views.py:198 gatekeeper/views.py:257
-#: gatekeeper/views.py:287 gatekeeper/views.py:310 gatekeeper/views.py:340
-#: gatekeeper/views.py:363 gatekeeper/views.py:412
+#: gatekeeper/views.py:154 gatekeeper/views.py:202 gatekeeper/views.py:261
+#: gatekeeper/views.py:291 gatekeeper/views.py:314 gatekeeper/views.py:344
+#: gatekeeper/views.py:367 gatekeeper/views.py:416
#: templates/access_denied.html:9
msgid "Access Denied"
msgstr "Zugriff verweigert"
@@ -219,8 +219,8 @@ msgstr "Upstream"
#: app_gateway/forms.py:41 app_gateway/forms.py:86 app_gateway/forms.py:130
#: app_gateway/forms.py:148 app_gateway/forms.py:196 app_gateway/forms.py:237
-#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:138
-#: gatekeeper/forms.py:225 gatekeeper/forms.py:255 gatekeeper/forms.py:286
+#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:140
+#: gatekeeper/forms.py:227 gatekeeper/forms.py:257 gatekeeper/forms.py:288
#: scheduler/forms.py:103
#: templates/app_gateway/access_policy_type_select.html:50
#: templates/generic_delete_confirmation.html:19
@@ -300,7 +300,7 @@ msgstr "Öffentlich"
msgid "Protected"
msgstr "Geschützt"
-#: app_gateway/models.py:45 gatekeeper/models.py:108
+#: app_gateway/models.py:45 gatekeeper/models.py:109
#: templates/app_gateway/access_policy_type_select.html:41
#: templates/gatekeeper/gatekeeper_list.html:272
msgid "Deny"
@@ -594,7 +594,7 @@ msgstr ""
msgid "IP Lock"
msgstr "IP-Sperre"
-#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:196
+#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:198
#: templates/cluster/workers_list.html:10
#: templates/dns/static_host_list.html:18
#: templates/firewall/manage_redirect_rule.html:43
@@ -877,7 +877,7 @@ msgstr "Statischer DNS"
msgid "Invalid hostname."
msgstr "Ungültiger Hostname."
-#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:199
+#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:201
#: templates/api_v2/api_documentation.html:51
#: templates/dns/static_host_list.html:69
#: templates/firewall/manage_redirect_rule.html:18
@@ -1219,7 +1219,7 @@ msgstr "Firewall‑Einstellungen erfolgreich gespeichert"
msgid "Username"
msgstr "Benutzername"
-#: gatekeeper/forms.py:18 gatekeeper/forms.py:269
+#: gatekeeper/forms.py:18 gatekeeper/forms.py:271
#: templates/gatekeeper/gatekeeper_list.html:62
#: templates/gatekeeper/gatekeeper_list.html:204
#: templates/wireguard/peer_list/peer_preview_modal.html:103
@@ -1265,85 +1265,89 @@ msgid "Global TOTP Secret"
msgstr "Globales TOTP-Geheimnis"
#: gatekeeper/forms.py:102
+msgid "Global TOTP Before Authentication"
+msgstr "Globales TOTP vor der Authentifizierung"
+
+#: gatekeeper/forms.py:103
msgid "OIDC Provider URL"
msgstr "OIDC-Anbieter-URL"
-#: gatekeeper/forms.py:103
+#: gatekeeper/forms.py:104
msgid "OIDC Client ID"
msgstr "OIDC-Client-ID"
-#: gatekeeper/forms.py:104
+#: gatekeeper/forms.py:105
msgid "OIDC Client Secret"
msgstr "OIDC-Client-Geheimnis"
-#: gatekeeper/forms.py:155
+#: gatekeeper/forms.py:157
msgid "TOTP secret must be empty for Local Password authentication."
msgstr ""
"Das TOTP-Geheimnis muss für die Authentifizierung mit lokalem Passwort leer "
"sein."
-#: gatekeeper/forms.py:157
+#: gatekeeper/forms.py:159
msgid "TOTP validation PIN must be empty for Local Password authentication."
msgstr ""
"Die TOTP-Validierungs-PIN muss für die Authentifizierung mit lokalem "
"Passwort leer sein."
-#: gatekeeper/forms.py:159
+#: gatekeeper/forms.py:161
msgid "OIDC fields must be empty for Local Password authentication."
msgstr ""
"OIDC-Felder müssen für die Authentifizierung mit lokalem Passwort leer sein."
-#: gatekeeper/forms.py:165
+#: gatekeeper/forms.py:167
msgid "Only one Local Password authentication method can be configured."
msgstr ""
"Es kann nur eine Authentifizierungsmethode mit lokalem Passwort konfiguriert "
"werden."
-#: gatekeeper/forms.py:168
+#: gatekeeper/forms.py:170
msgid "OIDC fields must be empty for TOTP authentication."
msgstr "OIDC-Felder müssen für die TOTP-Authentifizierung leer sein."
-#: gatekeeper/forms.py:170
+#: gatekeeper/forms.py:172
msgid "TOTP secret is required for TOTP authentication."
msgstr "Das TOTP-Geheimnis ist für die TOTP-Authentifizierung erforderlich."
-#: gatekeeper/forms.py:174
+#: gatekeeper/forms.py:176
msgid "Please provide a PIN to validate the TOTP secret."
msgstr "Bitte geben Sie eine PIN an, um das TOTP-Geheimnis zu validieren."
-#: gatekeeper/forms.py:179
+#: gatekeeper/forms.py:181
msgid "Invalid TOTP PIN."
msgstr "Ungültige TOTP-PIN."
-#: gatekeeper/forms.py:181
+#: gatekeeper/forms.py:183
msgid "Invalid TOTP secret format. Must be a valid Base32 string."
msgstr ""
"Ungültiges TOTP-Geheimnisformat. Muss eine gültige Base32-Zeichenfolge sein."
-#: gatekeeper/forms.py:184
+#: gatekeeper/forms.py:186
msgid "TOTP secret must be empty for OIDC authentication."
msgstr "Das TOTP-Geheimnis muss für die OIDC-Authentifizierung leer sein."
-#: gatekeeper/forms.py:186
+#: gatekeeper/forms.py:188
msgid "TOTP validation PIN must be empty for OIDC authentication."
msgstr ""
"Die TOTP-Validierungs-PIN muss für die OIDC-Authentifizierung leer sein."
-#: gatekeeper/forms.py:195 gatekeeper/forms.py:237 gatekeeper/forms.py:268
+#: gatekeeper/forms.py:197 gatekeeper/forms.py:239 gatekeeper/forms.py:270
msgid "Authentication Method"
msgstr "Authentifizierungsmethode"
-#: gatekeeper/forms.py:197 templates/gatekeeper/gatekeeper_list.html:257
+#: gatekeeper/forms.py:199 templates/gatekeeper/gatekeeper_list.html:257
msgid "Prefix Length"
msgstr "Präfixlänge"
-#: gatekeeper/forms.py:198 templates/firewall/firewall_rule_list.html:47
+#: gatekeeper/forms.py:200 templates/firewall/firewall_rule_list.html:47
#: templates/firewall/manage_firewall_rule.html:360
#: templates/gatekeeper/gatekeeper_list.html:258
msgid "Action"
msgstr "Aktion"
-#: gatekeeper/forms.py:238 templates/gatekeeper/gatekeeper_list.html:221
+#: gatekeeper/forms.py:240 templates/gatekeeper/gatekeeper_list.html:221
msgid "Domain"
msgstr "Domäne"
@@ -1367,16 +1371,16 @@ msgstr "IP-Adressliste"
msgid "Shared/global TOTP secret key"
msgstr "Gemeinsamer/globaler TOTP-Geheimschlüssel"
-#: gatekeeper/models.py:68
+#: gatekeeper/models.py:69
msgid "Password for local authentication (leave blank if not using)"
msgstr ""
"Passwort für die lokale Authentifizierung (leer lassen, wenn nicht verwendet)"
-#: gatekeeper/models.py:69
+#: gatekeeper/models.py:70
msgid "Per-user TOTP secret key"
msgstr "Benutzerspezifischer TOTP-Geheimschlüssel"
-#: gatekeeper/models.py:108 templates/gatekeeper/gatekeeper_list.html:270
+#: gatekeeper/models.py:109 templates/gatekeeper/gatekeeper_list.html:270
msgid "Allow"
msgstr "Zulassen"
@@ -1446,121 +1450,130 @@ msgstr "Authentifizierungsmethode erfolgreich gespeichert."
#: gatekeeper/views.py:175
msgid ""
"\n"
-" Authentication Types
\n"
+" Authentication Types
\n"
" Select how users will authenticate through this method.
\n"
-" \n"
-" - Local Password: Users will authenticate "
-"using a standard username and password stored locally. Only one of this type "
-"can be created.
\n"
-" - TOTP (Time-Based One-Time Password): Users "
-"will need to enter a rotating token from an authenticator app. Requires "
-"setting a Global TOTP Secret.
\n"
-" - OIDC (OpenID Connect): Users will "
-"authenticate via an external identity provider (like Keycloak, Google, or "
-"Authelia). Requires Provider URL, Client ID, and Client Secret.
\n"
-"
\n"
+" \n"
+" Local Password
\n"
+" Users will authenticate using a standard username and password "
+"stored locally. Only one of this type can be created.
\n"
+" \n"
+" OIDC (OpenID Connect)
\n"
+" Users will authenticate via an external identity provider (like "
+"Keycloak, Google, or Authelia). Requires Provider URL, Client ID, and Client "
+"Secret.
\n"
+" \n"
+" TOTP (Time-Based One-Time Password)
\n"
+" Users will need to enter a rotating token from an authenticator "
+"app. Requires setting a Global TOTP Secret.
If Global TOTP "
+"Before Authentication is enabled, the PIN is required before the "
+"username and password to help combat bruteforce attacks.
\n"
" "
msgstr ""
"\n"
-" Authentifizierungstypen
\n"
+" Authentifizierungstypen
\n"
" Wählen Sie aus, wie sich Benutzer über diese Methode "
"authentifizieren.
\n"
-" \n"
-" - Lokales Passwort: Benutzer authentifizieren "
-"sich mit einem lokal gespeicherten Standard-Benutzernamen und Passwort. Es "
-"kann nur einer dieser Typen erstellt werden.
\n"
-" - TOTP (Time-Based One-Time Password): "
-"Benutzer müssen ein rotierendes Token aus einer Authenticator-App eingeben. "
-"Erfordert die Festlegung eines globalen TOTP-Geheimnisses.
\n"
-" - OIDC (OpenID Connect): Benutzer "
-"authentifizieren sich über einen externen Identitätsanbieter (wie Keycloak, "
-"Google oder Authelia). Erfordert Anbieter-URL, Client-ID und Client-"
-"Geheimnis.
\n"
-"
\n"
+" \n"
+" Lokales Passwort
\n"
+" Benutzer authentifizieren sich mit einem lokal gespeicherten "
+"Standard-Benutzernamen und Passwort. Es kann nur einer dieser Typen "
+"erstellt werden.
\n"
+" \n"
+" OIDC (OpenID Connect)
\n"
+" Benutzer authentifizieren sich über einen externen "
+"Identitätsanbieter (wie Keycloak, Google oder Authelia). Erfordert Anbieter-"
+"URL, Client-ID und Client-Geheimnis.
\n"
+" \n"
+" TOTP (Zeitbasiertes Einmalpasswort)
\n"
+" Benutzer müssen ein rotierendes Token aus einer Authenticator-App "
+"eingeben. Erfordert die Festlegung eines globalen TOTP-Geheimnisses.
Wenn "
+"Globales TOTP vor der Authentifizierung aktiviert ist, wird "
+"die PIN vor dem Benutzernamen und dem Passwort benötigt, um Brute-Force-"
+"Angriffe zu bekämpfen.
\n"
" "
-#: gatekeeper/views.py:206
+#: gatekeeper/views.py:210
msgid "Authentication Method deleted successfully."
msgstr "Authentifizierungsmethode erfolgreich gelöscht."
-#: gatekeeper/views.py:211
+#: gatekeeper/views.py:215
msgid "Delete Authentication Method"
msgstr "Authentifizierungsmethode löschen"
-#: gatekeeper/views.py:213
+#: gatekeeper/views.py:217
#, python-format
msgid "Are you sure you want to delete the authentication method \"%(name)s\"?"
msgstr ""
"Sind Sie sicher, dass Sie die Authentifizierungsmethode \"%(name)s\" löschen "
"möchten?"
-#: gatekeeper/views.py:263
+#: gatekeeper/views.py:267
msgid "Edit Allowed Domain"
msgstr "Zulässige Domäne bearbeiten"
-#: gatekeeper/views.py:266 templates/gatekeeper/gatekeeper_list.html:186
+#: gatekeeper/views.py:270 templates/gatekeeper/gatekeeper_list.html:186
msgid "Add Allowed Domain"
msgstr "Zulässige Domäne hinzufügen"
-#: gatekeeper/views.py:273
+#: gatekeeper/views.py:277
msgid "Allowed Domain saved successfully."
msgstr "Zulässige Domäne erfolgreich gespeichert."
-#: gatekeeper/views.py:295
+#: gatekeeper/views.py:299
msgid "Allowed Domain deleted successfully."
msgstr "Zulässige Domäne erfolgreich gelöscht."
-#: gatekeeper/views.py:300
+#: gatekeeper/views.py:304
msgid "Delete Allowed Domain"
msgstr "Zulässige Domäne löschen"
-#: gatekeeper/views.py:302
+#: gatekeeper/views.py:306
#, python-format
msgid "Are you sure you want to delete the allowed domain \"%(domain)s\"?"
msgstr ""
"Sind Sie sicher, dass Sie die zulässige Domäne \"%(domain)s\" löschen "
"möchten?"
-#: gatekeeper/views.py:316
+#: gatekeeper/views.py:320
msgid "Edit Allowed Email"
msgstr "Zulässige E-Mail bearbeiten"
-#: gatekeeper/views.py:319 templates/gatekeeper/gatekeeper_list.html:183
+#: gatekeeper/views.py:323 templates/gatekeeper/gatekeeper_list.html:183
msgid "Add Allowed Email"
msgstr "Zulässige E-Mail hinzufügen"
-#: gatekeeper/views.py:326
+#: gatekeeper/views.py:330
msgid "Allowed Email saved successfully."
msgstr "Zulässige E-Mail erfolgreich gespeichert."
-#: gatekeeper/views.py:348
+#: gatekeeper/views.py:352
msgid "Allowed Email deleted successfully."
msgstr "Zulässige E-Mail erfolgreich gelöscht."
-#: gatekeeper/views.py:353
+#: gatekeeper/views.py:357
msgid "Delete Allowed Email"
msgstr "Zulässige E-Mail löschen"
-#: gatekeeper/views.py:355
+#: gatekeeper/views.py:359
#, python-format
msgid "Are you sure you want to delete the allowed email \"%(email)s\"?"
msgstr ""
"Sind Sie sicher, dass Sie die zulässige E-Mail \"%(email)s\" löschen möchten?"
-#: gatekeeper/views.py:369
+#: gatekeeper/views.py:373
msgid "Edit IP Address"
msgstr "IP-Adresse bearbeiten"
-#: gatekeeper/views.py:372 templates/gatekeeper/gatekeeper_list.html:247
+#: gatekeeper/views.py:376 templates/gatekeeper/gatekeeper_list.html:247
#: templates/wireguard/wireguard_manage_peer.html:171
msgid "Add IP Address"
msgstr "IP‑Adresse hinzufügen"
-#: gatekeeper/views.py:379
+#: gatekeeper/views.py:383
msgid "IP Address saved successfully."
msgstr "IP-Adresse erfolgreich gespeichert."
-#: gatekeeper/views.py:384
+#: gatekeeper/views.py:388
msgid ""
"\n"
" IP Address List
\n"
@@ -1607,15 +1620,15 @@ msgstr ""
"„Büronetzwerk“, „Blockierter Angreifer“).
\n"
" "
-#: gatekeeper/views.py:420
+#: gatekeeper/views.py:424
msgid "IP Address deleted successfully."
msgstr "IP-Adresse erfolgreich gelöscht."
-#: gatekeeper/views.py:425
+#: gatekeeper/views.py:429
msgid "Delete IP Address"
msgstr "IP-Adresse löschen"
-#: gatekeeper/views.py:427
+#: gatekeeper/views.py:431
#, python-format
msgid "Are you sure you want to delete the IP address \"%(address)s\"?"
msgstr ""
diff --git a/locale/es/LC_MESSAGES/django.mo b/locale/es/LC_MESSAGES/django.mo
index 5703901..29a3aff 100644
Binary files a/locale/es/LC_MESSAGES/django.mo and b/locale/es/LC_MESSAGES/django.mo differ
diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po
index c5c70cd..5f67f4d 100644
--- a/locale/es/LC_MESSAGES/django.po
+++ b/locale/es/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-03-13 20:12-0300\n"
+"POT-Creation-Date: 2026-03-14 08:47-0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -68,8 +68,8 @@ msgstr ""
#: app_gateway/forms.py:129 app_gateway/forms.py:147 app_gateway/forms.py:195
#: app_gateway/forms.py:236 cluster/forms.py:67 cluster/forms.py:124
#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:41
-#: gatekeeper/forms.py:75 gatekeeper/forms.py:137 gatekeeper/forms.py:224
-#: gatekeeper/forms.py:254 gatekeeper/forms.py:285
+#: gatekeeper/forms.py:75 gatekeeper/forms.py:139 gatekeeper/forms.py:226
+#: gatekeeper/forms.py:256 gatekeeper/forms.py:287
#: routing_templates/forms.py:71 scheduler/forms.py:102
#: templates/firewall/manage_firewall_rule.html:379
#: templates/firewall/manage_firewall_settings.html:59
@@ -134,9 +134,9 @@ msgstr "Habilitado"
#: app_gateway/views.py:399 cluster/views.py:18 cluster/views.py:45
#: cluster/views.py:114 gatekeeper/views.py:23 gatekeeper/views.py:48
#: gatekeeper/views.py:78 gatekeeper/views.py:101 gatekeeper/views.py:131
-#: gatekeeper/views.py:154 gatekeeper/views.py:198 gatekeeper/views.py:257
-#: gatekeeper/views.py:287 gatekeeper/views.py:310 gatekeeper/views.py:340
-#: gatekeeper/views.py:363 gatekeeper/views.py:412
+#: gatekeeper/views.py:154 gatekeeper/views.py:202 gatekeeper/views.py:261
+#: gatekeeper/views.py:291 gatekeeper/views.py:314 gatekeeper/views.py:344
+#: gatekeeper/views.py:367 gatekeeper/views.py:416
#: templates/access_denied.html:9
msgid "Access Denied"
msgstr "Acceso denegado"
@@ -218,8 +218,8 @@ msgstr "Upstream"
#: app_gateway/forms.py:41 app_gateway/forms.py:86 app_gateway/forms.py:130
#: app_gateway/forms.py:148 app_gateway/forms.py:196 app_gateway/forms.py:237
-#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:138
-#: gatekeeper/forms.py:225 gatekeeper/forms.py:255 gatekeeper/forms.py:286
+#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:140
+#: gatekeeper/forms.py:227 gatekeeper/forms.py:257 gatekeeper/forms.py:288
#: scheduler/forms.py:103
#: templates/app_gateway/access_policy_type_select.html:50
#: templates/generic_delete_confirmation.html:19
@@ -258,7 +258,9 @@ msgstr "Métodos de autenticación"
#: app_gateway/forms.py:170
msgid "User groups can only be used with local user authentication."
-msgstr "Los grupos de usuarios solo se pueden utilizar con la autenticación de usuarios locales."
+msgstr ""
+"Los grupos de usuarios solo se pueden utilizar con la autenticación de "
+"usuarios locales."
#: app_gateway/forms.py:180 templates/app_gateway/app_gateway_list.html:56
#: templates/app_gateway/application_details.html:31
@@ -296,7 +298,7 @@ msgstr "Público"
msgid "Protected"
msgstr "Protegido"
-#: app_gateway/models.py:45 gatekeeper/models.py:108
+#: app_gateway/models.py:45 gatekeeper/models.py:109
#: templates/app_gateway/access_policy_type_select.html:41
#: templates/gatekeeper/gatekeeper_list.html:272
msgid "Deny"
@@ -351,8 +353,8 @@ msgstr ""
" Nombre para mostrar: Un nombre amigable y "
"legible para fines de visualización.\n"
" Upstream: La URL de destino a la que se "
-"reenviarán las solicitudes (ej: http://10.188.18.27:3000). "
-"Debe comenzar con http:// o https://.\n"
+"reenviarán las solicitudes (ej: http://10.188.18.27:3000). Debe "
+"comenzar con http:// o https://.\n"
" \n"
" "
@@ -434,7 +436,8 @@ msgid ""
msgstr ""
"\n"
" Política de denegación
\n"
-" Una política de denegación bloquea todo el acceso a las rutas coincidentes.
\n"
+" Una política de denegación bloquea todo el acceso a las rutas "
+"coincidentes.
\n"
" "
#: app_gateway/views.py:240
@@ -455,10 +458,15 @@ msgid ""
msgstr ""
"\n"
" Política protegida
\n"
-" Una política protegida requiere que los usuarios se autentiquen antes de acceder a la aplicación.
\n"
+" Una política protegida requiere que los usuarios se "
+"autentiquen antes de acceder a la aplicación.
\n"
" \n"
-" - Grupos permitidos: Limita el acceso a grupos de usuarios específicos. Nota: El uso de grupos requiere seleccionar un Método de autenticación de tipo \"Contraseña local\".
\n"
-" - Métodos de autenticación: Especifique qué métodos pueden utilizar los usuarios para autenticarse (por ejemplo, Contraseña local, TOTP, OIDC).
\n"
+" - Grupos permitidos: Limita el acceso a "
+"grupos de usuarios específicos. Nota: El uso de grupos requiere seleccionar "
+"un Método de autenticación de tipo \"Contraseña local\".
\n"
+" - Métodos de autenticación: Especifique "
+"qué métodos pueden utilizar los usuarios para autenticarse (por ejemplo, "
+"Contraseña local, TOTP, OIDC).
\n"
"
\n"
" "
@@ -470,7 +478,9 @@ msgstr "Política de acceso eliminada correctamente."
msgid ""
"Cannot delete this Access Policy because it is currently in use by an "
"Application Route or Application Default Policy."
-msgstr "No se puede eliminar esta política de acceso porque está actualmente en uso por una ruta de aplicación o una política predeterminada de aplicación."
+msgstr ""
+"No se puede eliminar esta política de acceso porque está actualmente en uso "
+"por una ruta de aplicación o una política predeterminada de aplicación."
#: app_gateway/views.py:278
msgid "Delete Access Policy"
@@ -577,7 +587,7 @@ msgstr "¿Está seguro de que desea eliminar la ruta \"%(name)s\" (%(path)s)?"
msgid "IP Lock"
msgstr "Bloqueo de IP"
-#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:196
+#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:198
#: templates/cluster/workers_list.html:10
#: templates/dns/static_host_list.html:18
#: templates/firewall/manage_redirect_rule.html:43
@@ -860,7 +870,7 @@ msgstr "DNS estático"
msgid "Invalid hostname."
msgstr "Nombre de host inválido."
-#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:199
+#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:201
#: templates/api_v2/api_documentation.html:51
#: templates/dns/static_host_list.html:69
#: templates/firewall/manage_redirect_rule.html:18
@@ -1199,7 +1209,7 @@ msgstr "Configuración de firewall guardada correctamente"
msgid "Username"
msgstr "Usuario"
-#: gatekeeper/forms.py:18 gatekeeper/forms.py:269
+#: gatekeeper/forms.py:18 gatekeeper/forms.py:271
#: templates/gatekeeper/gatekeeper_list.html:62
#: templates/gatekeeper/gatekeeper_list.html:204
#: templates/wireguard/peer_list/peer_preview_modal.html:103
@@ -1245,82 +1255,86 @@ msgid "Global TOTP Secret"
msgstr "Secreto TOTP global"
#: gatekeeper/forms.py:102
+msgid "Global TOTP Before Authentication"
+msgstr "TOTP global antes de la autenticación"
+
+#: gatekeeper/forms.py:103
msgid "OIDC Provider URL"
msgstr "URL del proveedor OIDC"
-#: gatekeeper/forms.py:103
+#: gatekeeper/forms.py:104
msgid "OIDC Client ID"
msgstr "ID de cliente OIDC"
-#: gatekeeper/forms.py:104
+#: gatekeeper/forms.py:105
msgid "OIDC Client Secret"
msgstr "Secreto de cliente OIDC"
-#: gatekeeper/forms.py:155
+#: gatekeeper/forms.py:157
msgid "TOTP secret must be empty for Local Password authentication."
msgstr ""
"El secreto TOTP debe estar vacío para la autenticación por contraseña local."
-#: gatekeeper/forms.py:157
+#: gatekeeper/forms.py:159
msgid "TOTP validation PIN must be empty for Local Password authentication."
msgstr ""
"El PIN de validación TOTP debe estar vacío para la autenticación por "
"contraseña local."
-#: gatekeeper/forms.py:159
+#: gatekeeper/forms.py:161
msgid "OIDC fields must be empty for Local Password authentication."
msgstr ""
"Los campos OIDC deben estar vacíos para la autenticación por contraseña "
"local."
-#: gatekeeper/forms.py:165
+#: gatekeeper/forms.py:167
msgid "Only one Local Password authentication method can be configured."
msgstr ""
"Sólo se puede configurar un método de autenticación por contraseña local."
-#: gatekeeper/forms.py:168
+#: gatekeeper/forms.py:170
msgid "OIDC fields must be empty for TOTP authentication."
msgstr "Los campos OIDC deben estar vacíos para la autenticación TOTP."
-#: gatekeeper/forms.py:170
+#: gatekeeper/forms.py:172
msgid "TOTP secret is required for TOTP authentication."
msgstr "El secreto TOTP es obligatorio para la autenticación TOTP."
-#: gatekeeper/forms.py:174
+#: gatekeeper/forms.py:176
msgid "Please provide a PIN to validate the TOTP secret."
msgstr "Proporcione un PIN para validar el secreto TOTP."
-#: gatekeeper/forms.py:179
+#: gatekeeper/forms.py:181
msgid "Invalid TOTP PIN."
msgstr "PIN TOTP no válido."
-#: gatekeeper/forms.py:181
+#: gatekeeper/forms.py:183
msgid "Invalid TOTP secret format. Must be a valid Base32 string."
msgstr "Formato de secreto TOTP no válido. Debe ser una cadena Base32 válida."
-#: gatekeeper/forms.py:184
+#: gatekeeper/forms.py:186
msgid "TOTP secret must be empty for OIDC authentication."
msgstr "El secreto TOTP debe estar vacío para la autenticación OIDC."
-#: gatekeeper/forms.py:186
+#: gatekeeper/forms.py:188
msgid "TOTP validation PIN must be empty for OIDC authentication."
msgstr "El PIN de validación TOTP debe estar vacío para la autenticación OIDC."
-#: gatekeeper/forms.py:195 gatekeeper/forms.py:237 gatekeeper/forms.py:268
+#: gatekeeper/forms.py:197 gatekeeper/forms.py:239 gatekeeper/forms.py:270
msgid "Authentication Method"
msgstr "Método de autenticación"
-#: gatekeeper/forms.py:197 templates/gatekeeper/gatekeeper_list.html:257
+#: gatekeeper/forms.py:199 templates/gatekeeper/gatekeeper_list.html:257
msgid "Prefix Length"
msgstr "Longitud del prefijo"
-#: gatekeeper/forms.py:198 templates/firewall/firewall_rule_list.html:47
+#: gatekeeper/forms.py:200 templates/firewall/firewall_rule_list.html:47
#: templates/firewall/manage_firewall_rule.html:360
#: templates/gatekeeper/gatekeeper_list.html:258
msgid "Action"
msgstr "Acción"
-#: gatekeeper/forms.py:238 templates/gatekeeper/gatekeeper_list.html:221
+#: gatekeeper/forms.py:240 templates/gatekeeper/gatekeeper_list.html:221
msgid "Domain"
msgstr "Dominio"
@@ -1344,15 +1358,15 @@ msgstr "Lista de direcciones IP"
msgid "Shared/global TOTP secret key"
msgstr "Clave secreta TOTP compartida/global"
-#: gatekeeper/models.py:68
+#: gatekeeper/models.py:69
msgid "Password for local authentication (leave blank if not using)"
msgstr "Contraseña para autenticación local (dejar en blanco si no se usa)"
-#: gatekeeper/models.py:69
+#: gatekeeper/models.py:70
msgid "Per-user TOTP secret key"
msgstr "Clave secreta TOTP por usuario"
-#: gatekeeper/models.py:108 templates/gatekeeper/gatekeeper_list.html:270
+#: gatekeeper/models.py:109 templates/gatekeeper/gatekeeper_list.html:270
msgid "Allow"
msgstr "Permitir"
@@ -1421,121 +1435,129 @@ msgstr "Método de autenticación guardado correctamente."
#: gatekeeper/views.py:175
msgid ""
"\n"
-" Authentication Types
\n"
+" Authentication Types
\n"
" Select how users will authenticate through this method.
\n"
-" \n"
-" - Local Password: Users will authenticate "
-"using a standard username and password stored locally. Only one of this type "
-"can be created.
\n"
-" - TOTP (Time-Based One-Time Password): Users "
-"will need to enter a rotating token from an authenticator app. Requires "
-"setting a Global TOTP Secret.
\n"
-" - OIDC (OpenID Connect): Users will "
-"authenticate via an external identity provider (like Keycloak, Google, or "
-"Authelia). Requires Provider URL, Client ID, and Client Secret.
\n"
-"
\n"
+" \n"
+" Local Password
\n"
+" Users will authenticate using a standard username and password "
+"stored locally. Only one of this type can be created.
\n"
+" \n"
+" OIDC (OpenID Connect)
\n"
+" Users will authenticate via an external identity provider (like "
+"Keycloak, Google, or Authelia). Requires Provider URL, Client ID, and Client "
+"Secret.
\n"
+" \n"
+" TOTP (Time-Based One-Time Password)
\n"
+" Users will need to enter a rotating token from an authenticator "
+"app. Requires setting a Global TOTP Secret.
If Global TOTP "
+"Before Authentication is enabled, the PIN is required before the "
+"username and password to help combat bruteforce attacks.
\n"
" "
msgstr ""
"\n"
-" Tipos de autenticación
\n"
+" Tipos de autenticación
\n"
" Seleccione cómo se autenticarán los usuarios a través de este "
"método.
\n"
-" \n"
-" - Contraseña local: los usuarios se "
-"autenticarán con un nombre de usuario y una contraseña estándar almacenados "
-"localmente. Solo se puede crear uno de este tipo.
\n"
-" - TOTP (Contraseña de un solo uso basada en el "
-"tiempo): los usuarios deberán introducir un token rotativo de una "
-"aplicación de autenticación. Requiere configurar un secreto TOTP global."
-"li>\n"
-"
- OIDC (OpenID Connect): los usuarios se "
-"autenticarán a través de un proveedor de identidad externo (como Keycloak, "
-"Google o Authelia). Requiere la URL del proveedor, el ID de cliente y el "
-"secreto de cliente.
\n"
-"
\n"
+" \n"
+" Contraseña local
\n"
+" Los usuarios se autenticarán con un nombre de usuario y una "
+"contraseña estándar almacenados localmente. Solo se puede crear uno de este "
+"tipo.
\n"
+" \n"
+" OIDC (OpenID Connect)
\n"
+" Los usuarios se autenticarán a través de un proveedor de "
+"identidad externo (como Keycloak, Google o Authelia). Requiere la URL del "
+"proveedor, el ID de cliente y el secreto de cliente.
\n"
+" \n"
+" TOTP (Contraseña de un solo uso basada en el tiempo)
\n"
+" Los usuarios deberán introducir un token rotativo de una "
+"aplicación de autenticación. Requiere configurar un secreto TOTP global. "
+"
Si TOTP global antes de la autenticación está "
+"habilitado, se requiere el PIN antes del nombre de usuario y la contraseña "
+"para ayudar a combatir los ataques de fuerza bruta.
\n"
" "
-#: gatekeeper/views.py:206
+#: gatekeeper/views.py:210
msgid "Authentication Method deleted successfully."
msgstr "Método de autenticación eliminado correctamente."
-#: gatekeeper/views.py:211
+#: gatekeeper/views.py:215
msgid "Delete Authentication Method"
msgstr "Eliminar método de autenticación"
-#: gatekeeper/views.py:213
+#: gatekeeper/views.py:217
#, python-format
msgid "Are you sure you want to delete the authentication method \"%(name)s\"?"
msgstr ""
"¿Está seguro de que desea eliminar el método de autenticación \"%(name)s\"?"
-#: gatekeeper/views.py:263
+#: gatekeeper/views.py:267
msgid "Edit Allowed Domain"
msgstr "Editar dominio permitido"
-#: gatekeeper/views.py:266 templates/gatekeeper/gatekeeper_list.html:186
+#: gatekeeper/views.py:270 templates/gatekeeper/gatekeeper_list.html:186
msgid "Add Allowed Domain"
msgstr "Añadir dominio permitido"
-#: gatekeeper/views.py:273
+#: gatekeeper/views.py:277
msgid "Allowed Domain saved successfully."
msgstr "Dominio permitido guardado correctamente."
-#: gatekeeper/views.py:295
+#: gatekeeper/views.py:299
msgid "Allowed Domain deleted successfully."
msgstr "Dominio permitido eliminado correctamente."
-#: gatekeeper/views.py:300
+#: gatekeeper/views.py:304
msgid "Delete Allowed Domain"
msgstr "Eliminar dominio permitido"
-#: gatekeeper/views.py:302
+#: gatekeeper/views.py:306
#, python-format
msgid "Are you sure you want to delete the allowed domain \"%(domain)s\"?"
msgstr ""
"¿Está seguro de que desea eliminar el dominio permitido \"%(domain)s\"?"
-#: gatekeeper/views.py:316
+#: gatekeeper/views.py:320
msgid "Edit Allowed Email"
msgstr "Editar correo electrónico permitido"
-#: gatekeeper/views.py:319 templates/gatekeeper/gatekeeper_list.html:183
+#: gatekeeper/views.py:323 templates/gatekeeper/gatekeeper_list.html:183
msgid "Add Allowed Email"
msgstr "Añadir correo electrónico permitido"
-#: gatekeeper/views.py:326
+#: gatekeeper/views.py:330
msgid "Allowed Email saved successfully."
msgstr "Correo electrónico permitido guardado correctamente."
-#: gatekeeper/views.py:348
+#: gatekeeper/views.py:352
msgid "Allowed Email deleted successfully."
msgstr "Correo electrónico permitido eliminado correctamente."
-#: gatekeeper/views.py:353
+#: gatekeeper/views.py:357
msgid "Delete Allowed Email"
msgstr "Eliminar correo electrónico permitido"
-#: gatekeeper/views.py:355
+#: gatekeeper/views.py:359
#, python-format
msgid "Are you sure you want to delete the allowed email \"%(email)s\"?"
msgstr ""
"¿Está seguro de que desea eliminar el correo electrónico permitido "
"\"%(email)s\"?"
-#: gatekeeper/views.py:369
+#: gatekeeper/views.py:373
msgid "Edit IP Address"
msgstr "Editar dirección IP"
-#: gatekeeper/views.py:372 templates/gatekeeper/gatekeeper_list.html:247
+#: gatekeeper/views.py:376 templates/gatekeeper/gatekeeper_list.html:247
#: templates/wireguard/wireguard_manage_peer.html:171
msgid "Add IP Address"
msgstr "Añadir IP"
-#: gatekeeper/views.py:379
+#: gatekeeper/views.py:383
msgid "IP Address saved successfully."
msgstr "Dirección IP guardada correctamente."
-#: gatekeeper/views.py:384
+#: gatekeeper/views.py:388
msgid ""
"\n"
" IP Address List
\n"
@@ -1582,15 +1604,15 @@ msgstr ""
"\"Red de la Oficina\", \"Atacante Bloqueado\").\n"
" "
-#: gatekeeper/views.py:420
+#: gatekeeper/views.py:424
msgid "IP Address deleted successfully."
msgstr "Dirección IP eliminada correctamente."
-#: gatekeeper/views.py:425
+#: gatekeeper/views.py:429
msgid "Delete IP Address"
msgstr "Eliminar dirección IP"
-#: gatekeeper/views.py:427
+#: gatekeeper/views.py:431
#, python-format
msgid "Are you sure you want to delete the IP address \"%(address)s\"?"
msgstr "¿Está seguro de que desea eliminar la dirección IP \"%(address)s\"?"
diff --git a/locale/fr/LC_MESSAGES/django.mo b/locale/fr/LC_MESSAGES/django.mo
index 412247f..90b2bbf 100644
Binary files a/locale/fr/LC_MESSAGES/django.mo and b/locale/fr/LC_MESSAGES/django.mo differ
diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po
index d32b225..fdcb34d 100644
--- a/locale/fr/LC_MESSAGES/django.po
+++ b/locale/fr/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-03-13 20:41-0300\n"
+"POT-Creation-Date: 2026-03-14 08:47-0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -68,8 +68,8 @@ msgstr ""
#: app_gateway/forms.py:129 app_gateway/forms.py:147 app_gateway/forms.py:195
#: app_gateway/forms.py:236 cluster/forms.py:67 cluster/forms.py:124
#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:41
-#: gatekeeper/forms.py:75 gatekeeper/forms.py:137 gatekeeper/forms.py:224
-#: gatekeeper/forms.py:254 gatekeeper/forms.py:285
+#: gatekeeper/forms.py:75 gatekeeper/forms.py:139 gatekeeper/forms.py:226
+#: gatekeeper/forms.py:256 gatekeeper/forms.py:287
#: routing_templates/forms.py:71 scheduler/forms.py:102
#: templates/firewall/manage_firewall_rule.html:379
#: templates/firewall/manage_firewall_settings.html:59
@@ -134,9 +134,9 @@ msgstr "Activé"
#: app_gateway/views.py:399 cluster/views.py:18 cluster/views.py:45
#: cluster/views.py:114 gatekeeper/views.py:23 gatekeeper/views.py:48
#: gatekeeper/views.py:78 gatekeeper/views.py:101 gatekeeper/views.py:131
-#: gatekeeper/views.py:154 gatekeeper/views.py:198 gatekeeper/views.py:257
-#: gatekeeper/views.py:287 gatekeeper/views.py:310 gatekeeper/views.py:340
-#: gatekeeper/views.py:363 gatekeeper/views.py:412
+#: gatekeeper/views.py:154 gatekeeper/views.py:202 gatekeeper/views.py:261
+#: gatekeeper/views.py:291 gatekeeper/views.py:314 gatekeeper/views.py:344
+#: gatekeeper/views.py:367 gatekeeper/views.py:416
#: templates/access_denied.html:9
msgid "Access Denied"
msgstr "Accès refusé"
@@ -218,8 +218,8 @@ msgstr "Upstream"
#: app_gateway/forms.py:41 app_gateway/forms.py:86 app_gateway/forms.py:130
#: app_gateway/forms.py:148 app_gateway/forms.py:196 app_gateway/forms.py:237
-#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:138
-#: gatekeeper/forms.py:225 gatekeeper/forms.py:255 gatekeeper/forms.py:286
+#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:140
+#: gatekeeper/forms.py:227 gatekeeper/forms.py:257 gatekeeper/forms.py:288
#: scheduler/forms.py:103
#: templates/app_gateway/access_policy_type_select.html:50
#: templates/generic_delete_confirmation.html:19
@@ -297,7 +297,7 @@ msgstr "Public"
msgid "Protected"
msgstr "Protégé"
-#: app_gateway/models.py:45 gatekeeper/models.py:108
+#: app_gateway/models.py:45 gatekeeper/models.py:109
#: templates/app_gateway/access_policy_type_select.html:41
#: templates/gatekeeper/gatekeeper_list.html:272
msgid "Deny"
@@ -591,7 +591,7 @@ msgstr "Êtes-vous sûr de vouloir supprimer la route \"%(name)s\" (%(path)s) ?"
msgid "IP Lock"
msgstr "Verrouillage IP"
-#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:196
+#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:198
#: templates/cluster/workers_list.html:10
#: templates/dns/static_host_list.html:18
#: templates/firewall/manage_redirect_rule.html:43
@@ -873,7 +873,7 @@ msgstr "DNS statique"
msgid "Invalid hostname."
msgstr "Nom d'hôte invalide."
-#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:199
+#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:201
#: templates/api_v2/api_documentation.html:51
#: templates/dns/static_host_list.html:69
#: templates/firewall/manage_redirect_rule.html:18
@@ -1214,7 +1214,7 @@ msgstr "Paramètres du pare‑feu enregistrés avec succès"
msgid "Username"
msgstr "Nom d’utilisateur"
-#: gatekeeper/forms.py:18 gatekeeper/forms.py:269
+#: gatekeeper/forms.py:18 gatekeeper/forms.py:271
#: templates/gatekeeper/gatekeeper_list.html:62
#: templates/gatekeeper/gatekeeper_list.html:204
#: templates/wireguard/peer_list/peer_preview_modal.html:103
@@ -1260,84 +1260,88 @@ msgid "Global TOTP Secret"
msgstr "Secret TOTP mondial"
#: gatekeeper/forms.py:102
+msgid "Global TOTP Before Authentication"
+msgstr "TOTP global avant l'authentification"
+
+#: gatekeeper/forms.py:103
msgid "OIDC Provider URL"
msgstr "URL du fournisseur OIDC"
-#: gatekeeper/forms.py:103
+#: gatekeeper/forms.py:104
msgid "OIDC Client ID"
msgstr "ID client OIDC"
-#: gatekeeper/forms.py:104
+#: gatekeeper/forms.py:105
msgid "OIDC Client Secret"
msgstr "Secret client OIDC"
-#: gatekeeper/forms.py:155
+#: gatekeeper/forms.py:157
msgid "TOTP secret must be empty for Local Password authentication."
msgstr ""
"Le secret TOTP doit être vide pour l'authentification par mot de passe local."
-#: gatekeeper/forms.py:157
+#: gatekeeper/forms.py:159
msgid "TOTP validation PIN must be empty for Local Password authentication."
msgstr ""
"Le code de validation TOTP doit être vide pour l'authentification par mot de "
"passe local."
-#: gatekeeper/forms.py:159
+#: gatekeeper/forms.py:161
msgid "OIDC fields must be empty for Local Password authentication."
msgstr ""
"Les champs OIDC doivent être vides pour l'authentification par mot de passe "
"local."
-#: gatekeeper/forms.py:165
+#: gatekeeper/forms.py:167
msgid "Only one Local Password authentication method can be configured."
msgstr ""
"Un seul système d'authentification par mot de passe local peut être "
"configuré."
-#: gatekeeper/forms.py:168
+#: gatekeeper/forms.py:170
msgid "OIDC fields must be empty for TOTP authentication."
msgstr "Les champs OIDC doivent être vides pour l'authentification TOTP."
-#: gatekeeper/forms.py:170
+#: gatekeeper/forms.py:172
msgid "TOTP secret is required for TOTP authentication."
msgstr "Le secret TOTP est requis pour l'authentification TOTP."
-#: gatekeeper/forms.py:174
+#: gatekeeper/forms.py:176
msgid "Please provide a PIN to validate the TOTP secret."
msgstr "Veuillez fournir un code pour valider le secret TOTP."
-#: gatekeeper/forms.py:179
+#: gatekeeper/forms.py:181
msgid "Invalid TOTP PIN."
msgstr "Code TOTP invalide."
-#: gatekeeper/forms.py:181
+#: gatekeeper/forms.py:183
msgid "Invalid TOTP secret format. Must be a valid Base32 string."
msgstr "Format du secret TOTP invalide. Doit être une chaîne Base32 valide."
-#: gatekeeper/forms.py:184
+#: gatekeeper/forms.py:186
msgid "TOTP secret must be empty for OIDC authentication."
msgstr "Le secret TOTP doit être vide pour l'authentification OIDC."
-#: gatekeeper/forms.py:186
+#: gatekeeper/forms.py:188
msgid "TOTP validation PIN must be empty for OIDC authentication."
msgstr ""
"Le code de validation TOTP doit être vide pour l'authentification OIDC."
-#: gatekeeper/forms.py:195 gatekeeper/forms.py:237 gatekeeper/forms.py:268
+#: gatekeeper/forms.py:197 gatekeeper/forms.py:239 gatekeeper/forms.py:270
msgid "Authentication Method"
msgstr "Méthode d'authentification"
-#: gatekeeper/forms.py:197 templates/gatekeeper/gatekeeper_list.html:257
+#: gatekeeper/forms.py:199 templates/gatekeeper/gatekeeper_list.html:257
msgid "Prefix Length"
msgstr "Longueur du préfixe"
-#: gatekeeper/forms.py:198 templates/firewall/firewall_rule_list.html:47
+#: gatekeeper/forms.py:200 templates/firewall/firewall_rule_list.html:47
#: templates/firewall/manage_firewall_rule.html:360
#: templates/gatekeeper/gatekeeper_list.html:258
msgid "Action"
msgstr "Action"
-#: gatekeeper/forms.py:238 templates/gatekeeper/gatekeeper_list.html:221
+#: gatekeeper/forms.py:240 templates/gatekeeper/gatekeeper_list.html:221
msgid "Domain"
msgstr "Domaine"
@@ -1361,17 +1365,17 @@ msgstr "Liste d'adresses IP"
msgid "Shared/global TOTP secret key"
msgstr "Clé secrète TOTP partagée/globale"
-#: gatekeeper/models.py:68
+#: gatekeeper/models.py:69
msgid "Password for local authentication (leave blank if not using)"
msgstr ""
"Mot de passe pour l'authentification locale (laissez vide si vous ne "
"l'utilisez pas)"
-#: gatekeeper/models.py:69
+#: gatekeeper/models.py:70
msgid "Per-user TOTP secret key"
msgstr "Clé secrète TOTP par utilisateur"
-#: gatekeeper/models.py:108 templates/gatekeeper/gatekeeper_list.html:270
+#: gatekeeper/models.py:109 templates/gatekeeper/gatekeeper_list.html:270
msgid "Allow"
msgstr "Autoriser"
@@ -1440,120 +1444,128 @@ msgstr "Méthode d'authentification enregistrée avec succès."
#: gatekeeper/views.py:175
msgid ""
"\n"
-" Authentication Types
\n"
+" Authentication Types
\n"
" Select how users will authenticate through this method.
\n"
-" \n"
-" - Local Password: Users will authenticate "
-"using a standard username and password stored locally. Only one of this type "
-"can be created.
\n"
-" - TOTP (Time-Based One-Time Password): Users "
-"will need to enter a rotating token from an authenticator app. Requires "
-"setting a Global TOTP Secret.
\n"
-" - OIDC (OpenID Connect): Users will "
-"authenticate via an external identity provider (like Keycloak, Google, or "
-"Authelia). Requires Provider URL, Client ID, and Client Secret.
\n"
-"
\n"
+" \n"
+" Local Password
\n"
+" Users will authenticate using a standard username and password "
+"stored locally. Only one of this type can be created.
\n"
+" \n"
+" OIDC (OpenID Connect)
\n"
+" Users will authenticate via an external identity provider (like "
+"Keycloak, Google, or Authelia). Requires Provider URL, Client ID, and Client "
+"Secret.
\n"
+" \n"
+" TOTP (Time-Based One-Time Password)
\n"
+" Users will need to enter a rotating token from an authenticator "
+"app. Requires setting a Global TOTP Secret.
If Global TOTP "
+"Before Authentication is enabled, the PIN is required before the "
+"username and password to help combat bruteforce attacks.
\n"
" "
msgstr ""
"\n"
-" Types d'authentification
\n"
+" Types d'authentification
\n"
" Sélectionnez la façon dont les utilisateurs s'authentifieront via "
"cette méthode.
\n"
-" \n"
-" - Mot de passe local : les utilisateurs "
-"s'authentifieront à l'aide d'un nom d'utilisateur et d'un mot de passe "
-"standard stockés localement. Un seul de ce type peut être créé.
\n"
-" - TOTP (Time-Based One-Time Password) : les "
-"utilisateurs devront saisir un jeton rotatif à partir d'une application "
-"d'authentification. Nécessite la configuration d'un secret TOTP global."
-"li>\n"
-"
- OIDC (OpenID Connect) : les utilisateurs "
-"s'authentifieront via un fournisseur d'identité externe (comme Keycloak, "
-"Google ou Authelia). Nécessite l'URL du fournisseur, l'ID client et le "
-"secret client.
\n"
-"
\n"
+" \n"
+" Mot de passe local
\n"
+" Les utilisateurs s'authentifieront à l'aide d'un nom "
+"d'utilisateur et d'un mot de passe standard stockés localement. Un seul de "
+"ce type peut être créé.
\n"
+" \n"
+" OIDC (OpenID Connect)
\n"
+" Les utilisateurs s'authentifieront via un fournisseur d'identité "
+"externe (comme Keycloak, Google ou Authelia). Nécessite l'URL du "
+"fournisseur, l'ID client et le secret client.
\n"
+" \n"
+" TOTP (Mot de passe à usage unique basé sur le temps)
\n"
+" Les utilisateurs devront saisir un jeton rotatif à partir d'une "
+"application d'authentification. Nécessite la configuration d'un secret TOTP "
+"global.
Si TOTP mondial avant l'authentification est "
+"activé, le code est requis avant le nom d'utilisateur et le mot de passe "
+"pour aider à lutter contre les attaques par force brute.
\n"
" "
-#: gatekeeper/views.py:206
+#: gatekeeper/views.py:210
msgid "Authentication Method deleted successfully."
msgstr "Méthode d'authentification supprimée avec succès."
-#: gatekeeper/views.py:211
+#: gatekeeper/views.py:215
msgid "Delete Authentication Method"
msgstr "Supprimer la méthode d'authentification"
-#: gatekeeper/views.py:213
+#: gatekeeper/views.py:217
#, python-format
msgid "Are you sure you want to delete the authentication method \"%(name)s\"?"
msgstr ""
"Êtes-vous sûr de vouloir supprimer la méthode d'authentification "
"\"%(name)s\" ?"
-#: gatekeeper/views.py:263
+#: gatekeeper/views.py:267
msgid "Edit Allowed Domain"
msgstr "Modifier le domaine autorisé"
-#: gatekeeper/views.py:266 templates/gatekeeper/gatekeeper_list.html:186
+#: gatekeeper/views.py:270 templates/gatekeeper/gatekeeper_list.html:186
msgid "Add Allowed Domain"
msgstr "Ajouter un domaine autorisé"
-#: gatekeeper/views.py:273
+#: gatekeeper/views.py:277
msgid "Allowed Domain saved successfully."
msgstr "Domaine autorisé enregistré avec succès."
-#: gatekeeper/views.py:295
+#: gatekeeper/views.py:299
msgid "Allowed Domain deleted successfully."
msgstr "Domaine autorisé supprimé avec succès."
-#: gatekeeper/views.py:300
+#: gatekeeper/views.py:304
msgid "Delete Allowed Domain"
msgstr "Supprimer le domaine autorisé"
-#: gatekeeper/views.py:302
+#: gatekeeper/views.py:306
#, python-format
msgid "Are you sure you want to delete the allowed domain \"%(domain)s\"?"
msgstr ""
"Êtes-vous sûr de vouloir supprimer le domaine autorisé \"%(domain)s\" ?"
-#: gatekeeper/views.py:316
+#: gatekeeper/views.py:320
msgid "Edit Allowed Email"
msgstr "Modifier l'e-mail autorisé"
-#: gatekeeper/views.py:319 templates/gatekeeper/gatekeeper_list.html:183
+#: gatekeeper/views.py:323 templates/gatekeeper/gatekeeper_list.html:183
msgid "Add Allowed Email"
msgstr "Ajouter un e-mail autorisé"
-#: gatekeeper/views.py:326
+#: gatekeeper/views.py:330
msgid "Allowed Email saved successfully."
msgstr "E-mail autorisé enregistré avec succès."
-#: gatekeeper/views.py:348
+#: gatekeeper/views.py:352
msgid "Allowed Email deleted successfully."
msgstr "E-mail autorisé supprimé avec succès."
-#: gatekeeper/views.py:353
+#: gatekeeper/views.py:357
msgid "Delete Allowed Email"
msgstr "Supprimer l'e-mail autorisé"
-#: gatekeeper/views.py:355
+#: gatekeeper/views.py:359
#, python-format
msgid "Are you sure you want to delete the allowed email \"%(email)s\"?"
msgstr "Êtes-vous sûr de vouloir supprimer l'e-mail autorisé \"%(email)s\" ?"
-#: gatekeeper/views.py:369
+#: gatekeeper/views.py:373
msgid "Edit IP Address"
msgstr "Modifier l'adresse IP"
-#: gatekeeper/views.py:372 templates/gatekeeper/gatekeeper_list.html:247
+#: gatekeeper/views.py:376 templates/gatekeeper/gatekeeper_list.html:247
#: templates/wireguard/wireguard_manage_peer.html:171
msgid "Add IP Address"
msgstr "Ajouter une adresse IP"
-#: gatekeeper/views.py:379
+#: gatekeeper/views.py:383
msgid "IP Address saved successfully."
msgstr "Adresse IP enregistrée avec succès."
-#: gatekeeper/views.py:384
+#: gatekeeper/views.py:388
msgid ""
"\n"
" IP Address List
\n"
@@ -1600,15 +1612,15 @@ msgstr ""
"\"Réseau de bureau\", \"Attaquant bloqué\").\n"
" "
-#: gatekeeper/views.py:420
+#: gatekeeper/views.py:424
msgid "IP Address deleted successfully."
msgstr "Adresse IP supprimée avec succès."
-#: gatekeeper/views.py:425
+#: gatekeeper/views.py:429
msgid "Delete IP Address"
msgstr "Supprimer l'adresse IP"
-#: gatekeeper/views.py:427
+#: gatekeeper/views.py:431
#, python-format
msgid "Are you sure you want to delete the IP address \"%(address)s\"?"
msgstr "Êtes-vous sûr de vouloir supprimer l'adresse IP \"%(address)s\" ?"
diff --git a/locale/pt_BR/LC_MESSAGES/django.mo b/locale/pt_BR/LC_MESSAGES/django.mo
index 77aa94f..14eb6bb 100644
Binary files a/locale/pt_BR/LC_MESSAGES/django.mo and b/locale/pt_BR/LC_MESSAGES/django.mo differ
diff --git a/locale/pt_BR/LC_MESSAGES/django.po b/locale/pt_BR/LC_MESSAGES/django.po
index 4fbc351..1eb1a1f 100644
--- a/locale/pt_BR/LC_MESSAGES/django.po
+++ b/locale/pt_BR/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-03-13 20:36-0300\n"
+"POT-Creation-Date: 2026-03-14 08:47-0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -68,8 +68,8 @@ msgstr ""
#: app_gateway/forms.py:129 app_gateway/forms.py:147 app_gateway/forms.py:195
#: app_gateway/forms.py:236 cluster/forms.py:67 cluster/forms.py:124
#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:41
-#: gatekeeper/forms.py:75 gatekeeper/forms.py:137 gatekeeper/forms.py:224
-#: gatekeeper/forms.py:254 gatekeeper/forms.py:285
+#: gatekeeper/forms.py:75 gatekeeper/forms.py:139 gatekeeper/forms.py:226
+#: gatekeeper/forms.py:256 gatekeeper/forms.py:287
#: routing_templates/forms.py:71 scheduler/forms.py:102
#: templates/firewall/manage_firewall_rule.html:379
#: templates/firewall/manage_firewall_settings.html:59
@@ -134,9 +134,9 @@ msgstr "Habilitado"
#: app_gateway/views.py:399 cluster/views.py:18 cluster/views.py:45
#: cluster/views.py:114 gatekeeper/views.py:23 gatekeeper/views.py:48
#: gatekeeper/views.py:78 gatekeeper/views.py:101 gatekeeper/views.py:131
-#: gatekeeper/views.py:154 gatekeeper/views.py:198 gatekeeper/views.py:257
-#: gatekeeper/views.py:287 gatekeeper/views.py:310 gatekeeper/views.py:340
-#: gatekeeper/views.py:363 gatekeeper/views.py:412
+#: gatekeeper/views.py:154 gatekeeper/views.py:202 gatekeeper/views.py:261
+#: gatekeeper/views.py:291 gatekeeper/views.py:314 gatekeeper/views.py:344
+#: gatekeeper/views.py:367 gatekeeper/views.py:416
#: templates/access_denied.html:9
msgid "Access Denied"
msgstr "Acesso Negado"
@@ -218,8 +218,8 @@ msgstr "Upstream"
#: app_gateway/forms.py:41 app_gateway/forms.py:86 app_gateway/forms.py:130
#: app_gateway/forms.py:148 app_gateway/forms.py:196 app_gateway/forms.py:237
-#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:138
-#: gatekeeper/forms.py:225 gatekeeper/forms.py:255 gatekeeper/forms.py:286
+#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:140
+#: gatekeeper/forms.py:227 gatekeeper/forms.py:257 gatekeeper/forms.py:288
#: scheduler/forms.py:103
#: templates/app_gateway/access_policy_type_select.html:50
#: templates/generic_delete_confirmation.html:19
@@ -296,7 +296,7 @@ msgstr "Público"
msgid "Protected"
msgstr "Protegido"
-#: app_gateway/models.py:45 gatekeeper/models.py:108
+#: app_gateway/models.py:45 gatekeeper/models.py:109
#: templates/app_gateway/access_policy_type_select.html:41
#: templates/gatekeeper/gatekeeper_list.html:272
msgid "Deny"
@@ -583,7 +583,7 @@ msgstr "Tem certeza de que deseja excluir a rota \"%(name)s\" (%(path)s)?"
msgid "IP Lock"
msgstr "Bloqueio de IP"
-#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:196
+#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:198
#: templates/cluster/workers_list.html:10
#: templates/dns/static_host_list.html:18
#: templates/firewall/manage_redirect_rule.html:43
@@ -864,7 +864,7 @@ msgstr "DNS Estático"
msgid "Invalid hostname."
msgstr "Nome de host inválido."
-#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:199
+#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:201
#: templates/api_v2/api_documentation.html:51
#: templates/dns/static_host_list.html:69
#: templates/firewall/manage_redirect_rule.html:18
@@ -1206,7 +1206,7 @@ msgstr "Configurações de Firewall salvas com sucesso"
msgid "Username"
msgstr "Usuário"
-#: gatekeeper/forms.py:18 gatekeeper/forms.py:269
+#: gatekeeper/forms.py:18 gatekeeper/forms.py:271
#: templates/gatekeeper/gatekeeper_list.html:62
#: templates/gatekeeper/gatekeeper_list.html:204
#: templates/wireguard/peer_list/peer_preview_modal.html:103
@@ -1252,77 +1252,81 @@ msgid "Global TOTP Secret"
msgstr "Segredo TOTP Global"
#: gatekeeper/forms.py:102
+msgid "Global TOTP Before Authentication"
+msgstr "TOTP Global Antes da Autenticação"
+
+#: gatekeeper/forms.py:103
msgid "OIDC Provider URL"
msgstr "URL do Provedor OIDC"
-#: gatekeeper/forms.py:103
+#: gatekeeper/forms.py:104
msgid "OIDC Client ID"
msgstr "ID do Cliente OIDC"
-#: gatekeeper/forms.py:104
+#: gatekeeper/forms.py:105
msgid "OIDC Client Secret"
msgstr "Segredo do Cliente OIDC"
-#: gatekeeper/forms.py:155
+#: gatekeeper/forms.py:157
msgid "TOTP secret must be empty for Local Password authentication."
msgstr "O segredo TOTP deve estar vazio para autenticação por Senha Local."
-#: gatekeeper/forms.py:157
+#: gatekeeper/forms.py:159
msgid "TOTP validation PIN must be empty for Local Password authentication."
msgstr ""
"O PIN de validação TOTP deve estar vazio para autenticação por Senha Local."
-#: gatekeeper/forms.py:159
+#: gatekeeper/forms.py:161
msgid "OIDC fields must be empty for Local Password authentication."
msgstr "Os campos OIDC devem estar vazios para autenticação por Senha Local."
-#: gatekeeper/forms.py:165
+#: gatekeeper/forms.py:167
msgid "Only one Local Password authentication method can be configured."
msgstr "Apenas um método de autenticação por Senha Local pode ser configurado."
-#: gatekeeper/forms.py:168
+#: gatekeeper/forms.py:170
msgid "OIDC fields must be empty for TOTP authentication."
msgstr "Os campos OIDC devem estar vazios para autenticação por TOTP."
-#: gatekeeper/forms.py:170
+#: gatekeeper/forms.py:172
msgid "TOTP secret is required for TOTP authentication."
msgstr "O segredo TOTP é obrigatório para autenticação por TOTP."
-#: gatekeeper/forms.py:174
+#: gatekeeper/forms.py:176
msgid "Please provide a PIN to validate the TOTP secret."
msgstr "Por favor, forneça um PIN para validar o segredo TOTP."
-#: gatekeeper/forms.py:179
+#: gatekeeper/forms.py:181
msgid "Invalid TOTP PIN."
msgstr "PIN TOTP inválido."
-#: gatekeeper/forms.py:181
+#: gatekeeper/forms.py:183
msgid "Invalid TOTP secret format. Must be a valid Base32 string."
msgstr "Formato de segredo TOTP inválido. Deve ser uma string Base32 válida."
-#: gatekeeper/forms.py:184
+#: gatekeeper/forms.py:186
msgid "TOTP secret must be empty for OIDC authentication."
msgstr "O segredo TOTP deve estar vazio para autenticação por OIDC."
-#: gatekeeper/forms.py:186
+#: gatekeeper/forms.py:188
msgid "TOTP validation PIN must be empty for OIDC authentication."
msgstr "O PIN de validação TOTP deve estar vazio para autenticação por OIDC."
-#: gatekeeper/forms.py:195 gatekeeper/forms.py:237 gatekeeper/forms.py:268
+#: gatekeeper/forms.py:197 gatekeeper/forms.py:239 gatekeeper/forms.py:270
msgid "Authentication Method"
msgstr "Método de Autenticação"
-#: gatekeeper/forms.py:197 templates/gatekeeper/gatekeeper_list.html:257
+#: gatekeeper/forms.py:199 templates/gatekeeper/gatekeeper_list.html:257
msgid "Prefix Length"
msgstr "Comprimento do Prefixo"
-#: gatekeeper/forms.py:198 templates/firewall/firewall_rule_list.html:47
+#: gatekeeper/forms.py:200 templates/firewall/firewall_rule_list.html:47
#: templates/firewall/manage_firewall_rule.html:360
#: templates/gatekeeper/gatekeeper_list.html:258
msgid "Action"
msgstr "Ação"
-#: gatekeeper/forms.py:238 templates/gatekeeper/gatekeeper_list.html:221
+#: gatekeeper/forms.py:240 templates/gatekeeper/gatekeeper_list.html:221
msgid "Domain"
msgstr "Domínio"
@@ -1346,15 +1350,15 @@ msgstr "Lista de Endereços IP"
msgid "Shared/global TOTP secret key"
msgstr "Chave secreta TOTP compartilhada/global"
-#: gatekeeper/models.py:68
+#: gatekeeper/models.py:69
msgid "Password for local authentication (leave blank if not using)"
msgstr "Senha para autenticação local (deixe em branco se não estiver usando)"
-#: gatekeeper/models.py:69
+#: gatekeeper/models.py:70
msgid "Per-user TOTP secret key"
msgstr "Chave secreta TOTP por usuário"
-#: gatekeeper/models.py:108 templates/gatekeeper/gatekeeper_list.html:270
+#: gatekeeper/models.py:109 templates/gatekeeper/gatekeeper_list.html:270
msgid "Allow"
msgstr "Permitir"
@@ -1423,117 +1427,125 @@ msgstr "Método de Autenticação salvo com sucesso."
#: gatekeeper/views.py:175
msgid ""
"\n"
-" Authentication Types
\n"
+" Authentication Types
\n"
" Select how users will authenticate through this method.
\n"
-" \n"
-" - Local Password: Users will authenticate "
-"using a standard username and password stored locally. Only one of this type "
-"can be created.
\n"
-" - TOTP (Time-Based One-Time Password): Users "
-"will need to enter a rotating token from an authenticator app. Requires "
-"setting a Global TOTP Secret.
\n"
-" - OIDC (OpenID Connect): Users will "
-"authenticate via an external identity provider (like Keycloak, Google, or "
-"Authelia). Requires Provider URL, Client ID, and Client Secret.
\n"
-"
\n"
+" \n"
+" Local Password
\n"
+" Users will authenticate using a standard username and password "
+"stored locally. Only one of this type can be created.
\n"
+" \n"
+" OIDC (OpenID Connect)
\n"
+" Users will authenticate via an external identity provider (like "
+"Keycloak, Google, or Authelia). Requires Provider URL, Client ID, and Client "
+"Secret.
\n"
+" \n"
+" TOTP (Time-Based One-Time Password)
\n"
+" Users will need to enter a rotating token from an authenticator "
+"app. Requires setting a Global TOTP Secret.
If Global TOTP "
+"Before Authentication is enabled, the PIN is required before the "
+"username and password to help combat bruteforce attacks.
\n"
" "
msgstr ""
"\n"
-" Tipos de Autenticação
\n"
+" Tipos de Autenticação
\n"
" Selecione como os usuários irão se autenticar através deste "
"método.
\n"
-" \n"
-" - Senha Local: Os usuários se autenticarão "
-"usando um nome de usuário e senha padrão armazenados localmente. Apenas um "
-"deste tipo pode ser criado.
\n"
-" - TOTP (Senha de Uso Único Baseada em Tempo): "
-"Os usuários precisarão inserir um token rotativo de um aplicativo "
-"autenticador. Requer a definição de um Segredo TOTP Global.
\n"
-" - OIDC (OpenID Connect): Os usuários se "
-"autenticarão por meio de um provedor de identidade externo (como Keycloak, "
-"Google ou Authelia). Requer URL do Provedor, ID do Cliente e Segredo do "
-"Cliente.
\n"
-"
\n"
+" \n"
+" Senha Local
\n"
+" Os usuários se autenticarão usando um nome de usuário e senha "
+"padrão armazenados localmente. Apenas um deste tipo pode ser criado.
\n"
+" \n"
+" OIDC (OpenID Connect)
\n"
+" Os usuários se autenticarão por meio de um provedor de identidade "
+"externo (como Keycloak, Google ou Authelia). Requer URL do Provedor, ID do "
+"Cliente e Segredo do Cliente.
\n"
+" \n"
+" TOTP (Senha de Uso Único Baseada em Tempo)
\n"
+" Os usuários precisarão inserir um token rotativo de um aplicativo "
+"autenticador. Requer a definição de um Segredo TOTP Global.
Se o "
+"TOTP Global Antes da Autenticação estiver habilitado, o PIN "
+"será exigido antes do usuário e senha para ajudar a combater ataques de "
+"força bruta.
\n"
" "
-#: gatekeeper/views.py:206
+#: gatekeeper/views.py:210
msgid "Authentication Method deleted successfully."
msgstr "Método de Autenticação excluído com sucesso."
-#: gatekeeper/views.py:211
+#: gatekeeper/views.py:215
msgid "Delete Authentication Method"
msgstr "Excluir Método de Autenticação"
-#: gatekeeper/views.py:213
+#: gatekeeper/views.py:217
#, python-format
msgid "Are you sure you want to delete the authentication method \"%(name)s\"?"
msgstr ""
"Tem certeza de que deseja excluir o método de autenticação \"%(name)s\"?"
-#: gatekeeper/views.py:263
+#: gatekeeper/views.py:267
msgid "Edit Allowed Domain"
msgstr "Editar Domínio Permitido"
-#: gatekeeper/views.py:266 templates/gatekeeper/gatekeeper_list.html:186
+#: gatekeeper/views.py:270 templates/gatekeeper/gatekeeper_list.html:186
msgid "Add Allowed Domain"
msgstr "Adicionar Domínio Permitido"
-#: gatekeeper/views.py:273
+#: gatekeeper/views.py:277
msgid "Allowed Domain saved successfully."
msgstr "Domínio Permitido salvo com sucesso."
-#: gatekeeper/views.py:295
+#: gatekeeper/views.py:299
msgid "Allowed Domain deleted successfully."
msgstr "Domínio Permitido excluído com sucesso."
-#: gatekeeper/views.py:300
+#: gatekeeper/views.py:304
msgid "Delete Allowed Domain"
msgstr "Excluir Domínio Permitido"
-#: gatekeeper/views.py:302
+#: gatekeeper/views.py:306
#, python-format
msgid "Are you sure you want to delete the allowed domain \"%(domain)s\"?"
msgstr "Tem certeza de que deseja excluir o domínio permitido \"%(domain)s\"?"
-#: gatekeeper/views.py:316
+#: gatekeeper/views.py:320
msgid "Edit Allowed Email"
msgstr "Editar E-mail Permitido"
-#: gatekeeper/views.py:319 templates/gatekeeper/gatekeeper_list.html:183
+#: gatekeeper/views.py:323 templates/gatekeeper/gatekeeper_list.html:183
msgid "Add Allowed Email"
msgstr "Adicionar E-mail Permitido"
-#: gatekeeper/views.py:326
+#: gatekeeper/views.py:330
msgid "Allowed Email saved successfully."
msgstr "E-mail Permitido salvo com sucesso."
-#: gatekeeper/views.py:348
+#: gatekeeper/views.py:352
msgid "Allowed Email deleted successfully."
msgstr "E-mail Permitido excluído com sucesso."
-#: gatekeeper/views.py:353
+#: gatekeeper/views.py:357
msgid "Delete Allowed Email"
msgstr "Excluir E-mail Permitido"
-#: gatekeeper/views.py:355
+#: gatekeeper/views.py:359
#, python-format
msgid "Are you sure you want to delete the allowed email \"%(email)s\"?"
msgstr "Tem certeza de que deseja excluir o e-mail permitido \"%(email)s\"?"
-#: gatekeeper/views.py:369
+#: gatekeeper/views.py:373
msgid "Edit IP Address"
msgstr "Editar Endereço IP"
-#: gatekeeper/views.py:372 templates/gatekeeper/gatekeeper_list.html:247
+#: gatekeeper/views.py:376 templates/gatekeeper/gatekeeper_list.html:247
#: templates/wireguard/wireguard_manage_peer.html:171
msgid "Add IP Address"
msgstr "Adicionar IP"
-#: gatekeeper/views.py:379
+#: gatekeeper/views.py:383
msgid "IP Address saved successfully."
msgstr "Endereço IP salvo com sucesso."
-#: gatekeeper/views.py:384
+#: gatekeeper/views.py:388
msgid ""
"\n"
" IP Address List
\n"
@@ -1580,15 +1592,15 @@ msgstr ""
"\"Rede do Escritório\", \"Atacante Bloqueado\").\n"
" "
-#: gatekeeper/views.py:420
+#: gatekeeper/views.py:424
msgid "IP Address deleted successfully."
msgstr "Endereço IP excluído com sucesso."
-#: gatekeeper/views.py:425
+#: gatekeeper/views.py:429
msgid "Delete IP Address"
msgstr "Excluir Endereço IP"
-#: gatekeeper/views.py:427
+#: gatekeeper/views.py:431
#, python-format
msgid "Are you sure you want to delete the IP address \"%(address)s\"?"
msgstr "Tem certeza de que deseja excluir o endereço IP \"%(address)s\"?"
diff --git a/locale/sk/LC_MESSAGES/django.mo b/locale/sk/LC_MESSAGES/django.mo
index a2a115c..da44909 100644
Binary files a/locale/sk/LC_MESSAGES/django.mo and b/locale/sk/LC_MESSAGES/django.mo differ
diff --git a/locale/sk/LC_MESSAGES/django.po b/locale/sk/LC_MESSAGES/django.po
index 1f06844..4747476 100644
--- a/locale/sk/LC_MESSAGES/django.po
+++ b/locale/sk/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-03-13 20:41-0300\n"
+"POT-Creation-Date: 2026-03-14 08:47-0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -68,8 +68,8 @@ msgstr ""
#: app_gateway/forms.py:129 app_gateway/forms.py:147 app_gateway/forms.py:195
#: app_gateway/forms.py:236 cluster/forms.py:67 cluster/forms.py:124
#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:41
-#: gatekeeper/forms.py:75 gatekeeper/forms.py:137 gatekeeper/forms.py:224
-#: gatekeeper/forms.py:254 gatekeeper/forms.py:285
+#: gatekeeper/forms.py:75 gatekeeper/forms.py:139 gatekeeper/forms.py:226
+#: gatekeeper/forms.py:256 gatekeeper/forms.py:287
#: routing_templates/forms.py:71 scheduler/forms.py:102
#: templates/firewall/manage_firewall_rule.html:379
#: templates/firewall/manage_firewall_settings.html:59
@@ -134,9 +134,9 @@ msgstr "Povolené"
#: app_gateway/views.py:399 cluster/views.py:18 cluster/views.py:45
#: cluster/views.py:114 gatekeeper/views.py:23 gatekeeper/views.py:48
#: gatekeeper/views.py:78 gatekeeper/views.py:101 gatekeeper/views.py:131
-#: gatekeeper/views.py:154 gatekeeper/views.py:198 gatekeeper/views.py:257
-#: gatekeeper/views.py:287 gatekeeper/views.py:310 gatekeeper/views.py:340
-#: gatekeeper/views.py:363 gatekeeper/views.py:412
+#: gatekeeper/views.py:154 gatekeeper/views.py:202 gatekeeper/views.py:261
+#: gatekeeper/views.py:291 gatekeeper/views.py:314 gatekeeper/views.py:344
+#: gatekeeper/views.py:367 gatekeeper/views.py:416
#: templates/access_denied.html:9
msgid "Access Denied"
msgstr "Prístup zamietnutý"
@@ -218,8 +218,8 @@ msgstr "Upstream"
#: app_gateway/forms.py:41 app_gateway/forms.py:86 app_gateway/forms.py:130
#: app_gateway/forms.py:148 app_gateway/forms.py:196 app_gateway/forms.py:237
-#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:138
-#: gatekeeper/forms.py:225 gatekeeper/forms.py:255 gatekeeper/forms.py:286
+#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:140
+#: gatekeeper/forms.py:227 gatekeeper/forms.py:257 gatekeeper/forms.py:288
#: scheduler/forms.py:103
#: templates/app_gateway/access_policy_type_select.html:50
#: templates/generic_delete_confirmation.html:19
@@ -297,7 +297,7 @@ msgstr "Verejné"
msgid "Protected"
msgstr "Chránené"
-#: app_gateway/models.py:45 gatekeeper/models.py:108
+#: app_gateway/models.py:45 gatekeeper/models.py:109
#: templates/app_gateway/access_policy_type_select.html:41
#: templates/gatekeeper/gatekeeper_list.html:272
msgid "Deny"
@@ -477,7 +477,9 @@ msgstr "Politika prístupu bola úspešne odstránená."
msgid ""
"Cannot delete this Access Policy because it is currently in use by an "
"Application Route or Application Default Policy."
-msgstr "Túto prístupovú politiku nie je možné odstrániť, pretože sa momentálne používa v trase aplikácie alebo v predvolenej politike aplikácie."
+msgstr ""
+"Túto prístupovú politiku nie je možné odstrániť, pretože sa momentálne "
+"používa v trase aplikácie alebo v predvolenej politike aplikácie."
#: app_gateway/views.py:278
msgid "Delete Access Policy"
@@ -582,7 +584,7 @@ msgstr "Naozaj chcete odstrániť trasu \"%(name)s\" (%(path)s)?"
msgid "IP Lock"
msgstr "IP zámok"
-#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:196
+#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:198
#: templates/cluster/workers_list.html:10
#: templates/dns/static_host_list.html:18
#: templates/firewall/manage_redirect_rule.html:43
@@ -859,7 +861,7 @@ msgstr "Statický DNS"
msgid "Invalid hostname."
msgstr "Neplatný názov hostiteľa."
-#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:199
+#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:201
#: templates/api_v2/api_documentation.html:51
#: templates/dns/static_host_list.html:69
#: templates/firewall/manage_redirect_rule.html:18
@@ -1197,7 +1199,7 @@ msgstr "Nastavenia firewall boli úspešne uložené"
msgid "Username"
msgstr "Používateľské meno"
-#: gatekeeper/forms.py:18 gatekeeper/forms.py:269
+#: gatekeeper/forms.py:18 gatekeeper/forms.py:271
#: templates/gatekeeper/gatekeeper_list.html:62
#: templates/gatekeeper/gatekeeper_list.html:204
#: templates/wireguard/peer_list/peer_preview_modal.html:103
@@ -1243,78 +1245,82 @@ msgid "Global TOTP Secret"
msgstr "Globálne TOTP tajomstvo"
#: gatekeeper/forms.py:102
+msgid "Global TOTP Before Authentication"
+msgstr "Globálne TOTP pred autentifikáciou"
+
+#: gatekeeper/forms.py:103
msgid "OIDC Provider URL"
msgstr "URL poskytovateľa OIDC"
-#: gatekeeper/forms.py:103
+#: gatekeeper/forms.py:104
msgid "OIDC Client ID"
msgstr "ID klienta OIDC"
-#: gatekeeper/forms.py:104
+#: gatekeeper/forms.py:105
msgid "OIDC Client Secret"
msgstr "Secret klienta OIDC"
-#: gatekeeper/forms.py:155
+#: gatekeeper/forms.py:157
msgid "TOTP secret must be empty for Local Password authentication."
msgstr "TOTP tajomstvo musí byť prázdne pre autentifikáciu miestnym heslom."
-#: gatekeeper/forms.py:157
+#: gatekeeper/forms.py:159
msgid "TOTP validation PIN must be empty for Local Password authentication."
msgstr ""
"Validačný PIN TOTP musí byť prázdny pre autentifikáciu miestnym heslom."
-#: gatekeeper/forms.py:159
+#: gatekeeper/forms.py:161
msgid "OIDC fields must be empty for Local Password authentication."
msgstr "Polia OIDC musia byť prázdne pre autentifikáciu miestnym heslom."
-#: gatekeeper/forms.py:165
+#: gatekeeper/forms.py:167
msgid "Only one Local Password authentication method can be configured."
msgstr ""
"Je možné nakonfigurovať iba jednu metódu autentifikácie miestnym heslom."
-#: gatekeeper/forms.py:168
+#: gatekeeper/forms.py:170
msgid "OIDC fields must be empty for TOTP authentication."
msgstr "Polia OIDC musia byť prázdne pre autentifikáciu TOTP."
-#: gatekeeper/forms.py:170
+#: gatekeeper/forms.py:172
msgid "TOTP secret is required for TOTP authentication."
msgstr "TOTP tajomstvo je povinné pre autentifikáciu TOTP."
-#: gatekeeper/forms.py:174
+#: gatekeeper/forms.py:176
msgid "Please provide a PIN to validate the TOTP secret."
msgstr "Na overenie tajomstva TOTP zadajte PIN."
-#: gatekeeper/forms.py:179
+#: gatekeeper/forms.py:181
msgid "Invalid TOTP PIN."
msgstr "Neplatný PIN TOTP."
-#: gatekeeper/forms.py:181
+#: gatekeeper/forms.py:183
msgid "Invalid TOTP secret format. Must be a valid Base32 string."
msgstr "Neplatný formát tajomstva TOTP. Musí to byť platný reťazec Base32."
-#: gatekeeper/forms.py:184
+#: gatekeeper/forms.py:186
msgid "TOTP secret must be empty for OIDC authentication."
msgstr "TOTP tajomstvo musí byť prázdne pre autentifikáciu OIDC."
-#: gatekeeper/forms.py:186
+#: gatekeeper/forms.py:188
msgid "TOTP validation PIN must be empty for OIDC authentication."
msgstr "Validačný PIN TOTP musí byť prázdny pre autentifikáciu OIDC."
-#: gatekeeper/forms.py:195 gatekeeper/forms.py:237 gatekeeper/forms.py:268
+#: gatekeeper/forms.py:197 gatekeeper/forms.py:239 gatekeeper/forms.py:270
msgid "Authentication Method"
msgstr "Metóda autentifikácie"
-#: gatekeeper/forms.py:197 templates/gatekeeper/gatekeeper_list.html:257
+#: gatekeeper/forms.py:199 templates/gatekeeper/gatekeeper_list.html:257
msgid "Prefix Length"
msgstr "Dĺžka prefixu"
-#: gatekeeper/forms.py:198 templates/firewall/firewall_rule_list.html:47
+#: gatekeeper/forms.py:200 templates/firewall/firewall_rule_list.html:47
#: templates/firewall/manage_firewall_rule.html:360
#: templates/gatekeeper/gatekeeper_list.html:258
msgid "Action"
msgstr "Akcia"
-#: gatekeeper/forms.py:238 templates/gatekeeper/gatekeeper_list.html:221
+#: gatekeeper/forms.py:240 templates/gatekeeper/gatekeeper_list.html:221
msgid "Domain"
msgstr "Doména"
@@ -1338,15 +1344,15 @@ msgstr "Zoznam IP adries"
msgid "Shared/global TOTP secret key"
msgstr "Zdieľaný/globálny tajný kľúč TOTP"
-#: gatekeeper/models.py:68
+#: gatekeeper/models.py:69
msgid "Password for local authentication (leave blank if not using)"
msgstr "Heslo pre miestnu autentifikáciu (ak nepoužívate, nechajte prázdne)"
-#: gatekeeper/models.py:69
+#: gatekeeper/models.py:70
msgid "Per-user TOTP secret key"
msgstr "Tajný kľúč TOTP pre jednotlivých používateľov"
-#: gatekeeper/models.py:108 templates/gatekeeper/gatekeeper_list.html:270
+#: gatekeeper/models.py:109 templates/gatekeeper/gatekeeper_list.html:270
msgid "Allow"
msgstr "Povoliť"
@@ -1415,116 +1421,125 @@ msgstr "Metóda autentifikácie bola úspešne uložená."
#: gatekeeper/views.py:175
msgid ""
"\n"
-" Authentication Types
\n"
+" Authentication Types
\n"
" Select how users will authenticate through this method.
\n"
-" \n"
-" - Local Password: Users will authenticate "
-"using a standard username and password stored locally. Only one of this type "
-"can be created.
\n"
-" - TOTP (Time-Based One-Time Password): Users "
-"will need to enter a rotating token from an authenticator app. Requires "
-"setting a Global TOTP Secret.
\n"
-" - OIDC (OpenID Connect): Users will "
-"authenticate via an external identity provider (like Keycloak, Google, or "
-"Authelia). Requires Provider URL, Client ID, and Client Secret.
\n"
-"
\n"
+" \n"
+" Local Password
\n"
+" Users will authenticate using a standard username and password "
+"stored locally. Only one of this type can be created.
\n"
+" \n"
+" OIDC (OpenID Connect)
\n"
+" Users will authenticate via an external identity provider (like "
+"Keycloak, Google, or Authelia). Requires Provider URL, Client ID, and Client "
+"Secret.
\n"
+" \n"
+" TOTP (Time-Based One-Time Password)
\n"
+" Users will need to enter a rotating token from an authenticator "
+"app. Requires setting a Global TOTP Secret.
If Global TOTP "
+"Before Authentication is enabled, the PIN is required before the "
+"username and password to help combat bruteforce attacks.
\n"
" "
msgstr ""
"\n"
-" Typy autentifikácie
\n"
+" Typy autentifikácie
\n"
" Vyberte, ako sa budú používatelia autentifikovať prostredníctvom "
"tejto metódy.
\n"
-" \n"
-" - Miestne heslo: Používatelia sa budú "
-"autentifikovať pomocou štandardného používateľského mena a hesla uloženého "
-"lokálne. Je možné vytvoriť iba jeden tento typ.
\n"
-" - TOTP (časovo založené jednorazové heslo): "
-"Používatelia budú musieť zadať rotujúci token z autentifikačnej aplikácie. "
-"Vyžaduje nastavenie globálneho tajomstva TOTP.
\n"
-" - OIDC (OpenID Connect): Používatelia sa budú "
-"autentifikovať prostredníctvom externého poskytovateľa identity (ako "
-"Keycloak, Google alebo Authelia). Vyžaduje URL poskytovateľa, ID klienta a "
-"Secret klienta.
\n"
-"
\n"
+" \n"
+" Miestne heslo
\n"
+" Používatelia sa budú autentifikovať pomocou štandardného "
+"používateľského mena a hesla uloženého lokálne. Je možné vytvoriť iba jeden "
+"tento typ.
\n"
+" \n"
+" OIDC (OpenID Connect)
\n"
+" Používatelia sa budú autentifikovať prostredníctvom externého "
+"poskytovateľa identity (ako Keycloak, Google alebo Authelia). Vyžaduje URL "
+"poskytovateľa, ID klienta a Secret klienta.
\n"
+" \n"
+" TOTP (Časovo založené jednorazové heslo)
\n"
+" Používatelia budú musieť zadať rotujúci token z autentifikačnej "
+"aplikácie. Vyžaduje nastavenie globálneho tajomstva TOTP.
Ak je "
+"povolené Globálne TOTP pred autentifikáciou, PIN sa "
+"vyžaduje pred používateľským menom a heslom, čo pomáha bojovať proti "
+"útokom hrubou silou.
\n"
" "
-#: gatekeeper/views.py:206
+#: gatekeeper/views.py:210
msgid "Authentication Method deleted successfully."
msgstr "Metóda autentifikácie bola úspešne odstránená."
-#: gatekeeper/views.py:211
+#: gatekeeper/views.py:215
msgid "Delete Authentication Method"
msgstr "Odstrániť metódu autentifikácie"
-#: gatekeeper/views.py:213
+#: gatekeeper/views.py:217
#, python-format
msgid "Are you sure you want to delete the authentication method \"%(name)s\"?"
msgstr "Naozaj chcete odstrániť metódu autentifikácie \"%(name)s\"?"
-#: gatekeeper/views.py:263
+#: gatekeeper/views.py:267
msgid "Edit Allowed Domain"
msgstr "Upraviť povolenú doménu"
-#: gatekeeper/views.py:266 templates/gatekeeper/gatekeeper_list.html:186
+#: gatekeeper/views.py:270 templates/gatekeeper/gatekeeper_list.html:186
msgid "Add Allowed Domain"
msgstr "Pridať povolenú doménu"
-#: gatekeeper/views.py:273
+#: gatekeeper/views.py:277
msgid "Allowed Domain saved successfully."
msgstr "Povolená doména bola úspešne uložená."
-#: gatekeeper/views.py:295
+#: gatekeeper/views.py:299
msgid "Allowed Domain deleted successfully."
msgstr "Povolená doména bola úspešne odstránená."
-#: gatekeeper/views.py:300
+#: gatekeeper/views.py:304
msgid "Delete Allowed Domain"
msgstr "Odstrániť povolenú doménu"
-#: gatekeeper/views.py:302
+#: gatekeeper/views.py:306
#, python-format
msgid "Are you sure you want to delete the allowed domain \"%(domain)s\"?"
msgstr "Naozaj chcete odstrániť povolenú doménu \"%(domain)s\"?"
-#: gatekeeper/views.py:316
+#: gatekeeper/views.py:320
msgid "Edit Allowed Email"
msgstr "Upraviť povolený e-mail"
-#: gatekeeper/views.py:319 templates/gatekeeper/gatekeeper_list.html:183
+#: gatekeeper/views.py:323 templates/gatekeeper/gatekeeper_list.html:183
msgid "Add Allowed Email"
msgstr "Pridať povolený e-mail"
-#: gatekeeper/views.py:326
+#: gatekeeper/views.py:330
msgid "Allowed Email saved successfully."
msgstr "Povolený e-mail bol úspešne uložený."
-#: gatekeeper/views.py:348
+#: gatekeeper/views.py:352
msgid "Allowed Email deleted successfully."
msgstr "Povolený e-mail bol úspešne odstránený."
-#: gatekeeper/views.py:353
+#: gatekeeper/views.py:357
msgid "Delete Allowed Email"
msgstr "Odstrániť povolený e-mail"
-#: gatekeeper/views.py:355
+#: gatekeeper/views.py:359
#, python-format
msgid "Are you sure you want to delete the allowed email \"%(email)s\"?"
msgstr "Naozaj chcete odstrániť povolený e-mail \"%(email)s\"?"
-#: gatekeeper/views.py:369
+#: gatekeeper/views.py:373
msgid "Edit IP Address"
msgstr "Upraviť IP adresu"
-#: gatekeeper/views.py:372 templates/gatekeeper/gatekeeper_list.html:247
+#: gatekeeper/views.py:376 templates/gatekeeper/gatekeeper_list.html:247
#: templates/wireguard/wireguard_manage_peer.html:171
msgid "Add IP Address"
msgstr "Pridať IP adresu"
-#: gatekeeper/views.py:379
+#: gatekeeper/views.py:383
msgid "IP Address saved successfully."
msgstr "IP adresa bola úspešne uložená."
-#: gatekeeper/views.py:384
+#: gatekeeper/views.py:388
msgid ""
"\n"
" IP Address List
\n"
@@ -1571,15 +1586,15 @@ msgstr ""
"(napr. „Kancelárska sieť“, „Blokovaný útočník“).\n"
" "
-#: gatekeeper/views.py:420
+#: gatekeeper/views.py:424
msgid "IP Address deleted successfully."
msgstr "IP adresa bola úspešne odstránená."
-#: gatekeeper/views.py:425
+#: gatekeeper/views.py:429
msgid "Delete IP Address"
msgstr "Odstrániť IP adresu"
-#: gatekeeper/views.py:427
+#: gatekeeper/views.py:431
#, python-format
msgid "Are you sure you want to delete the IP address \"%(address)s\"?"
msgstr "Naozaj chcete odstrániť IP adresu \"%(address)s\"?"