mirror of
https://github.com/LBPUnion/ProjectLighthouse.git
synced 2025-07-29 08:28:39 +00:00
Allow RegistrationTokens to have a username pre-selected (#524)
* Add prefilled username to registration token * call toString on query to work with EF * Fix typo in RegisterForm.cshtml * Only show username notice if the user's username hasn't been chosen already * Add confirmation message to DeleteUserCommand
This commit is contained in:
parent
bfe81c3461
commit
c7195df74f
9 changed files with 66 additions and 12 deletions
|
@ -68,7 +68,8 @@ public class UserEndpoints : ApiEndpointController
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("user/inviteToken")]
|
[HttpPost("user/inviteToken")]
|
||||||
public async Task<IActionResult> CreateUserInviteToken()
|
[HttpPost("user/inviteToken/{username}")]
|
||||||
|
public async Task<IActionResult> CreateUserInviteToken([FromRoute] string? username)
|
||||||
{
|
{
|
||||||
if (!Configuration.ServerConfiguration.Instance.Authentication.PrivateRegistration &&
|
if (!Configuration.ServerConfiguration.Instance.Authentication.PrivateRegistration &&
|
||||||
!Configuration.ServerConfiguration.Instance.Authentication.RegistrationEnabled)
|
!Configuration.ServerConfiguration.Instance.Authentication.RegistrationEnabled)
|
||||||
|
@ -86,6 +87,7 @@ public class UserEndpoints : ApiEndpointController
|
||||||
{
|
{
|
||||||
Created = DateTime.Now,
|
Created = DateTime.Now,
|
||||||
Token = CryptoHelper.GenerateAuthToken(),
|
Token = CryptoHelper.GenerateAuthToken(),
|
||||||
|
Username = username,
|
||||||
};
|
};
|
||||||
|
|
||||||
this.database.RegistrationTokens.Add(token);
|
this.database.RegistrationTokens.Add(token);
|
||||||
|
|
|
@ -33,7 +33,10 @@
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
<p><b>@Model.Translate(RegisterStrings.UsernameNotice)</b></p>
|
@if (Model.Username == null)
|
||||||
|
{
|
||||||
|
<p><b>@Model.Translate(RegisterStrings.UsernameNotice)</b></p>
|
||||||
|
}
|
||||||
|
|
||||||
<form class="ui form" onsubmit="return onSubmit(this)" method="post">
|
<form class="ui form" onsubmit="return onSubmit(this)" method="post">
|
||||||
@Html.AntiForgeryToken()
|
@Html.AntiForgeryToken()
|
||||||
|
@ -41,7 +44,14 @@
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<label>Username</label>
|
<label>Username</label>
|
||||||
<div class="ui left icon input">
|
<div class="ui left icon input">
|
||||||
<input type="text" name="username" id="text" placeholder="Username" pattern="^[a-zA-Z0-9_.-]*$" minlength="3" maxlength="16">
|
@{
|
||||||
|
string extra = "";
|
||||||
|
if (Model.Username != null)
|
||||||
|
{
|
||||||
|
extra = "value=" + Model.Username + " readonly";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
<input type="text" name="username" id="text" placeholder="Username" pattern="^[a-zA-Z0-9_.-]*$" minlength="3" maxlength="16" @extra>
|
||||||
<i class="user icon"></i>
|
<i class="user icon"></i>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -7,7 +7,6 @@ using LBPUnion.ProjectLighthouse.Localization.StringLists;
|
||||||
using LBPUnion.ProjectLighthouse.PlayerData;
|
using LBPUnion.ProjectLighthouse.PlayerData;
|
||||||
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 Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
|
@ -20,6 +19,8 @@ public class RegisterForm : BaseLayout
|
||||||
|
|
||||||
public string? Error { get; private set; }
|
public string? Error { get; private set; }
|
||||||
|
|
||||||
|
public string? Username { get; set; }
|
||||||
|
|
||||||
[UsedImplicitly]
|
[UsedImplicitly]
|
||||||
[SuppressMessage("ReSharper", "SpecifyStringComparison")]
|
[SuppressMessage("ReSharper", "SpecifyStringComparison")]
|
||||||
public async Task<IActionResult> OnPost(string username, string password, string confirmPassword, string emailAddress)
|
public async Task<IActionResult> OnPost(string username, string password, string confirmPassword, string emailAddress)
|
||||||
|
@ -30,6 +31,8 @@ public class RegisterForm : BaseLayout
|
||||||
{
|
{
|
||||||
if (!this.Database.IsRegistrationTokenValid(this.Request.Query["token"]))
|
if (!this.Database.IsRegistrationTokenValid(this.Request.Query["token"]))
|
||||||
return this.StatusCode(403, this.Translate(ErrorStrings.TokenInvalid));
|
return this.StatusCode(403, this.Translate(ErrorStrings.TokenInvalid));
|
||||||
|
|
||||||
|
username = (await this.Database.RegistrationTokens.FirstAsync(r => r.Token == this.Request.Query["token"].ToString())).Username;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -119,6 +122,8 @@ public class RegisterForm : BaseLayout
|
||||||
{
|
{
|
||||||
if (!this.Database.IsRegistrationTokenValid(this.Request.Query["token"]))
|
if (!this.Database.IsRegistrationTokenValid(this.Request.Query["token"]))
|
||||||
return this.StatusCode(403, this.Translate(ErrorStrings.TokenInvalid));
|
return this.StatusCode(403, this.Translate(ErrorStrings.TokenInvalid));
|
||||||
|
|
||||||
|
this.Username = this.Database.RegistrationTokens.First(r => r.Token == this.Request.Query["token"].ToString()).Username;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -34,5 +34,6 @@ public class DeleteUserCommand : ICommand
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.database.RemoveUser(user);
|
await this.database.RemoveUser(user);
|
||||||
|
logger.LogSuccess($"Successfully deleted user {user.Username}", LogArea.Command);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Buffers.Binary;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|
||||||
namespace LBPUnion.ProjectLighthouse.Extensions;
|
namespace LBPUnion.ProjectLighthouse.Extensions;
|
||||||
|
@ -15,19 +16,19 @@ public static class BinaryReaderExtensions
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ushort ReadUInt16BE(this BinaryReader binRdr) => BitConverter.ToUInt16(binRdr.ReadBytesRequired(sizeof(ushort)).Reverse(), 0);
|
public static ushort ReadUInt16BE(this BinaryReader binRdr) => BinaryPrimitives.ReadUInt16BigEndian(binRdr.ReadBytesRequired(sizeof(ushort)));
|
||||||
|
|
||||||
public static short ReadInt16BE(this BinaryReader binRdr) => BitConverter.ToInt16(binRdr.ReadBytesRequired(sizeof(short)).Reverse(), 0);
|
public static short ReadInt16BE(this BinaryReader binRdr) => BinaryPrimitives.ReadInt16BigEndian(binRdr.ReadBytesRequired(sizeof(short)));
|
||||||
|
|
||||||
public static uint ReadUInt32BE(this BinaryReader binRdr) => BitConverter.ToUInt32(binRdr.ReadBytesRequired(sizeof(uint)).Reverse(), 0);
|
public static uint ReadUInt32BE(this BinaryReader binRdr) => BinaryPrimitives.ReadUInt32BigEndian(binRdr.ReadBytesRequired(sizeof(uint)));
|
||||||
|
|
||||||
public static int ReadInt32BE(this BinaryReader binRdr) => BitConverter.ToInt32(binRdr.ReadBytesRequired(sizeof(int)).Reverse(), 0);
|
public static int ReadInt32BE(this BinaryReader binRdr) => BinaryPrimitives.ReadInt32BigEndian(binRdr.ReadBytesRequired(sizeof(int)));
|
||||||
|
|
||||||
public static ulong ReadUInt64BE(this BinaryReader binRdr) => BitConverter.ToUInt32(binRdr.ReadBytesRequired(sizeof(ulong)).Reverse(), 0);
|
public static ulong ReadUInt64BE(this BinaryReader binRdr) => BinaryPrimitives.ReadUInt64BigEndian(binRdr.ReadBytesRequired(sizeof(ulong)));
|
||||||
|
|
||||||
public static long ReadInt64BE(this BinaryReader binRdr) => BitConverter.ToInt32(binRdr.ReadBytesRequired(sizeof(long)).Reverse(), 0);
|
public static long ReadInt64BE(this BinaryReader binRdr) => BinaryPrimitives.ReadInt64BigEndian(binRdr.ReadBytesRequired(sizeof(long)));
|
||||||
|
|
||||||
public static byte[] ReadBytesRequired(this BinaryReader binRdr, int byteCount)
|
private static byte[] ReadBytesRequired(this BinaryReader binRdr, int byteCount)
|
||||||
{
|
{
|
||||||
byte[] result = binRdr.ReadBytes(byteCount);
|
byte[] result = binRdr.ReadBytes(byteCount);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
using LBPUnion.ProjectLighthouse;
|
||||||
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace ProjectLighthouse.Migrations
|
||||||
|
{
|
||||||
|
[DbContext(typeof(Database))]
|
||||||
|
[Migration("20221016234831_AddUsernameToRegistrationToken")]
|
||||||
|
public partial class AddUsernameToRegistrationToken : Migration
|
||||||
|
{
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.AddColumn<string>(
|
||||||
|
name: "Username",
|
||||||
|
table: "RegistrationTokens",
|
||||||
|
type: "longtext",
|
||||||
|
nullable: true)
|
||||||
|
.Annotation("MySql:CharSet", "utf8mb4");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropColumn(
|
||||||
|
name: "Username",
|
||||||
|
table: "RegistrationTokens");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,6 +11,8 @@ namespace LBPUnion.ProjectLighthouse.PlayerData
|
||||||
public string Token { get; set; }
|
public string Token { get; set; }
|
||||||
|
|
||||||
public DateTime Created { get; set; }
|
public DateTime Created { get; set; }
|
||||||
|
|
||||||
|
public string Username { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ public class Score
|
||||||
public Slot Slot { get; set; }
|
public Slot Slot { get; set; }
|
||||||
|
|
||||||
[XmlIgnore]
|
[XmlIgnore]
|
||||||
public int? ChildSlotId { get; set; }
|
public int ChildSlotId { get; set; }
|
||||||
|
|
||||||
[XmlElement("type")]
|
[XmlElement("type")]
|
||||||
public int Type { get; set; }
|
public int Type { get; set; }
|
||||||
|
|
|
@ -873,6 +873,9 @@ namespace ProjectLighthouse.Migrations
|
||||||
b.Property<string>("Token")
|
b.Property<string>("Token")
|
||||||
.HasColumnType("longtext");
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
|
b.Property<string>("Username")
|
||||||
|
.HasColumnType("longtext");
|
||||||
|
|
||||||
b.HasKey("TokenId");
|
b.HasKey("TokenId");
|
||||||
|
|
||||||
b.ToTable("RegistrationTokens");
|
b.ToTable("RegistrationTokens");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue