package lua import "testing" // TestServerBrowserFlowThroughPlugin 是 VNC 登录流程的端到端断言。 // // 背景(用户指明的场景):有些平台把授权重定向到 127.0.0.1。用户机器上的浏览器 // 收不到(那个回环是**用户自己的**),所以浏览器必须跑在服务端 —— 此时重定向才会 // 落到本进程的监听器上(已实测验证)。 // // 用户要求:这个浏览器窗口应**内嵌在插件对应的页签下**,所以插件拿到的是 // view_url(iframe src),而不是让人跳出去开新窗口。 func TestServerBrowserFlowThroughPlugin(t *testing.T) { _, ps, _ := runtimePlugins(t) src, _ := ReadBundledPlugin("channels") if err := ps.LoadSource("channels", src); err != nil { t.Fatal(err) } // 默认关闭时:应给出明确提示而不是假装成功 out, err := ps.InvokeHandler("channels", "start_login", &handlerRequest{ Method: "POST", Body: `{"platform":"loopbackish"}`, }) if err != nil { t.Fatal(err) } m := out.JSON.(map[string]interface{}) // 默认关闭时在 begin 阶段就被拒(更早、更明确),而不是等到起浏览器才失败 if m["error"] == nil && m["browser_error"] == nil { t.Fatalf("默认关闭 VNC 时应被拒, 实得 %#v", m) } t.Logf("默认关闭时: error=%v browser_error=%v", m["error"], m["browser_error"]) // 开启后:应返回 view_url ps.SetVNCEnabled(true) out, err = ps.InvokeHandler("channels", "start_login", &handlerRequest{ Method: "POST", Body: `{"platform":"loopbackish"}`, }) if err != nil { t.Fatal(err) } m = out.JSON.(map[string]interface{}) if m["browser_error"] != nil { t.Fatalf("开启后仍失败: %v", m["browser_error"]) } vu, _ := m["view_url"].(string) if vu == "" { t.Fatal("应返回 view_url(供页签内嵌)") } t.Logf("★ 可内嵌的 view_url: %s", vu) // 非回环平台不应起浏览器(等于白开一个高风险的浏览器) out, _ = ps.InvokeHandler("channels", "start_login", &handlerRequest{ Method: "POST", Body: `{"platform":"example"}`, }) if m2 := out.JSON.(map[string]interface{}); m2["view_url"] != nil { t.Error("非回环平台不该起服务端浏览器") } }