From 51b96e2a8129e01d4f4487a7f8322aeedf1d8cd9 Mon Sep 17 00:00:00 2001 From: TekH Date: Sat, 23 Aug 2025 00:57:55 +0200 Subject: [PATCH] move extension extensions dir --- .../Controllers/ControllerBaseExtensions.cs | 119 ------------------ .../Controllers/EnvelopeController.cs | 1 + .../Controllers/HomeController.cs | 1 + .../Controllers/ReadOnlyController.cs | 1 + .../Controllers/TFARegController.cs | 1 + .../{ => Extensions}/StringExtensions.cs | 2 +- .../Extensions/WebExtensions.cs | 118 +++++++++++++++++ .../Middleware/CultureMiddleware.cs | 2 +- .../Views/Home/EnvelopeLocked.cshtml | 1 + .../Views/Home/EnvelopeRejected.cshtml | 1 + .../Views/Home/ShowEnvelope.cshtml | 1 + 11 files changed, 127 insertions(+), 121 deletions(-) delete mode 100644 EnvelopeGenerator.Web/Controllers/ControllerBaseExtensions.cs rename EnvelopeGenerator.Web/{ => Extensions}/StringExtensions.cs (75%) create mode 100644 EnvelopeGenerator.Web/Extensions/WebExtensions.cs diff --git a/EnvelopeGenerator.Web/Controllers/ControllerBaseExtensions.cs b/EnvelopeGenerator.Web/Controllers/ControllerBaseExtensions.cs deleted file mode 100644 index 0a18c0e0..00000000 --- a/EnvelopeGenerator.Web/Controllers/ControllerBaseExtensions.cs +++ /dev/null @@ -1,119 +0,0 @@ -using EnvelopeGenerator.Application.Dto.EnvelopeReceiver; -using EnvelopeGenerator.Web.Models; -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Authentication.Cookies; -using Microsoft.AspNetCore.Localization; -using Microsoft.AspNetCore.Mvc; -using System.Security.Claims; - -namespace EnvelopeGenerator.Web.Controllers -{ - public static class ControllerBaseExtensions - { - #region Auth - public static string? GetClaimValue(this ClaimsPrincipal user, string claimType) => user.FindFirstValue(claimType); - - public static string? GetAuthEnvelopeUuid(this ClaimsPrincipal user) => user.FindFirstValue(ClaimTypes.NameIdentifier); - - public static string? GetAuthReceiverSignature(this ClaimsPrincipal user) => user.FindFirstValue(ClaimTypes.Hash); - - public static string? GetAuthReceiverName(this ClaimsPrincipal user) => user.FindFirstValue(ClaimTypes.Name); - - public static string? GetAuthReceiverMail(this ClaimsPrincipal user) => user.FindFirstValue(ClaimTypes.Email); - - public static string? GetAuthEnvelopeTitle(this ClaimsPrincipal user) => user.FindFirstValue(EnvelopeClaimTypes.Title); - - public static int? GetAuthEnvelopeId(this ClaimsPrincipal user) - { - var env_id_str = user.FindFirstValue(EnvelopeClaimTypes.Id); - return int.TryParse(env_id_str, out int env_id) ? env_id : null; - } - - public static async Task SignInEnvelopeAsync(this HttpContext context, EnvelopeReceiverDto er, string receiverRole) - { - var claims = new List { - new(ClaimTypes.NameIdentifier, er.Envelope!.Uuid), - new(ClaimTypes.Hash, er.Receiver!.Signature), - new(ClaimTypes.Name, er.Name ?? string.Empty), - new(ClaimTypes.Email, er.Receiver.EmailAddress), - new(EnvelopeClaimTypes.Title, er.Envelope.Title), - new(EnvelopeClaimTypes.Id, er.Envelope.Id.ToString()), - new(ClaimTypes.Role, receiverRole) - }; - - var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); - - var authProperties = new AuthenticationProperties - { - AllowRefresh = false, - IsPersistent = false - }; - - await context.SignInAsync( - CookieAuthenticationDefaults.AuthenticationScheme, - new ClaimsPrincipal(claimsIdentity), - authProperties); - } - #endregion - - #region Cookie - public static string? GetCulture(this IRequestCookieCollection cookies) - => cookies[CookieRequestCultureProvider.DefaultCookieName]; - - public static void SetCulture(this IResponseCookies cookies, string culture) - { - var cookieOptions = new CookieOptions - { - Secure = false, - SameSite = SameSiteMode.Strict, - HttpOnly = true - }; - cookies.Append( - CookieRequestCultureProvider.DefaultCookieName, - CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)), - cookieOptions); - } - #endregion - - #region View error - //TODO: integrate localizer for ready-to-use views - //TODO: integrate to global exception handler middleware - public static ViewResult ViewError(this Controller controller, ErrorViewModel errorViewModel) => controller.View("_Error", errorViewModel); - - public static ViewResult ViewError404(this Controller controller) => controller.ViewError(new() - { - Title = "404", - Subtitle = "Die von Ihnen gesuchte Seite ist nicht verfügbar", - Body = "Sie können derzeit nur an Sie gerichtete Briefe einsehen und unterschreiben.", - }); - - public static ViewResult ViewEnvelopeNotFound(this Controller controller) => controller.ViewError(new() - { - Title = "404", - Subtitle = "Document not found", - Body = "Wenn Sie diese URL in Ihrer E-Mail erhalten haben, wenden Sie sich bitte an das IT-Team." - }); - - public static ViewResult ViewDocumentNotFound(this Controller controller) => controller.ViewError(new() - { - Title = "404", - Subtitle = "Umschlag nicht gefunden", - Body = "Wenn Sie diese URL in Ihrer E-Mail erhalten haben, wenden Sie sich bitte an das IT-Team." - }); - - public static ViewResult ViewAccessCodeNotSent(this Controller controller) => controller.ViewError(new() - { - Title = "500", - Subtitle = "Der Zugangscode konnte nicht gesendet werden", - Body = "Bitte kontaktieren Sie das IT-Team." - }); - - public static ViewResult ViewInnerServiceError(this Controller controller) => controller.ViewError(new() - { - Title = "500", - Subtitle = "Ein unerwarteter Fehler ist aufgetreten", - Body = "Bitte kontaktieren Sie das IT-Team." - }); - #endregion - } -} \ No newline at end of file diff --git a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs index e2517785..23328fa7 100644 --- a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs @@ -9,6 +9,7 @@ using static EnvelopeGenerator.Domain.Constants; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain; using DigitalData.Core.Abstraction.Application.DTO; +using EnvelopeGenerator.Web.Extensions; namespace EnvelopeGenerator.Web.Controllers; diff --git a/EnvelopeGenerator.Web/Controllers/HomeController.cs b/EnvelopeGenerator.Web/Controllers/HomeController.cs index eb0e1d1b..8eeb9528 100644 --- a/EnvelopeGenerator.Web/Controllers/HomeController.cs +++ b/EnvelopeGenerator.Web/Controllers/HomeController.cs @@ -7,6 +7,7 @@ using EnvelopeGenerator.Application.EnvelopeReceivers.Queries; using EnvelopeGenerator.Application.Interfaces.Services; using EnvelopeGenerator.Application.Resources; using EnvelopeGenerator.Extensions; +using EnvelopeGenerator.Web.Extensions; using EnvelopeGenerator.Web.Models; using Ganss.Xss; using MediatR; diff --git a/EnvelopeGenerator.Web/Controllers/ReadOnlyController.cs b/EnvelopeGenerator.Web/Controllers/ReadOnlyController.cs index 55b39243..ccd17b3a 100644 --- a/EnvelopeGenerator.Web/Controllers/ReadOnlyController.cs +++ b/EnvelopeGenerator.Web/Controllers/ReadOnlyController.cs @@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using static EnvelopeGenerator.Domain.Constants; +using EnvelopeGenerator.Web.Extensions; namespace EnvelopeGenerator.Web.Controllers { diff --git a/EnvelopeGenerator.Web/Controllers/TFARegController.cs b/EnvelopeGenerator.Web/Controllers/TFARegController.cs index 9f1f17ce..fb470df9 100644 --- a/EnvelopeGenerator.Web/Controllers/TFARegController.cs +++ b/EnvelopeGenerator.Web/Controllers/TFARegController.cs @@ -12,6 +12,7 @@ using Microsoft.AspNetCore.Authentication; using EnvelopeGenerator.Application.Interfaces.Services; using DigitalData.Core.Abstraction.Application.DTO; using static EnvelopeGenerator.Domain.Constants; +using EnvelopeGenerator.Web.Extensions; namespace EnvelopeGenerator.Web.Controllers; diff --git a/EnvelopeGenerator.Web/StringExtensions.cs b/EnvelopeGenerator.Web/Extensions/StringExtensions.cs similarity index 75% rename from EnvelopeGenerator.Web/StringExtensions.cs rename to EnvelopeGenerator.Web/Extensions/StringExtensions.cs index a455a8ce..685cf028 100644 --- a/EnvelopeGenerator.Web/StringExtensions.cs +++ b/EnvelopeGenerator.Web/Extensions/StringExtensions.cs @@ -1,4 +1,4 @@ -namespace EnvelopeGenerator.Web; +namespace EnvelopeGenerator.Web.Extensions; public static class StringExtensions { diff --git a/EnvelopeGenerator.Web/Extensions/WebExtensions.cs b/EnvelopeGenerator.Web/Extensions/WebExtensions.cs new file mode 100644 index 00000000..d8a89f3b --- /dev/null +++ b/EnvelopeGenerator.Web/Extensions/WebExtensions.cs @@ -0,0 +1,118 @@ +using EnvelopeGenerator.Application.Dto.EnvelopeReceiver; +using EnvelopeGenerator.Web.Models; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.AspNetCore.Localization; +using Microsoft.AspNetCore.Mvc; +using System.Security.Claims; + +namespace EnvelopeGenerator.Web.Extensions; + +public static class WebExtensions +{ + #region Auth + public static string? GetClaimValue(this ClaimsPrincipal user, string claimType) => user.FindFirstValue(claimType); + + public static string? GetAuthEnvelopeUuid(this ClaimsPrincipal user) => user.FindFirstValue(ClaimTypes.NameIdentifier); + + public static string? GetAuthReceiverSignature(this ClaimsPrincipal user) => user.FindFirstValue(ClaimTypes.Hash); + + public static string? GetAuthReceiverName(this ClaimsPrincipal user) => user.FindFirstValue(ClaimTypes.Name); + + public static string? GetAuthReceiverMail(this ClaimsPrincipal user) => user.FindFirstValue(ClaimTypes.Email); + + public static string? GetAuthEnvelopeTitle(this ClaimsPrincipal user) => user.FindFirstValue(EnvelopeClaimTypes.Title); + + public static int? GetAuthEnvelopeId(this ClaimsPrincipal user) + { + var env_id_str = user.FindFirstValue(EnvelopeClaimTypes.Id); + return int.TryParse(env_id_str, out int env_id) ? env_id : null; + } + + public static async Task SignInEnvelopeAsync(this HttpContext context, EnvelopeReceiverDto er, string receiverRole) + { + var claims = new List { + new(ClaimTypes.NameIdentifier, er.Envelope!.Uuid), + new(ClaimTypes.Hash, er.Receiver!.Signature), + new(ClaimTypes.Name, er.Name ?? string.Empty), + new(ClaimTypes.Email, er.Receiver.EmailAddress), + new(EnvelopeClaimTypes.Title, er.Envelope.Title), + new(EnvelopeClaimTypes.Id, er.Envelope.Id.ToString()), + new(ClaimTypes.Role, receiverRole) + }; + + var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); + + var authProperties = new AuthenticationProperties + { + AllowRefresh = false, + IsPersistent = false + }; + + await context.SignInAsync( + CookieAuthenticationDefaults.AuthenticationScheme, + new ClaimsPrincipal(claimsIdentity), + authProperties); + } + #endregion + + #region Cookie + public static string? GetCulture(this IRequestCookieCollection cookies) + => cookies[CookieRequestCultureProvider.DefaultCookieName]; + + public static void SetCulture(this IResponseCookies cookies, string culture) + { + var cookieOptions = new CookieOptions + { + Secure = false, + SameSite = SameSiteMode.Strict, + HttpOnly = true + }; + cookies.Append( + CookieRequestCultureProvider.DefaultCookieName, + CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)), + cookieOptions); + } + #endregion + + #region View error + //TODO: integrate localizer for ready-to-use views + //TODO: integrate to global exception handler middleware + public static ViewResult ViewError(this Controller controller, ErrorViewModel errorViewModel) => controller.View("_Error", errorViewModel); + + public static ViewResult ViewError404(this Controller controller) => controller.ViewError(new() + { + Title = "404", + Subtitle = "Die von Ihnen gesuchte Seite ist nicht verfügbar", + Body = "Sie können derzeit nur an Sie gerichtete Briefe einsehen und unterschreiben.", + }); + + public static ViewResult ViewEnvelopeNotFound(this Controller controller) => controller.ViewError(new() + { + Title = "404", + Subtitle = "Document not found", + Body = "Wenn Sie diese URL in Ihrer E-Mail erhalten haben, wenden Sie sich bitte an das IT-Team." + }); + + public static ViewResult ViewDocumentNotFound(this Controller controller) => controller.ViewError(new() + { + Title = "404", + Subtitle = "Umschlag nicht gefunden", + Body = "Wenn Sie diese URL in Ihrer E-Mail erhalten haben, wenden Sie sich bitte an das IT-Team." + }); + + public static ViewResult ViewAccessCodeNotSent(this Controller controller) => controller.ViewError(new() + { + Title = "500", + Subtitle = "Der Zugangscode konnte nicht gesendet werden", + Body = "Bitte kontaktieren Sie das IT-Team." + }); + + public static ViewResult ViewInnerServiceError(this Controller controller) => controller.ViewError(new() + { + Title = "500", + Subtitle = "Ein unerwarteter Fehler ist aufgetreten", + Body = "Bitte kontaktieren Sie das IT-Team." + }); + #endregion +} \ No newline at end of file diff --git a/EnvelopeGenerator.Web/Middleware/CultureMiddleware.cs b/EnvelopeGenerator.Web/Middleware/CultureMiddleware.cs index 51243878..c13e8a10 100644 --- a/EnvelopeGenerator.Web/Middleware/CultureMiddleware.cs +++ b/EnvelopeGenerator.Web/Middleware/CultureMiddleware.cs @@ -1,4 +1,4 @@ -using EnvelopeGenerator.Web.Controllers; +using EnvelopeGenerator.Web.Extensions; using EnvelopeGenerator.Web.Models; using Microsoft.AspNetCore.Localization; using Microsoft.Extensions.Options; diff --git a/EnvelopeGenerator.Web/Views/Home/EnvelopeLocked.cshtml b/EnvelopeGenerator.Web/Views/Home/EnvelopeLocked.cshtml index eb60e695..32ed7f40 100644 --- a/EnvelopeGenerator.Web/Views/Home/EnvelopeLocked.cshtml +++ b/EnvelopeGenerator.Web/Views/Home/EnvelopeLocked.cshtml @@ -1,5 +1,6 @@ @using EnvelopeGenerator.Application.Dto.EnvelopeReceiver; @using Newtonsoft.Json +@using EnvelopeGenerator.Web.Extensions; @model Auth; @{ //TODO: Create view model diff --git a/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml b/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml index 14771668..16fbe705 100644 --- a/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml +++ b/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml @@ -6,6 +6,7 @@ } @using DigitalData.Core.Abstraction.Application.DTO; @using EnvelopeGenerator.Application.Dto.EnvelopeReceiver +@using EnvelopeGenerator.Web.Extensions @using Newtonsoft.Json @using Newtonsoft.Json.Serialization @model EnvelopeReceiverDto; diff --git a/EnvelopeGenerator.Web/Views/Home/ShowEnvelope.cshtml b/EnvelopeGenerator.Web/Views/Home/ShowEnvelope.cshtml index 65360370..dac1d38d 100644 --- a/EnvelopeGenerator.Web/Views/Home/ShowEnvelope.cshtml +++ b/EnvelopeGenerator.Web/Views/Home/ShowEnvelope.cshtml @@ -6,6 +6,7 @@ @using EnvelopeGenerator.Application.Dto; @using EnvelopeGenerator.Application.Dto.EnvelopeReceiver @using EnvelopeGenerator.Application.Dto.EnvelopeReceiverReadOnly +@using EnvelopeGenerator.Web.Extensions @using Newtonsoft.Json @using Newtonsoft.Json.Serialization @model EnvelopeReceiverDto;