forked from jshiffer/matterbridge
71 lines
1.2 KiB
Go
71 lines
1.2 KiB
Go
package sshd
|
|
|
|
import "encoding/binary"
|
|
|
|
// Helpers below are borrowed from go.crypto circa 2011:
|
|
|
|
// parsePtyRequest parses the payload of the pty-req message and extracts the
|
|
// dimensions of the terminal. See RFC 4254, section 6.2.
|
|
func parsePtyRequest(s []byte) (width, height int, ok bool) {
|
|
_, s, ok = parseString(s)
|
|
if !ok {
|
|
return
|
|
}
|
|
width32, s, ok := parseUint32(s)
|
|
if !ok {
|
|
return
|
|
}
|
|
height32, _, ok := parseUint32(s)
|
|
width = int(width32)
|
|
height = int(height32)
|
|
if width < 1 {
|
|
ok = false
|
|
}
|
|
if height < 1 {
|
|
ok = false
|
|
}
|
|
return
|
|
}
|
|
|
|
func parseWinchRequest(s []byte) (width, height int, ok bool) {
|
|
width32, _, ok := parseUint32(s)
|
|
if !ok {
|
|
return
|
|
}
|
|
height32, _, ok := parseUint32(s)
|
|
if !ok {
|
|
return
|
|
}
|
|
|
|
width = int(width32)
|
|
height = int(height32)
|
|
if width < 1 {
|
|
ok = false
|
|
}
|
|
if height < 1 {
|
|
ok = false
|
|
}
|
|
return
|
|
}
|
|
|
|
func parseString(in []byte) (out string, rest []byte, ok bool) {
|
|
if len(in) < 4 {
|
|
return
|
|
}
|
|
length := binary.BigEndian.Uint32(in)
|
|
if uint32(len(in)) < 4+length {
|
|
return
|
|
}
|
|
out = string(in[4 : 4+length])
|
|
rest = in[4+length:]
|
|
ok = true
|
|
return
|
|
}
|
|
|
|
func parseUint32(in []byte) (uint32, []byte, bool) {
|
|
if len(in) < 4 {
|
|
return 0, nil, false
|
|
}
|
|
return binary.BigEndian.Uint32(in), in[4:], true
|
|
}
|