mirror of
https://github.com/kennethnym/freya
synced 2026-06-20 16:41:18 +01:00
69 lines
1.6 KiB
TypeScript
69 lines
1.6 KiB
TypeScript
import { describe, expect, test } from "bun:test"
|
|
import { Hono } from "hono"
|
|
|
|
import type { UserSessionManager } from "../session/index.ts"
|
|
|
|
import { registerAgentWebSocketHandlers } from "./ws.ts"
|
|
|
|
describe("agent websocket handler", () => {
|
|
test("rejects disallowed browser origins before authenticating", async () => {
|
|
let sessionChecked = false
|
|
const app = new Hono()
|
|
|
|
registerAgentWebSocketHandlers(app, {
|
|
sessionManager: {} as UserSessionManager,
|
|
corsMiddleware: async (c, next) => {
|
|
const origin = c.req.header("origin")
|
|
if (origin && origin !== "https://app.freya.test") {
|
|
return c.text("Forbidden", 403)
|
|
}
|
|
|
|
await next()
|
|
},
|
|
authSessionMiddleware: async (c) => {
|
|
sessionChecked = true
|
|
return c.json({ error: "Unauthorized" }, 401)
|
|
},
|
|
})
|
|
|
|
const res = await app.fetch(
|
|
new Request("https://api.freya.test/api/agent/ws", {
|
|
headers: {
|
|
origin: "https://evil.test",
|
|
upgrade: "websocket",
|
|
},
|
|
}),
|
|
)
|
|
|
|
expect(res.status).toBe(403)
|
|
expect(sessionChecked).toBe(false)
|
|
})
|
|
|
|
test("allows requests without an origin header", async () => {
|
|
let sessionChecked = false
|
|
const app = new Hono()
|
|
|
|
registerAgentWebSocketHandlers(app, {
|
|
sessionManager: {} as UserSessionManager,
|
|
corsMiddleware: async (_c, next) => {
|
|
await next()
|
|
},
|
|
authSessionMiddleware: async (c) => {
|
|
sessionChecked = true
|
|
return c.json({ error: "Unauthorized" }, 401)
|
|
},
|
|
})
|
|
|
|
const res = await app.fetch(
|
|
new Request("https://api.freya.test/api/agent/ws", {
|
|
headers: {
|
|
upgrade: "websocket",
|
|
},
|
|
}),
|
|
)
|
|
|
|
expect(res.status).toBe(401)
|
|
expect(sessionChecked).toBe(true)
|
|
})
|
|
})
|