Authinator/Backend/Database/DatabaseContext.cs
2023-06-01 06:14:24 +02:00

58 lines
2.5 KiB
C#

using System.Reflection;
using System.Web;
using Authinator.Backend.Database.Tables;
using Authinator.Backend.Utils;
using Microsoft.EntityFrameworkCore;
namespace Authinator.Backend.Database;
public class DatabaseContext : DbContext {
public DatabaseContext() { }
public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options) { }
public virtual DbSet<Network> Networks { get; set; } = null!;
public virtual DbSet<Config> Config { get; set; } = null!;
public virtual DbSet<Group> Groups { get; set; } = null!;
public virtual DbSet<User> Users { get; set; } = null!;
public virtual DbSet<ACL> ACLs { get; set; } = null!;
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.UseSqlite("Data Source=database.db");
protected override void OnModelCreating(ModelBuilder modelBuilder) {
modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
}
public async void Initialize() {
Config.Set("cookie_name", "authinator-session", false);
Config.Set("admin_group", "admin", false);
Config.Set("hmac_secret", CryptoUtils.GetRandomBytesBase64(64), false);
Config.Set("auth_token_lifetime", "31556926", false); // default auth token lifetime is 1 year
Config.Set("pw_reset_token_lifetime", "3600", false); // default pw reset token lifetime is 1 hour
await SaveChangesAsync();
Config.UpdateCache();
if (!Groups.Any(p => p.Name == ConfigCache.AdminGroup)) {
Groups.Add(new Group { Name = ConfigCache.AdminGroup });
await SaveChangesAsync();
}
if (!Users.Include(p => p.Groups).Any(p => p.Groups.Any(q => q.Name == ConfigCache.AdminGroup))) {
Console.WriteLine($"* No admin user found, creating one...");
var user = new User { Reference = "admin_" + DateTimeOffset.UtcNow.ToUnixTimeSeconds(), Groups = new List<Group> { Groups.First(p => p.Name == ConfigCache.AdminGroup) } };
await Users.AddAsync(user);
await SaveChangesAsync();
Console.WriteLine($"* User '{user.Reference}' created, activate it on /FinishRegistration using this token: {user.GetSignupToken()}");
}
else if (!Users.Include(p => p.Groups).AsEnumerable().Any(p => p.Groups.Any(q => q.Name == ConfigCache.AdminGroup) && p.IsSignupComplete)) {
var user = Users.Include(p => p.Groups).First(p => p.Groups.Any(q => q.Name == ConfigCache.AdminGroup));
Console.WriteLine($"* Admin user not activated yet, activate it on /FinishRegistration using this token: {user.GetSignupToken()}");
}
else {
Globals.NoActiveAdminUser = false;
}
}
}