Use permission level model for permissions

This is better. Because having 20 fucking columns for permissions is STUPID.
This commit is contained in:
jvyden 2022-05-22 15:51:02 -04:00
parent 1b5e58dd80
commit 8301418085
No known key found for this signature in database
GPG key ID: 18BCF2BE0262B278
16 changed files with 542 additions and 433 deletions

View file

@ -74,7 +74,7 @@ public class LoginController : ControllerBase
User? user = await this.database.UserFromGameToken(token, true); User? user = await this.database.UserFromGameToken(token, true);
if (user == null || user.Banned) if (user == null || user.IsBanned)
{ {
Logger.Error($"Unable to find user {npTicket.Username} from token", LogArea.Login); Logger.Error($"Unable to find user {npTicket.Username} from token", LogArea.Login);
return this.StatusCode(403, ""); return this.StatusCode(403, "");

View file

@ -1,4 +1,5 @@
#nullable enable #nullable enable
using LBPUnion.ProjectLighthouse.Administration;
using LBPUnion.ProjectLighthouse.Files; using LBPUnion.ProjectLighthouse.Files;
using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.Logging;
using LBPUnion.ProjectLighthouse.PlayerData.Profiles; using LBPUnion.ProjectLighthouse.PlayerData.Profiles;
@ -28,7 +29,7 @@ public class AdminUserController : ControllerBase
User? targetedUser = await this.database.Users.FirstOrDefaultAsync(u => u.UserId == id); User? targetedUser = await this.database.Users.FirstOrDefaultAsync(u => u.UserId == id);
if (targetedUser == null) return this.NotFound(); if (targetedUser == null) return this.NotFound();
targetedUser.Banned = false; targetedUser.PermissionLevel = PermissionLevel.Default;
targetedUser.BannedReason = null; targetedUser.BannedReason = null;
await this.database.SaveChangesAsync(); await this.database.SaveChangesAsync();

View file

@ -1,4 +1,5 @@
#nullable enable #nullable enable
using LBPUnion.ProjectLighthouse.Administration;
using LBPUnion.ProjectLighthouse.PlayerData.Profiles; using LBPUnion.ProjectLighthouse.PlayerData.Profiles;
using LBPUnion.ProjectLighthouse.Servers.Website.Pages.Layouts; using LBPUnion.ProjectLighthouse.Servers.Website.Pages.Layouts;
using LBPUnion.ProjectLighthouse.Types; using LBPUnion.ProjectLighthouse.Types;
@ -33,7 +34,7 @@ public class AdminBanUserPage : BaseLayout
this.TargetedUser = await this.Database.Users.FirstOrDefaultAsync(u => u.UserId == id); this.TargetedUser = await this.Database.Users.FirstOrDefaultAsync(u => u.UserId == id);
if (this.TargetedUser == null) return this.NotFound(); if (this.TargetedUser == null) return this.NotFound();
this.TargetedUser.Banned = true; this.TargetedUser.PermissionLevel = PermissionLevel.Default;
this.TargetedUser.BannedReason = reason; this.TargetedUser.BannedReason = reason;
// invalidate all currently active gametokens // invalidate all currently active gametokens

View file

@ -1,4 +1,5 @@
@page "/admin/users" @page "/admin/users"
@using LBPUnion.ProjectLighthouse.Administration
@using LBPUnion.ProjectLighthouse.PlayerData.Profiles @using LBPUnion.ProjectLighthouse.PlayerData.Profiles
@using LBPUnion.ProjectLighthouse.Types @using LBPUnion.ProjectLighthouse.Types
@model LBPUnion.ProjectLighthouse.Servers.Website.Pages.Admin.AdminPanelUsersPage @model LBPUnion.ProjectLighthouse.Servers.Website.Pages.Admin.AdminPanelUsersPage
@ -14,17 +15,37 @@
<div class="ui grid"> <div class="ui grid">
@foreach (User user in Model.Users) @foreach (User user in Model.Users)
{ {
string color = "blue"; string color;
string subtitle = "User"; string subtitle;
if (user.IsAdmin)
switch (user.PermissionLevel)
{ {
color = "yellow"; // jank but works
subtitle = "Admin"; case PermissionLevel.Banned:
} {
if (user.Banned) color = "red";
{ subtitle = $"Banned user! Reason: {user.BannedReason}";
color = "red"; break;
subtitle = $"Banned user! Reason: {user.BannedReason}"; }
case PermissionLevel.Moderator:
{
color = "green";
subtitle = "Moderator";
break;
}
case PermissionLevel.Administrator:
{
color = "yellow";
subtitle = "Admin";
break;
}
case PermissionLevel.Default:
default:
{
color = "blue";
subtitle = "User";
break;
}
} }
subtitle += $" (id: {user.UserId})"; subtitle += $" (id: {user.UserId})";

View file

@ -57,7 +57,7 @@ public class LoginForm : BaseLayout
return this.Page(); return this.Page();
} }
if (user.Banned) if (user.IsBanned)
{ {
Logger.Warn($"User {user.Username} (id: {user.UserId}) failed to login on web due to being banned", LogArea.Login); Logger.Warn($"User {user.Username} (id: {user.UserId}) failed to login on web due to being banned", LogArea.Login);
this.Error = "You have been banned. Please contact an administrator for more information.\nReason: " + user.BannedReason; this.Error = "You have been banned. Please contact an administrator for more information.\nReason: " + user.BannedReason;

View file

@ -13,7 +13,7 @@
Model.Description = Model.ProfileUser!.Biography; Model.Description = Model.ProfileUser!.Biography;
} }
@if (Model.ProfileUser.Banned) @if (Model.ProfileUser.IsBanned)
{ {
<div class="ui inverted red segment"> <div class="ui inverted red segment">
<h2>User is currently banned!</h2> <h2>User is currently banned!</h2>
@ -120,7 +120,7 @@
<div class="ui yellow segment"> <div class="ui yellow segment">
<h2>Admin Options</h2> <h2>Admin Options</h2>
@if (!Model.ProfileUser.Banned) @if (!Model.ProfileUser.IsBanned)
{ {
<div> <div>
<a class="ui red button" href="/admin/user/@Model.ProfileUser.UserId/ban"> <a class="ui red button" href="/admin/user/@Model.ProfileUser.UserId/ban">

View file

@ -1,4 +1,5 @@
#nullable enable #nullable enable
using LBPUnion.ProjectLighthouse.Administration;
using LBPUnion.ProjectLighthouse.Configuration; using LBPUnion.ProjectLighthouse.Configuration;
using LBPUnion.ProjectLighthouse.PlayerData.Profiles; using LBPUnion.ProjectLighthouse.PlayerData.Profiles;
using LBPUnion.ProjectLighthouse.Servers.Website.Pages.Layouts; using LBPUnion.ProjectLighthouse.Servers.Website.Pages.Layouts;
@ -29,14 +30,14 @@ public class UsersPage : BaseLayout
this.SearchValue = name.Replace(" ", string.Empty); this.SearchValue = name.Replace(" ", string.Empty);
this.UserCount = await this.Database.Users.CountAsync(u => !u.Banned && u.Username.Contains(this.SearchValue)); this.UserCount = await this.Database.Users.CountAsync(u => u.PermissionLevel != PermissionLevel.Banned && u.Username.Contains(this.SearchValue));
this.PageNumber = pageNumber; this.PageNumber = pageNumber;
this.PageAmount = Math.Max(1, (int)Math.Ceiling((double)this.UserCount / ServerStatics.PageSize)); this.PageAmount = Math.Max(1, (int)Math.Ceiling((double)this.UserCount / ServerStatics.PageSize));
if (this.PageNumber < 0 || this.PageNumber >= this.PageAmount) return this.Redirect($"/users/{Math.Clamp(this.PageNumber, 0, this.PageAmount - 1)}"); if (this.PageNumber < 0 || this.PageNumber >= this.PageAmount) return this.Redirect($"/users/{Math.Clamp(this.PageNumber, 0, this.PageAmount - 1)}");
this.Users = await this.Database.Users.Where(u => !u.Banned && u.Username.Contains(this.SearchValue)) this.Users = await this.Database.Users.Where(u => u.PermissionLevel != PermissionLevel.Banned && u.Username.Contains(this.SearchValue))
.OrderByDescending(b => b.UserId) .OrderByDescending(b => b.UserId)
.Skip(pageNumber * ServerStatics.PageSize) .Skip(pageNumber * ServerStatics.PageSize)
.Take(ServerStatics.PageSize) .Take(ServerStatics.PageSize)

View file

@ -1,6 +1,7 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using LBPUnion.ProjectLighthouse; using LBPUnion.ProjectLighthouse;
using LBPUnion.ProjectLighthouse.Administration;
using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Helpers;
using LBPUnion.ProjectLighthouse.PlayerData; using LBPUnion.ProjectLighthouse.PlayerData;
using LBPUnion.ProjectLighthouse.PlayerData.Profiles; using LBPUnion.ProjectLighthouse.PlayerData.Profiles;
@ -28,7 +29,7 @@ public class AdminTests : LighthouseWebTest
}; };
database.WebTokens.Add(webToken); database.WebTokens.Add(webToken);
user.IsAdmin = true; user.PermissionLevel = PermissionLevel.Administrator;
await database.SaveChangesAsync(); await database.SaveChangesAsync();
this.Driver.Navigate().GoToUrl(this.BaseAddress + "/"); this.Driver.Navigate().GoToUrl(this.BaseAddress + "/");
@ -52,7 +53,7 @@ public class AdminTests : LighthouseWebTest
}; };
database.WebTokens.Add(webToken); database.WebTokens.Add(webToken);
user.IsAdmin = false; user.PermissionLevel = PermissionLevel.Default;
await database.SaveChangesAsync(); await database.SaveChangesAsync();
this.Driver.Navigate().GoToUrl(this.BaseAddress + "/"); this.Driver.Navigate().GoToUrl(this.BaseAddress + "/");

View file

@ -35,7 +35,7 @@ public class MakeUserAdminCommand : ICommand
return; return;
} }
user.IsAdmin = true; user.PermissionLevel = PermissionLevel.Administrator;
await this.database.SaveChangesAsync(); await this.database.SaveChangesAsync();
logger.LogSuccess($"The user {user.Username} (id: {user.UserId}) is now an admin.", LogArea.Command); logger.LogSuccess($"The user {user.Username} (id: {user.UserId}) is now an admin.", LogArea.Command);

View file

@ -0,0 +1,9 @@
namespace LBPUnion.ProjectLighthouse.Administration;
public enum PermissionLevel
{
Banned = 0,
Default = 1,
Moderator = 2,
Administrator = 3,
}

View file

@ -1,5 +1,6 @@
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using LBPUnion.ProjectLighthouse.Administration;
using LBPUnion.ProjectLighthouse.PlayerData; using LBPUnion.ProjectLighthouse.PlayerData;
using LBPUnion.ProjectLighthouse.Types; using LBPUnion.ProjectLighthouse.Types;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
@ -18,7 +19,7 @@ public static class StatisticsHelper
public static async Task<int> SlotCount() => await database.Slots.CountAsync(); public static async Task<int> SlotCount() => await database.Slots.CountAsync();
public static async Task<int> UserCount() => await database.Users.CountAsync(u => !u.Banned); public static async Task<int> UserCount() => await database.Users.CountAsync(u => u.PermissionLevel != PermissionLevel.Banned);
public static async Task<int> TeamPickCount() => await database.Slots.CountAsync(s => s.TeamPick); public static async Task<int> TeamPickCount() => await database.Slots.CountAsync(s => s.TeamPick);

View file

@ -0,0 +1,56 @@
#nullable disable
using LBPUnion.ProjectLighthouse;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
namespace ProjectLighthouse.Migrations
{
[DbContext(typeof(Database))]
[Migration("20220522192158_SwitchToPermissionLevels")]
public class SwitchToPermissionLevels : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(name: "PermissionLevel",
table: "Users",
type: "int",
nullable: false,
defaultValue: 1);
migrationBuilder.Sql("UPDATE Users SET PermissionLevel = 3 WHERE IsAdmin");
migrationBuilder.Sql("UPDATE Users SET PermissionLevel = 0 WHERE Banned");
migrationBuilder.DropColumn(
name: "Banned",
table: "Users");
migrationBuilder.DropColumn(
name: "IsAdmin",
table: "Users");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "PermissionLevel",
table: "Users");
migrationBuilder.AddColumn<bool>(
name: "Banned",
table: "Users",
type: "tinyint(1)",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "IsAdmin",
table: "Users",
type: "tinyint(1)",
nullable: false,
defaultValue: false);
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -3,6 +3,7 @@ using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using System.Xml.Serialization; using System.Xml.Serialization;
using LBPUnion.ProjectLighthouse.Administration;
using LBPUnion.ProjectLighthouse.Configuration; using LBPUnion.ProjectLighthouse.Configuration;
using LBPUnion.ProjectLighthouse.Serialization; using LBPUnion.ProjectLighthouse.Serialization;
using LBPUnion.ProjectLighthouse.Types; using LBPUnion.ProjectLighthouse.Types;
@ -15,7 +16,6 @@ public class User
[NotMapped] [NotMapped]
[JsonIgnore] [JsonIgnore]
private Database? _database; private Database? _database;
#nullable disable
[NotMapped] [NotMapped]
[JsonIgnore] [JsonIgnore]
@ -123,9 +123,6 @@ public class User
[JsonIgnore] [JsonIgnore]
public int Hearts => this.database.HeartedProfiles.Count(s => s.HeartedUserId == this.UserId); public int Hearts => this.database.HeartedProfiles.Count(s => s.HeartedUserId == this.UserId);
[JsonIgnore]
public bool IsAdmin { get; set; } = false;
[JsonIgnore] [JsonIgnore]
public bool PasswordResetRequired { get; set; } public bool PasswordResetRequired { get; set; }
@ -138,10 +135,19 @@ public class User
public UserStatus Status => new(this.database, this.UserId); public UserStatus Status => new(this.database, this.UserId);
[JsonIgnore] [JsonIgnore]
public bool Banned { get; set; } public bool IsBanned => this.PermissionLevel == PermissionLevel.Banned;
[JsonIgnore] [JsonIgnore]
public string BannedReason { get; set; } public bool IsModerator => this.PermissionLevel == PermissionLevel.Moderator;
[JsonIgnore]
public bool IsAdmin => this.PermissionLevel == PermissionLevel.Administrator;
[JsonIgnore]
public PermissionLevel PermissionLevel { get; set; } = PermissionLevel.Default;
[JsonIgnore]
public string? BannedReason { get; set; }
public string Serialize(GameVersion gameVersion = GameVersion.LittleBigPlanet1) public string Serialize(GameVersion gameVersion = GameVersion.LittleBigPlanet1)
{ {

View file

@ -50,6 +50,10 @@
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Compile Remove="Migrations\20220522192158_SwitchToPermissionLevels.Designer.cs" />
</ItemGroup>
<Target Name="PreBuild" BeforeTargets="PreBuildEvent"> <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
<Exec Command="git describe --long --always --dirty --exclude=\* --abbrev=8 &gt; &quot;$(ProjectDir)/gitVersion.txt&quot;" /> <Exec Command="git describe --long --always --dirty --exclude=\* --abbrev=8 &gt; &quot;$(ProjectDir)/gitVersion.txt&quot;" />
<Exec Command="git branch --show-current &gt; &quot;$(ProjectDir)/gitBranch.txt&quot;" /> <Exec Command="git branch --show-current &gt; &quot;$(ProjectDir)/gitBranch.txt&quot;" />

View file

@ -1,4 +1,4 @@
#!/bin/bash #!/bin/bash
export LIGHTHOUSE_DB_CONNECTION_STRING='server=127.0.0.1;uid=root;pwd=lighthouse;database=lighthouse' export LIGHTHOUSE_DB_CONNECTION_STRING='server=127.0.0.1;uid=root;pwd=lighthouse;database=lighthouse'
dotnet ef migrations add "$1" --project ProjectLighthouse dotnet ef migrations add "$1" --project ../ProjectLighthouse