|
|
@ -36,7 +36,7 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error { |
|
|
|
|
|
|
|
// during the authentication phase the client first attempts the "none" method
|
|
|
|
// then any untried methods suggested by the server.
|
|
|
|
tried := make(map[string]bool) |
|
|
|
var tried []string |
|
|
|
var lastMethods []string |
|
|
|
|
|
|
|
sessionID := c.transport.getSessionID() |
|
|
@ -49,7 +49,9 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error { |
|
|
|
// success
|
|
|
|
return nil |
|
|
|
} else if ok == authFailure { |
|
|
|
tried[auth.method()] = true |
|
|
|
if m := auth.method(); !contains(tried, m) { |
|
|
|
tried = append(tried, m) |
|
|
|
} |
|
|
|
} |
|
|
|
if methods == nil { |
|
|
|
methods = lastMethods |
|
|
@ -61,7 +63,7 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error { |
|
|
|
findNext: |
|
|
|
for _, a := range config.Auth { |
|
|
|
candidateMethod := a.method() |
|
|
|
if tried[candidateMethod] { |
|
|
|
if contains(tried, candidateMethod) { |
|
|
|
continue |
|
|
|
} |
|
|
|
for _, meth := range methods { |
|
|
@ -72,16 +74,16 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return fmt.Errorf("ssh: unable to authenticate, attempted methods %v, no supported methods remain", keys(tried)) |
|
|
|
return fmt.Errorf("ssh: unable to authenticate, attempted methods %v, no supported methods remain", tried) |
|
|
|
} |
|
|
|
|
|
|
|
func keys(m map[string]bool) []string { |
|
|
|
s := make([]string, 0, len(m)) |
|
|
|
|
|
|
|
for key := range m { |
|
|
|
s = append(s, key) |
|
|
|
func contains(list []string, e string) bool { |
|
|
|
for _, s := range list { |
|
|
|
if s == e { |
|
|
|
return true |
|
|
|
} |
|
|
|
} |
|
|
|
return s |
|
|
|
return false |
|
|
|
} |
|
|
|
|
|
|
|
// An AuthMethod represents an instance of an RFC 4252 authentication method.
|
|
|
|