mirror of
https://github.com/morluto/rea
synced 2026-10-28 15:07:26 -04:00
40d9c7b836
Root bypasses the mode-0 file permission this test relies on, so inventory succeeds and the expected EACCES failure never occurs. Match the root guard used by the other permission-dependent boundary tests. Claude-Session: https://claude.ai/code/session_01XPY2GmufMNGQKoEgRUx1pd Co-authored-by: Claude <noreply@anthropic.com>
55 lines
2.3 KiB
TypeScript
55 lines
2.3 KiB
TypeScript
import { chmod, mkdir, writeFile } from "node:fs/promises";
|
|
import { join } from "node:path";
|
|
|
|
import { describe, expect, it } from "vitest";
|
|
|
|
import { parseBinaryTarget } from "../../../../src/application/BinaryTargetResolver.js";
|
|
import { ArtifactProvider } from "../../../../src/artifacts/ArtifactProvider.js";
|
|
import { projectAnalysisError } from "../../../../src/domain/analysisErrorProjection.js";
|
|
import { thinMach } from "../../../../src/domain/binaryTarget.fixture.js";
|
|
import { createTestTempDirectory } from "../../../fixtures/temporaryDirectory.js";
|
|
|
|
describe("artifact directory diagnostics", () => {
|
|
it.skipIf(process.platform === "win32" || process.getuid?.() === 0)(
|
|
"preserves the inaccessible member path and errno through provider projection",
|
|
async () => {
|
|
const root = await createTestTempDirectory("rea-directory-eacces-");
|
|
const appPath = join(root, "Denied.app");
|
|
const contentsPath = join(appPath, "Contents");
|
|
const executablePath = join(contentsPath, "MacOS", "Fixture");
|
|
const blockedPath = join(contentsPath, "blocked.txt");
|
|
await mkdir(join(contentsPath, "MacOS"), { recursive: true });
|
|
await writeFile(
|
|
join(contentsPath, "Info.plist"),
|
|
"<plist><dict><key>CFBundleExecutable</key><string>Fixture</string></dict></plist>",
|
|
);
|
|
await writeFile(executablePath, thinMach(0xfeedfacf, 0x0100000c));
|
|
await writeFile(blockedPath, "member contents");
|
|
await chmod(blockedPath, 0);
|
|
try {
|
|
const target = await parseBinaryTarget(appPath);
|
|
if (!target.ok) throw target.error;
|
|
const result = await new ArtifactProvider(process.env)
|
|
.createClient(target.value)
|
|
.execute("inventory_artifact", {});
|
|
expect(result.ok).toBe(false);
|
|
if (result.ok) return;
|
|
expect(projectAnalysisError(result.error)).toMatchObject({
|
|
code: "artifact_operation_failed",
|
|
details: {
|
|
operation: "inventory_artifact",
|
|
reason: "io",
|
|
},
|
|
});
|
|
const projected = projectAnalysisError(result.error);
|
|
const detail = projected.details?.detail;
|
|
expect(typeof detail).toBe("string");
|
|
expect(detail).toContain("Denied.app/Contents/blocked.txt");
|
|
expect(detail).toContain("EACCES");
|
|
} finally {
|
|
await chmod(blockedPath, 0o600);
|
|
}
|
|
},
|
|
);
|
|
});
|