Add methods for authentication

This commit is contained in:
jvyden 2021-10-12 15:35:48 -04:00
parent 223caa44af
commit 51b652f36d
No known key found for this signature in database
GPG key ID: 18BCF2BE0262B278
4 changed files with 73 additions and 31 deletions

View file

@ -1,4 +1,5 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MM/@EntryIndexedValue">MM</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Method/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb"&gt;&lt;ExtraRule Prefix="" Suffix="" Style="aaBb" /&gt;&lt;/Policy&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateConstants/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticReadonly/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>

View file

@ -22,11 +22,11 @@ namespace ProjectLighthouse.Controllers {
return this.Ok(user.Serialize());
}
[HttpPost("user/{username}")]
public async Task<IActionResult> CreateUser(string username) {
await new Database().CreateUser(username);
return await GetUser(username);
}
// [HttpPost("user/{username}")]
// public async Task<IActionResult> CreateUser(string username) {
// await new Database().CreateUser(username);
// return await GetUser(username);
// }
[HttpPost("updateUser")]
public async Task<IActionResult> UpdateUser() {

View file

@ -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);
}
}
}

View file

@ -0,0 +1,9 @@
using Microsoft.EntityFrameworkCore;
namespace ProjectLighthouse.Types {
[Keyless]
public class Token {
public int UserId { get; set; }
public string MMAuth { get; set; }
}
}