From 77d3c741b1a28b161a78145aed07d2b17791d946 Mon Sep 17 00:00:00 2001 From: Elias Jansson Date: Tue, 3 Jun 2025 22:35:37 +0200 Subject: [PATCH] Stringbuilder to handle passwords --- Aberwyn/Controllers/SetupApiController.cs | 11 ++- Aberwyn/Controllers/SetupController.cs | 99 +++++++++++++---------- Aberwyn/Infrastructure/setup.json | 11 +++ 3 files changed, 75 insertions(+), 46 deletions(-) create mode 100644 Aberwyn/Infrastructure/setup.json diff --git a/Aberwyn/Controllers/SetupApiController.cs b/Aberwyn/Controllers/SetupApiController.cs index 0bc3415..bb8c5f1 100644 --- a/Aberwyn/Controllers/SetupApiController.cs +++ b/Aberwyn/Controllers/SetupApiController.cs @@ -12,9 +12,16 @@ namespace Aberwyn.Controllers { try { - var baseConnStr = $"server={request.Host};port={request.Port};user={request.User};password={request.Pass};"; + var builder = new MySqlConnectionStringBuilder + { + Server = request.Host, + Port = uint.Parse(request.Port), + UserID = request.User, + Password = request.Pass, + Database = "information_schema" + }; - using (var conn = new MySqlConnection(baseConnStr + "database=information_schema;")) + using (var conn = new MySqlConnection(builder.ConnectionString)) { conn.Open(); diff --git a/Aberwyn/Controllers/SetupController.cs b/Aberwyn/Controllers/SetupController.cs index d5a3d9a..568f2dc 100644 --- a/Aberwyn/Controllers/SetupController.cs +++ b/Aberwyn/Controllers/SetupController.cs @@ -1,37 +1,35 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc.Filters; +using Microsoft.EntityFrameworkCore; +using MySql.Data.MySqlClient; +using System.Text.Json; +using Aberwyn.Data; +using Aberwyn.Models; namespace Aberwyn.Controllers { - using System.Text.Json; - using System.IO; - using Aberwyn.Models; - using Microsoft.AspNetCore.Mvc.Filters; - using MySql.Data.MySqlClient; - using Aberwyn.Data; - using Microsoft.EntityFrameworkCore; - [Route("setup")] public class SetupController : Controller { private readonly IWebHostEnvironment _env; + private readonly ILogger _logger; + + public SetupController(IWebHostEnvironment env, ILogger logger) + { + _env = env; + _logger = logger; + } public override void OnActionExecuting(ActionExecutingContext context) { ViewBag.IsSetupMode = true; base.OnActionExecuting(context); } - public SetupController(IWebHostEnvironment env) - { - _env = env; - } [HttpGet] - public IActionResult Index() - { - return View(new SetupSettings()); - } + public IActionResult Index() => View(new SetupSettings()); [Authorize(Roles = "Admin")] [HttpPost("reset")] @@ -58,7 +56,6 @@ namespace Aberwyn.Controllers return RedirectToAction("Index"); } - [HttpPost("")] public async Task Setup([FromBody] SetupSettings model) { @@ -73,9 +70,18 @@ namespace Aberwyn.Controllers try { - // Skapa databasen om den inte finns - var baseConnStr = $"server={model.DbHost};port={model.DbPort};user={model.DbUser};password={model.DbPassword};"; - using (var conn = new MySqlConnection(baseConnStr + "database=information_schema;")) + // Bygg connection string säkert + var baseConnBuilder = new MySqlConnectionStringBuilder + { + Server = model.DbHost, + Port = (uint)model.DbPort, + UserID = model.DbUser, + Password = model.DbPassword, + Database = "information_schema" + }; + + // Kontrollera om databasen redan finns + using (var conn = new MySqlConnection(baseConnBuilder.ConnectionString)) { conn.Open(); var cmd = new MySqlCommand("SELECT SCHEMA_NAME FROM SCHEMATA WHERE SCHEMA_NAME = @dbName", conn); @@ -91,26 +97,41 @@ namespace Aberwyn.Controllers } catch (Exception ex) { + _logger.LogError(ex, "Kunde inte skapa databasen."); return BadRequest(new { error = "Databasen finns inte och kunde inte skapas.", details = ex.Message }); } } - } - // Bygg services temporärt för att skapa admin - var connectionString = $"server={model.DbHost};port={model.DbPort};database={model.DbName};user={model.DbUser};password={model.DbPassword}"; - var tempProvider = SetupService.BuildTemporaryServices(connectionString); + // Bygg EF-connection + var efConnBuilder = new MySqlConnectionStringBuilder + { + Server = model.DbHost, + Port = (uint)model.DbPort, + UserID = model.DbUser, + Password = model.DbPassword, + Database = model.DbName + }; + var tempProvider = SetupService.BuildTemporaryServices(efConnBuilder.ConnectionString); using var scope = tempProvider.CreateScope(); - // Skapa databastabeller via EF + // Skapa databastabeller var db = scope.ServiceProvider.GetRequiredService(); await db.Database.MigrateAsync(); + // Sätt konfig-flagga tidigt + model.IsConfigured = true; + + // Spara setup.json + var filePath = Path.Combine(_env.ContentRootPath, "infrastructure", "setup.json"); + var json = JsonSerializer.Serialize(model, new JsonSerializerOptions { WriteIndented = true }); + System.IO.File.WriteAllText(filePath, json); + + // Roller och admin var userManager = scope.ServiceProvider.GetRequiredService>(); var roleManager = scope.ServiceProvider.GetRequiredService>(); - // Skapa roller string[] roles = { "Admin", "Chef", "Budget" }; foreach (var role in roles) { @@ -118,42 +139,32 @@ namespace Aberwyn.Controllers await roleManager.CreateAsync(new IdentityRole(role)); } - // Skapa adminanvändare - var adminUser = new ApplicationUser - { - UserName = model.AdminUsername, - Email = model.AdminEmail - }; - var existingUser = await userManager.FindByNameAsync(model.AdminUsername); if (existingUser == null) { + var adminUser = new ApplicationUser + { + UserName = model.AdminUsername, + Email = model.AdminEmail, + EmailConfirmed = true + }; + var result = await userManager.CreateAsync(adminUser, model.AdminPassword); if (!result.Succeeded) - { return BadRequest(new { error = "Kunde inte skapa administratör", details = result.Errors }); - } await userManager.AddToRoleAsync(adminUser, "Admin"); } - model.IsConfigured = true; - - // Spara inställningarna - var json = JsonSerializer.Serialize(model, new JsonSerializerOptions { WriteIndented = true }); - var filePath = Path.Combine(_env.ContentRootPath, "infrastructure", "setup.json"); - System.IO.File.WriteAllText(filePath, json); - return Ok(new { message = "Installation slutförd!" }); } catch (Exception ex) { + _logger.LogError(ex, "Fel vid installation."); return BadRequest(new { error = "Fel vid installation", details = ex.Message }); } } public IActionResult SetupComplete() => View(); } - - } diff --git a/Aberwyn/Infrastructure/setup.json b/Aberwyn/Infrastructure/setup.json new file mode 100644 index 0000000..48eaad4 --- /dev/null +++ b/Aberwyn/Infrastructure/setup.json @@ -0,0 +1,11 @@ +{ + "AdminUsername": "admin", + "AdminEmail": "admin@localhost", + "AdminPassword": "Admin123!", + "IsConfigured": false, + "DbHost": null, + "DbPort": 3306, + "DbName": null, + "DbUser": null, + "DbPassword": null +} \ No newline at end of file