diff --git a/CodeLiturgy.Views/Application/Users/Auth/AuthManager.cs b/CodeLiturgy.Views/Application/Users/Auth/AuthManager.cs index c60ee92..31fd2be 100644 --- a/CodeLiturgy.Views/Application/Users/Auth/AuthManager.cs +++ b/CodeLiturgy.Views/Application/Users/Auth/AuthManager.cs @@ -73,7 +73,7 @@ namespace CodeLiturgy.Data.Auth.Context.Users var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme); identity.AddClaim(new Claim(ClaimTypes.Email, user.Email)); - identity.AddClaim(new Claim(ClaimTypes.MobilePhone, user.PhoneNumber)); + //identity.AddClaim(new Claim(ClaimTypes.MobilePhone, user.PhoneNumber)); identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id)); diff --git a/CodeLiturgy.Views/Augeas/AugeasManager.cs b/CodeLiturgy.Views/Augeas/AugeasManager.cs index 5dd2e58..23d3779 100644 --- a/CodeLiturgy.Views/Augeas/AugeasManager.cs +++ b/CodeLiturgy.Views/Augeas/AugeasManager.cs @@ -2,26 +2,49 @@ using Sharp.Augeas; namespace CodeLiturgy.Views.Augeas { + /// + /// Manager class for Augeas. + /// public class AugeasManager { private readonly Sharp.Augeas.Augeas _augeas; private AugSettings _augSettings; + /// + /// Cached List with the current apache configurations. + /// public List CurrentApacheConfigurations => _currentApacheConfigurations; private List _currentApacheConfigurations; - private const string _apachePath = "/etc/apache2/sites-available"; + private const string ApachePath = "/etc/apache2/sites-available"; + /// + /// Augeas Manager constructor. + /// public AugeasManager() { _augSettings = AugeasExtensions.GetSettings(); _augeas = new Sharp.Augeas.Augeas(_augSettings); RefreshApacheConfigurations(); } + + /// + /// Write Changes to the disk + /// + /// Returns true if the save was successful. + public bool Save() + { + return _augeas.Save(); + } + /// + /// Gets a preview of the configuration. + /// + /// + /// public string GetPreview(string site) { @@ -30,12 +53,18 @@ namespace CodeLiturgy.Views.Augeas return string.Empty; } - var siteFullPath = $"{_apachePath}/{site}"; + var siteFullPath = $"{ApachePath}/{site}"; _augeas.LoadFile(siteFullPath); var preview = _augeas.GetPreview($"/files{siteFullPath}"); return preview; } + /// + /// Gets available Apache configurations. + /// + /// + /// + /// public List GetApacheAvailableConfigurations(int skip, int take) { var result = _currentApacheConfigurations @@ -47,6 +76,11 @@ namespace CodeLiturgy.Views.Augeas } + /// + /// Gets virtual host tree of a site. + /// + /// Name of the site. + /// public SuperNode GetVirtualHostTree(string site) { if (!_currentApacheConfigurations.Contains(site)) @@ -54,7 +88,7 @@ namespace CodeLiturgy.Views.Augeas return null; } - var siteFullPath = $"{_apachePath}/{site}"; + var siteFullPath = $"{ApachePath}/{site}"; _augeas.LoadFile(siteFullPath); var tree = _augeas.GetTree("VirtualHost",$"/files{siteFullPath}/VirtualHost/*"); return tree; @@ -63,7 +97,7 @@ namespace CodeLiturgy.Views.Augeas private void RefreshApacheConfigurations() { - var apacheDir = _augSettings.root + _apachePath; + var apacheDir = _augSettings.root + ApachePath; DirectoryInfo d = new DirectoryInfo(apacheDir); FileInfo[] files = d.GetFiles("*.conf"); @@ -74,6 +108,19 @@ namespace CodeLiturgy.Views.Augeas _currentApacheConfigurations = result; } + + /// + /// Gets a directive. + /// + /// + /// + /// + public Directive GetDirective(string siteName, string directiveName) + { + var tree = GetVirtualHostTree(siteName); + var directive = tree.GetDirective(directiveName); + return directive; + } } } diff --git a/CodeLiturgy.Views/Augeas/root/etc/apache2/sites-available/01-git.codeliturgy.com.conf b/CodeLiturgy.Views/Augeas/root/etc/apache2/sites-available/01-git.codeliturgy.com.conf index 192b260..29039b3 100644 --- a/CodeLiturgy.Views/Augeas/root/etc/apache2/sites-available/01-git.codeliturgy.com.conf +++ b/CodeLiturgy.Views/Augeas/root/etc/apache2/sites-available/01-git.codeliturgy.com.conf @@ -1,5 +1,5 @@ - ServerName git.example2.com + ServerName git.megacode3.com ServerAlias www.git.example2.com SSLEngine on SSLProxyEngine on diff --git a/CodeLiturgy.Views/Controllers/ApacheController.cs b/CodeLiturgy.Views/Controllers/ApacheController.cs index f8017d4..d791ce1 100644 --- a/CodeLiturgy.Views/Controllers/ApacheController.cs +++ b/CodeLiturgy.Views/Controllers/ApacheController.cs @@ -8,6 +8,9 @@ using System.Text.Json; namespace CodeLiturgy.Views.Controllers { + /// + /// Controller responsible to manage Apache configurations. + /// [ApiController] [Authorize] public class ApacheController : ControllerBase @@ -16,6 +19,13 @@ namespace CodeLiturgy.Views.Controllers private readonly SiteDbContext _siteDbContext; private readonly AugeasManager _augeasManager; + /// + /// Apache controller constructor. + /// + /// + /// + /// + /// public ApacheController( ApplicationUserManager userManager, ILogger logger, @@ -27,6 +37,13 @@ namespace CodeLiturgy.Views.Controllers _augeasManager = augeasManager; } + /// + /// Gets site in /etc/apache/sites-available + /// + /// + /// + /// + /// [HttpGet("/api/apache")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] @@ -42,6 +59,11 @@ namespace CodeLiturgy.Views.Controllers return Ok(sites); } + /// + /// Gets a preview of the configuration of a certain site. + /// + /// Site configuration filename. + /// [HttpGet("/api/apache/preview/{site}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] @@ -56,6 +78,11 @@ namespace CodeLiturgy.Views.Controllers return Ok(preview); } + /// + /// Gets tree object of a certain site. + /// + /// Site configuration file. + /// [HttpGet("/api/apache/tree/{site}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] @@ -70,6 +97,60 @@ namespace CodeLiturgy.Views.Controllers return Ok(tree); } + /// + /// Gets a directive. + /// + /// + /// + /// + [HttpGet("/api/apache/tree/{site}/directive/{directive}")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + + public ActionResult GetDirective( + string site, + string directive) + { + var rDirective = _augeasManager.GetDirective(site, directive); + return Ok(rDirective); + } + /// + /// Sets a new value for the directive. The first word is the directive value, the following words correspond to the arguments. + /// + /// Site configuration filename. + /// + /// + /// + [HttpPost("/api/apache/tree/{site}/directive/{directive}")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + + public ActionResult SetDirective( + string site, + string directive, + string newValue) + { + var rDirective = _augeasManager.GetDirective(site, directive); + rDirective?.Set(newValue); + + return Ok(rDirective); + } + + /// + /// Persists changes to the configurations to disk. + /// + /// + [ProducesResponseType(StatusCodes.Status201Created)] + [ProducesResponseType(StatusCodes.Status406NotAcceptable)] + [HttpGet("save")] + public ActionResult Save() + { + var sucess = _augeasManager.Save(); + + return Ok(sucess); + } } } diff --git a/CodeLiturgy.Views/Controllers/AuthController.cs b/CodeLiturgy.Views/Controllers/AuthController.cs index 561c4b0..c6e9116 100644 --- a/CodeLiturgy.Views/Controllers/AuthController.cs +++ b/CodeLiturgy.Views/Controllers/AuthController.cs @@ -1,10 +1,12 @@ using System.Security.Claims; +using CodeLiturgy.Data.Application.Users; using CodeLiturgy.Data.Auth; using CodeLiturgy.Data.Auth.Context.Users; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; using Controller = Microsoft.AspNetCore.Mvc.Controller; namespace CodeLiturgy.Views.Controllers @@ -34,6 +36,7 @@ namespace CodeLiturgy.Views.Controllers [ActionName("LoginAction")] public async Task LoginAction(LoginRequest loginRequest) { + var (identity,success) = await _authManager.DoLogin(loginRequest); @@ -56,13 +59,45 @@ namespace CodeLiturgy.Views.Controllers return Redirect(RootLocation); } + return Redirect(RootLocation); } - public IActionResult Login() + public async Task Login() { +#if DEBUG + // Check if the debug user exists, if not create it + if (!await _userManager.Users.AnyAsync(x => x.Email == "debuguser@admin.com")) + { + + var registerRequest = new RegisterRequest(); + registerRequest.Email = "debuguser@admin.com"; + registerRequest.Username = "debuguser"; + registerRequest.Password = "debuguser"; + + await _authManager.CreateUserAsync(registerRequest); + + } + var (identity,success) = await _authManager.DoLogin(new LoginRequest{Email = "debuguser@admin.com", Password = "debuguser"}); + + await HttpContext.SignInAsync( + CookieAuthenticationDefaults.AuthenticationScheme, + new ClaimsPrincipal(identity), + new AuthenticationProperties + { + IsPersistent = true, + ExpiresUtc = DateTime.UtcNow.Add(SessionConstants.DefaultSessionMaxAge) + }); + + HttpContext.Session.SetString("hello", "world"); + + return Redirect(RootLocation); + +#else this.HandleGlobalization(); return View(); +#endif + } public async Task Account() diff --git a/CodeLiturgy.Views/Controllers/SitesController.cs b/CodeLiturgy.Views/Controllers/SitesController.cs index 47484b9..f9c10e6 100644 --- a/CodeLiturgy.Views/Controllers/SitesController.cs +++ b/CodeLiturgy.Views/Controllers/SitesController.cs @@ -1,12 +1,16 @@ using CodeLiturgy.Data.Auth.Context.Users; using CodeLiturgy.Data.Application; using CodeLiturgy.Domain; +using CodeLiturgy.Views.Augeas; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace CodeLiturgy.Views.Controllers { + /// + /// Controller responsible for managing websites. + /// [Route("api/sites")] [ApiController] [Authorize] @@ -16,14 +20,34 @@ namespace CodeLiturgy.Views.Controllers private ApplicationUserManager _userManager; private ILogger _logger; private readonly SiteDbContext _siteDbContext; + private readonly AugeasManager _augeasManager; - public SitesController(ApplicationUserManager userManager, ILogger logger, SiteDbContext siteDbContext) + /// + /// Sites controller constructor. + /// + /// + /// + /// + /// + public SitesController( + ApplicationUserManager userManager, + ILogger logger, + SiteDbContext siteDbContext, + AugeasManager augeasManager) { _logger = logger; _userManager = userManager; _siteDbContext = siteDbContext; + _augeasManager = augeasManager; } + /// + /// Gets the sites stored in the database. + /// + /// + /// + /// + /// [HttpGet] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] @@ -39,11 +63,11 @@ namespace CodeLiturgy.Views.Controllers return Ok(sites); } - + /// - /// Get Country by Id + /// Gets a site by Id. /// - /// ISO 3166-1 countryId numeric code + /// Site id. /// [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] @@ -62,7 +86,12 @@ namespace CodeLiturgy.Views.Controllers return new NotFoundResult(); } - /* + + /// + /// Adds a site to the database. + /// + /// + /// [ProducesResponseType(StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status406NotAcceptable)] [HttpPost] @@ -71,7 +100,8 @@ namespace CodeLiturgy.Views.Controllers var (success, site) = _siteDbContext.AddSite(siteToCreate); if (!success) return new BadRequestResult(); return CreatedAtRoute(nameof(GetSiteById), new {countryId = site.Id}, site); - }*/ + } + } } diff --git a/CodeLiturgy.Views/Models/ModelBuilderExtensions.cs b/CodeLiturgy.Views/Models/ModelBuilderExtensions.cs index 32179b9..baf1cb9 100644 --- a/CodeLiturgy.Views/Models/ModelBuilderExtensions.cs +++ b/CodeLiturgy.Views/Models/ModelBuilderExtensions.cs @@ -29,6 +29,7 @@ namespace CodeLiturgy.Domain.Model //.ConfigureIdentityModel(); } + #endregion diff --git a/include/Sharp.Augeas b/include/Sharp.Augeas index eae24d1..607a30e 160000 --- a/include/Sharp.Augeas +++ b/include/Sharp.Augeas @@ -1 +1 @@ -Subproject commit eae24d1b142738f40597284a24d637ad51506c0c +Subproject commit 607a30e72876f829057dfa2d9f37733eb70879a3