Changeset 308 in code for trunk/cmd


Ignore:
Timestamp:
Jun 3, 2020, 1:51:56 PM (5 years ago)
Author:
admin
Message:

Allow to read password when stdin is not a tty.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/cmd/sojuctl/main.go

    r251 r308  
    22
    33import (
     4        "bufio"
    45        "flag"
    56        "fmt"
     
    5556                }
    5657
    57                 fmt.Printf("Password: ")
    58                 password, err := terminal.ReadPassword(int(os.Stdin.Fd()))
     58                password, err := readPassword()
    5959                if err != nil {
    6060                        log.Fatalf("failed to read password: %v", err)
    6161                }
    62                 fmt.Printf("\n")
    6362
    6463                hashed, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
     
    8180                }
    8281
    83                 fmt.Printf("New password: ")
    84                 password, err := terminal.ReadPassword(int(os.Stdin.Fd()))
     82                password, err := readPassword()
    8583                if err != nil {
    86                         log.Fatalf("failed to read new password: %v", err)
     84                        log.Fatalf("failed to read password: %v", err)
    8785                }
    88                 fmt.Printf("\n")
    8986
    9087                hashed, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
     
    108105        }
    109106}
     107
     108func readPassword() ([]byte, error) {
     109        var password []byte
     110        var err error
     111        fd := int(os.Stdin.Fd())
     112
     113        if terminal.IsTerminal(fd) {
     114                fmt.Printf("Password: ")
     115                password, err = terminal.ReadPassword(int(os.Stdin.Fd()))
     116                if err != nil {
     117                        return nil, err
     118                }
     119                fmt.Printf("\n")
     120        } else {
     121                fmt.Fprintf(os.Stderr, "Warning: Reading password from stdin.\n")
     122                scanner := bufio.NewScanner(os.Stdin)
     123                scanner.Scan()
     124                password = scanner.Bytes()
     125
     126                if len(password) == 0 {
     127                        return nil, fmt.Errorf("zero length password")
     128                }
     129        }
     130
     131        return password, nil
     132}
Note: See TracChangeset for help on using the changeset viewer.