fix(secretstore): disable loader during interactive bitwarden prompts

This commit is contained in:
thibaud-lclr 2026-04-20 14:24:43 +02:00
parent 6e80d3418e
commit 017005b0b1
2 changed files with 35 additions and 4 deletions

View file

@ -42,6 +42,7 @@ type bitwardenInteractiveRunner func(
var runBitwardenCLI bitwardenRunner = executeBitwardenCLI
var runBitwardenInteractiveCLI bitwardenInteractiveRunner = executeBitwardenCLIInteractive
var startBitwardenLoaderFunc = startBitwardenLoader
var bitwardenLoaderActive atomic.Bool
var bitwardenDebugOutput io.Writer = os.Stderr
@ -638,7 +639,7 @@ func sanitizeBitwardenDebugArgs(args []string) []string {
}
func executeBitwardenCLI(command string, stdin []byte, args ...string) ([]byte, error) {
stopLoader := startBitwardenLoader()
stopLoader := startBitwardenLoaderFunc()
defer stopLoader()
cmd := exec.Command(command, args...)
@ -664,9 +665,6 @@ func executeBitwardenCLIInteractive(
stdout, stderr io.Writer,
args ...string,
) ([]byte, error) {
stopLoader := startBitwardenLoader()
defer stopLoader()
cmd := exec.Command(command, args...)
if stdin != nil {
cmd.Stdin = stdin

View file

@ -7,6 +7,7 @@ import (
"errors"
"fmt"
"io"
"os"
"os/exec"
"path/filepath"
"regexp"
@ -484,6 +485,28 @@ func TestBitwardenLoaderFrameMovesAndWrapsTheWave(t *testing.T) {
}
}
func TestExecuteBitwardenCLIInteractiveSkipsLoader(t *testing.T) {
loaderStartCount := 0
withBitwardenLoaderStarter(t, func() func() {
loaderStartCount++
return func() {}
})
_, err := executeBitwardenCLIInteractive(
os.Args[0],
nil,
io.Discard,
io.Discard,
"-test.run=^$",
)
if err != nil {
t.Fatalf("executeBitwardenCLIInteractive returned error: %v", err)
}
if loaderStartCount != 0 {
t.Fatalf("loader start count = %d, want 0 for interactive command", loaderStartCount)
}
}
var ansiControlSequencePattern = regexp.MustCompile(`\x1b\[[0-9;]*[A-Za-z]`)
func stripANSIControlSequences(value string) string {
@ -552,6 +575,16 @@ func withBitwardenDebugOutput(t *testing.T, writer io.Writer) {
})
}
func withBitwardenLoaderStarter(t *testing.T, starter func() func()) {
t.Helper()
previous := startBitwardenLoaderFunc
startBitwardenLoaderFunc = starter
t.Cleanup(func() {
startBitwardenLoaderFunc = previous
})
}
type fakeBitwardenCLI struct {
command string
itemsByID map[string]fakeBitwardenItem