using System.Security.Cryptography; using AppContext.Entities; using Microsoft.AspNetCore.Cryptography.KeyDerivation; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; namespace AppContext; public class AppContext : DbContext { public DbSet Users { get; init; } public DbSet Tactics { get; init; } public DbSet Teams { get; init; } public DbSet Members { get; init; } public DbSet TacticSteps { get; set; } public DbSet SharedTactics { get; set; } public AppContext() { } public AppContext(DbContextOptions options) : base(options) { } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { base.OnConfiguring(optionsBuilder); if (optionsBuilder.IsConfigured) { return; } var pgsqliteDsn = Environment.GetEnvironmentVariable("PGSQL_DSN"); if (pgsqliteDsn != null) { optionsBuilder.UseNpgsql(pgsqliteDsn); } else { optionsBuilder.UseSqlite("Data Source=database.db"); } } protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); builder.Entity() .Property(e => e.Password) .HasConversion( v => HashString(v), v => v ); builder.Entity() .HasKey("UserId", "TeamId"); } private static string HashString(string str) { byte[] salt = RandomNumberGenerator.GetBytes(128 / 8); return Convert.ToBase64String(KeyDerivation.Pbkdf2( password: str, salt, prf: KeyDerivationPrf.HMACSHA256, iterationCount: 50000, numBytesRequested: 256 / 8 )); } }