Stringbuilder to handle passwords
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
@@ -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<SetupController> _logger;
|
||||
|
||||
public SetupController(IWebHostEnvironment env, ILogger<SetupController> 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<IActionResult> 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<ApplicationDbContext>();
|
||||
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<UserManager<ApplicationUser>>();
|
||||
var roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>();
|
||||
|
||||
// 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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
11
Aberwyn/Infrastructure/setup.json
Normal file
11
Aberwyn/Infrastructure/setup.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"AdminUsername": "admin",
|
||||
"AdminEmail": "admin@localhost",
|
||||
"AdminPassword": "Admin123!",
|
||||
"IsConfigured": false,
|
||||
"DbHost": null,
|
||||
"DbPort": 3306,
|
||||
"DbName": null,
|
||||
"DbUser": null,
|
||||
"DbPassword": null
|
||||
}
|
||||
Reference in New Issue
Block a user