in Sources/NIOSSH/SSHMessages.swift [829:888]
mutating func readChannelOpenMessage() throws -> SSHMessage.ChannelOpenMessage? {
try self.rewindOnNilOrError { `self` in
guard
let typeRawValue = self.readSSHStringAsString(),
let senderChannel: UInt32 = self.readInteger(),
let initialWindowSize: UInt32 = self.readInteger(),
let maximumPacketSize: UInt32 = self.readInteger()
else {
return nil
}
let type: SSHMessage.ChannelOpenMessage.ChannelType
switch typeRawValue {
case "session":
type = .session
case "forwarded-tcpip":
guard
let hostListening = self.readSSHStringAsString(),
let portListening = self.readInteger(as: UInt32.self),
let originatorIP = self.readSSHStringAsString(),
let originatorPort = self.readInteger(as: UInt32.self)
else {
return nil
}
guard portListening <= UInt16.max, originatorPort <= UInt16.max else {
throw NIOSSHError.unknownPacketType(diagnostic: "Invalid port values: \(portListening) \(originatorPort)")
}
let originator = try SocketAddress(ipAddress: originatorIP, port: Int(originatorPort))
type = .forwardedTCPIP(.init(hostListening: hostListening, portListening: UInt16(portListening), originatorAddress: originator))
case "direct-tcpip":
guard
let hostToConnectTo = self.readSSHStringAsString(),
let portToConnectTo = self.readInteger(as: UInt32.self),
let originatorIP = self.readSSHStringAsString(),
let originatorPort = self.readInteger(as: UInt32.self)
else {
return nil
}
guard portToConnectTo <= UInt16.max, originatorPort <= UInt16.max else {
throw NIOSSHError.unknownPacketType(diagnostic: "Invalid port values: \(portToConnectTo) \(originatorPort)")
}
let originator = try SocketAddress(ipAddress: originatorIP, port: Int(originatorPort))
type = .directTCPIP(.init(hostToConnectTo: hostToConnectTo, portToConnectTo: UInt16(portToConnectTo), originatorAddress: originator))
default:
throw NIOSSHError.unknownPacketType(diagnostic: "Channel request with \(typeRawValue)")
}
return SSHMessage.ChannelOpenMessage(type: type, senderChannel: senderChannel, initialWindowSize: initialWindowSize, maximumPacketSize: maximumPacketSize)
}
}