diff --git a/EnvelopeGenerator.Web/Controllers/HomeController.cs b/EnvelopeGenerator.Web/Controllers/HomeController.cs index 5a717727..48ffec29 100644 --- a/EnvelopeGenerator.Web/Controllers/HomeController.cs +++ b/EnvelopeGenerator.Web/Controllers/HomeController.cs @@ -1,27 +1,25 @@ -using EnvelopeGenerator.Web.Services; -using Microsoft.AspNetCore.Authentication.Cookies; -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Mvc; -using System.Security.Claims; -using Microsoft.AspNetCore.Authorization; +using DigitalData.Core.Abstraction.Application.DTO; using DigitalData.Core.API; -using EnvelopeGenerator.Extensions; -using Microsoft.Extensions.Localization; -using Microsoft.AspNetCore.Localization; -using EnvelopeGenerator.Web.Models; -using EnvelopeGenerator.Application.Resources; -using EnvelopeGenerator.Application.Dto.EnvelopeReceiver; -using Ganss.Xss; -using Newtonsoft.Json; -using EnvelopeGenerator.Application.Dto; using DigitalData.Core.Client; -using OtpNet; -using EnvelopeGenerator.Application.Interfaces.Services; -using static EnvelopeGenerator.Domain.Constants; -using DigitalData.Core.Abstraction.Application.DTO; -using EnvelopeGenerator.Domain.Entities; -using MediatR; +using EnvelopeGenerator.Application.Dto; +using EnvelopeGenerator.Application.Dto.EnvelopeReceiver; using EnvelopeGenerator.Application.EnvelopeReceivers.Queries; +using EnvelopeGenerator.Application.Interfaces.Services; +using EnvelopeGenerator.Application.Resources; +using EnvelopeGenerator.Extensions; +using EnvelopeGenerator.Web.Models; +using Ganss.Xss; +using MediatR; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Localization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Localization; +using Newtonsoft.Json; +using OtpNet; +using System.Security.Claims; +using static EnvelopeGenerator.Domain.Constants; namespace EnvelopeGenerator.Web.Controllers; @@ -58,17 +56,8 @@ public class HomeController : ViewControllerBase } [HttpGet("/")] - public IActionResult Main([FromQuery] string? culture = null) + public IActionResult Main() { - //TODO: add a middelware or use an asp.net functionality insead of this code-smell - culture = culture is not null ? _sanitizer.Sanitize(culture) : null; - - if (UserLanguage is null && culture is null) - { - UserLanguage = _cultures.Default.Language; - return Redirect($"{Request.Headers["Referer"]}?culture={_cultures.Default.Language}"); - } - ViewData["UserCulture"] = _cultures[UserLanguage]; return View(new MainViewModel() @@ -79,20 +68,10 @@ public class HomeController : ViewControllerBase [HttpGet("EnvelopeKey/{envelopeReceiverId}")] [Obsolete("Use MediatR")] - public async Task MainAsync([FromRoute] string envelopeReceiverId, [FromQuery] string? culture = null) + public async Task MainAsync([FromRoute] string envelopeReceiverId) { try { - //TODO: add a middelware or use an asp.net functionality insead of this code-smell - culture = culture is not null ? _sanitizer.Sanitize(culture) : null; - envelopeReceiverId = _sanitizer.Sanitize(envelopeReceiverId); - - if (UserLanguage is null && culture is null) - { - UserLanguage = _cultures.Default.Language; - return Redirect($"{Request.Headers["Referer"]}?culture={_cultures.Default.Language}"); - } - envelopeReceiverId = _sanitizer.Sanitize(envelopeReceiverId); if (!envelopeReceiverId.TryDecode(out var decoded)) @@ -560,7 +539,17 @@ public class HomeController : ViewControllerBase if (!_cultures.Languages.Contains(language)) return BadRequest(); - UserLanguage = language; + var cookieOptions = new CookieOptions() + { + Secure = false, + SameSite = SameSiteMode.Strict, + HttpOnly = true + }; + + Response.Cookies.Append( + CookieRequestCultureProvider.DefaultCookieName, + CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(language)), + cookieOptions); return Redirect(Request.Headers["Referer"].ToString()); } @@ -574,39 +563,7 @@ public class HomeController : ViewControllerBase [HttpGet("lang")] public IActionResult GetLanguages() => Ok(_cultures.Languages); - private string? UserLanguage - { - get - { - var cookieValue = Request.Cookies[CookieRequestCultureProvider.DefaultCookieName]; - - if (string.IsNullOrEmpty(cookieValue)) - return null; - - var culture = CookieRequestCultureProvider.ParseCookieValue(cookieValue)?.Cultures[0]; - return culture?.Value ?? null; - } - set - { - if(value is null) - Response.Cookies.Delete(CookieRequestCultureProvider.DefaultCookieName); - else - { - var cookieOptions = new CookieOptions() - { - Expires = DateTimeOffset.UtcNow.AddYears(1), - Secure = false, - SameSite = SameSiteMode.Strict, - HttpOnly = true - }; - - Response.Cookies.Append( - CookieRequestCultureProvider.DefaultCookieName, - CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(value)), - cookieOptions); - } - } - } + private string? UserLanguage => Request.Cookies[CookieRequestCultureProvider.DefaultCookieName]; public IActionResult Error404() => this.ViewError404(); } \ No newline at end of file diff --git a/EnvelopeGenerator.Web/Controllers/LocalizationController.cs b/EnvelopeGenerator.Web/Controllers/LocalizationController.cs index ef594112..3aaf5ec7 100644 --- a/EnvelopeGenerator.Web/Controllers/LocalizationController.cs +++ b/EnvelopeGenerator.Web/Controllers/LocalizationController.cs @@ -1,5 +1,4 @@ using EnvelopeGenerator.Application.Resources; -using Ganss.Xss; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Localization; @@ -10,14 +9,10 @@ namespace EnvelopeGenerator.Web.Controllers public class LocalizationController : ControllerBase { private readonly IStringLocalizer _localizer; - private readonly ILogger _logger; - private readonly HtmlSanitizer _sanitizer; - public LocalizationController(IStringLocalizer localizer, ILogger logger, HtmlSanitizer sanitizer) + public LocalizationController(IStringLocalizer localizer) { _localizer = localizer; - _logger = logger; - _sanitizer = sanitizer; } [HttpGet] diff --git a/EnvelopeGenerator.Web/Middleware/CultureMiddleware.cs b/EnvelopeGenerator.Web/Middleware/CultureMiddleware.cs new file mode 100644 index 00000000..170fa44d --- /dev/null +++ b/EnvelopeGenerator.Web/Middleware/CultureMiddleware.cs @@ -0,0 +1,46 @@ +using EnvelopeGenerator.Web.Models; +using Microsoft.AspNetCore.Localization; +using Microsoft.Extensions.Options; +using System.Globalization; + +namespace EnvelopeGenerator.Web.Middleware; + +public class CultureMiddleware +{ + private readonly RequestDelegate _next; + private readonly Cultures _cultures; + + public CultureMiddleware(RequestDelegate next, IOptions culturesOpt) + { + _next = next; + _cultures = culturesOpt.Value; + } + + public async Task InvokeAsync(HttpContext context) + { + var cookieName = CookieRequestCultureProvider.DefaultCookieName; + var cookieValue = context.Request.Cookies[cookieName]; + + if (string.IsNullOrEmpty(cookieValue)) + { + var culture = new RequestCulture(_cultures.Default.Language); + + var cookieOptions = new CookieOptions + { + Secure = false, + SameSite = SameSiteMode.Strict, + HttpOnly = true + }; + + context.Response.Cookies.Append( + cookieName, + CookieRequestCultureProvider.MakeCookieValue(culture), + cookieOptions); + + CultureInfo.CurrentCulture = new CultureInfo(_cultures.Default.Language); + CultureInfo.CurrentUICulture = new CultureInfo(_cultures.Default.Language); + } + + await _next(context); + } +} diff --git a/EnvelopeGenerator.Web/Program.cs b/EnvelopeGenerator.Web/Program.cs index 365d6eff..6ee88eb6 100644 --- a/EnvelopeGenerator.Web/Program.cs +++ b/EnvelopeGenerator.Web/Program.cs @@ -201,6 +201,7 @@ try var app = builder.Build(); app.UseMiddleware(); + app.UseMiddleware(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment())