Loading mock/passwd/passwd.go 0 → 100644 +90 −0 Original line number Diff line number Diff line package passwd import ( "errors" "fmt" "io" ) type LoginPassword struct { User string Pass string } type Passwd struct { stdin io.Reader stdout io.Writer stderr io.Writer db []LoginPassword cu string } func New(i io.Reader, o, e io.Writer, db []LoginPassword, user string) (*Passwd, error) { return &Passwd{ stdin: i, stdout: o, stderr: e, db: db, cu: user, }, nil } func (cmd *Passwd) findLoginPassword(user string) (*LoginPassword, error) { var lp *LoginPassword for _, e := range cmd.db { if e.User != user { continue } lp = &e break } if lp == nil { t := "internal error" fmt.Println(cmd.stderr, t) return nil, errors.New(t) } return lp, nil } func (cmd *Passwd) Run() error { lp, err := cmd.findLoginPassword(cmd.cu) if err != nil { fmt.Println(cmd.stderr, err.Error()) return err } fmt.Fprintf(cmd.stdout, "Changing password for %s.", lp.User) fmt.Fprintf(cmd.stderr, "Current password: ") var p0 string if _, err := fmt.Fscanf(cmd.stdin, "%s\n", &p0); err != nil { return err } if p0 != lp.Pass { t := "wrong password" fmt.Println(cmd.stderr, t) return errors.New(t) } fmt.Fprintf(cmd.stderr, "New password: ") var p1 string if _, err := fmt.Fscanf(cmd.stdin, "%s\n", &p1); err != nil { return err } fmt.Fprintf(cmd.stderr, "Retype new password: ") var p2 string if _, err := fmt.Fscanf(cmd.stdin, "%s\n", &p2); err != nil { return err } if p1 != p2 { return errors.New("passwords do not match") } fmt.Fprintln(cmd.stdout, "passwd: password changed") return nil } mock/passwd/passwd_test.go 0 → 100644 +47 −0 Original line number Diff line number Diff line package passwd import ( "bytes" "fmt" "testing" ) const ( lp1User = "user1" lp1Pass = "pass1" lpnPass = "#S3cr3T!" lp2User = "user2" lp2Pass = "pass2" lpXPass = "wr0ng" ) var ( db = []LoginPassword{ { User: lp1User, Pass: lp1Pass, }, { User: lp2User, Pass: lp2Pass, }, } ) func TestPasswdChange(t *testing.T) { var i bytes.Buffer i.WriteString(fmt.Sprintln(lp1Pass)) i.WriteString(fmt.Sprintln(lpnPass)) i.WriteString(fmt.Sprintln(lpnPass)) var o bytes.Buffer var e bytes.Buffer p, err := New(&i, &o, &e, db, lp1User) if err != nil { t.Fatalf("New() failed with: %s", err) } if err := p.Run(); err != nil { t.Fatalf("p.Run() failed with: %s", err) } } Loading
mock/passwd/passwd.go 0 → 100644 +90 −0 Original line number Diff line number Diff line package passwd import ( "errors" "fmt" "io" ) type LoginPassword struct { User string Pass string } type Passwd struct { stdin io.Reader stdout io.Writer stderr io.Writer db []LoginPassword cu string } func New(i io.Reader, o, e io.Writer, db []LoginPassword, user string) (*Passwd, error) { return &Passwd{ stdin: i, stdout: o, stderr: e, db: db, cu: user, }, nil } func (cmd *Passwd) findLoginPassword(user string) (*LoginPassword, error) { var lp *LoginPassword for _, e := range cmd.db { if e.User != user { continue } lp = &e break } if lp == nil { t := "internal error" fmt.Println(cmd.stderr, t) return nil, errors.New(t) } return lp, nil } func (cmd *Passwd) Run() error { lp, err := cmd.findLoginPassword(cmd.cu) if err != nil { fmt.Println(cmd.stderr, err.Error()) return err } fmt.Fprintf(cmd.stdout, "Changing password for %s.", lp.User) fmt.Fprintf(cmd.stderr, "Current password: ") var p0 string if _, err := fmt.Fscanf(cmd.stdin, "%s\n", &p0); err != nil { return err } if p0 != lp.Pass { t := "wrong password" fmt.Println(cmd.stderr, t) return errors.New(t) } fmt.Fprintf(cmd.stderr, "New password: ") var p1 string if _, err := fmt.Fscanf(cmd.stdin, "%s\n", &p1); err != nil { return err } fmt.Fprintf(cmd.stderr, "Retype new password: ") var p2 string if _, err := fmt.Fscanf(cmd.stdin, "%s\n", &p2); err != nil { return err } if p1 != p2 { return errors.New("passwords do not match") } fmt.Fprintln(cmd.stdout, "passwd: password changed") return nil }
mock/passwd/passwd_test.go 0 → 100644 +47 −0 Original line number Diff line number Diff line package passwd import ( "bytes" "fmt" "testing" ) const ( lp1User = "user1" lp1Pass = "pass1" lpnPass = "#S3cr3T!" lp2User = "user2" lp2Pass = "pass2" lpXPass = "wr0ng" ) var ( db = []LoginPassword{ { User: lp1User, Pass: lp1Pass, }, { User: lp2User, Pass: lp2Pass, }, } ) func TestPasswdChange(t *testing.T) { var i bytes.Buffer i.WriteString(fmt.Sprintln(lp1Pass)) i.WriteString(fmt.Sprintln(lpnPass)) i.WriteString(fmt.Sprintln(lpnPass)) var o bytes.Buffer var e bytes.Buffer p, err := New(&i, &o, &e, db, lp1User) if err != nil { t.Fatalf("New() failed with: %s", err) } if err := p.Run(); err != nil { t.Fatalf("p.Run() failed with: %s", err) } }