diff --git a/VoidCat/Controllers/UploadController.cs b/VoidCat/Controllers/UploadController.cs index a409c66..f1d8ec4 100644 --- a/VoidCat/Controllers/UploadController.cs +++ b/VoidCat/Controllers/UploadController.cs @@ -30,7 +30,7 @@ namespace VoidCat.Controllers [HttpPost] [DisableRequestSizeLimit] [DisableFormValueModelBinding] - public async Task UploadFile() + public async Task UploadFile([FromQuery] bool cli = false) { try { @@ -45,13 +45,24 @@ namespace VoidCat.Controllers }; var digest = Request.Headers.GetHeader("V-Digest"); - var vf = await _storage.Ingress(new(Request.Body, meta, digest!), HttpContext.RequestAborted); - - return UploadResult.Success(vf); + var vf = await _storage.Ingress(new(Request.Body, meta) + { + Hash = digest + }, HttpContext.RequestAborted); + + if (cli) + { + var urlBuilder = new UriBuilder(Request.IsHttps ? "https" : "http", Request.Host.Host, Request.Host.Port ?? 80, + $"/d/{vf.Id.ToBase58()}"); + + return Content(urlBuilder.Uri.ToString(), "text/plain"); + } + + return Json(UploadResult.Success(vf)); } catch (Exception ex) { - return UploadResult.Error(ex.Message); + return Json(UploadResult.Error(ex.Message)); } } @@ -69,8 +80,9 @@ namespace VoidCat.Controllers var editSecret = Request.Headers.GetHeader("V-EditSecret"); var digest = Request.Headers.GetHeader("V-Digest"); - var vf = await _storage.Ingress(new(Request.Body, meta, digest!) + var vf = await _storage.Ingress(new(Request.Body, meta) { + Hash = digest, EditSecret = editSecret?.FromBase58Guid() ?? Guid.Empty, Id = gid }, HttpContext.RequestAborted); diff --git a/VoidCat/Model/IngressPayload.cs b/VoidCat/Model/IngressPayload.cs index de8c703..998b8cc 100644 --- a/VoidCat/Model/IngressPayload.cs +++ b/VoidCat/Model/IngressPayload.cs @@ -1,9 +1,10 @@ namespace VoidCat.Model; -public sealed record IngressPayload(Stream InStream, SecretVoidFileMeta Meta, string Hash) +public sealed record IngressPayload(Stream InStream, SecretVoidFileMeta Meta) { public Guid? Id { get; init; } public Guid? EditSecret { get; init; } - + public string? Hash { get; init; } + public bool IsAppend => Id.HasValue && EditSecret.HasValue; } \ No newline at end of file diff --git a/VoidCat/Services/Files/LocalDiskFileStorage.cs b/VoidCat/Services/Files/LocalDiskFileStorage.cs index fe792f7..9c03941 100644 --- a/VoidCat/Services/Files/LocalDiskFileStorage.cs +++ b/VoidCat/Services/Files/LocalDiskFileStorage.cs @@ -67,7 +67,7 @@ public class LocalDiskFileStore : IFileStore var (total, hash) = await IngressInternal(id, payload.InStream, fsTemp, cts); - if (!hash.Equals(payload.Hash, StringComparison.InvariantCultureIgnoreCase)) + if (payload.Hash != null && !hash.Equals(payload.Hash, StringComparison.InvariantCultureIgnoreCase)) { throw new CryptographicException("Invalid file hash"); } @@ -83,6 +83,7 @@ public class LocalDiskFileStore : IFileStore { meta = meta! with { + Digest = hash, Uploaded = DateTimeOffset.UtcNow, EditSecret = Guid.NewGuid(), Size = total diff --git a/VoidCat/spa/src/FilePreview.js b/VoidCat/spa/src/FilePreview.js index a31a460..db009e0 100644 --- a/VoidCat/spa/src/FilePreview.js +++ b/VoidCat/spa/src/FilePreview.js @@ -109,8 +109,8 @@ export function FilePreview() { {info ? ( - void.cat - {info.metadata?.name} - + void.cat - {info.metadata?.name ?? info.id} + {info.metadata?.description ? : null} {renderOpenGraphTags()}