43 lines
1.9 KiB
TypeScript
43 lines
1.9 KiB
TypeScript
import { readFile } from "node:fs/promises";
|
|
import { fileURLToPath } from "node:url";
|
|
import { join } from "node:path";
|
|
import { describe, expect, test } from "vitest";
|
|
import { outboundManifestFromUnknown, startEgressLab } from "@openwork/labs";
|
|
import {
|
|
diagnoseEgressLabProduct,
|
|
productDiagnosticsPrecondition,
|
|
readDeniedHostFacts,
|
|
} from "@openwork/behaviors";
|
|
import { matchVerdictExpectations } from "@openwork/matchers";
|
|
|
|
const repoRoot = fileURLToPath(new URL("../..", import.meta.url));
|
|
const manifestPath = join(repoRoot, "docs", "enterprise", "outbound-access.json");
|
|
|
|
describe("selective egress deny", () => {
|
|
test("returns an actionable blocked-host response backed by the outbound manifest", async () => {
|
|
await using lab = await startEgressLab({ profile: "deny", denyHosts: ["github.com", "127.0.0.1"] });
|
|
const denied = await readDeniedHostFacts(lab);
|
|
const manifest = outboundManifestFromUnknown(JSON.parse(await readFile(manifestPath, "utf8")));
|
|
const manifestEntry = manifest?.hosts.find((entry) => entry.host === "github.com");
|
|
|
|
expect(denied.status).toBe(451);
|
|
expect(denied.errorCode).toBe("EGRESS_HOST_BLOCKED");
|
|
expect(denied.host).toBe("github.com");
|
|
expect(denied.text).toContain("docs/enterprise/outbound-access.json");
|
|
expect(manifestEntry?.host).toBe("github.com");
|
|
expect(manifestEntry?.blockedEffect).toMatch(/install|update|download/i);
|
|
});
|
|
|
|
const skipReason = productDiagnosticsPrecondition(process.env);
|
|
test.skipIf(skipReason !== null)(
|
|
skipReason ? `product diagnostics skipped: ${skipReason}` : "product diagnostics classify the HTTP 451 allowlist deny",
|
|
async () => {
|
|
await using lab = await startEgressLab({ profile: "deny", denyHosts: ["github.com", "127.0.0.1"] });
|
|
const product = await diagnoseEgressLabProduct(lab);
|
|
|
|
expect(product.available).toBe(true);
|
|
expect(matchVerdictExpectations(product.text, "deny").ok).toBe(true);
|
|
},
|
|
);
|
|
});
|