Skip to main content

resolve_login_password

Function resolve_login_password 

Source
pub fn resolve_login_password(
    account: Option<&str>,
    config: &RuntimeConfig,
) -> Result<Option<(Option<String>, bool)>>
Expand description

按 7 层优先级解析登录密码(v1.4.18+)。返回 (password, is_md5)

优先级(高到低):

  1. --login-pwd-file <path> 读文件(Docker secrets / systemd LoadCredential)
  2. --login-pwd <plain> 明文 argv(打 deprecation WARN)
  3. --login-pwd-md5 <hex> md5 argv(同样 WARN)
  4. FUTU_PWD env var
  5. OS keychain(futucli set-login-pwd --account X 存的)
  6. 交互式 tty prompt(rpassword,不回显不进 history)
  7. 都没有 → 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