diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo
index efc587e..526f1d3 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 22e6d56..3a63179 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-14 11:54-0300\n"
+"POT-Creation-Date: 2026-03-15 17:20-0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -38,12 +38,12 @@ msgstr "Zurück"
#: templates/app_gateway/application_details.html:125
#: templates/firewall/manage_firewall_rule.html:382
#: templates/firewall/manage_redirect_rule.html:86
-#: templates/gatekeeper/gatekeeper_list.html:77
-#: templates/gatekeeper/gatekeeper_list.html:120
-#: templates/gatekeeper/gatekeeper_list.html:165
-#: templates/gatekeeper/gatekeeper_list.html:213
-#: templates/gatekeeper/gatekeeper_list.html:230
-#: templates/gatekeeper/gatekeeper_list.html:282
+#: templates/gatekeeper/gatekeeper_list.html:93
+#: templates/gatekeeper/gatekeeper_list.html:136
+#: templates/gatekeeper/gatekeeper_list.html:181
+#: templates/gatekeeper/gatekeeper_list.html:229
+#: templates/gatekeeper/gatekeeper_list.html:246
+#: templates/gatekeeper/gatekeeper_list.html:298
#: templates/scheduler/scheduleprofile_form.html:127
#: templates/scheduler/scheduleprofile_list.html:29
#: templates/wireguard/peer_list/peer_preview_modal.html:109
@@ -65,11 +65,11 @@ msgstr ""
"wird sofort ungültig."
#: api_v2/forms.py:63 app_gateway/forms.py:40 app_gateway/forms.py:92
-#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:226
-#: app_gateway/forms.py:267 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:139 gatekeeper/forms.py:226
-#: gatekeeper/forms.py:256 gatekeeper/forms.py:287
+#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:237
+#: app_gateway/forms.py:278 cluster/forms.py:67 cluster/forms.py:124
+#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:70
+#: gatekeeper/forms.py:150 gatekeeper/forms.py:212 gatekeeper/forms.py:299
+#: gatekeeper/forms.py:329 gatekeeper/forms.py:360
#: routing_templates/forms.py:71 scheduler/forms.py:102
#: templates/firewall/manage_firewall_rule.html:379
#: templates/firewall/manage_firewall_settings.html:59
@@ -83,13 +83,13 @@ msgid "Save"
msgstr "Speichern"
#: api_v2/models.py:10 app_gateway/forms.py:18 app_gateway/forms.py:106
-#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:99
+#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:174
#: routing_templates/forms.py:28 templates/api_v2/api_documentation.html:47
#: templates/api_v2/list.html:8 templates/app_gateway/app_gateway_list.html:58
#: templates/app_gateway/app_gateway_list.html:138
#: templates/app_gateway/application_details.html:26
#: templates/cluster/workers_list.html:8 templates/dns/static_host_list.html:68
-#: templates/gatekeeper/gatekeeper_list.html:149
+#: templates/gatekeeper/gatekeeper_list.html:165
#: templates/routing_templates/list.html:8
#: templates/scheduler/scheduleprofile_list.html:13
#: templates/user_manager/peer_group_list.html:8
@@ -133,10 +133,10 @@ msgstr "Aktiviert"
#: app_gateway/views.py:293 app_gateway/views.py:328 app_gateway/views.py:354
#: app_gateway/views.py:404 app_gateway/views.py:432 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: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
+#: gatekeeper/views.py:48 gatekeeper/views.py:98 gatekeeper/views.py:121
+#: gatekeeper/views.py:151 gatekeeper/views.py:174 gatekeeper/views.py:222
+#: gatekeeper/views.py:281 gatekeeper/views.py:311 gatekeeper/views.py:334
+#: gatekeeper/views.py:364 gatekeeper/views.py:387 gatekeeper/views.py:436
#: templates/access_denied.html:9
msgid "Access Denied"
msgstr "Zugriff verweigert"
@@ -218,9 +218,9 @@ msgid "Upstream"
msgstr "Upstream"
#: app_gateway/forms.py:41 app_gateway/forms.py:93 app_gateway/forms.py:137
-#: app_gateway/forms.py:155 app_gateway/forms.py:227 app_gateway/forms.py:268
-#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:140
-#: gatekeeper/forms.py:227 gatekeeper/forms.py:257 gatekeeper/forms.py:288
+#: app_gateway/forms.py:155 app_gateway/forms.py:238 app_gateway/forms.py:279
+#: gatekeeper/forms.py:71 gatekeeper/forms.py:151 gatekeeper/forms.py:213
+#: gatekeeper/forms.py:300 gatekeeper/forms.py:330 gatekeeper/forms.py:361
#: scheduler/forms.py:103
#: templates/app_gateway/access_policy_type_select.html:50
#: templates/generic_delete_confirmation.html:19
@@ -266,20 +266,28 @@ msgstr "Erlaubte Gruppen"
msgid "Authentication Methods"
msgstr "Authentifizierungsmethoden"
-#: app_gateway/forms.py:185
+#: app_gateway/forms.py:188
msgid "Cannot select more than one Local Password authentication method."
msgstr ""
"Es kann nicht mehr als eine lokale Passwort-Authentifizierungsmethode "
"ausgewählt werden."
-#: app_gateway/forms.py:189
+#: app_gateway/forms.py:192
msgid ""
"Cannot select more than one OpenID Connect (OIDC) authentication method."
msgstr ""
"Es kann nicht mehr als eine OpenID Connect (OIDC)-Authentifizierungsmethode "
"ausgewählt werden."
-#: app_gateway/forms.py:193
+#: app_gateway/forms.py:196
+#, fuzzy
+#| msgid "Cannot select more than one Local Password authentication method."
+msgid "Cannot select more than one TOTP authentication method."
+msgstr ""
+"Es kann nicht mehr als eine lokale Passwort-Authentifizierungsmethode "
+"ausgewählt werden."
+
+#: app_gateway/forms.py:200
msgid ""
"Cannot select both Local Password and OpenID Connect (OIDC) authentication "
"methods."
@@ -287,7 +295,19 @@ msgstr ""
"Die Authentifizierungsmethoden \"Lokales Passwort\" und OpenID Connect "
"(OIDC) können nicht gleichzeitig ausgewählt werden."
-#: app_gateway/forms.py:197
+#: app_gateway/forms.py:204
+#, fuzzy
+#| msgid ""
+#| "Cannot select both Local Password and OpenID Connect (OIDC) "
+#| "authentication methods."
+msgid ""
+"TOTP must be combined with a Local Password or OpenID Connect authentication "
+"method."
+msgstr ""
+"Die Authentifizierungsmethoden \"Lokales Passwort\" und OpenID Connect "
+"(OIDC) können nicht gleichzeitig ausgewählt werden."
+
+#: app_gateway/forms.py:208
msgid ""
"At least one user group must be selected when using Local Password "
"authentication."
@@ -295,31 +315,31 @@ msgstr ""
"Bei Verwendung der lokalen Passwort-Authentifizierung muss mindestens eine "
"Benutzergruppe ausgewählt werden."
-#: app_gateway/forms.py:201
+#: app_gateway/forms.py:212
msgid "User groups can only be used with Local Password authentication."
msgstr ""
"Benutzergruppen können nur mit der lokalen Passwort-Authentifizierung "
"verwendet werden."
-#: app_gateway/forms.py:211 templates/app_gateway/app_gateway_list.html:62
+#: app_gateway/forms.py:222 templates/app_gateway/app_gateway_list.html:62
#: templates/app_gateway/application_details.html:31
#: templates/firewall/firewall_nav_tabs.html:15
msgid "Default Policy"
msgstr "Standard‑Richtlinie"
-#: app_gateway/forms.py:240 templates/app_gateway/application_details.html:105
+#: app_gateway/forms.py:251 templates/app_gateway/application_details.html:105
msgid "Route Name"
msgstr "Routenname"
-#: app_gateway/forms.py:241 templates/app_gateway/application_details.html:106
+#: app_gateway/forms.py:252 templates/app_gateway/application_details.html:106
msgid "Path Prefix"
msgstr "Pfadpräfix"
-#: app_gateway/forms.py:242 templates/app_gateway/application_details.html:107
+#: app_gateway/forms.py:253 templates/app_gateway/application_details.html:107
msgid "Policy"
msgstr "Richtlinie"
-#: app_gateway/forms.py:243 templates/app_gateway/application_details.html:108
+#: app_gateway/forms.py:254 templates/app_gateway/application_details.html:108
msgid "Order"
msgstr "Reihenfolge"
@@ -337,9 +357,9 @@ msgstr "Öffentlich"
msgid "Protected"
msgstr "Geschützt"
-#: app_gateway/models.py:45 gatekeeper/models.py:110
+#: app_gateway/models.py:45 gatekeeper/models.py:108
#: templates/app_gateway/access_policy_type_select.html:41
-#: templates/gatekeeper/gatekeeper_list.html:272
+#: templates/gatekeeper/gatekeeper_list.html:288
msgid "Deny"
msgstr "Verweigern"
@@ -627,11 +647,11 @@ msgid "Are you sure you want to delete the route \"%(name)s\" (%(path)s)?"
msgstr ""
"Sind Sie sicher, dass Sie die Route \"%(name)s\" (%(path)s) löschen möchten?"
-#: app_gateway/views.py:444
+#: app_gateway/views.py:443
msgid "Configuration exported successfully."
msgstr "Konfiguration erfolgreich exportiert."
-#: app_gateway/views.py:446
+#: app_gateway/views.py:445
msgid ""
"Caddy is not active. Configuration files were exported for debugging "
"purposes."
@@ -643,13 +663,13 @@ msgstr ""
msgid "IP Lock"
msgstr "IP-Sperre"
-#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:198
+#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:271
#: templates/cluster/workers_list.html:10
#: templates/dns/static_host_list.html:18
#: templates/firewall/manage_redirect_rule.html:43
#: templates/firewall/manage_redirect_rule.html:67
#: templates/firewall/manage_redirect_rule.html:68
-#: templates/gatekeeper/gatekeeper_list.html:256
+#: templates/gatekeeper/gatekeeper_list.html:272
#: templates/wireguard/wireguard_status.html:45
msgid "IP Address"
msgstr "IP‑Adresse"
@@ -926,7 +946,7 @@ msgstr "Statischer DNS"
msgid "Invalid hostname."
msgstr "Ungültiger Hostname."
-#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:201
+#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:274
#: templates/api_v2/api_documentation.html:51
#: templates/dns/static_host_list.html:69
#: templates/firewall/manage_redirect_rule.html:18
@@ -1261,43 +1281,29 @@ msgstr "Firewall‑Einstellungen verwalten"
msgid "Firewall settings saved successfully"
msgstr "Firewall‑Einstellungen erfolgreich gespeichert"
-#: gatekeeper/forms.py:17 templates/accounts/login.html:14
-#: templates/gatekeeper/gatekeeper_list.html:61
-#: templates/user_manager/list.html:8 user_manager/forms.py:13
-#: vpn_invite/forms.py:281
-msgid "Username"
-msgstr "Benutzername"
-
-#: 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
-msgid "Email"
-msgstr "E‑Mail"
-
-#: gatekeeper/forms.py:19 templates/accounts/login.html:23
+#: gatekeeper/forms.py:17 templates/accounts/login.html:23
#: templates/vpn_invite/invite_settings.html:19 user_manager/forms.py:14
#: vpn_invite/forms.py:282
msgid "Password"
msgstr "Passwort"
#: gatekeeper/forms.py:20
-msgid "TOTP Secret"
-msgstr "TOTP-Geheimnis"
+msgid ""
+"Minimum 8 characters, with at least one uppercase letter, one lowercase "
+"letter, and one number."
+msgstr ""
-#: gatekeeper/forms.py:55 templates/gatekeeper/gatekeeper_list.html:104
-msgid "Group Name"
-msgstr "Gruppenname"
+#: gatekeeper/forms.py:23
+#, fuzzy
+#| msgid "Random Password"
+msgid "Confirm Password"
+msgstr "Zufallspasswort"
-#: gatekeeper/forms.py:56 templates/gatekeeper/gatekeeper_list.html:105
-msgid "Members"
-msgstr "Mitglieder"
-
-#: gatekeeper/forms.py:86
+#: gatekeeper/forms.py:28 gatekeeper/forms.py:161
msgid "TOTP Validation PIN"
msgstr "TOTP-Validierungs-PIN"
-#: gatekeeper/forms.py:89
+#: gatekeeper/forms.py:31 gatekeeper/forms.py:164
msgid ""
"Enter a 6-digit PIN generated by your authenticator app to validate the "
"secret."
@@ -1305,98 +1311,154 @@ msgstr ""
"Geben Sie eine 6-stellige PIN ein, die von Ihrer Authenticator-App generiert "
"wurde, um das Geheimnis zu validieren."
-#: gatekeeper/forms.py:100
+#: gatekeeper/forms.py:38 templates/accounts/login.html:14
+#: templates/gatekeeper/gatekeeper_list.html:61
+#: templates/user_manager/list.html:8 user_manager/forms.py:13
+#: vpn_invite/forms.py:281
+msgid "Username"
+msgstr "Benutzername"
+
+#: gatekeeper/forms.py:39 gatekeeper/forms.py:344
+#: templates/gatekeeper/gatekeeper_list.html:62
+#: templates/gatekeeper/gatekeeper_list.html:220
+#: templates/wireguard/peer_list/peer_preview_modal.html:103
+msgid "Email"
+msgstr "E‑Mail"
+
+#: gatekeeper/forms.py:40
+msgid "TOTP Secret"
+msgstr "TOTP-Geheimnis"
+
+#: gatekeeper/forms.py:87
+#, fuzzy
+#| msgid "Port is required."
+msgid "Password is required."
+msgstr "Port ist erforderlich."
+
+#: gatekeeper/forms.py:90 user_manager/forms.py:127
+msgid "Password must be at least 8 characters long."
+msgstr "Das Passwort muss mindestens 8 Zeichen lang sein."
+
+#: gatekeeper/forms.py:92
+#, fuzzy
+#| msgid "Password must be at least 8 characters long."
+msgid "Password must contain at least one lowercase letter."
+msgstr "Das Passwort muss mindestens 8 Zeichen lang sein."
+
+#: gatekeeper/forms.py:94
+#, fuzzy
+#| msgid "Password must be at least 8 characters long."
+msgid "Password must contain at least one uppercase letter."
+msgstr "Das Passwort muss mindestens 8 Zeichen lang sein."
+
+#: gatekeeper/forms.py:96
+#, fuzzy
+#| msgid "Password must be at least 8 characters long."
+msgid "Password must contain at least one number."
+msgstr "Das Passwort muss mindestens 8 Zeichen lang sein."
+
+#: gatekeeper/forms.py:98
+#, fuzzy
+#| msgid "Password Confirmation"
+msgid "Passwords do not match."
+msgstr "Passwortbestätigung"
+
+#: gatekeeper/forms.py:103 gatekeeper/forms.py:249
+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:108 gatekeeper/forms.py:254
+msgid "Invalid TOTP PIN."
+msgstr "Ungültige TOTP-PIN."
+
+#: gatekeeper/forms.py:110 gatekeeper/forms.py:256
+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:130 templates/gatekeeper/gatekeeper_list.html:120
+msgid "Group Name"
+msgstr "Gruppenname"
+
+#: gatekeeper/forms.py:131 templates/gatekeeper/gatekeeper_list.html:121
+msgid "Members"
+msgstr "Mitglieder"
+
+#: gatekeeper/forms.py:175
msgid "Authentication Type"
msgstr "Authentifizierungstyp"
-#: gatekeeper/forms.py:101
+#: gatekeeper/forms.py:176
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
+#: gatekeeper/forms.py:177
msgid "OIDC Provider URL"
msgstr "OIDC-Anbieter-URL"
-#: gatekeeper/forms.py:104
+#: gatekeeper/forms.py:178
msgid "OIDC Client ID"
msgstr "OIDC-Client-ID"
-#: gatekeeper/forms.py:105
+#: gatekeeper/forms.py:179
msgid "OIDC Client Secret"
msgstr "OIDC-Client-Geheimnis"
-#: gatekeeper/forms.py:157
+#: gatekeeper/forms.py:230
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:159
+#: gatekeeper/forms.py:232
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:161
+#: gatekeeper/forms.py:234
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:167
+#: gatekeeper/forms.py:240
msgid "Only one Local Password authentication method can be configured."
msgstr ""
"Es kann nur eine Authentifizierungsmethode mit lokalem Passwort konfiguriert "
"werden."
-#: gatekeeper/forms.py:170
+#: gatekeeper/forms.py:243
msgid "OIDC fields must be empty for TOTP authentication."
msgstr "OIDC-Felder müssen für die TOTP-Authentifizierung leer sein."
-#: gatekeeper/forms.py:172
+#: gatekeeper/forms.py:245
msgid "TOTP secret is required for TOTP authentication."
msgstr "Das TOTP-Geheimnis ist für die TOTP-Authentifizierung erforderlich."
-#: 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:181
-msgid "Invalid TOTP PIN."
-msgstr "Ungültige TOTP-PIN."
-
-#: 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:186
+#: gatekeeper/forms.py:259
msgid "TOTP secret must be empty for OIDC authentication."
msgstr "Das TOTP-Geheimnis muss für die OIDC-Authentifizierung leer sein."
-#: gatekeeper/forms.py:188
+#: gatekeeper/forms.py:261
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:197 gatekeeper/forms.py:239 gatekeeper/forms.py:270
+#: gatekeeper/forms.py:270 gatekeeper/forms.py:312 gatekeeper/forms.py:343
msgid "Authentication Method"
msgstr "Authentifizierungsmethode"
-#: gatekeeper/forms.py:199 templates/gatekeeper/gatekeeper_list.html:257
+#: gatekeeper/forms.py:272 templates/gatekeeper/gatekeeper_list.html:273
msgid "Prefix Length"
msgstr "Präfixlänge"
-#: gatekeeper/forms.py:200 templates/firewall/firewall_rule_list.html:47
+#: gatekeeper/forms.py:273 templates/firewall/firewall_rule_list.html:47
#: templates/firewall/manage_firewall_rule.html:360
-#: templates/gatekeeper/gatekeeper_list.html:258
+#: templates/gatekeeper/gatekeeper_list.html:274
msgid "Action"
msgstr "Aktion"
-#: gatekeeper/forms.py:240 templates/gatekeeper/gatekeeper_list.html:221
+#: gatekeeper/forms.py:313 templates/gatekeeper/gatekeeper_list.html:237
msgid "Domain"
msgstr "Domäne"
@@ -1420,16 +1482,16 @@ msgstr "IP-Adressliste"
msgid "Shared/global TOTP secret key"
msgstr "Gemeinsamer/globaler TOTP-Geheimschlüssel"
-#: gatekeeper/models.py:69
+#: gatekeeper/models.py:68
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:71
+#: gatekeeper/models.py:69
msgid "Per-user TOTP secret key"
msgstr "Benutzerspezifischer TOTP-Geheimschlüssel"
-#: gatekeeper/models.py:110 templates/gatekeeper/gatekeeper_list.html:270
+#: gatekeeper/models.py:108 templates/gatekeeper/gatekeeper_list.html:286
msgid "Allow"
msgstr "Zulassen"
@@ -1445,58 +1507,103 @@ msgstr "Gatekeeper-Benutzer erstellen"
msgid "Gatekeeper User saved successfully."
msgstr "Gatekeeper-Benutzer erfolgreich gespeichert."
-#: gatekeeper/views.py:86
+#: gatekeeper/views.py:69
+msgid ""
+"\n"
+" Gatekeeper User
\n"
+" Gatekeeper users are used for authenticating against protected "
+"applications managed by this gateway.
\n"
+"\n"
+" Password
\n"
+" Required when creating a user. When editing, leave both password "
+"fields blank to keep the current password.\n"
+" Passwords are stored using Argon2id hashing.
\n"
+"\n"
+" TOTP Secret
\n"
+" Optional per-user TOTP secret. When set, this user will "
+"authenticate using their own secret instead of the\n"
+" global TOTP secret configured on the Authentication Method. Use the "
+"buttons below the field to generate a\n"
+" random secret and scan the QR code with your authenticator app. "
+"Validate the secret by entering the current\n"
+" 6-digit PIN before saving.
\n"
+" "
+msgstr ""
+
+#: gatekeeper/views.py:106
msgid "Gatekeeper User deleted successfully."
msgstr "Gatekeeper-Benutzer erfolgreich gelöscht."
-#: gatekeeper/views.py:91
+#: gatekeeper/views.py:111
msgid "Delete Gatekeeper User"
msgstr "Gatekeeper-Benutzer löschen"
-#: gatekeeper/views.py:93
+#: gatekeeper/views.py:113
#, python-format
msgid "Are you sure you want to delete the user \"%(username)s\"?"
msgstr ""
"Sind Sie sicher, dass Sie den Benutzer \"%(username)s\" löschen möchten?"
-#: gatekeeper/views.py:107
+#: gatekeeper/views.py:127
msgid "Edit Gatekeeper Group"
msgstr "Gatekeeper-Gruppe bearbeiten"
-#: gatekeeper/views.py:110
+#: gatekeeper/views.py:130
msgid "Create Gatekeeper Group"
msgstr "Gatekeeper-Gruppe erstellen"
-#: gatekeeper/views.py:117
+#: gatekeeper/views.py:137
msgid "Gatekeeper Group saved successfully."
msgstr "Gatekeeper-Gruppe erfolgreich gespeichert."
-#: gatekeeper/views.py:139
+#: gatekeeper/views.py:159
msgid "Gatekeeper Group deleted successfully."
msgstr "Gatekeeper-Gruppe erfolgreich gelöscht."
-#: gatekeeper/views.py:144
+#: gatekeeper/views.py:164
msgid "Delete Gatekeeper Group"
msgstr "Gatekeeper-Gruppe löschen"
-#: gatekeeper/views.py:146
+#: gatekeeper/views.py:166
#, python-format
msgid "Are you sure you want to delete the group \"%(name)s\"?"
msgstr "Sind Sie sicher, dass Sie die Gruppe \"%(name)s\" löschen möchten?"
-#: gatekeeper/views.py:160
+#: gatekeeper/views.py:180
msgid "Edit Authentication Method"
msgstr "Authentifizierungsmethode bearbeiten"
-#: gatekeeper/views.py:163
+#: gatekeeper/views.py:183
msgid "Create Authentication Method"
msgstr "Authentifizierungsmethode erstellen"
-#: gatekeeper/views.py:170
+#: gatekeeper/views.py:190
msgid "Authentication Method saved successfully."
msgstr "Authentifizierungsmethode erfolgreich gespeichert."
-#: gatekeeper/views.py:175
+#: gatekeeper/views.py:195
+#, fuzzy
+#| msgid ""
+#| "\n"
+#| " Authentication Types
\n"
+#| " Select how users will authenticate through this method.
\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"
+#| " "
msgid ""
"\n"
" Authentication Types
\n"
@@ -1513,9 +1620,8 @@ msgid ""
" \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"
+"app. If a user does not have a personal TOTP configured, the Global "
+"TOTP Secret will be used instead.
\n"
" "
msgstr ""
"\n"
@@ -1541,88 +1647,88 @@ msgstr ""
"Force-Angriffe zu bekämpfen.\n"
" "
-#: gatekeeper/views.py:210
+#: gatekeeper/views.py:230
msgid "Authentication Method deleted successfully."
msgstr "Authentifizierungsmethode erfolgreich gelöscht."
-#: gatekeeper/views.py:215
+#: gatekeeper/views.py:235
msgid "Delete Authentication Method"
msgstr "Authentifizierungsmethode löschen"
-#: gatekeeper/views.py:217
+#: gatekeeper/views.py:237
#, 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:267
+#: gatekeeper/views.py:287
msgid "Edit Allowed Domain"
msgstr "Zulässige Domäne bearbeiten"
-#: gatekeeper/views.py:270 templates/gatekeeper/gatekeeper_list.html:186
+#: gatekeeper/views.py:290 templates/gatekeeper/gatekeeper_list.html:202
msgid "Add Allowed Domain"
msgstr "Zulässige Domäne hinzufügen"
-#: gatekeeper/views.py:277
+#: gatekeeper/views.py:297
msgid "Allowed Domain saved successfully."
msgstr "Zulässige Domäne erfolgreich gespeichert."
-#: gatekeeper/views.py:299
+#: gatekeeper/views.py:319
msgid "Allowed Domain deleted successfully."
msgstr "Zulässige Domäne erfolgreich gelöscht."
-#: gatekeeper/views.py:304
+#: gatekeeper/views.py:324
msgid "Delete Allowed Domain"
msgstr "Zulässige Domäne löschen"
-#: gatekeeper/views.py:306
+#: gatekeeper/views.py:326
#, 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:320
+#: gatekeeper/views.py:340
msgid "Edit Allowed Email"
msgstr "Zulässige E-Mail bearbeiten"
-#: gatekeeper/views.py:323 templates/gatekeeper/gatekeeper_list.html:183
+#: gatekeeper/views.py:343 templates/gatekeeper/gatekeeper_list.html:199
msgid "Add Allowed Email"
msgstr "Zulässige E-Mail hinzufügen"
-#: gatekeeper/views.py:330
+#: gatekeeper/views.py:350
msgid "Allowed Email saved successfully."
msgstr "Zulässige E-Mail erfolgreich gespeichert."
-#: gatekeeper/views.py:352
+#: gatekeeper/views.py:372
msgid "Allowed Email deleted successfully."
msgstr "Zulässige E-Mail erfolgreich gelöscht."
-#: gatekeeper/views.py:357
+#: gatekeeper/views.py:377
msgid "Delete Allowed Email"
msgstr "Zulässige E-Mail löschen"
-#: gatekeeper/views.py:359
+#: gatekeeper/views.py:379
#, 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:373
+#: gatekeeper/views.py:393
msgid "Edit IP Address"
msgstr "IP-Adresse bearbeiten"
-#: gatekeeper/views.py:376 templates/gatekeeper/gatekeeper_list.html:247
+#: gatekeeper/views.py:396 templates/gatekeeper/gatekeeper_list.html:263
#: templates/wireguard/wireguard_manage_peer.html:171
msgid "Add IP Address"
msgstr "IP‑Adresse hinzufügen"
-#: gatekeeper/views.py:383
+#: gatekeeper/views.py:403
msgid "IP Address saved successfully."
msgstr "IP-Adresse erfolgreich gespeichert."
-#: gatekeeper/views.py:388
+#: gatekeeper/views.py:408
msgid ""
"\n"
" IP Address List
\n"
@@ -1669,15 +1775,15 @@ msgstr ""
"„Büronetzwerk“, „Blockierter Angreifer“).\n"
" "
-#: gatekeeper/views.py:424
+#: gatekeeper/views.py:444
msgid "IP Address deleted successfully."
msgstr "IP-Adresse erfolgreich gelöscht."
-#: gatekeeper/views.py:429
+#: gatekeeper/views.py:449
msgid "Delete IP Address"
msgstr "IP-Adresse löschen"
-#: gatekeeper/views.py:431
+#: gatekeeper/views.py:451
#, python-format
msgid "Are you sure you want to delete the IP address \"%(address)s\"?"
msgstr ""
@@ -2045,8 +2151,8 @@ msgid "In"
msgstr "Eingehend"
#: templates/api_v2/api_documentation.html:49
-#: templates/gatekeeper/gatekeeper_list.html:150
-#: templates/gatekeeper/gatekeeper_list.html:195
+#: templates/gatekeeper/gatekeeper_list.html:166
+#: templates/gatekeeper/gatekeeper_list.html:211
#: templates/wireguard/apply_route_template.html:27
msgid "Type"
msgstr "Typ"
@@ -2056,11 +2162,13 @@ msgid "Required"
msgstr "Erforderlich"
#: templates/api_v2/api_documentation.html:62
+#: templates/gatekeeper/gatekeeper_list.html:75
#: templates/scheduler/scheduleprofile_form.html:175
msgid "Yes"
msgstr "Ja"
#: templates/api_v2/api_documentation.html:64
+#: templates/gatekeeper/gatekeeper_list.html:77
#: templates/scheduler/scheduleprofile_form.html:177
msgid "No"
msgstr "Nein"
@@ -2104,12 +2212,12 @@ msgstr "Deaktiviert"
#: templates/app_gateway/application_details.html:121
#: templates/cluster/workers_list.html:77
#: templates/dns/static_host_list.html:74
-#: templates/gatekeeper/gatekeeper_list.html:73
-#: templates/gatekeeper/gatekeeper_list.html:116
-#: templates/gatekeeper/gatekeeper_list.html:161
-#: templates/gatekeeper/gatekeeper_list.html:209
-#: templates/gatekeeper/gatekeeper_list.html:226
-#: templates/gatekeeper/gatekeeper_list.html:278
+#: templates/gatekeeper/gatekeeper_list.html:89
+#: templates/gatekeeper/gatekeeper_list.html:132
+#: templates/gatekeeper/gatekeeper_list.html:177
+#: templates/gatekeeper/gatekeeper_list.html:225
+#: templates/gatekeeper/gatekeeper_list.html:242
+#: templates/gatekeeper/gatekeeper_list.html:294
#: templates/routing_templates/list.html:29
#: templates/scheduler/scheduleprofile_form.html:123
#: templates/scheduler/scheduleprofile_list.html:25
@@ -2192,6 +2300,7 @@ msgstr "Zugriffsrichtlinie hinzufügen"
#: templates/app_gateway/app_gateway_list.html:140
#: templates/gatekeeper/gatekeeper_list.html:43
+#: templates/gatekeeper/gatekeeper_list.html:64
msgid "Groups"
msgstr "Gruppen"
@@ -2202,10 +2311,10 @@ msgstr "Authentifizierungsmethoden"
#: templates/app_gateway/app_gateway_list.html:142
#: templates/app_gateway/application_details.html:62
#: templates/app_gateway/application_details.html:109
-#: templates/gatekeeper/gatekeeper_list.html:63
-#: templates/gatekeeper/gatekeeper_list.html:106
-#: templates/gatekeeper/gatekeeper_list.html:151
-#: templates/gatekeeper/gatekeeper_list.html:198
+#: templates/gatekeeper/gatekeeper_list.html:65
+#: templates/gatekeeper/gatekeeper_list.html:122
+#: templates/gatekeeper/gatekeeper_list.html:167
+#: templates/gatekeeper/gatekeeper_list.html:214
#: templates/scheduler/scheduleprofile_form.html:111
#: templates/scheduler/scheduleprofile_list.html:15
#: templates/wireguard/apply_route_template.html:28
@@ -2760,10 +2869,19 @@ msgid "Create Port forwarding Rule"
msgstr "Port‑Weiterleitungsregel erstellen"
#: templates/gatekeeper/gatekeeper_auth_method_form.html:63
+#: templates/gatekeeper/gatekeeper_user_form.html:43
msgid "View QR Code"
msgstr "QR-Code anzeigen"
-#: templates/gatekeeper/gatekeeper_auth_method_form.html:74
+#: templates/gatekeeper/gatekeeper_auth_method_form.html:64
+#: templates/gatekeeper/gatekeeper_user_form.html:44
+#, fuzzy
+#| msgid "Global TOTP Secret"
+msgid "Generate TOTP Secret"
+msgstr "Globales TOTP-Geheimnis"
+
+#: templates/gatekeeper/gatekeeper_auth_method_form.html:93
+#: templates/gatekeeper/gatekeeper_user_form.html:73
msgid "Please enter a TOTP Secret first to generate the QR code."
msgstr ""
"Bitte geben Sie zuerst ein TOTP-Geheimnis ein, um den QR-Code zu generieren."
@@ -2790,44 +2908,48 @@ msgstr "Benutzer"
msgid "Add User"
msgstr "Benutzer hinzufügen"
-#: templates/gatekeeper/gatekeeper_list.html:88
+#: templates/gatekeeper/gatekeeper_list.html:63
+msgid "TOTP"
+msgstr ""
+
+#: templates/gatekeeper/gatekeeper_list.html:104
msgid "No Gatekeeper Users found."
msgstr "Keine Gatekeeper-Benutzer gefunden."
-#: templates/gatekeeper/gatekeeper_list.html:95
+#: templates/gatekeeper/gatekeeper_list.html:111
msgid "Add Group"
msgstr "Gruppe hinzufügen"
-#: templates/gatekeeper/gatekeeper_list.html:131
+#: templates/gatekeeper/gatekeeper_list.html:147
msgid "No Gatekeeper Groups found."
msgstr "Keine Gatekeeper-Gruppen gefunden."
-#: templates/gatekeeper/gatekeeper_list.html:140
+#: templates/gatekeeper/gatekeeper_list.html:156
msgid "Add Auth Method"
msgstr "Authentifizierungsmethode hinzufügen"
-#: templates/gatekeeper/gatekeeper_list.html:176
+#: templates/gatekeeper/gatekeeper_list.html:192
msgid "No Authentication Methods found."
msgstr "Keine Authentifizierungsmethoden gefunden."
-#: templates/gatekeeper/gatekeeper_list.html:196
+#: templates/gatekeeper/gatekeeper_list.html:212
msgid "Identity"
msgstr "Identität"
-#: templates/gatekeeper/gatekeeper_list.html:197
-#: templates/gatekeeper/gatekeeper_list.html:259
+#: templates/gatekeeper/gatekeeper_list.html:213
+#: templates/gatekeeper/gatekeeper_list.html:275
msgid "Auth Method"
msgstr "Authentifizierungsmethode"
-#: templates/gatekeeper/gatekeeper_list.html:241
+#: templates/gatekeeper/gatekeeper_list.html:257
msgid "No Allowed Emails or Domains found."
msgstr "Keine zulässigen E-Mails oder Domänen gefunden."
-#: templates/gatekeeper/gatekeeper_list.html:260
+#: templates/gatekeeper/gatekeeper_list.html:276
msgid "Manage"
msgstr "Verwalten"
-#: templates/gatekeeper/gatekeeper_list.html:293
+#: templates/gatekeeper/gatekeeper_list.html:309
msgid "No IP Addresses found."
msgstr "Keine IP-Adressen gefunden."
@@ -3666,10 +3788,6 @@ msgstr "Für neue Benutzer ist eine Passwortbestätigung erforderlich."
msgid "The two password fields didn't match."
msgstr "Die beiden Passwortfelder stimmen nicht überein."
-#: user_manager/forms.py:127
-msgid "Password must be at least 8 characters long."
-msgstr "Das Passwort muss mindestens 8 Zeichen lang sein."
-
#: user_manager/forms.py:220
msgid "A peer group with that name already exists."
msgstr "Eine Peer‑Gruppe mit diesem Namen existiert bereits."
@@ -4452,3 +4570,6 @@ msgid "No interfaces found|No WireGuard interfaces were found to process."
msgstr ""
"Keine Schnittstellen gefunden|Es wurden keine WireGuard‑Schnittstellen "
"gefunden."
+
+#~ msgid "Global TOTP Before Authentication"
+#~ msgstr "Globales TOTP vor der Authentifizierung"
diff --git a/locale/es/LC_MESSAGES/django.mo b/locale/es/LC_MESSAGES/django.mo
index 20febed..e4e5c00 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 90dfbda..1fc51a4 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-14 11:54-0300\n"
+"POT-Creation-Date: 2026-03-15 17:20-0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -38,12 +38,12 @@ msgstr "Volver"
#: templates/app_gateway/application_details.html:125
#: templates/firewall/manage_firewall_rule.html:382
#: templates/firewall/manage_redirect_rule.html:86
-#: templates/gatekeeper/gatekeeper_list.html:77
-#: templates/gatekeeper/gatekeeper_list.html:120
-#: templates/gatekeeper/gatekeeper_list.html:165
-#: templates/gatekeeper/gatekeeper_list.html:213
-#: templates/gatekeeper/gatekeeper_list.html:230
-#: templates/gatekeeper/gatekeeper_list.html:282
+#: templates/gatekeeper/gatekeeper_list.html:93
+#: templates/gatekeeper/gatekeeper_list.html:136
+#: templates/gatekeeper/gatekeeper_list.html:181
+#: templates/gatekeeper/gatekeeper_list.html:229
+#: templates/gatekeeper/gatekeeper_list.html:246
+#: templates/gatekeeper/gatekeeper_list.html:298
#: templates/scheduler/scheduleprofile_form.html:127
#: templates/scheduler/scheduleprofile_list.html:29
#: templates/wireguard/peer_list/peer_preview_modal.html:109
@@ -65,11 +65,11 @@ msgstr ""
"funcionar inmediatamente."
#: api_v2/forms.py:63 app_gateway/forms.py:40 app_gateway/forms.py:92
-#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:226
-#: app_gateway/forms.py:267 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:139 gatekeeper/forms.py:226
-#: gatekeeper/forms.py:256 gatekeeper/forms.py:287
+#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:237
+#: app_gateway/forms.py:278 cluster/forms.py:67 cluster/forms.py:124
+#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:70
+#: gatekeeper/forms.py:150 gatekeeper/forms.py:212 gatekeeper/forms.py:299
+#: gatekeeper/forms.py:329 gatekeeper/forms.py:360
#: routing_templates/forms.py:71 scheduler/forms.py:102
#: templates/firewall/manage_firewall_rule.html:379
#: templates/firewall/manage_firewall_settings.html:59
@@ -83,13 +83,13 @@ msgid "Save"
msgstr "Guardar"
#: api_v2/models.py:10 app_gateway/forms.py:18 app_gateway/forms.py:106
-#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:99
+#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:174
#: routing_templates/forms.py:28 templates/api_v2/api_documentation.html:47
#: templates/api_v2/list.html:8 templates/app_gateway/app_gateway_list.html:58
#: templates/app_gateway/app_gateway_list.html:138
#: templates/app_gateway/application_details.html:26
#: templates/cluster/workers_list.html:8 templates/dns/static_host_list.html:68
-#: templates/gatekeeper/gatekeeper_list.html:149
+#: templates/gatekeeper/gatekeeper_list.html:165
#: templates/routing_templates/list.html:8
#: templates/scheduler/scheduleprofile_list.html:13
#: templates/user_manager/peer_group_list.html:8
@@ -133,10 +133,10 @@ msgstr "Habilitado"
#: app_gateway/views.py:293 app_gateway/views.py:328 app_gateway/views.py:354
#: app_gateway/views.py:404 app_gateway/views.py:432 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: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
+#: gatekeeper/views.py:48 gatekeeper/views.py:98 gatekeeper/views.py:121
+#: gatekeeper/views.py:151 gatekeeper/views.py:174 gatekeeper/views.py:222
+#: gatekeeper/views.py:281 gatekeeper/views.py:311 gatekeeper/views.py:334
+#: gatekeeper/views.py:364 gatekeeper/views.py:387 gatekeeper/views.py:436
#: templates/access_denied.html:9
msgid "Access Denied"
msgstr "Acceso denegado"
@@ -217,9 +217,9 @@ msgid "Upstream"
msgstr "Upstream"
#: app_gateway/forms.py:41 app_gateway/forms.py:93 app_gateway/forms.py:137
-#: app_gateway/forms.py:155 app_gateway/forms.py:227 app_gateway/forms.py:268
-#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:140
-#: gatekeeper/forms.py:227 gatekeeper/forms.py:257 gatekeeper/forms.py:288
+#: app_gateway/forms.py:155 app_gateway/forms.py:238 app_gateway/forms.py:279
+#: gatekeeper/forms.py:71 gatekeeper/forms.py:151 gatekeeper/forms.py:213
+#: gatekeeper/forms.py:300 gatekeeper/forms.py:330 gatekeeper/forms.py:361
#: scheduler/forms.py:103
#: templates/app_gateway/access_policy_type_select.html:50
#: templates/generic_delete_confirmation.html:19
@@ -264,20 +264,28 @@ msgstr "Grupos permitidos"
msgid "Authentication Methods"
msgstr "Métodos de autenticación"
-#: app_gateway/forms.py:185
+#: app_gateway/forms.py:188
msgid "Cannot select more than one Local Password authentication method."
msgstr ""
"No se puede seleccionar más de un método de autenticación de Contraseña "
"Local."
-#: app_gateway/forms.py:189
+#: app_gateway/forms.py:192
msgid ""
"Cannot select more than one OpenID Connect (OIDC) authentication method."
msgstr ""
"No se puede seleccionar más de un método de autenticação OpenID Connect "
"(OIDC)."
-#: app_gateway/forms.py:193
+#: app_gateway/forms.py:196
+#, fuzzy
+#| msgid "Cannot select more than one Local Password authentication method."
+msgid "Cannot select more than one TOTP authentication method."
+msgstr ""
+"No se puede seleccionar más de un método de autenticación de Contraseña "
+"Local."
+
+#: app_gateway/forms.py:200
msgid ""
"Cannot select both Local Password and OpenID Connect (OIDC) authentication "
"methods."
@@ -285,7 +293,19 @@ msgstr ""
"No se pueden seleccionar simultáneamente los métodos de autenticación de "
"Contraseña Local y OpenID Connect (OIDC)."
-#: app_gateway/forms.py:197
+#: app_gateway/forms.py:204
+#, fuzzy
+#| msgid ""
+#| "Cannot select both Local Password and OpenID Connect (OIDC) "
+#| "authentication methods."
+msgid ""
+"TOTP must be combined with a Local Password or OpenID Connect authentication "
+"method."
+msgstr ""
+"No se pueden seleccionar simultáneamente los métodos de autenticación de "
+"Contraseña Local y OpenID Connect (OIDC)."
+
+#: app_gateway/forms.py:208
msgid ""
"At least one user group must be selected when using Local Password "
"authentication."
@@ -293,31 +313,31 @@ msgstr ""
"Se debe seleccionar al menos um grupo de usuarios al usar la autenticación "
"de Contraseña Local."
-#: app_gateway/forms.py:201
+#: app_gateway/forms.py:212
msgid "User groups can only be used with Local Password authentication."
msgstr ""
"Los grupos de usuarios solo se pueden usar con la autenticación de "
"Contraseña Local."
-#: app_gateway/forms.py:211 templates/app_gateway/app_gateway_list.html:62
+#: app_gateway/forms.py:222 templates/app_gateway/app_gateway_list.html:62
#: templates/app_gateway/application_details.html:31
#: templates/firewall/firewall_nav_tabs.html:15
msgid "Default Policy"
msgstr "Política predeterminada"
-#: app_gateway/forms.py:240 templates/app_gateway/application_details.html:105
+#: app_gateway/forms.py:251 templates/app_gateway/application_details.html:105
msgid "Route Name"
msgstr "Nombre de la ruta"
-#: app_gateway/forms.py:241 templates/app_gateway/application_details.html:106
+#: app_gateway/forms.py:252 templates/app_gateway/application_details.html:106
msgid "Path Prefix"
msgstr "Prefijo de ruta"
-#: app_gateway/forms.py:242 templates/app_gateway/application_details.html:107
+#: app_gateway/forms.py:253 templates/app_gateway/application_details.html:107
msgid "Policy"
msgstr "Política"
-#: app_gateway/forms.py:243 templates/app_gateway/application_details.html:108
+#: app_gateway/forms.py:254 templates/app_gateway/application_details.html:108
msgid "Order"
msgstr "Orden"
@@ -335,9 +355,9 @@ msgstr "Público"
msgid "Protected"
msgstr "Protegido"
-#: app_gateway/models.py:45 gatekeeper/models.py:110
+#: app_gateway/models.py:45 gatekeeper/models.py:108
#: templates/app_gateway/access_policy_type_select.html:41
-#: templates/gatekeeper/gatekeeper_list.html:272
+#: templates/gatekeeper/gatekeeper_list.html:288
msgid "Deny"
msgstr "Denegar"
@@ -620,11 +640,11 @@ msgstr "Eliminar ruta de la aplicación"
msgid "Are you sure you want to delete the route \"%(name)s\" (%(path)s)?"
msgstr "¿Está seguro de que desea eliminar la ruta \"%(name)s\" (%(path)s)?"
-#: app_gateway/views.py:444
+#: app_gateway/views.py:443
msgid "Configuration exported successfully."
msgstr "Configuración exportada con éxito."
-#: app_gateway/views.py:446
+#: app_gateway/views.py:445
msgid ""
"Caddy is not active. Configuration files were exported for debugging "
"purposes."
@@ -636,13 +656,13 @@ msgstr ""
msgid "IP Lock"
msgstr "Bloqueo de IP"
-#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:198
+#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:271
#: templates/cluster/workers_list.html:10
#: templates/dns/static_host_list.html:18
#: templates/firewall/manage_redirect_rule.html:43
#: templates/firewall/manage_redirect_rule.html:67
#: templates/firewall/manage_redirect_rule.html:68
-#: templates/gatekeeper/gatekeeper_list.html:256
+#: templates/gatekeeper/gatekeeper_list.html:272
#: templates/wireguard/wireguard_status.html:45
msgid "IP Address"
msgstr "Dirección IP"
@@ -919,7 +939,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:201
+#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:274
#: templates/api_v2/api_documentation.html:51
#: templates/dns/static_host_list.html:69
#: templates/firewall/manage_redirect_rule.html:18
@@ -1251,43 +1271,29 @@ msgstr "Gestionar configuración de firewall"
msgid "Firewall settings saved successfully"
msgstr "Configuración de firewall guardada correctamente"
-#: gatekeeper/forms.py:17 templates/accounts/login.html:14
-#: templates/gatekeeper/gatekeeper_list.html:61
-#: templates/user_manager/list.html:8 user_manager/forms.py:13
-#: vpn_invite/forms.py:281
-msgid "Username"
-msgstr "Usuario"
-
-#: 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
-msgid "Email"
-msgstr "Email"
-
-#: gatekeeper/forms.py:19 templates/accounts/login.html:23
+#: gatekeeper/forms.py:17 templates/accounts/login.html:23
#: templates/vpn_invite/invite_settings.html:19 user_manager/forms.py:14
#: vpn_invite/forms.py:282
msgid "Password"
msgstr "Contraseña"
#: gatekeeper/forms.py:20
-msgid "TOTP Secret"
-msgstr "Secreto TOTP"
+msgid ""
+"Minimum 8 characters, with at least one uppercase letter, one lowercase "
+"letter, and one number."
+msgstr ""
-#: gatekeeper/forms.py:55 templates/gatekeeper/gatekeeper_list.html:104
-msgid "Group Name"
-msgstr "Nombre del grupo"
+#: gatekeeper/forms.py:23
+#, fuzzy
+#| msgid "Random Password"
+msgid "Confirm Password"
+msgstr "Contraseña aleatoria"
-#: gatekeeper/forms.py:56 templates/gatekeeper/gatekeeper_list.html:105
-msgid "Members"
-msgstr "Miembros"
-
-#: gatekeeper/forms.py:86
+#: gatekeeper/forms.py:28 gatekeeper/forms.py:161
msgid "TOTP Validation PIN"
msgstr "PIN de validación TOTP"
-#: gatekeeper/forms.py:89
+#: gatekeeper/forms.py:31 gatekeeper/forms.py:164
msgid ""
"Enter a 6-digit PIN generated by your authenticator app to validate the "
"secret."
@@ -1295,95 +1301,151 @@ msgstr ""
"Introduzca un PIN de 6 dígitos generado por su aplicación de autenticación "
"para validar el secreto."
-#: gatekeeper/forms.py:100
+#: gatekeeper/forms.py:38 templates/accounts/login.html:14
+#: templates/gatekeeper/gatekeeper_list.html:61
+#: templates/user_manager/list.html:8 user_manager/forms.py:13
+#: vpn_invite/forms.py:281
+msgid "Username"
+msgstr "Usuario"
+
+#: gatekeeper/forms.py:39 gatekeeper/forms.py:344
+#: templates/gatekeeper/gatekeeper_list.html:62
+#: templates/gatekeeper/gatekeeper_list.html:220
+#: templates/wireguard/peer_list/peer_preview_modal.html:103
+msgid "Email"
+msgstr "Email"
+
+#: gatekeeper/forms.py:40
+msgid "TOTP Secret"
+msgstr "Secreto TOTP"
+
+#: gatekeeper/forms.py:87
+#, fuzzy
+#| msgid "Port is required."
+msgid "Password is required."
+msgstr "Puerto es obligatorio."
+
+#: gatekeeper/forms.py:90 user_manager/forms.py:127
+msgid "Password must be at least 8 characters long."
+msgstr "La contraseña debe tener al menos 8 caracteres."
+
+#: gatekeeper/forms.py:92
+#, fuzzy
+#| msgid "Password must be at least 8 characters long."
+msgid "Password must contain at least one lowercase letter."
+msgstr "La contraseña debe tener al menos 8 caracteres."
+
+#: gatekeeper/forms.py:94
+#, fuzzy
+#| msgid "Password must be at least 8 characters long."
+msgid "Password must contain at least one uppercase letter."
+msgstr "La contraseña debe tener al menos 8 caracteres."
+
+#: gatekeeper/forms.py:96
+#, fuzzy
+#| msgid "Password must be at least 8 characters long."
+msgid "Password must contain at least one number."
+msgstr "La contraseña debe tener al menos 8 caracteres."
+
+#: gatekeeper/forms.py:98
+#, fuzzy
+#| msgid "Password Confirmation"
+msgid "Passwords do not match."
+msgstr "Confirmación de contraseña"
+
+#: gatekeeper/forms.py:103 gatekeeper/forms.py:249
+msgid "Please provide a PIN to validate the TOTP secret."
+msgstr "Proporcione un PIN para validar el secreto TOTP."
+
+#: gatekeeper/forms.py:108 gatekeeper/forms.py:254
+msgid "Invalid TOTP PIN."
+msgstr "PIN TOTP no válido."
+
+#: gatekeeper/forms.py:110 gatekeeper/forms.py:256
+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:130 templates/gatekeeper/gatekeeper_list.html:120
+msgid "Group Name"
+msgstr "Nombre del grupo"
+
+#: gatekeeper/forms.py:131 templates/gatekeeper/gatekeeper_list.html:121
+msgid "Members"
+msgstr "Miembros"
+
+#: gatekeeper/forms.py:175
msgid "Authentication Type"
msgstr "Tipo de autenticación"
-#: gatekeeper/forms.py:101
+#: gatekeeper/forms.py:176
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
+#: gatekeeper/forms.py:177
msgid "OIDC Provider URL"
msgstr "URL del proveedor OIDC"
-#: gatekeeper/forms.py:104
+#: gatekeeper/forms.py:178
msgid "OIDC Client ID"
msgstr "ID de cliente OIDC"
-#: gatekeeper/forms.py:105
+#: gatekeeper/forms.py:179
msgid "OIDC Client Secret"
msgstr "Secreto de cliente OIDC"
-#: gatekeeper/forms.py:157
+#: gatekeeper/forms.py:230
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:159
+#: gatekeeper/forms.py:232
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:161
+#: gatekeeper/forms.py:234
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:167
+#: gatekeeper/forms.py:240
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:170
+#: gatekeeper/forms.py:243
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:172
+#: gatekeeper/forms.py:245
msgid "TOTP secret is required for TOTP authentication."
msgstr "El secreto TOTP es obligatorio para la autenticación TOTP."
-#: 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:181
-msgid "Invalid TOTP PIN."
-msgstr "PIN TOTP no válido."
-
-#: 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:186
+#: gatekeeper/forms.py:259
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:188
+#: gatekeeper/forms.py:261
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:197 gatekeeper/forms.py:239 gatekeeper/forms.py:270
+#: gatekeeper/forms.py:270 gatekeeper/forms.py:312 gatekeeper/forms.py:343
msgid "Authentication Method"
msgstr "Método de autenticación"
-#: gatekeeper/forms.py:199 templates/gatekeeper/gatekeeper_list.html:257
+#: gatekeeper/forms.py:272 templates/gatekeeper/gatekeeper_list.html:273
msgid "Prefix Length"
msgstr "Longitud del prefijo"
-#: gatekeeper/forms.py:200 templates/firewall/firewall_rule_list.html:47
+#: gatekeeper/forms.py:273 templates/firewall/firewall_rule_list.html:47
#: templates/firewall/manage_firewall_rule.html:360
-#: templates/gatekeeper/gatekeeper_list.html:258
+#: templates/gatekeeper/gatekeeper_list.html:274
msgid "Action"
msgstr "Acción"
-#: gatekeeper/forms.py:240 templates/gatekeeper/gatekeeper_list.html:221
+#: gatekeeper/forms.py:313 templates/gatekeeper/gatekeeper_list.html:237
msgid "Domain"
msgstr "Dominio"
@@ -1407,15 +1469,15 @@ msgstr "Lista de direcciones IP"
msgid "Shared/global TOTP secret key"
msgstr "Clave secreta TOTP compartida/global"
-#: gatekeeper/models.py:69
+#: gatekeeper/models.py:68
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:71
+#: gatekeeper/models.py:69
msgid "Per-user TOTP secret key"
msgstr "Clave secreta TOTP por usuario"
-#: gatekeeper/models.py:110 templates/gatekeeper/gatekeeper_list.html:270
+#: gatekeeper/models.py:108 templates/gatekeeper/gatekeeper_list.html:286
msgid "Allow"
msgstr "Permitir"
@@ -1431,57 +1493,102 @@ msgstr "Crear usuario de Gatekeeper"
msgid "Gatekeeper User saved successfully."
msgstr "Usuario de Gatekeeper guardado correctamente."
-#: gatekeeper/views.py:86
+#: gatekeeper/views.py:69
+msgid ""
+"\n"
+" Gatekeeper User
\n"
+" Gatekeeper users are used for authenticating against protected "
+"applications managed by this gateway.
\n"
+"\n"
+" Password
\n"
+" Required when creating a user. When editing, leave both password "
+"fields blank to keep the current password.\n"
+" Passwords are stored using Argon2id hashing.
\n"
+"\n"
+" TOTP Secret
\n"
+" Optional per-user TOTP secret. When set, this user will "
+"authenticate using their own secret instead of the\n"
+" global TOTP secret configured on the Authentication Method. Use the "
+"buttons below the field to generate a\n"
+" random secret and scan the QR code with your authenticator app. "
+"Validate the secret by entering the current\n"
+" 6-digit PIN before saving.
\n"
+" "
+msgstr ""
+
+#: gatekeeper/views.py:106
msgid "Gatekeeper User deleted successfully."
msgstr "Usuario de Gatekeeper eliminado correctamente."
-#: gatekeeper/views.py:91
+#: gatekeeper/views.py:111
msgid "Delete Gatekeeper User"
msgstr "Eliminar usuario de Gatekeeper"
-#: gatekeeper/views.py:93
+#: gatekeeper/views.py:113
#, python-format
msgid "Are you sure you want to delete the user \"%(username)s\"?"
msgstr "¿Está seguro de que desea eliminar al usuario \"%(username)s\"?"
-#: gatekeeper/views.py:107
+#: gatekeeper/views.py:127
msgid "Edit Gatekeeper Group"
msgstr "Editar grupo de Gatekeeper"
-#: gatekeeper/views.py:110
+#: gatekeeper/views.py:130
msgid "Create Gatekeeper Group"
msgstr "Crear grupo Gatekeeper"
-#: gatekeeper/views.py:117
+#: gatekeeper/views.py:137
msgid "Gatekeeper Group saved successfully."
msgstr "Grupo de Gatekeeper guardado correctamente."
-#: gatekeeper/views.py:139
+#: gatekeeper/views.py:159
msgid "Gatekeeper Group deleted successfully."
msgstr "Grupo de Gatekeeper eliminado correctamente."
-#: gatekeeper/views.py:144
+#: gatekeeper/views.py:164
msgid "Delete Gatekeeper Group"
msgstr "Eliminar grupo Gatekeeper"
-#: gatekeeper/views.py:146
+#: gatekeeper/views.py:166
#, python-format
msgid "Are you sure you want to delete the group \"%(name)s\"?"
msgstr "¿Está seguro de que desea eliminar el grupo \"%(name)s\"?"
-#: gatekeeper/views.py:160
+#: gatekeeper/views.py:180
msgid "Edit Authentication Method"
msgstr "Editar método de autenticación"
-#: gatekeeper/views.py:163
+#: gatekeeper/views.py:183
msgid "Create Authentication Method"
msgstr "Crear método de autenticación"
-#: gatekeeper/views.py:170
+#: gatekeeper/views.py:190
msgid "Authentication Method saved successfully."
msgstr "Método de autenticación guardado correctamente."
-#: gatekeeper/views.py:175
+#: gatekeeper/views.py:195
+#, fuzzy
+#| msgid ""
+#| "\n"
+#| " Authentication Types
\n"
+#| " Select how users will authenticate through this method.
\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"
+#| " "
msgid ""
"\n"
" Authentication Types
\n"
@@ -1498,9 +1605,8 @@ msgid ""
" \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"
+"app. If a user does not have a personal TOTP configured, the Global "
+"TOTP Secret will be used instead. \n"
" "
msgstr ""
"\n"
@@ -1526,87 +1632,87 @@ msgstr ""
"para ayudar a combatir los ataques de fuerza bruta.\n"
" "
-#: gatekeeper/views.py:210
+#: gatekeeper/views.py:230
msgid "Authentication Method deleted successfully."
msgstr "Método de autenticación eliminado correctamente."
-#: gatekeeper/views.py:215
+#: gatekeeper/views.py:235
msgid "Delete Authentication Method"
msgstr "Eliminar método de autenticación"
-#: gatekeeper/views.py:217
+#: gatekeeper/views.py:237
#, 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:267
+#: gatekeeper/views.py:287
msgid "Edit Allowed Domain"
msgstr "Editar dominio permitido"
-#: gatekeeper/views.py:270 templates/gatekeeper/gatekeeper_list.html:186
+#: gatekeeper/views.py:290 templates/gatekeeper/gatekeeper_list.html:202
msgid "Add Allowed Domain"
msgstr "Añadir dominio permitido"
-#: gatekeeper/views.py:277
+#: gatekeeper/views.py:297
msgid "Allowed Domain saved successfully."
msgstr "Dominio permitido guardado correctamente."
-#: gatekeeper/views.py:299
+#: gatekeeper/views.py:319
msgid "Allowed Domain deleted successfully."
msgstr "Dominio permitido eliminado correctamente."
-#: gatekeeper/views.py:304
+#: gatekeeper/views.py:324
msgid "Delete Allowed Domain"
msgstr "Eliminar dominio permitido"
-#: gatekeeper/views.py:306
+#: gatekeeper/views.py:326
#, 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:320
+#: gatekeeper/views.py:340
msgid "Edit Allowed Email"
msgstr "Editar correo electrónico permitido"
-#: gatekeeper/views.py:323 templates/gatekeeper/gatekeeper_list.html:183
+#: gatekeeper/views.py:343 templates/gatekeeper/gatekeeper_list.html:199
msgid "Add Allowed Email"
msgstr "Añadir correo electrónico permitido"
-#: gatekeeper/views.py:330
+#: gatekeeper/views.py:350
msgid "Allowed Email saved successfully."
msgstr "Correo electrónico permitido guardado correctamente."
-#: gatekeeper/views.py:352
+#: gatekeeper/views.py:372
msgid "Allowed Email deleted successfully."
msgstr "Correo electrónico permitido eliminado correctamente."
-#: gatekeeper/views.py:357
+#: gatekeeper/views.py:377
msgid "Delete Allowed Email"
msgstr "Eliminar correo electrónico permitido"
-#: gatekeeper/views.py:359
+#: gatekeeper/views.py:379
#, 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:373
+#: gatekeeper/views.py:393
msgid "Edit IP Address"
msgstr "Editar dirección IP"
-#: gatekeeper/views.py:376 templates/gatekeeper/gatekeeper_list.html:247
+#: gatekeeper/views.py:396 templates/gatekeeper/gatekeeper_list.html:263
#: templates/wireguard/wireguard_manage_peer.html:171
msgid "Add IP Address"
msgstr "Añadir IP"
-#: gatekeeper/views.py:383
+#: gatekeeper/views.py:403
msgid "IP Address saved successfully."
msgstr "Dirección IP guardada correctamente."
-#: gatekeeper/views.py:388
+#: gatekeeper/views.py:408
msgid ""
"\n"
" IP Address List
\n"
@@ -1653,15 +1759,15 @@ msgstr ""
"\"Red de la Oficina\", \"Atacante Bloqueado\").\n"
" "
-#: gatekeeper/views.py:424
+#: gatekeeper/views.py:444
msgid "IP Address deleted successfully."
msgstr "Dirección IP eliminada correctamente."
-#: gatekeeper/views.py:429
+#: gatekeeper/views.py:449
msgid "Delete IP Address"
msgstr "Eliminar dirección IP"
-#: gatekeeper/views.py:431
+#: gatekeeper/views.py:451
#, 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\"?"
@@ -2027,8 +2133,8 @@ msgid "In"
msgstr "Entrada"
#: templates/api_v2/api_documentation.html:49
-#: templates/gatekeeper/gatekeeper_list.html:150
-#: templates/gatekeeper/gatekeeper_list.html:195
+#: templates/gatekeeper/gatekeeper_list.html:166
+#: templates/gatekeeper/gatekeeper_list.html:211
#: templates/wireguard/apply_route_template.html:27
msgid "Type"
msgstr "Tipo"
@@ -2038,11 +2144,13 @@ msgid "Required"
msgstr "Obligatorio"
#: templates/api_v2/api_documentation.html:62
+#: templates/gatekeeper/gatekeeper_list.html:75
#: templates/scheduler/scheduleprofile_form.html:175
msgid "Yes"
msgstr "Sí"
#: templates/api_v2/api_documentation.html:64
+#: templates/gatekeeper/gatekeeper_list.html:77
#: templates/scheduler/scheduleprofile_form.html:177
msgid "No"
msgstr "No"
@@ -2087,12 +2195,12 @@ msgstr "Deshabilitado"
#: templates/app_gateway/application_details.html:121
#: templates/cluster/workers_list.html:77
#: templates/dns/static_host_list.html:74
-#: templates/gatekeeper/gatekeeper_list.html:73
-#: templates/gatekeeper/gatekeeper_list.html:116
-#: templates/gatekeeper/gatekeeper_list.html:161
-#: templates/gatekeeper/gatekeeper_list.html:209
-#: templates/gatekeeper/gatekeeper_list.html:226
-#: templates/gatekeeper/gatekeeper_list.html:278
+#: templates/gatekeeper/gatekeeper_list.html:89
+#: templates/gatekeeper/gatekeeper_list.html:132
+#: templates/gatekeeper/gatekeeper_list.html:177
+#: templates/gatekeeper/gatekeeper_list.html:225
+#: templates/gatekeeper/gatekeeper_list.html:242
+#: templates/gatekeeper/gatekeeper_list.html:294
#: templates/routing_templates/list.html:29
#: templates/scheduler/scheduleprofile_form.html:123
#: templates/scheduler/scheduleprofile_list.html:25
@@ -2174,6 +2282,7 @@ msgstr "Añadir política de acceso"
#: templates/app_gateway/app_gateway_list.html:140
#: templates/gatekeeper/gatekeeper_list.html:43
+#: templates/gatekeeper/gatekeeper_list.html:64
msgid "Groups"
msgstr "Grupos"
@@ -2184,10 +2293,10 @@ msgstr "Métodos de autenticación"
#: templates/app_gateway/app_gateway_list.html:142
#: templates/app_gateway/application_details.html:62
#: templates/app_gateway/application_details.html:109
-#: templates/gatekeeper/gatekeeper_list.html:63
-#: templates/gatekeeper/gatekeeper_list.html:106
-#: templates/gatekeeper/gatekeeper_list.html:151
-#: templates/gatekeeper/gatekeeper_list.html:198
+#: templates/gatekeeper/gatekeeper_list.html:65
+#: templates/gatekeeper/gatekeeper_list.html:122
+#: templates/gatekeeper/gatekeeper_list.html:167
+#: templates/gatekeeper/gatekeeper_list.html:214
#: templates/scheduler/scheduleprofile_form.html:111
#: templates/scheduler/scheduleprofile_list.html:15
#: templates/wireguard/apply_route_template.html:28
@@ -2737,10 +2846,19 @@ msgid "Create Port forwarding Rule"
msgstr "Crear regla de reenvío de puerto"
#: templates/gatekeeper/gatekeeper_auth_method_form.html:63
+#: templates/gatekeeper/gatekeeper_user_form.html:43
msgid "View QR Code"
msgstr "Ver código QR"
-#: templates/gatekeeper/gatekeeper_auth_method_form.html:74
+#: templates/gatekeeper/gatekeeper_auth_method_form.html:64
+#: templates/gatekeeper/gatekeeper_user_form.html:44
+#, fuzzy
+#| msgid "Global TOTP Secret"
+msgid "Generate TOTP Secret"
+msgstr "Secreto TOTP global"
+
+#: templates/gatekeeper/gatekeeper_auth_method_form.html:93
+#: templates/gatekeeper/gatekeeper_user_form.html:73
msgid "Please enter a TOTP Secret first to generate the QR code."
msgstr ""
"Por favor, introduzca primero un secreto TOTP para generar el código QR."
@@ -2767,44 +2885,48 @@ msgstr "Usuarios"
msgid "Add User"
msgstr "Añadir usuario"
-#: templates/gatekeeper/gatekeeper_list.html:88
+#: templates/gatekeeper/gatekeeper_list.html:63
+msgid "TOTP"
+msgstr ""
+
+#: templates/gatekeeper/gatekeeper_list.html:104
msgid "No Gatekeeper Users found."
msgstr "No se han encontrado usuarios de Gatekeeper."
-#: templates/gatekeeper/gatekeeper_list.html:95
+#: templates/gatekeeper/gatekeeper_list.html:111
msgid "Add Group"
msgstr "Añadir grupo"
-#: templates/gatekeeper/gatekeeper_list.html:131
+#: templates/gatekeeper/gatekeeper_list.html:147
msgid "No Gatekeeper Groups found."
msgstr "No se han encontrado grupos de Gatekeeper."
-#: templates/gatekeeper/gatekeeper_list.html:140
+#: templates/gatekeeper/gatekeeper_list.html:156
msgid "Add Auth Method"
msgstr "Añadir método de autenticación"
-#: templates/gatekeeper/gatekeeper_list.html:176
+#: templates/gatekeeper/gatekeeper_list.html:192
msgid "No Authentication Methods found."
msgstr "No se han encontrado métodos de autenticación."
-#: templates/gatekeeper/gatekeeper_list.html:196
+#: templates/gatekeeper/gatekeeper_list.html:212
msgid "Identity"
msgstr "Identidad"
-#: templates/gatekeeper/gatekeeper_list.html:197
-#: templates/gatekeeper/gatekeeper_list.html:259
+#: templates/gatekeeper/gatekeeper_list.html:213
+#: templates/gatekeeper/gatekeeper_list.html:275
msgid "Auth Method"
msgstr "Método de autenticación"
-#: templates/gatekeeper/gatekeeper_list.html:241
+#: templates/gatekeeper/gatekeeper_list.html:257
msgid "No Allowed Emails or Domains found."
msgstr "No se han encontrado correos electrónicos o dominios permitidos."
-#: templates/gatekeeper/gatekeeper_list.html:260
+#: templates/gatekeeper/gatekeeper_list.html:276
msgid "Manage"
msgstr "Gestionar"
-#: templates/gatekeeper/gatekeeper_list.html:293
+#: templates/gatekeeper/gatekeeper_list.html:309
msgid "No IP Addresses found."
msgstr "No se han encontrado direcciones IP."
@@ -3640,10 +3762,6 @@ msgstr "Confirmación de contraseña obligatoria para nuevos usuarios."
msgid "The two password fields didn't match."
msgstr "Las contraseñas no coinciden."
-#: user_manager/forms.py:127
-msgid "Password must be at least 8 characters long."
-msgstr "La contraseña debe tener al menos 8 caracteres."
-
#: user_manager/forms.py:220
msgid "A peer group with that name already exists."
msgstr "Ya existe un grupo de peers con ese nombre."
@@ -4404,3 +4522,6 @@ msgstr "Errores encontrados|Error al procesar una o más interfaces."
msgid "No interfaces found|No WireGuard interfaces were found to process."
msgstr ""
"No se encontraron interfaces|No hay interfaces WireGuard para procesar."
+
+#~ msgid "Global TOTP Before Authentication"
+#~ msgstr "TOTP global antes de la autenticación"
diff --git a/locale/fr/LC_MESSAGES/django.mo b/locale/fr/LC_MESSAGES/django.mo
index f8e8d09..1d04d7d 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 a8827b7..0d2e2bd 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-14 11:54-0300\n"
+"POT-Creation-Date: 2026-03-15 17:20-0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -38,12 +38,12 @@ msgstr "Retour"
#: templates/app_gateway/application_details.html:125
#: templates/firewall/manage_firewall_rule.html:382
#: templates/firewall/manage_redirect_rule.html:86
-#: templates/gatekeeper/gatekeeper_list.html:77
-#: templates/gatekeeper/gatekeeper_list.html:120
-#: templates/gatekeeper/gatekeeper_list.html:165
-#: templates/gatekeeper/gatekeeper_list.html:213
-#: templates/gatekeeper/gatekeeper_list.html:230
-#: templates/gatekeeper/gatekeeper_list.html:282
+#: templates/gatekeeper/gatekeeper_list.html:93
+#: templates/gatekeeper/gatekeeper_list.html:136
+#: templates/gatekeeper/gatekeeper_list.html:181
+#: templates/gatekeeper/gatekeeper_list.html:229
+#: templates/gatekeeper/gatekeeper_list.html:246
+#: templates/gatekeeper/gatekeeper_list.html:298
#: templates/scheduler/scheduleprofile_form.html:127
#: templates/scheduler/scheduleprofile_list.html:29
#: templates/wireguard/peer_list/peer_preview_modal.html:109
@@ -65,11 +65,11 @@ msgstr ""
"fonctionner immédiatement."
#: api_v2/forms.py:63 app_gateway/forms.py:40 app_gateway/forms.py:92
-#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:226
-#: app_gateway/forms.py:267 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:139 gatekeeper/forms.py:226
-#: gatekeeper/forms.py:256 gatekeeper/forms.py:287
+#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:237
+#: app_gateway/forms.py:278 cluster/forms.py:67 cluster/forms.py:124
+#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:70
+#: gatekeeper/forms.py:150 gatekeeper/forms.py:212 gatekeeper/forms.py:299
+#: gatekeeper/forms.py:329 gatekeeper/forms.py:360
#: routing_templates/forms.py:71 scheduler/forms.py:102
#: templates/firewall/manage_firewall_rule.html:379
#: templates/firewall/manage_firewall_settings.html:59
@@ -83,13 +83,13 @@ msgid "Save"
msgstr "Enregistrer"
#: api_v2/models.py:10 app_gateway/forms.py:18 app_gateway/forms.py:106
-#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:99
+#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:174
#: routing_templates/forms.py:28 templates/api_v2/api_documentation.html:47
#: templates/api_v2/list.html:8 templates/app_gateway/app_gateway_list.html:58
#: templates/app_gateway/app_gateway_list.html:138
#: templates/app_gateway/application_details.html:26
#: templates/cluster/workers_list.html:8 templates/dns/static_host_list.html:68
-#: templates/gatekeeper/gatekeeper_list.html:149
+#: templates/gatekeeper/gatekeeper_list.html:165
#: templates/routing_templates/list.html:8
#: templates/scheduler/scheduleprofile_list.html:13
#: templates/user_manager/peer_group_list.html:8
@@ -133,10 +133,10 @@ msgstr "Activé"
#: app_gateway/views.py:293 app_gateway/views.py:328 app_gateway/views.py:354
#: app_gateway/views.py:404 app_gateway/views.py:432 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: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
+#: gatekeeper/views.py:48 gatekeeper/views.py:98 gatekeeper/views.py:121
+#: gatekeeper/views.py:151 gatekeeper/views.py:174 gatekeeper/views.py:222
+#: gatekeeper/views.py:281 gatekeeper/views.py:311 gatekeeper/views.py:334
+#: gatekeeper/views.py:364 gatekeeper/views.py:387 gatekeeper/views.py:436
#: templates/access_denied.html:9
msgid "Access Denied"
msgstr "Accès refusé"
@@ -217,9 +217,9 @@ msgid "Upstream"
msgstr "Upstream"
#: app_gateway/forms.py:41 app_gateway/forms.py:93 app_gateway/forms.py:137
-#: app_gateway/forms.py:155 app_gateway/forms.py:227 app_gateway/forms.py:268
-#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:140
-#: gatekeeper/forms.py:227 gatekeeper/forms.py:257 gatekeeper/forms.py:288
+#: app_gateway/forms.py:155 app_gateway/forms.py:238 app_gateway/forms.py:279
+#: gatekeeper/forms.py:71 gatekeeper/forms.py:151 gatekeeper/forms.py:213
+#: gatekeeper/forms.py:300 gatekeeper/forms.py:330 gatekeeper/forms.py:361
#: scheduler/forms.py:103
#: templates/app_gateway/access_policy_type_select.html:50
#: templates/generic_delete_confirmation.html:19
@@ -263,20 +263,28 @@ msgstr "Groupes autorisés"
msgid "Authentication Methods"
msgstr "Méthodes d'authentification"
-#: app_gateway/forms.py:185
+#: app_gateway/forms.py:188
msgid "Cannot select more than one Local Password authentication method."
msgstr ""
"Impossible de sélectionner plus d'une méthode d'authentification par mot de "
"passe local."
-#: app_gateway/forms.py:189
+#: app_gateway/forms.py:192
msgid ""
"Cannot select more than one OpenID Connect (OIDC) authentication method."
msgstr ""
"Impossible de sélectionner plus d'une méthode d'authentification OpenID "
"Connect (OIDC)."
-#: app_gateway/forms.py:193
+#: app_gateway/forms.py:196
+#, fuzzy
+#| msgid "Cannot select more than one Local Password authentication method."
+msgid "Cannot select more than one TOTP authentication method."
+msgstr ""
+"Impossible de sélectionner plus d'une méthode d'authentification par mot de "
+"passe local."
+
+#: app_gateway/forms.py:200
msgid ""
"Cannot select both Local Password and OpenID Connect (OIDC) authentication "
"methods."
@@ -284,7 +292,19 @@ msgstr ""
"Impossible de sélectionner à la fois les méthodes d'authentification par mot "
"de passe local et OpenID Connect (OIDC)."
-#: app_gateway/forms.py:197
+#: app_gateway/forms.py:204
+#, fuzzy
+#| msgid ""
+#| "Cannot select both Local Password and OpenID Connect (OIDC) "
+#| "authentication methods."
+msgid ""
+"TOTP must be combined with a Local Password or OpenID Connect authentication "
+"method."
+msgstr ""
+"Impossible de sélectionner à la fois les méthodes d'authentification par mot "
+"de passe local et OpenID Connect (OIDC)."
+
+#: app_gateway/forms.py:208
msgid ""
"At least one user group must be selected when using Local Password "
"authentication."
@@ -292,31 +312,31 @@ msgstr ""
"Au moins un groupe d'utilisateurs doit être sélectionné lors de "
"l'utilisation de l'authentification par mot de passe local."
-#: app_gateway/forms.py:201
+#: app_gateway/forms.py:212
msgid "User groups can only be used with Local Password authentication."
msgstr ""
"Les groupes d'utilisateurs ne peuvent être utilisés qu'avec "
"l'authentification par mot de passe local."
-#: app_gateway/forms.py:211 templates/app_gateway/app_gateway_list.html:62
+#: app_gateway/forms.py:222 templates/app_gateway/app_gateway_list.html:62
#: templates/app_gateway/application_details.html:31
#: templates/firewall/firewall_nav_tabs.html:15
msgid "Default Policy"
msgstr "Politique par défaut"
-#: app_gateway/forms.py:240 templates/app_gateway/application_details.html:105
+#: app_gateway/forms.py:251 templates/app_gateway/application_details.html:105
msgid "Route Name"
msgstr "Nom de la route"
-#: app_gateway/forms.py:241 templates/app_gateway/application_details.html:106
+#: app_gateway/forms.py:252 templates/app_gateway/application_details.html:106
msgid "Path Prefix"
msgstr "Préfixe de chemin"
-#: app_gateway/forms.py:242 templates/app_gateway/application_details.html:107
+#: app_gateway/forms.py:253 templates/app_gateway/application_details.html:107
msgid "Policy"
msgstr "Politique"
-#: app_gateway/forms.py:243 templates/app_gateway/application_details.html:108
+#: app_gateway/forms.py:254 templates/app_gateway/application_details.html:108
msgid "Order"
msgstr "Ordre"
@@ -334,9 +354,9 @@ msgstr "Public"
msgid "Protected"
msgstr "Protégé"
-#: app_gateway/models.py:45 gatekeeper/models.py:110
+#: app_gateway/models.py:45 gatekeeper/models.py:108
#: templates/app_gateway/access_policy_type_select.html:41
-#: templates/gatekeeper/gatekeeper_list.html:272
+#: templates/gatekeeper/gatekeeper_list.html:288
msgid "Deny"
msgstr "Refuser"
@@ -624,11 +644,11 @@ msgstr "Supprimer la route d'application"
msgid "Are you sure you want to delete the route \"%(name)s\" (%(path)s)?"
msgstr "Êtes-vous sûr de vouloir supprimer la route \"%(name)s\" (%(path)s) ?"
-#: app_gateway/views.py:444
+#: app_gateway/views.py:443
msgid "Configuration exported successfully."
msgstr "Configuration exportée avec succès."
-#: app_gateway/views.py:446
+#: app_gateway/views.py:445
msgid ""
"Caddy is not active. Configuration files were exported for debugging "
"purposes."
@@ -640,13 +660,13 @@ msgstr ""
msgid "IP Lock"
msgstr "Verrouillage IP"
-#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:198
+#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:271
#: templates/cluster/workers_list.html:10
#: templates/dns/static_host_list.html:18
#: templates/firewall/manage_redirect_rule.html:43
#: templates/firewall/manage_redirect_rule.html:67
#: templates/firewall/manage_redirect_rule.html:68
-#: templates/gatekeeper/gatekeeper_list.html:256
+#: templates/gatekeeper/gatekeeper_list.html:272
#: templates/wireguard/wireguard_status.html:45
msgid "IP Address"
msgstr "Adresse IP"
@@ -922,7 +942,7 @@ msgstr "DNS statique"
msgid "Invalid hostname."
msgstr "Nom d'hôte invalide."
-#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:201
+#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:274
#: templates/api_v2/api_documentation.html:51
#: templates/dns/static_host_list.html:69
#: templates/firewall/manage_redirect_rule.html:18
@@ -1256,43 +1276,29 @@ msgstr "Gérer les paramètres du pare‑feu"
msgid "Firewall settings saved successfully"
msgstr "Paramètres du pare‑feu enregistrés avec succès"
-#: gatekeeper/forms.py:17 templates/accounts/login.html:14
-#: templates/gatekeeper/gatekeeper_list.html:61
-#: templates/user_manager/list.html:8 user_manager/forms.py:13
-#: vpn_invite/forms.py:281
-msgid "Username"
-msgstr "Nom d’utilisateur"
-
-#: 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
-msgid "Email"
-msgstr "E‑mail"
-
-#: gatekeeper/forms.py:19 templates/accounts/login.html:23
+#: gatekeeper/forms.py:17 templates/accounts/login.html:23
#: templates/vpn_invite/invite_settings.html:19 user_manager/forms.py:14
#: vpn_invite/forms.py:282
msgid "Password"
msgstr "Mot de passe"
#: gatekeeper/forms.py:20
-msgid "TOTP Secret"
-msgstr "Secret TOTP"
+msgid ""
+"Minimum 8 characters, with at least one uppercase letter, one lowercase "
+"letter, and one number."
+msgstr ""
-#: gatekeeper/forms.py:55 templates/gatekeeper/gatekeeper_list.html:104
-msgid "Group Name"
-msgstr "Nom du groupe"
+#: gatekeeper/forms.py:23
+#, fuzzy
+#| msgid "Random Password"
+msgid "Confirm Password"
+msgstr "Mot de passe aléatoire"
-#: gatekeeper/forms.py:56 templates/gatekeeper/gatekeeper_list.html:105
-msgid "Members"
-msgstr "Membres"
-
-#: gatekeeper/forms.py:86
+#: gatekeeper/forms.py:28 gatekeeper/forms.py:161
msgid "TOTP Validation PIN"
msgstr "Code de validation TOTP"
-#: gatekeeper/forms.py:89
+#: gatekeeper/forms.py:31 gatekeeper/forms.py:164
msgid ""
"Enter a 6-digit PIN generated by your authenticator app to validate the "
"secret."
@@ -1300,97 +1306,153 @@ msgstr ""
"Saisissez un code à 6 chiffres généré par votre application "
"d'authentification pour valider le secret."
-#: gatekeeper/forms.py:100
+#: gatekeeper/forms.py:38 templates/accounts/login.html:14
+#: templates/gatekeeper/gatekeeper_list.html:61
+#: templates/user_manager/list.html:8 user_manager/forms.py:13
+#: vpn_invite/forms.py:281
+msgid "Username"
+msgstr "Nom d’utilisateur"
+
+#: gatekeeper/forms.py:39 gatekeeper/forms.py:344
+#: templates/gatekeeper/gatekeeper_list.html:62
+#: templates/gatekeeper/gatekeeper_list.html:220
+#: templates/wireguard/peer_list/peer_preview_modal.html:103
+msgid "Email"
+msgstr "E‑mail"
+
+#: gatekeeper/forms.py:40
+msgid "TOTP Secret"
+msgstr "Secret TOTP"
+
+#: gatekeeper/forms.py:87
+#, fuzzy
+#| msgid "Port is required."
+msgid "Password is required."
+msgstr "Le port est obligatoire."
+
+#: gatekeeper/forms.py:90 user_manager/forms.py:127
+msgid "Password must be at least 8 characters long."
+msgstr "Le mot de passe doit comporter au moins 8 caractères."
+
+#: gatekeeper/forms.py:92
+#, fuzzy
+#| msgid "Password must be at least 8 characters long."
+msgid "Password must contain at least one lowercase letter."
+msgstr "Le mot de passe doit comporter au moins 8 caractères."
+
+#: gatekeeper/forms.py:94
+#, fuzzy
+#| msgid "Password must be at least 8 characters long."
+msgid "Password must contain at least one uppercase letter."
+msgstr "Le mot de passe doit comporter au moins 8 caractères."
+
+#: gatekeeper/forms.py:96
+#, fuzzy
+#| msgid "Password must be at least 8 characters long."
+msgid "Password must contain at least one number."
+msgstr "Le mot de passe doit comporter au moins 8 caractères."
+
+#: gatekeeper/forms.py:98
+#, fuzzy
+#| msgid "Password Confirmation"
+msgid "Passwords do not match."
+msgstr "Confirmation du mot de passe"
+
+#: gatekeeper/forms.py:103 gatekeeper/forms.py:249
+msgid "Please provide a PIN to validate the TOTP secret."
+msgstr "Veuillez fournir un code pour valider le secret TOTP."
+
+#: gatekeeper/forms.py:108 gatekeeper/forms.py:254
+msgid "Invalid TOTP PIN."
+msgstr "Code TOTP invalide."
+
+#: gatekeeper/forms.py:110 gatekeeper/forms.py:256
+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:130 templates/gatekeeper/gatekeeper_list.html:120
+msgid "Group Name"
+msgstr "Nom du groupe"
+
+#: gatekeeper/forms.py:131 templates/gatekeeper/gatekeeper_list.html:121
+msgid "Members"
+msgstr "Membres"
+
+#: gatekeeper/forms.py:175
msgid "Authentication Type"
msgstr "Type d'authentification"
-#: gatekeeper/forms.py:101
+#: gatekeeper/forms.py:176
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
+#: gatekeeper/forms.py:177
msgid "OIDC Provider URL"
msgstr "URL du fournisseur OIDC"
-#: gatekeeper/forms.py:104
+#: gatekeeper/forms.py:178
msgid "OIDC Client ID"
msgstr "ID client OIDC"
-#: gatekeeper/forms.py:105
+#: gatekeeper/forms.py:179
msgid "OIDC Client Secret"
msgstr "Secret client OIDC"
-#: gatekeeper/forms.py:157
+#: gatekeeper/forms.py:230
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:159
+#: gatekeeper/forms.py:232
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:161
+#: gatekeeper/forms.py:234
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:167
+#: gatekeeper/forms.py:240
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:170
+#: gatekeeper/forms.py:243
msgid "OIDC fields must be empty for TOTP authentication."
msgstr "Les champs OIDC doivent être vides pour l'authentification TOTP."
-#: gatekeeper/forms.py:172
+#: gatekeeper/forms.py:245
msgid "TOTP secret is required for TOTP authentication."
msgstr "Le secret TOTP est requis pour l'authentification TOTP."
-#: 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:181
-msgid "Invalid TOTP PIN."
-msgstr "Code TOTP invalide."
-
-#: 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:186
+#: gatekeeper/forms.py:259
msgid "TOTP secret must be empty for OIDC authentication."
msgstr "Le secret TOTP doit être vide pour l'authentification OIDC."
-#: gatekeeper/forms.py:188
+#: gatekeeper/forms.py:261
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:197 gatekeeper/forms.py:239 gatekeeper/forms.py:270
+#: gatekeeper/forms.py:270 gatekeeper/forms.py:312 gatekeeper/forms.py:343
msgid "Authentication Method"
msgstr "Méthode d'authentification"
-#: gatekeeper/forms.py:199 templates/gatekeeper/gatekeeper_list.html:257
+#: gatekeeper/forms.py:272 templates/gatekeeper/gatekeeper_list.html:273
msgid "Prefix Length"
msgstr "Longueur du préfixe"
-#: gatekeeper/forms.py:200 templates/firewall/firewall_rule_list.html:47
+#: gatekeeper/forms.py:273 templates/firewall/firewall_rule_list.html:47
#: templates/firewall/manage_firewall_rule.html:360
-#: templates/gatekeeper/gatekeeper_list.html:258
+#: templates/gatekeeper/gatekeeper_list.html:274
msgid "Action"
msgstr "Action"
-#: gatekeeper/forms.py:240 templates/gatekeeper/gatekeeper_list.html:221
+#: gatekeeper/forms.py:313 templates/gatekeeper/gatekeeper_list.html:237
msgid "Domain"
msgstr "Domaine"
@@ -1414,17 +1476,17 @@ msgstr "Liste d'adresses IP"
msgid "Shared/global TOTP secret key"
msgstr "Clé secrète TOTP partagée/globale"
-#: gatekeeper/models.py:69
+#: gatekeeper/models.py:68
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:71
+#: gatekeeper/models.py:69
msgid "Per-user TOTP secret key"
msgstr "Clé secrète TOTP par utilisateur"
-#: gatekeeper/models.py:110 templates/gatekeeper/gatekeeper_list.html:270
+#: gatekeeper/models.py:108 templates/gatekeeper/gatekeeper_list.html:286
msgid "Allow"
msgstr "Autoriser"
@@ -1440,57 +1502,102 @@ msgstr "Créer un utilisateur Gatekeeper"
msgid "Gatekeeper User saved successfully."
msgstr "Utilisateur Gatekeeper enregistré avec succès."
-#: gatekeeper/views.py:86
+#: gatekeeper/views.py:69
+msgid ""
+"\n"
+" Gatekeeper User
\n"
+" Gatekeeper users are used for authenticating against protected "
+"applications managed by this gateway.
\n"
+"\n"
+" Password
\n"
+" Required when creating a user. When editing, leave both password "
+"fields blank to keep the current password.\n"
+" Passwords are stored using Argon2id hashing.
\n"
+"\n"
+" TOTP Secret
\n"
+" Optional per-user TOTP secret. When set, this user will "
+"authenticate using their own secret instead of the\n"
+" global TOTP secret configured on the Authentication Method. Use the "
+"buttons below the field to generate a\n"
+" random secret and scan the QR code with your authenticator app. "
+"Validate the secret by entering the current\n"
+" 6-digit PIN before saving.
\n"
+" "
+msgstr ""
+
+#: gatekeeper/views.py:106
msgid "Gatekeeper User deleted successfully."
msgstr "Utilisateur Gatekeeper supprimé avec succès."
-#: gatekeeper/views.py:91
+#: gatekeeper/views.py:111
msgid "Delete Gatekeeper User"
msgstr "Supprimer l'utilisateur Gatekeeper"
-#: gatekeeper/views.py:93
+#: gatekeeper/views.py:113
#, python-format
msgid "Are you sure you want to delete the user \"%(username)s\"?"
msgstr "Êtes-vous sûr de vouloir supprimer l'utilisateur \"%(username)s\" ?"
-#: gatekeeper/views.py:107
+#: gatekeeper/views.py:127
msgid "Edit Gatekeeper Group"
msgstr "Modifier le groupe Gatekeeper"
-#: gatekeeper/views.py:110
+#: gatekeeper/views.py:130
msgid "Create Gatekeeper Group"
msgstr "Créer un groupe Gatekeeper"
-#: gatekeeper/views.py:117
+#: gatekeeper/views.py:137
msgid "Gatekeeper Group saved successfully."
msgstr "Groupe Gatekeeper enregistré avec succès."
-#: gatekeeper/views.py:139
+#: gatekeeper/views.py:159
msgid "Gatekeeper Group deleted successfully."
msgstr "Groupe Gatekeeper supprimé avec succès."
-#: gatekeeper/views.py:144
+#: gatekeeper/views.py:164
msgid "Delete Gatekeeper Group"
msgstr "Supprimer le groupe Gatekeeper"
-#: gatekeeper/views.py:146
+#: gatekeeper/views.py:166
#, python-format
msgid "Are you sure you want to delete the group \"%(name)s\"?"
msgstr "Êtes-vous sûr de vouloir supprimer le groupe \"%(name)s\" ?"
-#: gatekeeper/views.py:160
+#: gatekeeper/views.py:180
msgid "Edit Authentication Method"
msgstr "Modifier la méthode d'authentification"
-#: gatekeeper/views.py:163
+#: gatekeeper/views.py:183
msgid "Create Authentication Method"
msgstr "Créer une méthode d'authentification"
-#: gatekeeper/views.py:170
+#: gatekeeper/views.py:190
msgid "Authentication Method saved successfully."
msgstr "Méthode d'authentification enregistrée avec succès."
-#: gatekeeper/views.py:175
+#: gatekeeper/views.py:195
+#, fuzzy
+#| msgid ""
+#| "\n"
+#| " Authentication Types
\n"
+#| " Select how users will authenticate through this method.
\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"
+#| " "
msgid ""
"\n"
" Authentication Types
\n"
@@ -1507,9 +1614,8 @@ msgid ""
" \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"
+"app. If a user does not have a personal TOTP configured, the Global "
+"TOTP Secret will be used instead. \n"
" "
msgstr ""
"\n"
@@ -1535,86 +1641,86 @@ msgstr ""
"pour aider à lutter contre les attaques par force brute.\n"
" "
-#: gatekeeper/views.py:210
+#: gatekeeper/views.py:230
msgid "Authentication Method deleted successfully."
msgstr "Méthode d'authentification supprimée avec succès."
-#: gatekeeper/views.py:215
+#: gatekeeper/views.py:235
msgid "Delete Authentication Method"
msgstr "Supprimer la méthode d'authentification"
-#: gatekeeper/views.py:217
+#: gatekeeper/views.py:237
#, 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:267
+#: gatekeeper/views.py:287
msgid "Edit Allowed Domain"
msgstr "Modifier le domaine autorisé"
-#: gatekeeper/views.py:270 templates/gatekeeper/gatekeeper_list.html:186
+#: gatekeeper/views.py:290 templates/gatekeeper/gatekeeper_list.html:202
msgid "Add Allowed Domain"
msgstr "Ajouter un domaine autorisé"
-#: gatekeeper/views.py:277
+#: gatekeeper/views.py:297
msgid "Allowed Domain saved successfully."
msgstr "Domaine autorisé enregistré avec succès."
-#: gatekeeper/views.py:299
+#: gatekeeper/views.py:319
msgid "Allowed Domain deleted successfully."
msgstr "Domaine autorisé supprimé avec succès."
-#: gatekeeper/views.py:304
+#: gatekeeper/views.py:324
msgid "Delete Allowed Domain"
msgstr "Supprimer le domaine autorisé"
-#: gatekeeper/views.py:306
+#: gatekeeper/views.py:326
#, 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:320
+#: gatekeeper/views.py:340
msgid "Edit Allowed Email"
msgstr "Modifier l'e-mail autorisé"
-#: gatekeeper/views.py:323 templates/gatekeeper/gatekeeper_list.html:183
+#: gatekeeper/views.py:343 templates/gatekeeper/gatekeeper_list.html:199
msgid "Add Allowed Email"
msgstr "Ajouter un e-mail autorisé"
-#: gatekeeper/views.py:330
+#: gatekeeper/views.py:350
msgid "Allowed Email saved successfully."
msgstr "E-mail autorisé enregistré avec succès."
-#: gatekeeper/views.py:352
+#: gatekeeper/views.py:372
msgid "Allowed Email deleted successfully."
msgstr "E-mail autorisé supprimé avec succès."
-#: gatekeeper/views.py:357
+#: gatekeeper/views.py:377
msgid "Delete Allowed Email"
msgstr "Supprimer l'e-mail autorisé"
-#: gatekeeper/views.py:359
+#: gatekeeper/views.py:379
#, 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:373
+#: gatekeeper/views.py:393
msgid "Edit IP Address"
msgstr "Modifier l'adresse IP"
-#: gatekeeper/views.py:376 templates/gatekeeper/gatekeeper_list.html:247
+#: gatekeeper/views.py:396 templates/gatekeeper/gatekeeper_list.html:263
#: templates/wireguard/wireguard_manage_peer.html:171
msgid "Add IP Address"
msgstr "Ajouter une adresse IP"
-#: gatekeeper/views.py:383
+#: gatekeeper/views.py:403
msgid "IP Address saved successfully."
msgstr "Adresse IP enregistrée avec succès."
-#: gatekeeper/views.py:388
+#: gatekeeper/views.py:408
msgid ""
"\n"
" IP Address List
\n"
@@ -1661,15 +1767,15 @@ msgstr ""
"\"Réseau de bureau\", \"Attaquant bloqué\").\n"
" "
-#: gatekeeper/views.py:424
+#: gatekeeper/views.py:444
msgid "IP Address deleted successfully."
msgstr "Adresse IP supprimée avec succès."
-#: gatekeeper/views.py:429
+#: gatekeeper/views.py:449
msgid "Delete IP Address"
msgstr "Supprimer l'adresse IP"
-#: gatekeeper/views.py:431
+#: gatekeeper/views.py:451
#, 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\" ?"
@@ -2034,8 +2140,8 @@ msgid "In"
msgstr "Entrée"
#: templates/api_v2/api_documentation.html:49
-#: templates/gatekeeper/gatekeeper_list.html:150
-#: templates/gatekeeper/gatekeeper_list.html:195
+#: templates/gatekeeper/gatekeeper_list.html:166
+#: templates/gatekeeper/gatekeeper_list.html:211
#: templates/wireguard/apply_route_template.html:27
msgid "Type"
msgstr "Type"
@@ -2045,11 +2151,13 @@ msgid "Required"
msgstr "Obligatoire"
#: templates/api_v2/api_documentation.html:62
+#: templates/gatekeeper/gatekeeper_list.html:75
#: templates/scheduler/scheduleprofile_form.html:175
msgid "Yes"
msgstr "Oui"
#: templates/api_v2/api_documentation.html:64
+#: templates/gatekeeper/gatekeeper_list.html:77
#: templates/scheduler/scheduleprofile_form.html:177
msgid "No"
msgstr "Non"
@@ -2094,12 +2202,12 @@ msgstr "Désactivé"
#: templates/app_gateway/application_details.html:121
#: templates/cluster/workers_list.html:77
#: templates/dns/static_host_list.html:74
-#: templates/gatekeeper/gatekeeper_list.html:73
-#: templates/gatekeeper/gatekeeper_list.html:116
-#: templates/gatekeeper/gatekeeper_list.html:161
-#: templates/gatekeeper/gatekeeper_list.html:209
-#: templates/gatekeeper/gatekeeper_list.html:226
-#: templates/gatekeeper/gatekeeper_list.html:278
+#: templates/gatekeeper/gatekeeper_list.html:89
+#: templates/gatekeeper/gatekeeper_list.html:132
+#: templates/gatekeeper/gatekeeper_list.html:177
+#: templates/gatekeeper/gatekeeper_list.html:225
+#: templates/gatekeeper/gatekeeper_list.html:242
+#: templates/gatekeeper/gatekeeper_list.html:294
#: templates/routing_templates/list.html:29
#: templates/scheduler/scheduleprofile_form.html:123
#: templates/scheduler/scheduleprofile_list.html:25
@@ -2182,6 +2290,7 @@ msgstr "Ajouter une politique d'accès"
#: templates/app_gateway/app_gateway_list.html:140
#: templates/gatekeeper/gatekeeper_list.html:43
+#: templates/gatekeeper/gatekeeper_list.html:64
msgid "Groups"
msgstr "Groupes"
@@ -2192,10 +2301,10 @@ msgstr "Méthodes d'authentification"
#: templates/app_gateway/app_gateway_list.html:142
#: templates/app_gateway/application_details.html:62
#: templates/app_gateway/application_details.html:109
-#: templates/gatekeeper/gatekeeper_list.html:63
-#: templates/gatekeeper/gatekeeper_list.html:106
-#: templates/gatekeeper/gatekeeper_list.html:151
-#: templates/gatekeeper/gatekeeper_list.html:198
+#: templates/gatekeeper/gatekeeper_list.html:65
+#: templates/gatekeeper/gatekeeper_list.html:122
+#: templates/gatekeeper/gatekeeper_list.html:167
+#: templates/gatekeeper/gatekeeper_list.html:214
#: templates/scheduler/scheduleprofile_form.html:111
#: templates/scheduler/scheduleprofile_list.html:15
#: templates/wireguard/apply_route_template.html:28
@@ -2746,10 +2855,19 @@ msgid "Create Port forwarding Rule"
msgstr "Créer une règle de redirection de port"
#: templates/gatekeeper/gatekeeper_auth_method_form.html:63
+#: templates/gatekeeper/gatekeeper_user_form.html:43
msgid "View QR Code"
msgstr "Voir le code QR"
-#: templates/gatekeeper/gatekeeper_auth_method_form.html:74
+#: templates/gatekeeper/gatekeeper_auth_method_form.html:64
+#: templates/gatekeeper/gatekeeper_user_form.html:44
+#, fuzzy
+#| msgid "Global TOTP Secret"
+msgid "Generate TOTP Secret"
+msgstr "Secret TOTP mondial"
+
+#: templates/gatekeeper/gatekeeper_auth_method_form.html:93
+#: templates/gatekeeper/gatekeeper_user_form.html:73
msgid "Please enter a TOTP Secret first to generate the QR code."
msgstr "Veuillez d'abord saisir un secret TOTP pour générer le code QR."
@@ -2775,44 +2893,48 @@ msgstr "Utilisateurs"
msgid "Add User"
msgstr "Ajouter un utilisateur"
-#: templates/gatekeeper/gatekeeper_list.html:88
+#: templates/gatekeeper/gatekeeper_list.html:63
+msgid "TOTP"
+msgstr ""
+
+#: templates/gatekeeper/gatekeeper_list.html:104
msgid "No Gatekeeper Users found."
msgstr "Aucun utilisateur Gatekeeper trouvé."
-#: templates/gatekeeper/gatekeeper_list.html:95
+#: templates/gatekeeper/gatekeeper_list.html:111
msgid "Add Group"
msgstr "Ajouter un groupe"
-#: templates/gatekeeper/gatekeeper_list.html:131
+#: templates/gatekeeper/gatekeeper_list.html:147
msgid "No Gatekeeper Groups found."
msgstr "Aucun groupe Gatekeeper trouvé."
-#: templates/gatekeeper/gatekeeper_list.html:140
+#: templates/gatekeeper/gatekeeper_list.html:156
msgid "Add Auth Method"
msgstr "Ajouter une méthode d'authentification"
-#: templates/gatekeeper/gatekeeper_list.html:176
+#: templates/gatekeeper/gatekeeper_list.html:192
msgid "No Authentication Methods found."
msgstr "Aucune méthode d'authentification trouvée."
-#: templates/gatekeeper/gatekeeper_list.html:196
+#: templates/gatekeeper/gatekeeper_list.html:212
msgid "Identity"
msgstr "Identité"
-#: templates/gatekeeper/gatekeeper_list.html:197
-#: templates/gatekeeper/gatekeeper_list.html:259
+#: templates/gatekeeper/gatekeeper_list.html:213
+#: templates/gatekeeper/gatekeeper_list.html:275
msgid "Auth Method"
msgstr "Méthode d'authentification"
-#: templates/gatekeeper/gatekeeper_list.html:241
+#: templates/gatekeeper/gatekeeper_list.html:257
msgid "No Allowed Emails or Domains found."
msgstr "Aucun e-mail ou domaine autorisé trouvé."
-#: templates/gatekeeper/gatekeeper_list.html:260
+#: templates/gatekeeper/gatekeeper_list.html:276
msgid "Manage"
msgstr "Gérer"
-#: templates/gatekeeper/gatekeeper_list.html:293
+#: templates/gatekeeper/gatekeeper_list.html:309
msgid "No IP Addresses found."
msgstr "Aucune adresse IP trouvée."
@@ -3650,10 +3772,6 @@ msgstr ""
msgid "The two password fields didn't match."
msgstr "Les deux champs de mot de passe ne correspondent pas."
-#: user_manager/forms.py:127
-msgid "Password must be at least 8 characters long."
-msgstr "Le mot de passe doit comporter au moins 8 caractères."
-
#: user_manager/forms.py:220
msgid "A peer group with that name already exists."
msgstr "Un groupe de peers portant ce nom existe déjà."
@@ -4429,3 +4547,6 @@ msgstr ""
#: wireguard_tools/views.py:374
msgid "No interfaces found|No WireGuard interfaces were found to process."
msgstr "Aucune interface trouvée | Aucune interface WireGuard à traiter."
+
+#~ msgid "Global TOTP Before Authentication"
+#~ msgstr "TOTP global avant l'authentification"
diff --git a/locale/pt_BR/LC_MESSAGES/django.mo b/locale/pt_BR/LC_MESSAGES/django.mo
index 53a14d4..1073d4b 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 f0675e6..9381a19 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-14 11:54-0300\n"
+"POT-Creation-Date: 2026-03-15 17:20-0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -38,12 +38,12 @@ msgstr "Voltar"
#: templates/app_gateway/application_details.html:125
#: templates/firewall/manage_firewall_rule.html:382
#: templates/firewall/manage_redirect_rule.html:86
-#: templates/gatekeeper/gatekeeper_list.html:77
-#: templates/gatekeeper/gatekeeper_list.html:120
-#: templates/gatekeeper/gatekeeper_list.html:165
-#: templates/gatekeeper/gatekeeper_list.html:213
-#: templates/gatekeeper/gatekeeper_list.html:230
-#: templates/gatekeeper/gatekeeper_list.html:282
+#: templates/gatekeeper/gatekeeper_list.html:93
+#: templates/gatekeeper/gatekeeper_list.html:136
+#: templates/gatekeeper/gatekeeper_list.html:181
+#: templates/gatekeeper/gatekeeper_list.html:229
+#: templates/gatekeeper/gatekeeper_list.html:246
+#: templates/gatekeeper/gatekeeper_list.html:298
#: templates/scheduler/scheduleprofile_form.html:127
#: templates/scheduler/scheduleprofile_list.html:29
#: templates/wireguard/peer_list/peer_preview_modal.html:109
@@ -65,11 +65,11 @@ msgstr ""
"funcionar imediatamente."
#: api_v2/forms.py:63 app_gateway/forms.py:40 app_gateway/forms.py:92
-#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:226
-#: app_gateway/forms.py:267 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:139 gatekeeper/forms.py:226
-#: gatekeeper/forms.py:256 gatekeeper/forms.py:287
+#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:237
+#: app_gateway/forms.py:278 cluster/forms.py:67 cluster/forms.py:124
+#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:70
+#: gatekeeper/forms.py:150 gatekeeper/forms.py:212 gatekeeper/forms.py:299
+#: gatekeeper/forms.py:329 gatekeeper/forms.py:360
#: routing_templates/forms.py:71 scheduler/forms.py:102
#: templates/firewall/manage_firewall_rule.html:379
#: templates/firewall/manage_firewall_settings.html:59
@@ -83,13 +83,13 @@ msgid "Save"
msgstr "Salvar"
#: api_v2/models.py:10 app_gateway/forms.py:18 app_gateway/forms.py:106
-#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:99
+#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:174
#: routing_templates/forms.py:28 templates/api_v2/api_documentation.html:47
#: templates/api_v2/list.html:8 templates/app_gateway/app_gateway_list.html:58
#: templates/app_gateway/app_gateway_list.html:138
#: templates/app_gateway/application_details.html:26
#: templates/cluster/workers_list.html:8 templates/dns/static_host_list.html:68
-#: templates/gatekeeper/gatekeeper_list.html:149
+#: templates/gatekeeper/gatekeeper_list.html:165
#: templates/routing_templates/list.html:8
#: templates/scheduler/scheduleprofile_list.html:13
#: templates/user_manager/peer_group_list.html:8
@@ -133,10 +133,10 @@ msgstr "Habilitado"
#: app_gateway/views.py:293 app_gateway/views.py:328 app_gateway/views.py:354
#: app_gateway/views.py:404 app_gateway/views.py:432 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: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
+#: gatekeeper/views.py:48 gatekeeper/views.py:98 gatekeeper/views.py:121
+#: gatekeeper/views.py:151 gatekeeper/views.py:174 gatekeeper/views.py:222
+#: gatekeeper/views.py:281 gatekeeper/views.py:311 gatekeeper/views.py:334
+#: gatekeeper/views.py:364 gatekeeper/views.py:387 gatekeeper/views.py:436
#: templates/access_denied.html:9
msgid "Access Denied"
msgstr "Acesso Negado"
@@ -217,9 +217,9 @@ msgid "Upstream"
msgstr "Upstream"
#: app_gateway/forms.py:41 app_gateway/forms.py:93 app_gateway/forms.py:137
-#: app_gateway/forms.py:155 app_gateway/forms.py:227 app_gateway/forms.py:268
-#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:140
-#: gatekeeper/forms.py:227 gatekeeper/forms.py:257 gatekeeper/forms.py:288
+#: app_gateway/forms.py:155 app_gateway/forms.py:238 app_gateway/forms.py:279
+#: gatekeeper/forms.py:71 gatekeeper/forms.py:151 gatekeeper/forms.py:213
+#: gatekeeper/forms.py:300 gatekeeper/forms.py:330 gatekeeper/forms.py:361
#: scheduler/forms.py:103
#: templates/app_gateway/access_policy_type_select.html:50
#: templates/generic_delete_confirmation.html:19
@@ -263,19 +263,26 @@ msgstr "Grupos Permitidos"
msgid "Authentication Methods"
msgstr "Métodos de Autenticação"
-#: app_gateway/forms.py:185
+#: app_gateway/forms.py:188
msgid "Cannot select more than one Local Password authentication method."
msgstr ""
"Não é possível selecionar mais de um método de autenticação por Senha Local."
-#: app_gateway/forms.py:189
+#: app_gateway/forms.py:192
msgid ""
"Cannot select more than one OpenID Connect (OIDC) authentication method."
msgstr ""
"Não é possível selecionar mais de um método de autenticação OpenID Connect "
"(OIDC)."
-#: app_gateway/forms.py:193
+#: app_gateway/forms.py:196
+#, fuzzy
+#| msgid "Cannot select more than one Local Password authentication method."
+msgid "Cannot select more than one TOTP authentication method."
+msgstr ""
+"Não é possível selecionar mais de um método de autenticação por Senha Local."
+
+#: app_gateway/forms.py:200
msgid ""
"Cannot select both Local Password and OpenID Connect (OIDC) authentication "
"methods."
@@ -283,7 +290,19 @@ msgstr ""
"Não é possível selecionar simultaneamente os métodos de autenticação por "
"Senha Local e OpenID Connect (OIDC)."
-#: app_gateway/forms.py:197
+#: app_gateway/forms.py:204
+#, fuzzy
+#| msgid ""
+#| "Cannot select both Local Password and OpenID Connect (OIDC) "
+#| "authentication methods."
+msgid ""
+"TOTP must be combined with a Local Password or OpenID Connect authentication "
+"method."
+msgstr ""
+"Não é possível selecionar simultaneamente os métodos de autenticação por "
+"Senha Local e OpenID Connect (OIDC)."
+
+#: app_gateway/forms.py:208
msgid ""
"At least one user group must be selected when using Local Password "
"authentication."
@@ -291,30 +310,30 @@ msgstr ""
"Pelo menos um grupo de usuários deve ser selecionado ao usar a autenticação "
"por Senha Local."
-#: app_gateway/forms.py:201
+#: app_gateway/forms.py:212
msgid "User groups can only be used with Local Password authentication."
msgstr ""
"Grupos de usuários só podem ser usados com autenticação por Senha Local."
-#: app_gateway/forms.py:211 templates/app_gateway/app_gateway_list.html:62
+#: app_gateway/forms.py:222 templates/app_gateway/app_gateway_list.html:62
#: templates/app_gateway/application_details.html:31
#: templates/firewall/firewall_nav_tabs.html:15
msgid "Default Policy"
msgstr "Política Padrão"
-#: app_gateway/forms.py:240 templates/app_gateway/application_details.html:105
+#: app_gateway/forms.py:251 templates/app_gateway/application_details.html:105
msgid "Route Name"
msgstr "Nome da Rota"
-#: app_gateway/forms.py:241 templates/app_gateway/application_details.html:106
+#: app_gateway/forms.py:252 templates/app_gateway/application_details.html:106
msgid "Path Prefix"
msgstr "Prefixo do Caminho"
-#: app_gateway/forms.py:242 templates/app_gateway/application_details.html:107
+#: app_gateway/forms.py:253 templates/app_gateway/application_details.html:107
msgid "Policy"
msgstr "Política"
-#: app_gateway/forms.py:243 templates/app_gateway/application_details.html:108
+#: app_gateway/forms.py:254 templates/app_gateway/application_details.html:108
msgid "Order"
msgstr "Ordem"
@@ -332,9 +351,9 @@ msgstr "Público"
msgid "Protected"
msgstr "Protegido"
-#: app_gateway/models.py:45 gatekeeper/models.py:110
+#: app_gateway/models.py:45 gatekeeper/models.py:108
#: templates/app_gateway/access_policy_type_select.html:41
-#: templates/gatekeeper/gatekeeper_list.html:272
+#: templates/gatekeeper/gatekeeper_list.html:288
msgid "Deny"
msgstr "Negar"
@@ -615,11 +634,11 @@ msgstr "Excluir Rota da Aplicação"
msgid "Are you sure you want to delete the route \"%(name)s\" (%(path)s)?"
msgstr "Tem certeza de que deseja excluir a rota \"%(name)s\" (%(path)s)?"
-#: app_gateway/views.py:444
+#: app_gateway/views.py:443
msgid "Configuration exported successfully."
msgstr "Configuração exportada com sucesso."
-#: app_gateway/views.py:446
+#: app_gateway/views.py:445
msgid ""
"Caddy is not active. Configuration files were exported for debugging "
"purposes."
@@ -631,13 +650,13 @@ msgstr ""
msgid "IP Lock"
msgstr "Bloqueio de IP"
-#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:198
+#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:271
#: templates/cluster/workers_list.html:10
#: templates/dns/static_host_list.html:18
#: templates/firewall/manage_redirect_rule.html:43
#: templates/firewall/manage_redirect_rule.html:67
#: templates/firewall/manage_redirect_rule.html:68
-#: templates/gatekeeper/gatekeeper_list.html:256
+#: templates/gatekeeper/gatekeeper_list.html:272
#: templates/wireguard/wireguard_status.html:45
msgid "IP Address"
msgstr "Endereço IP"
@@ -912,7 +931,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:201
+#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:274
#: templates/api_v2/api_documentation.html:51
#: templates/dns/static_host_list.html:69
#: templates/firewall/manage_redirect_rule.html:18
@@ -1247,43 +1266,29 @@ msgstr "Gerenciar Configurações de Firewall"
msgid "Firewall settings saved successfully"
msgstr "Configurações de Firewall salvas com sucesso"
-#: gatekeeper/forms.py:17 templates/accounts/login.html:14
-#: templates/gatekeeper/gatekeeper_list.html:61
-#: templates/user_manager/list.html:8 user_manager/forms.py:13
-#: vpn_invite/forms.py:281
-msgid "Username"
-msgstr "Usuário"
-
-#: 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
-msgid "Email"
-msgstr "Email"
-
-#: gatekeeper/forms.py:19 templates/accounts/login.html:23
+#: gatekeeper/forms.py:17 templates/accounts/login.html:23
#: templates/vpn_invite/invite_settings.html:19 user_manager/forms.py:14
#: vpn_invite/forms.py:282
msgid "Password"
msgstr "Senha"
#: gatekeeper/forms.py:20
-msgid "TOTP Secret"
-msgstr "Segredo TOTP"
+msgid ""
+"Minimum 8 characters, with at least one uppercase letter, one lowercase "
+"letter, and one number."
+msgstr ""
-#: gatekeeper/forms.py:55 templates/gatekeeper/gatekeeper_list.html:104
-msgid "Group Name"
-msgstr "Nome do Grupo"
+#: gatekeeper/forms.py:23
+#, fuzzy
+#| msgid "Random Password"
+msgid "Confirm Password"
+msgstr "Senha Aleatória"
-#: gatekeeper/forms.py:56 templates/gatekeeper/gatekeeper_list.html:105
-msgid "Members"
-msgstr "Membros"
-
-#: gatekeeper/forms.py:86
+#: gatekeeper/forms.py:28 gatekeeper/forms.py:161
msgid "TOTP Validation PIN"
msgstr "PIN de Validação TOTP"
-#: gatekeeper/forms.py:89
+#: gatekeeper/forms.py:31 gatekeeper/forms.py:164
msgid ""
"Enter a 6-digit PIN generated by your authenticator app to validate the "
"secret."
@@ -1291,90 +1296,146 @@ msgstr ""
"Insira um PIN de 6 dígitos gerado pelo seu aplicativo autenticador para "
"validar o segredo."
-#: gatekeeper/forms.py:100
+#: gatekeeper/forms.py:38 templates/accounts/login.html:14
+#: templates/gatekeeper/gatekeeper_list.html:61
+#: templates/user_manager/list.html:8 user_manager/forms.py:13
+#: vpn_invite/forms.py:281
+msgid "Username"
+msgstr "Usuário"
+
+#: gatekeeper/forms.py:39 gatekeeper/forms.py:344
+#: templates/gatekeeper/gatekeeper_list.html:62
+#: templates/gatekeeper/gatekeeper_list.html:220
+#: templates/wireguard/peer_list/peer_preview_modal.html:103
+msgid "Email"
+msgstr "Email"
+
+#: gatekeeper/forms.py:40
+msgid "TOTP Secret"
+msgstr "Segredo TOTP"
+
+#: gatekeeper/forms.py:87
+#, fuzzy
+#| msgid "Port is required."
+msgid "Password is required."
+msgstr "Porta é obrigatória."
+
+#: gatekeeper/forms.py:90 user_manager/forms.py:127
+msgid "Password must be at least 8 characters long."
+msgstr "Senha deve ter pelo menos 8 caracteres."
+
+#: gatekeeper/forms.py:92
+#, fuzzy
+#| msgid "Password must be at least 8 characters long."
+msgid "Password must contain at least one lowercase letter."
+msgstr "Senha deve ter pelo menos 8 caracteres."
+
+#: gatekeeper/forms.py:94
+#, fuzzy
+#| msgid "Password must be at least 8 characters long."
+msgid "Password must contain at least one uppercase letter."
+msgstr "Senha deve ter pelo menos 8 caracteres."
+
+#: gatekeeper/forms.py:96
+#, fuzzy
+#| msgid "Password must be at least 8 characters long."
+msgid "Password must contain at least one number."
+msgstr "Senha deve ter pelo menos 8 caracteres."
+
+#: gatekeeper/forms.py:98
+#, fuzzy
+#| msgid "Password Confirmation"
+msgid "Passwords do not match."
+msgstr "Confirmação de Senha"
+
+#: gatekeeper/forms.py:103 gatekeeper/forms.py:249
+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:108 gatekeeper/forms.py:254
+msgid "Invalid TOTP PIN."
+msgstr "PIN TOTP inválido."
+
+#: gatekeeper/forms.py:110 gatekeeper/forms.py:256
+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:130 templates/gatekeeper/gatekeeper_list.html:120
+msgid "Group Name"
+msgstr "Nome do Grupo"
+
+#: gatekeeper/forms.py:131 templates/gatekeeper/gatekeeper_list.html:121
+msgid "Members"
+msgstr "Membros"
+
+#: gatekeeper/forms.py:175
msgid "Authentication Type"
msgstr "Tipo de Autenticação"
-#: gatekeeper/forms.py:101
+#: gatekeeper/forms.py:176
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
+#: gatekeeper/forms.py:177
msgid "OIDC Provider URL"
msgstr "URL do Provedor OIDC"
-#: gatekeeper/forms.py:104
+#: gatekeeper/forms.py:178
msgid "OIDC Client ID"
msgstr "ID do Cliente OIDC"
-#: gatekeeper/forms.py:105
+#: gatekeeper/forms.py:179
msgid "OIDC Client Secret"
msgstr "Segredo do Cliente OIDC"
-#: gatekeeper/forms.py:157
+#: gatekeeper/forms.py:230
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:159
+#: gatekeeper/forms.py:232
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:161
+#: gatekeeper/forms.py:234
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:167
+#: gatekeeper/forms.py:240
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:170
+#: gatekeeper/forms.py:243
msgid "OIDC fields must be empty for TOTP authentication."
msgstr "Os campos OIDC devem estar vazios para autenticação por TOTP."
-#: gatekeeper/forms.py:172
+#: gatekeeper/forms.py:245
msgid "TOTP secret is required for TOTP authentication."
msgstr "O segredo TOTP é obrigatório para autenticação por TOTP."
-#: 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:181
-msgid "Invalid TOTP PIN."
-msgstr "PIN TOTP inválido."
-
-#: 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:186
+#: gatekeeper/forms.py:259
msgid "TOTP secret must be empty for OIDC authentication."
msgstr "O segredo TOTP deve estar vazio para autenticação por OIDC."
-#: gatekeeper/forms.py:188
+#: gatekeeper/forms.py:261
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:197 gatekeeper/forms.py:239 gatekeeper/forms.py:270
+#: gatekeeper/forms.py:270 gatekeeper/forms.py:312 gatekeeper/forms.py:343
msgid "Authentication Method"
msgstr "Método de Autenticação"
-#: gatekeeper/forms.py:199 templates/gatekeeper/gatekeeper_list.html:257
+#: gatekeeper/forms.py:272 templates/gatekeeper/gatekeeper_list.html:273
msgid "Prefix Length"
msgstr "Comprimento do Prefixo"
-#: gatekeeper/forms.py:200 templates/firewall/firewall_rule_list.html:47
+#: gatekeeper/forms.py:273 templates/firewall/firewall_rule_list.html:47
#: templates/firewall/manage_firewall_rule.html:360
-#: templates/gatekeeper/gatekeeper_list.html:258
+#: templates/gatekeeper/gatekeeper_list.html:274
msgid "Action"
msgstr "Ação"
-#: gatekeeper/forms.py:240 templates/gatekeeper/gatekeeper_list.html:221
+#: gatekeeper/forms.py:313 templates/gatekeeper/gatekeeper_list.html:237
msgid "Domain"
msgstr "Domínio"
@@ -1398,15 +1459,15 @@ msgstr "Lista de Endereços IP"
msgid "Shared/global TOTP secret key"
msgstr "Chave secreta TOTP compartilhada/global"
-#: gatekeeper/models.py:69
+#: gatekeeper/models.py:68
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:71
+#: gatekeeper/models.py:69
msgid "Per-user TOTP secret key"
msgstr "Chave secreta TOTP por usuário"
-#: gatekeeper/models.py:110 templates/gatekeeper/gatekeeper_list.html:270
+#: gatekeeper/models.py:108 templates/gatekeeper/gatekeeper_list.html:286
msgid "Allow"
msgstr "Permitir"
@@ -1422,57 +1483,102 @@ msgstr "Criar Usuário Gatekeeper"
msgid "Gatekeeper User saved successfully."
msgstr "Usuário Gatekeeper salvo com sucesso."
-#: gatekeeper/views.py:86
+#: gatekeeper/views.py:69
+msgid ""
+"\n"
+" Gatekeeper User
\n"
+" Gatekeeper users are used for authenticating against protected "
+"applications managed by this gateway.
\n"
+"\n"
+" Password
\n"
+" Required when creating a user. When editing, leave both password "
+"fields blank to keep the current password.\n"
+" Passwords are stored using Argon2id hashing.
\n"
+"\n"
+" TOTP Secret
\n"
+" Optional per-user TOTP secret. When set, this user will "
+"authenticate using their own secret instead of the\n"
+" global TOTP secret configured on the Authentication Method. Use the "
+"buttons below the field to generate a\n"
+" random secret and scan the QR code with your authenticator app. "
+"Validate the secret by entering the current\n"
+" 6-digit PIN before saving.
\n"
+" "
+msgstr ""
+
+#: gatekeeper/views.py:106
msgid "Gatekeeper User deleted successfully."
msgstr "Usuário Gatekeeper excluído com sucesso."
-#: gatekeeper/views.py:91
+#: gatekeeper/views.py:111
msgid "Delete Gatekeeper User"
msgstr "Excluir Usuário Gatekeeper"
-#: gatekeeper/views.py:93
+#: gatekeeper/views.py:113
#, python-format
msgid "Are you sure you want to delete the user \"%(username)s\"?"
msgstr "Tem certeza de que deseja excluir o usuário \"%(username)s\"?"
-#: gatekeeper/views.py:107
+#: gatekeeper/views.py:127
msgid "Edit Gatekeeper Group"
msgstr "Editar Grupo Gatekeeper"
-#: gatekeeper/views.py:110
+#: gatekeeper/views.py:130
msgid "Create Gatekeeper Group"
msgstr "Criar Grupo Gatekeeper"
-#: gatekeeper/views.py:117
+#: gatekeeper/views.py:137
msgid "Gatekeeper Group saved successfully."
msgstr "Grupo Gatekeeper salvo com sucesso."
-#: gatekeeper/views.py:139
+#: gatekeeper/views.py:159
msgid "Gatekeeper Group deleted successfully."
msgstr "Grupo Gatekeeper excluído com sucesso."
-#: gatekeeper/views.py:144
+#: gatekeeper/views.py:164
msgid "Delete Gatekeeper Group"
msgstr "Excluir Grupo Gatekeeper"
-#: gatekeeper/views.py:146
+#: gatekeeper/views.py:166
#, python-format
msgid "Are you sure you want to delete the group \"%(name)s\"?"
msgstr "Tem certeza de que deseja excluir o grupo \"%(name)s\"?"
-#: gatekeeper/views.py:160
+#: gatekeeper/views.py:180
msgid "Edit Authentication Method"
msgstr "Editar Método de Autenticação"
-#: gatekeeper/views.py:163
+#: gatekeeper/views.py:183
msgid "Create Authentication Method"
msgstr "Criar Método de Autenticação"
-#: gatekeeper/views.py:170
+#: gatekeeper/views.py:190
msgid "Authentication Method saved successfully."
msgstr "Método de Autenticação salvo com sucesso."
-#: gatekeeper/views.py:175
+#: gatekeeper/views.py:195
+#, fuzzy
+#| msgid ""
+#| "\n"
+#| " Authentication Types
\n"
+#| " Select how users will authenticate through this method.
\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"
+#| " "
msgid ""
"\n"
" Authentication Types
\n"
@@ -1489,9 +1595,8 @@ msgid ""
" \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"
+"app. If a user does not have a personal TOTP configured, the Global "
+"TOTP Secret will be used instead. \n"
" "
msgstr ""
"\n"
@@ -1516,84 +1621,84 @@ msgstr ""
"força bruta.\n"
" "
-#: gatekeeper/views.py:210
+#: gatekeeper/views.py:230
msgid "Authentication Method deleted successfully."
msgstr "Método de Autenticação excluído com sucesso."
-#: gatekeeper/views.py:215
+#: gatekeeper/views.py:235
msgid "Delete Authentication Method"
msgstr "Excluir Método de Autenticação"
-#: gatekeeper/views.py:217
+#: gatekeeper/views.py:237
#, 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:267
+#: gatekeeper/views.py:287
msgid "Edit Allowed Domain"
msgstr "Editar Domínio Permitido"
-#: gatekeeper/views.py:270 templates/gatekeeper/gatekeeper_list.html:186
+#: gatekeeper/views.py:290 templates/gatekeeper/gatekeeper_list.html:202
msgid "Add Allowed Domain"
msgstr "Adicionar Domínio Permitido"
-#: gatekeeper/views.py:277
+#: gatekeeper/views.py:297
msgid "Allowed Domain saved successfully."
msgstr "Domínio Permitido salvo com sucesso."
-#: gatekeeper/views.py:299
+#: gatekeeper/views.py:319
msgid "Allowed Domain deleted successfully."
msgstr "Domínio Permitido excluído com sucesso."
-#: gatekeeper/views.py:304
+#: gatekeeper/views.py:324
msgid "Delete Allowed Domain"
msgstr "Excluir Domínio Permitido"
-#: gatekeeper/views.py:306
+#: gatekeeper/views.py:326
#, 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:320
+#: gatekeeper/views.py:340
msgid "Edit Allowed Email"
msgstr "Editar E-mail Permitido"
-#: gatekeeper/views.py:323 templates/gatekeeper/gatekeeper_list.html:183
+#: gatekeeper/views.py:343 templates/gatekeeper/gatekeeper_list.html:199
msgid "Add Allowed Email"
msgstr "Adicionar E-mail Permitido"
-#: gatekeeper/views.py:330
+#: gatekeeper/views.py:350
msgid "Allowed Email saved successfully."
msgstr "E-mail Permitido salvo com sucesso."
-#: gatekeeper/views.py:352
+#: gatekeeper/views.py:372
msgid "Allowed Email deleted successfully."
msgstr "E-mail Permitido excluído com sucesso."
-#: gatekeeper/views.py:357
+#: gatekeeper/views.py:377
msgid "Delete Allowed Email"
msgstr "Excluir E-mail Permitido"
-#: gatekeeper/views.py:359
+#: gatekeeper/views.py:379
#, 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:373
+#: gatekeeper/views.py:393
msgid "Edit IP Address"
msgstr "Editar Endereço IP"
-#: gatekeeper/views.py:376 templates/gatekeeper/gatekeeper_list.html:247
+#: gatekeeper/views.py:396 templates/gatekeeper/gatekeeper_list.html:263
#: templates/wireguard/wireguard_manage_peer.html:171
msgid "Add IP Address"
msgstr "Adicionar IP"
-#: gatekeeper/views.py:383
+#: gatekeeper/views.py:403
msgid "IP Address saved successfully."
msgstr "Endereço IP salvo com sucesso."
-#: gatekeeper/views.py:388
+#: gatekeeper/views.py:408
msgid ""
"\n"
" IP Address List
\n"
@@ -1640,15 +1745,15 @@ msgstr ""
"\"Rede do Escritório\", \"Atacante Bloqueado\").\n"
" "
-#: gatekeeper/views.py:424
+#: gatekeeper/views.py:444
msgid "IP Address deleted successfully."
msgstr "Endereço IP excluído com sucesso."
-#: gatekeeper/views.py:429
+#: gatekeeper/views.py:449
msgid "Delete IP Address"
msgstr "Excluir Endereço IP"
-#: gatekeeper/views.py:431
+#: gatekeeper/views.py:451
#, 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\"?"
@@ -2016,8 +2121,8 @@ msgid "In"
msgstr "Entrada"
#: templates/api_v2/api_documentation.html:49
-#: templates/gatekeeper/gatekeeper_list.html:150
-#: templates/gatekeeper/gatekeeper_list.html:195
+#: templates/gatekeeper/gatekeeper_list.html:166
+#: templates/gatekeeper/gatekeeper_list.html:211
#: templates/wireguard/apply_route_template.html:27
msgid "Type"
msgstr "Tipo"
@@ -2027,11 +2132,13 @@ msgid "Required"
msgstr "Obrigatório"
#: templates/api_v2/api_documentation.html:62
+#: templates/gatekeeper/gatekeeper_list.html:75
#: templates/scheduler/scheduleprofile_form.html:175
msgid "Yes"
msgstr "Sim"
#: templates/api_v2/api_documentation.html:64
+#: templates/gatekeeper/gatekeeper_list.html:77
#: templates/scheduler/scheduleprofile_form.html:177
msgid "No"
msgstr "Não"
@@ -2076,12 +2183,12 @@ msgstr "Desabilitado"
#: templates/app_gateway/application_details.html:121
#: templates/cluster/workers_list.html:77
#: templates/dns/static_host_list.html:74
-#: templates/gatekeeper/gatekeeper_list.html:73
-#: templates/gatekeeper/gatekeeper_list.html:116
-#: templates/gatekeeper/gatekeeper_list.html:161
-#: templates/gatekeeper/gatekeeper_list.html:209
-#: templates/gatekeeper/gatekeeper_list.html:226
-#: templates/gatekeeper/gatekeeper_list.html:278
+#: templates/gatekeeper/gatekeeper_list.html:89
+#: templates/gatekeeper/gatekeeper_list.html:132
+#: templates/gatekeeper/gatekeeper_list.html:177
+#: templates/gatekeeper/gatekeeper_list.html:225
+#: templates/gatekeeper/gatekeeper_list.html:242
+#: templates/gatekeeper/gatekeeper_list.html:294
#: templates/routing_templates/list.html:29
#: templates/scheduler/scheduleprofile_form.html:123
#: templates/scheduler/scheduleprofile_list.html:25
@@ -2163,6 +2270,7 @@ msgstr "Adicionar Política de Acesso"
#: templates/app_gateway/app_gateway_list.html:140
#: templates/gatekeeper/gatekeeper_list.html:43
+#: templates/gatekeeper/gatekeeper_list.html:64
msgid "Groups"
msgstr "Grupos"
@@ -2173,10 +2281,10 @@ msgstr "Métodos de Autenticação"
#: templates/app_gateway/app_gateway_list.html:142
#: templates/app_gateway/application_details.html:62
#: templates/app_gateway/application_details.html:109
-#: templates/gatekeeper/gatekeeper_list.html:63
-#: templates/gatekeeper/gatekeeper_list.html:106
-#: templates/gatekeeper/gatekeeper_list.html:151
-#: templates/gatekeeper/gatekeeper_list.html:198
+#: templates/gatekeeper/gatekeeper_list.html:65
+#: templates/gatekeeper/gatekeeper_list.html:122
+#: templates/gatekeeper/gatekeeper_list.html:167
+#: templates/gatekeeper/gatekeeper_list.html:214
#: templates/scheduler/scheduleprofile_form.html:111
#: templates/scheduler/scheduleprofile_list.html:15
#: templates/wireguard/apply_route_template.html:28
@@ -2734,10 +2842,19 @@ msgid "Create Port forwarding Rule"
msgstr "Criar Regra de Encaminhamento de Porta"
#: templates/gatekeeper/gatekeeper_auth_method_form.html:63
+#: templates/gatekeeper/gatekeeper_user_form.html:43
msgid "View QR Code"
msgstr "Ver Código QR"
-#: templates/gatekeeper/gatekeeper_auth_method_form.html:74
+#: templates/gatekeeper/gatekeeper_auth_method_form.html:64
+#: templates/gatekeeper/gatekeeper_user_form.html:44
+#, fuzzy
+#| msgid "Global TOTP Secret"
+msgid "Generate TOTP Secret"
+msgstr "Segredo TOTP Global"
+
+#: templates/gatekeeper/gatekeeper_auth_method_form.html:93
+#: templates/gatekeeper/gatekeeper_user_form.html:73
msgid "Please enter a TOTP Secret first to generate the QR code."
msgstr "Por favor, insira um Segredo TOTP primeiro para gerar o código QR."
@@ -2763,44 +2880,48 @@ msgstr "Usuários"
msgid "Add User"
msgstr "Adicionar Usuário"
-#: templates/gatekeeper/gatekeeper_list.html:88
+#: templates/gatekeeper/gatekeeper_list.html:63
+msgid "TOTP"
+msgstr ""
+
+#: templates/gatekeeper/gatekeeper_list.html:104
msgid "No Gatekeeper Users found."
msgstr "Nenhum Usuário Gatekeeper encontrado."
-#: templates/gatekeeper/gatekeeper_list.html:95
+#: templates/gatekeeper/gatekeeper_list.html:111
msgid "Add Group"
msgstr "Adicionar Grupo"
-#: templates/gatekeeper/gatekeeper_list.html:131
+#: templates/gatekeeper/gatekeeper_list.html:147
msgid "No Gatekeeper Groups found."
msgstr "Nenhum Grupo Gatekeeper encontrado."
-#: templates/gatekeeper/gatekeeper_list.html:140
+#: templates/gatekeeper/gatekeeper_list.html:156
msgid "Add Auth Method"
msgstr "Adicionar Método de Autenticação"
-#: templates/gatekeeper/gatekeeper_list.html:176
+#: templates/gatekeeper/gatekeeper_list.html:192
msgid "No Authentication Methods found."
msgstr "Nenhum Método de Autenticação encontrado."
-#: templates/gatekeeper/gatekeeper_list.html:196
+#: templates/gatekeeper/gatekeeper_list.html:212
msgid "Identity"
msgstr "Identidade"
-#: templates/gatekeeper/gatekeeper_list.html:197
-#: templates/gatekeeper/gatekeeper_list.html:259
+#: templates/gatekeeper/gatekeeper_list.html:213
+#: templates/gatekeeper/gatekeeper_list.html:275
msgid "Auth Method"
msgstr "Método de Autenticação"
-#: templates/gatekeeper/gatekeeper_list.html:241
+#: templates/gatekeeper/gatekeeper_list.html:257
msgid "No Allowed Emails or Domains found."
msgstr "Nenhum E-mail ou Domínio Permitido encontrado."
-#: templates/gatekeeper/gatekeeper_list.html:260
+#: templates/gatekeeper/gatekeeper_list.html:276
msgid "Manage"
msgstr "Gerenciar"
-#: templates/gatekeeper/gatekeeper_list.html:293
+#: templates/gatekeeper/gatekeeper_list.html:309
msgid "No IP Addresses found."
msgstr "Nenhum Endereço IP encontrado."
@@ -3638,10 +3759,6 @@ msgstr "Confirmação de senha é obrigatória para novos usuários."
msgid "The two password fields didn't match."
msgstr "As duas senhas não coincidem."
-#: user_manager/forms.py:127
-msgid "Password must be at least 8 characters long."
-msgstr "Senha deve ter pelo menos 8 caracteres."
-
#: user_manager/forms.py:220
msgid "A peer group with that name already exists."
msgstr "Um grupo de peers com esse nome já existe."
@@ -4410,3 +4527,6 @@ msgid "No interfaces found|No WireGuard interfaces were found to process."
msgstr ""
"Nenhuma interface encontrada|Nenhuma interface WireGuard foi encontrada para "
"processar."
+
+#~ msgid "Global TOTP Before Authentication"
+#~ msgstr "TOTP Global Antes da Autenticação"
diff --git a/locale/sk/LC_MESSAGES/django.mo b/locale/sk/LC_MESSAGES/django.mo
index bf739f9..29c1d42 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 29765fa..15add00 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-14 11:54-0300\n"
+"POT-Creation-Date: 2026-03-15 17:20-0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -39,12 +39,12 @@ msgstr "Späť"
#: templates/app_gateway/application_details.html:125
#: templates/firewall/manage_firewall_rule.html:382
#: templates/firewall/manage_redirect_rule.html:86
-#: templates/gatekeeper/gatekeeper_list.html:77
-#: templates/gatekeeper/gatekeeper_list.html:120
-#: templates/gatekeeper/gatekeeper_list.html:165
-#: templates/gatekeeper/gatekeeper_list.html:213
-#: templates/gatekeeper/gatekeeper_list.html:230
-#: templates/gatekeeper/gatekeeper_list.html:282
+#: templates/gatekeeper/gatekeeper_list.html:93
+#: templates/gatekeeper/gatekeeper_list.html:136
+#: templates/gatekeeper/gatekeeper_list.html:181
+#: templates/gatekeeper/gatekeeper_list.html:229
+#: templates/gatekeeper/gatekeeper_list.html:246
+#: templates/gatekeeper/gatekeeper_list.html:298
#: templates/scheduler/scheduleprofile_form.html:127
#: templates/scheduler/scheduleprofile_list.html:29
#: templates/wireguard/peer_list/peer_preview_modal.html:109
@@ -65,11 +65,11 @@ msgstr ""
"Naozaj chcete regenerovať token? Starý token okamžite prestane fungovať."
#: api_v2/forms.py:63 app_gateway/forms.py:40 app_gateway/forms.py:92
-#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:226
-#: app_gateway/forms.py:267 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:139 gatekeeper/forms.py:226
-#: gatekeeper/forms.py:256 gatekeeper/forms.py:287
+#: app_gateway/forms.py:136 app_gateway/forms.py:154 app_gateway/forms.py:237
+#: app_gateway/forms.py:278 cluster/forms.py:67 cluster/forms.py:124
+#: dns/forms.py:37 dns/forms.py:84 dns/forms.py:153 gatekeeper/forms.py:70
+#: gatekeeper/forms.py:150 gatekeeper/forms.py:212 gatekeeper/forms.py:299
+#: gatekeeper/forms.py:329 gatekeeper/forms.py:360
#: routing_templates/forms.py:71 scheduler/forms.py:102
#: templates/firewall/manage_firewall_rule.html:379
#: templates/firewall/manage_firewall_settings.html:59
@@ -83,13 +83,13 @@ msgid "Save"
msgstr "Uložiť"
#: api_v2/models.py:10 app_gateway/forms.py:18 app_gateway/forms.py:106
-#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:99
+#: cluster/forms.py:18 dns/forms.py:130 gatekeeper/forms.py:174
#: routing_templates/forms.py:28 templates/api_v2/api_documentation.html:47
#: templates/api_v2/list.html:8 templates/app_gateway/app_gateway_list.html:58
#: templates/app_gateway/app_gateway_list.html:138
#: templates/app_gateway/application_details.html:26
#: templates/cluster/workers_list.html:8 templates/dns/static_host_list.html:68
-#: templates/gatekeeper/gatekeeper_list.html:149
+#: templates/gatekeeper/gatekeeper_list.html:165
#: templates/routing_templates/list.html:8
#: templates/scheduler/scheduleprofile_list.html:13
#: templates/user_manager/peer_group_list.html:8
@@ -133,10 +133,10 @@ msgstr "Povolené"
#: app_gateway/views.py:293 app_gateway/views.py:328 app_gateway/views.py:354
#: app_gateway/views.py:404 app_gateway/views.py:432 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: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
+#: gatekeeper/views.py:48 gatekeeper/views.py:98 gatekeeper/views.py:121
+#: gatekeeper/views.py:151 gatekeeper/views.py:174 gatekeeper/views.py:222
+#: gatekeeper/views.py:281 gatekeeper/views.py:311 gatekeeper/views.py:334
+#: gatekeeper/views.py:364 gatekeeper/views.py:387 gatekeeper/views.py:436
#: templates/access_denied.html:9
msgid "Access Denied"
msgstr "Prístup zamietnutý"
@@ -217,9 +217,9 @@ msgid "Upstream"
msgstr "Upstream"
#: app_gateway/forms.py:41 app_gateway/forms.py:93 app_gateway/forms.py:137
-#: app_gateway/forms.py:155 app_gateway/forms.py:227 app_gateway/forms.py:268
-#: gatekeeper/forms.py:42 gatekeeper/forms.py:76 gatekeeper/forms.py:140
-#: gatekeeper/forms.py:227 gatekeeper/forms.py:257 gatekeeper/forms.py:288
+#: app_gateway/forms.py:155 app_gateway/forms.py:238 app_gateway/forms.py:279
+#: gatekeeper/forms.py:71 gatekeeper/forms.py:151 gatekeeper/forms.py:213
+#: gatekeeper/forms.py:300 gatekeeper/forms.py:330 gatekeeper/forms.py:361
#: scheduler/forms.py:103
#: templates/app_gateway/access_policy_type_select.html:50
#: templates/generic_delete_confirmation.html:19
@@ -264,17 +264,23 @@ msgstr "Povolené skupiny"
msgid "Authentication Methods"
msgstr "Metódy autentifikácie"
-#: app_gateway/forms.py:185
+#: app_gateway/forms.py:188
msgid "Cannot select more than one Local Password authentication method."
msgstr "Nemožno vybrať viac ako jednu metódu autentifikácie lokálnym heslom."
-#: app_gateway/forms.py:189
+#: app_gateway/forms.py:192
msgid ""
"Cannot select more than one OpenID Connect (OIDC) authentication method."
msgstr ""
"Nemožno vybrať viac ako jednu metódu autentifikácie OpenID Connect (OIDC)."
-#: app_gateway/forms.py:193
+#: app_gateway/forms.py:196
+#, fuzzy
+#| msgid "Cannot select more than one Local Password authentication method."
+msgid "Cannot select more than one TOTP authentication method."
+msgstr "Nemožno vybrať viac ako jednu metódu autentifikácie lokálnym heslom."
+
+#: app_gateway/forms.py:200
msgid ""
"Cannot select both Local Password and OpenID Connect (OIDC) authentication "
"methods."
@@ -282,7 +288,19 @@ msgstr ""
"Nemožno vybrať súčasne metódy autentifikácie lokálnym heslom a OpenID "
"Connect (OIDC)."
-#: app_gateway/forms.py:197
+#: app_gateway/forms.py:204
+#, fuzzy
+#| msgid ""
+#| "Cannot select both Local Password and OpenID Connect (OIDC) "
+#| "authentication methods."
+msgid ""
+"TOTP must be combined with a Local Password or OpenID Connect authentication "
+"method."
+msgstr ""
+"Nemožno vybrať súčasne metódy autentifikácie lokálnym heslom a OpenID "
+"Connect (OIDC)."
+
+#: app_gateway/forms.py:208
msgid ""
"At least one user group must be selected when using Local Password "
"authentication."
@@ -290,30 +308,30 @@ msgstr ""
"Pri použití autentifikácie lokálnym heslom musí byť vybraná aspoň jedna "
"skupina používateľov."
-#: app_gateway/forms.py:201
+#: app_gateway/forms.py:212
msgid "User groups can only be used with Local Password authentication."
msgstr ""
"Skupiny používateľov možno použiť len s autentifikáciou lokálnym heslom."
-#: app_gateway/forms.py:211 templates/app_gateway/app_gateway_list.html:62
+#: app_gateway/forms.py:222 templates/app_gateway/app_gateway_list.html:62
#: templates/app_gateway/application_details.html:31
#: templates/firewall/firewall_nav_tabs.html:15
msgid "Default Policy"
msgstr "Predvolená politika"
-#: app_gateway/forms.py:240 templates/app_gateway/application_details.html:105
+#: app_gateway/forms.py:251 templates/app_gateway/application_details.html:105
msgid "Route Name"
msgstr "Názov trasy"
-#: app_gateway/forms.py:241 templates/app_gateway/application_details.html:106
+#: app_gateway/forms.py:252 templates/app_gateway/application_details.html:106
msgid "Path Prefix"
msgstr "Prefix cesty"
-#: app_gateway/forms.py:242 templates/app_gateway/application_details.html:107
+#: app_gateway/forms.py:253 templates/app_gateway/application_details.html:107
msgid "Policy"
msgstr "Politika"
-#: app_gateway/forms.py:243 templates/app_gateway/application_details.html:108
+#: app_gateway/forms.py:254 templates/app_gateway/application_details.html:108
msgid "Order"
msgstr "Poradie"
@@ -331,9 +349,9 @@ msgstr "Verejné"
msgid "Protected"
msgstr "Chránené"
-#: app_gateway/models.py:45 gatekeeper/models.py:110
+#: app_gateway/models.py:45 gatekeeper/models.py:108
#: templates/app_gateway/access_policy_type_select.html:41
-#: templates/gatekeeper/gatekeeper_list.html:272
+#: templates/gatekeeper/gatekeeper_list.html:288
msgid "Deny"
msgstr "Odmietnuť"
@@ -614,11 +632,11 @@ msgstr "Odstrániť trasu aplikácie"
msgid "Are you sure you want to delete the route \"%(name)s\" (%(path)s)?"
msgstr "Naozaj chcete odstrániť trasu \"%(name)s\" (%(path)s)?"
-#: app_gateway/views.py:444
+#: app_gateway/views.py:443
msgid "Configuration exported successfully."
msgstr "Konfigurácia bola úspešne exportovaná."
-#: app_gateway/views.py:446
+#: app_gateway/views.py:445
msgid ""
"Caddy is not active. Configuration files were exported for debugging "
"purposes."
@@ -629,13 +647,13 @@ msgstr ""
msgid "IP Lock"
msgstr "IP zámok"
-#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:198
+#: cluster/forms.py:21 dns/forms.py:67 gatekeeper/forms.py:271
#: templates/cluster/workers_list.html:10
#: templates/dns/static_host_list.html:18
#: templates/firewall/manage_redirect_rule.html:43
#: templates/firewall/manage_redirect_rule.html:67
#: templates/firewall/manage_redirect_rule.html:68
-#: templates/gatekeeper/gatekeeper_list.html:256
+#: templates/gatekeeper/gatekeeper_list.html:272
#: templates/wireguard/wireguard_status.html:45
msgid "IP Address"
msgstr "IP adresa"
@@ -906,7 +924,7 @@ msgstr "Statický DNS"
msgid "Invalid hostname."
msgstr "Neplatný názov hostiteľa."
-#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:201
+#: dns/forms.py:131 firewall/forms.py:111 gatekeeper/forms.py:274
#: templates/api_v2/api_documentation.html:51
#: templates/dns/static_host_list.html:69
#: templates/firewall/manage_redirect_rule.html:18
@@ -1237,43 +1255,29 @@ msgstr "Spravovať nastavenia firewall"
msgid "Firewall settings saved successfully"
msgstr "Nastavenia firewall boli úspešne uložené"
-#: gatekeeper/forms.py:17 templates/accounts/login.html:14
-#: templates/gatekeeper/gatekeeper_list.html:61
-#: templates/user_manager/list.html:8 user_manager/forms.py:13
-#: vpn_invite/forms.py:281
-msgid "Username"
-msgstr "Používateľské meno"
-
-#: 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
-msgid "Email"
-msgstr "E-mail"
-
-#: gatekeeper/forms.py:19 templates/accounts/login.html:23
+#: gatekeeper/forms.py:17 templates/accounts/login.html:23
#: templates/vpn_invite/invite_settings.html:19 user_manager/forms.py:14
#: vpn_invite/forms.py:282
msgid "Password"
msgstr "Heslo"
#: gatekeeper/forms.py:20
-msgid "TOTP Secret"
-msgstr "TOTP tajomstvo"
+msgid ""
+"Minimum 8 characters, with at least one uppercase letter, one lowercase "
+"letter, and one number."
+msgstr ""
-#: gatekeeper/forms.py:55 templates/gatekeeper/gatekeeper_list.html:104
-msgid "Group Name"
-msgstr "Názov skupiny"
+#: gatekeeper/forms.py:23
+#, fuzzy
+#| msgid "Random Password"
+msgid "Confirm Password"
+msgstr "Náhodné heslo"
-#: gatekeeper/forms.py:56 templates/gatekeeper/gatekeeper_list.html:105
-msgid "Members"
-msgstr "Členovia"
-
-#: gatekeeper/forms.py:86
+#: gatekeeper/forms.py:28 gatekeeper/forms.py:161
msgid "TOTP Validation PIN"
msgstr "Validačný PIN TOTP"
-#: gatekeeper/forms.py:89
+#: gatekeeper/forms.py:31 gatekeeper/forms.py:164
msgid ""
"Enter a 6-digit PIN generated by your authenticator app to validate the "
"secret."
@@ -1281,91 +1285,147 @@ msgstr ""
"Zadajte 6-miestny PIN vygenerovaný vašou autentifikačnou aplikáciou na "
"overenie tajomstva."
-#: gatekeeper/forms.py:100
+#: gatekeeper/forms.py:38 templates/accounts/login.html:14
+#: templates/gatekeeper/gatekeeper_list.html:61
+#: templates/user_manager/list.html:8 user_manager/forms.py:13
+#: vpn_invite/forms.py:281
+msgid "Username"
+msgstr "Používateľské meno"
+
+#: gatekeeper/forms.py:39 gatekeeper/forms.py:344
+#: templates/gatekeeper/gatekeeper_list.html:62
+#: templates/gatekeeper/gatekeeper_list.html:220
+#: templates/wireguard/peer_list/peer_preview_modal.html:103
+msgid "Email"
+msgstr "E-mail"
+
+#: gatekeeper/forms.py:40
+msgid "TOTP Secret"
+msgstr "TOTP tajomstvo"
+
+#: gatekeeper/forms.py:87
+#, fuzzy
+#| msgid "Port is required."
+msgid "Password is required."
+msgstr "Port je povinný."
+
+#: gatekeeper/forms.py:90 user_manager/forms.py:127
+msgid "Password must be at least 8 characters long."
+msgstr "Heslo musí mať aspoň 8 znakov."
+
+#: gatekeeper/forms.py:92
+#, fuzzy
+#| msgid "Password must be at least 8 characters long."
+msgid "Password must contain at least one lowercase letter."
+msgstr "Heslo musí mať aspoň 8 znakov."
+
+#: gatekeeper/forms.py:94
+#, fuzzy
+#| msgid "Password must be at least 8 characters long."
+msgid "Password must contain at least one uppercase letter."
+msgstr "Heslo musí mať aspoň 8 znakov."
+
+#: gatekeeper/forms.py:96
+#, fuzzy
+#| msgid "Password must be at least 8 characters long."
+msgid "Password must contain at least one number."
+msgstr "Heslo musí mať aspoň 8 znakov."
+
+#: gatekeeper/forms.py:98
+#, fuzzy
+#| msgid "Password Confirmation"
+msgid "Passwords do not match."
+msgstr "Potvrdenie hesla"
+
+#: gatekeeper/forms.py:103 gatekeeper/forms.py:249
+msgid "Please provide a PIN to validate the TOTP secret."
+msgstr "Na overenie tajomstva TOTP zadajte PIN."
+
+#: gatekeeper/forms.py:108 gatekeeper/forms.py:254
+msgid "Invalid TOTP PIN."
+msgstr "Neplatný PIN TOTP."
+
+#: gatekeeper/forms.py:110 gatekeeper/forms.py:256
+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:130 templates/gatekeeper/gatekeeper_list.html:120
+msgid "Group Name"
+msgstr "Názov skupiny"
+
+#: gatekeeper/forms.py:131 templates/gatekeeper/gatekeeper_list.html:121
+msgid "Members"
+msgstr "Členovia"
+
+#: gatekeeper/forms.py:175
msgid "Authentication Type"
msgstr "Typ autentifikácie"
-#: gatekeeper/forms.py:101
+#: gatekeeper/forms.py:176
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
+#: gatekeeper/forms.py:177
msgid "OIDC Provider URL"
msgstr "URL poskytovateľa OIDC"
-#: gatekeeper/forms.py:104
+#: gatekeeper/forms.py:178
msgid "OIDC Client ID"
msgstr "ID klienta OIDC"
-#: gatekeeper/forms.py:105
+#: gatekeeper/forms.py:179
msgid "OIDC Client Secret"
msgstr "Secret klienta OIDC"
-#: gatekeeper/forms.py:157
+#: gatekeeper/forms.py:230
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:159
+#: gatekeeper/forms.py:232
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:161
+#: gatekeeper/forms.py:234
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:167
+#: gatekeeper/forms.py:240
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:170
+#: gatekeeper/forms.py:243
msgid "OIDC fields must be empty for TOTP authentication."
msgstr "Polia OIDC musia byť prázdne pre autentifikáciu TOTP."
-#: gatekeeper/forms.py:172
+#: gatekeeper/forms.py:245
msgid "TOTP secret is required for TOTP authentication."
msgstr "TOTP tajomstvo je povinné pre autentifikáciu TOTP."
-#: gatekeeper/forms.py:176
-msgid "Please provide a PIN to validate the TOTP secret."
-msgstr "Na overenie tajomstva TOTP zadajte PIN."
-
-#: gatekeeper/forms.py:181
-msgid "Invalid TOTP PIN."
-msgstr "Neplatný PIN TOTP."
-
-#: 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:186
+#: gatekeeper/forms.py:259
msgid "TOTP secret must be empty for OIDC authentication."
msgstr "TOTP tajomstvo musí byť prázdne pre autentifikáciu OIDC."
-#: gatekeeper/forms.py:188
+#: gatekeeper/forms.py:261
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:197 gatekeeper/forms.py:239 gatekeeper/forms.py:270
+#: gatekeeper/forms.py:270 gatekeeper/forms.py:312 gatekeeper/forms.py:343
msgid "Authentication Method"
msgstr "Metóda autentifikácie"
-#: gatekeeper/forms.py:199 templates/gatekeeper/gatekeeper_list.html:257
+#: gatekeeper/forms.py:272 templates/gatekeeper/gatekeeper_list.html:273
msgid "Prefix Length"
msgstr "Dĺžka prefixu"
-#: gatekeeper/forms.py:200 templates/firewall/firewall_rule_list.html:47
+#: gatekeeper/forms.py:273 templates/firewall/firewall_rule_list.html:47
#: templates/firewall/manage_firewall_rule.html:360
-#: templates/gatekeeper/gatekeeper_list.html:258
+#: templates/gatekeeper/gatekeeper_list.html:274
msgid "Action"
msgstr "Akcia"
-#: gatekeeper/forms.py:240 templates/gatekeeper/gatekeeper_list.html:221
+#: gatekeeper/forms.py:313 templates/gatekeeper/gatekeeper_list.html:237
msgid "Domain"
msgstr "Doména"
@@ -1389,15 +1449,15 @@ msgstr "Zoznam IP adries"
msgid "Shared/global TOTP secret key"
msgstr "Zdieľaný/globálny tajný kľúč TOTP"
-#: gatekeeper/models.py:69
+#: gatekeeper/models.py:68
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:71
+#: gatekeeper/models.py:69
msgid "Per-user TOTP secret key"
msgstr "Tajný kľúč TOTP pre jednotlivých používateľov"
-#: gatekeeper/models.py:110 templates/gatekeeper/gatekeeper_list.html:270
+#: gatekeeper/models.py:108 templates/gatekeeper/gatekeeper_list.html:286
msgid "Allow"
msgstr "Povoliť"
@@ -1413,57 +1473,102 @@ msgstr "Vytvoriť používateľa Gatekeeper"
msgid "Gatekeeper User saved successfully."
msgstr "Používateľ Gatekeeper bol úspešne uložený."
-#: gatekeeper/views.py:86
+#: gatekeeper/views.py:69
+msgid ""
+"\n"
+" Gatekeeper User
\n"
+" Gatekeeper users are used for authenticating against protected "
+"applications managed by this gateway.
\n"
+"\n"
+" Password
\n"
+" Required when creating a user. When editing, leave both password "
+"fields blank to keep the current password.\n"
+" Passwords are stored using Argon2id hashing.
\n"
+"\n"
+" TOTP Secret
\n"
+" Optional per-user TOTP secret. When set, this user will "
+"authenticate using their own secret instead of the\n"
+" global TOTP secret configured on the Authentication Method. Use the "
+"buttons below the field to generate a\n"
+" random secret and scan the QR code with your authenticator app. "
+"Validate the secret by entering the current\n"
+" 6-digit PIN before saving.
\n"
+" "
+msgstr ""
+
+#: gatekeeper/views.py:106
msgid "Gatekeeper User deleted successfully."
msgstr "Používateľ Gatekeeper bol úspešne odstránený."
-#: gatekeeper/views.py:91
+#: gatekeeper/views.py:111
msgid "Delete Gatekeeper User"
msgstr "Odstrániť používateľa Gatekeeper"
-#: gatekeeper/views.py:93
+#: gatekeeper/views.py:113
#, python-format
msgid "Are you sure you want to delete the user \"%(username)s\"?"
msgstr "Naozaj chcete odstrániť používateľa \"%(username)s\"?"
-#: gatekeeper/views.py:107
+#: gatekeeper/views.py:127
msgid "Edit Gatekeeper Group"
msgstr "Upraviť skupinu Gatekeeper"
-#: gatekeeper/views.py:110
+#: gatekeeper/views.py:130
msgid "Create Gatekeeper Group"
msgstr "Vytvoriť skupinu Gatekeeper"
-#: gatekeeper/views.py:117
+#: gatekeeper/views.py:137
msgid "Gatekeeper Group saved successfully."
msgstr "Skupina Gatekeeper bola úspešne uložená."
-#: gatekeeper/views.py:139
+#: gatekeeper/views.py:159
msgid "Gatekeeper Group deleted successfully."
msgstr "Skupina Gatekeeper bola úspešne odstránená."
-#: gatekeeper/views.py:144
+#: gatekeeper/views.py:164
msgid "Delete Gatekeeper Group"
msgstr "Odstrániť skupinu Gatekeeper"
-#: gatekeeper/views.py:146
+#: gatekeeper/views.py:166
#, python-format
msgid "Are you sure you want to delete the group \"%(name)s\"?"
msgstr "Naozaj chcete odstrániť skupinu \"%(name)s\"?"
-#: gatekeeper/views.py:160
+#: gatekeeper/views.py:180
msgid "Edit Authentication Method"
msgstr "Upraviť metódu autentifikácie"
-#: gatekeeper/views.py:163
+#: gatekeeper/views.py:183
msgid "Create Authentication Method"
msgstr "Vytvoriť metódu autentifikácie"
-#: gatekeeper/views.py:170
+#: gatekeeper/views.py:190
msgid "Authentication Method saved successfully."
msgstr "Metóda autentifikácie bola úspešne uložená."
-#: gatekeeper/views.py:175
+#: gatekeeper/views.py:195
+#, fuzzy
+#| msgid ""
+#| "\n"
+#| " Authentication Types
\n"
+#| " Select how users will authenticate through this method.
\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"
+#| " "
msgid ""
"\n"
" Authentication Types
\n"
@@ -1480,9 +1585,8 @@ msgid ""
" \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"
+"app. If a user does not have a personal TOTP configured, the Global "
+"TOTP Secret will be used instead. \n"
" "
msgstr ""
"\n"
@@ -1508,83 +1612,83 @@ msgstr ""
"p>\n"
" "
-#: gatekeeper/views.py:210
+#: gatekeeper/views.py:230
msgid "Authentication Method deleted successfully."
msgstr "Metóda autentifikácie bola úspešne odstránená."
-#: gatekeeper/views.py:215
+#: gatekeeper/views.py:235
msgid "Delete Authentication Method"
msgstr "Odstrániť metódu autentifikácie"
-#: gatekeeper/views.py:217
+#: gatekeeper/views.py:237
#, 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:267
+#: gatekeeper/views.py:287
msgid "Edit Allowed Domain"
msgstr "Upraviť povolenú doménu"
-#: gatekeeper/views.py:270 templates/gatekeeper/gatekeeper_list.html:186
+#: gatekeeper/views.py:290 templates/gatekeeper/gatekeeper_list.html:202
msgid "Add Allowed Domain"
msgstr "Pridať povolenú doménu"
-#: gatekeeper/views.py:277
+#: gatekeeper/views.py:297
msgid "Allowed Domain saved successfully."
msgstr "Povolená doména bola úspešne uložená."
-#: gatekeeper/views.py:299
+#: gatekeeper/views.py:319
msgid "Allowed Domain deleted successfully."
msgstr "Povolená doména bola úspešne odstránená."
-#: gatekeeper/views.py:304
+#: gatekeeper/views.py:324
msgid "Delete Allowed Domain"
msgstr "Odstrániť povolenú doménu"
-#: gatekeeper/views.py:306
+#: gatekeeper/views.py:326
#, 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:320
+#: gatekeeper/views.py:340
msgid "Edit Allowed Email"
msgstr "Upraviť povolený e-mail"
-#: gatekeeper/views.py:323 templates/gatekeeper/gatekeeper_list.html:183
+#: gatekeeper/views.py:343 templates/gatekeeper/gatekeeper_list.html:199
msgid "Add Allowed Email"
msgstr "Pridať povolený e-mail"
-#: gatekeeper/views.py:330
+#: gatekeeper/views.py:350
msgid "Allowed Email saved successfully."
msgstr "Povolený e-mail bol úspešne uložený."
-#: gatekeeper/views.py:352
+#: gatekeeper/views.py:372
msgid "Allowed Email deleted successfully."
msgstr "Povolený e-mail bol úspešne odstránený."
-#: gatekeeper/views.py:357
+#: gatekeeper/views.py:377
msgid "Delete Allowed Email"
msgstr "Odstrániť povolený e-mail"
-#: gatekeeper/views.py:359
+#: gatekeeper/views.py:379
#, 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:373
+#: gatekeeper/views.py:393
msgid "Edit IP Address"
msgstr "Upraviť IP adresu"
-#: gatekeeper/views.py:376 templates/gatekeeper/gatekeeper_list.html:247
+#: gatekeeper/views.py:396 templates/gatekeeper/gatekeeper_list.html:263
#: templates/wireguard/wireguard_manage_peer.html:171
msgid "Add IP Address"
msgstr "Pridať IP adresu"
-#: gatekeeper/views.py:383
+#: gatekeeper/views.py:403
msgid "IP Address saved successfully."
msgstr "IP adresa bola úspešne uložená."
-#: gatekeeper/views.py:388
+#: gatekeeper/views.py:408
msgid ""
"\n"
" IP Address List
\n"
@@ -1631,15 +1735,15 @@ msgstr ""
"(napr. „Kancelárska sieť“, „Blokovaný útočník“).\n"
" "
-#: gatekeeper/views.py:424
+#: gatekeeper/views.py:444
msgid "IP Address deleted successfully."
msgstr "IP adresa bola úspešne odstránená."
-#: gatekeeper/views.py:429
+#: gatekeeper/views.py:449
msgid "Delete IP Address"
msgstr "Odstrániť IP adresu"
-#: gatekeeper/views.py:431
+#: gatekeeper/views.py:451
#, python-format
msgid "Are you sure you want to delete the IP address \"%(address)s\"?"
msgstr "Naozaj chcete odstrániť IP adresu \"%(address)s\"?"
@@ -1993,8 +2097,8 @@ msgid "In"
msgstr "Vstup"
#: templates/api_v2/api_documentation.html:49
-#: templates/gatekeeper/gatekeeper_list.html:150
-#: templates/gatekeeper/gatekeeper_list.html:195
+#: templates/gatekeeper/gatekeeper_list.html:166
+#: templates/gatekeeper/gatekeeper_list.html:211
#: templates/wireguard/apply_route_template.html:27
msgid "Type"
msgstr "Typ"
@@ -2004,11 +2108,13 @@ msgid "Required"
msgstr "Povinné"
#: templates/api_v2/api_documentation.html:62
+#: templates/gatekeeper/gatekeeper_list.html:75
#: templates/scheduler/scheduleprofile_form.html:175
msgid "Yes"
msgstr "Áno"
#: templates/api_v2/api_documentation.html:64
+#: templates/gatekeeper/gatekeeper_list.html:77
#: templates/scheduler/scheduleprofile_form.html:177
msgid "No"
msgstr "Nie"
@@ -2053,12 +2159,12 @@ msgstr "Zakázané"
#: templates/app_gateway/application_details.html:121
#: templates/cluster/workers_list.html:77
#: templates/dns/static_host_list.html:74
-#: templates/gatekeeper/gatekeeper_list.html:73
-#: templates/gatekeeper/gatekeeper_list.html:116
-#: templates/gatekeeper/gatekeeper_list.html:161
-#: templates/gatekeeper/gatekeeper_list.html:209
-#: templates/gatekeeper/gatekeeper_list.html:226
-#: templates/gatekeeper/gatekeeper_list.html:278
+#: templates/gatekeeper/gatekeeper_list.html:89
+#: templates/gatekeeper/gatekeeper_list.html:132
+#: templates/gatekeeper/gatekeeper_list.html:177
+#: templates/gatekeeper/gatekeeper_list.html:225
+#: templates/gatekeeper/gatekeeper_list.html:242
+#: templates/gatekeeper/gatekeeper_list.html:294
#: templates/routing_templates/list.html:29
#: templates/scheduler/scheduleprofile_form.html:123
#: templates/scheduler/scheduleprofile_list.html:25
@@ -2140,6 +2246,7 @@ msgstr "Pridať politiku prístupu"
#: templates/app_gateway/app_gateway_list.html:140
#: templates/gatekeeper/gatekeeper_list.html:43
+#: templates/gatekeeper/gatekeeper_list.html:64
msgid "Groups"
msgstr "Skupiny"
@@ -2150,10 +2257,10 @@ msgstr "Metódy autentifikácie"
#: templates/app_gateway/app_gateway_list.html:142
#: templates/app_gateway/application_details.html:62
#: templates/app_gateway/application_details.html:109
-#: templates/gatekeeper/gatekeeper_list.html:63
-#: templates/gatekeeper/gatekeeper_list.html:106
-#: templates/gatekeeper/gatekeeper_list.html:151
-#: templates/gatekeeper/gatekeeper_list.html:198
+#: templates/gatekeeper/gatekeeper_list.html:65
+#: templates/gatekeeper/gatekeeper_list.html:122
+#: templates/gatekeeper/gatekeeper_list.html:167
+#: templates/gatekeeper/gatekeeper_list.html:214
#: templates/scheduler/scheduleprofile_form.html:111
#: templates/scheduler/scheduleprofile_list.html:15
#: templates/wireguard/apply_route_template.html:28
@@ -2707,10 +2814,19 @@ msgid "Create Port forwarding Rule"
msgstr "Vytvoriť pravidlo presmerovania portov"
#: templates/gatekeeper/gatekeeper_auth_method_form.html:63
+#: templates/gatekeeper/gatekeeper_user_form.html:43
msgid "View QR Code"
msgstr "Zobraziť QR kód"
-#: templates/gatekeeper/gatekeeper_auth_method_form.html:74
+#: templates/gatekeeper/gatekeeper_auth_method_form.html:64
+#: templates/gatekeeper/gatekeeper_user_form.html:44
+#, fuzzy
+#| msgid "Global TOTP Secret"
+msgid "Generate TOTP Secret"
+msgstr "Globálne TOTP tajomstvo"
+
+#: templates/gatekeeper/gatekeeper_auth_method_form.html:93
+#: templates/gatekeeper/gatekeeper_user_form.html:73
msgid "Please enter a TOTP Secret first to generate the QR code."
msgstr "Najprv zadajte TOTP tajomstvo, aby ste vygenerovali QR kód."
@@ -2736,44 +2852,48 @@ msgstr "Používatelia"
msgid "Add User"
msgstr "Pridať používateľa"
-#: templates/gatekeeper/gatekeeper_list.html:88
+#: templates/gatekeeper/gatekeeper_list.html:63
+msgid "TOTP"
+msgstr ""
+
+#: templates/gatekeeper/gatekeeper_list.html:104
msgid "No Gatekeeper Users found."
msgstr "Nenašli sa žiadni používatelia Gatekeeper."
-#: templates/gatekeeper/gatekeeper_list.html:95
+#: templates/gatekeeper/gatekeeper_list.html:111
msgid "Add Group"
msgstr "Pridať skupinu"
-#: templates/gatekeeper/gatekeeper_list.html:131
+#: templates/gatekeeper/gatekeeper_list.html:147
msgid "No Gatekeeper Groups found."
msgstr "Nenašli sa žiadne skupiny Gatekeeper."
-#: templates/gatekeeper/gatekeeper_list.html:140
+#: templates/gatekeeper/gatekeeper_list.html:156
msgid "Add Auth Method"
msgstr "Pridať metódu autentifikácie"
-#: templates/gatekeeper/gatekeeper_list.html:176
+#: templates/gatekeeper/gatekeeper_list.html:192
msgid "No Authentication Methods found."
msgstr "Nenašli sa žiadne metódy autentifikácie."
-#: templates/gatekeeper/gatekeeper_list.html:196
+#: templates/gatekeeper/gatekeeper_list.html:212
msgid "Identity"
msgstr "Identita"
-#: templates/gatekeeper/gatekeeper_list.html:197
-#: templates/gatekeeper/gatekeeper_list.html:259
+#: templates/gatekeeper/gatekeeper_list.html:213
+#: templates/gatekeeper/gatekeeper_list.html:275
msgid "Auth Method"
msgstr "Metóda autentifikácie"
-#: templates/gatekeeper/gatekeeper_list.html:241
+#: templates/gatekeeper/gatekeeper_list.html:257
msgid "No Allowed Emails or Domains found."
msgstr "Nenašli sa žiadne povolené e-maily ani domény."
-#: templates/gatekeeper/gatekeeper_list.html:260
+#: templates/gatekeeper/gatekeeper_list.html:276
msgid "Manage"
msgstr "Spravovať"
-#: templates/gatekeeper/gatekeeper_list.html:293
+#: templates/gatekeeper/gatekeeper_list.html:309
msgid "No IP Addresses found."
msgstr "Nenašli sa žiadne IP adresy."
@@ -3611,10 +3731,6 @@ msgstr "Potvrdenie hesla je povinné pre nových používateľov."
msgid "The two password fields didn't match."
msgstr "Heslá sa nezhodujú."
-#: user_manager/forms.py:127
-msgid "Password must be at least 8 characters long."
-msgstr "Heslo musí mať aspoň 8 znakov."
-
#: user_manager/forms.py:220
msgid "A peer group with that name already exists."
msgstr "Peer skupina s týmto názvom už existuje."
@@ -4377,3 +4493,6 @@ msgid "No interfaces found|No WireGuard interfaces were found to process."
msgstr ""
"Neboli nájdené rozhrania|Neboli nájdené žiadne WireGuard rozhrania na "
"spracovanie."
+
+#~ msgid "Global TOTP Before Authentication"
+#~ msgstr "Globálne TOTP pred autentifikáciou"