Remove login defaults; open review via device token SSO.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+20
-12
@@ -1847,21 +1847,29 @@ class OrderApp(tk.Tk):
|
||||
threading.Thread(target=run, daemon=True).start()
|
||||
|
||||
def on_open_review(self) -> None:
|
||||
"""打开中控复盘登录页(浏览器),使用已保存地址。"""
|
||||
server = ""
|
||||
try:
|
||||
server = (load_device().get("server") or "").rstrip("/")
|
||||
except Exception:
|
||||
server = ""
|
||||
if not server:
|
||||
self.set_status("未激活:请先完成中控激活", ok=False)
|
||||
"""用本机激活 token 免密打开网页复盘。"""
|
||||
def work() -> None:
|
||||
try:
|
||||
if hub_client is None:
|
||||
raise RuntimeError("未打包中控客户端")
|
||||
url = hub_client.open_review_url("/records")
|
||||
self.after(0, lambda: self._open_review_done(url, None))
|
||||
except Exception as exc:
|
||||
self.after(0, lambda: self._open_review_done(None, exc))
|
||||
|
||||
self.set_status("正在获取复盘免密链接…", ok=True)
|
||||
threading.Thread(target=work, daemon=True).start()
|
||||
|
||||
def _open_review_done(self, url: Optional[str], exc: Optional[BaseException]) -> None:
|
||||
if exc is not None or not url:
|
||||
msg = str(exc) if exc else "无法打开复盘"
|
||||
self.set_status(msg, ok=False)
|
||||
return
|
||||
url = server.rstrip("/") + "/login"
|
||||
try:
|
||||
webbrowser.open(url)
|
||||
self.set_status(f"已打开复盘登录页:{url}", ok=True)
|
||||
except Exception as exc:
|
||||
self.set_status(f"无法打开浏览器:{exc}", ok=False)
|
||||
self.set_status("已免密打开复盘(本机 token)", ok=True)
|
||||
except Exception as open_exc:
|
||||
self.set_status(f"无法打开浏览器:{open_exc}", ok=False)
|
||||
|
||||
def destroy(self) -> None:
|
||||
try:
|
||||
|
||||
@@ -121,3 +121,39 @@ def report_bars(symbol: str, timeframe: str, bars: list[dict]) -> int:
|
||||
return int(r.get("count") or 0)
|
||||
except HubError:
|
||||
return 0
|
||||
|
||||
|
||||
def open_review_url(next_path: str = "/records") -> str:
|
||||
"""用本机设备 token 换免密复盘链接;旧服务端则退回 token 直链。"""
|
||||
from urllib.parse import quote
|
||||
|
||||
d = load_device()
|
||||
server = (d.get("server") or "").rstrip("/")
|
||||
token = (d.get("token") or "").strip()
|
||||
if not server or not token:
|
||||
raise HubError("未激活:请先完成中控激活")
|
||||
nxt = next_path if next_path.startswith("/") else "/records"
|
||||
direct = f"{server}/auth/device-login?token={quote(token)}&next={quote(nxt)}"
|
||||
try:
|
||||
r = _request(
|
||||
"POST",
|
||||
server,
|
||||
"/api/v1/web-sso",
|
||||
body={"next": nxt},
|
||||
token=token,
|
||||
timeout=10,
|
||||
)
|
||||
if r.get("ok") and r.get("path"):
|
||||
return server + str(r["path"])
|
||||
if r.get("ok") and r.get("ticket"):
|
||||
return (
|
||||
f"{server}/auth/device-login?ticket={quote(str(r['ticket']))}"
|
||||
f"&next={quote(nxt)}"
|
||||
)
|
||||
raise HubError(r.get("error") or "无法获取免密登录链接")
|
||||
except HubError as exc:
|
||||
msg = str(exc)
|
||||
if "未绑定" in msg or "未激活" in msg:
|
||||
raise
|
||||
# 旧服务端无 /api/v1/web-sso 时走 token 直链
|
||||
return direct
|
||||
|
||||
Reference in New Issue
Block a user