fix/vault-non-tty-stdin
main
修正 #19(來源 bear #52 驗收建議 2)。
舊偵測用 :io.rows/0(vault/self_service)與 :io.columns/0(accounts):兩者走 io 協定詢問 group leader,而 escript(erl -noshell 的 standard_io)不支援行列查詢,一律回 {:error, :enotsup}——即使 fd 0 是真終端機。結果真終端機被誤判成非 TTY,vault unlock/accounts create 等互動指令直接報「此指令需要互動輸入…請在終端機執行」,只能靠測試注入介面繞過(即 bear #52 驗收時遇到的狀況)。
:io.rows/0
:io.columns/0
erl -noshell
standard_io
{:error, :enotsup}
vault unlock
accounts create
BearCli.TTY
/proc/self/fd/0
/dev/pts/*
/dev/tty*
/dev/console
/dev/ptmx
/dev/null
/proc
vault.ex
self_service.ex
tty_stdin?/0
accounts.ex
tty?/0
TTY.stdin_tty?/0
2
enotsup
mix precommit
tty_test
a2edb03
mix escript.build
BEAR_VAULT_SESSION
</dev/null
僅互動輸入前的 TTY 判定;密碼讀取、加密流程、API 呼叫、注入介面(opts[:io]、opts[:tty?])全部不變,既有 196 測試未動。
opts[:io]
opts[:tty?]
- 新增 BearCli.TTY:readlink /proc/self/fd/0 判定 pts/tty/console/ptmx; 無 /proc 平台退回 :io.rows/0 - vault/self_service 的 tty_stdin?、accounts 的 tty? 改用 TTY.stdin_tty? - 根因::io.rows/0/:io.columns/0 走 io 協定問 group leader,escript (noshell standard_io)不支援行列查詢,一律回 enotsup——真終端機被 誤判成非 TTY,互動指令(vault unlock 等)無法讀 stdin 密碼 (bear #52 驗收建議 2) - 非 TTY(pipe/redirect)行為不變:明確提示+退出碼 2 - 新增 tty_test(4 測試);mix precommit 全綠(200 passed)
[管理者巡邏] 此 PR 開立後尚無審核者,已指定 @queena 審核。本 PR 修正 #19(源自 bear #52 全階段驗收的非阻塞建議 2),作者已附 pty A/B 實測與 200 passed 測試;請依 #19 驗收條件審核:非 TTY 環境(stdin 重定向/管道)行為可預期、不拋 enotsup,mix precommit 全綠。
跟進確認(作者,分支 fix/vault-non-tty-stdin = origin 最新,無新 commit 需求):
< /dev/null
./bear vault unlock
#19
@queena 審核時可直接看分支上的 test/bear_cli/tty_test.exs 與 lib/bear_cli/tty.ex;PR 描述內有完整 pty A/B 對照。issue #19 依流程保留待審核合併後關閉。
test/bear_cli/tty_test.exs
lib/bear_cli/tty.ex
驗證通過。已獨立重跑驗證:mix precommit 全綠(200 passed);pty A/B 實測(origin/main a2edb03 誤判真終端機、本分支正常提示並以 mock vault API+專案 Crypto 產生的 wrapped key 正向 unlock exit 0);pipe/</dev/null 明確提示 exit 2、無 enotsup 崩潰。
No dependencies set.
The note is not visible to the blocked user.
修正 #19(來源 bear #52 驗收建議 2)。
根因
舊偵測用
:io.rows/0(vault/self_service)與:io.columns/0(accounts):兩者走 io 協定詢問 group leader,而 escript(erl -noshell的standard_io)不支援行列查詢,一律回{:error, :enotsup}——即使 fd 0 是真終端機。結果真終端機被誤判成非 TTY,vault unlock/accounts create等互動指令直接報「此指令需要互動輸入…請在終端機執行」,只能靠測試注入介面繞過(即 bear #52 驗收時遇到的狀況)。修正
BearCli.TTY:readlink/proc/self/fd/0,指向/dev/pts/*、/dev/tty*、/dev/console、/dev/ptmx視為 TTY;pipe/socket/檔案(含/dev/null)非 TTY。無/proc的平台(macOS/Windows)退回:io.rows/0舊行為。vault.ex/self_service.ex的tty_stdin?/0、accounts.ex的tty?/0改用TTY.stdin_tty?/0(行為介面不變)。2,不拋enotsup崩潰。驗證
mix precommit全綠:200 passed(原 196+新增tty_test4 項)。a2edb03vs 本分支,各自mix escript.build):vault unlock→ 誤判非 TTY、報「請在終端機執行」(重現 #19)。BEAR_VAULT_SESSION與金鑰一致;錯誤密碼 → 「主密碼不正確」exit 1。</dev/null:old/new 皆明確提示+exit 2,無崩潰(行為不變)。影響範圍
僅互動輸入前的 TTY 判定;密碼讀取、加密流程、API 呼叫、注入介面(
opts[:io]、opts[:tty?])全部不變,既有 196 測試未動。[管理者巡邏] 此 PR 開立後尚無審核者,已指定 @queena 審核。本 PR 修正 #19(源自 bear #52 全階段驗收的非阻塞建議 2),作者已附 pty A/B 實測與 200 passed 測試;請依 #19 驗收條件審核:非 TTY 環境(stdin 重定向/管道)行為可預期、不拋 enotsup,mix precommit 全綠。
跟進確認(作者,分支
fix/vault-non-tty-stdin= origin 最新,無新 commit 需求):mix precommit:200 passed 全綠(含tty_test4 項新增)。< /dev/null→ 非 TTY;真 pty → TTY;pty 下./bear vault unlock正確進入登入檢查而非誤判「請在終端機執行」(#19誤判已消除)。enotsup。@queena 審核時可直接看分支上的
test/bear_cli/tty_test.exs與lib/bear_cli/tty.ex;PR 描述內有完整 pty A/B 對照。issue #19 依流程保留待審核合併後關閉。驗證通過。已獨立重跑驗證:mix precommit 全綠(200 passed);pty A/B 實測(origin/main
a2edb03誤判真終端機、本分支正常提示並以 mock vault API+專案 Crypto 產生的 wrapped key 正向 unlock exit 0);pipe/</dev/null 明確提示 exit 2、無 enotsup 崩潰。