Support plain uploads

This commit is contained in:
Kieran 2022-02-28 20:47:57 +00:00
parent e2449d3384
commit c7b668fbe8
Signed by: Kieran
GPG Key ID: DE71CEB3925BE941
4 changed files with 25 additions and 11 deletions

View File

@ -30,7 +30,7 @@ namespace VoidCat.Controllers
[HttpPost] [HttpPost]
[DisableRequestSizeLimit] [DisableRequestSizeLimit]
[DisableFormValueModelBinding] [DisableFormValueModelBinding]
public async Task<UploadResult> UploadFile() public async Task<IActionResult> UploadFile([FromQuery] bool cli = false)
{ {
try try
{ {
@ -45,13 +45,24 @@ namespace VoidCat.Controllers
}; };
var digest = Request.Headers.GetHeader("V-Digest"); var digest = Request.Headers.GetHeader("V-Digest");
var vf = await _storage.Ingress(new(Request.Body, meta, digest!), HttpContext.RequestAborted); var vf = await _storage.Ingress(new(Request.Body, meta)
{
return UploadResult.Success(vf); 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) 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 editSecret = Request.Headers.GetHeader("V-EditSecret");
var digest = Request.Headers.GetHeader("V-Digest"); 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, EditSecret = editSecret?.FromBase58Guid() ?? Guid.Empty,
Id = gid Id = gid
}, HttpContext.RequestAborted); }, HttpContext.RequestAborted);

View File

@ -1,9 +1,10 @@
namespace VoidCat.Model; 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? Id { get; init; }
public Guid? EditSecret { get; init; } public Guid? EditSecret { get; init; }
public string? Hash { get; init; }
public bool IsAppend => Id.HasValue && EditSecret.HasValue; public bool IsAppend => Id.HasValue && EditSecret.HasValue;
} }

View File

@ -67,7 +67,7 @@ public class LocalDiskFileStore : IFileStore
var (total, hash) = await IngressInternal(id, payload.InStream, fsTemp, cts); 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"); throw new CryptographicException("Invalid file hash");
} }
@ -83,6 +83,7 @@ public class LocalDiskFileStore : IFileStore
{ {
meta = meta! with meta = meta! with
{ {
Digest = hash,
Uploaded = DateTimeOffset.UtcNow, Uploaded = DateTimeOffset.UtcNow,
EditSecret = Guid.NewGuid(), EditSecret = Guid.NewGuid(),
Size = total Size = total

View File

@ -109,8 +109,8 @@ export function FilePreview() {
{info ? ( {info ? (
<Fragment> <Fragment>
<Helmet> <Helmet>
<title>void.cat - {info.metadata?.name}</title> <title>void.cat - {info.metadata?.name ?? info.id}</title>
<meta name="description" content={info.metadata?.description}/> {info.metadata?.description ? <meta name="description" content={info.metadata?.description}/> : null}
{renderOpenGraphTags()} {renderOpenGraphTags()}
</Helmet> </Helmet>
<div className="flex flex-center"> <div className="flex flex-center">