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 options) : base(options) { } public virtual DbSet Networks { get; set; } = null!; public virtual DbSet Config { get; set; } = null!; public virtual DbSet Groups { get; set; } = null!; public virtual DbSet Users { get; set; } = null!; public virtual DbSet 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 { 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; } } }