From 30a82d90ded8f220d37b46e10c57102cce3c1b22 Mon Sep 17 00:00:00 2001 From: Everton Marques Date: Tue, 28 Mar 2017 14:34:48 -0300 Subject: [PATCH] Test auth failure. --- dev/model.go | 41 +++++++++++++---- dev/model_huawei_vrp_test.go | 86 +++++++++++++++++++++++++++++------- 2 files changed, 103 insertions(+), 24 deletions(-) diff --git a/dev/model.go b/dev/model.go index 99b7551..3026bb1 100644 --- a/dev/model.go +++ b/dev/model.go @@ -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)") diff --git a/dev/model_huawei_vrp_test.go b/dev/model_huawei_vrp_test.go index 3fb89f4..01b7cb5 100644 --- a/dev/model_huawei_vrp_test.go +++ b/dev/model_huawei_vrp_test.go @@ -15,6 +15,7 @@ import ( type optionsHuaweiVRP struct { requestPassword bool breakConn bool + refuseAuth bool } func TestHuaweiVRP1(t *testing.T) { @@ -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) @@ -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