Commit e2dc1ea7 authored by Boris Mühmer's avatar Boris Mühmer
Browse files

added passwd command mock

parent 709310fd
Loading
Loading
Loading
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
}
+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)
	}
}