diff --git a/VoidCat/Controllers/UploadController.cs b/VoidCat/Controllers/UploadController.cs
index 962eccb..d6be560 100644
--- a/VoidCat/Controllers/UploadController.cs
+++ b/VoidCat/Controllers/UploadController.cs
@@ -87,12 +87,13 @@ namespace VoidCat.Controllers
Name = filename,
Description = Request.Headers.GetHeader("V-Description"),
Digest = Request.Headers.GetHeader("V-Full-Digest"),
- Size = (ulong?)Request.ContentLength ?? 0UL,
+ Size = (ulong?) Request.ContentLength ?? 0UL,
Storage = store
};
var (segment, totalSegments) = ParseSegmentsHeader();
- var vf = await _storage.Ingress(new(Request.Body, meta, segment, totalSegments), HttpContext.RequestAborted);
+ var vf = await _storage.Ingress(new(Request.Body, meta, segment, totalSegments),
+ HttpContext.RequestAborted);
// save metadata
await _metadata.Set(vf.Id, vf.Metadata!);
@@ -343,7 +344,7 @@ namespace VoidCat.Controllers
public Guid EditSecret { get; init; }
public StrikePaymentConfig? Strike { get; init; }
-
+
public bool Required { get; init; }
}
-}
+}
\ No newline at end of file
diff --git a/VoidCat/VoidStartup.cs b/VoidCat/VoidStartup.cs
index d4a5816..c071560 100644
--- a/VoidCat/VoidStartup.cs
+++ b/VoidCat/VoidStartup.cs
@@ -122,6 +122,7 @@ public static class VoidStartup
{
p.AllowAnyMethod()
.AllowAnyHeader()
+ .AllowCredentials()
.WithOrigins(voidSettings.CorsOrigins.Select(a => a.OriginalString).ToArray());
});
});
diff --git a/VoidCat/spa/package.json b/VoidCat/spa/package.json
index 61bf663..12d2354 100644
--- a/VoidCat/spa/package.json
+++ b/VoidCat/spa/package.json
@@ -8,6 +8,7 @@
"@reduxjs/toolkit": "^1.7.2",
"crypto-js": "^4.1.1",
"feather-icons-react": "^0.5.0",
+ "http-proxy-middleware": "^2.0.6",
"moment": "^2.29.4",
"preval.macro": "^5.0.0",
"qrcode.react": "^1.0.1",
diff --git a/VoidCat/spa/src/Components/FileUpload/FileUpload.js b/VoidCat/spa/src/Components/FileUpload/FileUpload.js
index 2bfd09f..69fb7c1 100644
--- a/VoidCat/spa/src/Components/FileUpload/FileUpload.js
+++ b/VoidCat/spa/src/Components/FileUpload/FileUpload.js
@@ -40,45 +40,66 @@ export function FileUpload(props) {
}
async function doStreamUpload() {
+ setUState(UploadState.Hashing);
+ let hash = await digest(props.file);
+ calc.Reset();
let offset = 0;
+
+ async function readChunk(size) {
+ if (offset > props.file.size) {
+ return new Uint8Array(0);
+ }
+ let end = Math.min(offset + size, props.file.size);
+ let blob = props.file.slice(offset, end, props.file.type);
+ let data = await blob.arrayBuffer();
+ offset += data.byteLength;
+ return new Uint8Array(data);
+ }
+
let rs = new ReadableStream({
start: (controller) => {
-
+ console.log(controller);
+ setUState(UploadState.Uploading);
},
pull: async (controller) => {
- if (offset > props.file.size) {
- controller.cancel();
+ console.log(controller);
+ let chunk = await readChunk(controller.desiredSize);
+ if (chunk.byteLength === 0) {
+ controller.close();
+ return;
}
- let requestedSize = props.file.size / controller.desiredSize;
- console.log(`Reading ${requestedSize} Bytes`);
-
- let end = Math.min(offset + requestedSize, props.file.size);
- let blob = props.file.slice(offset, end, props.file.type);
- controller.enqueue(await blob.arrayBuffer());
- offset += blob.size;
+ calc.ReportLoaded(chunk.byteLength);
+ setSpeed(calc.RateWindow(5));
+ setProgress(offset / props.file.size);
+
+ controller.enqueue(chunk);
},
cancel: (reason) => {
-
- }
+ console.log(reason);
+ },
+ type: "bytes"
}, {
- highWaterMark: 100
+ highWaterMark: 1024 * 1024
});
- let req = await fetch("/upload", {
+ let req = await fetch("https://localhost:7195/upload", {
method: "POST",
+ mode: "cors",
body: rs,
headers: {
"Content-Type": "application/octet-stream",
"V-Content-Type": props.file.type,
- "V-Filename": props.file.name
- }
+ "V-Filename": props.file.name,
+ "V-Full-Digest": hash
+ },
+ duplex: 'half'
});
if (req.ok) {
let rsp = await req.json();
console.log(rsp);
- setResult(rsp);
+ handleResult(rsp);
}
}
@@ -143,7 +164,7 @@ export function FileUpload(props) {
await doSplitXHRUpload(hash, uploadSize);
} else {
let xhr = await xhrSegment(props.file, hash);
- handleXHRResult(xhr);
+ handleResult(xhr);
}
}
@@ -160,20 +181,25 @@ export function FileUpload(props) {
break;
}
}
- handleXHRResult(xhr);
+ handleResult(xhr);
}
- function handleXHRResult(xhr) {
- if (xhr.ok) {
+ function handleResult(result) {
+ if (result.ok) {
setUState(UploadState.Done);
- setResult(xhr.file);
- window.localStorage.setItem(xhr.file.id, JSON.stringify(xhr.file));
+ setResult(result.file);
+ window.localStorage.setItem(result.file.id, JSON.stringify(result.file));
} else {
setUState(UploadState.Failed);
- setResult(xhr.errorMessage);
+ setResult(result.errorMessage);
}
}
+ function getChromeVersion () {
+ let raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);
+ return raw ? parseInt(raw[2], 10) : false;
+ }
+
async function digest(file) {
const chunkSize = 100_000_000;
let sha = CryptoJS.algo.SHA256.create();
@@ -220,7 +246,13 @@ export function FileUpload(props) {
useEffect(() => {
console.log(props.file);
- doXHRUpload().catch(console.error);
+
+ let chromeVersion = getChromeVersion();
+ if(chromeVersion >= 105) {
+ doStreamUpload().catch(console.error);
+ } else {
+ doXHRUpload().catch(console.error);
+ }
}, []);
return (
diff --git a/VoidCat/spa/src/Components/HomePage/FooterLinks.js b/VoidCat/spa/src/Components/HomePage/FooterLinks.js
index b82391a..97bd083 100644
--- a/VoidCat/spa/src/Components/HomePage/FooterLinks.js
+++ b/VoidCat/spa/src/Components/HomePage/FooterLinks.js
@@ -16,7 +16,7 @@ export function FooterLinks() {
GitHub
- {profile ? Admin : null}
+ {profile?.roles?.includes("Admin") ? Admin : null}
);
}
\ No newline at end of file
diff --git a/VoidCat/spa/src/setupProxy.js b/VoidCat/spa/src/setupProxy.js
new file mode 100644
index 0000000..98a7c29
--- /dev/null
+++ b/VoidCat/spa/src/setupProxy.js
@@ -0,0 +1,18 @@
+const {createProxyMiddleware} = require('http-proxy-middleware');
+const settings = require("../package.json");
+
+module.exports = function (app) {
+ const proxy = createProxyMiddleware({
+ target: settings.proxy,
+ changeOrigin: true,
+ secure: false
+ });
+
+ app.use('/admin', proxy);
+ app.use('/d', proxy);
+ app.use('/info', proxy);
+ app.use('/upload', proxy);
+ app.use('/auth', proxy);
+ app.use('/swagger', proxy);
+ app.use('/user', proxy);
+};
\ No newline at end of file
diff --git a/VoidCat/spa/yarn.lock b/VoidCat/spa/yarn.lock
index 0972bee..9f029e8 100644
--- a/VoidCat/spa/yarn.lock
+++ b/VoidCat/spa/yarn.lock
@@ -4626,6 +4626,17 @@ http-proxy-middleware@^2.0.0:
is-plain-obj "^3.0.0"
micromatch "^4.0.2"
+http-proxy-middleware@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f"
+ integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==
+ dependencies:
+ "@types/http-proxy" "^1.17.8"
+ http-proxy "^1.18.1"
+ is-glob "^4.0.1"
+ is-plain-obj "^3.0.0"
+ micromatch "^4.0.2"
+
http-proxy@^1.18.1:
version "1.18.1"
resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"