feat: unify cloud workspace and release desktop v0.1.38

This commit is contained in:
237899745
2026-07-21 16:16:17 +08:00
parent e6f3556ab7
commit 465be72579
19 changed files with 6145 additions and 666 deletions

View File

@@ -181,6 +181,8 @@ async function run() {
let shareId = null;
let shareCode = '';
let directLinkId = null;
let directLinkCode = '';
let artifactDirName = AUDIT_PREFIX;
test('public health/config/csrf endpoints are reachable', async () => {
const health = await request(baseUrl, jar, 'GET', '/api/health');
@@ -288,12 +290,30 @@ async function run() {
assert.strictEqual(check.data.success, true);
const url = await request(baseUrl, jar, 'GET', `/api/files/download-url?path=/${encodeURIComponent(AUDIT_PREFIX)}/hello.txt&mode=download`);
assert.strictEqual(url.status, 400);
assert.match(url.data.message, /OSS/);
assert.strictEqual(url.status, 200);
assert.strictEqual(url.data.storageType, 'local');
assert.match(url.data.downloadUrl, /\/api\/files\/download/);
const download = await request(baseUrl, jar, 'GET', `/api/files/download?path=/${encodeURIComponent(AUDIT_PREFIX)}/hello.txt`);
const tokenDownload = await request(baseUrl, null, 'GET', url.data.downloadUrl);
assert.strictEqual(tokenDownload.status, 200);
assert.ok(tokenDownload.raw.toString('utf8').includes(AUDIT_PREFIX));
const legacyDownload = await request(baseUrl, jar, 'GET', `/api/files/download?path=/${encodeURIComponent(AUDIT_PREFIX)}/hello.txt`);
assert.strictEqual(legacyDownload.status, 302);
const legacyLocation = legacyDownload.headers.get('location') || '';
assert.match(legacyLocation, /\/api\/files\/download\?.*token=/);
const download = await request(baseUrl, null, 'GET', legacyLocation);
assert.strictEqual(download.status, 200);
assert.ok(download.raw.toString('utf8').includes(AUDIT_PREFIX));
const partialUrl = new URL(url.data.downloadUrl);
const partial = await request(baseUrl, null, 'GET', partialUrl.toString(), {
headers: { Range: 'bytes=6-' }
});
assert.strictEqual(partial.status, 206);
assert.match(partial.headers.get('content-range') || '', /^bytes 6-/);
assert.strictEqual(partial.raw.toString('utf8'), download.raw.subarray(6).toString('utf8'));
});
test('share and direct-link flows preserve path boundaries', async () => {
@@ -337,6 +357,29 @@ async function run() {
});
assert.ok([400, 403, 404].includes(traversal.status));
const shareUrl = await request(baseUrl, publicJar, 'POST', `/api/share/${shareCode}/download-url`, {
json: {
path: `/${AUDIT_PREFIX}/hello.txt`,
mode: 'download',
password: `${AUDIT_PREFIX}_pw`
}
});
assert.strictEqual(shareUrl.status, 200);
assert.match(shareUrl.data.downloadUrl, /\/api\/share\/[^/]+\/download-file\?.*token=/);
const shareDownload = await request(baseUrl, null, 'GET', shareUrl.data.downloadUrl);
assert.strictEqual(shareDownload.status, 200);
assert.ok(shareDownload.raw.toString('utf8').includes(AUDIT_PREFIX));
const sharePartial = await request(baseUrl, null, 'GET', shareUrl.data.downloadUrl, {
headers: { Range: 'bytes=6-' }
});
assert.strictEqual(sharePartial.status, 206);
assert.strictEqual(
sharePartial.raw.toString('utf8'),
shareDownload.raw.subarray(6).toString('utf8')
);
const direct = await request(baseUrl, jar, 'POST', '/api/direct-link/create', {
json: {
file_path: `/${AUDIT_PREFIX}/hello.txt`,
@@ -347,6 +390,32 @@ async function run() {
assert.strictEqual(direct.status, 200);
assert.strictEqual(direct.data.success, true);
directLinkId = direct.data.link_id;
directLinkCode = direct.data.link_code;
});
test('renaming a directory preserves shares and direct links', async () => {
const renamedDir = `${AUDIT_PREFIX}_renamed`;
const rename = await request(baseUrl, jar, 'POST', '/api/files/rename', {
json: { path: '/', oldName: AUDIT_PREFIX, newName: renamedDir }
});
assert.strictEqual(rename.status, 200);
assert.strictEqual(rename.data.success, true);
artifactDirName = renamedDir;
const shares = await request(baseUrl, jar, 'GET', '/api/share/my');
const share = shares.data.shares.find(item => item.share_code === shareCode);
assert.strictEqual(share.share_path, `/${renamedDir}`);
const publicJar = new CookieJar();
const list = await request(baseUrl, publicJar, 'POST', `/api/share/${shareCode}/list`, {
json: { path: '', password: `${AUDIT_PREFIX}_pw` }
});
assert.strictEqual(list.status, 200);
assert.ok(list.data.items.some(item => item.name === 'hello.txt'));
const directDownload = await request(baseUrl, null, 'GET', `/d/${directLinkCode}`);
assert.strictEqual(directDownload.status, 200);
assert.ok(directDownload.raw.toString('utf8').includes(AUDIT_PREFIX));
});
test('admin listing/logging endpoints are authenticated and sanitized', async () => {
@@ -376,7 +445,7 @@ async function run() {
assert.ok([200, 404].includes(res.status));
}
const del = await request(baseUrl, jar, 'POST', '/api/files/delete', {
json: { path: '/', fileName: AUDIT_PREFIX }
json: { path: '/', fileName: artifactDirName }
});
assert.strictEqual(del.status, 200);
assert.strictEqual(del.data.success, true);