diff --git a/docs/8.0/ayanova/docs/ops-log.md b/docs/8.0/ayanova/docs/ops-log.md index a766a755..d3e7e6cc 100644 --- a/docs/8.0/ayanova/docs/ops-log.md +++ b/docs/8.0/ayanova/docs/ops-log.md @@ -1,3 +1,4 @@ # OPS-LOG Placeholder [UNDER CONSTRUCTION] + diff --git a/server/AyaNova/Controllers/LogFilesController.cs b/server/AyaNova/Controllers/LogFilesController.cs index 85817f6c..b624b510 100644 --- a/server/AyaNova/Controllers/LogFilesController.cs +++ b/server/AyaNova/Controllers/LogFilesController.cs @@ -8,7 +8,8 @@ using AyaNova.Models; using AyaNova.Util; using AyaNova.Api.ControllerHelpers; using AyaNova.Biz; - +using System.Threading.Tasks; +using System; namespace AyaNova.Api.Controllers { @@ -109,25 +110,44 @@ namespace AyaNova.Api.Controllers //Iterate all log files and build return var files = System.IO.Directory.GetFiles(ServerBootConfig.AYANOVA_LOG_PATH, "log-ayanova*.txt"); - // Newtonsoft.Json.Linq.JObject o = Newtonsoft.Json.Linq.JObject.FromObject(new - // { - // logs = - // from f in files - // orderby f - // select new - // { - // logName = System.IO.Path.GetFileName(f) - // } - // }); - - var ret = files.Where(z => !z.EndsWith("ayanova.txt")).OrderByDescending(z => z).Select(z => System.IO.Path.GetFileName(z)).ToList(); ret.Insert(0, "log-ayanova.txt"); return Ok(ApiOkResponse.Response(ret)); } + /// + /// Download log + /// + /// + /// download token + /// A single log file + [AllowAnonymous] + [HttpGet("download/{logname}")] + public async Task DownloadLog([FromRoute] string logname, [FromQuery] string t) + { + if (serverState.IsClosed) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + + var user = await UserBiz.ValidateDownloadTokenAndReturnUserAsync(t, ct); + if (user == null) + { + await Task.Delay(AyaNova.Util.ServerBootConfig.FAILED_AUTH_DELAY);//DOS protection + return StatusCode(401, new ApiErrorResponse(ApiErrorCode.AUTHENTICATION_FAILED)); + } + + if (!Authorized.HasReadFullRole(user.Roles, AyaType.LogFile)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + + var logFilePath = System.IO.Path.Combine(ServerBootConfig.AYANOVA_LOG_PATH, logname); + if (!System.IO.File.Exists(logFilePath)) + return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + + return PhysicalFile(logFilePath, "text/plain", $"{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}-{logname}"); + } //------------ diff --git a/server/AyaNova/resource/de.json b/server/AyaNova/resource/de.json index fa0fafc0..193c699d 100644 --- a/server/AyaNova/resource/de.json +++ b/server/AyaNova/resource/de.json @@ -2309,5 +2309,6 @@ "CompanyEmail": "Email", "CompanyPhone1": "Geschäftstelefon", "CompanyPhone2": "Telefon 2", - "RenderingReport":"Berichterstellung im Gange" + "RenderingReport":"Berichterstellung im Gange", + "Download":"Herunterladen" } \ No newline at end of file diff --git a/server/AyaNova/resource/en.json b/server/AyaNova/resource/en.json index 7fa0b3f1..caa9efcc 100644 --- a/server/AyaNova/resource/en.json +++ b/server/AyaNova/resource/en.json @@ -2309,5 +2309,6 @@ "CompanyEmail": "Email", "CompanyPhone1": "Business phone number", "CompanyPhone2": "Phone 2", - "RenderingReport":"Generating report" + "RenderingReport":"Generating report", + "Download":"Download" } \ No newline at end of file diff --git a/server/AyaNova/resource/es.json b/server/AyaNova/resource/es.json index 4482abe4..33bd6fb5 100644 --- a/server/AyaNova/resource/es.json +++ b/server/AyaNova/resource/es.json @@ -2309,5 +2309,6 @@ "CompanyEmail": "Email", "CompanyPhone1": "Teléfono", "CompanyPhone2": "Teléfono 2", - "RenderingReport":"Generación de informes en curso" + "RenderingReport":"Generación de informes en curso", + "Download":"Descargar" } \ No newline at end of file diff --git a/server/AyaNova/resource/fr.json b/server/AyaNova/resource/fr.json index 71ee837e..c884c864 100644 --- a/server/AyaNova/resource/fr.json +++ b/server/AyaNova/resource/fr.json @@ -2309,5 +2309,6 @@ "CompanyEmail": "Email", "CompanyPhone1": "Phone 1", "CompanyPhone2": "Phone 2", - "RenderingReport":"Génération de rapport en cours" + "RenderingReport":"Génération de rapport en cours", + "Download":"Télécharger" } \ No newline at end of file