diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6bc6ad4..bd230d5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+# v3.7.5
+## 06/14/2023
+
+1. [](#bugfix)
+ * Sanitized `email` during the "forgot password" process to protect against XSS attacks
+ * Fixed an account enumeration vulneratiblity in forgot password [#293](https://github.com/getgrav/grav-plugin-login/pull/293)
+
# v3.7.4
## 05/09/2023
diff --git a/blueprints.yaml b/blueprints.yaml
index e6b1b20..bd7b61b 100644
--- a/blueprints.yaml
+++ b/blueprints.yaml
@@ -1,7 +1,7 @@
name: Login
slug: login
type: plugin
-version: 3.7.4
+version: 3.7.5
testing: false
description: Enables user authentication and login screen.
icon: sign-in
diff --git a/classes/Controller.php b/classes/Controller.php
index e5cffda..9421cdd 100644
--- a/classes/Controller.php
+++ b/classes/Controller.php
@@ -351,6 +351,10 @@ protected function taskForgot()
$users = $this->grav['accounts'];
$email = $data['email'] ?? '';
+
+ // Sanitize $email
+ $email = htmlspecialchars(strip_tags($email), ENT_QUOTES, 'UTF-8');
+
$user = !empty($email) ? $users->find($email, ['email']) : null;
/** @var Language $language */
@@ -364,29 +368,6 @@ protected function taskForgot()
return true;
}
- if (!$user || !$user->exists()) {
- $messages->add($language->translate(['PLUGIN_LOGIN.FORGOT_USERNAME_DOES_NOT_EXIST', $email]), 'error');
- $this->setRedirect($this->login->getRoute('forgot') ?? '/');
-
- return true;
- }
-
- if (empty($user->email)) {
- $messages->add($language->translate(['PLUGIN_LOGIN.FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL', $email]),
- 'error');
- $this->setRedirect($this->login->getRoute('forgot') ?? '/');
-
- return true;
- }
-
- if (empty($user->password) && empty($user->hashed_password)) {
- $messages->add($language->translate(['PLUGIN_LOGIN.FORGOT_CANNOT_RESET_EMAIL_NO_PASSWORD', $email]),
- 'error');
- $this->setRedirect($this->login->getRoute('forgot') ?? '/');
-
- return true;
- }
-
$from = $config->get('plugins.email.from');
if (empty($from)) {
diff --git a/languages/de.yaml b/languages/de.yaml
index 1af8a8b..c353d84 100644
--- a/languages/de.yaml
+++ b/languages/de.yaml
@@ -21,9 +21,6 @@ PLUGIN_LOGIN:
RESET_INVALID_LINK: "Es wurde ein ungültiger Link zum Zurücksetzen verwendet. Bitte erneut versuchen."
FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Die Anweisungen zum Zurücksetzen Ihres Passworts wurden per E-Mail gesendet."
FORGOT_FAILED_TO_EMAIL: "Das Versenden der Anweisung per E-Mail ist fehlgeschlagen. Bitte später erneut versuchen."
- FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Das Passwort für %s kann nicht zurückgesetzt werden. Es ist keine E-Mail-Adresse hinterlegt."
- FORGOT_CANNOT_RESET_EMAIL_NO_PASSWORD: "Das Passwort für %s kann nicht zurückgesetzt werden. Diese E-Mail ist mit einem Remote-Account verknüpft."
- FORGOT_USERNAME_DOES_NOT_EXIST: "Der Benutzer mit dem Benutzername %s existiert nicht."
FORGOT_EMAIL_NOT_CONFIGURED: "Das Passwort kann nicht zurückgesetzt werden, da die Website ist nicht zum Versenden von E-Mails konfiguriert."
FORGOT_EMAIL_SUBJECT: "Passwort zurückzusetzen für %s"
FORGOT_EMAIL_BODY: "
Passwort Zurücksetzen
Hallo %1$s,
Es wurde ein Anfrage auf %4$s gestellt, um Ihr Passwort zu ändern.
Klicken Sie hier, um Ihr Passwort zurückzusetzen
Alternativ kopieren Sie die folgende URL in die Adresszeile Ihres Browsers:
%2$s
Mit freundlichen Grüßen,
%3$s
"
diff --git a/languages/en.yaml b/languages/en.yaml
index 895ba26..c3eb1f1 100644
--- a/languages/en.yaml
+++ b/languages/en.yaml
@@ -18,11 +18,8 @@ PLUGIN_LOGIN:
RESET_LINK_EXPIRED: "Reset link has expired, please try again"
RESET_PASSWORD_RESET: "Password has been reset"
RESET_INVALID_LINK: "Invalid reset link used, please try again"
- FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Instructions to reset your password have been sent via email"
+ FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "If an account exists, instructions on resetting your password have been sent via email"
FORGOT_FAILED_TO_EMAIL: "Failed to email instructions, please try again later"
- FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Cannot reset password for %s, no email address is set"
- FORGOT_CANNOT_RESET_EMAIL_NO_PASSWORD: "Cannot reset password for %s, this email is associated with a remote account"
- FORGOT_USERNAME_DOES_NOT_EXIST: "User with username %s does not exist"
FORGOT_EMAIL_NOT_CONFIGURED: "Cannot reset password. This site is not configured to send emails"
FORGOT_EMAIL_SUBJECT: "%s Password Reset Request"
FORGOT_EMAIL_BODY: "Password Reset
Dear %1$s,
A request was made on %4$s to reset your password.
Click this to reset your password
Alternatively, copy the following URL into your browser's address bar:
%2$s
Kind regards,
%3$s
"
diff --git a/languages/es.yaml b/languages/es.yaml
index eb9a27d..ed4aa95 100644
--- a/languages/es.yaml
+++ b/languages/es.yaml
@@ -19,10 +19,8 @@ PLUGIN_LOGIN:
RESET_LINK_EXPIRED: "El enlace para la restauración ha caducado, inténtelo de nuevo."
RESET_PASSWORD_RESET: "La contraseña ha sido restaurada"
RESET_INVALID_LINK: "Ha utilizado un enlace de restauración inválido, inténtelo de nuevo."
- FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Instructions to reset your password have been sent via email"
+ FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "If an account exists, instructions on resetting your password have been sent via email"
FORGOT_FAILED_TO_EMAIL: "No se ha podido enviar el email con instrucciones, inténtelo de nuevo."
- FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "No se puede restaurar la contraseña para %s, no hay dirección de email."
- FORGOT_USERNAME_DOES_NOT_EXIST: "No existe ningún usuario con el nombre %s."
FORGOT_EMAIL_NOT_CONFIGURED: "No se puede restaurar la contraseña. Este sitio no está configurado para enviar emails."
FORGOT_EMAIL_SUBJECT: "%s solicitud de restauración de contraseña"
FORGOT_EMAIL_BODY: "Restauración de contraseña
Estimado/a %1$s,
Se ha realizado una petición de restauración de contraseña en %4$s.
Pulse aquí para restaurar su contraseña
Como alternativa puede copiar la siguiente URL en la barra de direcciones de su navegador:
%2$s
Saludos cordiales,
%3$s
"
diff --git a/languages/fr.yaml b/languages/fr.yaml
index f98c5ac..8ee745f 100644
--- a/languages/fr.yaml
+++ b/languages/fr.yaml
@@ -19,8 +19,6 @@ PLUGIN_LOGIN:
RESET_INVALID_LINK: "Le lien de réinitialisation utilisé n’est pas valide, veuillez réessayer"
FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Les instructions pour la réinitialisation de votre mot de passe ont été envoyées par e-mail"
FORGOT_FAILED_TO_EMAIL: "Impossible d’envoyer les instructions, veuillez réessayer ultérieurement"
- FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Impossible de réinitialiser le mot de passe pour %s, aucune adresse e-mail n’a été paramétrée"
- FORGOT_USERNAME_DOES_NOT_EXIST: "L’utilisateur avec le nom d’utilisateur %s n’existe pas"
FORGOT_EMAIL_NOT_CONFIGURED: "Impossible de réinitialiser le mot de passe. Ce site n’est pas configuré pour envoyer des e-mails"
FORGOT_EMAIL_SUBJECT: "Demande de réinitialisation de mot de passe %s"
FORGOT_EMAIL_BODY: "Réinitialisation de mot de passe
%1$s,
Une demande a été faite sur %4$s pour la réinitialisation de votre mot de passe.
Cliquez ici pour réinitialiser votre mot de passe
Vous pouvez également copier l’URL suivante dans la barre d’adresse de votre navigateur :
%2$s
Cordialement,
%3$s
"
diff --git a/languages/lt.yaml b/languages/lt.yaml
index 12be54a..b29415e 100644
--- a/languages/lt.yaml
+++ b/languages/lt.yaml
@@ -18,12 +18,9 @@ PLUGIN_LOGIN:
RESET_LINK_EXPIRED: "Atstatymo nuoroda nebegalioja, bandykite dar kartą"
RESET_PASSWORD_RESET: "Slaptažodis atstatytas"
RESET_INVALID_LINK: "Panaudota neteisinga atstatymo nuoroda, bandykite dar kartą"
- FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Slaptažodžio atstatymo instrukcijos buvo išsiųstos el. paštu"
+ FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Jeigu vartotojo paskyra egzistuoja, slaptažodžio atstatymo instrukcijos buvo išsiųstos el. paštu"
FORGOT_FAILED_TO_EMAIL: "Instrukcijų išsiuntimas nepavyko, bandykite dar kartą"
- FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Negalima atstatyti %s slaptažodžio, nenurodytas el. paštas"
- FORGOT_CANNOT_RESET_EMAIL_NO_PASSWORD: "Negalima atstatyti %s slaptažodžio, šis el. paštas susietas su nuotoline paskyra"
- FORGOT_USERNAME_DOES_NOT_EXIST: "Vartotojas vardu %s neegzistuoja"
- FORGOT_EMAIL_NOT_CONFIGURED: "Negalima tastatyti slaptažodžio. Ši svetainė nenustatyta siųsti el. laiškus"
+ FORGOT_EMAIL_NOT_CONFIGURED: "Negalima atstatyti slaptažodžio. Ši svetainė nenustatyta siųsti el. laiškus"
FORGOT_EMAIL_SUBJECT: "%s slaptažodžio atstatymo užklausa"
FORGOT_EMAIL_BODY: "Slaptažodis atstatytas
Miela(s) %1$s,
%4$s buvo gauta užklausa jūsų slaptažodžio atstatymui.
Paspauskite čia norėdami atstatyti slaptažodį
Taip pat galite nukopijuoti sekančią nuorodą į savo naršyklės adreso juostą:
%2$s
Linkėjimai,
%3$s
"
SESSION: "“Prisiminti mane”-sesija"
diff --git a/languages/no.yaml b/languages/no.yaml
index a8ca03a..098a361 100644
--- a/languages/no.yaml
+++ b/languages/no.yaml
@@ -21,8 +21,6 @@ PLUGIN_LOGIN:
RESET_INVALID_LINK: "Ugyldig ilbakestillingslenke, vennligst prøv igjen"
FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Instruksjoner for å tilbakestille passordet ditt er sendt via e-post"
FORGOT_FAILED_TO_EMAIL: "Kunne ikke sende instruksjoner, prøv igjen senere"
- FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Kan ikke tilbakestille passord for %s, ingen e-postadresse er angitt"
- FORGOT_USERNAME_DOES_NOT_EXIST: "Bruker med brukernavn %s b> eksisterer ikke"
FORGOT_EMAIL_NOT_CONFIGURED: "Kan ikke tilbakestille passord. Dette nettstedet er ikke konfigurert til å sende e-post"
FORGOT_EMAIL_SUBJECT: "Forespørsel om tilbakestilling av passord for %s"
FORGOT_EMAIL_BODY: "Tilbekestilling av passord
%1$s,
En forespørsel om tilbakestilling av passord ble gjort på %4$s.
Klikk her for å tilbakestille passordet ditt
Du kan også kopiere følgende nettadresse til nettleserens adressefelt:
%2$s
Vennlig hilsen,
%3$s
"
diff --git a/languages/pt-BR.yaml b/languages/pt-BR.yaml
index c5ee63b..2aca491 100644
--- a/languages/pt-BR.yaml
+++ b/languages/pt-BR.yaml
@@ -17,9 +17,6 @@ PLUGIN_LOGIN:
RESET_INVALID_LINK: "Link de recuperação de senha inválido, tente novamente!"
FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "As instruções para recuperar sua senha foram enviadas para seu e-mail!"
FORGOT_FAILED_TO_EMAIL: "Falha ao tentar recuperar a senha, tente novamente mais tarde!"
- FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Não é possível recuperar a senha para %s, nenhum e-mail inserido!"
- FORGOT_CANNOT_RESET_EMAIL_NO_PASSWORD: "Não é possível recuperar a senha para %s, este e-mail já está em uso!"
- FORGOT_USERNAME_DOES_NOT_EXIST: "O usuário %s não existe!"
FORGOT_EMAIL_NOT_CONFIGURED: "Não é possível recuperar a senha. Este site não está configurado para enviar e-mails!"
FORGOT_EMAIL_SUBJECT: "%s requer recuperação da senha"
FORGOT_EMAIL_BODY: "Recuperação da Senha
Olá %1$s,
Foi feito um pedido no %4$s para recuperar sua senha.
Clique aqui para recuperar sua senha
Como alternativa, copie a seguinte URL na barra de endereços do navegador:
%2$s
Atenciosamente,
%3$s
"
diff --git a/languages/ru.yaml b/languages/ru.yaml
index 3ee8b61..528674c 100644
--- a/languages/ru.yaml
+++ b/languages/ru.yaml
@@ -19,11 +19,8 @@ PLUGIN_LOGIN:
RESET_LINK_EXPIRED: "Время ссылки для сброса истекло, повторите попытку"
RESET_PASSWORD_RESET: "Пароль был сброшен"
RESET_INVALID_LINK: "Неверная ссылка сброса, повторите попытку"
- FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Инструкции по сбросу пароля были отправлены по электронной почте"
+ FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Eсли имя пользователя существует, инструкции по сбросу пароля были отправлены по электронной почте"
FORGOT_FAILED_TO_EMAIL: "Не удалось отправить инструкции по электронной почте, повторите попытку позже"
- FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Не удается сбросить пароль для %s, адресс электронной почты не установлен"
- FORGOT_CANNOT_RESET_EMAIL_NO_PASSWORD: "Невозможно сбросить пароль для %s, этот email связан с удаленной учетной записью"
- FORGOT_USERNAME_DOES_NOT_EXIST: "Пользователь с именем %s не существует"
FORGOT_EMAIL_NOT_CONFIGURED: "Невозможно сбросить пароль. Этот сайт не настроен для отправки писем"
FORGOT_EMAIL_SUBJECT: "%s Запрос на сброс пароля"
FORGOT_EMAIL_BODY: "Восстановление пароля
Уважаемый %1$s,
Был сделан запрос для сброса пароля от %4$s.
Нажмите, чтобы сбросить пароль
Или скопируйте следующий URL-адрес в адресную строку браузера:
%2$s
С уважением,
%3$s
"
diff --git a/languages/uk.yaml b/languages/uk.yaml
index e0a0393..66be594 100644
--- a/languages/uk.yaml
+++ b/languages/uk.yaml
@@ -19,11 +19,8 @@ PLUGIN_LOGIN:
RESET_LINK_EXPIRED: "Час посилання для скидання минув, спробуйте ще раз"
RESET_PASSWORD_RESET: "Пароль був скинутий"
RESET_INVALID_LINK: "Невірне посилання скидання, спробуйте ще раз"
- FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Інструкції щодо скидання пароля були надіслані по електронній пошті"
+ FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "Якщо ім'я користувача існує, iнструкції щодо скидання пароля були надіслані по електронній пошті"
FORGOT_FAILED_TO_EMAIL: "Не вдалося надіслати інструкції електронною поштою, повторіть спробу пізніше"
- FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "Не вдається скинути пароль для %s, адреса електронної пошти не встановлена"
- FORGOT_CANNOT_RESET_EMAIL_NO_PASSWORD: "Неможливо скинути пароль для %s, цей email пов'язаний з віддаленим обліковим записом"
- FORGOT_USERNAME_DOES_NOT_EXIST: "Користувач з ім'ям %s не існує"
FORGOT_EMAIL_NOT_CONFIGURED: "Неможливо скинути пароль. Цей сайт не налаштований для надіслання листів"
FORGOT_EMAIL_SUBJECT: "%s Запит на скидання пароля"
FORGOT_EMAIL_BODY: "Відновлення паролю
Шановний %1$s,
Був зроблений запит для скидання пароля від %4$s.
Нажмите, чтобы сбросить пароль
Или скопируйте следующий URL-адрес в адресную строку браузера:
%2$s
С уважением,
%3$s
"
diff --git a/languages/zh.yaml b/languages/zh.yaml
index bfca18f..e8f2691 100644
--- a/languages/zh.yaml
+++ b/languages/zh.yaml
@@ -17,9 +17,6 @@ PLUGIN_LOGIN:
RESET_INVALID_LINK: "重置链接已经使用,请重试"
FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: "重置密码指引已经发送到您的邮箱。"
FORGOT_FAILED_TO_EMAIL: "发送指引邮件失败,请稍后重试。"
- FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: "因尚未设置邮箱,无法为 %s 重置密码"
- FORGOT_CANNOT_RESET_EMAIL_NO_PASSWORD: "因邮箱关联到一个外部帐号,无法为 %s 重置密码。"
- FORGOT_USERNAME_DOES_NOT_EXIST: "用户 %s 不存在。"
FORGOT_EMAIL_NOT_CONFIGURED: "无法重置密码,本站点尚未配置邮件系统。"
FORGOT_EMAIL_SUBJECT: "%s 的密码重置请求"
FORGOT_EMAIL_BODY: "密码充值
尊敬的 %1$s,
我们收到一个重置您的 %4$s 密码的请求。
点击这里进行重置密码
另外,您也可以复制下面的链接到浏览器地址栏中访问:
%2$s
此致
%3$s
"