From 145ed8e960c0b06db3ef226ce7036a5d5bd7b26a Mon Sep 17 00:00:00 2001 From: jim800121chen Date: Sun, 2 Aug 2026 03:16:05 +0800 Subject: [PATCH] =?UTF-8?q?fix(local-agent):=20start-agent.sh=20=E8=A3=9C?= =?UTF-8?q?=E8=A8=AD=20VISIONA=5FCLOUD=5FORIGINS=EF=BC=88ADR-019=20localho?= =?UTF-8?q?st=20=E7=9B=B4=E9=80=A3=20CORS=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit start-agent.sh 漏設 VISIONA_CLOUD_ORIGINS → local-agent CORS 白名單為空 → 影片分頁從瀏覽器打 local-agent 的 preflight 被 403 → 前端判 LOCAL_AGENT_NOT_FOUND (顯示「需同一台電腦操作」)。 依 MODE 補設雙入口白名單(public: 公網 https + 內網 http;internal 同); 用 ${VISIONA_CLOUD_ORIGINS:-預設} 尊重外部覆寫;啟動 log 印出白名單。 origin 字串與 middleware.go 完整精確比對相容。 Co-Authored-By: Claude Opus 4.8 (1M context) --- local-agent/start-agent.sh | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/local-agent/start-agent.sh b/local-agent/start-agent.sh index 2ff238a..5588e9c 100755 --- a/local-agent/start-agent.sh +++ b/local-agent/start-agent.sh @@ -35,12 +35,18 @@ case "$MODE" in CLOUD_API_URL="https://$HOST" RELAY_URL="wss://$HOST/tunnel/connect" WS_SCHEME="https" + # ADR-019 §2.5 CORS 白名單(stage 雙入口):影片分頁 localhost 直連時, + # 瀏覽器可能從公網 HTTPS 或內網純 HTTP 任一入口開啟,兩者都要放行。 + CLOUD_ORIGINS="https://stage-9527.innovedus.com:9527,http://192.168.0.130:9527" ;; internal) HOST="192.168.0.130:9527" CLOUD_API_URL="http://$HOST" RELAY_URL="ws://$HOST/tunnel/connect" WS_SCHEME="http" + # ADR-019 §2.5 CORS 白名單:internal 走內網純 HTTP 入口;一併帶公網入口 + # 以便同一台 agent 兩種路徑都能開影片分頁(多帶白名單不會放寬安全性)。 + CLOUD_ORIGINS="http://192.168.0.130:9527,https://stage-9527.innovedus.com:9527" ;; *) echo "用法:$0 [public|internal]" >&2 @@ -105,6 +111,16 @@ echo "" export VISIONA_CLOUD_API_URL="$CLOUD_API_URL" export VISIONA_RELAY_URL="$RELAY_URL" +# ADR-019 localhost 直連的 CORS 白名單(server 讀 middleware.go:46 os.Getenv)。 +# 漏設會導致影片分頁的 preflight(OPTIONS)被 local-agent 回 403 → 前端 port 探測 +# 掃不到同機 agent → 影片分頁顯示 LOCAL_AGENT_NOT_FOUND(「需在同一台電腦操作」)。 +# 格式:逗號分隔的完整 origin(scheme+host+port 一字不差、結尾無斜線),與 +# middleware.go 的「完整 origin 精確比對」相容。 +# 尊重外部覆寫(與上方優先級 env > 內建預設一致):若使用者已設則沿用其值。 +export VISIONA_CLOUD_ORIGINS="${VISIONA_CLOUD_ORIGINS:-$CLOUD_ORIGINS}" +echo " CORS 白名單(VISIONA_CLOUD_ORIGINS):$VISIONA_CLOUD_ORIGINS" +echo "" + # public 模式:stage 用自簽憑證,agent 需明確 opt-in 跳過 TLS 驗證 # (pairing exchange + tunnel WSS + 設定頁「測試連線」三條路徑共用此開關), # 否則全部 x509 失敗,與本腳本的 demo 目的自相矛盾。