Skip to content

Commit

Permalink
term: add examples for ReadPassword
Browse files Browse the repository at this point in the history
These examples demonstrate how to use ReadPassword for interactive
password input from the terminal. They highlight how to use the
function, even if standard input is not a terminal (e.g. when it is a
pipe). The example for Windows is especially interesting, because there
seems to be a bug where CONIN$ cannot be used unless opened with the
write flag.
  • Loading branch information
codesoap committed Jun 3, 2021
1 parent a79de54 commit b2824fc
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 0 deletions.
21 changes: 21 additions & 0 deletions read_password_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package term_test

import (
"fmt"
"os"

"golang.org/x/term"
)

func ExampleReadPassword() {
fmt.Print("Enter your password: ")
p, err := term.ReadPassword(int(os.Stdin.Fd()))
if err != nil {
panic(err)
}
fmt.Printf("\nYou entered '%s'\n", string(p))
}
30 changes: 30 additions & 0 deletions read_password_unix_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// +build !windows

package term_test

import (
"fmt"
"os"

"golang.org/x/term"
)

func ExampleReadPassword_unix() {
// If standard input is not bound to the terminal, a password can
// still be read from it.
tty, err := os.Open("/dev/tty")
if err != nil {
panic(err)
}
defer tty.Close()
fmt.Print("Enter your password: ")
p, err := term.ReadPassword(int(tty.Fd()))
if err != nil {
panic(err)
}
fmt.Printf("\nYou entered '%s'\n", string(p))
}
31 changes: 31 additions & 0 deletions read_password_windows_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// +build windows

package term_test

import (
"fmt"
"os"

"golang.org/x/term"
)

func ExampleReadPassword_windows() {
// If standard input is not bound to the terminal, a password can
// still be read from it. OpenFile must be used with the write flag
// for CONIN$.
tty, err := os.OpenFile("CONIN$", os.O_RDWR, 0)
if err != nil {
panic(err)
}
defer tty.Close()
fmt.Print("Enter your password: ")
p, err := term.ReadPassword(int(tty.Fd()))
if err != nil {
panic(err)
}
fmt.Printf("\nYou entered '%s'\n", string(p))
}

0 comments on commit b2824fc

Please sign in to comment.