diff --git a/FoodsharingSiegen.Server/Auth/AuthService.cs b/FoodsharingSiegen.Server/Auth/AuthService.cs index 1503d0d..6ff91c4 100644 --- a/FoodsharingSiegen.Server/Auth/AuthService.cs +++ b/FoodsharingSiegen.Server/Auth/AuthService.cs @@ -212,6 +212,34 @@ namespace FoodsharingSiegen.Server.Auth #region Password Recovery + public async Task InitiateInitialPasswordSetup(string email, string baseUri) + { + if (string.IsNullOrWhiteSpace(email)) return; + + var user = await Context.Users!.FirstOrDefaultAsync(x => x.Mail.ToLower() == email.ToLower()); + if (user == null) return; // Do not leak existence + + var resetToken = Guid.NewGuid().ToString("N"); + user.ResetToken = resetToken; + user.ResetTokenExpiry = DateTime.UtcNow.AddDays(7); + + await Context.SaveChangesAsync(); + + var resetLink = $"{baseUri.TrimEnd('/')}/reset-password/{resetToken}"; + var mailBody = $""" + Hallo {user.Name},
+
+ für dich wurde ein neues Konto bei {_appSettings.Terms.Title} erstellt.
+
+ Um dein Passwort festzulegen, klicke bitte auf den folgenden Link (dieser ist 7 Tage gültig):
+ {resetLink}
+
+ Viele Grüße
Dein Team {_appSettings.Terms.Title} + """; + + await _mailService.SendEmailAsync(user.Mail, "Passwort festlegen", mailBody); + } + public async Task InitiatePasswordReset(string email, string baseUri) { if (string.IsNullOrWhiteSpace(email)) return; diff --git a/FoodsharingSiegen.Server/Pages/Users.razor b/FoodsharingSiegen.Server/Pages/Users.razor index 8cf4923..1fabec4 100644 --- a/FoodsharingSiegen.Server/Pages/Users.razor +++ b/FoodsharingSiegen.Server/Pages/Users.razor @@ -56,9 +56,11 @@
- - +
+ + +
@@ -77,7 +79,7 @@ grid-template-columns: repeat(2, 1fr); } } - @@media (min-width: 1070px) { + @@media (min-width: 1250px) { .user-grid { grid-template-columns: repeat(3, 1fr); } diff --git a/FoodsharingSiegen.Server/Pages/Users.razor.cs b/FoodsharingSiegen.Server/Pages/Users.razor.cs index 80d43b3..9504d7e 100644 --- a/FoodsharingSiegen.Server/Pages/Users.razor.cs +++ b/FoodsharingSiegen.Server/Pages/Users.razor.cs @@ -22,6 +22,12 @@ namespace FoodsharingSiegen.Server.Pages [Inject] public UserService UserService { get; set; } = null!; + [Inject] + public new FoodsharingSiegen.Server.Auth.AuthService AuthService { get; set; } = null!; + + [Inject] + public new NavigationManager NavigationManager { get; set; } = null!; + #endregion #region Private Properties @@ -115,6 +121,14 @@ namespace FoodsharingSiegen.Server.Pages PasswordModal?.Show(user); } + private async Task SendPasswordSetupMail(User user) + { + await ConfirmDialog.ShowAsync(ModalService, "Bestätigen", $"Soll eine E-Mail zum Festlegen des Passworts an {user.Mail} gesendet werden?", async () => + { + await AuthService.InitiateInitialPasswordSetup(user.Mail, NavigationManager.BaseUri); + }); + } + private async Task SaveUser() { if (EditModel == null) return;