From ef76332fdb9702797d468d925456eb38c2bab210 Mon Sep 17 00:00:00 2001 From: jvyden Date: Sat, 20 Nov 2021 01:50:18 -0500 Subject: [PATCH] Add logout page --- ProjectLighthouse/Database.cs | 22 ++++++++++++++++ .../Pages/ExternalAuth/LandingPage.cshtml | 7 ++++- .../Pages/ExternalAuth/LandingPage.cshtml.cs | 15 ++++++++++- .../Pages/ExternalAuth/LoginForm.cshtml.cs | 14 ++++------ .../Pages/ExternalAuth/LogoutPage.cshtml | 9 +++++++ .../Pages/ExternalAuth/LogoutPage.cshtml.cs | 26 +++++++++++++++++++ .../Pages/ExternalAuth/RegisterForm.cshtml.cs | 12 +++------ .../Pages/Layouts/BaseLayout.cshtml | 14 ++++++++++ .../Pages/Layouts/BaseLayout.cshtml.cs | 13 ++++++++-- 9 files changed, 111 insertions(+), 21 deletions(-) create mode 100644 ProjectLighthouse/Pages/ExternalAuth/LogoutPage.cshtml create mode 100644 ProjectLighthouse/Pages/ExternalAuth/LogoutPage.cshtml.cs diff --git a/ProjectLighthouse/Database.cs b/ProjectLighthouse/Database.cs index 58f4a190..5f9df956 100644 --- a/ProjectLighthouse/Database.cs +++ b/ProjectLighthouse/Database.cs @@ -130,6 +130,28 @@ namespace LBPUnion.ProjectLighthouse #region Web Token Shenanigans + public async Task UserFromLighthouseToken(string lighthouseToken) + { + WebToken? token = await this.WebTokens.FirstOrDefaultAsync(t => t.UserToken == lighthouseToken); + if (token == null) return null; + + return await this.Users.Include(u => u.Location).FirstOrDefaultAsync(u => u.UserId == token.UserId); + } + + public async Task UserFromWebRequest(HttpRequest request) + { + if (!request.Cookies.TryGetValue("LighthouseToken", out string? lighthouseToken) || lighthouseToken == null) return null; + + return await this.UserFromLighthouseToken(lighthouseToken); + } + + public async Task WebTokenFromRequest(HttpRequest request) + { + if (!request.Cookies.TryGetValue("LighthouseToken", out string? lighthouseToken) || lighthouseToken == null) return null; + + return await this.WebTokens.FirstOrDefaultAsync(t => t.UserToken == lighthouseToken); + } + #endregion public async Task PhotoFromSubject(PhotoSubject subject) diff --git a/ProjectLighthouse/Pages/ExternalAuth/LandingPage.cshtml b/ProjectLighthouse/Pages/ExternalAuth/LandingPage.cshtml index 72a62f47..81716c29 100644 --- a/ProjectLighthouse/Pages/ExternalAuth/LandingPage.cshtml +++ b/ProjectLighthouse/Pages/ExternalAuth/LandingPage.cshtml @@ -4,4 +4,9 @@ @{ Layout = "Layouts/BaseLayout"; } -

Welcome to Project Lighthouse.

\ No newline at end of file +

Welcome to Project Lighthouse!

+ +@if (Model.User != null) +{ +

You are currently logged in as @Model.User.Username.

+} \ No newline at end of file diff --git a/ProjectLighthouse/Pages/ExternalAuth/LandingPage.cshtml.cs b/ProjectLighthouse/Pages/ExternalAuth/LandingPage.cshtml.cs index 1afeec59..898e97c4 100644 --- a/ProjectLighthouse/Pages/ExternalAuth/LandingPage.cshtml.cs +++ b/ProjectLighthouse/Pages/ExternalAuth/LandingPage.cshtml.cs @@ -1,12 +1,25 @@ +#nullable enable +using System.Threading.Tasks; using JetBrains.Annotations; using LBPUnion.ProjectLighthouse.Pages.Layouts; +using LBPUnion.ProjectLighthouse.Types; using Microsoft.AspNetCore.Mvc; namespace LBPUnion.ProjectLighthouse.Pages.ExternalAuth { public class LandingPage : BaseLayout { + public LandingPage(Database database) : base(database) + {} + + public new User? User { get; set; } + [UsedImplicitly] - public IActionResult OnGet() => this.Page(); + public async Task OnGet() + { + User = await this.Database.UserFromWebRequest(this.Request); + + return this.Page(); + } } } \ No newline at end of file diff --git a/ProjectLighthouse/Pages/ExternalAuth/LoginForm.cshtml.cs b/ProjectLighthouse/Pages/ExternalAuth/LoginForm.cshtml.cs index 92388fa5..7ba7d451 100644 --- a/ProjectLighthouse/Pages/ExternalAuth/LoginForm.cshtml.cs +++ b/ProjectLighthouse/Pages/ExternalAuth/LoginForm.cshtml.cs @@ -11,12 +11,8 @@ namespace LBPUnion.ProjectLighthouse.Pages.ExternalAuth { public class LoginForm : BaseLayout { - private readonly Database database; - - public LoginForm(Database database) - { - this.database = database; - } + public LoginForm(Database database) : base(database) + {} public bool WasLoginRequest { get; private set; } @@ -27,7 +23,7 @@ namespace LBPUnion.ProjectLighthouse.Pages.ExternalAuth if (WasLoginRequest) { - User? user = await this.database.Users.FirstOrDefaultAsync(u => u.Username == username); + User? user = await this.Database.Users.FirstOrDefaultAsync(u => u.Username == username); if (user == null) return this.StatusCode(403, ""); if (!BCrypt.Net.BCrypt.Verify(password, user.Password)) return this.StatusCode(403, ""); @@ -38,8 +34,8 @@ namespace LBPUnion.ProjectLighthouse.Pages.ExternalAuth UserToken = HashHelper.GenerateAuthToken(), }; - this.database.WebTokens.Add(webToken); - await this.database.SaveChangesAsync(); + this.Database.WebTokens.Add(webToken); + await this.Database.SaveChangesAsync(); this.Response.Cookies.Append("LighthouseToken", webToken.UserToken); diff --git a/ProjectLighthouse/Pages/ExternalAuth/LogoutPage.cshtml b/ProjectLighthouse/Pages/ExternalAuth/LogoutPage.cshtml new file mode 100644 index 00000000..d17124cb --- /dev/null +++ b/ProjectLighthouse/Pages/ExternalAuth/LogoutPage.cshtml @@ -0,0 +1,9 @@ +@page "/logout" +@model LBPUnion.ProjectLighthouse.Pages.ExternalAuth.LogoutPage + +@{ + Layout = "Layouts/BaseLayout"; +} + +

You have been successfully logged out. You will be redirected in 5 seconds, or you may click here to do so manually.

+ \ No newline at end of file diff --git a/ProjectLighthouse/Pages/ExternalAuth/LogoutPage.cshtml.cs b/ProjectLighthouse/Pages/ExternalAuth/LogoutPage.cshtml.cs new file mode 100644 index 00000000..7542466c --- /dev/null +++ b/ProjectLighthouse/Pages/ExternalAuth/LogoutPage.cshtml.cs @@ -0,0 +1,26 @@ +#nullable enable +using System.Threading.Tasks; +using LBPUnion.ProjectLighthouse.Pages.Layouts; +using LBPUnion.ProjectLighthouse.Types; +using Microsoft.AspNetCore.Mvc; + +namespace LBPUnion.ProjectLighthouse.Pages.ExternalAuth +{ + public class LogoutPage : BaseLayout + { + public LogoutPage(Database database) : base(database) + {} + public async Task OnGet() + { + WebToken? token = await this.Database.WebTokenFromRequest(this.Request); + if (token == null) return this.BadRequest(); + + this.Database.WebTokens.Remove(token); + await this.Database.SaveChangesAsync(); + + this.Response.Cookies.Delete("LighthouseToken"); + + return this.Page(); + } + } +} \ No newline at end of file diff --git a/ProjectLighthouse/Pages/ExternalAuth/RegisterForm.cshtml.cs b/ProjectLighthouse/Pages/ExternalAuth/RegisterForm.cshtml.cs index 198dfeb2..6635c552 100644 --- a/ProjectLighthouse/Pages/ExternalAuth/RegisterForm.cshtml.cs +++ b/ProjectLighthouse/Pages/ExternalAuth/RegisterForm.cshtml.cs @@ -11,12 +11,8 @@ namespace LBPUnion.ProjectLighthouse.Pages.ExternalAuth { public class RegisterForm : BaseLayout { - private readonly Database database; - - public RegisterForm(Database database) - { - this.database = database; - } + public RegisterForm(Database database) : base(database) + {} public bool WasRegisterRequest { get; private set; } @@ -32,10 +28,10 @@ namespace LBPUnion.ProjectLighthouse.Pages.ExternalAuth if (WasRegisterRequest) { Console.WriteLine(password); - bool userExists = await this.database.Users.FirstOrDefaultAsync(u => u.Username.ToLower() == username.ToLower()) != null; + bool userExists = await this.Database.Users.FirstOrDefaultAsync(u => u.Username.ToLower() == username.ToLower()) != null; if (userExists) return this.BadRequest(); - this.database.CreateUser(username, HashHelper.BCryptHash(password)); + this.Database.CreateUser(username, HashHelper.BCryptHash(password)); } return this.Page(); diff --git a/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml b/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml index 183b3fe7..bc352fba 100644 --- a/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml +++ b/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml @@ -2,6 +2,20 @@ @using LBPUnion.ProjectLighthouse.Types @model LBPUnion.ProjectLighthouse.Pages.Layouts.BaseLayout +@{ + Model!.User = await Model.Database.UserFromWebRequest(Model.Request); + + if (Model.User == null) + { + Model.NavigationItems.Add(new PageNavigationItem("Register", "/register")); + Model.NavigationItems.Add(new PageNavigationItem("Log in", "/login")); + } + else + { + Model.NavigationItems.Add(new PageNavigationItem("Log out", "/logout")); + } +} + diff --git a/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml.cs b/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml.cs index cfcd8349..e0ddf9c4 100644 --- a/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml.cs +++ b/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml.cs @@ -1,3 +1,4 @@ +#nullable enable using System.Collections.Generic; using LBPUnion.ProjectLighthouse.Types; using Microsoft.AspNetCore.Mvc.RazorPages; @@ -6,11 +7,19 @@ namespace LBPUnion.ProjectLighthouse.Pages.Layouts { public class BaseLayout : PageModel { + public readonly Database Database; + + public new User? User { get; set; } + + public BaseLayout(Database database) + { + this.Database = database; + } + public readonly List NavigationItems = new() { new PageNavigationItem("Home", "/"), - new PageNavigationItem("Register", "/register"), - new PageNavigationItem("Login", "/login"), }; + } } \ No newline at end of file