using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Logging; using AyaNova.Models; using AyaNova.Api.ControllerHelpers; using AyaNova.Biz; namespace AyaNova.Api.Controllers { /// /// License route /// [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] [Authorize] public class LicenseController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; private readonly ApiServerState serverState; /// /// ctor /// /// /// /// public LicenseController(AyContext dbcontext, ILogger logger, ApiServerState apiServerState) { ct = dbcontext; log = logger; serverState = apiServerState; } /// /// Get License info /// /// Information about the currently installed license in AyaNova [HttpGet()] public ActionResult GetLicenseInfo() { if (serverState.IsClosed) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.License)) { return StatusCode(403, new ApiNotAuthorizedResponse()); } var ret = AyaNova.Core.License.LicenseInfoAsJson; return Ok(ApiOkResponse.Response(ret, true)); } /// /// Get Trial status of license /// /// True if a trial license [AllowAnonymous] [HttpGet("trial")] public ActionResult GetTrialFlag() { //note: this route is called by the client as the first action so it also acts like a ping to see if the server is up as well if (serverState.IsClosed) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); return Ok(ApiOkResponse.Response(AyaNova.Core.License.ActiveKey.TrialLicense, true)); } /// /// Fetch license /// /// Posting to this route causes AyaNova to attempt to refresh it's license /// from the AyaNova license server /// /// On success returns information about the currently installed license in AyaNova [HttpPost] public async Task FetchLicense() { if (serverState.IsClosed) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); if (!Authorized.HasCreateRole(HttpContext.Items, AyaType.License)) { return StatusCode(403, new ApiNotAuthorizedResponse()); } if (!ModelState.IsValid) { return BadRequest(new ApiErrorResponse(ModelState)); } try { await AyaNova.Core.License.FetchKeyAsync(serverState, ct, log); } catch (Exception ex) { Exception rootex = ex; while (rootex.InnerException != null) { rootex = rootex.InnerException; } if (rootex.Message.Contains("E1020")) { return BadRequest(new ApiErrorResponse(ApiErrorCode.INVALID_OPERATION, "LICENSE_KEY", rootex.Message)); } else { throw ex; } } var ret = AyaNova.Core.License.LicenseInfoAsJson; //Log await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.License, AyaEvent.LicenseFetch), ct); return Ok(ApiOkResponse.Response(ret, true)); } /// /// Request trial license /// /// Posting to this route causes AyaNova to request a trial license key from the AyaNova license server /// Database must be empty and unlicensed or trial license /// /// /// HTTP 204 No Content result code on success or fail code with explanation [HttpPost("trial")] public async Task RequestTrial([FromBody] dtoTrialRequestData requestData) { if (serverState.IsClosed) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); if (!Authorized.HasCreateRole(HttpContext.Items, AyaType.License)) { return StatusCode(403, new ApiNotAuthorizedResponse()); } if (!ModelState.IsValid) { return BadRequest(new ApiErrorResponse(ModelState)); } if (!await AyaNova.Util.DbUtil.DBIsEmptyAsync(ct, log)) { return BadRequest(new ApiErrorResponse(ApiErrorCode.INVALID_OPERATION, null, "Only an empty AyaNova database can request a trial key. Erase the database to proceed with a new trial.")); } if (!AyaNova.Core.License.ActiveKey.IsEmpty && !AyaNova.Core.License.ActiveKey.TrialLicense) { return BadRequest(new ApiErrorResponse(ApiErrorCode.INVALID_OPERATION, null, "There is an active registered license. Only an unlicensed or trial license database can request a trial key.")); } //Send the request to RockFish here (or at least start the job to do it in which case return Accepted instead of no content and update comment above) var ret = await Core.License.RequestTrialAsync(requestData.EmailAddress, requestData.RegisteredTo, log); //Log await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.License, AyaEvent.LicenseTrialRequest), ct); return Ok(ApiOkResponse.Response(ret, true)); } //------------------------------------------------------ public class dtoTrialRequestData { [System.ComponentModel.DataAnnotations.Required] public string RegisteredTo { get; set; } [System.ComponentModel.DataAnnotations.Required, System.ComponentModel.DataAnnotations.EmailAddress] public string EmailAddress { get; set; } } }//eoc }//eons