Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add config options to restrict signup on certain platforms #1077

Merged
merged 7 commits into from
Nov 2, 2024
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#nullable enable
using System.Net;
using LBPUnion.ProjectLighthouse.Configuration;
using LBPUnion.ProjectLighthouse.Database;
Expand All @@ -21,12 +20,11 @@ namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Controllers.Login;
public class LoginController : ControllerBase
{
private readonly DatabaseContext database;

public LoginController(DatabaseContext database)
{
this.database = database;
}

[HttpPost]
Zaprit marked this conversation as resolved.
Show resolved Hide resolved
public async Task<IActionResult> Login()
{
Expand Down Expand Up @@ -57,9 +55,9 @@ public async Task<IActionResult> Login()

string ipAddress = remoteIpAddress.ToString();

string? username = npTicket.Username;
string username = npTicket.Username;

if (username == null)
if (string.IsNullOrEmpty(username))
{
Logger.Warn("Unable to determine username, rejecting login", LogArea.Login);
return this.Forbid();
Expand All @@ -72,12 +70,12 @@ public async Task<IActionResult> Login()
switch (npTicket.Platform)
{
case Platform.RPCS3:
user = await this.database.Users.FirstOrDefaultAsync(u => u.LinkedRpcnId == npTicket.UserId);
user = await database.Users.FirstOrDefaultAsync(u => u.LinkedRpcnId == npTicket.UserId);
break;
Zaprit marked this conversation as resolved.
Show resolved Hide resolved
case Platform.PS3:
case Platform.Vita:
case Platform.UnitTest:
user = await this.database.Users.FirstOrDefaultAsync(u => u.LinkedPsnId == npTicket.UserId);
user = await database.Users.FirstOrDefaultAsync(u => u.LinkedPsnId == npTicket.UserId);
break;
case Platform.PSP:
case Platform.Unknown:
Expand All @@ -89,7 +87,7 @@ public async Task<IActionResult> Login()
if (user == null)
{
// Check if there is an account with that username already
UserEntity? targetUsername = await this.database.Users.FirstOrDefaultAsync(u => u.Username == npTicket.Username);
UserEntity? targetUsername = await database.Users.FirstOrDefaultAsync(u => u.Username == npTicket.Username);
if (targetUsername != null)
{
ulong targetPlatform = npTicket.Platform == Platform.RPCS3
Expand All @@ -104,7 +102,7 @@ public async Task<IActionResult> Login()
}

// if there is already a pending link request don't create another
bool linkAttemptExists = await this.database.PlatformLinkAttempts.AnyAsync(p =>
bool linkAttemptExists = await database.PlatformLinkAttempts.AnyAsync(p =>
p.Platform == npTicket.Platform &&
p.PlatformId == npTicket.UserId &&
p.UserId == targetUsername.UserId);
Expand All @@ -119,8 +117,8 @@ public async Task<IActionResult> Login()
Timestamp = TimeHelper.TimestampMillis,
PlatformId = npTicket.UserId,
};
this.database.PlatformLinkAttempts.Add(linkAttempt);
await this.database.SaveChangesAsync();
database.PlatformLinkAttempts.Add(linkAttempt);
await database.SaveChangesAsync();
Logger.Success($"User '{npTicket.Username}' tried to login but platform isn't linked, platform={npTicket.Platform}", LogArea.Login);
return this.Forbid();
}
Expand All @@ -130,12 +128,31 @@ public async Task<IActionResult> Login()
Logger.Warn($"Unknown user tried to connect username={username}", LogArea.Login);
return this.Forbid();
}

// Block RPCN signups if forbidden in config
if (npTicket.Platform == Platform.RPCS3 && !ServerConfiguration.Instance.Authentication.AllowRPCNSignup)
{
Logger.Warn(
$"New user tried to sign up via RPCN, and that is forbidden in the config, username={username}, remoteIpAddress={remoteIpAddress}",
LogArea.Login);
return this.Forbid();
}

// Block PSN signups if forbidden in config
if (npTicket.Platform.IsPSN() && !ServerConfiguration.Instance.Authentication.AllowPSNSignup)
{
Logger.Warn(
$"New user tried to sign up via PSN, and that is forbidden in the config, username={username}, remoteIpAddress={remoteIpAddress}",
LogArea.Login);
return this.Forbid();
}

// create account for user if they don't exist
user = await this.database.CreateUser(username, "$");
user = await database.CreateUser(username, "$");
user.Password = null;
user.LinkedRpcnId = npTicket.Platform == Platform.RPCS3 ? npTicket.UserId : 0;
user.LinkedPsnId = npTicket.Platform != Platform.RPCS3 ? npTicket.UserId : 0;
await this.database.SaveChangesAsync();
await database.SaveChangesAsync();

if (DiscordConfiguration.Instance.DiscordIntegrationEnabled)
{
Expand All @@ -155,7 +172,7 @@ public async Task<IActionResult> Login()
// automatically change username if it doesn't match
else if (user.Username != npTicket.Username)
{
bool usernameExists = await this.database.Users.AnyAsync(u => u.Username == npTicket.Username);
bool usernameExists = await database.Users.AnyAsync(u => u.Username == npTicket.Username);
if (usernameExists)
{
Logger.Warn($"{npTicket.Platform} user changed their name to a name that is already taken," +
Expand All @@ -164,17 +181,17 @@ public async Task<IActionResult> Login()
}
Logger.Info($"User's username has changed, old='{user.Username}', new='{npTicket.Username}', platform={npTicket.Platform}", LogArea.Login);
user.Username = username;
await this.database.PlatformLinkAttempts.RemoveWhere(p => p.UserId == user.UserId);
await database.PlatformLinkAttempts.RemoveWhere(p => p.UserId == user.UserId);
// unlink other platforms because the names no longer match
if (npTicket.Platform == Platform.RPCS3)
user.LinkedPsnId = 0;
else
user.LinkedRpcnId = 0;

await this.database.SaveChangesAsync();
await database.SaveChangesAsync();
}

GameTokenEntity? token = await this.database.GameTokens.Include(t => t.User)
GameTokenEntity? token = await database.GameTokens.Include(t => t.User)
.FirstOrDefaultAsync(t => t.User.Username == npTicket.Username && t.TicketHash == npTicket.TicketHash);

if (token != null)
Expand All @@ -183,7 +200,7 @@ public async Task<IActionResult> Login()
return this.Forbid();
}

token = await this.database.AuthenticateUser(user, npTicket, ipAddress);
token = await database.AuthenticateUser(user, npTicket, ipAddress);
if (token == null)
{
Logger.Warn($"Unable to find/generate a token for username {npTicket.Username}", LogArea.Login);
Expand All @@ -200,7 +217,7 @@ public async Task<IActionResult> Login()

user.LastLogin = TimeHelper.TimestampMillis;

await this.database.SaveChangesAsync();
await database.SaveChangesAsync();

// Create a new room on LBP2/3/Vita
if (token.GameVersion != GameVersion.LittleBigPlanet1) RoomHelper.CreateRoom(user.UserId, token.GameVersion, token.Platform);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,9 @@ public class AuthenticationConfiguration
public bool RegistrationEnabled { get; set; } = true;
public bool AutomaticAccountCreation { get; set; } = true;
public bool VerifyTickets { get; set; } = true;

public bool AllowRPCNSignup { get; set; } = true;

public bool AllowPSNSignup { get; set; } = true;
Zaprit marked this conversation as resolved.
Show resolved Hide resolved

}
2 changes: 1 addition & 1 deletion ProjectLighthouse/Configuration/ServerConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class ServerConfiguration : ConfigurationBase<ServerConfiguration>
// This is so Lighthouse can properly identify outdated configurations and update them with newer settings accordingly.
// If you are modifying anything here, this value MUST be incremented.
// Thanks for listening~
public override int ConfigVersion { get; set; } = 26;
public override int ConfigVersion { get; set; } = 27;

public override string ConfigName { get; set; } = "lighthouse.yml";
public string WebsiteListenUrl { get; set; } = "http://localhost:10060";
Expand Down
9 changes: 9 additions & 0 deletions ProjectLighthouse/Types/Users/Platform.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
namespace LBPUnion.ProjectLighthouse.Types.Users;

public static class PlatformExtensions
{

public static bool IsPSN(this Platform platform)
{
return platform == Platform.PS3 || platform == Platform.PSP || platform == Platform.Vita;
}
}

public enum Platform
{
PS3 = 0,
Expand Down
Loading