| 271 | } |
| 272 | |
| 273 | func resolvePassphrase(cli string, ask bool, file string, stdin bool, prompt string) (string, error) { |
| 274 | cnt := 0 |
| 275 | if cli != "" { cnt++ } |
| 276 | if ask { cnt++ } |
| 277 | if file != "" { cnt++ } |
| 278 | if stdin { cnt++ } |
| 279 | if cnt > 1 { return "", errors.New("specify only one of passphrase sources") } |
| 280 | if cli != "" { return cli, nil } |
| 281 | if ask { |
| 282 | fd := int(os.Stdin.Fd()) |
| 283 | if term.IsTerminal(fd) { |
| 284 | // Disable bracketed paste and focus events before reading password |
| 285 | fmt.Fprint(os.Stderr, "\033[?2004l") // Disable bracketed paste mode |
| 286 | fmt.Fprint(os.Stderr, prompt) |
| 287 | b, err := term.ReadPassword(fd) |
| 288 | fmt.Fprintln(os.Stderr) |
| 289 | // Re-enable bracketed paste after reading |
| 290 | fmt.Fprint(os.Stderr, "\033[?2004h") |
| 291 | if err != nil { return "", err } |
| 292 | return string(b), nil |
| 293 | } |
| 294 | r := bufio.NewReader(os.Stdin) |
| 295 | s, err := r.ReadString('\n') |
| 296 | if err != nil && err != io.EOF { return "", err } |
| 297 | return strings.TrimRight(s, "\r\n"), nil |
| 298 | } |
| 299 | if file != "" { |
| 300 | b, err := os.ReadFile(file) |
| 301 | if err != nil { return "", err } |
| 302 | return strings.TrimRight(string(b), "\r\n"), nil |
| 303 | } |
| 304 | if stdin { |
| 305 | r := bufio.NewReader(os.Stdin) |
| 306 | s, err := r.ReadString('\n') |
| 307 | if err != nil && err != io.EOF { return "", err } |
| 308 | return strings.TrimRight(s, "\r\n"), nil |
| 309 | } |
| 310 | return "", nil |
| 311 | } |