pub fn resolve_login_password(
account: Option<&str>,
config: &RuntimeConfig,
) -> Result<Option<(Option<String>, bool)>>Expand description
按 7 层优先级解析登录密码(v1.4.18+)。返回 (password, is_md5)。
优先级(高到低):
--login-pwd-file <path>读文件(Docker secrets / systemd LoadCredential)--login-pwd <plain>明文 argv(打 deprecation WARN)--login-pwd-md5 <hex>md5 argv(同样 WARN)FUTU_PWDenv var- OS keychain(
futucli set-login-pwd --account X存的) - 交互式 tty prompt(
rpassword,不回显不进 history) - 都没有 →
None
account 用来查 keychain 条目(每账号一条,login-password.<account>)。
codex 0547 F2 (P2) fix: 显式 --login-pwd-file / [login_pwd_file] 配置
路径读取失败 / 内容空 = fatal Err. 不再 silent fallback to 后续 6 项 (老
行为)。systemd LoadCredential= / Docker secret mount 失败时, 之前 daemon
会用旧 FUTU_PWD / keychain 密码继续登 → 用户以为换密码, 实际还在用旧值
(silent failure 反模式 / pitfall #45). explicit ≠ auto-detect; auto-detect
该 silent fallback, explicit 该 fail-closed.
返回 Result<Option<(Option<String>, bool)>>:
Ok(Some((Some(pwd), is_md5)))— 找到密码 (任一来源)Ok(None)— 7 层全无 (caller 按 “无凭据” 处理, e.g. offline mode)Err(...)— explicit 来源 #1 (login_pwd_file) 失败, daemon 应 abort