mirror of
https://github.com/LBPUnion/ProjectLighthouse.git
synced 2025-05-20 00:02:28 +00:00
Add methods for authentication
This commit is contained in:
parent
223caa44af
commit
51b652f36d
4 changed files with 73 additions and 31 deletions
|
@ -1,38 +1,70 @@
|
|||
#nullable enable
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using ProjectLighthouse.Types;
|
||||
|
||||
namespace ProjectLighthouse {
|
||||
public class Database : DbContext {
|
||||
protected override void OnConfiguring(DbContextOptionsBuilder options) => options.UseMySql(
|
||||
ServerSettings.DbConnectionString,
|
||||
MySqlServerVersion.LatestSupportedServerVersion
|
||||
);
|
||||
|
||||
public async Task CreateUser(string username) {
|
||||
await this.Database.ExecuteSqlRawAsync(
|
||||
"INSERT INTO Locations (X, Y) VALUES ({0}, {1})",
|
||||
0, 0);
|
||||
|
||||
Location l = new() {
|
||||
X = 0,
|
||||
Y = 0
|
||||
};
|
||||
|
||||
this.Locations.Add(l);
|
||||
await this.SaveChangesAsync();
|
||||
|
||||
int locationId = l.Id;
|
||||
|
||||
await this.Database.ExecuteSqlRawAsync(
|
||||
"INSERT INTO Users (Username, Biography, Pins, LocationId) VALUES ({0}, {1}, {2}, {3})",
|
||||
username, "No biography provided.", "", locationId);
|
||||
|
||||
}
|
||||
|
||||
public DbSet<User> Users { get; set; }
|
||||
public DbSet<Location> Locations { get; set; }
|
||||
public DbSet<Slot> Slots { get; set; }
|
||||
public DbSet<Comment> Comments { get; set; }
|
||||
public DbSet<Token> Tokens { get; set; }
|
||||
|
||||
protected override void OnConfiguring(DbContextOptionsBuilder options) => options.UseMySql(
|
||||
ServerSettings.DbConnectionString,
|
||||
MySqlServerVersion.LatestSupportedServerVersion
|
||||
);
|
||||
|
||||
public async Task<User> CreateUser(string username) {
|
||||
Location l = new(); // store to get id after submitting
|
||||
this.Locations.Add(l); // add to table
|
||||
await this.SaveChangesAsync(); // saving to the database returns the id and sets it on this entity
|
||||
|
||||
User user = new() {
|
||||
Username = username,
|
||||
LocationId = l.Id,
|
||||
Biography = "No biography provided"
|
||||
};
|
||||
this.Users.Add(user);
|
||||
|
||||
await this.SaveChangesAsync();
|
||||
|
||||
return user;
|
||||
|
||||
}
|
||||
|
||||
// MM_AUTH=psn_name:?:timestamp, potentially a user creation date?:?:user id?:user's IP:?:password? SHA1
|
||||
// just blindly trust the token for now while we get it working
|
||||
public async Task<bool> AuthenticateUser(string mmAuth) {
|
||||
Token token = new() {
|
||||
MMAuth = mmAuth
|
||||
};
|
||||
|
||||
string[] split;
|
||||
try {
|
||||
split = mmAuth.Split(":");
|
||||
}
|
||||
catch(ArgumentOutOfRangeException e) {
|
||||
return false; // Token doesn't contain :, cant be a valid token
|
||||
}
|
||||
|
||||
// TODO: don't use psn name to authenticate
|
||||
User user = await this.Users.FirstOrDefaultAsync(u => u.Username == split[0])
|
||||
?? await this.CreateUser(split[0]);
|
||||
|
||||
token.UserId = user.UserId;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public async Task<bool> IsUserAuthenticated(string mmAuth) => await UserFromMMAuth(mmAuth) != null;
|
||||
|
||||
public async Task<User?> UserFromMMAuth(string mmAuth) {
|
||||
Token? token = await Tokens.FirstOrDefaultAsync(t => t.MMAuth == mmAuth);
|
||||
if(token == null) return null;
|
||||
return await Users.FirstOrDefaultAsync(u => u.UserId == token.UserId);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue