import { assertEquals } from "jsr:@std/assert"; import { stub } from "jsr:@std/testing/mock"; import { app } from "../main.ts"; import { sqlWrapper } from "../db.ts"; import { valkey } from "../valkey.ts"; import { spireWrapper } from "../spire_ffi.ts"; import { auditWrapper } from "../audit.ts"; const originalSql = sqlWrapper.sql; function setMockSql(mockImpl: () => Promise) { sqlWrapper.sql = mockImpl as any; } function restoreMockSql() { sqlWrapper.sql = originalSql; } Deno.test("Tier 3: ValidateSession ConnectRPC - Default-Deny", async () => { const originalExtract = spireWrapper.extractSpiffeIdFromCert; spireWrapper.extractSpiffeIdFromCert = () => "spiffe://system.local/ed-droid"; let queryCount = 0; setMockSql(() => { queryCount++; if (queryCount === 1) { return Promise.resolve([{ id: "app-1" }]); } else { return Promise.resolve([]); } }); // Re-define valkey stub const valkeyStub = stub(valkey, "get", () => { return Promise.resolve( JSON.stringify({ uuid: "user-1", username: "alice" }), ); }); let auditCalled = false; const originalAudit = auditWrapper.auditLog; auditWrapper.auditLog = (..._args: any[]) => { auditCalled = true; }; const req = new Request( "http://localhost/auth.v1.AuthService/ValidateSession", { method: "POST", headers: { "Content-Type": "application/json", "x-peer-cert": "cert-data", }, // The Connect protocol expects token under a specific format or we can just send it, // actually our handler looks at `req.token` via connect protocol, which translates to the json body for unary requests in Connect HTTP POST. // However, the `ValidateSession` requires an argument structured as `{ "token": "..." }`. body: JSON.stringify({ token: "some-session-token" }), }, ); const res = await app.request(req); const data = await res.json(); // The data structure from universal handler might wrap the response. // Connect responses might look like just the json object. // We'll check if valid is false. if (data.valid !== undefined) { assertEquals(data.valid, false); } else { // If not direct format, just ensure valid is falsy or check for error assertEquals(!!data.valid, false); } assertEquals(auditCalled, true); spireWrapper.extractSpiffeIdFromCert = originalExtract; restoreMockSql(); valkeyStub.restore(); auditWrapper.auditLog = originalAudit; }); Deno.test("Tier 3: ValidateSession ConnectRPC - Valid RBAC Grant", async () => { const originalExtract = spireWrapper.extractSpiffeIdFromCert; spireWrapper.extractSpiffeIdFromCert = () => "spiffe://system.local/ed-droid"; let queryCount = 0; setMockSql(() => { queryCount++; if (queryCount === 1) { return Promise.resolve([{ id: "app-1" }]); } else { return Promise.resolve([{ role: "viewer" }]); } }); const valkeyStub = stub(valkey, "get", () => { return Promise.resolve( JSON.stringify({ uuid: "user-1", username: "alice" }), ); }); const req = new Request( "http://localhost/auth.v1.AuthService/ValidateSession", { method: "POST", headers: { "Content-Type": "application/json", "x-peer-cert": "cert-data", }, body: JSON.stringify({ token: "some-session-token" }), }, ); const res = await app.request(req); const data = await res.json(); if (data.valid !== undefined) { assertEquals(data.valid, true); assertEquals(data.uuid, "user-1"); assertEquals(data.scopes[0], "viewer"); } spireWrapper.extractSpiffeIdFromCert = originalExtract; restoreMockSql(); valkeyStub.restore(); }); Deno.test("Tier 3: ValidateSession ConnectRPC - SPIFFE Attestation Failure", async () => { const originalExtract = spireWrapper.extractSpiffeIdFromCert; spireWrapper.extractSpiffeIdFromCert = () => null; const req = new Request( "http://localhost/auth.v1.AuthService/ValidateSession", { method: "POST", headers: { "Content-Type": "application/json", "x-peer-cert": "invalid-cert", }, body: JSON.stringify({ token: "some-session-token" }), }, ); const res = await app.request(req); const data = await res.json(); if (data.valid !== undefined) { assertEquals(data.valid, false); } else { assertEquals(!!data.valid, false); } spireWrapper.extractSpiffeIdFromCert = originalExtract; });