in Sources/NIOSSH/User Authentication/UserAuthenticationStateMachine.swift [114:143]
mutating func receiveUserAuthRequest(_ message: SSHMessage.UserAuthRequestMessage) throws -> EventLoopFuture<NIOSSHUserAuthenticationResponseMessage>? {
guard message.service == Self.nextServiceName else {
throw NIOSSHError.protocolViolation(protocolName: Self.protocolName, violation: "requested unsupported service: \(message.service)")
}
switch (self.delegate, self.state) {
case (.server(let delegate), .awaitingNextRequest):
self.state = .awaitingResponses(1)
return self.nextAuthResponse(request: message, delegate: delegate)
case (.server(let delegate), .awaitingResponses(let pending)):
self.state = .awaitingResponses(pending + 1)
return self.nextAuthResponse(request: message, delegate: delegate)
case (.server, .idle), (.server, .awaitingServiceAcceptance):
throw NIOSSHError.protocolViolation(protocolName: Self.protocolName, violation: "user auth request before service accepted")
case (.server, .authenticationSucceeded):
// We ignore messages after authentication succeeded.
return nil
case (.server, .authenticationFailed):
// TODO(cory): We should be limiting the maximum number of authentication attempts.
preconditionFailure("Servers cannot enter authentication failed")
case (.client, _):
// Clients may never receive user auth request messages.
throw NIOSSHError.protocolViolation(protocolName: Self.protocolName, violation: "server sent user auth request")
}
}