Skip to content

Commit

Permalink
Test auth failure.
Browse files Browse the repository at this point in the history
  • Loading branch information
udhos committed Mar 28, 2017
1 parent 11a080a commit 30a82d9
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 24 deletions.
41 changes: 32 additions & 9 deletions dev/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -741,25 +741,48 @@ func (d *Device) login(logger hasPrintf, t transp, capture *dialog) (bool, error

d.debugf("login: wait password prompt")

m2, _, err := d.match(logger, t, capture,
[]string{
d.Attr.PasswordPromptPattern,
d.Attr.EnabledPromptPattern,
d.Attr.DisabledPromptPattern,
})
list := []string{}

indexPwd := -1
indexEna := -1
indexDis := -1

if d.Attr.PasswordPromptPattern != "" {
indexPwd = len(list)
list = append(list, d.Attr.PasswordPromptPattern)
}

if d.Attr.EnabledPromptPattern != "" {
indexEna = len(list)
list = append(list, d.Attr.EnabledPromptPattern)
}

if d.Attr.DisabledPromptPattern != "" {
indexDis = len(list)
list = append(list, d.Attr.DisabledPromptPattern)
}

if len(list) < 1 {
return false, fmt.Errorf("login: find password prompt: no pattern provided")
}

m2, _, err := d.match(logger, t, capture, list)
if err != nil {
return false, fmt.Errorf("login: could not find password prompt: %v", err)
}

switch m2 {
case 1:
case indexPwd:
d.debugf("login: found password prompt")
case indexEna:
d.debugf("login: found enabled command prompt")
return true, nil
case 2:
case indexDis:
d.debugf("login: found disabled command prompt")
return false, nil
default:
return false, fmt.Errorf("login: find password prompt: no pattern matched")
}
d.debugf("login: found password prompt")

case 1:
d.debugf("login: found password prompt (while looking for login prompt)")
Expand Down
86 changes: 71 additions & 15 deletions dev/model_huawei_vrp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
type optionsHuaweiVRP struct {
requestPassword bool
breakConn bool
refuseAuth bool
}

func TestHuaweiVRP1(t *testing.T) {
Expand Down Expand Up @@ -125,6 +126,42 @@ func TestHuaweiVRP3(t *testing.T) {
<-s.done // wait termination of accept loop goroutine
}

func TestHuaweiVRP4(t *testing.T) {

// launch bogus test server
addr := ":2004"
s, listenErr := spawnServerHuaweiVRP(t, addr, optionsHuaweiVRP{requestPassword: true, refuseAuth: true})
if listenErr != nil {
t.Errorf("could not spawn bogus HuaweiVRP server: %v", listenErr)
}

// run client test
debug := false
logger := &testLogger{t}
tab := NewDeviceTable()
opt := conf.NewOptions()
opt.Set(&conf.AppConfig{MaxConcurrency: 3, MaxConfigFiles: 10})
RegisterModels(logger, tab)
CreateDevice(tab, logger, "huawei-vrp", "lab1", "localhost"+addr, "telnet", "lab", "pass", "en", debug, nil)

repo := temp.MakeTempRepo()
defer temp.CleanupTempRepo()

requestCh := make(chan FetchRequest)
errlogPrefix := filepath.Join(repo, "errlog_test.")
go Spawner(tab, logger, requestCh, repo, errlogPrefix, opt, NewFilterTable(logger))
good, bad, skip := Scan(tab, tab.ListDevices(), logger, opt.Get(), requestCh)
if good != 0 || bad != 1 || skip != 0 {
t.Errorf("good=%d bad=%d skip=%d", good, bad, skip)
}

close(requestCh) // shutdown Spawner - we might exit first though

s.close() // shutdown server

<-s.done // wait termination of accept loop goroutine
}

func spawnServerHuaweiVRP(t *testing.T, addr string, options optionsHuaweiVRP) (*testServer, error) {

ln, err := net.Listen("tcp", addr)
Expand Down Expand Up @@ -157,30 +194,49 @@ func handleConnectionHuaweiVRP(t *testing.T, c net.Conn, options optionsHuaweiVR

buf := make([]byte, 1000)

// send username prompt
if _, err := c.Write([]byte("Bogus HuaweiVRP server\n\nLogin authentication\n\nUsername:")); err != nil {
t.Logf("handleConnectionHuaweiVRP: send username prompt error: %v", err)
return
}

// consume username
if _, err := c.Read(buf); err != nil {
t.Logf("handleConnectionHuaweiVRP: read username error: %v", err)
// send banner
if _, err := c.Write([]byte("Bogus HuaweiVRP server\n\nLogin authentication")); err != nil {
t.Logf("handleConnectionHuaweiVRP: send banner error: %v", err)
return
}

if options.requestPassword {
// send password prompt
if _, err := c.Write([]byte("\nPassword:")); err != nil {
t.Logf("handleConnectionHuaweiVRP: send password prompt error: %v", err)
for {
// send username prompt
if _, err := c.Write([]byte("\n\nUsername:")); err != nil {
t.Logf("handleConnectionHuaweiVRP: send username prompt error: %v", err)
return
}

// consume password
// consume username
if _, err := c.Read(buf); err != nil {
t.Logf("handleConnectionHuaweiVRP: read password error: %v", err)
t.Logf("handleConnectionHuaweiVRP: read username error: %v", err)
return
}

if options.requestPassword {
// send password prompt
if _, err := c.Write([]byte("\nPassword:")); err != nil {
t.Logf("handleConnectionHuaweiVRP: send password prompt error: %v", err)
return
}

// consume password
if _, err := c.Read(buf); err != nil {
t.Logf("handleConnectionHuaweiVRP: read password error: %v", err)
return
}
}

if options.refuseAuth {
if _, err := c.Write([]byte("\r\nError: Authentication failed.\r\n Logged Fail!\r\n Please retry after 5 seconds.\r\n")); err != nil {
t.Logf("handleConnectionHuaweiVRP: send auth refusal error: %v", err)
return
}

continue // repeat authentication
}

break // accept authentication
}

config := false
Expand Down

0 comments on commit 30a82d9

Please sign in to comment.