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  }