using API.Hashing; using API.Hashing.Interfaces; using DAL.Contexts; using DAL.Models; using DAL.Values; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; using MySql.Data.MySqlClient; using Mysqlx.Session; using System.Configuration; using System.Data.Common; namespace Setup { internal class Program { public static bool lineIsYes(string? input) { if (input == null) return false; input = input.Trim().ToLower(); switch (input) { case "y": case "yes": return true; case "n": case "no": return false; default: return false; } } public static string getStringWithConfirmation(string message) { while (true) { Console.Write(message); string? input = Console.ReadLine(); Console.WriteLine(); if (input == null) continue; Console.Write($"Is '{input}' correct? [Y/N]: "); if (lineIsYes(Console.ReadLine())) { Console.WriteLine(); return input; } Console.WriteLine(); } } public static void Main(string[] args) { Console.Write("Entering setup. Only run this once. Will reinstate database. Continue? [Y/N]: "); if (!lineIsYes(Console.ReadLine())) System.Environment.Exit(0); Console.WriteLine(); string connectionString = getStringWithConfirmation("Enter connection string: "); DbContextOptionsBuilder optionsBuilder = new DbContextOptionsBuilder(); optionsBuilder.UseMySQL(connectionString); SASGContext context = new SASGContext(optionsBuilder.Options); string firstName = getStringWithConfirmation("Enter admin first name: "); string lastname = getStringWithConfirmation("Enter admin last name: "); PhoneNumber phoneNumber = getStringWithConfirmation("Enter admin phone number: "); string unHashedPassword = getStringWithConfirmation("Enter admin password: "); HashingType defaultHashingType = Enum.Parse( getStringWithConfirmation($"Enter default hashing type [{String.Join(", ", Enum.GetNames(typeof(HashingType)))}]: ")); IHashingFactory hashingFactory = new HashingFactory(); IHashingAlgorithm algorithm = hashingFactory.getAlgorithm(defaultHashingType) ?? throw new InvalidOperationException(); byte[] salt; string password = algorithm.hash(unHashedPassword, out salt); Console.Write("About to touch db. Continue? [Y/N]: "); if (!lineIsYes(Console.ReadLine())) System.Environment.Exit(0); MySqlConnection conn = (MySqlConnection) context.Database.GetDbConnection(); conn.Open(); using (MySqlCommand reader = new MySqlCommand(File.ReadAllText("Filler/Permissions.sql"), conn)) { reader.ExecuteNonQuery(); } using (MySqlCommand reader = new MySqlCommand(File.ReadAllText("Filler/Grants.sql"), conn)) { reader.ExecuteNonQuery(); } conn.Close(); context.users.Add(new User { firstName = firstName, lastName = lastname, phoneNumber = phoneNumber, password = password, salt = salt, hashingType = defaultHashingType, permissionId = 1, }); context.SaveChanges(); } } }