github.com/DaAlbrecht/cf-cli@v0.0.0-20231128151943-1fe19bb400b9/cf/terminal/ui_windows.go (about) 1 //go:build windows 2 // +build windows 3 4 package terminal 5 6 import ( 7 "os" 8 "syscall" 9 ) 10 11 // see SetConsoleMode documentation for bit flags 12 // http://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx 13 const ENABLE_ECHO_INPUT = 0x0004 14 15 func (ui terminalUI) AskForPassword(prompt string) (passwd string) { 16 hStdin := syscall.Handle(os.Stdin.Fd()) 17 var originalMode uint32 18 19 err := syscall.GetConsoleMode(hStdin, &originalMode) 20 if err != nil { 21 return 22 } 23 24 var newMode uint32 = (originalMode &^ ENABLE_ECHO_INPUT) 25 26 err = setConsoleMode(hStdin, newMode) 27 defer setConsoleMode(hStdin, originalMode) 28 defer ui.Say("") 29 30 if err != nil { 31 return 32 } 33 34 return ui.Ask(prompt) 35 } 36 37 func setConsoleMode(console syscall.Handle, mode uint32) (err error) { 38 dll := syscall.MustLoadDLL("kernel32") 39 proc := dll.MustFindProc("SetConsoleMode") 40 r, _, err := proc.Call(uintptr(console), uintptr(mode)) 41 42 if r == 0 { 43 return err 44 } 45 return nil 46 }