|
| 1 | +import { createHash } from "node:crypto" |
1 | 2 | import { Log } from "../util/log" |
2 | 3 | import { describeRoute, generateSpecs, validator, resolver, openAPIRouteHandler } from "hono-openapi" |
3 | 4 | import { Hono } from "hono" |
@@ -47,6 +48,9 @@ import { lazy } from "@/util/lazy" |
47 | 48 | // @ts-ignore This global is needed to prevent ai-sdk from logging warnings to stdout https://github.com/vercel/ai/blob/2dc67e0ef538307f21368db32d5a12345d98831b/packages/ai/src/logger/log-warnings.ts#L85 |
48 | 49 | globalThis.AI_SDK_LOG_WARNINGS = false |
49 | 50 |
|
| 51 | +const csp = (hash = "") => |
| 52 | + `default-src 'self'; script-src 'self' 'wasm-unsafe-eval'${hash ? ` 'sha256-${hash}'` : ""}; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; media-src 'self' data:; connect-src 'self' data:` |
| 53 | + |
50 | 54 | export namespace Server { |
51 | 55 | const log = Log.create({ service: "server" }) |
52 | 56 |
|
@@ -506,10 +510,13 @@ export namespace Server { |
506 | 510 | host: "app.opencode.ai", |
507 | 511 | }, |
508 | 512 | }) |
509 | | - response.headers.set( |
510 | | - "Content-Security-Policy", |
511 | | - "default-src 'self'; script-src 'self' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; media-src 'self' data:; connect-src 'self' data:", |
512 | | - ) |
| 513 | + const match = response.headers.get("content-type")?.includes("text/html") |
| 514 | + ? (await response.clone().text()).match( |
| 515 | + /<script\b(?![^>]*\bsrc\s*=)[^>]*\bid=(['"])oc-theme-preload-script\1[^>]*>([\s\S]*?)<\/script>/i, |
| 516 | + ) |
| 517 | + : undefined |
| 518 | + const hash = match ? createHash("sha256").update(match[2]).digest("base64") : "" |
| 519 | + response.headers.set("Content-Security-Policy", csp(hash)) |
513 | 520 | return response |
514 | 521 | }) |
515 | 522 | } |
|
0 commit comments