using System; using System.Security.Cryptography; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Memory; using Mirea.Api.Endpoint.Common.Attributes; using Mirea.Api.Endpoint.Common.Exceptions; using Mirea.Api.Endpoint.Common.Interfaces; using Mirea.Api.Endpoint.Common.Services; using Mirea.Api.Endpoint.Configuration.General; using Mirea.Api.Endpoint.Configuration.General.Settings; using System; using System.Data; namespace Mirea.Api.Endpoint.Controllers.Configuration; [ApiVersion("1.0")] [ApiController] [MaintenanceModeIgnore] public class SetupController(ISetupToken setupToken, IMaintenanceModeNotConfigureService notConfigureService, IMemoryCache cache) : BaseController { private const string CacheGeneralKey = "config_part"; private GeneralConfig GeneralConfig { get => cache.Get(CacheGeneralKey) ?? new GeneralConfig(); set => cache.Set(CacheGeneralKey, value); } [HttpGet("GenerateToken")] [Localhost] public ActionResult GenerateToken() { if (!notConfigureService.IsMaintenanceMode) throw new ControllerArgumentException( "The token cannot be generated because the server has been configured. " + $"If you need to restart the configuration, then delete the \"{PathBuilder.Combine(GeneralConfig.FilePath)}\" file and restart the application."); var token = new byte[32]; RandomNumberGenerator.Create().GetBytes(token); setupToken.SetToken(token); return Ok(Convert.ToBase64String(token)); } [HttpGet("CheckToken")] public ActionResult CheckToken([FromQuery] string token) { if (!setupToken.MatchToken(Convert.FromBase64String(token))) return Unauthorized("The token is not valid"); Response.Cookies.Append("AuthToken", token, new CookieOptions { HttpOnly = false, Secure = false, Path = "/" }); return Ok(true); } private ActionResult SetDatabase(string connectionString, DbSettings.DatabaseEnum databaseType) where TConnection : class, IDbConnection, new() where TException : Exception { try { using var connection = new TConnection(); connection.ConnectionString = connectionString; connection.Open(); connection.Close(); var general = GeneralConfig; general.DbSettings = new DbSettings { ConnectionStringSql = connectionString, TypeDatabase = databaseType }; GeneralConfig = general; return Ok(true); } catch (TException ex) { throw new ControllerArgumentException($"Error when connecting: {ex.Message}"); } } }