From 14d73851eaa23cbe9eb2adfa5e2e56ab8a603e6a Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Sat, 24 Feb 2024 15:37:39 +0000 Subject: [PATCH] refactor: delegate cookie writing to SessionService --- OliverBooth/Controllers/AdminController.cs | 4 +--- OliverBooth/Services/ISessionService.cs | 12 ++++++++++++ OliverBooth/Services/SessionService.cs | 14 ++++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/OliverBooth/Controllers/AdminController.cs b/OliverBooth/Controllers/AdminController.cs index 3040604..5fb65dd 100644 --- a/OliverBooth/Controllers/AdminController.cs +++ b/OliverBooth/Controllers/AdminController.cs @@ -60,9 +60,7 @@ public sealed class AdminController : ControllerBase } ISession session = _sessionService.CreateSession(Request, user); - Span sessionBytes = stackalloc byte[16]; - session.Id.TryWriteBytes(sessionBytes); - Response.Cookies.Append("sid", Convert.ToBase64String(sessionBytes)); + _sessionService.SaveSessionCookie(Response, session); return RedirectToPage("/admin/index"); } diff --git a/OliverBooth/Services/ISessionService.cs b/OliverBooth/Services/ISessionService.cs index becaf5a..e40d56d 100644 --- a/OliverBooth/Services/ISessionService.cs +++ b/OliverBooth/Services/ISessionService.cs @@ -27,6 +27,18 @@ public interface ISessionService /// is . void DeleteSession(ISession session); + /// + /// Saves a session cookie to the client's browser. + /// + /// The response to edit. + /// The session to write. + /// + /// is . + /// -or- + /// is . + /// + void SaveSessionCookie(HttpResponse response, ISession session); + /// /// Attempts to find a session with the specified ID. /// diff --git a/OliverBooth/Services/SessionService.cs b/OliverBooth/Services/SessionService.cs index e33b9aa..bd19a9d 100644 --- a/OliverBooth/Services/SessionService.cs +++ b/OliverBooth/Services/SessionService.cs @@ -63,6 +63,20 @@ internal sealed class SessionService : ISessionService context.SaveChanges(); } + /// + public void SaveSessionCookie(HttpResponse response, ISession session) + { + if (response is null) throw new ArgumentNullException(nameof(response)); + if (session is null) throw new ArgumentNullException(nameof(session)); + + Span buffer = stackalloc byte[16]; + if (!session.Id.TryWriteBytes(buffer)) return; + + IPAddress? remoteIpAddress = response.HttpContext.Connection.RemoteIpAddress; + _logger.LogDebug("Writing cookie 'sid' to HTTP response for {RemoteAddr}", remoteIpAddress); + response.Cookies.Append("sid", Convert.ToBase64String(buffer)); + } + /// public bool TryGetSession(Guid sessionId, [NotNullWhen(true)] out ISession? session) {