From 083471afd05e3069b7b9f4a18d8477b29b897f97 Mon Sep 17 00:00:00 2001 From: daniel-hbn Date: Fri, 20 Jun 2025 21:58:36 +0200 Subject: [PATCH 1/2] email settings started --- Watcher/Controllers/AuthController.cs | 17 +++++++++++++++-- Watcher/Program.cs | 2 +- Watcher/Views/Auth/Info.cshtml | 3 ++- Watcher/Views/Auth/UserSettings.cshtml | 9 +++++++++ Watcher/persistence/watcher.db-shm | Bin 0 -> 32768 bytes Watcher/persistence/watcher.db-wal | Bin 0 -> 271952 bytes 6 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 Watcher/persistence/watcher.db-shm create mode 100644 Watcher/persistence/watcher.db-wal diff --git a/Watcher/Controllers/AuthController.cs b/Watcher/Controllers/AuthController.cs index bd15c18..98775d5 100644 --- a/Watcher/Controllers/AuthController.cs +++ b/Watcher/Controllers/AuthController.cs @@ -1,3 +1,4 @@ +using System.Net.Mail; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; @@ -85,10 +86,18 @@ public class AuthController : Controller [Authorize] public IActionResult Info() { - var name = User.Identity?.Name; + var username = User.Identity?.Name; + Console.WriteLine("gefundener User: " + username); var claims = User.Claims.Select(c => new { c.Type, c.Value }).ToList(); - ViewBag.Name = name; + var user = _context.Users.FirstOrDefault(u => u.PreferredUsername == username); + Console.WriteLine(user.Email); + if (user == null) return NotFound(); + + var DbProvider = _context.Database.ProviderName; + var mail = user.Email; + + ViewBag.Name = username; ViewBag.Claims = claims; return View(); @@ -142,14 +151,18 @@ public class AuthController : Controller public IActionResult UserSettings() { var username = User.Identity?.Name; + Console.WriteLine("gefundener User: " + username); var claims = User.Claims.Select(c => new { c.Type, c.Value }).ToList(); var user = _context.Users.FirstOrDefault(u => u.PreferredUsername == username); + Console.WriteLine(user.Email); if (user == null) return NotFound(); var DbProvider = _context.Database.ProviderName; + var mail = user.Email; ViewBag.Name = username; + ViewBag.mail = mail; ViewBag.Claims = claims; ViewBag.IdentityProvider = user.IdentityProvider; ViewBag.DbProvider = DbProvider; diff --git a/Watcher/Program.cs b/Watcher/Program.cs index 4765b87..9e13e85 100644 --- a/Watcher/Program.cs +++ b/Watcher/Program.cs @@ -153,7 +153,7 @@ using (var scope = app.Services.CreateScope()) { PocketId = string.Empty, PreferredUsername = "admin", - Email = string.Empty, + Email = "admin@changeme.com", LastLogin = DateTime.UtcNow, IdentityProvider = "local", Password = BCrypt.Net.BCrypt.HashPassword("changeme") diff --git a/Watcher/Views/Auth/Info.cshtml b/Watcher/Views/Auth/Info.cshtml index 4e73972..62a8ef8 100644 --- a/Watcher/Views/Auth/Info.cshtml +++ b/Watcher/Views/Auth/Info.cshtml @@ -3,6 +3,7 @@ var pictureUrl = User.Claims.FirstOrDefault(c => c.Type == "picture")?.Value ?? ""; var preferredUsername = User.Claims.FirstOrDefault(c => c.Type == "preferred_username")?.Value ?? "admin"; var isAdmin = preferredUsername == "admin"; + var preferred_username = ViewBag.name; }
@@ -20,7 +21,7 @@
}

- @(User.FindFirst("name")?.Value ?? "Unbekannter Nutzer") + @(User.FindFirst("PreferredUsername")?.Value ?? "Unbekannter Nutzer")

diff --git a/Watcher/Views/Auth/UserSettings.cshtml b/Watcher/Views/Auth/UserSettings.cshtml index f1e5aca..49c029f 100644 --- a/Watcher/Views/Auth/UserSettings.cshtml +++ b/Watcher/Views/Auth/UserSettings.cshtml @@ -86,6 +86,15 @@
Anzeigeeinstellungen:
+
+ +
Benachrichtigungen:
+

Registrierte E-Mail Adresse: @(ViewBag.mail ?? "nicht gefunden")

+ +
+ +
...:
+ diff --git a/Watcher/persistence/watcher.db-shm b/Watcher/persistence/watcher.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..ff6b4b042dab2245cb3ae4aa9bd39dab462ab57c GIT binary patch literal 32768 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 Date: Sat, 21 Jun 2025 15:49:23 +0200 Subject: [PATCH 2/2] user info page updated --- Watcher/Controllers/AuthController.cs | 6 ++++-- Watcher/Views/Auth/Info.cshtml | 4 ++-- Watcher/persistence/watcher.db-shm | Bin 32768 -> 32768 bytes Watcher/persistence/watcher.db-wal | Bin 271952 -> 362592 bytes 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Watcher/Controllers/AuthController.cs b/Watcher/Controllers/AuthController.cs index 539ee83..861890b 100644 --- a/Watcher/Controllers/AuthController.cs +++ b/Watcher/Controllers/AuthController.cs @@ -90,15 +90,17 @@ public class AuthController : Controller Console.WriteLine("gefundener User: " + username); var claims = User.Claims.Select(c => new { c.Type, c.Value }).ToList(); - var user = _context.Users.FirstOrDefault(u => u.PreferredUsername == username); - Console.WriteLine(user.Email); + var user = _context.Users.FirstOrDefault(u => u.Username == username); if (user == null) return NotFound(); var DbProvider = _context.Database.ProviderName; var mail = user.Email; + var Id = user.Id; ViewBag.Name = username; ViewBag.Claims = claims; + ViewBag.Mail = mail; + ViewBag.Id = Id; return View(); } diff --git a/Watcher/Views/Auth/Info.cshtml b/Watcher/Views/Auth/Info.cshtml index 62a8ef8..7be6c50 100644 --- a/Watcher/Views/Auth/Info.cshtml +++ b/Watcher/Views/Auth/Info.cshtml @@ -34,11 +34,11 @@ E-Mail - @(User.FindFirst("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress")?.Value ?? "Nicht verfügbar") + @(ViewBag.Mail ?? "Nicht verfügbar") Benutzer-ID - @(User.FindFirst("sub")?.Value ?? "Nicht verfügbar") + @(ViewBag.Id ?? "Nicht verfügbar") Login-Zeit diff --git a/Watcher/persistence/watcher.db-shm b/Watcher/persistence/watcher.db-shm index ff6b4b042dab2245cb3ae4aa9bd39dab462ab57c..46e850e22bcc613194cc7bdca09ab38ff3a16082 100644 GIT binary patch delta 333 zcmZo@U}|V!s+V}A%K!rGK+MR%AP@nhm4G-n=GD`P*SGi;l6X(W$hK@g&wo`roavDU zsp^47fdR&bY<`X zGA=T*GBJ2E_yd{WStlQftYZyh2xo|xJdtrZvm1jiSOsGMkWyu5bO%y@nHW8Ql%ym8 D{!C2- delta 175 zcmZo@U}|V!s+V}A%K!q7K+MR%Am9X~m4LWHdF@Y)l>UPXNxY|GWLq}pO7gQ-_)b1f zs(PSNU;r}zKN5fnGcho1Y~*L${DM);aTAjoH!~vx^X89?KUo=>fYfi+$wwmVHh*H= GrwRbCv@})# diff --git a/Watcher/persistence/watcher.db-wal b/Watcher/persistence/watcher.db-wal index 2471191ae3e5e707249ae5fed46f91ba514da228..071dd5aaa682997b1280ca569d1548742ba900b8 100644 GIT binary patch literal 362592 zcmeI*4|p5(o#%1MivK2#Qg(w90*PY6#xB^*NHe36uiRoBCvoH0iT~tJfvU1K3BtDI zSaQJ2U3Z;^4TUS^c0=hO`e)gvefr!L9k2M;A@4jev_O7u+i8MDf?cu|*%ds{v)_}aPmcFtck^~F~I4?T_k2R!}<{IB?5 z@IUMSoc}TZgNq3mg8%{uAb_B0vCVp(H)Cf1uyW#h?|F`E%f zkqV>xr{l*Bb5yg}7x0c{#Pqt>M&I_P;{44GzRgX!`PS9@wlxi;kN2H4QrS$)8sCFHJfWBV#yFCeI=YRJ7+tgDa58afU6oWh8tRfY zy-SXWyQ(|q6kj(GGe^6$sG^5ed2DM9rb(7GS)dF$j@H@SeLRTxA7 z0R#|0009ILKmY**5I~?d0@cX{qTP~Y~lzP<_YoFdgF5qYt1`$920R#|0 z009ILKmY**5U7nn)pCK5l?$j^I26_0_wFPYaI^}82q1s}0tg_000IagfB*sr)JC9cxqxov0wEitp00IagfB*srAbpRH>9Ie720tg_000IagfB*srAbLdCR>!AKOeWP@4v4 zEeIfh00IagfB*srAb`(dIWF#FZbVb_ubj^4$^}A_l?y~7 zVO4U~@8EL>B9DIan))lq1!~jatOWrC5I_I{1Q0*~0R#|000D?i-cX} z0@2T(JvjNhXPzS$aI^}82q1s}0tg_000IagfB*sr)JC9cxj?8pBy~xW6p1RDo9_|q zyxlVyyMK2-xj=0ioV6f;00IagfB*srAbN2WXDtXIfB*srAbz7`>`L-iZlM6Un zg+T-mKmY**5I_I{1Q0*~0R(CzP_R{ z5I_I{1Q0*~0R#|0009IX0#(ZeB33S-g>+euy18E9@;8RgJbKrLpOOnWT7^Lb5I_I{ z1Q0*~0R#|0009JQBT%(mK+oj@dQ^4S?_lWAr@k`qtuNj}E>N2WXDtXIfB*srAbGz2q1s}0tg_000Iag zfB*uu5vW!!5SFZ5AR1O8vgRrmNSylFcfb0X7s&-`)8MQH0R#|0009ILKmY**5I_I{ zhd|YG0olw2WJysXA;nEDaOV6!{r0`1FMo+#z|krUB7gt_2q1s}0tg_000IagP#b}& z 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