diff --git a/.idea/.idea.Abyss/.idea/workspace.xml b/.idea/.idea.Abyss/.idea/workspace.xml index dc60824..85382ea 100644 --- a/.idea/.idea.Abyss/.idea/workspace.xml +++ b/.idea/.idea.Abyss/.idea/workspace.xml @@ -11,7 +11,10 @@ - + + + + diff --git a/Abyss/Components/Controllers/Media/ImageController.cs b/Abyss/Components/Controllers/Media/ImageController.cs index 650f6a4..633a03b 100644 --- a/Abyss/Components/Controllers/Media/ImageController.cs +++ b/Abyss/Components/Controllers/Media/ImageController.cs @@ -9,6 +9,8 @@ using Newtonsoft.Json.Linq; namespace Abyss.Components.Controllers.Media; using System.IO; +using Task = System.Threading.Tasks.Task; + [ApiController] [Route("api/[controller]")] public class ImageController(ILogger logger, ResourceService rs, ConfigureService config) : BaseController @@ -46,6 +48,27 @@ public class ImageController(ILogger logger, ResourceService rs return Ok(await System.IO.File.ReadAllTextAsync(d)); } + [HttpPost("bulkquery")] + public async Task QueryBulk([FromQuery] string token, [FromBody] string[] id) + { + List result = new List(); + + var db = id.Select(x => Helpers.SafePathCombine(ImageFolder, [x, "summary.json"])).ToArray(); + if(db.Any(x => x == null)) + return StatusCode(403, new { message = "403 Denied" }); + + var rb = db.Select(x => rs.Get(x!, token, Ip)).ToArray(); + bool[] results = await Task.WhenAll(rb); + + if(results.Any(x => !x)) + return StatusCode(403, new { message = "403 Denied" }); + + var rc = db.Select(x => System.IO.File.ReadAllTextAsync(x!)).ToArray(); + string[] rcs = await Task.WhenAll(rc); + + return Ok(rcs); + } + [HttpPost("{id}/bookmark")] public async Task Bookmark(string id, string token, [FromBody] Bookmark bookmark) { diff --git a/Abyss/Components/Controllers/Media/VideoController.cs b/Abyss/Components/Controllers/Media/VideoController.cs index b5b4a5a..c9e4b9c 100644 --- a/Abyss/Components/Controllers/Media/VideoController.cs +++ b/Abyss/Components/Controllers/Media/VideoController.cs @@ -8,6 +8,8 @@ using Newtonsoft.Json; namespace Abyss.Components.Controllers.Media; +using Task = System.Threading.Tasks.Task; + [ApiController] [Route("api/[controller]")] public class VideoController(ILogger logger, ResourceService rs, ConfigureService config) : BaseController @@ -73,6 +75,27 @@ public class VideoController(ILogger logger, ResourceService rs return Ok(await System.IO.File.ReadAllTextAsync(d)); } + [HttpPost("{klass}/bulkquery")] + public async Task QueryBulk([FromQuery] string token, [FromBody] string[] id, [FromRoute] string klass) + { + List result = new List(); + + var db = id.Select(x => Helpers.SafePathCombine(VideoFolder, [klass, x, "summary.json"])).ToArray(); + if(db.Any(x => x == null)) + return BadRequest(); + + var rb = db.Select(x => rs.Get(x!, token, Ip)).ToArray(); + bool[] results = await Task.WhenAll(rb); + + if(results.Any(x => !x)) + return StatusCode(403, new { message = "403 Denied" }); + + var rc = db.Select(x => System.IO.File.ReadAllTextAsync(x!)).ToArray(); + string[] rcs = await Task.WhenAll(rc); + + return Ok(rcs); + } + [HttpGet("{klass}/{id}/cover")] public async Task Cover(string klass, string id, string token) { @@ -82,8 +105,6 @@ public class VideoController(ILogger logger, ResourceService rs var r = await rs.Get(d, token, Ip); if (!r) return StatusCode(403, new { message = "403 Denied" }); - _logger.LogInformation($"Cover found for {id}"); - return PhysicalFile(d, "image/jpeg", enableRangeProcessing: true); } diff --git a/Abyss/Components/Services/AbyssService.cs b/Abyss/Components/Services/AbyssService.cs index 98ae16b..2107fcb 100644 --- a/Abyss/Components/Services/AbyssService.cs +++ b/Abyss/Components/Services/AbyssService.cs @@ -41,6 +41,7 @@ public class AbyssService(ILogger logger, ConfigureService config) int bytesRead = await upstream.ReadAsync(buffer, 0, buffer.Length, token); if (bytesRead == 0) break; + await client.WriteAsync(buffer, 0, bytesRead, token); } }); diff --git a/Abyss/Components/Tools/AbyssStream.cs b/Abyss/Components/Tools/AbyssStream.cs index cca67e5..566d015 100644 --- a/Abyss/Components/Tools/AbyssStream.cs +++ b/Abyss/Components/Tools/AbyssStream.cs @@ -5,7 +5,7 @@ using System.Buffers; using System.Buffers.Binary; using System.Collections.Concurrent; - +using System.Data; using System.Net.Sockets; using System.Runtime.InteropServices; using System.Security.Cryptography; @@ -16,6 +16,8 @@ using ChaCha20Poly1305 = System.Security.Cryptography.ChaCha20Poly1305; namespace Abyss.Components.Tools { + // TODO: Since C25519 has already been used for user authentication, + // TODO: why not use that public key to verify user identity when establishing a secure channel here? public sealed class AbyssStream : NetworkStream, IDisposable { private const int PublicKeyLength = 32;