diff --git a/commafeed-client/src/App.tsx b/commafeed-client/src/App.tsx
index cc5f4cae..7ee58767 100644
--- a/commafeed-client/src/App.tsx
+++ b/commafeed-client/src/App.tsx
@@ -34,6 +34,7 @@ import { TagDetailsPage } from "@/pages/app/TagDetailsPage"
import { InitialSetupPage } from "@/pages/auth/InitialSetupPage"
import { LoginPage } from "@/pages/auth/LoginPage"
import { PasswordRecoveryPage } from "@/pages/auth/PasswordRecoveryPage"
+import { PasswordResetPage } from "@/pages/auth/PasswordResetPage"
import { RegistrationPage } from "@/pages/auth/RegistrationPage"
import { WelcomePage } from "@/pages/WelcomePage"
@@ -88,6 +89,7 @@ function AppRoutes() {
} />
} />
} />
+ } />
} sidebar={} sidebarVisible={sidebarVisible} />}>
} />
diff --git a/commafeed-client/src/app/client.ts b/commafeed-client/src/app/client.ts
index 46ebc5a6..4ec112a0 100644
--- a/commafeed-client/src/app/client.ts
+++ b/commafeed-client/src/app/client.ts
@@ -17,6 +17,7 @@ import type {
MarkRequest,
Metrics,
MultipleMarkRequest,
+ PasswordResetConfirmationRequest,
PasswordResetRequest,
ProfileModificationRequest,
RegistrationRequest,
@@ -97,6 +98,7 @@ export const client = {
register: async (req: RegistrationRequest) => await axiosInstance.post("user/register", req),
initialSetup: async (req: InitialSetupRequest) => await axiosInstance.post("user/initialSetup", req),
passwordReset: async (req: PasswordResetRequest) => await axiosInstance.post("user/passwordReset", req),
+ passwordResetCallback: async (req: PasswordResetConfirmationRequest) => await axiosInstance.post("user/passwordResetCallback", req),
getSettings: async () => await axiosInstance.get("user/settings"),
saveSettings: async (settings: Settings) => await axiosInstance.post("user/settings", settings),
getProfile: async () => await axiosInstance.get("user/profile"),
diff --git a/commafeed-client/src/app/types.ts b/commafeed-client/src/app/types.ts
index 41ac32d5..2b48e5aa 100644
--- a/commafeed-client/src/app/types.ts
+++ b/commafeed-client/src/app/types.ts
@@ -196,6 +196,12 @@ export interface PasswordResetRequest {
email: string
}
+export interface PasswordResetConfirmationRequest {
+ email: string
+ token: string
+ password: string
+}
+
export interface ProfileModificationRequest {
currentPassword: string
email: string
diff --git a/commafeed-client/src/locales/ar/messages.po b/commafeed-client/src/locales/ar/messages.po
index 5715637b..b60859ed 100644
--- a/commafeed-client/src/locales/ar/messages.po
+++ b/commafeed-client/src/locales/ar/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "العودة"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "العودة لتسجيل الدخول"
@@ -226,6 +227,11 @@ msgstr "تأكيد"
msgid "Confirm password"
msgstr "تأكيد كلمة المرور"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "دافئ"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "كلمة مرور جديدة"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "الأحدث أولاً"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "استعادة كلمة المرور"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "كلمات المرور غير متطابقة"
@@ -821,6 +837,11 @@ msgstr "تحديث"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "تم إغلاق التسجيلات في مثيل CommaFeed هذا"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1096,3 +1117,7 @@ msgstr "ليس لديك أي اشتراكات حتى الآن. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/ca/messages.po b/commafeed-client/src/locales/ca/messages.po
index aac7273d..2f3abe42 100644
--- a/commafeed-client/src/locales/ca/messages.po
+++ b/commafeed-client/src/locales/ca/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Enrere"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Torna a iniciar sessió"
@@ -226,6 +227,11 @@ msgstr "Confirma"
msgid "Confirm password"
msgstr "Confirmeu la contrasenya"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Acollidor"
@@ -491,6 +497,10 @@ msgstr "Indi"
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr "Mai"
msgid "New password"
msgstr "Contrasenya nova"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "El més nou primer"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Recuperació de contrasenya"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Les contrasenyes no coincideixen"
@@ -821,6 +837,11 @@ msgstr "Actualitzar"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Els registres estan tancats en aquesta instància de CommaFeed"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "API REST"
@@ -1096,3 +1117,7 @@ msgstr "Encara no teniu cap subscripció. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Els vostres feeds s'han posat a la cua per actualitzar-los."
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/cs/messages.po b/commafeed-client/src/locales/cs/messages.po
index 20eee3a0..9c704047 100644
--- a/commafeed-client/src/locales/cs/messages.po
+++ b/commafeed-client/src/locales/cs/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Zpět"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Zpět k přihlášení"
@@ -226,6 +227,11 @@ msgstr "Potvrdit"
msgid "Confirm password"
msgstr "Potvrďte heslo"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Útulný"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Nové heslo"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Nejnovější jako první"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Obnovení hesla"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Hesla se neshodují"
@@ -821,6 +837,11 @@ msgstr "Obnovit"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "V této instanci CommaFeed jsou registrace uzavřeny"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1096,3 +1117,7 @@ msgstr "Zatím nemáte žádné předplatné. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/cy/messages.po b/commafeed-client/src/locales/cy/messages.po
index 7e08acf5..45232ad8 100644
--- a/commafeed-client/src/locales/cy/messages.po
+++ b/commafeed-client/src/locales/cy/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Yn ôl"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Yn ôl i fewngofnodi"
@@ -226,6 +227,11 @@ msgstr "Cadarnhau"
msgid "Confirm password"
msgstr "Cadarnhau'r cyfrinair"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "clyd"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Cyfrinair newydd"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Y diweddaraf yn gyntaf"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Adfer Cyfrinair"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Nid yw cyfrineiriau yn cyfateb"
@@ -821,6 +837,11 @@ msgstr "Adnewyddu"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Mae cofrestriadau ar gau ar yr achos CommaFeed hwn"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1096,3 +1117,7 @@ msgstr "Nid oes gennych unrhyw danysgrifiadau eto. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/da/messages.po b/commafeed-client/src/locales/da/messages.po
index c081c834..49083bad 100644
--- a/commafeed-client/src/locales/da/messages.po
+++ b/commafeed-client/src/locales/da/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Tilbage"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Tilbage for at logge ind"
@@ -226,6 +227,11 @@ msgstr "Bekræft"
msgid "Confirm password"
msgstr "Bekræft adgangskode"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Hyggeligt"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Ny adgangskode"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Nyeste først"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Gendannelse af adgangskode"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Adgangskoder stemmer ikke overens"
@@ -821,6 +837,11 @@ msgstr "Opdater"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registreringer er lukket på denne CommaFeed-instans"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1096,3 +1117,7 @@ msgstr "Du har ingen abonnementer endnu. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/de/messages.po b/commafeed-client/src/locales/de/messages.po
index 979c72c7..346bb2a2 100644
--- a/commafeed-client/src/locales/de/messages.po
+++ b/commafeed-client/src/locales/de/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Zurück"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Zurück zum Login"
@@ -226,6 +227,11 @@ msgstr "Bestätigen"
msgid "Confirm password"
msgstr "Passwort bestätigen"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Gemütlich"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr "Niemals"
msgid "New password"
msgstr "Neues Passwort"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Neueste zuerst"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Passwortwiederherstellung"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Passwörter stimmen nicht überein"
@@ -821,6 +837,11 @@ msgstr "Aktualisieren"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registrierungen sind für diese CommaFeed-Instanz geschlossen"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST-API"
@@ -1096,3 +1117,7 @@ msgstr "Sie haben noch keine Abonnements."
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Ihr Feed wurde für die Aktualisierung eingereiht."
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/en/messages.po b/commafeed-client/src/locales/en/messages.po
index d1db8de4..bb9501f0 100644
--- a/commafeed-client/src/locales/en/messages.po
+++ b/commafeed-client/src/locales/en/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Back"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Back to log in"
@@ -226,6 +227,11 @@ msgstr "Confirm"
msgid "Confirm password"
msgstr "Confirm password"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr "Confirm Password"
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Cozy"
@@ -491,6 +497,10 @@ msgstr "Indigo"
msgid "Initial Setup"
msgstr "Initial Setup"
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr "Invalid password reset link. Please request a new one."
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr "Never"
msgid "New password"
msgstr "New password"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr "New Password"
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Newest first"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Password Recovery"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Passwords do not match"
@@ -821,6 +837,11 @@ msgstr "Refresh"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registrations are closed on this CommaFeed instance"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr "Reset Password"
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST API"
@@ -1096,3 +1117,7 @@ msgstr "You don't have any subscriptions yet. Why not try adding one by clicking
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Your feeds have been queued for refresh."
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr "Your password has been changed. You can now log in with your new password."
diff --git a/commafeed-client/src/locales/es/messages.po b/commafeed-client/src/locales/es/messages.po
index c7d03801..df8fda92 100644
--- a/commafeed-client/src/locales/es/messages.po
+++ b/commafeed-client/src/locales/es/messages.po
@@ -136,6 +136,7 @@ msgid "Back"
msgstr "Atrás"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Volver a iniciar sesión"
@@ -227,6 +228,11 @@ msgstr "Confirmar"
msgid "Confirm password"
msgstr "Confirmar contraseña"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Acogedor"
@@ -492,6 +498,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -635,6 +645,11 @@ msgstr "Nunca"
msgid "New password"
msgstr "Nueva contraseña"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Las más recientes primero"
@@ -781,6 +796,7 @@ msgid "Password Recovery"
msgstr "Recuperación de contraseña"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Las contraseñas no coinciden"
@@ -822,6 +838,11 @@ msgstr "Actualizar"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Los registros están cerrados en esta instancia de CommaFeed"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "API REST"
@@ -1097,3 +1118,7 @@ msgstr "Aún no tienes ninguna suscripción. ¿Por qué no intentas agregar una
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Tus feeds se han puesto en cola para actualizarse."
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/fa/messages.po b/commafeed-client/src/locales/fa/messages.po
index 1a06ada9..d9356170 100644
--- a/commafeed-client/src/locales/fa/messages.po
+++ b/commafeed-client/src/locales/fa/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "برگشت"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "بازگشت برای ورود به سیستم"
@@ -226,6 +227,11 @@ msgstr "تأیید کنید"
msgid "Confirm password"
msgstr "رمز عبور را تأیید کنید"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "دنج"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "رمز عبور جدید"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "ابتدا جدیدترین"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "بازیابی رمز عبور"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "گذرواژه ها مطابقت ندارند"
@@ -821,6 +837,11 @@ msgstr "تازه کردن"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "ثبت نام در این نمونه CommaFeed بسته شده است"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1096,3 +1117,7 @@ msgstr "شما هنوز هیچ اشتراکی ندارید. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/fi/messages.po b/commafeed-client/src/locales/fi/messages.po
index ce7405e0..7badba9a 100644
--- a/commafeed-client/src/locales/fi/messages.po
+++ b/commafeed-client/src/locales/fi/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Takaisin"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Takaisin sisäänkirjautumiseen"
@@ -226,6 +227,11 @@ msgstr "Vahvista"
msgid "Confirm password"
msgstr "Vahvista salasana"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Viihtyisä"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Uusi salasana"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Uusin ensin"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Salasanan palautus"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Salasanat eivät täsmää"
@@ -821,6 +837,11 @@ msgstr "Päivitä"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Tämän CommaFeed-esiintymän rekisteröinnit on suljettu"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1096,3 +1117,7 @@ msgstr "Sinulla ei ole vielä tilauksia. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/fr/messages.po b/commafeed-client/src/locales/fr/messages.po
index ecd22f87..c72f977d 100644
--- a/commafeed-client/src/locales/fr/messages.po
+++ b/commafeed-client/src/locales/fr/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Retour"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Retour à la connexion"
@@ -226,6 +227,11 @@ msgstr "Confirmer"
msgid "Confirm password"
msgstr "Confirmer le mot de passe"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Cozy"
@@ -491,6 +497,10 @@ msgstr "Indigo"
msgid "Initial Setup"
msgstr "Configuration initiale"
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr "Jamais"
msgid "New password"
msgstr "Nouveau mot de passe"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Plus récent en premier"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Récupération de mot de passe"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Les mots de passe ne correspondent pas"
@@ -821,6 +837,11 @@ msgstr "Rafraîchir"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Les inscriptions sont fermées sur cette instance de CommaFeed"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "API REST"
@@ -1096,3 +1117,7 @@ msgstr "Vous n'avez pas encore d'abonnements. Pourquoi ne pas essayer d'en ajout
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Vos flux sont en cours de rafraîchissement"
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/gl/messages.po b/commafeed-client/src/locales/gl/messages.po
index f456a46d..29ec2c1f 100644
--- a/commafeed-client/src/locales/gl/messages.po
+++ b/commafeed-client/src/locales/gl/messages.po
@@ -136,6 +136,7 @@ msgid "Back"
msgstr "Volver"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Volver para iniciar sesión"
@@ -227,6 +228,11 @@ msgstr "Confirmar"
msgid "Confirm password"
msgstr "Confirmar contrasinal"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Acolledor"
@@ -492,6 +498,10 @@ msgstr "Índigo"
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -635,6 +645,11 @@ msgstr "Nunca"
msgid "New password"
msgstr "Novo contrasinal"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Primeiro o máis recente"
@@ -781,6 +796,7 @@ msgid "Password Recovery"
msgstr "Recuperación do contrasinal"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Os contrasinais non coinciden"
@@ -822,6 +838,11 @@ msgstr "Actualizar"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Non se admiten novas contas nesta instancia de CommaFeed"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "API REST"
@@ -1097,3 +1118,7 @@ msgstr "Aínda non tes ningunha subscrición. Por que non engades unha premendo
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "As túas canles están na cola para ser actualizadas."
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/hu/messages.po b/commafeed-client/src/locales/hu/messages.po
index 4a7429ef..214e28f2 100644
--- a/commafeed-client/src/locales/hu/messages.po
+++ b/commafeed-client/src/locales/hu/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Vissza"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Vissza a bejelentkezéshez"
@@ -226,6 +227,11 @@ msgstr "Erősítse meg"
msgid "Confirm password"
msgstr "Erősítse meg a jelszót"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Hangulatos"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Új jelszó"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "A legújabbak először"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Jelszó helyreállítás"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "A jelszavak nem egyeznek"
@@ -821,6 +837,11 @@ msgstr "Frissítés"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "A regisztrációk le vannak zárva ezen a CommaFeed példányon"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1096,3 +1117,7 @@ msgstr "Még nincs előfizetése. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/id/messages.po b/commafeed-client/src/locales/id/messages.po
index 3aae967d..d4232421 100644
--- a/commafeed-client/src/locales/id/messages.po
+++ b/commafeed-client/src/locales/id/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Kembali"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Kembali untuk masuk"
@@ -226,6 +227,11 @@ msgstr "Konfirmasi"
msgid "Confirm password"
msgstr "Konfirmasi kata sandi"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Nyaman"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Kata sandi baru"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Terbaru dulu"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Pemulihan Kata Sandi"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Kata sandi tidak cocok"
@@ -821,6 +837,11 @@ msgstr "Segarkan"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Pendaftaran ditutup pada instans CommaFeed ini"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1096,3 +1117,7 @@ msgstr "Anda belum memiliki langganan. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/it/messages.po b/commafeed-client/src/locales/it/messages.po
index f5643d1a..03d1fee7 100644
--- a/commafeed-client/src/locales/it/messages.po
+++ b/commafeed-client/src/locales/it/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Indietro"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Torna per accedere"
@@ -226,6 +227,11 @@ msgstr "Conferma"
msgid "Confirm password"
msgstr "Conferma password"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Accogliente"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Nuova password"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Il più recente prima"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Recupero password"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Le password non corrispondono"
@@ -821,6 +837,11 @@ msgstr "Aggiorna"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Le registrazioni sono chiuse su questa istanza CommaFeed"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "API REST"
@@ -1096,3 +1117,7 @@ msgstr "Non hai ancora abbonamenti. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/ja/messages.po b/commafeed-client/src/locales/ja/messages.po
index f28bbd31..688ca278 100644
--- a/commafeed-client/src/locales/ja/messages.po
+++ b/commafeed-client/src/locales/ja/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "戻る"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "ログインに戻る"
@@ -226,6 +227,11 @@ msgstr "確認"
msgid "Confirm password"
msgstr "パスワード確認"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Cozy"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr "しない"
msgid "New password"
msgstr "新しいパスワード"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "最新順"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "パスワード回復"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "パスワードが一致しません"
@@ -821,6 +837,11 @@ msgstr "リフレッシュ"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "このCommaFeedインスタンスの登録は終了しています"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST API"
@@ -1096,3 +1117,7 @@ msgstr "まだサブスクリプションがありません。上部の + 記号
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "フィードの更新がキューに登録されました。"
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/ko/messages.po b/commafeed-client/src/locales/ko/messages.po
index 1f76e680..ed421d10 100644
--- a/commafeed-client/src/locales/ko/messages.po
+++ b/commafeed-client/src/locales/ko/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "뒤로"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "로그인으로 돌아가기"
@@ -226,6 +227,11 @@ msgstr "확인"
msgid "Confirm password"
msgstr "비밀번호 확인"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "코지"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "새 비밀번호"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "최신순"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "비밀번호 복구"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "비밀번호가 일치하지 않습니다"
@@ -821,6 +837,11 @@ msgstr "새로 고침"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "이 CommaFeed 인스턴스에 대한 등록이 마감되었습니다."
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1096,3 +1117,7 @@ msgstr "아직 구독이 없습니다. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/ms/messages.po b/commafeed-client/src/locales/ms/messages.po
index 1020ac47..bf73d4e4 100644
--- a/commafeed-client/src/locales/ms/messages.po
+++ b/commafeed-client/src/locales/ms/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Kembali"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Kembali untuk log masuk"
@@ -226,6 +227,11 @@ msgstr "Sahkan"
msgid "Confirm password"
msgstr "Sahkan kata laluan"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Nyaman"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Kata laluan baharu"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Terbaharu dahulu"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Pemulihan Kata Laluan"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Kata laluan tidak sepadan"
@@ -821,6 +837,11 @@ msgstr "Muat semula"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Pendaftaran ditutup pada contoh CommaFeed ini"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REHAT API"
@@ -1096,3 +1117,7 @@ msgstr "Anda belum mempunyai sebarang langganan lagi. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/nb/messages.po b/commafeed-client/src/locales/nb/messages.po
index b23be151..60b25ad1 100644
--- a/commafeed-client/src/locales/nb/messages.po
+++ b/commafeed-client/src/locales/nb/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Tilbake"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Tilbake for å logge inn"
@@ -226,6 +227,11 @@ msgstr "Bekreft"
msgid "Confirm password"
msgstr "Bekreft passord"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Koselig"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Nytt passord"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Nyeste først"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Passordgjenoppretting"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Passordene samsvarer ikke"
@@ -821,6 +837,11 @@ msgstr "Oppdater"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registreringer er stengt på denne CommaFeed-forekomsten"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1096,3 +1117,7 @@ msgstr "Du har ingen abonnementer ennå. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/nl/messages.po b/commafeed-client/src/locales/nl/messages.po
index e3fa3290..6ab6fa07 100644
--- a/commafeed-client/src/locales/nl/messages.po
+++ b/commafeed-client/src/locales/nl/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Terug"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Terug naar inloggen"
@@ -226,6 +227,11 @@ msgstr "Bevestigen"
msgid "Confirm password"
msgstr "Bevestig wachtwoord"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Gezellig"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Nieuw wachtwoord"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Nieuwste eerst"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Wachtwoordherstel"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Wachtwoorden komen niet overeen"
@@ -821,6 +837,11 @@ msgstr "Vernieuwen"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registraties zijn gesloten op deze CommaFeed-instantie"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST-API"
@@ -1096,3 +1117,7 @@ msgstr "Je hebt nog geen abonnementen. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/nn/messages.po b/commafeed-client/src/locales/nn/messages.po
index fd3c06dc..d64bd953 100644
--- a/commafeed-client/src/locales/nn/messages.po
+++ b/commafeed-client/src/locales/nn/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Tilbake"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Tilbake for å logge inn"
@@ -226,6 +227,11 @@ msgstr "Bekreft"
msgid "Confirm password"
msgstr "Bekreft passord"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Koselig"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Nytt passord"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Nyeste først"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Passordgjenoppretting"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Passordene samsvarer ikke"
@@ -821,6 +837,11 @@ msgstr "Oppdater"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registreringer er stengt på denne CommaFeed-forekomsten"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1096,3 +1117,7 @@ msgstr "Du har ingen abonnementer ennå. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/pl/messages.po b/commafeed-client/src/locales/pl/messages.po
index 2d21886f..66c7750c 100644
--- a/commafeed-client/src/locales/pl/messages.po
+++ b/commafeed-client/src/locales/pl/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Powrót"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Powrót do logowania"
@@ -226,6 +227,11 @@ msgstr "Potwierdź"
msgid "Confirm password"
msgstr "Potwierdź hasło"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Przytulny"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Nowe hasło"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Najnowsze jako pierwsze"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Odzyskiwanie hasła"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Hasła nie pasują"
@@ -821,6 +837,11 @@ msgstr "Odśwież"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Rejestracje są zamknięte w tej instancji CommaFeed"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1096,3 +1117,7 @@ msgstr "Nie masz jeszcze żadnych subskrypcji. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/pt/messages.po b/commafeed-client/src/locales/pt/messages.po
index a4100f3b..7992222f 100644
--- a/commafeed-client/src/locales/pt/messages.po
+++ b/commafeed-client/src/locales/pt/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Voltar"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Voltar para logar"
@@ -226,6 +227,11 @@ msgstr "Confirmar"
msgid "Confirm password"
msgstr "Confirmar senha"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Aconchegante"
@@ -491,6 +497,10 @@ msgstr "Índigo"
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr "Nunca"
msgid "New password"
msgstr "Nova senha"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Mais novo primeiro"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Recuperação de Senha"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Senhas não coincidem"
@@ -821,6 +837,11 @@ msgstr "Atualizar"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Os registros estão fechados nesta instância do CommaFeed"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "API REST"
@@ -1096,3 +1117,7 @@ msgstr "Você ainda não tem nenhuma assinatura. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Seus feed foram enfileirados para atualização"
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/ru/messages.po b/commafeed-client/src/locales/ru/messages.po
index d35dca3d..3c7cfcdb 100644
--- a/commafeed-client/src/locales/ru/messages.po
+++ b/commafeed-client/src/locales/ru/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Назад"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Вернуться к входу"
@@ -226,6 +227,11 @@ msgstr "Подтвердить"
msgid "Confirm password"
msgstr "Подтвердить пароль"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Уютно"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr "Никогда"
msgid "New password"
msgstr "Новый пароль"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Сначала новые"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Восстановление пароля"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Пароли не совпадают"
@@ -821,6 +837,11 @@ msgstr "Обновить"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Регистрация закрыта для этого экземпляра CommaFeed."
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST API"
@@ -1096,3 +1117,7 @@ msgstr "У вас еще нет подписок. Почему бы не поп
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Ваши каналы были поставлены в очередь на обновление."
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/sk/messages.po b/commafeed-client/src/locales/sk/messages.po
index 3076dfb6..bd824793 100644
--- a/commafeed-client/src/locales/sk/messages.po
+++ b/commafeed-client/src/locales/sk/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Späť"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Späť na prihlásenie"
@@ -226,6 +227,11 @@ msgstr "Potvrdiť"
msgid "Confirm password"
msgstr "Potvrďte heslo"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Útulný"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Nové heslo"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Najnovšie ako prvé"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Obnovenie hesla"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Heslá sa nezhodujú"
@@ -821,6 +837,11 @@ msgstr "Obnoviť"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "V tejto inštancii CommaFeed sú registrácie uzavreté"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1096,3 +1117,7 @@ msgstr "Zatiaľ nemáte žiadne odbery. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/sv/messages.po b/commafeed-client/src/locales/sv/messages.po
index a57a1d96..0caa7ff9 100644
--- a/commafeed-client/src/locales/sv/messages.po
+++ b/commafeed-client/src/locales/sv/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Tillbaka"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Tillbaka för att logga in"
@@ -226,6 +227,11 @@ msgstr "Bekräfta"
msgid "Confirm password"
msgstr "Bekräfta lösenord"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Mysigt"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Nytt lösenord"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Nyast först"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Lösenordsåterställning"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Lösenorden matchar inte"
@@ -821,6 +837,11 @@ msgstr "Uppdatera"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Registreringar är stängda på denna CommaFeed-instans"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr ""
@@ -1096,3 +1117,7 @@ msgstr "Du har inga prenumerationer än. "
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr ""
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/tr/messages.po b/commafeed-client/src/locales/tr/messages.po
index 26eba758..663b6733 100644
--- a/commafeed-client/src/locales/tr/messages.po
+++ b/commafeed-client/src/locales/tr/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "Geri"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "Giriş yapmak için geri dön"
@@ -226,6 +227,11 @@ msgstr "Onayla"
msgid "Confirm password"
msgstr "Şifreyi onayla"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "Rahat"
@@ -491,6 +497,10 @@ msgstr ""
msgid "Initial Setup"
msgstr ""
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr ""
msgid "New password"
msgstr "Yeni şifre"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "Önce en yenisi"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "Parola Kurtarma"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "Parolalar eşleşmiyor"
@@ -821,6 +837,11 @@ msgstr "Yenile"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "Bu CommaFeed örneğinde kayıtlar kapalı"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST API"
@@ -1096,3 +1117,7 @@ msgstr "Henüz aboneliğiniz yok. Sayfanın üstündeki + işaretiyle feed ekley
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "Feed'leriniz yenileme için sıraya alındı."
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/locales/zh/messages.po b/commafeed-client/src/locales/zh/messages.po
index 79c8c0a6..0b0d361c 100644
--- a/commafeed-client/src/locales/zh/messages.po
+++ b/commafeed-client/src/locales/zh/messages.po
@@ -135,6 +135,7 @@ msgid "Back"
msgstr "返回"
#: src/pages/auth/PasswordRecoveryPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Back to log in"
msgstr "返回登录"
@@ -226,6 +227,11 @@ msgstr "确认"
msgid "Confirm password"
msgstr "确认密码"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Confirm Password"
+msgstr ""
+
#: src/components/header/ProfileMenu.tsx
msgid "Cozy"
msgstr "宽松"
@@ -491,6 +497,10 @@ msgstr "靛蓝"
msgid "Initial Setup"
msgstr "初始化设置"
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Invalid password reset link. Please request a new one."
+msgstr ""
+
#: src/components/content/FeedEntryContextMenu.tsx
#: src/components/content/FeedEntryFooter.tsx
msgid "Keep unread"
@@ -634,6 +644,11 @@ msgstr "从不"
msgid "New password"
msgstr "新密码"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "New Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "Newest first"
msgstr "最新的优先"
@@ -780,6 +795,7 @@ msgid "Password Recovery"
msgstr "密码恢复"
#: src/components/settings/ProfileSettings.tsx
+#: src/pages/auth/PasswordResetPage.tsx
msgid "Passwords do not match"
msgstr "密码不匹配"
@@ -821,6 +837,11 @@ msgstr "刷新"
msgid "Registrations are closed on this CommaFeed instance"
msgstr "此 CommaFeed 实例上的注册已关闭"
+#: src/pages/auth/PasswordResetPage.tsx
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Reset Password"
+msgstr ""
+
#: src/pages/app/AboutPage.tsx
msgid "REST API"
msgstr "REST API"
@@ -1096,3 +1117,7 @@ msgstr "您还没有任何订阅。"
#: src/components/header/ProfileMenu.tsx
msgid "Your feeds have been queued for refresh."
msgstr "您的订阅已经进入刷新队列。"
+
+#: src/pages/auth/PasswordResetPage.tsx
+msgid "Your password has been changed. You can now log in with your new password."
+msgstr ""
diff --git a/commafeed-client/src/pages/auth/PasswordResetPage.tsx b/commafeed-client/src/pages/auth/PasswordResetPage.tsx
new file mode 100644
index 00000000..258c95af
--- /dev/null
+++ b/commafeed-client/src/pages/auth/PasswordResetPage.tsx
@@ -0,0 +1,119 @@
+import { msg } from "@lingui/core/macro"
+import { useLingui } from "@lingui/react"
+import { Trans } from "@lingui/react/macro"
+import { Anchor, Box, Button, Center, Container, Group, Paper, PasswordInput, Stack, Title } from "@mantine/core"
+import { useForm } from "@mantine/form"
+import { useState } from "react"
+import { useAsyncCallback } from "react-async-hook"
+import { Link, useSearchParams } from "react-router-dom"
+import { client, errorToStrings } from "@/app/client"
+import { Alert } from "@/components/Alert"
+import { useValidationRules } from "@/hooks/useValidationRules"
+import { PageTitle } from "@/pages/PageTitle"
+
+interface PasswordResetFormValues {
+ password: string
+ passwordConfirmation: string
+}
+
+export function PasswordResetPage() {
+ const [message, setMessage] = useState("")
+ const [searchParams] = useSearchParams()
+ const { _ } = useLingui()
+ const validationRules = useValidationRules()
+
+ const email = searchParams.get("email") ?? ""
+ const token = searchParams.get("token") ?? ""
+
+ const form = useForm({
+ initialValues: {
+ password: "",
+ passwordConfirmation: "",
+ },
+ validate: {
+ password: validationRules.password,
+ passwordConfirmation: (value, values) => (value === values.password ? null : _(msg`Passwords do not match`)),
+ },
+ validateInputOnChange: true,
+ })
+
+ const resetPassword = useAsyncCallback(client.user.passwordResetCallback, {
+ onSuccess: () => {
+ setMessage(_(msg`Your password has been changed. You can now log in with your new password.`))
+ form.reset()
+ },
+ })
+
+ const isMissingParams = !email || !token
+
+ return (
+
+
+
+
+ Reset Password
+
+
+ {resetPassword.error && (
+
+
+
+ )}
+
+ {isMissingParams && (
+
+
+
+ )}
+
+ {message && (
+
+
+
+ )}
+
+ {!isMissingParams && !message && (
+
+ )}
+
+
+
+
+ Back to log in
+
+
+
+
+
+ )
+}
diff --git a/commafeed-server/src/main/java/com/commafeed/frontend/model/request/PasswordResetConfirmationRequest.java b/commafeed-server/src/main/java/com/commafeed/frontend/model/request/PasswordResetConfirmationRequest.java
new file mode 100644
index 00000000..d8ed5965
--- /dev/null
+++ b/commafeed-server/src/main/java/com/commafeed/frontend/model/request/PasswordResetConfirmationRequest.java
@@ -0,0 +1,34 @@
+package com.commafeed.frontend.model.request;
+
+import java.io.Serializable;
+
+import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.Size;
+
+import org.eclipse.microprofile.openapi.annotations.media.Schema;
+
+import com.commafeed.security.password.ValidPassword;
+
+import lombok.Data;
+
+@SuppressWarnings("serial")
+@Data
+@Schema
+public class PasswordResetConfirmationRequest implements Serializable {
+
+ @Schema(description = "email address for password recovery", required = true)
+ @Email
+ @NotEmpty
+ @Size(max = 255)
+ private String email;
+
+ @Schema(description = "password recovery token", required = true)
+ @NotEmpty
+ private String token;
+
+ @Schema(description = "new password", required = true)
+ @NotEmpty
+ @ValidPassword
+ private String password;
+}
diff --git a/commafeed-server/src/main/java/com/commafeed/frontend/resource/UserREST.java b/commafeed-server/src/main/java/com/commafeed/frontend/resource/UserREST.java
index 41e3a4b0..71f28b28 100644
--- a/commafeed-server/src/main/java/com/commafeed/frontend/resource/UserREST.java
+++ b/commafeed-server/src/main/java/com/commafeed/frontend/resource/UserREST.java
@@ -1,6 +1,5 @@
package com.commafeed.frontend.resource;
-import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
@@ -21,13 +20,11 @@ import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.Status;
import jakarta.ws.rs.core.UriInfo;
-import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.hc.core5.net.URIBuilder;
import org.eclipse.microprofile.openapi.annotations.Operation;
@@ -38,7 +35,6 @@ import com.commafeed.CommaFeedConfiguration;
import com.commafeed.CommaFeedConstants;
import com.commafeed.backend.Digests;
import com.commafeed.backend.Urls;
-import com.commafeed.backend.dao.UnitOfWork;
import com.commafeed.backend.dao.UserDAO;
import com.commafeed.backend.dao.UserRoleDAO;
import com.commafeed.backend.dao.UserSettingsDAO;
@@ -57,6 +53,7 @@ import com.commafeed.backend.service.db.DatabaseStartupService;
import com.commafeed.frontend.model.Settings;
import com.commafeed.frontend.model.UserModel;
import com.commafeed.frontend.model.request.InitialSetupRequest;
+import com.commafeed.frontend.model.request.PasswordResetConfirmationRequest;
import com.commafeed.frontend.model.request.PasswordResetRequest;
import com.commafeed.frontend.model.request.ProfileModificationRequest;
import com.commafeed.frontend.model.request.RegistrationRequest;
@@ -87,7 +84,6 @@ public class UserREST {
private final MailService mailService;
private final CommaFeedConfiguration config;
private final UriInfo uri;
- private final UnitOfWork unitOfWork;
@Path("/settings")
@GET
@@ -334,45 +330,44 @@ public class UserREST {
}
}
- private String buildEmailContent(User user) throws URISyntaxException, MalformedURLException {
+ private String buildEmailContent(User user) throws URISyntaxException {
String publicUrl = Urls.removeTrailingSlash(uri.getBaseUri().toString());
- publicUrl += "/rest/user/passwordResetCallback";
return String.format(
"You asked for password recovery for account '%s', follow this link to change your password. Ignore this if you didn't request a password recovery.",
user.getName(), callbackUrl(user, publicUrl));
}
- private String callbackUrl(User user, String publicUrl) throws URISyntaxException, MalformedURLException {
- return new URIBuilder(publicUrl).addParameter("email", user.getEmail())
- .addParameter("token", user.getRecoverPasswordToken())
- .build()
- .toURL()
- .toString();
+ private String callbackUrl(User user, String publicUrl) throws URISyntaxException {
+ URIBuilder queryBuilder = new URIBuilder();
+ queryBuilder.addParameter("email", user.getEmail());
+ queryBuilder.addParameter("token", user.getRecoverPasswordToken());
+ String queryString = queryBuilder.build().getRawQuery();
+ return publicUrl + "/#/passwordReset?" + queryString;
}
@Path("/passwordResetCallback")
@PermitAll
- @GET
+ @POST
@Transactional
- @Produces(MediaType.TEXT_HTML)
- public Response passwordRecoveryCallback(@Parameter(required = true) @QueryParam("email") String email,
- @Parameter(required = true) @QueryParam("token") String token) {
+ @Operation(summary = "confirm password reset with new password")
+ public Response passwordRecoveryCallback(@Valid @Parameter(required = true) PasswordResetConfirmationRequest req) {
+ String email = req.getEmail();
+ String token = req.getToken();
+ String password = req.getPassword();
+
Preconditions.checkNotNull(email);
Preconditions.checkNotNull(token);
+ Preconditions.checkNotNull(password);
User user = userDAO.findByEmail(email);
- if (user == null) {
- return Response.status(Status.UNAUTHORIZED).entity("Email not found.").build();
+ if (user == null || user.getRecoverPasswordToken() == null || !user.getRecoverPasswordToken().equals(token)) {
+ return Response.status(Status.UNAUTHORIZED).entity("Email not found or invalid token.").build();
}
- if (user.getRecoverPasswordToken() == null || !user.getRecoverPasswordToken().equals(token)) {
- return Response.status(Status.UNAUTHORIZED).entity("Invalid token.").build();
- }
- if (ChronoUnit.DAYS.between(user.getRecoverPasswordTokenDate(), Instant.now()) >= 2) {
- return Response.status(Status.UNAUTHORIZED).entity("token expired.").build();
+ if (ChronoUnit.MINUTES.between(user.getRecoverPasswordTokenDate(), Instant.now()) >= 30) {
+ return Response.status(Status.UNAUTHORIZED).entity("Token expired.").build();
}
- String passwd = RandomStringUtils.secure().nextAlphanumeric(10);
- byte[] encryptedPassword = encryptionService.getEncryptedPassword(passwd, user.getSalt());
+ byte[] encryptedPassword = encryptionService.getEncryptedPassword(password, user.getSalt());
user.setPassword(encryptedPassword);
if (StringUtils.isNotBlank(user.getApiKey())) {
user.setApiKey(userService.generateApiKey(user));
@@ -380,10 +375,7 @@ public class UserREST {
user.setRecoverPasswordToken(null);
user.setRecoverPasswordTokenDate(null);
- String message = "Your new password is: " + passwd;
- message += "
";
- message += String.format("Back to Homepage", uri.getBaseUri());
- return Response.ok(message).build();
+ return Response.ok().build();
}
@Path("/profile/deleteAccount")
diff --git a/commafeed-server/src/test/java/com/commafeed/integration/rest/UserIT.java b/commafeed-server/src/test/java/com/commafeed/integration/rest/UserIT.java
index aa3d266e..320fd883 100644
--- a/commafeed-server/src/test/java/com/commafeed/integration/rest/UserIT.java
+++ b/commafeed-server/src/test/java/com/commafeed/integration/rest/UserIT.java
@@ -1,5 +1,7 @@
package com.commafeed.integration.rest;
+import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
import java.util.List;
import jakarta.inject.Inject;
@@ -13,6 +15,7 @@ import org.junit.jupiter.api.Test;
import com.commafeed.TestConstants;
import com.commafeed.frontend.model.Settings;
+import com.commafeed.frontend.model.request.PasswordResetConfirmationRequest;
import com.commafeed.frontend.model.request.PasswordResetRequest;
import com.commafeed.integration.BaseIT;
@@ -57,8 +60,32 @@ class UserIT extends BaseIT {
Element a = Jsoup.parse(message.getHtml()).select("a").getFirst();
String link = a.attr("href");
- String newPasswordResponse = RestAssured.given().urlEncodingEnabled(false).get(link).then().statusCode(200).extract().asString();
- Assertions.assertTrue(newPasswordResponse.contains("Your new password is:"));
+
+ String email = null;
+ String token = null;
+ String queryString = link.substring(link.indexOf('?') + 1);
+ for (String param : queryString.split("&")) {
+ String[] keyValue = param.split("=");
+ if ("email".equals(keyValue[0])) {
+ email = URLDecoder.decode(keyValue[1], StandardCharsets.UTF_8);
+ } else if ("token".equals(keyValue[0])) {
+ token = URLDecoder.decode(keyValue[1], StandardCharsets.UTF_8);
+ }
+ }
+
+ Assertions.assertNotNull(email);
+ Assertions.assertNotNull(token);
+ Assertions.assertTrue(link.contains("#/passwordReset?"));
+
+ String newPassword = "MyNewPassword123!";
+ PasswordResetConfirmationRequest confirmReq = new PasswordResetConfirmationRequest();
+ confirmReq.setEmail(email);
+ confirmReq.setToken(token);
+ confirmReq.setPassword(newPassword);
+ RestAssured.given().body(confirmReq).contentType(ContentType.JSON).post("rest/user/passwordResetCallback").then().statusCode(200);
+
+ RestAssured.authentication = RestAssured.preemptive().basic(TestConstants.ADMIN_USERNAME, newPassword);
+ RestAssured.given().get("rest/user/settings").then().statusCode(200);
}
@Test