diff --git a/tests/e2e/README.md b/tests/e2e/README.md
index ce570a87..93cc305b 100644
--- a/tests/e2e/README.md
+++ b/tests/e2e/README.md
@@ -6,7 +6,7 @@ This folder contains a first MVP of end-to-end automated tests.
- Basic preview smoke checks for common file types (txt/md/json/xml/csv/html/png)
- Office Phase-2 smoke checks (docx/xlsx/pptx)
-- Archive smoke checks (zip/tar/tgz/7z/rar)
+- Archive smoke checks (zip/tar/tgz/7z)
- Basic endpoint reachability
- Security regression checks for blocked internal-network hosts (`10.*`) on:
- `/onlinePreview`
diff --git a/tests/e2e/fixtures/sample.rar b/tests/e2e/fixtures/sample.rar
index 088dfdb4..a0e135fc 100644
Binary files a/tests/e2e/fixtures/sample.rar and b/tests/e2e/fixtures/sample.rar differ
diff --git a/tests/e2e/fixtures/sample.tar b/tests/e2e/fixtures/sample.tar
index 89aabcbf..6a4c4f6d 100644
Binary files a/tests/e2e/fixtures/sample.tar and b/tests/e2e/fixtures/sample.tar differ
diff --git a/tests/e2e/fixtures/sample.tgz b/tests/e2e/fixtures/sample.tgz
index 2d1ee3e5..671d81cf 100644
Binary files a/tests/e2e/fixtures/sample.tgz and b/tests/e2e/fixtures/sample.tgz differ
diff --git a/tests/e2e/scripts/generate-fixtures.mjs b/tests/e2e/scripts/generate-fixtures.mjs
index b617d56d..8d1c9ef2 100644
--- a/tests/e2e/scripts/generate-fixtures.mjs
+++ b/tests/e2e/scripts/generate-fixtures.mjs
@@ -19,12 +19,43 @@ write('sample.html', '
kkFileView fixture
{
const out = path.join(fixturesDir, name);
if (fs.existsSync(out)) return;
- generator(out);
+ try {
+ generator(out);
+ } catch (err) {
+ try {
+ fs.rmSync(out, { force: true });
+ } catch {
+ // ignore cleanup errors; original error will be rethrown
+ }
+ throw err;
+ }
+};
+
+const buildDeterministicTar = (out, gzip = false) => {
+ const py = String.raw`import io, tarfile
+from pathlib import Path
+
+out = Path(r'''${out}''')
+inner_path = Path(r'''${innerFile}''')
+data = inner_path.read_bytes()
+mode = 'w:gz' if ${gzip ? 'True' : 'False'} else 'w'
+with tarfile.open(out, mode=mode, format=tarfile.USTAR_FORMAT) as tf:
+ info = tarfile.TarInfo('inner.txt')
+ info.size = len(data)
+ info.mtime = 946684800 # 2000-01-01 00:00:00 UTC
+ info.uid = 0
+ info.gid = 0
+ info.uname = 'root'
+ info.gname = 'root'
+ tf.addfile(info, io.BytesIO(data))
+`;
+ execFileSync('python3', ['-c', py]);
};
try {
@@ -33,11 +64,11 @@ try {
});
ensureArchive('sample.tar', out => {
- execFileSync('tar', ['-cf', out, 'inner.txt'], { cwd: archiveWork });
+ buildDeterministicTar(out, false);
});
ensureArchive('sample.tgz', out => {
- execFileSync('tar', ['-czf', out, 'inner.txt'], { cwd: archiveWork });
+ buildDeterministicTar(out, true);
});
ensureArchive('sample.7z', out => {
diff --git a/tests/e2e/specs/preview-smoke.spec.ts b/tests/e2e/specs/preview-smoke.spec.ts
index 03df155d..03de035c 100644
--- a/tests/e2e/specs/preview-smoke.spec.ts
+++ b/tests/e2e/specs/preview-smoke.spec.ts
@@ -28,7 +28,6 @@ test.beforeAll(async () => {
'sample.tar',
'sample.tgz',
'sample.7z',
- 'sample.rar',
];
try {
@@ -116,11 +115,6 @@ test('15 7z preview', async ({ request }) => {
expect(resp.status()).toBe(200);
});
-test('16 rar preview', async ({ request }) => {
- const resp = await openPreview(request, `${fixtureBase}/sample.rar`);
- expect(resp.status()).toBe(200);
-});
-
test('17 security: block 10.x host in onlinePreview', async ({ request }) => {
const resp = await openPreview(request, `http://10.1.2.3/a.pdf`);
const body = await resp.text();