Skip to content

Commit 53d0b58

Browse files
committed
fix(app): hash inline script for csp
1 parent 2b0baf9 commit 53d0b58

1 file changed

Lines changed: 11 additions & 4 deletions

File tree

packages/opencode/src/server/server.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { createHash } from "node:crypto"
12
import { Log } from "../util/log"
23
import { describeRoute, generateSpecs, validator, resolver, openAPIRouteHandler } from "hono-openapi"
34
import { Hono } from "hono"
@@ -47,6 +48,9 @@ import { lazy } from "@/util/lazy"
4748
// @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
4849
globalThis.AI_SDK_LOG_WARNINGS = false
4950

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+
5054
export namespace Server {
5155
const log = Log.create({ service: "server" })
5256

@@ -506,10 +510,13 @@ export namespace Server {
506510
host: "app.opencode.ai",
507511
},
508512
})
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))
513520
return response
514521
})
515522
}

0 commit comments

Comments
 (0)