CH-J Server ManagerSerververwaltung über SSH
Menü
Veröffentlichte Quellen

CH-J Server Manager

Durchsuchen Sie Verzeichnisse und Dateien einer bestimmten Anwendungsausgabe.

Quellen als ZIP herunterladen
CH-J Proprietary Software License 1.14

Die Quellen werden unter der CH-J Proprietary Software License 1.14 bereitgestellt. Ihre Verfügbarkeit ändert die Lizenzbedingungen nicht und gewährt keine zusätzlichen Rechte.

2,5 KB · 55 ZeilenDatei herunterladen
1"use strict";
3const test = require("node:test");
4const assert = require("node:assert/strict");
5const fs = require("node:fs");
6const os = require("node:os");
7const path = require("node:path");
8const { cleanDownloadCache, removeCachedFile } = require("../src/main/storage/downloadCache");
10test("download cache removes a package and prunes its empty release directories", (t) => {
11 const root = fs.mkdtempSync(path.join(os.tmpdir(), "chj-cache-"));
12 t.after(() => fs.rmSync(root, { recursive: true, force: true }));
13 const cache = path.join(root, "plugins", ".downloads");
14 const packagePath = path.join(cache, "chj.test", "0.0.1-release", "test.chjplugin");
15 fs.mkdirSync(path.dirname(packagePath), { recursive: true });
16 fs.writeFileSync(packagePath, "package");
18 assert.equal(removeCachedFile(cache, packagePath).removed, true);
19 assert.equal(fs.existsSync(packagePath), false);
20 assert.equal(fs.existsSync(path.join(cache, "chj.test")), false);
21});
23test("download cache rejects paths outside its root and can clear abandoned files", (t) => {
24 const root = fs.mkdtempSync(path.join(os.tmpdir(), "chj-cache-"));
25 t.after(() => fs.rmSync(root, { recursive: true, force: true }));
26 const cache = path.join(root, "updates", "downloads");
27 const outside = path.join(root, "keep.txt");
28 const abandoned = path.join(cache, "0.0.1-release", "installer.dmg");
29 fs.mkdirSync(path.dirname(abandoned), { recursive: true });
30 fs.writeFileSync(outside, "keep");
31 fs.writeFileSync(abandoned, "installer");
33 assert.throws(() => removeCachedFile(cache, outside), /outside its cache/);
34 assert.equal(cleanDownloadCache(cache).cleaned, true);
35 assert.equal(fs.existsSync(abandoned), false);
36 assert.equal(fs.existsSync(cache), true);
37 assert.equal(fs.readFileSync(outside, "utf8"), "keep");
38});
40test("download cache does not follow a parent symlink outside its root", (t) => {
41 const root = fs.mkdtempSync(path.join(os.tmpdir(), "chj-cache-"));
42 t.after(() => fs.rmSync(root, { recursive: true, force: true }));
43 const cache = path.join(root, "cache");
44 const outside = path.join(root, "outside");
45 fs.mkdirSync(cache);
46 fs.mkdirSync(outside);
47 fs.writeFileSync(path.join(outside, "keep.chjplugin"), "keep");
48 fs.symlinkSync(outside, path.join(cache, "redirect"), "dir");
50 assert.throws(
51 () => removeCachedFile(cache, path.join(cache, "redirect", "keep.chjplugin")),
52 /resolves outside its cache/
53 );
54 assert.equal(fs.readFileSync(path.join(outside, "keep.chjplugin"), "utf8"), "keep");
55});

SHA-256: e29cebcdf88785330415e3e86d3e02796da6edd46fee49ee613150ba444244cb

SHA-256 des Archivs: 5ac91caf4fa32a6fdb114f2430deed486fbe7489d5eea343d1f034169fafb5e0