Просмотр исходного кода

refactor(ui): require POST for OAuth2 unlink endpoint

Account unlinking mutates state, so /oauth2/{provider}/unlink can no
longer be reached via GET. Pull the OAuth2/OIDC and WebAuthn sections
out of the settings form and render each as its own fieldset above the
form, with the unlink action as a self-contained POST form. Rename
the username/password fieldset legend to "Password Authentication" and
add matching legends for the federated and passkey sections so all
authentication methods read consistently.
Frédéric Guillot 1 неделя назад
Родитель
Сommit
f467c2daa1

+ 4 - 2
internal/locale/translations/ar_SA.json

@@ -356,7 +356,9 @@
     "form.integration.webhook_secret": "سر Webhooks",
     "form.integration.webhook_url": "رابط Webhook الافتراضي",
     "form.prefs.fieldset.application_settings": "إعدادات التطبيق",
-    "form.prefs.fieldset.authentication_settings": "إعدادات المصادقة",
+    "form.prefs.fieldset.authentication_settings": "مصادقة كلمة المرور",
+    "form.prefs.fieldset.google_authentication": "مصادقة Google",
+    "form.prefs.fieldset.oidc_authentication": "مصادقة %s",
     "form.prefs.fieldset.global_feed_settings": "إعدادات المصادر العامة",
     "form.prefs.fieldset.reader_settings": "إعدادات القارئ",
     "form.prefs.help.external_font_hosts": "قائمة مفصولة بمسافات لمضيفي الخطوط الخارجية للسماح بها. مثال: \"fonts.gstatic.com fonts.googleapis.com\".",
@@ -598,7 +600,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "آخر استخدام",
     "page.settings.webauthn.passkey_name": "اسم مفتاح المرور",
-    "page.settings.webauthn.passkeys": "مفاتيح المرور",
+    "page.settings.webauthn.passkeys": "مصادقة مفاتيح المرور",
     "page.settings.webauthn.register": "تسجيل مفتاح مرور",
     "page.settings.webauthn.register.error": "تعذر تسجيل مفتاح المرور",
     "page.shared_entries.title": "المقالات المشاركة",

+ 4 - 2
internal/locale/translations/de_DE.json

@@ -344,7 +344,9 @@
     "form.integration.webhook_secret": "Webhook-Geheimnis",
     "form.integration.webhook_url": "Standard-Webhook-URL",
     "form.prefs.fieldset.application_settings": "Anwendungseinstellungen",
-    "form.prefs.fieldset.authentication_settings": "Authentifizierungseinstellungen",
+    "form.prefs.fieldset.authentication_settings": "Passwort-Authentifizierung",
+    "form.prefs.fieldset.google_authentication": "Google-Authentifizierung",
+    "form.prefs.fieldset.oidc_authentication": "%s-Authentifizierung",
     "form.prefs.fieldset.global_feed_settings": "Globale Feedeinstellungen",
     "form.prefs.fieldset.reader_settings": "Reader-Einstellungen",
     "form.prefs.help.external_font_hosts": "Per Leerzeichen getrennte Liste externer Schriftarten-Hosts, die erlaubt werden sollen. Beispiel: \"fonts.gstatic.com fonts.googleapis.com\".",
@@ -566,7 +568,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "Zuletzt genutzt",
     "page.settings.webauthn.passkey_name": "Name des Passkeys",
-    "page.settings.webauthn.passkeys": "Passkeys",
+    "page.settings.webauthn.passkeys": "Passkey-Authentifizierung",
     "page.settings.webauthn.register": "Hauptschlüssel registrieren",
     "page.settings.webauthn.register.error": "Hauptschlüssel kann nicht registriert werden",
     "page.shared_entries.title": "Geteilte Artikel",

+ 4 - 2
internal/locale/translations/el_EL.json

@@ -344,7 +344,9 @@
     "form.integration.webhook_secret": "Μυστικό Webhooks",
     "form.integration.webhook_url": "Προεπιλεγμένη διεύθυνση URL Webhook",
     "form.prefs.fieldset.application_settings": "Ρυθμίσεις εφαρμογής",
-    "form.prefs.fieldset.authentication_settings": "Ρυθμίσεις ελέγχου ταυτότητας",
+    "form.prefs.fieldset.authentication_settings": "Έλεγχος ταυτότητας με κωδικό",
+    "form.prefs.fieldset.google_authentication": "Έλεγχος ταυτότητας Google",
+    "form.prefs.fieldset.oidc_authentication": "Έλεγχος ταυτότητας %s",
     "form.prefs.fieldset.global_feed_settings": "Καθολικές ρυθμίσεις ροής",
     "form.prefs.fieldset.reader_settings": "Ρυθμίσεις αναγνώστη",
     "form.prefs.help.external_font_hosts": "Λίστα εξωτερικών κεντρικών υπολογιστών γραμματοσειρών διαχωρισμένων με κενό για να επιτρέπονται. Για παράδειγμα: \"fonts.gstatic.com fonts.googleapis.com\".",
@@ -566,7 +568,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "Τελευταία χρήση",
     "page.settings.webauthn.passkey_name": "Όνομα κωδικού πρόσβασης",
-    "page.settings.webauthn.passkeys": "Κωδικοί πρόσβασης",
+    "page.settings.webauthn.passkeys": "Έλεγχος ταυτότητας με κωδικό πρόσβασης",
     "page.settings.webauthn.register": "Εγγραφή κωδικού πρόσβασης",
     "page.settings.webauthn.register.error": "Δεν είναι δυνατή η εγγραφή του κωδικού πρόσβασης",
     "page.shared_entries.title": "Κοινόχρηστες Καταχωρήσεις",

+ 4 - 2
internal/locale/translations/en_US.json

@@ -344,7 +344,9 @@
     "form.integration.webhook_secret": "Webhooks Secret",
     "form.integration.webhook_url": "Default Webhook URL",
     "form.prefs.fieldset.application_settings": "Application Settings",
-    "form.prefs.fieldset.authentication_settings": "Authentication Settings",
+    "form.prefs.fieldset.authentication_settings": "Password Authentication",
+    "form.prefs.fieldset.google_authentication": "Google Authentication",
+    "form.prefs.fieldset.oidc_authentication": "%s Authentication",
     "form.prefs.fieldset.global_feed_settings": "Global Feed Settings",
     "form.prefs.fieldset.reader_settings": "Reader Settings",
     "form.prefs.help.external_font_hosts": "Space separated list of external font hosts to allow. For example: \"fonts.gstatic.com fonts.googleapis.com\".",
@@ -566,7 +568,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "Last Used",
     "page.settings.webauthn.passkey_name": "Passkey Name",
-    "page.settings.webauthn.passkeys": "Passkeys",
+    "page.settings.webauthn.passkeys": "Passkey Authentication",
     "page.settings.webauthn.register": "Register passkey",
     "page.settings.webauthn.register.error": "Unable to register passkey",
     "page.shared_entries.title": "Shared entries",

+ 4 - 2
internal/locale/translations/es_ES.json

@@ -344,7 +344,9 @@
     "form.integration.webhook_secret": "Secreto de Webhooks",
     "form.integration.webhook_url": "Defecto URL de Webhook",
     "form.prefs.fieldset.application_settings": "Ajustes de la aplicación",
-    "form.prefs.fieldset.authentication_settings": "Ajustes de la autentificación",
+    "form.prefs.fieldset.authentication_settings": "Autenticación con contraseña",
+    "form.prefs.fieldset.google_authentication": "Autenticación con Google",
+    "form.prefs.fieldset.oidc_authentication": "Autenticación con %s",
     "form.prefs.fieldset.global_feed_settings": "Ajustes globales del feed",
     "form.prefs.fieldset.reader_settings": "Ajustes del lector",
     "form.prefs.help.external_font_hosts": "Lista separada por espacios de hosts de fuentes externas permitidos. Por ejemplo: \"fonts.gstatic.com fonts.googleapis.com\".",
@@ -566,7 +568,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "Usado por última vez",
     "page.settings.webauthn.passkey_name": "Nombre de clave de acceso",
-    "page.settings.webauthn.passkeys": "Claves de acceso",
+    "page.settings.webauthn.passkeys": "Autenticación con clave de acceso",
     "page.settings.webauthn.register": "Registrar clave de acceso",
     "page.settings.webauthn.register.error": "No se puede registrar la clave de acceso",
     "page.shared_entries.title": "Artículos compartidos",

+ 4 - 2
internal/locale/translations/fi_FI.json

@@ -344,7 +344,9 @@
     "form.integration.webhook_secret": "Webhookien salaisuus",
     "form.integration.webhook_url": "Oletus-webhook-URL",
     "form.prefs.fieldset.application_settings": "Sovellusasetukset",
-    "form.prefs.fieldset.authentication_settings": "Todennusasetukset",
+    "form.prefs.fieldset.authentication_settings": "Salasanatodennus",
+    "form.prefs.fieldset.google_authentication": "Google-todennus",
+    "form.prefs.fieldset.oidc_authentication": "%s-todennus",
     "form.prefs.fieldset.global_feed_settings": "Syötteiden yleisasetukset",
     "form.prefs.fieldset.reader_settings": "Lukija-asetukset",
     "form.prefs.help.external_font_hosts": "Sallittujen ulkoisten fonttipalvelinten lista välilyönnein eroteltuna. Esimerkiksi: \"fonts.gstatic.com fonts.googleapis.com\".",
@@ -566,7 +568,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "Viimeksi käytetty",
     "page.settings.webauthn.passkey_name": "Passkey-nimi",
-    "page.settings.webauthn.passkeys": "Passkeyt",
+    "page.settings.webauthn.passkeys": "Passkey-todennus",
     "page.settings.webauthn.register": "Rekisteröi salasana",
     "page.settings.webauthn.register.error": "Salasanaa ei voi rekisteröidä",
     "page.shared_entries.title": "Jaetut artikkelit",

+ 4 - 2
internal/locale/translations/fr_FR.json

@@ -344,7 +344,9 @@
     "form.integration.webhook_secret": "Secret du webhook",
     "form.integration.webhook_url": "URL du webhook",
     "form.prefs.fieldset.application_settings": "Paramètres de l'application",
-    "form.prefs.fieldset.authentication_settings": "Paramètres d'authentification",
+    "form.prefs.fieldset.authentication_settings": "Authentification par mot de passe",
+    "form.prefs.fieldset.google_authentication": "Authentification Google",
+    "form.prefs.fieldset.oidc_authentication": "Authentification %s",
     "form.prefs.fieldset.global_feed_settings": "Paramètres globaux des abonnements",
     "form.prefs.fieldset.reader_settings": "Paramètres du lecteur",
     "form.prefs.help.external_font_hosts": "Liste de domaine externes autorisés, séparés par des espaces. Par exemple : « fonts.gstatic.com fonts.googleapis.com ».",
@@ -566,7 +568,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "Dernière utilisation",
     "page.settings.webauthn.passkey_name": "Nom de la clé d’accès",
-    "page.settings.webauthn.passkeys": "Clés d’accès",
+    "page.settings.webauthn.passkeys": "Authentification par clé d’accès",
     "page.settings.webauthn.register": "Enregistrer une nouvelle clé d’accès",
     "page.settings.webauthn.register.error": "Impossible d'enregistrer la clé d’accès",
     "page.shared_entries.title": "Articles partagés",

+ 4 - 2
internal/locale/translations/gl_ES.json

@@ -344,7 +344,9 @@
     "form.integration.webhook_secret": "Clave secreta Webhooks",
     "form.integration.webhook_url": "URL predeterminada Webhook",
     "form.prefs.fieldset.application_settings": "Axustes da aplicción",
-    "form.prefs.fieldset.authentication_settings": "Axustes da autenticación",
+    "form.prefs.fieldset.authentication_settings": "Autenticación con contrasinal",
+    "form.prefs.fieldset.google_authentication": "Autenticación con Google",
+    "form.prefs.fieldset.oidc_authentication": "Autenticación con %s",
     "form.prefs.fieldset.global_feed_settings": "Axustes da canle global",
     "form.prefs.fieldset.reader_settings": "Axustes de lectura",
     "form.prefs.help.external_font_hosts": "Lista separada por espazos de servidores de tipos de letra externos permitidos. Exemplo: \"fonts.gstatic.com fonts.googleapis.com\".",
@@ -566,7 +568,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "Último uso",
     "page.settings.webauthn.passkey_name": "Nome da Clave de Paso",
-    "page.settings.webauthn.passkeys": "Claves de paso",
+    "page.settings.webauthn.passkeys": "Autenticación con chave de paso",
     "page.settings.webauthn.register": "Rexistrar Clave de paso",
     "page.settings.webauthn.register.error": "Non se puido rexistrar Clave de paso",
     "page.shared_entries.title": "Entradas compartidas",

+ 4 - 2
internal/locale/translations/hi_IN.json

@@ -344,7 +344,9 @@
     "form.integration.webhook_secret": "वेबहुक रहस्य",
     "form.integration.webhook_url": "डिफ़ॉल्ट वेबहुक URL",
     "form.prefs.fieldset.application_settings": "एप्लिकेशन सेटिंग्स",
-    "form.prefs.fieldset.authentication_settings": "प्रमाणीकरण सेटिंग्स",
+    "form.prefs.fieldset.authentication_settings": "पासवर्ड प्रमाणीकरण",
+    "form.prefs.fieldset.google_authentication": "Google प्रमाणीकरण",
+    "form.prefs.fieldset.oidc_authentication": "%s प्रमाणीकरण",
     "form.prefs.fieldset.global_feed_settings": "वैश्विक फ़ीड सेटिंग्स",
     "form.prefs.fieldset.reader_settings": "रीडर सेटिंग्स",
     "form.prefs.help.external_font_hosts": "अनुमति प्राप्त बाहरी फ़ॉन्ट होस्ट की सूची (स्पेस से पृथक). उदाहरण: \"fonts.gstatic.com fonts.googleapis.com\".",
@@ -566,7 +568,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "अंतिम उपयोग",
     "page.settings.webauthn.passkey_name": "पासकी का नाम",
-    "page.settings.webauthn.passkeys": "पासकी",
+    "page.settings.webauthn.passkeys": "पासकी प्रमाणीकरण",
     "page.settings.webauthn.register": "रजिस्टर पासकी",
     "page.settings.webauthn.register.error": "पासकी पंजीकृत करने में असमर्थ",
     "page.shared_entries.title": "साझा किया हुआ प्रविष्टि",

+ 4 - 2
internal/locale/translations/id_ID.json

@@ -341,7 +341,9 @@
     "form.integration.webhook_secret": "Rahasia Webhook",
     "form.integration.webhook_url": "URL Webhook baku",
     "form.prefs.fieldset.application_settings": "Pengaturan Aplikasi",
-    "form.prefs.fieldset.authentication_settings": "Pengaturan Autentikasi",
+    "form.prefs.fieldset.authentication_settings": "Autentikasi Kata Sandi",
+    "form.prefs.fieldset.google_authentication": "Autentikasi Google",
+    "form.prefs.fieldset.oidc_authentication": "Autentikasi %s",
     "form.prefs.fieldset.global_feed_settings": "Pengaturan Umpan Global",
     "form.prefs.fieldset.reader_settings": "Pengaturan Pembaca",
     "form.prefs.help.external_font_hosts": "Daftar yang dipisah spasi untuk peladen penyedia fonta eksternal yang diperbolehkan. Seperti: \"fonts.gstatic.com fonts.googleapis.com\".",
@@ -558,7 +560,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "Terakhir Digunakan",
     "page.settings.webauthn.passkey_name": "Nama Passkey",
-    "page.settings.webauthn.passkeys": "Passkey",
+    "page.settings.webauthn.passkeys": "Autentikasi Passkey",
     "page.settings.webauthn.register": "Daftar passkey",
     "page.settings.webauthn.register.error": "Tidak dapat mendaftarkan passkey",
     "page.shared_entries.title": "Entri yang Dibagikan",

+ 4 - 2
internal/locale/translations/it_IT.json

@@ -344,7 +344,9 @@
     "form.integration.webhook_secret": "Segreto dei webhook",
     "form.integration.webhook_url": "URL webhook predefinito",
     "form.prefs.fieldset.application_settings": "Impostazioni applicazione",
-    "form.prefs.fieldset.authentication_settings": "Impostazioni di autenticazione",
+    "form.prefs.fieldset.authentication_settings": "Autenticazione con password",
+    "form.prefs.fieldset.google_authentication": "Autenticazione Google",
+    "form.prefs.fieldset.oidc_authentication": "Autenticazione %s",
     "form.prefs.fieldset.global_feed_settings": "Impostazioni globali dei feed",
     "form.prefs.fieldset.reader_settings": "Impostazioni del lettore",
     "form.prefs.help.external_font_hosts": "Elenco, separato da spazi, degli host di font esterni consentiti. Ad esempio: \"fonts.gstatic.com fonts.googleapis.com\".",
@@ -566,7 +568,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "Ultimo uso",
     "page.settings.webauthn.passkey_name": "Nome passkey",
-    "page.settings.webauthn.passkeys": "Passkey",
+    "page.settings.webauthn.passkeys": "Autenticazione con passkey",
     "page.settings.webauthn.register": "Registra la chiave di accesso",
     "page.settings.webauthn.register.error": "Impossibile registrare la passkey",
     "page.shared_entries.title": "Voci condivise",

+ 4 - 2
internal/locale/translations/ja_JP.json

@@ -341,7 +341,9 @@
     "form.integration.webhook_secret": "Webhook シークレット",
     "form.integration.webhook_url": "デフォルトの Webhook URL",
     "form.prefs.fieldset.application_settings": "アプリケーション設定",
-    "form.prefs.fieldset.authentication_settings": "認証設定",
+    "form.prefs.fieldset.authentication_settings": "パスワード認証",
+    "form.prefs.fieldset.google_authentication": "Google 認証",
+    "form.prefs.fieldset.oidc_authentication": "%s 認証",
     "form.prefs.fieldset.global_feed_settings": "グローバルフィード設定",
     "form.prefs.fieldset.reader_settings": "リーダー設定",
     "form.prefs.help.external_font_hosts": "許可する外部フォントホストをスペース区切りで指定します。例: \"fonts.gstatic.com fonts.googleapis.com\"",
@@ -558,7 +560,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "最終使用日",
     "page.settings.webauthn.passkey_name": "パスキー名",
-    "page.settings.webauthn.passkeys": "パスキー",
+    "page.settings.webauthn.passkeys": "パスキー認証",
     "page.settings.webauthn.register": "パスキーを登録する",
     "page.settings.webauthn.register.error": "パスキーを登録できません",
     "page.shared_entries.title": "共有エントリ",

+ 4 - 2
internal/locale/translations/nan_Latn_pehoeji.json

@@ -341,7 +341,9 @@
     "form.integration.webhook_secret": "Webhooks bí-miâ",
     "form.integration.webhook_url": "Koán-tē Webhook bāng-chí",
     "form.prefs.fieldset.application_settings": "Èng-iōng thêng-sek siat-tēng",
-    "form.prefs.fieldset.authentication_settings": "Sú-iōng-lâng giām-chèng siat-tēng",
+    "form.prefs.fieldset.authentication_settings": "Bi̍t-bé giām-chèng",
+    "form.prefs.fieldset.google_authentication": "Google giām-chèng",
+    "form.prefs.fieldset.oidc_authentication": "%s giām-chèng",
     "form.prefs.fieldset.global_feed_settings": "Choân-he̍k siau-sit lâi-goân siat-tēng",
     "form.prefs.fieldset.reader_settings": "Ia̍t-tha̍k khì siat-tēng",
     "form.prefs.help.external_font_hosts": "Iōng khang-keh keh khui ún-chún ê gōa-pō͘ lī-hêng lâi-goân. Phì-lû \"fonts.gstatic.com fonts.googleapis.com\"",
@@ -558,7 +560,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "Siōng-bóe pái sú-iōng sî-kan",
     "page.settings.webauthn.passkey_name": "Passkey miâ",
-    "page.settings.webauthn.passkeys": "Passkeys",
+    "page.settings.webauthn.passkeys": "Passkey giām-chèng",
     "page.settings.webauthn.register": "Chù-chheh Passkey",
     "page.settings.webauthn.register.error": "Bô-hoat-tō͘ chù-chheh Passkey",
     "page.shared_entries.title": "Hun-hióng kè ê siau-sit",

+ 4 - 2
internal/locale/translations/nl_NL.json

@@ -344,7 +344,9 @@
     "form.integration.webhook_secret": "Webhooks geheim",
     "form.integration.webhook_url": "Standaard Webhook-URL",
     "form.prefs.fieldset.application_settings": "Applicatie Instellingen",
-    "form.prefs.fieldset.authentication_settings": "Authenticatie Instellingen",
+    "form.prefs.fieldset.authentication_settings": "Wachtwoordauthenticatie",
+    "form.prefs.fieldset.google_authentication": "Google-authenticatie",
+    "form.prefs.fieldset.oidc_authentication": "%s-authenticatie",
     "form.prefs.fieldset.global_feed_settings": "Globale Feed Instellingen",
     "form.prefs.fieldset.reader_settings": "Lees Instellingen",
     "form.prefs.help.external_font_hosts": "Spatiegescheiden lijst van externe font-hosts die zijn toegestaan. Bijvoorbeeld: 'fonts.gstatic.com fonts.googleapis.com'.",
@@ -566,7 +568,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "Laatst gebruikt",
     "page.settings.webauthn.passkey_name": "Passkey Naam",
-    "page.settings.webauthn.passkeys": "Passkeys",
+    "page.settings.webauthn.passkeys": "Passkey-authenticatie",
     "page.settings.webauthn.register": "Passkey registreren",
     "page.settings.webauthn.register.error": "Kan passkey niet registreren",
     "page.shared_entries.title": "Gedeelde artikelen",

+ 4 - 2
internal/locale/translations/pl_PL.json

@@ -347,7 +347,9 @@
     "form.integration.webhook_secret": "Tajny klucz do webhooków",
     "form.integration.webhook_url": "Domyślny adres URL webhooka",
     "form.prefs.fieldset.application_settings": "Ustawienia aplikacji",
-    "form.prefs.fieldset.authentication_settings": "Ustawienia uwierzytelniania",
+    "form.prefs.fieldset.authentication_settings": "Uwierzytelnianie hasłem",
+    "form.prefs.fieldset.google_authentication": "Uwierzytelnianie Google",
+    "form.prefs.fieldset.oidc_authentication": "Uwierzytelnianie %s",
     "form.prefs.fieldset.global_feed_settings": "Globalne ustawienia kanałów",
     "form.prefs.fieldset.reader_settings": "Ustawienia czytnika",
     "form.prefs.help.external_font_hosts": "Lista hostów zewnętrznych czcionek, na które należy zezwolić, rozdzielona spacjami. Na przykład: „fonts.gstatic.com fonts.googleapis.com”.",
@@ -574,7 +576,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "Ostatnio użyte",
     "page.settings.webauthn.passkey_name": "Nazwa klucza dostępu",
-    "page.settings.webauthn.passkeys": "Klucze dostępu",
+    "page.settings.webauthn.passkeys": "Uwierzytelnianie kluczem dostępu",
     "page.settings.webauthn.register": "Zarejestruj klucz dostępu",
     "page.settings.webauthn.register.error": "Nie można zarejestrować klucza dostępu",
     "page.shared_entries.title": "Udostępnione wpisy",

+ 4 - 2
internal/locale/translations/pt_BR.json

@@ -344,7 +344,9 @@
     "form.integration.webhook_secret": "Segredo dos Webhooks",
     "form.integration.webhook_url": "URL padrão do Webhook",
     "form.prefs.fieldset.application_settings": "Configurações do aplicativo",
-    "form.prefs.fieldset.authentication_settings": "Configurações de autenticação",
+    "form.prefs.fieldset.authentication_settings": "Autenticação por senha",
+    "form.prefs.fieldset.google_authentication": "Autenticação Google",
+    "form.prefs.fieldset.oidc_authentication": "Autenticação %s",
     "form.prefs.fieldset.global_feed_settings": "Configurações globais de fontes",
     "form.prefs.fieldset.reader_settings": "Configurações do leitor",
     "form.prefs.help.external_font_hosts": "Lista separada por espaço de hosts de fontes externas permitidos. Por exemplo: 'fonts.gstatic.com fonts.googleapis.com'.",
@@ -566,7 +568,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "Último uso",
     "page.settings.webauthn.passkey_name": "Nome da senha",
-    "page.settings.webauthn.passkeys": "Senhas",
+    "page.settings.webauthn.passkeys": "Autenticação por chave de acesso",
     "page.settings.webauthn.register": "Registrar senha",
     "page.settings.webauthn.register.error": "Não foi possível registrar a senha",
     "page.shared_entries.title": "Itens compartilhados",

+ 4 - 2
internal/locale/translations/ro_RO.json

@@ -347,7 +347,9 @@
     "form.integration.webhook_secret": "Secret Webhook",
     "form.integration.webhook_url": "URL Webhook",
     "form.prefs.fieldset.application_settings": "Setări Aplicație",
-    "form.prefs.fieldset.authentication_settings": "Setări Autentificare",
+    "form.prefs.fieldset.authentication_settings": "Autentificare cu parolă",
+    "form.prefs.fieldset.google_authentication": "Autentificare Google",
+    "form.prefs.fieldset.oidc_authentication": "Autentificare %s",
     "form.prefs.fieldset.global_feed_settings": "Setări Globale pt. Flux",
     "form.prefs.fieldset.reader_settings": "Setări Citire",
     "form.prefs.help.external_font_hosts": "Lista fonturilor de pe gazdă separate de virgulă care poate fi utilizate. De exemplu: \"fonts.gstatic.com fonts.googleapis.com\".",
@@ -574,7 +576,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "Utilizat ultima dată",
     "page.settings.webauthn.passkey_name": "Nume cheie acces",
-    "page.settings.webauthn.passkeys": "Chei Acces",
+    "page.settings.webauthn.passkeys": "Autentificare cu cheie de acces",
     "page.settings.webauthn.register": "Înregistrare cheie acces",
     "page.settings.webauthn.register.error": "Eroare la înregistrarea cheii de acces",
     "page.shared_entries.title": "Înregistrări partajate",

+ 4 - 2
internal/locale/translations/ru_RU.json

@@ -347,7 +347,9 @@
     "form.integration.webhook_secret": "Секретный ключ для вебхуков",
     "form.integration.webhook_url": "Адрес вебхуков",
     "form.prefs.fieldset.application_settings": "Настройки приложения",
-    "form.prefs.fieldset.authentication_settings": "Настройки аутентификации",
+    "form.prefs.fieldset.authentication_settings": "Аутентификация по паролю",
+    "form.prefs.fieldset.google_authentication": "Аутентификация Google",
+    "form.prefs.fieldset.oidc_authentication": "Аутентификация %s",
     "form.prefs.fieldset.global_feed_settings": "Глобальные настройки подписок",
     "form.prefs.fieldset.reader_settings": "Настройки чтения",
     "form.prefs.help.external_font_hosts": "Список разрешённых внешних хостов для шрифтов, разделенных пробелами. Например: \"fonts.gstatic.com fonts.googleapis.com\".",
@@ -574,7 +576,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "Последнее использование",
     "page.settings.webauthn.passkey_name": "Название ключа доступа",
-    "page.settings.webauthn.passkeys": "Ключи доступа",
+    "page.settings.webauthn.passkeys": "Аутентификация по ключу доступа",
     "page.settings.webauthn.register": "Зарегистрировать пароль",
     "page.settings.webauthn.register.error": "Не удается зарегистрировать пароль",
     "page.shared_entries.title": "Общедоступные статьи",

+ 4 - 2
internal/locale/translations/tr_TR.json

@@ -344,7 +344,9 @@
     "form.integration.webhook_secret": "Webhooks Secret",
     "form.integration.webhook_url": "Default Webhook URL",
     "form.prefs.fieldset.application_settings": "Uygulama Ayarları",
-    "form.prefs.fieldset.authentication_settings": "Kimlik Doğrulama Ayarları",
+    "form.prefs.fieldset.authentication_settings": "Parola ile Kimlik Doğrulama",
+    "form.prefs.fieldset.google_authentication": "Google ile Kimlik Doğrulama",
+    "form.prefs.fieldset.oidc_authentication": "%s ile Kimlik Doğrulama",
     "form.prefs.fieldset.global_feed_settings": "Genel Besleme Ayarları",
     "form.prefs.fieldset.reader_settings": "Okuyucu Ayarları",
     "form.prefs.help.external_font_hosts": "İzin verilecek harici font sunucularının boşlukla ayrılmış listesi. Örneğin: 'fonts.gstatic.com fonts.googleapis.com'.",
@@ -566,7 +568,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "Son Kullanım",
     "page.settings.webauthn.passkey_name": "Passkey Adı",
-    "page.settings.webauthn.passkeys": "Passkeyler",
+    "page.settings.webauthn.passkeys": "Geçiş Anahtarı ile Kimlik Doğrulama",
     "page.settings.webauthn.register": "Passkey'i kaydet",
     "page.settings.webauthn.register.error": "Passkey kaydedilemiyor",
     "page.shared_entries.title": "Paylaşılan makaleler",

+ 4 - 2
internal/locale/translations/uk_UA.json

@@ -347,7 +347,9 @@
     "form.integration.webhook_secret": "Секрет вебхуків",
     "form.integration.webhook_url": "URL вебхука за замовчуванням",
     "form.prefs.fieldset.application_settings": "Налаштування застосунку",
-    "form.prefs.fieldset.authentication_settings": "Налаштування автентифікації",
+    "form.prefs.fieldset.authentication_settings": "Автентифікація паролем",
+    "form.prefs.fieldset.google_authentication": "Автентифікація Google",
+    "form.prefs.fieldset.oidc_authentication": "Автентифікація %s",
     "form.prefs.fieldset.global_feed_settings": "Глобальні налаштування стрічок",
     "form.prefs.fieldset.reader_settings": "Налаштування читача",
     "form.prefs.help.external_font_hosts": "Список дозволених зовнішніх хостів шрифтів, розділених пробілами. Наприклад: 'fonts.gstatic.com fonts.googleapis.com'.",
@@ -574,7 +576,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "Востаннє використано",
     "page.settings.webauthn.passkey_name": "Назва паскі",
-    "page.settings.webauthn.passkeys": "Паскі",
+    "page.settings.webauthn.passkeys": "Автентифікація паскі",
     "page.settings.webauthn.register": "Зареєструвати пароль",
     "page.settings.webauthn.register.error": "Не вдалося зареєструвати ключ доступу",
     "page.shared_entries.title": "Спільні записи",

+ 4 - 2
internal/locale/translations/zh_CN.json

@@ -341,7 +341,9 @@
     "form.integration.webhook_secret": "Webhooks 密钥",
     "form.integration.webhook_url": "默认 Webhook URL",
     "form.prefs.fieldset.application_settings": "应用设置",
-    "form.prefs.fieldset.authentication_settings": "认证设置",
+    "form.prefs.fieldset.authentication_settings": "密码认证",
+    "form.prefs.fieldset.google_authentication": "Google 认证",
+    "form.prefs.fieldset.oidc_authentication": "%s 认证",
     "form.prefs.fieldset.global_feed_settings": "全局订阅源设置",
     "form.prefs.fieldset.reader_settings": "阅读器设置",
     "form.prefs.help.external_font_hosts": "允许外部字体托管的空格分隔列表。例如:\"fonts.gstatic.com fonts.googleapis.com\"。",
@@ -558,7 +560,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "最后使用",
     "page.settings.webauthn.passkey_name": "通行密钥名称",
-    "page.settings.webauthn.passkeys": "通行密钥",
+    "page.settings.webauthn.passkeys": "通行密钥认证",
     "page.settings.webauthn.register": "注册通行密钥",
     "page.settings.webauthn.register.error": "无法注册通行密钥",
     "page.shared_entries.title": "已共享的条目",

+ 4 - 2
internal/locale/translations/zh_TW.json

@@ -341,7 +341,9 @@
     "form.integration.webhook_secret": "Webhooks Secret",
     "form.integration.webhook_url": "預設 Webhook 網址",
     "form.prefs.fieldset.application_settings": "應用程式設定",
-    "form.prefs.fieldset.authentication_settings": "使用者認證設定",
+    "form.prefs.fieldset.authentication_settings": "密碼認證",
+    "form.prefs.fieldset.google_authentication": "Google 認證",
+    "form.prefs.fieldset.oidc_authentication": "%s 認證",
     "form.prefs.fieldset.global_feed_settings": "全域 Feed 設定",
     "form.prefs.fieldset.reader_settings": "閱讀器設定",
     "form.prefs.help.external_font_hosts": "以空白分隔允許的外部字型來源。例如:「fonts.gstatic.com fonts.googleapis.com」。",
@@ -558,7 +560,7 @@
     ],
     "page.settings.webauthn.last_seen_on": "最後使用時間",
     "page.settings.webauthn.passkey_name": "Passkey 名稱",
-    "page.settings.webauthn.passkeys": "Passkeys",
+    "page.settings.webauthn.passkeys": "Passkey 認證",
     "page.settings.webauthn.register": "註冊 Passkey",
     "page.settings.webauthn.register.error": "無法註冊 Passkey",
     "page.shared_entries.title": "已分享的文章",

+ 80 - 70
internal/template/templates/views/settings.html

@@ -8,6 +8,86 @@
 {{ end }}
 
 {{ define "content"}}
+{{ if and (not disableLocalAuth) (hasOAuth2Provider "google") }}
+<fieldset>
+    <legend>{{ t "form.prefs.fieldset.google_authentication" }}</legend>
+    {{ if .user.GoogleID }}
+    <form method="post" action="{{ routePath "/oauth2/%s/unlink" "google" }}">
+        <input type="hidden" name="csrf" value="{{ .csrf }}">
+        <button type="submit" class="button button-danger" data-label-loading="{{ t "form.submit.saving" }}">{{ t "page.settings.unlink_google_account" }}</button>
+    </form>
+    {{ else }}
+    <p>
+        <a href="{{ routePath "/oauth2/%s/redirect" "google" }}">{{ t "page.settings.link_google_account" }}</a>
+    </p>
+    {{ end }}
+</fieldset>
+{{ else if and (not disableLocalAuth) (hasOAuth2Provider "oidc") }}
+<fieldset>
+    <legend>{{ t "form.prefs.fieldset.oidc_authentication" oidcProviderName }}</legend>
+    {{ if .user.OpenIDConnectID }}
+    <form method="post" action="{{ routePath "/oauth2/%s/unlink" "oidc" }}">
+        <input type="hidden" name="csrf" value="{{ .csrf }}">
+        <button type="submit" class="button button-danger" data-label-loading="{{ t "form.submit.saving" }}">{{ t "page.settings.unlink_oidc_account" oidcProviderName }}</button>
+    </form>
+    {{ else }}
+    <p>
+        <a href="{{ routePath "/oauth2/%s/redirect" "oidc" }}">{{ t "page.settings.link_oidc_account" oidcProviderName }}</a>
+    </p>
+    {{ end }}
+</fieldset>
+{{ end }}
+{{ if .webAuthnEnabled }}
+<fieldset>
+    <legend>{{ t "page.settings.webauthn.passkeys" }}</legend>
+
+    <template id="webauthn-error">
+        <div role="alert" class="alert alert-error" id="webauthn-error-alert">
+            <h4>{{ t "page.settings.webauthn.register.error" }}</h4>
+            <p id="webauthn-error-message"></p>
+        </div>
+    </template>
+
+    {{ if .webAuthnCerts}}
+    <table>
+        <tr>
+            <th>{{ t "page.settings.webauthn.passkey_name" }}</th>
+            <th>{{ t "page.settings.webauthn.added_on" }}</th>
+            <th>{{ t "page.settings.webauthn.last_seen_on" }}</th>
+            <th>{{ t "page.settings.webauthn.actions" }}</th>
+        </tr>
+        {{ range .webAuthnCerts }}
+        <tr>
+            <td>{{ .Name }}</td>
+            <td>{{ elapsed $.user.Timezone .AddedOn }}</td>
+            <td>{{ elapsed $.user.Timezone .LastSeenOn }}</td>
+            <td>
+                <a href="#"
+                    data-confirm="true"
+                    data-label-question="{{ t "confirm.question" }}"
+                    data-label-yes="{{ t "confirm.yes" }}"
+                    data-label-no="{{ t "confirm.no" }}"
+                    data-label-loading="{{ t "confirm.loading" }}"
+                    data-url="{{ routePath "/webauthn/%s/delete" .HandleEncoded }}">{{ icon "delete" }}{{ t "action.remove" }}</a>
+                <a href="{{ routePath "/webauthn/%s/rename" .HandleEncoded }}">{{ icon "edit" }} {{ t "action.edit" }}</a>
+            </td>
+        </tr>
+        {{ end }}
+    </table>
+    {{ end }}
+
+    <div class="buttons">
+        <button type="button" class="button button-primary" id="webauthn-register" disabled>
+            {{ t "page.settings.webauthn.register" }}
+        </button>
+        {{ if gt .countWebAuthnCerts 0}}
+        <button type="button" class="button button-danger" id="webauthn-delete">
+            {{ plural "page.settings.webauthn.delete" .countWebAuthnCerts .countWebAuthnCerts }}
+        </button>
+        {{ end }}
+    </div>
+</fieldset>
+{{ end }}
 <form method="post" autocomplete="off" action="{{ routePath "/settings" }}">
     <input type="hidden" name="csrf" value="{{ .csrf }}">
 
@@ -28,82 +108,12 @@
         <label for="form-confirmation">{{ t "form.user.label.confirmation" }}</label>
         <input type="password" name="confirmation" id="form-confirmation" value="{{ .form.Confirmation }}" autocomplete="new-password">
 
-        {{ if hasOAuth2Provider "google" }}
-        <p>
-            {{ if .user.GoogleID }}
-                <a href="{{ routePath "/oauth2/%s/unlink" "google" }}">{{ t "page.settings.unlink_google_account" }}</a>
-            {{ else }}
-                <a href="{{ routePath "/oauth2/%s/redirect" "google" }}">{{ t "page.settings.link_google_account" }}</a>
-            {{ end }}
-        </p>
-        {{ else if hasOAuth2Provider "oidc" }}
-        <p>
-            {{ if .user.OpenIDConnectID }}
-                <a href="{{ routePath "/oauth2/%s/unlink" "oidc" }}">{{ t "page.settings.unlink_oidc_account" oidcProviderName }}</a>
-            {{ else }}
-                <a href="{{ routePath "/oauth2/%s/redirect" "oidc" }}">{{ t "page.settings.link_oidc_account" oidcProviderName }}</a>
-            {{ end }}
-        </p>
-        {{ end }}
-
         <div class="buttons">
             <button type="submit" class="button button-primary" data-label-loading="{{ t "form.submit.saving" }}">{{ t "action.update" }}</button>
         </div>
     </fieldset>
     {{ end }}
 
-    {{ if .webAuthnEnabled }}
-    <fieldset>
-        <legend>{{ t "page.settings.webauthn.passkeys" }}</legend>
-
-        <template id="webauthn-error">
-            <div role="alert" class="alert alert-error" id="webauthn-error-alert">
-                <h4>{{ t "page.settings.webauthn.register.error" }}</h4>
-                <p id="webauthn-error-message"></p>
-            </div>
-        </template>
-
-        {{ if .webAuthnCerts}}
-        <table>
-            <tr>
-                <th>{{ t "page.settings.webauthn.passkey_name" }}</th>
-                <th>{{ t "page.settings.webauthn.added_on" }}</th>
-                <th>{{ t "page.settings.webauthn.last_seen_on" }}</th>
-                <th>{{ t "page.settings.webauthn.actions" }}</th>
-            </tr>
-            {{ range .webAuthnCerts }}
-            <tr>
-                <td>{{ .Name }}</td>
-                <td>{{ elapsed $.user.Timezone .AddedOn }}</td>
-                <td>{{ elapsed $.user.Timezone .LastSeenOn }}</td>
-                <td>
-                    <a href="#"
-                        data-confirm="true"
-                        data-label-question="{{ t "confirm.question" }}"
-                        data-label-yes="{{ t "confirm.yes" }}"
-                        data-label-no="{{ t "confirm.no" }}"
-                        data-label-loading="{{ t "confirm.loading" }}"
-                        data-url="{{ routePath "/webauthn/%s/delete" .HandleEncoded }}">{{ icon "delete" }}{{ t "action.remove" }}</a>
-                    <a href="{{ routePath "/webauthn/%s/rename" .HandleEncoded }}">{{ icon "edit" }} {{ t "action.edit" }}</a>
-                </td>
-            </tr>
-            {{ end }}
-        </table>
-        {{ end }}
-
-        <div class="buttons">
-            <button class="button button-primary" id="webauthn-register" disabled>
-                {{ t "page.settings.webauthn.register" }}
-            </button>
-            {{ if gt .countWebAuthnCerts 0}}
-            <button class="button button-danger" id="webauthn-delete">
-                {{ plural "page.settings.webauthn.delete" .countWebAuthnCerts .countWebAuthnCerts }}
-            </button>
-            {{ end }}
-        </div>
-    </fieldset>
-    {{ end }}
-
     <fieldset>
         <legend>{{ t "form.prefs.fieldset.reader_settings" }}</legend>
 

+ 1 - 1
internal/ui/ui.go

@@ -149,7 +149,7 @@ func Serve(store *storage.Storage, pool *worker.Pool) http.Handler {
 
 	// OAuth2 flow.
 	if config.Opts.OAuth2Provider() != "" {
-		mux.HandleFunc("GET /oauth2/{provider}/unlink", handler.oauth2Unlink)
+		mux.HandleFunc("POST /oauth2/{provider}/unlink", handler.oauth2Unlink)
 		mux.HandleFunc("GET /oauth2/{provider}/redirect", handler.oauth2Redirect)
 		mux.HandleFunc("GET /oauth2/{provider}/callback", handler.oauth2Callback)
 	}